WIP: style: new code style rules #123

Draft
dominik wants to merge 3 commits from style/new_code_style_rules into main
94 changed files with 636 additions and 325 deletions

View file

@ -1,4 +1,21 @@
{ {
"singleQuote": true, "singleQuote": true,
"jsxSingleQuote": true "jsxSingleQuote": true,
"semi": true,
"trailingComma": "all",
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"endOfLine": "lf",
"importOrder": [
"^@/components/(.*)$",
"^@/lib/(.*)$",
"^@/app/(.*)$",
"^@/generated/(.*)$",
"^@/(auth|prisma)$",
"^[./]"
],
"importOrderSeparation": true,
"importOrderSortSpecifiers": true,
"plugins": ["@trivago/prettier-plugin-sort-imports"]
} }

View file

@ -9,8 +9,5 @@ export default defineConfig({
}, },
e2e: { e2e: {
setupNodeEvents(on, config) {
// implement node event listeners here
},
}, },
}); });

View file

@ -1,3 +1,4 @@
// eslint-disable-next-line no-relative-import-paths/no-relative-import-paths
import { PrismaClient } from '../../src/generated/prisma'; import { PrismaClient } from '../../src/generated/prisma';
const prisma = new PrismaClient(); const prisma = new PrismaClient();

View file

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-namespace */
/* eslint-disable @typescript-eslint/no-explicit-any */
/// <reference types="cypress" /> /// <reference types="cypress" />
// *********************************************** // ***********************************************
// This example commands.ts shows you how to // This example commands.ts shows you how to

View file

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-namespace */
// *********************************************************** // ***********************************************************
// This example support/component.ts is processed and // This example support/component.ts is processed and
// loaded automatically before your test files. // loaded automatically before your test files.
@ -12,14 +13,13 @@
// You can read more here: // You can read more here:
// https://on.cypress.io/configuration // https://on.cypress.io/configuration
// *********************************************************** // ***********************************************************
import { mount } from 'cypress/react';
import '@/app/globals.css'; import '@/app/globals.css';
// Import commands.js using ES2015 syntax: // Import commands.js using ES2015 syntax:
import './commands'; import './commands';
import { mount } from 'cypress/react';
// Augment the Cypress namespace to include type definitions for // Augment the Cypress namespace to include type definitions for
// your custom command. // your custom command.
// Alternatively, can be defined in cypress/support/component.d.ts // Alternatively, can be defined in cypress/support/component.d.ts

View file

@ -12,6 +12,5 @@
// You can read more here: // You can read more here:
// https://on.cypress.io/configuration // https://on.cypress.io/configuration
// *********************************************************** // ***********************************************************
// Import commands.js using ES2015 syntax: // Import commands.js using ES2015 syntax:
import './commands'; import './commands';

View file

@ -1,6 +1,7 @@
import { FlatCompat } from '@eslint/eslintrc';
import noRelativeImportPaths from 'eslint-plugin-no-relative-import-paths';
import { dirname } from 'path'; import { dirname } from 'path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'url';
import { FlatCompat } from '@eslint/eslintrc';
const __filename = fileURLToPath(import.meta.url); const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename); const __dirname = dirname(__filename);
@ -14,6 +15,21 @@ const eslintConfig = [
{ {
ignores: ['src/generated/**', '.next/**', 'public/**'], ignores: ['src/generated/**', '.next/**', 'public/**'],
}, },
{
plugins: {
'no-relative-import-paths': noRelativeImportPaths,
},
rules: {
'no-relative-import-paths/no-relative-import-paths': [
'error',
{
allowSameFolder: true,
rootDir: 'src',
prefix: "@",
},
],
},
},
]; ];
export default eslintConfig; export default eslintConfig;

View file

@ -1,8 +1,9 @@
import { registry } from '@/lib/swagger';
import { OpenApiGeneratorV3 } from '@asteasolutions/zod-to-openapi'; import { OpenApiGeneratorV3 } from '@asteasolutions/zod-to-openapi';
import fs from 'fs'; import fs from 'fs';
import path from 'path'; import path from 'path';
import { registry } from '@/lib/swagger';
function recursiveFileSearch(dir: string, fileList: string[] = []): string[] { function recursiveFileSearch(dir: string, fileList: string[] = []): string[] {
const files = fs.readdirSync(dir); const files = fs.readdirSync(dir);
files.forEach((file) => { files.forEach((file) => {

View file

@ -73,6 +73,7 @@
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "3.3.1", "@eslint/eslintrc": "3.3.1",
"@tailwindcss/postcss": "4.1.11", "@tailwindcss/postcss": "4.1.11",
"@trivago/prettier-plugin-sort-imports": "^5.2.2",
"@types/node": "22.15.34", "@types/node": "22.15.34",
"@types/react": "19.1.8", "@types/react": "19.1.8",
"@types/react-big-calendar": "1.16.2", "@types/react-big-calendar": "1.16.2",
@ -84,6 +85,7 @@
"eslint": "9.30.0", "eslint": "9.30.0",
"eslint-config-next": "15.3.4", "eslint-config-next": "15.3.4",
"eslint-config-prettier": "10.1.5", "eslint-config-prettier": "10.1.5",
"eslint-plugin-no-relative-import-paths": "^1.6.1",
"orval": "7.10.0", "orval": "7.10.0",
"postcss": "8.5.6", "postcss": "8.5.6",
"prettier": "3.6.2", "prettier": "3.6.2",

View file

@ -1,21 +1,16 @@
'use client'; 'use client';
import React, { useState } from 'react';
import Logo from '@/components/misc/logo';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import { Label } from '@/components/ui/label';
import {
useDeleteApiEventEventID,
useGetApiEventEventID,
} from '@/generated/api/event/event';
import { useGetApiUserMe } from '@/generated/api/user/user';
import { RedirectButton } from '@/components/buttons/redirect-button';
import { useSession } from 'next-auth/react'; import { useSession } from 'next-auth/react';
import ParticipantListEntry from '@/components/custom-ui/participant-list-entry';
import { useParams, useRouter } from 'next/navigation'; import { useParams, useRouter } from 'next/navigation';
import { Button } from '@/components/ui/button'; import React, { useState } from 'react';
import { ToastInner } from '@/components/misc/toast-inner';
import { toast } from 'sonner'; import { toast } from 'sonner';
import { RedirectButton } from '@/components/buttons/redirect-button';
import ParticipantListEntry from '@/components/custom-ui/participant-list-entry';
import Logo from '@/components/misc/logo';
import { ToastInner } from '@/components/misc/toast-inner';
import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import { import {
Dialog, Dialog,
DialogContent, DialogContent,
@ -25,6 +20,13 @@ import {
DialogTitle, DialogTitle,
DialogTrigger, DialogTrigger,
} from '@/components/ui/dialog'; } from '@/components/ui/dialog';
import { Label } from '@/components/ui/label';
import {
useDeleteApiEventEventID,
useGetApiEventEventID,
} from '@/generated/api/event/event';
import { useGetApiUserMe } from '@/generated/api/user/user';
export default function ShowEvent() { export default function ShowEvent() {
const session = useSession(); const session = useSession();

View file

@ -1,7 +1,8 @@
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import EventForm from '@/components/forms/event-form';
import { Suspense } from 'react'; import { Suspense } from 'react';
import EventForm from '@/components/forms/event-form';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
export default async function Page({ export default async function Page({
params, params,
}: { }: {

View file

@ -1,7 +1,8 @@
import { Card, CardContent, CardHeader } from '@/components/ui/card';
import EventForm from '@/components/forms/event-form';
import { Suspense } from 'react'; import { Suspense } from 'react';
import EventForm from '@/components/forms/event-form';
import { Card, CardContent, CardHeader } from '@/components/ui/card';
export default function NewEvent() { export default function NewEvent() {
return ( return (
<div className='flex flex-col items-center justify-center h-screen'> <div className='flex flex-col items-center justify-center h-screen'>

View file

@ -3,6 +3,7 @@
import { RedirectButton } from '@/components/buttons/redirect-button'; import { RedirectButton } from '@/components/buttons/redirect-button';
import EventListEntry from '@/components/custom-ui/event-list-entry'; import EventListEntry from '@/components/custom-ui/event-list-entry';
import { Label } from '@/components/ui/label'; import { Label } from '@/components/ui/label';
import { useGetApiEvent } from '@/generated/api/event/event'; import { useGetApiEvent } from '@/generated/api/event/event';
export default function Events() { export default function Events() {

View file

@ -1,6 +1,7 @@
'use client'; 'use client';
import Calendar from '@/components/calendar'; import Calendar from '@/components/calendar';
import { useGetApiUserMe } from '@/generated/api/user/user'; import { useGetApiUserMe } from '@/generated/api/user/user';
export default function Home() { export default function Home() {

View file

@ -1,9 +1,9 @@
import React from 'react';
import { cookies } from 'next/headers'; import { cookies } from 'next/headers';
import React from 'react';
import { AppSidebar } from '@/components/custom-ui/app-sidebar'; import { AppSidebar } from '@/components/custom-ui/app-sidebar';
import SidebarProviderWrapper from '@/components/wrappers/sidebar-provider';
import Header from '@/components/misc/header'; import Header from '@/components/misc/header';
import SidebarProviderWrapper from '@/components/wrappers/sidebar-provider';
export default async function Layout({ export default async function Layout({
children, children,

View file

@ -1,4 +1,5 @@
import { getApiDocs } from '@/lib/swagger'; import { getApiDocs } from '@/lib/swagger';
import ReactSwagger from './react-swagger'; import ReactSwagger from './react-swagger';
export default async function IndexPage() { export default async function IndexPage() {

View file

@ -1,19 +1,23 @@
import { auth } from '@/auth'; import { z } from 'zod/v4';
import { prisma } from '@/prisma';
import { import {
returnZodTypeCheckedResponse, returnZodTypeCheckedResponse,
userAuthenticated, userAuthenticated,
} from '@/lib/apiHelpers'; } from '@/lib/apiHelpers';
import {
userCalendarQuerySchema,
UserCalendarResponseSchema,
UserCalendarSchema,
} from './validation';
import { import {
ErrorResponseSchema, ErrorResponseSchema,
ZodErrorResponseSchema, ZodErrorResponseSchema,
} from '@/app/api/validation'; } from '@/app/api/validation';
import { z } from 'zod/v4';
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import {
UserCalendarResponseSchema,
UserCalendarSchema,
userCalendarQuerySchema,
} from './validation';
export const GET = auth(async function GET(req) { export const GET = auth(async function GET(req) {
const authCheck = userAuthenticated(req); const authCheck = userAuthenticated(req);

View file

@ -1,12 +1,14 @@
import { import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
userCalendarQuerySchema,
UserCalendarResponseSchema,
} from './validation';
import { import {
notAuthenticatedResponse, notAuthenticatedResponse,
userNotFoundResponse, userNotFoundResponse,
} from '@/lib/defaultApiResponses'; } from '@/lib/defaultApiResponses';
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import {
UserCalendarResponseSchema,
userCalendarQuerySchema,
} from './validation';
export default function registerSwaggerPaths(registry: OpenAPIRegistry) { export default function registerSwaggerPaths(registry: OpenAPIRegistry) {
registry.registerPath({ registry.registerPath({

View file

@ -1,8 +1,9 @@
import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';
import zod from 'zod/v4'; import zod from 'zod/v4';
import { import {
eventEndTimeSchema,
EventSchema, EventSchema,
eventEndTimeSchema,
eventStartTimeSchema, eventStartTimeSchema,
} from '@/app/api/event/validation'; } from '@/app/api/event/validation';

View file

@ -1,18 +1,21 @@
import { prisma } from '@/prisma';
import { auth } from '@/auth';
import { import {
returnZodTypeCheckedResponse, returnZodTypeCheckedResponse,
userAuthenticated, userAuthenticated,
} from '@/lib/apiHelpers'; } from '@/lib/apiHelpers';
import { import {
ErrorResponseSchema, ErrorResponseSchema,
SuccessResponseSchema, SuccessResponseSchema,
ZodErrorResponseSchema, ZodErrorResponseSchema,
} from '@/app/api/validation'; } from '@/app/api/validation';
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { import {
ParticipantResponseSchema, ParticipantResponseSchema,
updateParticipantSchema, updateParticipantSchema,
} from '../validation'; } from '@/app/api/event/[eventID]/participant/validation';
export const GET = auth(async (req, { params }) => { export const GET = auth(async (req, { params }) => {
const authCheck = userAuthenticated(req); const authCheck = userAuthenticated(req);

View file

@ -1,21 +1,24 @@
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import zod from 'zod/v4'; import zod from 'zod/v4';
import {
ParticipantResponseSchema,
updateParticipantSchema,
} from '../validation';
import { import {
invalidRequestDataResponse, invalidRequestDataResponse,
notAuthenticatedResponse, notAuthenticatedResponse,
serverReturnedDataValidationErrorResponse, serverReturnedDataValidationErrorResponse,
userNotFoundResponse, userNotFoundResponse,
} from '@/lib/defaultApiResponses'; } from '@/lib/defaultApiResponses';
import { import {
EventIdParamSchema, EventIdParamSchema,
UserIdParamSchema,
SuccessResponseSchema, SuccessResponseSchema,
UserIdParamSchema,
} from '@/app/api/validation'; } from '@/app/api/validation';
import {
ParticipantResponseSchema,
updateParticipantSchema,
} from '@/app/api/event/[eventID]/participant/validation';
export default function registerSwaggerPaths(registry: OpenAPIRegistry) { export default function registerSwaggerPaths(registry: OpenAPIRegistry) {
registry.registerPath({ registry.registerPath({
method: 'get', method: 'get',

View file

@ -1,17 +1,20 @@
import { prisma } from '@/prisma';
import { auth } from '@/auth';
import { import {
returnZodTypeCheckedResponse, returnZodTypeCheckedResponse,
userAuthenticated, userAuthenticated,
} from '@/lib/apiHelpers'; } from '@/lib/apiHelpers';
import { import {
ErrorResponseSchema, ErrorResponseSchema,
ZodErrorResponseSchema, ZodErrorResponseSchema,
} from '@/app/api/validation'; } from '@/app/api/validation';
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { import {
inviteParticipantSchema,
ParticipantResponseSchema, ParticipantResponseSchema,
ParticipantsResponseSchema, ParticipantsResponseSchema,
inviteParticipantSchema,
} from './validation'; } from './validation';
export const GET = auth(async (req, { params }) => { export const GET = auth(async (req, { params }) => {

View file

@ -1,18 +1,21 @@
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import zod from 'zod/v4'; import zod from 'zod/v4';
import {
ParticipantsResponseSchema,
ParticipantResponseSchema,
inviteParticipantSchema,
} from './validation';
import { import {
invalidRequestDataResponse, invalidRequestDataResponse,
notAuthenticatedResponse, notAuthenticatedResponse,
serverReturnedDataValidationErrorResponse, serverReturnedDataValidationErrorResponse,
userNotFoundResponse, userNotFoundResponse,
} from '@/lib/defaultApiResponses'; } from '@/lib/defaultApiResponses';
import { EventIdParamSchema } from '@/app/api/validation'; import { EventIdParamSchema } from '@/app/api/validation';
import {
ParticipantResponseSchema,
ParticipantsResponseSchema,
inviteParticipantSchema,
} from './validation';
export default function registerSwaggerPaths(registry: OpenAPIRegistry) { export default function registerSwaggerPaths(registry: OpenAPIRegistry) {
registry.registerPath({ registry.registerPath({
method: 'get', method: 'get',

View file

@ -1,8 +1,9 @@
import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';
import zod from 'zod/v4'; import zod from 'zod/v4';
import { import {
existingUserIdServerSchema,
PublicUserSchema, PublicUserSchema,
existingUserIdServerSchema,
} from '@/app/api/user/validation'; } from '@/app/api/user/validation';
extendZodWithOpenApi(zod); extendZodWithOpenApi(zod);

View file

@ -1,16 +1,20 @@
import { prisma } from '@/prisma';
import { auth } from '@/auth';
import { import {
returnZodTypeCheckedResponse, returnZodTypeCheckedResponse,
userAuthenticated, userAuthenticated,
} from '@/lib/apiHelpers'; } from '@/lib/apiHelpers';
import {
EventResponseSchema,
updateEventSchema,
} from '@/app/api/event/validation';
import { import {
ErrorResponseSchema, ErrorResponseSchema,
SuccessResponseSchema, SuccessResponseSchema,
ZodErrorResponseSchema, ZodErrorResponseSchema,
} from '../../validation'; } from '@/app/api/validation';
import { EventResponseSchema } from '../validation';
import { updateEventSchema } from '../validation'; import { auth } from '@/auth';
import { prisma } from '@/prisma';
export const GET = auth(async (req, { params }) => { export const GET = auth(async (req, { params }) => {
const authCheck = userAuthenticated(req); const authCheck = userAuthenticated(req);

View file

@ -1,16 +1,19 @@
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import { EventResponseSchema, updateEventSchema } from '../validation'; import zod from 'zod/v4';
import { import {
invalidRequestDataResponse, invalidRequestDataResponse,
notAuthenticatedResponse, notAuthenticatedResponse,
serverReturnedDataValidationErrorResponse, serverReturnedDataValidationErrorResponse,
userNotFoundResponse, userNotFoundResponse,
} from '@/lib/defaultApiResponses'; } from '@/lib/defaultApiResponses';
import { import {
EventIdParamSchema, EventIdParamSchema,
SuccessResponseSchema, SuccessResponseSchema,
} from '@/app/api/validation'; } from '@/app/api/validation';
import zod from 'zod/v4';
import { EventResponseSchema, updateEventSchema } from '@/app/api/event/validation';
export default function registerSwaggerPaths(registry: OpenAPIRegistry) { export default function registerSwaggerPaths(registry: OpenAPIRegistry) {
registry.registerPath({ registry.registerPath({

View file

@ -1,14 +1,16 @@
import { prisma } from '@/prisma';
import { auth } from '@/auth';
import { import {
returnZodTypeCheckedResponse, returnZodTypeCheckedResponse,
userAuthenticated, userAuthenticated,
} from '@/lib/apiHelpers'; } from '@/lib/apiHelpers';
import { ErrorResponseSchema, ZodErrorResponseSchema } from '../validation';
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { ErrorResponseSchema, ZodErrorResponseSchema } from '@/app/api/validation';
import { import {
createEventSchema,
EventResponseSchema, EventResponseSchema,
EventsResponseSchema, EventsResponseSchema,
createEventSchema,
} from './validation'; } from './validation';
export const GET = auth(async (req) => { export const GET = auth(async (req) => {

View file

@ -1,9 +1,5 @@
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import {
EventResponseSchema,
EventsResponseSchema,
createEventSchema,
} from './validation';
import { import {
invalidRequestDataResponse, invalidRequestDataResponse,
notAuthenticatedResponse, notAuthenticatedResponse,
@ -11,6 +7,12 @@ import {
userNotFoundResponse, userNotFoundResponse,
} from '@/lib/defaultApiResponses'; } from '@/lib/defaultApiResponses';
import {
EventResponseSchema,
EventsResponseSchema,
createEventSchema,
} from './validation';
export default function registerSwaggerPaths(registry: OpenAPIRegistry) { export default function registerSwaggerPaths(registry: OpenAPIRegistry) {
registry.registerPath({ registry.registerPath({
method: 'get', method: 'get',

View file

@ -1,9 +1,10 @@
import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';
import zod from 'zod/v4'; import zod from 'zod/v4';
import { import {
existingUserIdServerSchema,
PublicUserSchema, PublicUserSchema,
} from '../user/validation'; existingUserIdServerSchema,
} from '@/app/api/user/validation';
import { ParticipantSchema } from './[eventID]/participant/validation'; import { ParticipantSchema } from './[eventID]/participant/validation';
extendZodWithOpenApi(zod); extendZodWithOpenApi(zod);

View file

@ -1,15 +1,18 @@
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { searchUserSchema, searchUserResponseSchema } from './validation';
import { import {
returnZodTypeCheckedResponse, returnZodTypeCheckedResponse,
userAuthenticated, userAuthenticated,
} from '@/lib/apiHelpers'; } from '@/lib/apiHelpers';
import { import {
ErrorResponseSchema, ErrorResponseSchema,
ZodErrorResponseSchema, ZodErrorResponseSchema,
} from '@/app/api/validation'; } from '@/app/api/validation';
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { searchUserResponseSchema, searchUserSchema } from './validation';
export const GET = auth(async function GET(req) { export const GET = auth(async function GET(req) {
const authCheck = userAuthenticated(req); const authCheck = userAuthenticated(req);
if (!authCheck.continue) if (!authCheck.continue)

View file

@ -1,5 +1,5 @@
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import { searchUserResponseSchema, searchUserSchema } from './validation';
import { import {
invalidRequestDataResponse, invalidRequestDataResponse,
notAuthenticatedResponse, notAuthenticatedResponse,
@ -7,6 +7,8 @@ import {
userNotFoundResponse, userNotFoundResponse,
} from '@/lib/defaultApiResponses'; } from '@/lib/defaultApiResponses';
import { searchUserResponseSchema, searchUserSchema } from './validation';
export default function registerSwaggerPaths(registry: OpenAPIRegistry) { export default function registerSwaggerPaths(registry: OpenAPIRegistry) {
registry.registerPath({ registry.registerPath({
method: 'get', method: 'get',

View file

@ -1,5 +1,6 @@
import zod from 'zod/v4'; import zod from 'zod/v4';
import { PublicUserSchema } from '../../user/validation';
import { PublicUserSchema } from '@/app/api/user/validation';
export const searchUserSchema = zod.object({ export const searchUserSchema = zod.object({
query: zod.string().optional().default(''), query: zod.string().optional().default(''),

View file

@ -1,12 +1,15 @@
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { import {
returnZodTypeCheckedResponse, returnZodTypeCheckedResponse,
userAuthenticated, userAuthenticated,
} from '@/lib/apiHelpers'; } from '@/lib/apiHelpers';
import { PublicUserResponseSchema } from '../validation';
import { ErrorResponseSchema } from '@/app/api/validation'; import { ErrorResponseSchema } from '@/app/api/validation';
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { PublicUserResponseSchema } from '@/app/api/user/validation';
export const GET = auth(async function GET(req, { params }) { export const GET = auth(async function GET(req, { params }) {
const authCheck = userAuthenticated(req); const authCheck = userAuthenticated(req);
if (!authCheck.continue) if (!authCheck.continue)

View file

@ -1,11 +1,13 @@
import { PublicUserResponseSchema } from '../validation'; import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import zod from 'zod/v4';
import { import {
notAuthenticatedResponse, notAuthenticatedResponse,
userNotFoundResponse, userNotFoundResponse,
} from '@/lib/defaultApiResponses'; } from '@/lib/defaultApiResponses';
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import zod from 'zod/v4'; import { UserIdParamSchema } from '@/app/api/validation';
import { UserIdParamSchema } from '../../validation'; import { PublicUserResponseSchema } from '@/app/api/user/validation';
export default function registerSwaggerPaths(registry: OpenAPIRegistry) { export default function registerSwaggerPaths(registry: OpenAPIRegistry) {
registry.registerPath({ registry.registerPath({

View file

@ -1,16 +1,20 @@
import { auth } from '@/auth'; import bcrypt from 'bcryptjs';
import { prisma } from '@/prisma';
import { updateUserPasswordServerSchema } from '../validation';
import { import {
returnZodTypeCheckedResponse, returnZodTypeCheckedResponse,
userAuthenticated, userAuthenticated,
} from '@/lib/apiHelpers'; } from '@/lib/apiHelpers';
import { FullUserResponseSchema } from '../../validation';
import { import {
ErrorResponseSchema, ErrorResponseSchema,
ZodErrorResponseSchema, ZodErrorResponseSchema,
} from '@/app/api/validation'; } from '@/app/api/validation';
import bcrypt from 'bcryptjs';
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { FullUserResponseSchema } from '@/app/api/user/validation';
import { updateUserPasswordServerSchema } from '@/app/api/user/me/validation';
export const PATCH = auth(async function PATCH(req) { export const PATCH = auth(async function PATCH(req) {
const authCheck = userAuthenticated(req); const authCheck = userAuthenticated(req);

View file

@ -1,6 +1,5 @@
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import { FullUserResponseSchema } from '../../validation';
import { updateUserPasswordServerSchema } from '../validation';
import { import {
invalidRequestDataResponse, invalidRequestDataResponse,
notAuthenticatedResponse, notAuthenticatedResponse,
@ -8,6 +7,9 @@ import {
userNotFoundResponse, userNotFoundResponse,
} from '@/lib/defaultApiResponses'; } from '@/lib/defaultApiResponses';
import { FullUserResponseSchema } from '@/app/api/user/validation';
import { updateUserPasswordServerSchema } from '@/app/api/user/me/validation';
export default function registerSwaggerPaths(registry: OpenAPIRegistry) { export default function registerSwaggerPaths(registry: OpenAPIRegistry) {
registry.registerPath({ registry.registerPath({
method: 'patch', method: 'patch',

View file

@ -1,17 +1,20 @@
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { updateUserServerSchema } from './validation';
import { import {
returnZodTypeCheckedResponse, returnZodTypeCheckedResponse,
userAuthenticated, userAuthenticated,
} from '@/lib/apiHelpers'; } from '@/lib/apiHelpers';
import { FullUserResponseSchema } from '../validation';
import { import {
ErrorResponseSchema, ErrorResponseSchema,
SuccessResponseSchema, SuccessResponseSchema,
ZodErrorResponseSchema, ZodErrorResponseSchema,
} from '@/app/api/validation'; } from '@/app/api/validation';
import { auth } from '@/auth';
import { prisma } from '@/prisma';
import { FullUserResponseSchema } from '@/app/api/user/validation';
import { updateUserServerSchema } from './validation';
export const GET = auth(async function GET(req) { export const GET = auth(async function GET(req) {
const authCheck = userAuthenticated(req); const authCheck = userAuthenticated(req);
if (!authCheck.continue) if (!authCheck.continue)

View file

@ -1,13 +1,15 @@
import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
import { FullUserResponseSchema } from '../validation';
import { updateUserServerSchema } from './validation';
import { import {
invalidRequestDataResponse, invalidRequestDataResponse,
notAuthenticatedResponse, notAuthenticatedResponse,
serverReturnedDataValidationErrorResponse, serverReturnedDataValidationErrorResponse,
userNotFoundResponse, userNotFoundResponse,
} from '@/lib/defaultApiResponses'; } from '@/lib/defaultApiResponses';
import { SuccessResponseSchema } from '../../validation';
import { SuccessResponseSchema } from '@/app/api/validation';
import { FullUserResponseSchema } from '@/app/api/user/validation';
import { updateUserServerSchema } from './validation';
export default function registerSwaggerPaths(registry: OpenAPIRegistry) { export default function registerSwaggerPaths(registry: OpenAPIRegistry) {
registry.registerPath({ registry.registerPath({

View file

@ -1,4 +1,5 @@
import zod from 'zod/v4'; import zod from 'zod/v4';
import { import {
firstNameSchema, firstNameSchema,
lastNameSchema, lastNameSchema,

View file

@ -1,8 +1,10 @@
import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';
import { prisma } from '@/prisma';
import zod from 'zod/v4'; import zod from 'zod/v4';
import { allTimeZones } from '@/lib/timezones'; import { allTimeZones } from '@/lib/timezones';
import { prisma } from '@/prisma';
extendZodWithOpenApi(zod); extendZodWithOpenApi(zod);
// ---------------------------------------- // ----------------------------------------

View file

@ -1,7 +1,8 @@
import { registry } from '@/lib/swagger';
import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';
import zod from 'zod/v4'; import zod from 'zod/v4';
import { registry } from '@/lib/swagger';
extendZodWithOpenApi(zod); extendZodWithOpenApi(zod);
export const ErrorResponseSchema = zod export const ErrorResponseSchema = zod

View file

@ -1,10 +1,11 @@
import type { Metadata } from 'next';
import { SessionProvider } from 'next-auth/react';
import { Toaster } from '@/components/ui/sonner';
import { QueryProvider } from '@/components/wrappers/query-provider';
import { ThemeProvider } from '@/components/wrappers/theme-provider'; import { ThemeProvider } from '@/components/wrappers/theme-provider';
import type { Metadata } from 'next';
import './globals.css'; import './globals.css';
import { QueryProvider } from '@/components/wrappers/query-provider';
import { Toaster } from '@/components/ui/sonner';
import { SessionProvider } from 'next-auth/react';
export const metadata: Metadata = { export const metadata: Metadata = {
title: 'MeetUp', title: 'MeetUp',

View file

@ -1,22 +1,24 @@
import { auth, providerMap } from '@/auth';
import SSOLogin from '@/components/buttons/sso-login-button';
import LoginForm from '@/components/forms/login-form';
import { redirect } from 'next/navigation';
import { Button } from '@/components/ui/button';
import Image from 'next/image'; import Image from 'next/image';
import { Separator } from '@/components/ui/separator'; import { redirect } from 'next/navigation';
import Logo from '@/components/misc/logo';
import SSOLogin from '@/components/buttons/sso-login-button';
import { import {
Card, Card,
CardContent, CardContent,
CardHeader, CardHeader,
} from '@/components/custom-ui/login-card'; } from '@/components/custom-ui/login-card';
import LoginForm from '@/components/forms/login-form';
import Logo from '@/components/misc/logo';
import { ThemePicker } from '@/components/misc/theme-picker'; import { ThemePicker } from '@/components/misc/theme-picker';
import { Button } from '@/components/ui/button';
import { import {
HoverCard, HoverCard,
HoverCardTrigger,
HoverCardContent, HoverCardContent,
HoverCardTrigger,
} from '@/components/ui/hover-card'; } from '@/components/ui/hover-card';
import { Separator } from '@/components/ui/separator';
import { auth, providerMap } from '@/auth';
export default async function LoginPage() { export default async function LoginPage() {
const session = await auth(); const session = await auth();

View file

@ -1,4 +1,3 @@
import { signOut } from '@/auth';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { import {
Card, Card,
@ -8,6 +7,8 @@ import {
CardTitle, CardTitle,
} from '@/components/ui/card'; } from '@/components/ui/card';
import { signOut } from '@/auth';
export default function SignOutPage() { export default function SignOutPage() {
return ( return (
<div className='flex flex-col items-center justify-center h-screen'> <div className='flex flex-col items-center justify-center h-screen'>

View file

@ -1,6 +1,7 @@
import { auth } from '@/auth';
import { redirect } from 'next/navigation'; import { redirect } from 'next/navigation';
import { auth } from '@/auth';
export default async function Home() { export default async function Home() {
const session = await auth(); const session = await auth();

View file

@ -9,9 +9,6 @@ import {
} from '@/components/ui/card'; } from '@/components/ui/card';
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label'; import { Label } from '@/components/ui/label';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { ScrollableSettingsWrapper } from '@/components/wrappers/settings-scroll';
import { Switch } from '@/components/ui/switch';
import { import {
Select, Select,
SelectContent, SelectContent,
@ -19,6 +16,9 @@ import {
SelectTrigger, SelectTrigger,
SelectValue, SelectValue,
} from '@/components/ui/select'; } from '@/components/ui/select';
import { Switch } from '@/components/ui/switch';
import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs';
import { ScrollableSettingsWrapper } from '@/components/wrappers/settings-scroll';
export default function SettingsPage() { export default function SettingsPage() {
return ( return (

View file

@ -1,22 +1,21 @@
import { PrismaAdapter } from '@auth/prisma-adapter';
import NextAuth, { CredentialsSignin } from 'next-auth'; import NextAuth, { CredentialsSignin } from 'next-auth';
import { Prisma } from '@/generated/prisma';
import type { Provider } from 'next-auth/providers'; import type { Provider } from 'next-auth/providers';
import Credentials from 'next-auth/providers/credentials';
import AuthentikProvider from 'next-auth/providers/authentik'; import AuthentikProvider from 'next-auth/providers/authentik';
import Credentials from 'next-auth/providers/credentials';
import DiscordProvider from 'next-auth/providers/discord'; import DiscordProvider from 'next-auth/providers/discord';
import FacebookProvider from 'next-auth/providers/facebook'; import FacebookProvider from 'next-auth/providers/facebook';
import GithubProvider from 'next-auth/providers/github'; import GithubProvider from 'next-auth/providers/github';
import GitlabProvider from 'next-auth/providers/gitlab'; import GitlabProvider from 'next-auth/providers/gitlab';
import GoogleProvider from 'next-auth/providers/google'; import GoogleProvider from 'next-auth/providers/google';
import KeycloakProvider from 'next-auth/providers/keycloak'; import KeycloakProvider from 'next-auth/providers/keycloak';
import { ZodError } from 'zod/v4';
import { PrismaAdapter } from '@auth/prisma-adapter';
import { prisma } from '@/prisma';
import { loginSchema } from '@/lib/auth/validation'; import { loginSchema } from '@/lib/auth/validation';
import { ZodError } from 'zod/v4';
import { Prisma } from '@/generated/prisma';
import { prisma } from '@/prisma';
class InvalidLoginError extends CredentialsSignin { class InvalidLoginError extends CredentialsSignin {
constructor(code: string) { constructor(code: string) {

View file

@ -1,8 +1,8 @@
import { Button } from '@/components/ui/button';
import { IconProp } from '@fortawesome/fontawesome-svg-core'; import { IconProp } from '@fortawesome/fontawesome-svg-core';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { Button } from '@/components/ui/button';
export function IconButton({ export function IconButton({
icon, icon,
children, children,

View file

@ -1,10 +1,10 @@
import { NDot, NotificationDot } from '@/components/misc/notification-dot';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { import {
DropdownMenu, DropdownMenu,
DropdownMenuContent, DropdownMenuContent,
DropdownMenuTrigger, DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'; } from '@/components/ui/dropdown-menu';
import { NDot, NotificationDot } from '@/components/misc/notification-dot';
export function NotificationButton({ export function NotificationButton({
dotVariant, dotVariant,

View file

@ -1,6 +1,7 @@
import { Button } from '@/components/ui/button';
import Link from 'next/link'; import Link from 'next/link';
import { Button } from '@/components/ui/button';
export function RedirectButton({ export function RedirectButton({
redirectUrl, redirectUrl,
buttonText, buttonText,

View file

@ -1,7 +1,9 @@
import { signIn } from '@/auth';
import { IconButton } from '@/components/buttons/icon-button';
import { faOpenid } from '@fortawesome/free-brands-svg-icons'; import { faOpenid } from '@fortawesome/free-brands-svg-icons';
import { IconButton } from '@/components/buttons/icon-button';
import { signIn } from '@/auth';
export default function SSOLogin({ export default function SSOLogin({
provider, provider,
providerDisplayName, providerDisplayName,

View file

@ -1,22 +1,24 @@
'use client'; 'use client';
import { QueryErrorResetBoundary } from '@tanstack/react-query';
import moment from 'moment';
import { useSession } from 'next-auth/react';
import { useRouter } from 'next/navigation';
import React from 'react';
import { Calendar as RBCalendar, momentLocalizer } from 'react-big-calendar'; import { Calendar as RBCalendar, momentLocalizer } from 'react-big-calendar';
import withDragAndDrop from 'react-big-calendar/lib/addons/dragAndDrop'; import withDragAndDrop from 'react-big-calendar/lib/addons/dragAndDrop';
import moment from 'moment';
import '@/components/react-big-calendar.css';
import 'react-big-calendar/lib/addons/dragAndDrop/styles.css'; import 'react-big-calendar/lib/addons/dragAndDrop/styles.css';
import CustomToolbar from '@/components/custom-toolbar';
import React from 'react';
import { useRouter } from 'next/navigation';
import { usePatchApiEventEventID } from '@/generated/api/event/event';
import { useSession } from 'next-auth/react';
import { UserCalendarSchemaItem } from '@/generated/api/meetup.schemas';
import { QueryErrorResetBoundary } from '@tanstack/react-query';
import { ErrorBoundary } from 'react-error-boundary'; import { ErrorBoundary } from 'react-error-boundary';
import { Button } from '@/components/ui/button';
import { fromZodIssue } from 'zod-validation-error/v4'; import { fromZodIssue } from 'zod-validation-error/v4';
import type { $ZodIssue } from 'zod/v4/core'; import type { $ZodIssue } from 'zod/v4/core';
import CustomToolbar from '@/components/custom-toolbar';
import '@/components/react-big-calendar.css';
import { Button } from '@/components/ui/button';
import { useGetApiCalendar } from '@/generated/api/calendar/calendar'; import { useGetApiCalendar } from '@/generated/api/calendar/calendar';
import { usePatchApiEventEventID } from '@/generated/api/event/event';
import { UserCalendarSchemaItem } from '@/generated/api/meetup.schemas';
moment.updateLocale('en', { moment.updateLocale('en', {
week: { week: {

View file

@ -1,9 +1,11 @@
import React, { useState, useEffect } from 'react'; import React, { useEffect, useState } from 'react';
import './custom-toolbar.css'; import { NavigateAction } from 'react-big-calendar';
import { Button } from '@/components/ui/button';
import DatePicker from 'react-datepicker'; import DatePicker from 'react-datepicker';
import 'react-datepicker/dist/react-datepicker.css'; import 'react-datepicker/dist/react-datepicker.css';
import { NavigateAction } from 'react-big-calendar';
import { Button } from '@/components/ui/button';
import './custom-toolbar.css';
interface CustomToolbarProps { interface CustomToolbarProps {
//Aktuell angezeigtes Datum //Aktuell angezeigtes Datum

View file

@ -1,6 +1,17 @@
'use client'; 'use client';
import { ChevronDown } from 'lucide-react';
import {
CalendarClock,
CalendarDays,
CalendarPlus,
Star,
User,
Users,
} from 'lucide-react';
import Link from 'next/link';
import React from 'react'; import React from 'react';
import { import {
Sidebar, Sidebar,
SidebarContent, SidebarContent,
@ -13,27 +24,13 @@ import {
SidebarMenuButton, SidebarMenuButton,
SidebarMenuItem, SidebarMenuItem,
} from '@/components/custom-ui/sidebar'; } from '@/components/custom-ui/sidebar';
import Logo from '@/components/misc/logo';
import { ChevronDown } from 'lucide-react';
import { import {
Collapsible, Collapsible,
CollapsibleContent, CollapsibleContent,
CollapsibleTrigger, CollapsibleTrigger,
} from '@/components/ui/collapsible'; } from '@/components/ui/collapsible';
import Logo from '@/components/misc/logo';
import Link from 'next/link';
import {
Star,
CalendarDays,
User,
Users,
CalendarClock,
CalendarPlus,
} from 'lucide-react';
const items = [ const items = [
{ {
title: 'Calendar', title: 'Calendar',

View file

@ -1,20 +1,24 @@
'use client'; 'use client';
import { Card } from '@/components/ui/card'; import { useSession } from 'next-auth/react';
import Logo from '@/components/misc/logo';
import { Label } from '@/components/ui/label';
import Link from 'next/link'; import Link from 'next/link';
import zod from 'zod/v4'; import zod from 'zod/v4';
import Logo from '@/components/misc/logo';
import { Card } from '@/components/ui/card';
import { Label } from '@/components/ui/label';
import { EventSchema } from '@/app/api/event/validation'; import { EventSchema } from '@/app/api/event/validation';
import { useSession } from 'next-auth/react';
import { usePatchApiEventEventIDParticipantUser } from '@/generated/api/event-participant/event-participant';
import { import {
Select, Select,
SelectContent, SelectContent,
SelectItem, SelectItem,
SelectTrigger, SelectTrigger,
SelectValue, SelectValue,
} from '../ui/select'; } from '@/components/ui/select';
import { usePatchApiEventEventIDParticipantUser } from '@/generated/api/event-participant/event-participant';
type EventListEntryProps = zod.output<typeof EventSchema>; type EventListEntryProps = zod.output<typeof EventSchema>;

View file

@ -1,9 +1,10 @@
import React from 'react';
import Image from 'next/image';
import { user_default_dark } from '@/assets/usericon/default/defaultusericon-export'; import { user_default_dark } from '@/assets/usericon/default/defaultusericon-export';
import { user_default_light } from '@/assets/usericon/default/defaultusericon-export'; import { user_default_light } from '@/assets/usericon/default/defaultusericon-export';
import { useTheme } from 'next-themes'; import { useTheme } from 'next-themes';
import Image from 'next/image';
import React from 'react';
import zod from 'zod/v4'; import zod from 'zod/v4';
import { ParticipantSchema } from '@/app/api/event/[eventID]/participant/validation'; import { ParticipantSchema } from '@/app/api/event/[eventID]/participant/validation';
type ParticipantListEntryProps = zod.output<typeof ParticipantSchema>; type ParticipantListEntryProps = zod.output<typeof ParticipantSchema>;

View file

@ -1,12 +1,11 @@
'use client'; 'use client';
import * as React from 'react';
import { Slot } from '@radix-ui/react-slot';
import { cva, VariantProps } from 'class-variance-authority';
import { PanelLeftIcon } from 'lucide-react';
import { useIsMobile } from '@/hooks/use-mobile'; import { useIsMobile } from '@/hooks/use-mobile';
import { cn } from '@/lib/utils'; import { Slot } from '@radix-ui/react-slot';
import { VariantProps, cva } from 'class-variance-authority';
import { PanelLeftIcon } from 'lucide-react';
import * as React from 'react';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
import { Separator } from '@/components/ui/separator'; import { Separator } from '@/components/ui/separator';
@ -25,6 +24,8 @@ import {
TooltipTrigger, TooltipTrigger,
} from '@/components/ui/tooltip'; } from '@/components/ui/tooltip';
import { cn } from '@/lib/utils';
const SIDEBAR_COOKIE_NAME = 'sidebar_state'; const SIDEBAR_COOKIE_NAME = 'sidebar_state';
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7; const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
const SIDEBAR_WIDTH = '16rem'; const SIDEBAR_WIDTH = '16rem';

View file

@ -1,27 +1,30 @@
'use client'; 'use client';
import React from 'react';
import LabeledInput from '@/components/custom-ui/labeled-input';
import { Button } from '@/components/ui/button';
import Logo from '@/components/misc/logo';
import TimePicker from '@/components/time-picker';
import { Label } from '@/components/ui/label';
import { useGetApiUserMe } from '@/generated/api/user/user';
import {
usePostApiEvent,
useGetApiEventEventID,
usePatchApiEventEventID,
} from '@/generated/api/event/event';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { useSearchParams } from 'next/navigation';
import React from 'react';
import { toast } from 'sonner'; import { toast } from 'sonner';
import zod from 'zod/v4';
import Calendar from '@/components/calendar';
import LabeledInput from '@/components/custom-ui/labeled-input';
import Logo from '@/components/misc/logo';
import { ToastInner } from '@/components/misc/toast-inner'; import { ToastInner } from '@/components/misc/toast-inner';
import { UserSearchInput } from '@/components/misc/user-search'; import { UserSearchInput } from '@/components/misc/user-search';
import ParticipantListEntry from '../custom-ui/participant-list-entry'; import TimePicker from '@/components/time-picker';
import { Button } from '@/components/ui/button';
import { Label } from '@/components/ui/label';
import { useSearchParams } from 'next/navigation';
import zod from 'zod/v4';
import { PublicUserSchema } from '@/app/api/user/validation'; import { PublicUserSchema } from '@/app/api/user/validation';
import Calendar from '@/components/calendar';
import {
useGetApiEventEventID,
usePatchApiEventEventID,
usePostApiEvent,
} from '@/generated/api/event/event';
import { useGetApiUserMe } from '@/generated/api/user/user';
import ParticipantListEntry from '@/components/custom-ui/participant-list-entry';
import { import {
Dialog, Dialog,
DialogContent, DialogContent,
@ -30,7 +33,7 @@ import {
DialogHeader, DialogHeader,
DialogTitle, DialogTitle,
DialogTrigger, DialogTrigger,
} from '../ui/dialog'; } from '@/components/ui/dialog';
type User = zod.output<typeof PublicUserSchema>; type User = zod.output<typeof PublicUserSchema>;

View file

@ -1,14 +1,15 @@
'use client'; 'use client';
import React, { useState, useRef } from 'react';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import React, { useRef, useState } from 'react';
import LabeledInput from '@/components/custom-ui/labeled-input'; import LabeledInput from '@/components/custom-ui/labeled-input';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import useZodForm from '@/lib/hooks/useZodForm';
import { loginSchema, registerSchema } from '@/lib/auth/validation';
import { loginAction } from '@/lib/auth/login'; import { loginAction } from '@/lib/auth/login';
import { registerAction } from '@/lib/auth/register'; import { registerAction } from '@/lib/auth/register';
import { loginSchema, registerSchema } from '@/lib/auth/validation';
import useZodForm from '@/lib/hooks/useZodForm';
function LoginFormElement({ function LoginFormElement({
setIsSignUp, setIsSignUp,

View file

@ -1,8 +1,8 @@
import { BellRing, Inbox } from 'lucide-react';
import { NotificationButton } from '@/components/buttons/notification-button';
import { SidebarTrigger } from '@/components/custom-ui/sidebar'; import { SidebarTrigger } from '@/components/custom-ui/sidebar';
import { ThemePicker } from '@/components/misc/theme-picker'; import { ThemePicker } from '@/components/misc/theme-picker';
import { NotificationButton } from '@/components/buttons/notification-button';
import { BellRing, Inbox } from 'lucide-react';
import UserDropdown from '@/components/misc/user-dropdown'; import UserDropdown from '@/components/misc/user-dropdown';
const items = [ const items = [

View file

@ -1,10 +1,9 @@
'use client'; 'use client';
import React, { useEffect, useState } from 'react';
import Image, { ImageProps } from 'next/image';
import * as logoAssets from '@/assets/logo/logo-export'; import * as logoAssets from '@/assets/logo/logo-export';
import { useTheme } from 'next-themes'; import { useTheme } from 'next-themes';
import Image, { ImageProps } from 'next/image';
import React, { useEffect, useState } from 'react';
type ColorType = 'colored' | 'monochrome'; type ColorType = 'colored' | 'monochrome';
type LogoType = 'combo' | 'primary' | 'secondary' | 'submark'; type LogoType = 'combo' | 'primary' | 'secondary' | 'submark';

View file

@ -9,6 +9,12 @@ import {
Sparkles, Sparkles,
} from 'lucide-react'; } from 'lucide-react';
import {
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
useSidebar,
} from '@/components/custom-ui/sidebar';
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
import { import {
DropdownMenu, DropdownMenu,
@ -19,12 +25,6 @@ import {
DropdownMenuSeparator, DropdownMenuSeparator,
DropdownMenuTrigger, DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'; } from '@/components/ui/dropdown-menu';
import {
SidebarMenu,
SidebarMenuButton,
SidebarMenuItem,
useSidebar,
} from '@/components/custom-ui/sidebar';
export function NavUser({ export function NavUser({
user, user,

View file

@ -1,7 +1,8 @@
import { cn } from '@/lib/utils'; import { type VariantProps, cva } from 'class-variance-authority';
import { cva, type VariantProps } from 'class-variance-authority';
import { CircleSmall } from 'lucide-react'; import { CircleSmall } from 'lucide-react';
import { cn } from '@/lib/utils';
const dotVariants = cva('', { const dotVariants = cva('', {
variants: { variants: {
variant: { variant: {

View file

@ -1,4 +1,5 @@
import React from 'react'; import React from 'react';
import { ThemePicker } from '@/components/misc/theme-picker'; import { ThemePicker } from '@/components/misc/theme-picker';
import { ThemeProvider } from '@/components/wrappers/theme-provider'; import { ThemeProvider } from '@/components/wrappers/theme-provider';

View file

@ -1,8 +1,8 @@
'use client'; 'use client';
import * as React from 'react';
import { Moon, Sun } from 'lucide-react'; import { Moon, Sun } from 'lucide-react';
import { useTheme } from 'next-themes'; import { useTheme } from 'next-themes';
import * as React from 'react';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { import {

View file

@ -39,12 +39,54 @@ import { Button } from '@/components/ui/button';
'use client'; 'use client';
import { toast } from 'sonner';
import { X } from 'lucide-react'; import { X } from 'lucide-react';
import React from 'react';
import { Label } from '@/components/ui/label';
import { Button } from '@/components/ui/button';
import * as Icons from 'lucide-react'; import * as Icons from 'lucide-react';
import React from 'react';
import { toast } from 'sonner';
import { Button } from '@/components/ui/button';
import { Label } from '@/components/ui/label';
/*
USAGE:
import { ToastInner } from '@/components/misc/toast-inner';
<Button
variant='outline_primary'
onClick={() =>
toast.custom(
(t) => (
<ToastInner
toastId={t}
title=''
description=''
onAction={() => console.log('on Action')} //No Button shown if this is null
variant=''default' | 'success' | 'error' | 'info' | 'warning' | 'notification''
buttonText=[No Button shown if this is null]
iconName=[Any Icon Name from Lucide in UpperCamelCase or default if null]
/>
),
{
duration: 5000,
},
)
}
>
Show Toast
</Button>
*/
import { toast } from 'sonner';
import { Button } from '@/components/ui/button';
interface ToastInnerProps { interface ToastInnerProps {
title: string; title: string;

View file

@ -1,7 +1,9 @@
import { useGetApiUserMe } from '@/generated/api/user/user';
import { Avatar } from '@/components/ui/avatar';
import Image from 'next/image';
import { User } from 'lucide-react'; import { User } from 'lucide-react';
import Image from 'next/image';
import { Avatar } from '@/components/ui/avatar';
import { useGetApiUserMe } from '@/generated/api/user/user';
export default function UserCard() { export default function UserCard() {
const { data } = useGetApiUserMe(); const { data } = useGetApiUserMe();

View file

@ -1,5 +1,10 @@
'use client'; 'use client';
import { ChevronDown, User } from 'lucide-react';
import Image from 'next/image';
import Link from 'next/link';
import UserCard from '@/components/misc/user-card';
import { Avatar } from '@/components/ui/avatar'; import { Avatar } from '@/components/ui/avatar';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { import {
@ -9,11 +14,8 @@ import {
DropdownMenuSeparator, DropdownMenuSeparator,
DropdownMenuTrigger, DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'; } from '@/components/ui/dropdown-menu';
import { useGetApiUserMe } from '@/generated/api/user/user'; import { useGetApiUserMe } from '@/generated/api/user/user';
import { ChevronDown, User } from 'lucide-react';
import Image from 'next/image';
import Link from 'next/link';
import UserCard from '@/components/misc/user-card';
export default function UserDropdown() { export default function UserDropdown() {
const { data } = useGetApiUserMe(); const { data } = useGetApiUserMe();

View file

@ -1,9 +1,9 @@
'use client'; 'use client';
import * as React from 'react';
import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react'; import { CheckIcon, ChevronsUpDownIcon } from 'lucide-react';
import * as React from 'react';
import zod from 'zod/v4';
import { cn } from '@/lib/utils';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { import {
Command, Command,
@ -18,10 +18,13 @@ import {
PopoverContent, PopoverContent,
PopoverTrigger, PopoverTrigger,
} from '@/components/ui/popover'; } from '@/components/ui/popover';
import { useGetApiSearchUser } from '@/generated/api/search/search';
import zod from 'zod/v4'; import { cn } from '@/lib/utils';
import { PublicUserSchema } from '@/app/api/user/validation'; import { PublicUserSchema } from '@/app/api/user/validation';
import { useGetApiSearchUser } from '@/generated/api/search/search';
type User = zod.output<typeof PublicUserSchema>; type User = zod.output<typeof PublicUserSchema>;
export function UserSearchInput({ export function UserSearchInput({

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import { ChevronDownIcon } from 'lucide-react'; import { ChevronDownIcon } from 'lucide-react';
import * as React from 'react';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { Calendar } from '@/components/ui/calendar'; import { Calendar } from '@/components/ui/calendar';

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import * as AvatarPrimitive from '@radix-ui/react-avatar'; import * as AvatarPrimitive from '@radix-ui/react-avatar';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,6 +1,6 @@
import * as React from 'react';
import { Slot } from '@radix-ui/react-slot'; import { Slot } from '@radix-ui/react-slot';
import { cva, type VariantProps } from 'class-variance-authority'; import { type VariantProps, cva } from 'class-variance-authority';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,16 +1,17 @@
'use client'; 'use client';
import * as React from 'react';
import { import {
ChevronDownIcon, ChevronDownIcon,
ChevronLeftIcon, ChevronLeftIcon,
ChevronRightIcon, ChevronRightIcon,
} from 'lucide-react'; } from 'lucide-react';
import * as React from 'react';
import { DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker'; import { DayButton, DayPicker, getDefaultClassNames } from 'react-day-picker';
import { cn } from '@/lib/utils';
import { Button, buttonVariants } from '@/components/ui/button'; import { Button, buttonVariants } from '@/components/ui/button';
import { cn } from '@/lib/utils';
function Calendar({ function Calendar({
className, className,
classNames, classNames,

View file

@ -1,10 +1,9 @@
'use client'; 'use client';
import * as React from 'react';
import { Command as CommandPrimitive } from 'cmdk'; import { Command as CommandPrimitive } from 'cmdk';
import { SearchIcon } from 'lucide-react'; import { SearchIcon } from 'lucide-react';
import * as React from 'react';
import { cn } from '@/lib/utils';
import { import {
Dialog, Dialog,
DialogContent, DialogContent,
@ -13,6 +12,8 @@ import {
DialogTitle, DialogTitle,
} from '@/components/ui/dialog'; } from '@/components/ui/dialog';
import { cn } from '@/lib/utils';
function Command({ function Command({
className, className,
...props ...props

View file

@ -1,8 +1,8 @@
'use client'; 'use client';
import * as React from 'react';
import * as DialogPrimitive from '@radix-ui/react-dialog'; import * as DialogPrimitive from '@radix-ui/react-dialog';
import { XIcon } from 'lucide-react'; import { XIcon } from 'lucide-react';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,8 +1,8 @@
'use client'; 'use client';
import * as React from 'react';
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'; import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'; import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import * as HoverCardPrimitive from '@radix-ui/react-hover-card'; import * as HoverCardPrimitive from '@radix-ui/react-hover-card';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import * as LabelPrimitive from '@radix-ui/react-label'; import * as LabelPrimitive from '@radix-ui/react-label';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import * as PopoverPrimitive from '@radix-ui/react-popover'; import * as PopoverPrimitive from '@radix-ui/react-popover';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,8 +1,8 @@
'use client'; 'use client';
import * as React from 'react';
import * as SelectPrimitive from '@radix-ui/react-select'; import * as SelectPrimitive from '@radix-ui/react-select';
import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react'; import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from 'lucide-react';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import * as SeparatorPrimitive from '@radix-ui/react-separator'; import * as SeparatorPrimitive from '@radix-ui/react-separator';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,8 +1,8 @@
'use client'; 'use client';
import * as React from 'react';
import * as SheetPrimitive from '@radix-ui/react-dialog'; import * as SheetPrimitive from '@radix-ui/react-dialog';
import { XIcon } from 'lucide-react'; import { XIcon } from 'lucide-react';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,8 +1,8 @@
'use client'; 'use client';
import { useTheme } from 'next-themes'; import { useTheme } from 'next-themes';
import { Toaster as Sonner, ToasterProps } from 'sonner';
import React from 'react'; import React from 'react';
import { Toaster as Sonner, ToasterProps } from 'sonner';
const Toaster = ({ ...props }: ToasterProps) => { const Toaster = ({ ...props }: ToasterProps) => {
const { theme = 'system' } = useTheme(); const { theme = 'system' } = useTheme();

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import * as SwitchPrimitive from '@radix-ui/react-switch'; import * as SwitchPrimitive from '@radix-ui/react-switch';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import * as TabsPrimitive from '@radix-ui/react-tabs'; import * as TabsPrimitive from '@radix-ui/react-tabs';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import * as TooltipPrimitive from '@radix-ui/react-tooltip'; import * as TooltipPrimitive from '@radix-ui/react-tooltip';
import * as React from 'react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';

View file

@ -1,7 +1,8 @@
'use client'; 'use client';
import React from 'react'; import React from 'react';
import { SidebarProvider } from '../custom-ui/sidebar';
import { SidebarProvider } from '@/components/custom-ui/sidebar';
export default function SidebarProviderWrapper({ export default function SidebarProviderWrapper({
defaultOpen, defaultOpen,

View file

@ -1,7 +1,7 @@
'use client'; 'use client';
import * as React from 'react';
import { ThemeProvider as NextThemesProvider } from 'next-themes'; import { ThemeProvider as NextThemesProvider } from 'next-themes';
import * as React from 'react';
export function ThemeProvider({ export function ThemeProvider({
children, children,

View file

@ -1,7 +1,7 @@
import { NextAuthRequest } from 'next-auth';
import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';
import zod from 'zod/v4'; import { NextAuthRequest } from 'next-auth';
import { NextResponse } from 'next/server'; import { NextResponse } from 'next/server';
import zod from 'zod/v4';
extendZodWithOpenApi(zod); extendZodWithOpenApi(zod);

View file

@ -1,9 +1,11 @@
'use server'; 'use server';
import { z } from 'zod/v4'; import { z } from 'zod/v4';
import { loginSchema } from './validation';
import { signIn } from '@/auth'; import { signIn } from '@/auth';
import { loginSchema } from './validation';
export async function loginAction(data: z.infer<typeof loginSchema>) { export async function loginAction(data: z.infer<typeof loginSchema>) {
try { try {
await signIn('credentials', { await signIn('credentials', {

View file

@ -1,10 +1,12 @@
'use server'; 'use server';
import type { z } from 'zod/v4';
import bcrypt from 'bcryptjs'; import bcrypt from 'bcryptjs';
import { registerServerSchema } from './validation'; import type { z } from 'zod/v4';
import { prisma } from '@/prisma'; import { prisma } from '@/prisma';
import { registerServerSchema } from './validation';
export async function registerAction( export async function registerAction(
data: z.infer<typeof registerServerSchema>, data: z.infer<typeof registerServerSchema>,
) { ) {

View file

@ -1,4 +1,5 @@
import zod from 'zod/v4'; import zod from 'zod/v4';
import { import {
emailSchema, emailSchema,
firstNameSchema, firstNameSchema,

View file

@ -1,4 +1,4 @@
import { clsx, type ClassValue } from 'clsx'; import { type ClassValue, clsx } from 'clsx';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
export function cn(...inputs: ClassValue[]) { export function cn(...inputs: ClassValue[]) {

269
yarn.lock
View file

@ -147,6 +147,55 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/code-frame@npm:^7.27.1":
version: 7.27.1
resolution: "@babel/code-frame@npm:7.27.1"
dependencies:
"@babel/helper-validator-identifier": "npm:^7.27.1"
js-tokens: "npm:^4.0.0"
picocolors: "npm:^1.1.1"
checksum: 10c0/5dd9a18baa5fce4741ba729acc3a3272c49c25cb8736c4b18e113099520e7ef7b545a4096a26d600e4416157e63e87d66db46aa3fbf0a5f2286da2705c12da00
languageName: node
linkType: hard
"@babel/generator@npm:^7.26.5, @babel/generator@npm:^7.27.5":
version: 7.27.5
resolution: "@babel/generator@npm:7.27.5"
dependencies:
"@babel/parser": "npm:^7.27.5"
"@babel/types": "npm:^7.27.3"
"@jridgewell/gen-mapping": "npm:^0.3.5"
"@jridgewell/trace-mapping": "npm:^0.3.25"
jsesc: "npm:^3.0.2"
checksum: 10c0/8f649ef4cd81765c832bb11de4d6064b035ffebdecde668ba7abee68a7b0bce5c9feabb5dc5bb8aeba5bd9e5c2afa3899d852d2bd9ca77a711ba8c8379f416f0
languageName: node
linkType: hard
"@babel/helper-string-parser@npm:^7.27.1":
version: 7.27.1
resolution: "@babel/helper-string-parser@npm:7.27.1"
checksum: 10c0/8bda3448e07b5583727c103560bcf9c4c24b3c1051a4c516d4050ef69df37bb9a4734a585fe12725b8c2763de0a265aa1e909b485a4e3270b7cfd3e4dbe4b602
languageName: node
linkType: hard
"@babel/helper-validator-identifier@npm:^7.27.1":
version: 7.27.1
resolution: "@babel/helper-validator-identifier@npm:7.27.1"
checksum: 10c0/c558f11c4871d526498e49d07a84752d1800bf72ac0d3dad100309a2eaba24efbf56ea59af5137ff15e3a00280ebe588560534b0e894a4750f8b1411d8f78b84
languageName: node
linkType: hard
"@babel/parser@npm:^7.26.7, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.5, @babel/parser@npm:^7.27.7":
version: 7.27.7
resolution: "@babel/parser@npm:7.27.7"
dependencies:
"@babel/types": "npm:^7.27.7"
bin:
parser: ./bin/babel-parser.js
checksum: 10c0/f6202faeb873f0b3083022e50a5046fe07266d337c0a3bd80a491f8435ba6d9e383d49725e3dcd666b3b52c0dccb4e0f1f1004915762345f7eeed5ba54ea9fd2
languageName: node
linkType: hard
"@babel/runtime-corejs3@npm:^7.20.7, @babel/runtime-corejs3@npm:^7.22.15, @babel/runtime-corejs3@npm:^7.26.10, @babel/runtime-corejs3@npm:^7.27.1": "@babel/runtime-corejs3@npm:^7.20.7, @babel/runtime-corejs3@npm:^7.22.15, @babel/runtime-corejs3@npm:^7.26.10, @babel/runtime-corejs3@npm:^7.27.1":
version: 7.27.6 version: 7.27.6
resolution: "@babel/runtime-corejs3@npm:7.27.6" resolution: "@babel/runtime-corejs3@npm:7.27.6"
@ -163,6 +212,42 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@babel/template@npm:^7.27.2":
version: 7.27.2
resolution: "@babel/template@npm:7.27.2"
dependencies:
"@babel/code-frame": "npm:^7.27.1"
"@babel/parser": "npm:^7.27.2"
"@babel/types": "npm:^7.27.1"
checksum: 10c0/ed9e9022651e463cc5f2cc21942f0e74544f1754d231add6348ff1b472985a3b3502041c0be62dc99ed2d12cfae0c51394bf827452b98a2f8769c03b87aadc81
languageName: node
linkType: hard
"@babel/traverse@npm:^7.26.7":
version: 7.27.7
resolution: "@babel/traverse@npm:7.27.7"
dependencies:
"@babel/code-frame": "npm:^7.27.1"
"@babel/generator": "npm:^7.27.5"
"@babel/parser": "npm:^7.27.7"
"@babel/template": "npm:^7.27.2"
"@babel/types": "npm:^7.27.7"
debug: "npm:^4.3.1"
globals: "npm:^11.1.0"
checksum: 10c0/941fecd0248546f059d58230590a2765d128ef072c8521c9e0bcf6037abf28a0ea4736003d0d695513128d07fe00a7bc57acaada2ed905941d44619b9f49cf0c
languageName: node
linkType: hard
"@babel/types@npm:^7.26.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.27.7":
version: 7.27.7
resolution: "@babel/types@npm:7.27.7"
dependencies:
"@babel/helper-string-parser": "npm:^7.27.1"
"@babel/helper-validator-identifier": "npm:^7.27.1"
checksum: 10c0/1d1dcb5fa7cfba2b4034a3ab99ba17049bfc4af9e170935575246cdb1cee68b04329a0111506d9ae83fb917c47dbd4394a6db5e32fbd041b7834ffbb17ca086b
languageName: node
linkType: hard
"@cspotcode/source-map-support@npm:^0.8.0": "@cspotcode/source-map-support@npm:^0.8.0":
version: 0.8.1 version: 0.8.1
resolution: "@cspotcode/source-map-support@npm:0.8.1" resolution: "@cspotcode/source-map-support@npm:0.8.1"
@ -520,55 +605,55 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@floating-ui/core@npm:^1.7.1": "@floating-ui/core@npm:^1.7.2":
version: 1.7.1 version: 1.7.2
resolution: "@floating-ui/core@npm:1.7.1" resolution: "@floating-ui/core@npm:1.7.2"
dependencies: dependencies:
"@floating-ui/utils": "npm:^0.2.9" "@floating-ui/utils": "npm:^0.2.10"
checksum: 10c0/40df1e1dd8a2bad6f70c1ee163f0e151c456f52b9b98a38488d88720b2be72ccd631501a66f8369f96d2e8ad1c4250936b6fd4243e3a99833f2d008ee6afec18 checksum: 10c0/ea5909ae1bfad6d8dd60ab893c7751fd974d96b25481d13805935a089b39881b4d69425a0a84cc74c82269d8b64ca0117c472fc83e425143bee1bb21b247de9c
languageName: node languageName: node
linkType: hard linkType: hard
"@floating-ui/dom@npm:^1.0.0": "@floating-ui/dom@npm:^1.7.2":
version: 1.7.1 version: 1.7.2
resolution: "@floating-ui/dom@npm:1.7.1" resolution: "@floating-ui/dom@npm:1.7.2"
dependencies: dependencies:
"@floating-ui/core": "npm:^1.7.1" "@floating-ui/core": "npm:^1.7.2"
"@floating-ui/utils": "npm:^0.2.9" "@floating-ui/utils": "npm:^0.2.10"
checksum: 10c0/33b0e892f4c50ce568169cd58793ff5e3bc1e72ee007237d73b9458d4475e1e5f5a4b3f9e6752422d5f5ac902bc0c135ca7dc0a23c6df187fd9d28dc34cdceed checksum: 10c0/1b2ad76dc7fe245a1bb406cd5b64a1316f2ec642aebaa4d1928b56ced6fe71046f089e3fef9340bab234645b6333546211e363a630a9e7cfca6bf5031c39e0cb
languageName: node languageName: node
linkType: hard linkType: hard
"@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.1.3": "@floating-ui/react-dom@npm:^2.0.0, @floating-ui/react-dom@npm:^2.1.4":
version: 2.1.3 version: 2.1.4
resolution: "@floating-ui/react-dom@npm:2.1.3" resolution: "@floating-ui/react-dom@npm:2.1.4"
dependencies: dependencies:
"@floating-ui/dom": "npm:^1.0.0" "@floating-ui/dom": "npm:^1.7.2"
peerDependencies: peerDependencies:
react: ">=16.8.0" react: ">=16.8.0"
react-dom: ">=16.8.0" react-dom: ">=16.8.0"
checksum: 10c0/e88750ea2fb352264d52d502d3979f94155ce2c8ab9a50862810d0cfc8c8e49cb6bbde466d668736cb38624d089360ef97451397b647408a0eb2c1870234c19a checksum: 10c0/2dade6b8e18de09c90b876249756155ab31f49b5a81d246a3dc568d0355bc9e4bc26485dfd27b9e3bf86585700f4d241e8f53e8321249ec9b012a266a86b9366
languageName: node languageName: node
linkType: hard linkType: hard
"@floating-ui/react@npm:^0.27.3": "@floating-ui/react@npm:^0.27.3":
version: 0.27.12 version: 0.27.13
resolution: "@floating-ui/react@npm:0.27.12" resolution: "@floating-ui/react@npm:0.27.13"
dependencies: dependencies:
"@floating-ui/react-dom": "npm:^2.1.3" "@floating-ui/react-dom": "npm:^2.1.4"
"@floating-ui/utils": "npm:^0.2.9" "@floating-ui/utils": "npm:^0.2.10"
tabbable: "npm:^6.0.0" tabbable: "npm:^6.0.0"
peerDependencies: peerDependencies:
react: ">=17.0.0" react: ">=17.0.0"
react-dom: ">=17.0.0" react-dom: ">=17.0.0"
checksum: 10c0/da453965074bd4ded8e3de97ceb2c0833df8df2ecd9eff5ae4d336413443ea5abde5c9e37b092956901b97e7b47f9138d51d4896fa82da68e77eb0090289bf64 checksum: 10c0/4f5dd45829e4c62f447718d07bcf88a2388efb78dd91e38a6f34091feecfa4044ff7b43357192cdad4acbfc3898b932527c2a320913c5f492bae998f34f9f57d
languageName: node languageName: node
linkType: hard linkType: hard
"@floating-ui/utils@npm:^0.2.9": "@floating-ui/utils@npm:^0.2.10":
version: 0.2.9 version: 0.2.10
resolution: "@floating-ui/utils@npm:0.2.9" resolution: "@floating-ui/utils@npm:0.2.10"
checksum: 10c0/48bbed10f91cb7863a796cc0d0e917c78d11aeb89f98d03fc38d79e7eb792224a79f538ed8a2d5d5584511d4ca6354ef35f1712659fd569868e342df4398ad6f checksum: 10c0/e9bc2a1730ede1ee25843937e911ab6e846a733a4488623cd353f94721b05ec2c9ec6437613a2ac9379a94c2fd40c797a2ba6fa1df2716f5ce4aa6ddb1cf9ea4
languageName: node languageName: node
linkType: hard linkType: hard
@ -627,7 +712,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@gerrit0/mini-shiki@npm:^3.2.2": "@gerrit0/mini-shiki@npm:^3.7.0":
version: 3.7.0 version: 3.7.0
resolution: "@gerrit0/mini-shiki@npm:3.7.0" resolution: "@gerrit0/mini-shiki@npm:3.7.0"
dependencies: dependencies:
@ -928,13 +1013,12 @@ __metadata:
linkType: hard linkType: hard
"@jridgewell/gen-mapping@npm:^0.3.5": "@jridgewell/gen-mapping@npm:^0.3.5":
version: 0.3.8 version: 0.3.10
resolution: "@jridgewell/gen-mapping@npm:0.3.8" resolution: "@jridgewell/gen-mapping@npm:0.3.10"
dependencies: dependencies:
"@jridgewell/set-array": "npm:^1.2.1" "@jridgewell/sourcemap-codec": "npm:^1.5.0"
"@jridgewell/sourcemap-codec": "npm:^1.4.10"
"@jridgewell/trace-mapping": "npm:^0.3.24" "@jridgewell/trace-mapping": "npm:^0.3.24"
checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a checksum: 10c0/59518eb69276ce5a82995638a4de6a6b646c6a5a59fd575b55f80f2d3698876c5fbd4f8c9d5e0ac00c6bd93381188ba9b168ed30304c66a97eb3f751916582d9
languageName: node languageName: node
linkType: hard linkType: hard
@ -945,17 +1029,10 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@jridgewell/set-array@npm:^1.2.1":
version: 1.2.1
resolution: "@jridgewell/set-array@npm:1.2.1"
checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4
languageName: node
linkType: hard
"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": "@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0":
version: 1.5.0 version: 1.5.2
resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" resolution: "@jridgewell/sourcemap-codec@npm:1.5.2"
checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 checksum: 10c0/e7ca57faf80103a7f3dbc3fe144c7541e540a7bff23ecb218ea7dac03ce000ed2c07eefa05ee590fe31c3d251cda4e89a24136961aacc6a92d0e026787a2a399
languageName: node languageName: node
linkType: hard linkType: hard
@ -969,13 +1046,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@jridgewell/trace-mapping@npm:^0.3.24": "@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25":
version: 0.3.25 version: 0.3.27
resolution: "@jridgewell/trace-mapping@npm:0.3.25" resolution: "@jridgewell/trace-mapping@npm:0.3.27"
dependencies: dependencies:
"@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/resolve-uri": "npm:^3.1.0"
"@jridgewell/sourcemap-codec": "npm:^1.4.14" "@jridgewell/sourcemap-codec": "npm:^1.4.14"
checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 checksum: 10c0/b323eae6f3a71606e69427931bab7e65c4c2490f4138484e64f0e4d1d09b727fe55eb2ef34712d8abd4a8bad4d1388c6b1af5b0a2a2d3a2dc8d42e7d00a3f91b
languageName: node languageName: node
linkType: hard linkType: hard
@ -2224,9 +2301,9 @@ __metadata:
linkType: hard linkType: hard
"@rushstack/eslint-patch@npm:^1.10.3": "@rushstack/eslint-patch@npm:^1.10.3":
version: 1.11.0 version: 1.12.0
resolution: "@rushstack/eslint-patch@npm:1.11.0" resolution: "@rushstack/eslint-patch@npm:1.12.0"
checksum: 10c0/abea8d8cf2f4f50343f74abd6a8173c521ddd09b102021f5aa379ef373c40af5948b23db0e87eca1682e559e09d97d3f0c48ea71edad682c6bf72b840c8675b3 checksum: 10c0/1e567656d92632c085a446f40767bc451caffe1131e8d6a7a3e8f3e3f4167f5f29744a84c709f2440f299442d4bc68ff773784462166800b8c09c0e08042415b
languageName: node languageName: node
linkType: hard linkType: hard
@ -3286,6 +3363,32 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@trivago/prettier-plugin-sort-imports@npm:^5.2.2":
version: 5.2.2
resolution: "@trivago/prettier-plugin-sort-imports@npm:5.2.2"
dependencies:
"@babel/generator": "npm:^7.26.5"
"@babel/parser": "npm:^7.26.7"
"@babel/traverse": "npm:^7.26.7"
"@babel/types": "npm:^7.26.7"
javascript-natural-sort: "npm:^0.7.1"
lodash: "npm:^4.17.21"
peerDependencies:
"@vue/compiler-sfc": 3.x
prettier: 2.x - 3.x
prettier-plugin-svelte: 3.x
svelte: 4.x || 5.x
peerDependenciesMeta:
"@vue/compiler-sfc":
optional: true
prettier-plugin-svelte:
optional: true
svelte:
optional: true
checksum: 10c0/2a4f0464f1f5a294bcd34558fb053f8263f0c62c4a7fcdd3ce40c9822a68ac8b4d951700ab6d01eb3919efe0ed44e4191997edd494d59679b22db1c0db00474e
languageName: node
linkType: hard
"@tsconfig/node10@npm:^1.0.7": "@tsconfig/node10@npm:^1.0.7":
version: 1.0.11 version: 1.0.11
resolution: "@tsconfig/node10@npm:1.0.11" resolution: "@tsconfig/node10@npm:1.0.11"
@ -3379,11 +3482,11 @@ __metadata:
linkType: hard linkType: hard
"@types/node@npm:*": "@types/node@npm:*":
version: 24.0.4 version: 24.0.7
resolution: "@types/node@npm:24.0.4" resolution: "@types/node@npm:24.0.7"
dependencies: dependencies:
undici-types: "npm:~7.8.0" undici-types: "npm:~7.8.0"
checksum: 10c0/590e8cb0ec59fb9cd566402120e690d87ecbdf57f1ee2b8493266121ed33aa4b25949a0c6156b84a6ffb9250baaf1f80e9af142da542ed603e6ee73fc4d1115f checksum: 10c0/be3849816dafc54ec79e6be6dafcf60bdb6466beaf0081b941142d260e2b2864855210dfe5b4395c59b276468528695aefcf4f060ac95cc433b2968e80a311f9
languageName: node languageName: node
linkType: hard linkType: hard
@ -5094,9 +5197,9 @@ __metadata:
linkType: hard linkType: hard
"dotenv@npm:^16.3.0": "dotenv@npm:^16.3.0":
version: 16.5.0 version: 16.6.1
resolution: "dotenv@npm:16.5.0" resolution: "dotenv@npm:16.6.1"
checksum: 10c0/5bc94c919fbd955bf0ba44d33922a1e93d1078e64a1db5c30faeded1d996e7a83c55332cb8ea4fae5a9ca4d0be44cbceb95c5811e70f9f095298df09d1997dd9 checksum: 10c0/15ce56608326ea0d1d9414a5c8ee6dcf0fffc79d2c16422b4ac2268e7e2d76ff5a572d37ffe747c377de12005f14b3cc22361e79fc7f1061cce81f77d2c973dc
languageName: node languageName: node
linkType: hard linkType: hard
@ -5615,6 +5718,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-plugin-no-relative-import-paths@npm:^1.6.1":
version: 1.6.1
resolution: "eslint-plugin-no-relative-import-paths@npm:1.6.1"
checksum: 10c0/952d136ae959408d7f50fc6a630a010421ac39e7b8ccb0980817ae058941d19d6abe60233eabb5e9f32198de17d5d6ce9432f87ee8e2f2a243d71605b2e247ef
languageName: node
linkType: hard
"eslint-plugin-react-hooks@npm:^5.0.0": "eslint-plugin-react-hooks@npm:^5.0.0":
version: 5.2.0 version: 5.2.0
resolution: "eslint-plugin-react-hooks@npm:5.2.0" resolution: "eslint-plugin-react-hooks@npm:5.2.0"
@ -6329,6 +6439,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"globals@npm:^11.1.0":
version: 11.12.0
resolution: "globals@npm:11.12.0"
checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1
languageName: node
linkType: hard
"globals@npm:^14.0.0": "globals@npm:^14.0.0":
version: 14.0.0 version: 14.0.0
resolution: "globals@npm:14.0.0" resolution: "globals@npm:14.0.0"
@ -7042,6 +7159,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"javascript-natural-sort@npm:^0.7.1":
version: 0.7.1
resolution: "javascript-natural-sort@npm:0.7.1"
checksum: 10c0/340f8ffc5d30fb516e06dc540e8fa9e0b93c865cf49d791fed3eac3bdc5fc71f0066fc81d44ec1433edc87caecaf9f13eec4a1fce8c5beafc709a71eaedae6fe
languageName: node
linkType: hard
"jiti@npm:2.4.2, jiti@npm:^2.4.2": "jiti@npm:2.4.2, jiti@npm:^2.4.2":
version: 2.4.2 version: 2.4.2
resolution: "jiti@npm:2.4.2" resolution: "jiti@npm:2.4.2"
@ -7065,7 +7189,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"js-tokens@npm:^3.0.0 || ^4.0.0": "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0":
version: 4.0.0 version: 4.0.0
resolution: "js-tokens@npm:4.0.0" resolution: "js-tokens@npm:4.0.0"
checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed
@ -7104,6 +7228,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"jsesc@npm:^3.0.2":
version: 3.1.0
resolution: "jsesc@npm:3.1.0"
bin:
jsesc: bin/jsesc
checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1
languageName: node
linkType: hard
"json-buffer@npm:3.0.1": "json-buffer@npm:3.0.1":
version: 3.0.1 version: 3.0.1
resolution: "json-buffer@npm:3.0.1" resolution: "json-buffer@npm:3.0.1"
@ -7717,6 +7850,7 @@ __metadata:
"@radix-ui/react-tooltip": "npm:^1.2.7" "@radix-ui/react-tooltip": "npm:^1.2.7"
"@tailwindcss/postcss": "npm:4.1.11" "@tailwindcss/postcss": "npm:4.1.11"
"@tanstack/react-query": "npm:^5.80.7" "@tanstack/react-query": "npm:^5.80.7"
"@trivago/prettier-plugin-sort-imports": "npm:^5.2.2"
"@types/node": "npm:22.15.34" "@types/node": "npm:22.15.34"
"@types/react": "npm:19.1.8" "@types/react": "npm:19.1.8"
"@types/react-big-calendar": "npm:1.16.2" "@types/react-big-calendar": "npm:1.16.2"
@ -7733,6 +7867,7 @@ __metadata:
eslint: "npm:9.30.0" eslint: "npm:9.30.0"
eslint-config-next: "npm:15.3.4" eslint-config-next: "npm:15.3.4"
eslint-config-prettier: "npm:10.1.5" eslint-config-prettier: "npm:10.1.5"
eslint-plugin-no-relative-import-paths: "npm:^1.6.1"
lucide-react: "npm:^0.525.0" lucide-react: "npm:^0.525.0"
next: "npm:15.3.4" next: "npm:15.3.4"
next-auth: "npm:^5.0.0-beta.25" next-auth: "npm:^5.0.0-beta.25"
@ -7986,11 +8121,11 @@ __metadata:
linkType: hard linkType: hard
"napi-postinstall@npm:^0.2.4": "napi-postinstall@npm:^0.2.4":
version: 0.2.4 version: 0.2.5
resolution: "napi-postinstall@npm:0.2.4" resolution: "napi-postinstall@npm:0.2.5"
bin: bin:
napi-postinstall: lib/cli.js napi-postinstall: lib/cli.js
checksum: 10c0/e8c357d7e27848c4af7becf2796afff245a2fc8ba176e1b133410bb1c9934a66d4bc542d0c9f04c73b0ba34ee0486b30b6cd1c62ed3aa36797d394200c9a2a8b checksum: 10c0/c4a1a8ca61aece10a6a7b46b834d7689321c4bb164710df9d896a273f24544084c5be95b47c55208036a06ae5bfa0afabb6a8886985d4438543ee07344b9c90c
languageName: node languageName: node
linkType: hard linkType: hard
@ -10163,8 +10298,8 @@ __metadata:
linkType: hard linkType: hard
"swagger-client@npm:^3.35.5": "swagger-client@npm:^3.35.5":
version: 3.35.5 version: 3.35.6
resolution: "swagger-client@npm:3.35.5" resolution: "swagger-client@npm:3.35.6"
dependencies: dependencies:
"@babel/runtime-corejs3": "npm:^7.22.15" "@babel/runtime-corejs3": "npm:^7.22.15"
"@scarf/scarf": "npm:=1.4.0" "@scarf/scarf": "npm:=1.4.0"
@ -10184,7 +10319,7 @@ __metadata:
openapi-server-url-templating: "npm:^1.3.0" openapi-server-url-templating: "npm:^1.3.0"
ramda: "npm:^0.30.1" ramda: "npm:^0.30.1"
ramda-adjunct: "npm:^5.1.0" ramda-adjunct: "npm:^5.1.0"
checksum: 10c0/7179807ac977c1b7ee4f121d16a8f9f902467dfc026f4cff7fadb4d02e3b4f6a21f54612614435b3d43efbbce1376871aedb34f2c186de9391625f1c1674d948 checksum: 10c0/cf86fa6c9fbcc09e29c4f8d551f86cadc2d698847953728bea852d56b511805d758acc01380d7678f898eec6a1e56f6c00f1f97bce3e1550ee63c4ab3d78ecdd
languageName: node languageName: node
linkType: hard linkType: hard
@ -10692,19 +10827,19 @@ __metadata:
linkType: hard linkType: hard
"typedoc@npm:^0.28.0": "typedoc@npm:^0.28.0":
version: 0.28.5 version: 0.28.7
resolution: "typedoc@npm:0.28.5" resolution: "typedoc@npm:0.28.7"
dependencies: dependencies:
"@gerrit0/mini-shiki": "npm:^3.2.2" "@gerrit0/mini-shiki": "npm:^3.7.0"
lunr: "npm:^2.3.9" lunr: "npm:^2.3.9"
markdown-it: "npm:^14.1.0" markdown-it: "npm:^14.1.0"
minimatch: "npm:^9.0.5" minimatch: "npm:^9.0.5"
yaml: "npm:^2.7.1" yaml: "npm:^2.8.0"
peerDependencies: peerDependencies:
typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x
bin: bin:
typedoc: bin/typedoc typedoc: bin/typedoc
checksum: 10c0/fc8235dbe8f14da24fdb088467b01887b3f1375b27d5caf0276ae405f03aa1f523e94aea52fe8ce1a3d477ae9e3f4f69fdc28614275445a828a77db88784e6ce checksum: 10c0/30c942fa286c62898e5b2dd7750af80abb89684f4286bfbdf4009fb495cb8cfd65afbb793370d294c5d62e97c525789c2aae4bfd8ed29f5faa1dc49dcf4bf9c4
languageName: node languageName: node
linkType: hard linkType: hard
@ -11225,7 +11360,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"yaml@npm:^2.3.4, yaml@npm:^2.5.0, yaml@npm:^2.7.1, yaml@npm:^2.8.0": "yaml@npm:^2.3.4, yaml@npm:^2.5.0, yaml@npm:^2.8.0":
version: 2.8.0 version: 2.8.0
resolution: "yaml@npm:2.8.0" resolution: "yaml@npm:2.8.0"
bin: bin: