sidebarItem belum fix

This commit is contained in:
2025-05-28 07:23:47 +07:00
parent 692ffdf2f1
commit 453fccf550
14 changed files with 990 additions and 48 deletions
+21 -5
View File
@@ -1,6 +1,18 @@
<script setup lang="ts">
import { ref } from 'vue';
const { $encodeBase64 } = useNuxtApp();
const checkbox = ref(true);
const cookies = useCookie('user_token_profile');
// const keycloak = async () => {
// const response = await $fetch(`/api/auth/login`, { method: 'POST', mode: 'no-cors' }).then((response) => {
// console.log(response)
// cookies.value = $encodeBase64('ini_token')
// window.location.href = response.callbackURL
// })
// }
const { signIn, getProviders } = useAuth()
const providers = await getProviders()
</script>
<template>
@@ -11,22 +23,26 @@ const checkbox = ref(true);
</v-col>
<v-col cols="12">
<v-label class="font-weight-bold mb-1">Password</v-label>
<v-text-field variant="outlined" density="compact" type="password" hide-details color="primary"></v-text-field>
<v-text-field variant="outlined" density="compact" type="password" hide-details
color="primary"></v-text-field>
</v-col>
<v-col cols="12" class="pt-0">
<div class="d-flex flex-wrap align-center">
<v-checkbox v-model="checkbox" color="primary" hide-details>
<v-checkbox v-model="checkbox" color="primary" hide-details>
<template v-slot:label class="text-body-1">Remeber this Device</template>
</v-checkbox>
<div class="ml-sm-auto">
<NuxtLink to="/"
class="text-primary text-decoration-none text-body-1 opacity-1 font-weight-medium">Forgot
<NuxtLink to="/" class="text-primary text-decoration-none text-body-1 opacity-1 font-weight-medium">
Forgot
Password ?</NuxtLink>
</div>
</div>
</v-col>
<v-col cols="12" class="pt-0">
<v-btn to="/" color="primary" size="large" block flat>Sign in</v-btn>
<button v-for="provider in providers" :key="provider.id" class="login-button" @click="signIn('keycloak')">
Sign in with {{ provider.name }}
</button>
<!-- <v-btn @click="keycloak()" color="primary" size="large" block flat>Sign in</v-btn> -->
</v-col>
</v-row>
</template>
@@ -1,5 +1,15 @@
<script setup lang="ts">
import { UserIcon, MailIcon, ListCheckIcon } from 'vue-tabler-icons';
const runtimeConfig = useRuntimeConfig();
const user_profile = useCookie('user_token_profile');
// const user_token = useCookie('user_token');
const logout = async () => {
console.log('Logging out...');
window.location.href = `${runtimeConfig.public.keycloakUrl}/realms/${runtimeConfig.public.keycloakRealm}/protocol/openid-connect/logout?client_id=${runtimeConfig.public.keycloakClient}&post_logout_redirect_uri=http://localhost:3000`;
// user_token.value = null;
user_profile.value = null;
navigateTo('/auth/login')
}
</script>
<template>
@@ -16,27 +26,27 @@ import { UserIcon, MailIcon, ListCheckIcon } from 'vue-tabler-icons';
</template>
<v-sheet rounded="md" width="200" elevation="10" class="mt-2">
<v-list class="py-0" lines="one" density="compact">
<v-list-item value="item1" active-color="primary" >
<v-list-item value="item1" active-color="primary">
<template v-slot:prepend>
<UserIcon stroke-width="1.5" size="20"/>
<UserIcon stroke-width="1.5" size="20" />
</template>
<v-list-item-title class="pl-4 text-body-1">My Profile</v-list-item-title>
</v-list-item>
<v-list-item value="item2" active-color="primary">
<template v-slot:prepend>
<MailIcon stroke-width="1.5" size="20"/>
<MailIcon stroke-width="1.5" size="20" />
</template>
<v-list-item-title class="pl-4 text-body-1">My Account</v-list-item-title>
<v-list-item-title class="pl-4 text-body-1">My Account</v-list-item-title>
</v-list-item>
<v-list-item value="item3" active-color="primary">
<v-list-item value="item3" active-color="primary">
<template v-slot:prepend>
<ListCheckIcon stroke-width="1.5" size="20"/>
<ListCheckIcon stroke-width="1.5" size="20" />
</template>
<v-list-item-title class="pl-4 text-body-1">My Task</v-list-item-title>
</v-list-item>
</v-list>
<div class="pt-4 pb-4 px-5 text-center">
<v-btn to="/auth/login" color="primary" variant="outlined" block>Logout</v-btn>
<v-btn @click="logout" color="primary" variant="outlined" block>Logout</v-btn>
</div>
</v-sheet>
</v-menu>
@@ -1,3 +1,5 @@
const { $decodeBase64 } = useNuxtApp();
export interface menu {
header?: string;
title?: string;
@@ -14,6 +16,7 @@ export interface menu {
type?: string;
subCaption?: string;
external?: boolean;
requiredGroups?: string[];
}
const sidebarItem: menu[] = [
@@ -27,16 +30,19 @@ const sidebarItem: menu[] = [
title: "Front Pages",
icon: "home-angle-linear",
to: "/front",
requiredGroups: ["/Bidang Pelayanan Medik"],
children: [
{
title: "Coba VueForm",
to: "/coba",
external: false,
requiredGroups: ["/Bidang Pelayanan Medik"]
},
{
title: "Coba VueForm2",
to: "/coba2",
external: false,
requiredGroups: ["/Bidang Diklit/Staff"]
},
{
title: "Homepage",
@@ -51,6 +57,8 @@ const sidebarItem: menu[] = [
title: "Typography",
icon: "text-circle-outline",
to: "/ui/typography",
requiredGroups: ['/Instalasi Bedah Sentral', '/Instalasi Rawat Jalan'],
},
{
title: "Shadow",
@@ -107,4 +115,7 @@ const sidebarItem: menu[] = [
},
];
export default sidebarItem;
+34
View File
@@ -26,7 +26,41 @@ export default defineNuxtConfig({
},
modules: [
'@vueform/nuxt',
'@sidebase/nuxt-auth'
],
// auth: {
// isEnabled: true,
// originEnvKey: 'AUTH_ORIGIN',
// baseURL: process.env.AUTH_ORIGIN || "http://localhost:3000",
// provider: {
// type: 'authjs',
// },
// sessionRefresh: {
// enablePeriodically: true,
// enableOnWindowFocus: true,
// },
// // disableServerSideAuth: false,
// // globalAppMiddleware: {
// // isEnabled: true,
// // },
// },
runtimeConfig: {
auth: {
origin: process.env.NUXT_AUTH_ORIGIN || 'http://localhost:3000'
},
public: {
keycloakUrl: 'https://auth.rssa.top',
keycloakRealm: 'sandbox',
keycloakClient: 'coba-pendaftaran',
keycloakSecretKey: '32HslhZ8Hn97SsbxcmowhXvmNZ9cPGNE',
keycloakRedirectURI: 'http://localhost:3000',
SIMRS_API: 'http://10.10.150.131:8084/api' // local Ahdan
// SIMRS_API: 'http://10.10.123.140:8084/api'
},
},
compatibilityDate: "2024-10-23",
})
+6 -2
View File
@@ -11,6 +11,9 @@
"postinstall": "nuxt prepare"
},
"dependencies": {
"openid-client": "^5.7.1",
"nuxt-auth-utils": "^0.5.16",
"cors": "^2.8.5",
"@iconify/vue": "^4.1.1",
"@mdi/font": "7.4.47",
"@nuxt/vite-builder": "3.16.2",
@@ -24,9 +27,10 @@
"vuetify": "3.7.18"
},
"devDependencies": {
"nuxt": "3.16.2"
"nuxt": "3.16.2",
"@sidebase/nuxt-auth": "^0.10.1"
},
"overrides": {
"nth-check": "2.1.1"
}
}
}
+162 -28
View File
@@ -1,31 +1,165 @@
<script setup lang="ts">
/*-For Set Blank Layout-*/
definePageMeta({
layout: "blank",
});
</script>
<template>
<div class="authentication">
<v-container fluid class="pa-3">
<v-row class="h-100vh d-flex justify-center align-center">
<v-col cols="12" lg="4" xl="3" class="d-flex align-center">
<v-card rounded="md" elevation="10" class="px-sm-1 px-0 withbg mx-auto" max-width="500">
<v-card-item class="pa-sm-8">
<div class="d-flex justify-center py-4">
<LayoutFullLogo />
</div>
<div class="text-body-1 text-muted text-center mb-3">Your Social Campaigns</div>
<AuthLoginForm />
<h6 class="text-h6 text-muted font-weight-medium d-flex justify-center align-center mt-3">
New to Matdash?
<NuxtLink to="/auth/register"
class="text-primary text-decoration-none text-body-1 opacity-1 font-weight-medium pl-2">
Create an account</NuxtLink>
</h6>
</v-card-item>
</v-card>
</v-col>
</v-row>
</v-container>
<div class="login-container">
<!-- Static gradient background with CSS animations instead of using directives -->
<div class="background-animation"></div>
<!-- Simple layout without nested component issues -->
<div class="login-wrapper">
<div class="login-card">
<div class="card-header">
<h2 class="title">SIMRS</h2>
<p class="subtitle">Sistem Informasi Manajemen Rumah Sakit</p>
</div>
<div class="card-content">
<button v-for="provider in providers" :key="provider.id" class="login-button" @click="signIn(provider.id)">
Sign in with {{ provider.name }}
</button>
<div class="footer">
<p>© {{ new Date().getFullYear() }} SIMRS. All rights reserved.</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
definePageMeta({
layout: 'auth',
auth: {
unauthenticatedOnly: false,
navigateAuthenticatedTo: '/coba2',
},
})
const { signIn, getProviders } = useAuth()
const providers = await getProviders()
console.log(providers)
</script>
<style scoped>
.login-container {
position: relative;
min-height: 100vh;
width: 100%;
overflow: hidden;
display: flex;
justify-content: center;
align-items: center;
background: linear-gradient(135deg, #0072ff 0%, #00c6ff 100%);
}
/* Background animation using CSS only - no SVG or complex animations */
.background-animation {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(135deg,
rgba(0, 114, 255, 0.8) 0%,
rgba(0, 198, 255, 0.8) 100%);
opacity: 0.7;
}
.background-animation::before,
.background-animation::after {
content: '';
position: absolute;
left: -50%;
top: -50%;
width: 200%;
height: 200%;
background-color: rgba(255, 255, 255, 0.1);
border-radius: 40%;
z-index: 1;
animation: rotate 25s linear infinite;
}
.background-animation::after {
border-radius: 35%;
background-color: rgba(255, 255, 255, 0.15);
animation: rotate 30s linear infinite;
}
@keyframes rotate {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.login-wrapper {
position: relative;
z-index: 10;
width: 100%;
max-width: 440px;
padding: 20px;
}
.login-card {
background-color: rgba(255, 255, 255, 0.9);
border-radius: 12px;
overflow: hidden;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease;
}
.login-card:hover {
transform: translateY(-5px);
}
.card-header {
padding: 20px;
text-align: center;
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
}
.title {
margin: 0;
color: #0072ff;
font-size: 24px;
font-weight: bold;
}
.subtitle {
margin: 5px 0 0;
color: #555;
font-size: 14px;
}
.card-content {
padding: 20px;
}
.login-button {
display: block;
width: 100%;
padding: 12px 16px;
margin-bottom: 16px;
background-color: #0072ff;
color: white;
border: none;
border-radius: 6px;
font-size: 16px;
font-weight: 500;
cursor: pointer;
transition: background-color 0.2s ease;
}
.login-button:hover {
background-color: #005fd6;
}
.footer {
margin-top: 20px;
text-align: center;
color: #666;
font-size: 12px;
}
</style>
+35
View File
@@ -0,0 +1,35 @@
<script setup lang="ts">
/*-For Set Blank Layout-*/
definePageMeta({
layout: "blank",
auth: {
unauthenticatedOnly: true,
navigateAuthenticatedTo: '/homepage',
},
});
</script>
<template>
<div class="authentication">
<v-container fluid class="pa-3">
<v-row class="h-100vh d-flex justify-center align-center">
<v-col cols="12" lg="4" xl="3" class="d-flex align-center">
<v-card rounded="md" elevation="10" class="px-sm-1 px-0 withbg mx-auto" max-width="500">
<v-card-item class="pa-sm-8">
<div class="d-flex justify-center py-4">
<LayoutFullLogo />
</div>
<div class="text-body-1 text-muted text-center mb-3">Your Social Campaigns</div>
<AuthLoginForm />
<h6 class="text-h6 text-muted font-weight-medium d-flex justify-center align-center mt-3">
New to Matdash?
<NuxtLink to="/auth/register"
class="text-primary text-decoration-none text-body-1 opacity-1 font-weight-medium pl-2">
Create an account</NuxtLink>
</h6>
</v-card-item>
</v-card>
</v-col>
</v-row>
</v-container>
</div>
</template>
+61
View File
@@ -0,0 +1,61 @@
<template>
<div>
<p>User Profil: </p>
<pre>{{ tokenUser }}</pre>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue';
const tokenUser = useCookie('user_token_profile');
const runtimeconfig = useRuntimeConfig();
const sessionState = ref('');
const issuer = ref('');
const code = ref('');
onMounted(async () => {
const url = window.location.href;
const urlParams = new URL(url).searchParams;
// Ambil parameter yang diperlukan
sessionState.value = urlParams.get('session_state') || '';
issuer.value = urlParams.get('iss') || '';
code.value = urlParams.get('code') || '';
if (code.value) {
try {
const tokenUrl = `${issuer.value}/protocol/openid-connect/token`;
const response = await $fetch(tokenUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams({
grant_type: 'authorization_code',
client_id: runtimeconfig.public.keycloakClient, // Ganti dengan client ID Anda
client_secret: runtimeconfig.public.keycloakSecretKey, // Ganti dengan client secret Anda
code: urlParams.get('code'),
redirect_uri: `${runtimeconfig.public.keycloakRedirectURI}/callback`, // Ganti dengan redirect URI Anda
}),
});
const accessToken = response.access_token;
tokenUser.value = accessToken;
// Ambil informasi pengguna
const userInfoUrl = `${issuer.value}/protocol/openid-connect/userinfo`;
const userInfoResponse = await $fetch(userInfoUrl, {
headers: {
Authorization: `Bearer ${accessToken}`,
},
});
tokenUser.value = JSON.stringify(userInfoResponse);
} catch (error) {
console.error('Error during token exchange or user info fetch:', error);
}
}
});
</script>
<style></style>
+1
View File
@@ -3,6 +3,7 @@
<Vueform ref="data" validate-on="change|step" method="post" :endpoint="onSubmit">
<FormLibIdentifier />
<FormLibHumanName />
<FormLibHumanName />
<ButtonElement name="submit" button-label="Simpan" :submits="true" align="center" size="lg" />
</Vueform>
+13
View File
@@ -0,0 +1,13 @@
<template>
<div>
</div>
</template>
<script lang="ts" setup>
</script>
<style>
</style>
+24
View File
@@ -0,0 +1,24 @@
function encodeBase64(value: string): string {
if (process.client) {
return window.btoa(unescape(encodeURIComponent(value)))
} else {
return Buffer.from(value, 'ascii').toString('base64')
}
}
function decodeBase64(value: string): string {
if (process.client) {
return decodeURIComponent(escape(window.atob(value)))
} else {
return Buffer.from(value, 'base64').toString('ascii')
}
}
export default defineNuxtPlugin(() => {
return {
provide: {
encodeBase64,
decodeBase64
}
}
})
+530 -6
View File
@@ -20,6 +20,15 @@ dependencies:
apexcharts:
specifier: 4.5.0
version: 4.5.0
cors:
specifier: ^2.8.5
version: 2.8.5
nuxt-auth-utils:
specifier: ^0.5.16
version: 0.5.20
openid-client:
specifier: ^5.7.1
version: 5.7.1
sass:
specifier: 1.70.0
version: 1.70.0
@@ -40,12 +49,31 @@ dependencies:
version: 3.7.18(typescript@5.8.3)(vue@3.5.13)
devDependencies:
'@sidebase/nuxt-auth':
specifier: ^0.10.1
version: 0.10.1(next-auth@4.21.1)
nuxt:
specifier: 3.16.2
version: 3.16.2(sass@1.70.0)(typescript@5.8.3)(vite@6.3.5)
packages:
/@adonisjs/hash@9.1.1:
resolution: {integrity: sha512-ZkRguwjAp4skKvKDdRAfdJ2oqQ0N7p9l3sioyXO1E8o0WcsyDgEpsTQtuVNoIdMiw4sn4gJlmL3nyF4BcK1ZDQ==}
engines: {node: '>=20.6.0'}
peerDependencies:
argon2: ^0.31.2 || ^0.41.0 || ^0.43.0
bcrypt: ^5.1.1 || ^6.0.0
peerDependenciesMeta:
argon2:
optional: true
bcrypt:
optional: true
dependencies:
'@phc/format': 1.0.0
'@poppinss/utils': 6.9.4
dev: false
/@ampproject/remapping@2.3.0:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
@@ -252,6 +280,11 @@ packages:
transitivePeerDependencies:
- supports-color
/@babel/runtime@7.27.1:
resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==}
engines: {node: '>=6.9.0'}
dev: true
/@babel/template@7.27.2:
resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
engines: {node: '>=6.9.0'}
@@ -618,6 +651,11 @@ packages:
resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==}
dev: true
/@lukeed/ms@2.0.2:
resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==}
engines: {node: '>=8'}
dev: false
/@mapbox/node-pre-gyp@1.0.11:
resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
hasBin: true
@@ -778,6 +816,91 @@ packages:
- supports-color
dev: true
/@next/env@13.5.11:
resolution: {integrity: sha512-fbb2C7HChgM7CemdCY+y3N1n8pcTKdqtQLbC7/EQtPdLvlMUT9JX/dBYl8MMZAtYG4uVMyPFHXckb68q/NRwqg==}
dev: true
/@next/swc-darwin-arm64@13.5.9:
resolution: {integrity: sha512-pVyd8/1y1l5atQRvOaLOvfbmRwefxLhqQOzYo/M7FQ5eaRwA1+wuCn7t39VwEgDd7Aw1+AIWwd+MURXUeXhwDw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@next/swc-darwin-x64@13.5.9:
resolution: {integrity: sha512-DwdeJqP7v8wmoyTWPbPVodTwCybBZa02xjSJ6YQFIFZFZ7dFgrieKW4Eo0GoIcOJq5+JxkQyejmI+8zwDp3pwA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
requiresBuild: true
dev: true
optional: true
/@next/swc-linux-arm64-gnu@13.5.9:
resolution: {integrity: sha512-wdQsKsIsGSNdFojvjW3Ozrh8Q00+GqL3wTaMjDkQxVtRbAqfFBtrLPO0IuWChVUP2UeuQcHpVeUvu0YgOP00+g==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@next/swc-linux-arm64-musl@13.5.9:
resolution: {integrity: sha512-6VpS+bodQqzOeCwGxoimlRoosiWlSc0C224I7SQWJZoyJuT1ChNCo+45QQH+/GtbR/s7nhaUqmiHdzZC9TXnXA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@next/swc-linux-x64-gnu@13.5.9:
resolution: {integrity: sha512-XxG3yj61WDd28NA8gFASIR+2viQaYZEFQagEodhI/R49gXWnYhiflTeeEmCn7Vgnxa/OfK81h1gvhUZ66lozpw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@next/swc-linux-x64-musl@13.5.9:
resolution: {integrity: sha512-/dnscWqfO3+U8asd+Fc6dwL2l9AZDl7eKtPNKW8mKLh4Y4wOpjJiamhe8Dx+D+Oq0GYVjuW0WwjIxYWVozt2bA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
requiresBuild: true
dev: true
optional: true
/@next/swc-win32-arm64-msvc@13.5.9:
resolution: {integrity: sha512-T/iPnyurOK5a4HRUcxAlss8uzoEf5h9tkd+W2dSWAfzxv8WLKlUgbfk+DH43JY3Gc2xK5URLuXrxDZ2mGfk/jw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@next/swc-win32-ia32-msvc@13.5.9:
resolution: {integrity: sha512-BLiPKJomaPrTAb7ykjA0LPcuuNMLDVK177Z1xe0nAem33+9FIayU4k/OWrtSn9SAJW/U60+1hoey5z+KCHdRLQ==}
engines: {node: '>= 10'}
cpu: [ia32]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@next/swc-win32-x64-msvc@13.5.9:
resolution: {integrity: sha512-/72/dZfjXXNY/u+n8gqZDjI6rxKMpYsgBBYNZKWOQw0BpBF7WCnPflRy3ZtvQ2+IYI3ZH2bPyj7K+6a6wNk90Q==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
requiresBuild: true
dev: true
optional: true
/@nodelib/fs.scandir@2.1.5:
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -1177,6 +1300,10 @@ packages:
resolution: {integrity: sha512-prhfNnb3ATFHOCv7mzKFfwLij5RzoUz6Y1n525ZhCEqfq5wreCXL+DyVoq3ShukPo7q45ZjYIdjFUgjj+WKzng==}
dev: true
/@panva/hkdf@1.2.1:
resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==}
dev: true
/@parcel/watcher-android-arm64@2.5.1:
resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
engines: {node: '>= 10.0.0'}
@@ -1315,6 +1442,11 @@ packages:
'@parcel/watcher-win32-ia32': 2.5.1
'@parcel/watcher-win32-x64': 2.5.1
/@phc/format@1.0.0:
resolution: {integrity: sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==}
engines: {node: '>=10'}
dev: false
/@pkgjs/parseargs@0.11.0:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@@ -1348,7 +1480,36 @@ packages:
/@poppinss/exception@1.2.1:
resolution: {integrity: sha512-aQypoot0HPSJa6gDPEPTntc1GT6QINrSbgRlRhadGW2WaYqUK3tK4Bw9SBMZXhmxd3GeAlZjVcODHgiu+THY7A==}
engines: {node: '>=18'}
dev: true
/@poppinss/object-builder@1.1.0:
resolution: {integrity: sha512-FOrOq52l7u8goR5yncX14+k+Ewi5djnrt1JwXeS/FvnwAPOiveFhiczCDuvXdssAwamtrV2hp5Rw9v+n2T7hQg==}
engines: {node: '>=20.6.0'}
dev: false
/@poppinss/string@1.6.0:
resolution: {integrity: sha512-HfAf9VqTvo31BsruwgwEauQ316RNODdryk6QgYZo4qTV50s0h1H9HmIr+QjwwI3u4Sz7r4Q1dd1EVaLB7pWlaw==}
dependencies:
'@lukeed/ms': 2.0.2
'@types/bytes': 3.1.5
'@types/pluralize': 0.0.33
bytes: 3.1.2
case-anything: 3.1.2
pluralize: 8.0.0
slugify: 1.6.6
truncatise: 0.0.8
dev: false
/@poppinss/utils@6.9.4:
resolution: {integrity: sha512-KJe9/ebFBqb4fFBdadgN4YgT4bHAKdWhLAFzjaeDqx5vOCtD3C+byN5DrORVNbwAjt+rb8beP8pXaWZWx+WmTA==}
engines: {node: '>=18.16.0'}
dependencies:
'@poppinss/exception': 1.2.1
'@poppinss/object-builder': 1.1.0
'@poppinss/string': 1.6.0
flattie: 1.1.1
safe-stable-stringify: 2.5.0
secure-json-parse: 4.0.0
dev: false
/@rolldown/pluginutils@1.0.0-beta.9:
resolution: {integrity: sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==}
@@ -1611,6 +1772,51 @@ packages:
requiresBuild: true
optional: true
/@sidebase/nuxt-auth@0.10.1(next-auth@4.21.1):
resolution: {integrity: sha512-fCSDfGl6npVIWrb//NbeKA16ATk1CpjzfRrNAdJ2PRr0BF5aJz6KCvDI8dSzs5VLMJBIRLR39G2rWYq5q+v5iA==}
engines: {node: '>=20', pnpm: '>=9.4.0'}
peerDependencies:
next-auth: ~4.21.1
dependencies:
'@nuxt/kit': 3.17.4(magicast@0.3.5)
defu: 6.1.4
h3: 1.15.3
knitwork: 1.2.0
next-auth: 4.21.1(next@13.5.11)(react-dom@18.3.1)(react@18.3.1)
nitropack: 2.11.12
requrl: 3.0.2
scule: 1.3.0
ufo: 1.6.1
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
- '@azure/data-tables'
- '@azure/identity'
- '@azure/keyvault-secrets'
- '@azure/storage-blob'
- '@capacitor/preferences'
- '@deno/kv'
- '@electric-sql/pglite'
- '@libsql/client'
- '@netlify/blobs'
- '@planetscale/database'
- '@upstash/redis'
- '@vercel/blob'
- '@vercel/kv'
- aws4fetch
- better-sqlite3
- drizzle-orm
- encoding
- idb-keyval
- magicast
- mysql2
- rolldown
- sqlite3
- supports-color
- uploadthing
- xml2js
dev: true
/@sindresorhus/is@7.0.1:
resolution: {integrity: sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==}
engines: {node: '>=18'}
@@ -1663,6 +1869,12 @@ packages:
'@svgdotjs/svg.js': 3.2.4
dev: false
/@swc/helpers@0.5.2:
resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==}
dependencies:
tslib: 2.8.1
dev: true
/@trysound/sax@0.2.0:
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
@@ -1675,6 +1887,10 @@ packages:
dev: true
optional: true
/@types/bytes@3.1.5:
resolution: {integrity: sha512-VgZkrJckypj85YxEsEavcMmmSOIzkUHqWmM4CCyia5dc54YwsXzJ5uT4fYxBQNEXx+oF1krlhgCbvfubXqZYsQ==}
dev: false
/@types/estree@1.0.7:
resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
@@ -1697,6 +1913,10 @@ packages:
parse-path: 7.1.0
dev: true
/@types/pluralize@0.0.33:
resolution: {integrity: sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==}
dev: false
/@types/resolve@1.20.2:
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
dev: true
@@ -2470,6 +2690,18 @@ packages:
run-applescript: 7.0.0
dev: true
/busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
engines: {node: '>=10.16.0'}
dependencies:
streamsearch: 1.1.0
dev: true
/bytes@3.1.2:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
engines: {node: '>= 0.8'}
dev: false
/c12@3.0.4(magicast@0.3.5):
resolution: {integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==}
peerDependencies:
@@ -2526,6 +2758,11 @@ packages:
/caniuse-lite@1.0.30001718:
resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==}
/case-anything@3.1.2:
resolution: {integrity: sha512-wljhAjDDIv/hM2FzgJnYQg90AWmZMNtESCjTeLH680qTzdo0nErlCxOmgzgX4ZsZAtIvqHyD87ES8QyriXB+BQ==}
engines: {node: '>=18'}
dev: false
/chokidar@3.6.0:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
@@ -2561,6 +2798,10 @@ packages:
dependencies:
consola: 3.4.2
/client-only@0.0.1:
resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
dev: true
/clipboardy@4.0.0:
resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==}
engines: {node: '>=18'}
@@ -2723,6 +2964,11 @@ packages:
resolution: {integrity: sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==}
dev: true
/cookie@0.5.0:
resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
engines: {node: '>= 0.6'}
dev: true
/cookie@1.0.2:
resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
engines: {node: '>=18'}
@@ -2739,6 +2985,14 @@ packages:
resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
dev: true
/cors@2.8.5:
resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
engines: {node: '>= 0.10'}
dependencies:
object-assign: 4.1.1
vary: 1.1.2
dev: false
/cp-file@10.0.0:
resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==}
engines: {node: '>=14.16'}
@@ -3591,6 +3845,11 @@ packages:
unicorn-magic: 0.1.0
dev: true
/flattie@1.1.1:
resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
engines: {node: '>=8'}
dev: false
/fn.name@1.1.0:
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
dev: true
@@ -3772,6 +4031,10 @@ packages:
dependencies:
is-glob: 4.0.3
/glob-to-regexp@0.4.1:
resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
dev: true
/glob@10.4.5:
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
hasBin: true
@@ -3900,7 +4163,6 @@ packages:
/hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
dev: true
/hosted-git-info@7.0.2:
resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
@@ -4209,6 +4471,17 @@ packages:
resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
hasBin: true
/jose@4.15.9:
resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==}
/jose@5.10.0:
resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==}
dev: false
/jose@6.0.11:
resolution: {integrity: sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg==}
dev: false
/js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@@ -4381,6 +4654,13 @@ packages:
triple-beam: 1.4.1
dev: true
/loose-envify@1.4.0:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
dependencies:
js-tokens: 4.0.0
dev: true
/lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
dev: true
@@ -4390,6 +4670,12 @@ packages:
dependencies:
yallist: 3.1.1
/lru-cache@6.0.0:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
dependencies:
yallist: 4.0.0
/luxon@3.6.1:
resolution: {integrity: sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==}
engines: {node: '>=12'}
@@ -4642,6 +4928,71 @@ packages:
qs: 6.14.0
dev: true
/next-auth@4.21.1(next@13.5.11)(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-NYkU4jAPSVxWhCblE8dDFAnKM7kOoO/QEobQ0RoEVP9Wox99A3PKHwOAsWhSg8ahJG/iKIWk2Bo1xHvsS4R39Q==}
peerDependencies:
next: ^12.2.5 || ^13
nodemailer: ^6.6.5
react: ^17.0.2 || ^18
react-dom: ^17.0.2 || ^18
peerDependenciesMeta:
nodemailer:
optional: true
dependencies:
'@babel/runtime': 7.27.1
'@panva/hkdf': 1.2.1
cookie: 0.5.0
jose: 4.15.9
next: 13.5.11(@babel/core@7.27.1)(react-dom@18.3.1)(react@18.3.1)(sass@1.70.0)
oauth: 0.9.15
openid-client: 5.7.1
preact: 10.26.7
preact-render-to-string: 5.2.6(preact@10.26.7)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
uuid: 8.3.2
dev: true
/next@13.5.11(@babel/core@7.27.1)(react-dom@18.3.1)(react@18.3.1)(sass@1.70.0):
resolution: {integrity: sha512-WUPJ6WbAX9tdC86kGTu92qkrRdgRqVrY++nwM+shmWQwmyxt4zhZfR59moXSI4N8GDYCBY3lIAqhzjDd4rTC8Q==}
engines: {node: '>=16.14.0'}
hasBin: true
peerDependencies:
'@opentelemetry/api': ^1.1.0
react: ^18.2.0
react-dom: ^18.2.0
sass: ^1.3.0
peerDependenciesMeta:
'@opentelemetry/api':
optional: true
sass:
optional: true
dependencies:
'@next/env': 13.5.11
'@swc/helpers': 0.5.2
busboy: 1.6.0
caniuse-lite: 1.0.30001718
postcss: 8.4.31
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
sass: 1.70.0
styled-jsx: 5.1.1(@babel/core@7.27.1)(react@18.3.1)
watchpack: 2.4.0
optionalDependencies:
'@next/swc-darwin-arm64': 13.5.9
'@next/swc-darwin-x64': 13.5.9
'@next/swc-linux-arm64-gnu': 13.5.9
'@next/swc-linux-arm64-musl': 13.5.9
'@next/swc-linux-x64-gnu': 13.5.9
'@next/swc-linux-x64-musl': 13.5.9
'@next/swc-win32-arm64-msvc': 13.5.9
'@next/swc-win32-ia32-msvc': 13.5.9
'@next/swc-win32-x64-msvc': 13.5.9
transitivePeerDependencies:
- '@babel/core'
- babel-plugin-macros
dev: true
/nitropack@2.11.12:
resolution: {integrity: sha512-e2AdQrEY1IVoNTdyjfEQV93xkqz4SQxAMR0xWF8mZUUHxMLm6S4nPzpscjksmT4OdUxl0N8/DCaGjKQ9ghdodA==}
engines: {node: ^16.11.0 || >=17.0.0}
@@ -4885,6 +5236,40 @@ packages:
dependencies:
boolbase: 1.0.0
/nuxt-auth-utils@0.5.20:
resolution: {integrity: sha512-hoXopfYeK4Cdu17WxxDWYc66EH7ZYG8JUodPxxef9vjfXOXqz3s1gxi/JWsiqkwN6s7K1RpKEESZGg1EopCgAA==}
peerDependencies:
'@atproto/api': ^0.13.15
'@atproto/oauth-client-node': ^0.2.0
'@simplewebauthn/browser': ^11.0.0
'@simplewebauthn/server': ^11.0.0
peerDependenciesMeta:
'@atproto/api':
optional: true
'@atproto/oauth-client-node':
optional: true
'@simplewebauthn/browser':
optional: true
'@simplewebauthn/server':
optional: true
dependencies:
'@adonisjs/hash': 9.1.1
'@nuxt/kit': 3.17.4(magicast@0.3.5)
defu: 6.1.4
h3: 1.15.3
hookable: 5.5.3
jose: 5.10.0
ofetch: 1.4.1
openid-client: 6.5.0
pathe: 2.0.3
scule: 1.3.0
uncrypto: 0.1.3
transitivePeerDependencies:
- argon2
- bcrypt
- magicast
dev: false
/nuxt@3.16.2(sass@1.70.0)(typescript@5.8.3)(vite@6.3.5):
resolution: {integrity: sha512-yjIC/C4HW8Pd+m0ACGliEF0HnimXYGYvUzjOsTiLQKkDDt2T+djyZ+pCl9BfhQBA8rYmnsym2jUI+ubjv1iClw==}
engines: {node: ^18.12.0 || ^20.9.0 || >=22.0.0}
@@ -5026,10 +5411,21 @@ packages:
pkg-types: 2.1.0
tinyexec: 0.3.2
/oauth4webapi@3.5.1:
resolution: {integrity: sha512-txg/jZQwcbaF7PMJgY7aoxc9QuCxHVFMiEkDIJ60DwDz3PbtXPQnrzo+3X4IRYGChIwWLabRBRpf1k9hO9+xrQ==}
dev: false
/oauth@0.9.15:
resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==}
dev: true
/object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
dev: true
/object-hash@2.2.0:
resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==}
engines: {node: '>= 6'}
/object-inspect@1.13.4:
resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
@@ -5042,11 +5438,14 @@ packages:
destr: 2.0.5
node-fetch-native: 1.6.6
ufo: 1.6.1
dev: true
/ohash@2.0.11:
resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==}
/oidc-token-hash@5.1.0:
resolution: {integrity: sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==}
engines: {node: ^10.13.0 || >=12.0.0}
/on-change@5.0.1:
resolution: {integrity: sha512-n7THCP7RkyReRSLkJb8kUWoNsxUIBxTkIp3JKno+sEz6o/9AJ3w3P9fzQkITEkMwyTKJjZciF3v/pVoouxZZMg==}
engines: {node: '>=18'}
@@ -5096,6 +5495,21 @@ packages:
is-docker: 2.2.1
is-wsl: 2.2.0
/openid-client@5.7.1:
resolution: {integrity: sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==}
dependencies:
jose: 4.15.9
lru-cache: 6.0.0
object-hash: 2.2.0
oidc-token-hash: 5.1.0
/openid-client@6.5.0:
resolution: {integrity: sha512-fAfYaTnOYE2kQCqEJGX9KDObW2aw7IQy4jWpU/+3D3WoCFLbix5Hg6qIPQ6Js9r7f8jDUmsnnguRNCSw4wU/IQ==}
dependencies:
jose: 6.0.11
oauth4webapi: 3.5.1
dev: false
/oxc-parser@0.56.5:
resolution: {integrity: sha512-MNT32sqiTFeSbQZP2WZIRQ/mlIpNNq4sua+/4hBG4qT5aef2iQe+1/BjezZURPlvucZeSfN1Y6b60l7OgBdyUA==}
engines: {node: '>=14.0.0'}
@@ -5288,6 +5702,11 @@ packages:
exsolve: 1.0.5
pathe: 2.0.3
/pluralize@8.0.0:
resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
engines: {node: '>=4'}
dev: false
/postcss-calc@10.1.1(postcss@8.5.3):
resolution: {integrity: sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==}
engines: {node: ^18.12 || ^20.9 || >=22.0}
@@ -5879,6 +6298,15 @@ packages:
source-map: 0.6.1
dev: false
/postcss@8.4.31:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
dev: true
/postcss@8.5.3:
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
engines: {node: ^10 || ^12 || >=14}
@@ -5887,6 +6315,19 @@ packages:
picocolors: 1.1.1
source-map-js: 1.2.1
/preact-render-to-string@5.2.6(preact@10.26.7):
resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==}
peerDependencies:
preact: '>=10'
dependencies:
preact: 10.26.7
pretty-format: 3.8.0
dev: true
/preact@10.26.7:
resolution: {integrity: sha512-43xS+QYc1X1IPbw03faSgY6I6OYWcLrJRv3hU0+qMOfh/XCHcP0MX2CVjNARYR2cC/guu975sta4OcjlczxD7g==}
dev: true
/precinct@11.0.5:
resolution: {integrity: sha512-oHSWLC8cL/0znFhvln26D14KfCQFFn4KOLSw6hmLhd+LQ2SKt9Ljm89but76Pc7flM9Ty1TnXyrA2u16MfRV3w==}
engines: {node: ^14.14.0 || >=16.0.0}
@@ -5913,6 +6354,10 @@ packages:
engines: {node: ^14.13.1 || >=16.0.0}
dev: true
/pretty-format@3.8.0:
resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==}
dev: true
/process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
dev: true
@@ -5982,6 +6427,23 @@ packages:
defu: 6.1.4
destr: 2.0.5
/react-dom@18.3.1(react@18.3.1):
resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
peerDependencies:
react: ^18.3.1
dependencies:
loose-envify: 1.4.0
react: 18.3.1
scheduler: 0.23.2
dev: true
/react@18.3.1:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
dependencies:
loose-envify: 1.4.0
dev: true
/read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
dependencies:
@@ -6080,6 +6542,10 @@ packages:
resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==}
dev: true
/requrl@3.0.2:
resolution: {integrity: sha512-f3gjR6d8MhOpn46PP+DSJywbmxi95fxQm3coXBFwognjFLla9X6tr8BdNyaIKNOEkaRbRcm0/zYAqN19N1oyhg==}
dev: true
/resolve-from@5.0.0:
resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
engines: {node: '>=8'}
@@ -6188,7 +6654,6 @@ packages:
/safe-stable-stringify@2.5.0:
resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
engines: {node: '>=10'}
dev: true
/sass@1.70.0:
resolution: {integrity: sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ==}
@@ -6211,9 +6676,19 @@ packages:
'@parcel/watcher': 2.5.1
dev: false
/scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
dependencies:
loose-envify: 1.4.0
dev: true
/scule@1.3.0:
resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==}
/secure-json-parse@4.0.0:
resolution: {integrity: sha512-dxtLJO6sc35jWidmLxo7ij+Eg48PM/kleBsxpC8QJE0qJICe+KawkDQmvCMZUr9u7WKVHgMW6vy3fQ7zMiFZMA==}
dev: false
/semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
@@ -6377,6 +6852,11 @@ packages:
resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==}
engines: {node: '>=14.16'}
/slugify@1.6.6:
resolution: {integrity: sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==}
engines: {node: '>=8.0.0'}
dev: false
/smob@1.5.0:
resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==}
dev: true
@@ -6448,6 +6928,11 @@ packages:
/std-env@3.9.0:
resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==}
/streamsearch@1.1.0:
resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
engines: {node: '>=10.0.0'}
dev: true
/streamx@2.22.0:
resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==}
dependencies:
@@ -6512,6 +6997,24 @@ packages:
resolution: {integrity: sha512-FL8EeKFFyNQv5cMnXI31CIMCsFarSVI2bF0U0ImeNE3g/F1IvJQyqzOXxPBRXiwQfyBTlbNe88jh1jFW0O/jiQ==}
dev: true
/styled-jsx@5.1.1(@babel/core@7.27.1)(react@18.3.1):
resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
engines: {node: '>= 12.0.0'}
peerDependencies:
'@babel/core': '*'
babel-plugin-macros: '*'
react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
peerDependenciesMeta:
'@babel/core':
optional: true
babel-plugin-macros:
optional: true
dependencies:
'@babel/core': 7.27.1
client-only: 0.0.1
react: 18.3.1
dev: true
/stylehacks@5.1.1(postcss@8.5.3):
resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==}
engines: {node: ^10 || ^12 || >=14.0}
@@ -6719,6 +7222,10 @@ packages:
dompurify: 3.2.6
dev: false
/truncatise@0.0.8:
resolution: {integrity: sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg==}
dev: false
/tslib@1.14.1:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
dev: true
@@ -7022,6 +7529,11 @@ packages:
hasBin: true
dev: true
/uuid@8.3.2:
resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
hasBin: true
dev: true
/validate-npm-package-license@3.0.4:
resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
dependencies:
@@ -7029,6 +7541,11 @@ packages:
spdx-expression-parse: 3.0.1
dev: true
/vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
dev: false
/vite-dev-rpc@1.0.7(vite@6.3.5):
resolution: {integrity: sha512-FxSTEofDbUi2XXujCA+hdzCDkXFG1PXktMjSk1efq9Qb5lOYaaM9zNSvKvPPF7645Bak79kSp1PTooMW2wktcA==}
peerDependencies:
@@ -7288,6 +7805,14 @@ packages:
vue: 3.5.13(typescript@5.8.3)
dev: false
/watchpack@2.4.0:
resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
engines: {node: '>=10.13.0'}
dependencies:
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
dev: true
/web-streams-polyfill@3.3.3:
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
engines: {node: '>= 8'}
@@ -7410,7 +7935,6 @@ packages:
/yallist@4.0.0:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: true
/yallist@5.0.0:
resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
+58
View File
@@ -0,0 +1,58 @@
// import CredentialsProvider from 'next-auth/providers/credentials'
import KeycloakProvider from 'next-auth/providers/keycloak'
import { NuxtAuthHandler } from '#auth'
console.log(KeycloakProvider)
export default NuxtAuthHandler({
// TODO: SET A STRONG SECRET, SEE https://sidebase.io/nuxt-auth/configuration/nuxt-auth-handler#secret
secret: process.env.AUTH_SECRET || '32HslhZ8Hn97SsbxcmowhXvmNZ9cPGNE',
// TODO: ADD YOUR OWN AUTHENTICATION PROVIDER HERE, READ THE DOCS FOR MORE: https://sidebase.io/nuxt-auth
providers: [
// @ts-expect-error You need to use .default here for it to work during SSR. May be fixed via Vite at some point
KeycloakProvider.default({
clientId: process.env.KEYCLOAK_ID,
clientSecret: process.env.KEYCLOAK_SECRET,
issuer: process.env.KEYCLOAK_ISSUER,
}),
// // @ts-expect-error You need to use .default here for it to work during SSR. May be fixed via Vite at some point
// CredentialsProvider.default({
// // The name to display on the sign in form (e.g. 'Sign in with...')
// name: 'Credentials',
// // The credentials is used to generate a suitable form on the sign in page.
// // You can specify whatever fields you are expecting to be submitted.
// // e.g. domain, username, password, 2FA token, etc.
// // You can pass any HTML attribute to the <input> tag through the object.
// credentials: {
// username: { label: 'Username', type: 'text', placeholder: '(hint: jsmith)' },
// password: { label: 'Password', type: 'password', placeholder: '(hint: hunter2)' }
// },
// authorize (credentials: any) {
// console.warn('ATTENTION: You should replace this with your real providers or credential provider logic! The current setup is not safe')
// // You need to provide your own logic here that takes the credentials
// // submitted and returns either a object representing a user or value
// // that is false/null if the credentials are invalid.
// // NOTE: THE BELOW LOGIC IS NOT SAFE OR PROPER FOR AUTHENTICATION!
// const user = { id: '1', name: 'J Smith', username: 'jsmith', password: 'hunter2' }
// if (credentials?.username === user.username && credentials?.password === user.password) {
// // Any object returned will be saved in `user` property of the JWT
// return user
// } else {
// console.error('Warning: Malicious login attempt registered, bad credentials provided')
// // If you return null then an error will be displayed advising the user to check their details.
// return null
// // You can also Reject this callback with an Error thus the user will be sent to the error page with the error message as a query parameter
// }
// }
// })
],
pages: {
signIn: '/auth/login',
// signOut: '/auth/signOut',
// error: '/auth/error',
// verifyRequest: '/auth/verify-request',
// newUser: '/auth/new-user'
},
})
+17
View File
@@ -0,0 +1,17 @@
import { getServerSession, getToken } from '#auth'
export default eventHandler(async (event) => {
return
const session = await getServerSession(event)
if (!session) {
event.context.auth = false
} else {
const token = await getToken({ event })
event.context.auth = { token }
}
})
// export default defineEventHandler((event) => {
// if (!event.node.req.headers.origin) {
// event.node.req.headers.origin = process.env.NUXT_AUTH_ORIGIN
// }
// })