Add product detail and listing pages with API integration
- Created a new product detail page to display individual product information, including images, descriptions, and pricing. - Implemented a product listing page to showcase all available products using the ProductCard and ProductGrid components. - Added API endpoints for fetching product data, ensuring only active products are returned. - Introduced a database seed script to populate the database with initial mock product data for development and testing. - Updated settings to include new database seeding command and adjusted routing for product links.
This commit is contained in:
@@ -61,7 +61,8 @@
|
|||||||
"WebFetch(domain:cidaas.github.io)",
|
"WebFetch(domain:cidaas.github.io)",
|
||||||
"Bash(node check-user.mjs:*)",
|
"Bash(node check-user.mjs:*)",
|
||||||
"Bash(xargs kill:*)",
|
"Bash(xargs kill:*)",
|
||||||
"mcp__playwright__browser_resize"
|
"mcp__playwright__browser_resize",
|
||||||
|
"Bash(pnpm db:seed:*)"
|
||||||
],
|
],
|
||||||
"deny": [],
|
"deny": [],
|
||||||
"ask": []
|
"ask": []
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ const formattedPrice = computed(() => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- CTA Button -->
|
<!-- CTA Button -->
|
||||||
<NuxtLink :to="productId ? `/produkte/${productId}` : '#'"
|
<NuxtLink :to="productId ? `/products/${productId}` : '#'"
|
||||||
class="group/btn relative overflow-hidden rounded-xl bg-gradient-button bg-size-300 bg-left px-6 py-3 font-bold text-white shadow-lg transition-all duration-300 hover:bg-right hover:shadow-2xl active:scale-95">
|
class="group/btn relative overflow-hidden rounded-xl bg-gradient-button bg-size-300 bg-left px-6 py-3 font-bold text-white shadow-lg transition-all duration-300 hover:bg-right hover:shadow-2xl active:scale-95">
|
||||||
<span class="relative z-10">Details</span>
|
<span class="relative z-10">Details</span>
|
||||||
<div
|
<div
|
||||||
|
|||||||
195
app/pages/products/[id].vue
Normal file
195
app/pages/products/[id].vue
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
/**
|
||||||
|
* Product Detail Page
|
||||||
|
*
|
||||||
|
* Displays full details for a single product with large image and description.
|
||||||
|
* Includes placeholder "Add to Cart" functionality for future implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { ArrowLeft, CheckCircle } from 'lucide-vue-next'
|
||||||
|
|
||||||
|
// Page metadata
|
||||||
|
definePageMeta({
|
||||||
|
layout: 'default',
|
||||||
|
})
|
||||||
|
|
||||||
|
// Get product ID from route
|
||||||
|
const route = useRoute()
|
||||||
|
const productId = route.params.id as string
|
||||||
|
|
||||||
|
// Type definition for product
|
||||||
|
interface Product {
|
||||||
|
id: string
|
||||||
|
navProductId: string
|
||||||
|
name: string
|
||||||
|
description: string
|
||||||
|
price: string
|
||||||
|
stockQuantity: number
|
||||||
|
category: string
|
||||||
|
active: boolean
|
||||||
|
createdAt: Date
|
||||||
|
updatedAt: Date
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch product from API
|
||||||
|
const { data: product, error, pending } = await useFetch<Product>(`/api/products/${productId}`)
|
||||||
|
|
||||||
|
// Format price in EUR
|
||||||
|
const formattedPrice = computed(() => {
|
||||||
|
if (!product.value) return ''
|
||||||
|
return new Intl.NumberFormat('de-DE', {
|
||||||
|
style: 'currency',
|
||||||
|
currency: 'EUR',
|
||||||
|
}).format(Number(product.value.price))
|
||||||
|
})
|
||||||
|
|
||||||
|
// Handle "Add to Cart" action (placeholder for future implementation)
|
||||||
|
const handleAddToCart = () => {
|
||||||
|
// TODO: Implement cart functionality in future phase
|
||||||
|
alert('Add to Cart funktioniert noch nicht. Diese Funktion wird in einer späteren Phase implementiert.')
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<NuxtLayout name="default">
|
||||||
|
<div class="min-h-screen bg-gradient-primary px-4 py-12 md:px-6 lg:px-8">
|
||||||
|
<!-- Back Button -->
|
||||||
|
<div class="mx-auto mb-8 max-w-container-narrow">
|
||||||
|
<NuxtLink
|
||||||
|
to="/products"
|
||||||
|
class="inline-flex items-center gap-2 text-white/80 transition-colors hover:text-white"
|
||||||
|
>
|
||||||
|
<ArrowLeft :size="20" />
|
||||||
|
<span>Zurück zur Übersicht</span>
|
||||||
|
</NuxtLink>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Loading State -->
|
||||||
|
<div v-if="pending" class="mx-auto max-w-container-narrow text-center">
|
||||||
|
<div class="card-glass inline-block">
|
||||||
|
<p class="text-white/80">Produkt wird geladen...</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Error State (404 or other errors) -->
|
||||||
|
<div v-else-if="error" class="mx-auto max-w-container-narrow">
|
||||||
|
<div class="card-glass border-red/50 bg-red/10">
|
||||||
|
<h2 class="mb-2 text-2xl font-semibold text-red">
|
||||||
|
{{ error.statusCode === 404 ? 'Produkt nicht gefunden' : 'Fehler beim Laden' }}
|
||||||
|
</h2>
|
||||||
|
<p class="mb-6 text-white/80">
|
||||||
|
{{
|
||||||
|
error.statusCode === 404
|
||||||
|
? 'Das angeforderte Produkt existiert nicht oder ist nicht verfügbar.'
|
||||||
|
: error.message || 'Ein unbekannter Fehler ist aufgetreten.'
|
||||||
|
}}
|
||||||
|
</p>
|
||||||
|
<NuxtLink to="/products">
|
||||||
|
<Button variant="experimenta" size="experimenta">
|
||||||
|
Zur Produktübersicht
|
||||||
|
</Button>
|
||||||
|
</NuxtLink>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Product Detail -->
|
||||||
|
<div v-else-if="product" class="mx-auto max-w-container-narrow">
|
||||||
|
<div class="overflow-hidden rounded-2xl border border-white/20 bg-white/10 shadow-glass backdrop-blur-lg">
|
||||||
|
<!-- Product Image (no padding, flush with top) -->
|
||||||
|
<div class="relative aspect-[16/9] w-full overflow-hidden bg-purple-dark">
|
||||||
|
<img
|
||||||
|
src="/img/makerspace-jk-2025.jpg"
|
||||||
|
:alt="product.name"
|
||||||
|
class="h-full w-full object-cover"
|
||||||
|
/>
|
||||||
|
<!-- Gradient overlay -->
|
||||||
|
<div
|
||||||
|
class="absolute inset-0 bg-gradient-to-t from-purple-darkest/80 via-transparent to-transparent"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Product Content -->
|
||||||
|
<div class="space-y-6 p-8">
|
||||||
|
<!-- Title -->
|
||||||
|
<h1 class="text-3xl font-bold text-white md:text-4xl">
|
||||||
|
{{ product.name }}
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<!-- Description -->
|
||||||
|
<p class="text-lg leading-relaxed text-white/90">
|
||||||
|
{{ product.description }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<!-- Product Details -->
|
||||||
|
<div class="grid gap-4 sm:grid-cols-2">
|
||||||
|
<!-- Price Card -->
|
||||||
|
<div class="rounded-xl bg-white/5 p-4 backdrop-blur-sm">
|
||||||
|
<span class="mb-1 block text-xs uppercase tracking-wide text-white/60">Preis</span>
|
||||||
|
<span class="text-3xl font-bold text-experimenta-accent">
|
||||||
|
{{ formattedPrice }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Availability Card -->
|
||||||
|
<div class="rounded-xl bg-white/5 p-4 backdrop-blur-sm">
|
||||||
|
<span class="mb-1 block text-xs uppercase tracking-wide text-white/60">Verfügbarkeit</span>
|
||||||
|
<div
|
||||||
|
:class="[
|
||||||
|
'flex items-center gap-2 text-xl font-semibold',
|
||||||
|
product.stockQuantity > 0 ? 'text-green' : 'text-red',
|
||||||
|
]"
|
||||||
|
>
|
||||||
|
<CheckCircle v-if="product.stockQuantity > 0" :size="24" />
|
||||||
|
<span>{{ product.stockQuantity > 0 ? 'Sofort' : 'Nicht verfügbar' }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Features / Benefits -->
|
||||||
|
<div class="rounded-xl border border-white/20 bg-white/5 p-6 backdrop-blur-sm">
|
||||||
|
<h2 class="mb-4 text-xl font-semibold text-white">
|
||||||
|
Was du mit dieser Karte bekommst:
|
||||||
|
</h2>
|
||||||
|
<ul class="space-y-3 text-white/90">
|
||||||
|
<li class="flex items-start gap-2">
|
||||||
|
<span class="mt-1 text-experimenta-accent">✓</span>
|
||||||
|
<span>365 Tage unbegrenzter Zugang</span>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-2">
|
||||||
|
<span class="mt-1 text-experimenta-accent">✓</span>
|
||||||
|
<span>Keine versteckten Kosten</span>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-2">
|
||||||
|
<span class="mt-1 text-experimenta-accent">✓</span>
|
||||||
|
<span>Sofort einsatzbereit nach Kauf</span>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-2">
|
||||||
|
<span class="mt-1 text-experimenta-accent">✓</span>
|
||||||
|
<span>Flexible Nutzung – komme so oft du möchtest</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Action Buttons -->
|
||||||
|
<div class="flex flex-col gap-4 sm:flex-row">
|
||||||
|
<Button
|
||||||
|
variant="experimenta"
|
||||||
|
size="experimenta"
|
||||||
|
class="flex-1"
|
||||||
|
:disabled="product.stockQuantity === 0"
|
||||||
|
@click="handleAddToCart"
|
||||||
|
>
|
||||||
|
{{ product.stockQuantity > 0 ? 'In den Warenkorb' : 'Nicht verfügbar' }}
|
||||||
|
</Button>
|
||||||
|
<NuxtLink to="/products" class="flex-1">
|
||||||
|
<Button variant="outline" size="experimenta" class="w-full">
|
||||||
|
Weitere Produkte ansehen
|
||||||
|
</Button>
|
||||||
|
</NuxtLink>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</NuxtLayout>
|
||||||
|
</template>
|
||||||
139
app/pages/products/index.vue
Normal file
139
app/pages/products/index.vue
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
/**
|
||||||
|
* Products Listing Page
|
||||||
|
*
|
||||||
|
* Displays all available products (annual passes, etc.) using ProductCard and ProductGrid components.
|
||||||
|
* Fetches products from the database via API.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Page metadata
|
||||||
|
definePageMeta({
|
||||||
|
layout: 'default',
|
||||||
|
})
|
||||||
|
|
||||||
|
// Type definition for product
|
||||||
|
interface Product {
|
||||||
|
id: string
|
||||||
|
navProductId: string
|
||||||
|
name: string
|
||||||
|
description: string
|
||||||
|
price: string
|
||||||
|
stockQuantity: number
|
||||||
|
category: string
|
||||||
|
active: boolean
|
||||||
|
createdAt: Date
|
||||||
|
updatedAt: Date
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch products from API
|
||||||
|
const { data: products, error, pending } = await useFetch<Product[]>('/api/products')
|
||||||
|
|
||||||
|
// Map product categories to badges
|
||||||
|
const getBadge = (category: string): string | undefined => {
|
||||||
|
const badges: Record<string, string> = {
|
||||||
|
'makerspace-annual-pass': 'Beliebt',
|
||||||
|
'educator-annual-pass': 'Neu',
|
||||||
|
}
|
||||||
|
return badges[category]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map product categories to discount percentages (for demo)
|
||||||
|
const getDiscount = (category: string): number | undefined => {
|
||||||
|
const discounts: Record<string, number> = {
|
||||||
|
'educator-annual-pass': 15,
|
||||||
|
}
|
||||||
|
return discounts[category]
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<NuxtLayout name="default">
|
||||||
|
<div class="min-h-screen bg-gradient-primary px-4 py-12 md:px-6 lg:px-8">
|
||||||
|
<!-- Page Header -->
|
||||||
|
<div class="mx-auto mb-12 max-w-container-wide text-center">
|
||||||
|
<h1 class="mb-4 text-4xl font-bold text-white md:text-5xl">
|
||||||
|
Unsere Jahreskarten
|
||||||
|
</h1>
|
||||||
|
<p class="mx-auto max-w-2xl text-lg text-white/80">
|
||||||
|
Wähle die passende Jahreskarte für deine Bedürfnisse. Alle Karten sind 365 Tage gültig
|
||||||
|
und sofort einsetzbar.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Loading State -->
|
||||||
|
<div v-if="pending" class="mx-auto max-w-container-wide text-center">
|
||||||
|
<div class="card-glass inline-block">
|
||||||
|
<p class="text-white/80">Produkte werden geladen...</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Error State -->
|
||||||
|
<div v-else-if="error" class="mx-auto max-w-container-wide">
|
||||||
|
<div class="card-glass border-red/50 bg-red/10">
|
||||||
|
<h2 class="mb-2 text-xl font-semibold text-red">
|
||||||
|
Fehler beim Laden der Produkte
|
||||||
|
</h2>
|
||||||
|
<p class="text-white/80">
|
||||||
|
{{ error.message || 'Ein unbekannter Fehler ist aufgetreten.' }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Products Grid -->
|
||||||
|
<div v-else-if="products && products.length > 0" class="mx-auto max-w-container-wide">
|
||||||
|
<ProductGrid :columns="3">
|
||||||
|
<ProductCard
|
||||||
|
v-for="product in products"
|
||||||
|
:key="product.id"
|
||||||
|
image="/img/makerspace-jk-2025.jpg"
|
||||||
|
:title="product.name"
|
||||||
|
:description="product.description"
|
||||||
|
:price="Number(product.price)"
|
||||||
|
:badge="getBadge(product.category)"
|
||||||
|
:discount-percentage="getDiscount(product.category)"
|
||||||
|
:product-id="product.id"
|
||||||
|
/>
|
||||||
|
</ProductGrid>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Empty State -->
|
||||||
|
<div v-else class="mx-auto max-w-container-wide text-center">
|
||||||
|
<div class="card-glass">
|
||||||
|
<h2 class="mb-2 text-xl font-semibold text-white">
|
||||||
|
Keine Produkte verfügbar
|
||||||
|
</h2>
|
||||||
|
<p class="text-white/80">
|
||||||
|
Aktuell sind keine Produkte verfügbar. Bitte schaue später noch einmal vorbei.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Info Card -->
|
||||||
|
<div class="mx-auto mt-12 max-w-container-wide">
|
||||||
|
<div class="card-info card-accent-border">
|
||||||
|
<h2 class="mb-3 text-xl font-semibold text-experimenta-accent">
|
||||||
|
Warum eine Jahreskarte?
|
||||||
|
</h2>
|
||||||
|
<ul class="space-y-2 text-white/90">
|
||||||
|
<li class="flex items-start gap-2">
|
||||||
|
<span class="mt-1 text-experimenta-accent">✓</span>
|
||||||
|
<span>365 Tage unbegrenzter Zugang zu deinen Lieblingsbereichen</span>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-2">
|
||||||
|
<span class="mt-1 text-experimenta-accent">✓</span>
|
||||||
|
<span>Keine versteckten Kosten – ein Preis für das ganze Jahr</span>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-2">
|
||||||
|
<span class="mt-1 text-experimenta-accent">✓</span>
|
||||||
|
<span>Exklusive Vorteile und Vergünstigungen für Jahreskarteninhaber</span>
|
||||||
|
</li>
|
||||||
|
<li class="flex items-start gap-2">
|
||||||
|
<span class="mt-1 text-experimenta-accent">✓</span>
|
||||||
|
<span>Flexible Nutzung – komme so oft du möchtest</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</NuxtLayout>
|
||||||
|
</template>
|
||||||
@@ -14,7 +14,8 @@
|
|||||||
"db:generate": "drizzle-kit generate",
|
"db:generate": "drizzle-kit generate",
|
||||||
"db:migrate": "drizzle-kit migrate",
|
"db:migrate": "drizzle-kit migrate",
|
||||||
"db:studio": "drizzle-kit studio",
|
"db:studio": "drizzle-kit studio",
|
||||||
"db:push": "drizzle-kit push"
|
"db:push": "drizzle-kit push",
|
||||||
|
"db:seed": "tsx server/database/seed.ts"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nuxtjs/i18n": "^10.1.2",
|
"@nuxtjs/i18n": "^10.1.2",
|
||||||
@@ -38,12 +39,14 @@
|
|||||||
"@nuxt/eslint": "^1.10.0",
|
"@nuxt/eslint": "^1.10.0",
|
||||||
"@nuxtjs/tailwindcss": "^6.14.0",
|
"@nuxtjs/tailwindcss": "^6.14.0",
|
||||||
"@types/node": "^22.10.0",
|
"@types/node": "^22.10.0",
|
||||||
|
"dotenv": "^17.2.3",
|
||||||
"drizzle-kit": "^0.31.6",
|
"drizzle-kit": "^0.31.6",
|
||||||
"eslint": "^9.38.0",
|
"eslint": "^9.38.0",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-plugin-prettier": "^5.5.4",
|
"eslint-plugin-prettier": "^5.5.4",
|
||||||
"prettier": "^3.6.2",
|
"prettier": "^3.6.2",
|
||||||
"shadcn-nuxt": "^2.3.2",
|
"shadcn-nuxt": "^2.3.2",
|
||||||
|
"tsx": "^4.20.6",
|
||||||
"typescript": "^5.7.0"
|
"typescript": "^5.7.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
134
pnpm-lock.yaml
generated
134
pnpm-lock.yaml
generated
@@ -34,7 +34,7 @@ importers:
|
|||||||
version: 0.548.0(vue@3.5.22(typescript@5.9.3))
|
version: 0.548.0(vue@3.5.22(typescript@5.9.3))
|
||||||
nuxt:
|
nuxt:
|
||||||
specifier: ^4.2.0
|
specifier: ^4.2.0
|
||||||
version: 4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)
|
version: 4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1)
|
||||||
nuxt-auth-utils:
|
nuxt-auth-utils:
|
||||||
specifier: ^0.5.25
|
specifier: ^0.5.25
|
||||||
version: 0.5.25(magicast@0.5.0)
|
version: 0.5.25(magicast@0.5.0)
|
||||||
@@ -59,13 +59,16 @@ importers:
|
|||||||
devDependencies:
|
devDependencies:
|
||||||
'@nuxt/eslint':
|
'@nuxt/eslint':
|
||||||
specifier: ^1.10.0
|
specifier: ^1.10.0
|
||||||
version: 1.10.0(@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.38.0(jiti@2.6.1))(magicast@0.5.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))
|
version: 1.10.0(@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.38.0(jiti@2.6.1))(magicast@0.5.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
|
||||||
'@nuxtjs/tailwindcss':
|
'@nuxtjs/tailwindcss':
|
||||||
specifier: ^6.14.0
|
specifier: ^6.14.0
|
||||||
version: 6.14.0(magicast@0.5.0)(yaml@2.8.1)
|
version: 6.14.0(magicast@0.5.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^22.10.0
|
specifier: ^22.10.0
|
||||||
version: 22.18.13
|
version: 22.18.13
|
||||||
|
dotenv:
|
||||||
|
specifier: ^17.2.3
|
||||||
|
version: 17.2.3
|
||||||
drizzle-kit:
|
drizzle-kit:
|
||||||
specifier: ^0.31.6
|
specifier: ^0.31.6
|
||||||
version: 0.31.6
|
version: 0.31.6
|
||||||
@@ -84,6 +87,9 @@ importers:
|
|||||||
shadcn-nuxt:
|
shadcn-nuxt:
|
||||||
specifier: ^2.3.2
|
specifier: ^2.3.2
|
||||||
version: 2.3.2(magicast@0.5.0)
|
version: 2.3.2(magicast@0.5.0)
|
||||||
|
tsx:
|
||||||
|
specifier: ^4.20.6
|
||||||
|
version: 4.20.6
|
||||||
typescript:
|
typescript:
|
||||||
specifier: ^5.7.0
|
specifier: ^5.7.0
|
||||||
version: 5.9.3
|
version: 5.9.3
|
||||||
@@ -4699,6 +4705,11 @@ packages:
|
|||||||
resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==}
|
resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==}
|
||||||
engines: {node: '>=0.6.x'}
|
engines: {node: '>=0.6.x'}
|
||||||
|
|
||||||
|
tsx@4.20.6:
|
||||||
|
resolution: {integrity: sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==}
|
||||||
|
engines: {node: '>=18.0.0'}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
type-check@0.4.0:
|
type-check@0.4.0:
|
||||||
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
|
||||||
engines: {node: '>= 0.8.0'}
|
engines: {node: '>= 0.8.0'}
|
||||||
@@ -5891,19 +5902,19 @@ snapshots:
|
|||||||
|
|
||||||
'@nuxt/devalue@2.0.2': {}
|
'@nuxt/devalue@2.0.2': {}
|
||||||
|
|
||||||
'@nuxt/devtools-kit@2.7.0(magicast@0.3.5)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))':
|
'@nuxt/devtools-kit@2.7.0(magicast@0.3.5)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nuxt/kit': 3.20.0(magicast@0.3.5)
|
'@nuxt/kit': 3.20.0(magicast@0.3.5)
|
||||||
execa: 8.0.1
|
execa: 8.0.1
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- magicast
|
- magicast
|
||||||
|
|
||||||
'@nuxt/devtools-kit@3.0.0(magicast@0.5.0)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))':
|
'@nuxt/devtools-kit@3.0.0(magicast@0.5.0)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
||||||
execa: 8.0.1
|
execa: 8.0.1
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- magicast
|
- magicast
|
||||||
|
|
||||||
@@ -5918,12 +5929,12 @@ snapshots:
|
|||||||
prompts: 2.4.2
|
prompts: 2.4.2
|
||||||
semver: 7.7.3
|
semver: 7.7.3
|
||||||
|
|
||||||
'@nuxt/devtools@2.7.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))':
|
'@nuxt/devtools@2.7.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nuxt/devtools-kit': 2.7.0(magicast@0.3.5)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))
|
'@nuxt/devtools-kit': 2.7.0(magicast@0.3.5)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
|
||||||
'@nuxt/devtools-wizard': 2.7.0
|
'@nuxt/devtools-wizard': 2.7.0
|
||||||
'@nuxt/kit': 3.20.0(magicast@0.3.5)
|
'@nuxt/kit': 3.20.0(magicast@0.3.5)
|
||||||
'@vue/devtools-core': 7.7.7(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
'@vue/devtools-core': 7.7.7(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
||||||
'@vue/devtools-kit': 7.7.7
|
'@vue/devtools-kit': 7.7.7
|
||||||
birpc: 2.6.1
|
birpc: 2.6.1
|
||||||
consola: 3.4.2
|
consola: 3.4.2
|
||||||
@@ -5948,9 +5959,9 @@ snapshots:
|
|||||||
sirv: 3.0.2
|
sirv: 3.0.2
|
||||||
structured-clone-es: 1.0.0
|
structured-clone-es: 1.0.0
|
||||||
tinyglobby: 0.2.15
|
tinyglobby: 0.2.15
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
vite-plugin-inspect: 11.3.3(@nuxt/kit@3.20.0(magicast@0.3.5))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))
|
vite-plugin-inspect: 11.3.3(@nuxt/kit@3.20.0(magicast@0.3.5))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
|
||||||
vite-plugin-vue-tracer: 1.0.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
vite-plugin-vue-tracer: 1.0.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
||||||
which: 5.0.0
|
which: 5.0.0
|
||||||
ws: 8.18.3
|
ws: 8.18.3
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@@ -5999,10 +6010,10 @@ snapshots:
|
|||||||
- supports-color
|
- supports-color
|
||||||
- typescript
|
- typescript
|
||||||
|
|
||||||
'@nuxt/eslint@1.10.0(@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.38.0(jiti@2.6.1))(magicast@0.5.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))':
|
'@nuxt/eslint@1.10.0(@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.38.0(jiti@2.6.1))(magicast@0.5.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint/config-inspector': 1.3.0(eslint@9.38.0(jiti@2.6.1))
|
'@eslint/config-inspector': 1.3.0(eslint@9.38.0(jiti@2.6.1))
|
||||||
'@nuxt/devtools-kit': 3.0.0(magicast@0.5.0)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))
|
'@nuxt/devtools-kit': 3.0.0(magicast@0.5.0)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
|
||||||
'@nuxt/eslint-config': 1.10.0(@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
|
'@nuxt/eslint-config': 1.10.0(@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.22)(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
|
||||||
'@nuxt/eslint-plugin': 1.10.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
|
'@nuxt/eslint-plugin': 1.10.0(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
|
||||||
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
||||||
@@ -6104,7 +6115,7 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- magicast
|
- magicast
|
||||||
|
|
||||||
'@nuxt/nitro-server@4.2.0(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(ioredis@5.8.2)(magicast@0.5.0)(nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3)':
|
'@nuxt/nitro-server@4.2.0(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(ioredis@5.8.2)(magicast@0.5.0)(nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nuxt/devalue': 2.0.2
|
'@nuxt/devalue': 2.0.2
|
||||||
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
||||||
@@ -6122,7 +6133,7 @@ snapshots:
|
|||||||
klona: 2.0.6
|
klona: 2.0.6
|
||||||
mocked-exports: 0.1.1
|
mocked-exports: 0.1.1
|
||||||
nitropack: 2.12.9(drizzle-orm@0.44.7(postgres@3.4.7))
|
nitropack: 2.12.9(drizzle-orm@0.44.7(postgres@3.4.7))
|
||||||
nuxt: 4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)
|
nuxt: 4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1)
|
||||||
pathe: 2.0.3
|
pathe: 2.0.3
|
||||||
pkg-types: 2.3.0
|
pkg-types: 2.3.0
|
||||||
radix3: 1.1.2
|
radix3: 1.1.2
|
||||||
@@ -6193,12 +6204,12 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- magicast
|
- magicast
|
||||||
|
|
||||||
'@nuxt/vite-builder@4.2.0(@types/node@22.18.13)(eslint@9.38.0(jiti@2.6.1))(magicast@0.5.0)(nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3))(yaml@2.8.1)':
|
'@nuxt/vite-builder@4.2.0(@types/node@22.18.13)(eslint@9.38.0(jiti@2.6.1))(magicast@0.5.0)(nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1))(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3))(yaml@2.8.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
||||||
'@rollup/plugin-replace': 6.0.3(rollup@4.52.5)
|
'@rollup/plugin-replace': 6.0.3(rollup@4.52.5)
|
||||||
'@vitejs/plugin-vue': 6.0.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
'@vitejs/plugin-vue': 6.0.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
||||||
'@vitejs/plugin-vue-jsx': 5.1.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
'@vitejs/plugin-vue-jsx': 5.1.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
||||||
autoprefixer: 10.4.21(postcss@8.5.6)
|
autoprefixer: 10.4.21(postcss@8.5.6)
|
||||||
consola: 3.4.2
|
consola: 3.4.2
|
||||||
cssnano: 7.1.2(postcss@8.5.6)
|
cssnano: 7.1.2(postcss@8.5.6)
|
||||||
@@ -6213,7 +6224,7 @@ snapshots:
|
|||||||
magic-string: 0.30.21
|
magic-string: 0.30.21
|
||||||
mlly: 1.8.0
|
mlly: 1.8.0
|
||||||
mocked-exports: 0.1.1
|
mocked-exports: 0.1.1
|
||||||
nuxt: 4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)
|
nuxt: 4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1)
|
||||||
pathe: 2.0.3
|
pathe: 2.0.3
|
||||||
pkg-types: 2.3.0
|
pkg-types: 2.3.0
|
||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
@@ -6222,9 +6233,9 @@ snapshots:
|
|||||||
std-env: 3.10.0
|
std-env: 3.10.0
|
||||||
ufo: 1.6.1
|
ufo: 1.6.1
|
||||||
unenv: 2.0.0-rc.23
|
unenv: 2.0.0-rc.23
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
vite-node: 3.2.4(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite-node: 3.2.4(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
vite-plugin-checker: 0.11.0(eslint@9.38.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))
|
vite-plugin-checker: 0.11.0(eslint@9.38.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
|
||||||
vue: 3.5.22(typescript@5.9.3)
|
vue: 3.5.22(typescript@5.9.3)
|
||||||
vue-bundle-renderer: 2.2.0
|
vue-bundle-renderer: 2.2.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@@ -6310,7 +6321,7 @@ snapshots:
|
|||||||
- uploadthing
|
- uploadthing
|
||||||
- vue
|
- vue
|
||||||
|
|
||||||
'@nuxtjs/tailwindcss@6.14.0(magicast@0.5.0)(yaml@2.8.1)':
|
'@nuxtjs/tailwindcss@6.14.0(magicast@0.5.0)(tsx@4.20.6)(yaml@2.8.1)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@nuxt/kit': 3.20.0(magicast@0.5.0)
|
'@nuxt/kit': 3.20.0(magicast@0.5.0)
|
||||||
autoprefixer: 10.4.21(postcss@8.5.6)
|
autoprefixer: 10.4.21(postcss@8.5.6)
|
||||||
@@ -6324,8 +6335,8 @@ snapshots:
|
|||||||
pkg-types: 2.3.0
|
pkg-types: 2.3.0
|
||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
postcss-nesting: 13.0.2(postcss@8.5.6)
|
postcss-nesting: 13.0.2(postcss@8.5.6)
|
||||||
tailwind-config-viewer: 2.0.4(tailwindcss@3.4.18(yaml@2.8.1))
|
tailwind-config-viewer: 2.0.4(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1))
|
||||||
tailwindcss: 3.4.18(yaml@2.8.1)
|
tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1)
|
||||||
ufo: 1.6.1
|
ufo: 1.6.1
|
||||||
unctx: 2.4.1
|
unctx: 2.4.1
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
@@ -7016,22 +7027,22 @@ snapshots:
|
|||||||
- rollup
|
- rollup
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))':
|
'@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/core': 7.28.5
|
'@babel/core': 7.28.5
|
||||||
'@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5)
|
'@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5)
|
||||||
'@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5)
|
'@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5)
|
||||||
'@rolldown/pluginutils': 1.0.0-beta.45
|
'@rolldown/pluginutils': 1.0.0-beta.45
|
||||||
'@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5)
|
'@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.5)
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
vue: 3.5.22(typescript@5.9.3)
|
vue: 3.5.22(typescript@5.9.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@vitejs/plugin-vue@6.0.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))':
|
'@vitejs/plugin-vue@6.0.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@rolldown/pluginutils': 1.0.0-beta.29
|
'@rolldown/pluginutils': 1.0.0-beta.29
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
vue: 3.5.22(typescript@5.9.3)
|
vue: 3.5.22(typescript@5.9.3)
|
||||||
|
|
||||||
'@volar/language-core@2.4.23':
|
'@volar/language-core@2.4.23':
|
||||||
@@ -7115,14 +7126,14 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
'@vue/devtools-kit': 7.7.7
|
'@vue/devtools-kit': 7.7.7
|
||||||
|
|
||||||
'@vue/devtools-core@7.7.7(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))':
|
'@vue/devtools-core@7.7.7(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vue/devtools-kit': 7.7.7
|
'@vue/devtools-kit': 7.7.7
|
||||||
'@vue/devtools-shared': 7.7.7
|
'@vue/devtools-shared': 7.7.7
|
||||||
mitt: 3.0.1
|
mitt: 3.0.1
|
||||||
nanoid: 5.1.6
|
nanoid: 5.1.6
|
||||||
pathe: 2.0.3
|
pathe: 2.0.3
|
||||||
vite-hot-client: 2.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))
|
vite-hot-client: 2.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
|
||||||
vue: 3.5.22(typescript@5.9.3)
|
vue: 3.5.22(typescript@5.9.3)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- vite
|
- vite
|
||||||
@@ -9041,16 +9052,16 @@ snapshots:
|
|||||||
|
|
||||||
nuxt-define@1.0.0: {}
|
nuxt-define@1.0.0: {}
|
||||||
|
|
||||||
nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1):
|
nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@dxup/nuxt': 0.2.0(magicast@0.5.0)
|
'@dxup/nuxt': 0.2.0(magicast@0.5.0)
|
||||||
'@nuxt/cli': 3.29.3(magicast@0.5.0)
|
'@nuxt/cli': 3.29.3(magicast@0.5.0)
|
||||||
'@nuxt/devtools': 2.7.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
'@nuxt/devtools': 2.7.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3))
|
||||||
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
'@nuxt/kit': 4.2.0(magicast@0.5.0)
|
||||||
'@nuxt/nitro-server': 4.2.0(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(ioredis@5.8.2)(magicast@0.5.0)(nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3)
|
'@nuxt/nitro-server': 4.2.0(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(ioredis@5.8.2)(magicast@0.5.0)(nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1))(typescript@5.9.3)
|
||||||
'@nuxt/schema': 4.2.0
|
'@nuxt/schema': 4.2.0
|
||||||
'@nuxt/telemetry': 2.6.6(magicast@0.5.0)
|
'@nuxt/telemetry': 2.6.6(magicast@0.5.0)
|
||||||
'@nuxt/vite-builder': 4.2.0(@types/node@22.18.13)(eslint@9.38.0(jiti@2.6.1))(magicast@0.5.0)(nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1))(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3))(yaml@2.8.1)
|
'@nuxt/vite-builder': 4.2.0(@types/node@22.18.13)(eslint@9.38.0(jiti@2.6.1))(magicast@0.5.0)(nuxt@4.2.0(@parcel/watcher@2.5.1)(@types/node@22.18.13)(@vue/compiler-sfc@3.5.22)(db0@0.3.4(drizzle-orm@0.44.7(postgres@3.4.7)))(drizzle-orm@0.44.7(postgres@3.4.7))(eslint@9.38.0(jiti@2.6.1))(ioredis@5.8.2)(magicast@0.5.0)(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(yaml@2.8.1))(optionator@0.9.4)(rollup@4.52.5)(terser@5.44.0)(tsx@4.20.6)(typescript@5.9.3)(vue@3.5.22(typescript@5.9.3))(yaml@2.8.1)
|
||||||
'@unhead/vue': 2.0.19(vue@3.5.22(typescript@5.9.3))
|
'@unhead/vue': 2.0.19(vue@3.5.22(typescript@5.9.3))
|
||||||
'@vue/shared': 3.5.22
|
'@vue/shared': 3.5.22
|
||||||
c12: 3.3.1(magicast@0.5.0)
|
c12: 3.3.1(magicast@0.5.0)
|
||||||
@@ -9468,12 +9479,13 @@ snapshots:
|
|||||||
camelcase-css: 2.0.1
|
camelcase-css: 2.0.1
|
||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
|
|
||||||
postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.1):
|
postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
lilconfig: 3.1.3
|
lilconfig: 3.1.3
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
jiti: 1.21.7
|
jiti: 1.21.7
|
||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
|
tsx: 4.20.6
|
||||||
yaml: 2.8.1
|
yaml: 2.8.1
|
||||||
|
|
||||||
postcss-merge-longhand@7.0.5(postcss@8.5.6):
|
postcss-merge-longhand@7.0.5(postcss@8.5.6):
|
||||||
@@ -10047,7 +10059,7 @@ snapshots:
|
|||||||
|
|
||||||
tagged-tag@1.0.0: {}
|
tagged-tag@1.0.0: {}
|
||||||
|
|
||||||
tailwind-config-viewer@2.0.4(tailwindcss@3.4.18(yaml@2.8.1)):
|
tailwind-config-viewer@2.0.4(tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@koa/router': 12.0.2
|
'@koa/router': 12.0.2
|
||||||
commander: 6.2.1
|
commander: 6.2.1
|
||||||
@@ -10057,13 +10069,13 @@ snapshots:
|
|||||||
open: 7.4.2
|
open: 7.4.2
|
||||||
portfinder: 1.0.38
|
portfinder: 1.0.38
|
||||||
replace-in-file: 6.3.5
|
replace-in-file: 6.3.5
|
||||||
tailwindcss: 3.4.18(yaml@2.8.1)
|
tailwindcss: 3.4.18(tsx@4.20.6)(yaml@2.8.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
tailwind-merge@3.3.1: {}
|
tailwind-merge@3.3.1: {}
|
||||||
|
|
||||||
tailwindcss@3.4.18(yaml@2.8.1):
|
tailwindcss@3.4.18(tsx@4.20.6)(yaml@2.8.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@alloc/quick-lru': 5.2.0
|
'@alloc/quick-lru': 5.2.0
|
||||||
arg: 5.0.2
|
arg: 5.0.2
|
||||||
@@ -10082,7 +10094,7 @@ snapshots:
|
|||||||
postcss: 8.5.6
|
postcss: 8.5.6
|
||||||
postcss-import: 15.1.0(postcss@8.5.6)
|
postcss-import: 15.1.0(postcss@8.5.6)
|
||||||
postcss-js: 4.1.0(postcss@8.5.6)
|
postcss-js: 4.1.0(postcss@8.5.6)
|
||||||
postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.1)
|
postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
postcss-nested: 6.2.0(postcss@8.5.6)
|
postcss-nested: 6.2.0(postcss@8.5.6)
|
||||||
postcss-selector-parser: 6.1.2
|
postcss-selector-parser: 6.1.2
|
||||||
resolve: 1.22.11
|
resolve: 1.22.11
|
||||||
@@ -10167,6 +10179,13 @@ snapshots:
|
|||||||
|
|
||||||
tsscmp@1.0.6: {}
|
tsscmp@1.0.6: {}
|
||||||
|
|
||||||
|
tsx@4.20.6:
|
||||||
|
dependencies:
|
||||||
|
esbuild: 0.25.11
|
||||||
|
get-tsconfig: 4.13.0
|
||||||
|
optionalDependencies:
|
||||||
|
fsevents: 2.3.3
|
||||||
|
|
||||||
type-check@0.4.0:
|
type-check@0.4.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
prelude-ls: 1.2.1
|
prelude-ls: 1.2.1
|
||||||
@@ -10360,23 +10379,23 @@ snapshots:
|
|||||||
type-fest: 4.41.0
|
type-fest: 4.41.0
|
||||||
vue: 3.5.22(typescript@5.9.3)
|
vue: 3.5.22(typescript@5.9.3)
|
||||||
|
|
||||||
vite-dev-rpc@1.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)):
|
vite-dev-rpc@1.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
birpc: 2.6.1
|
birpc: 2.6.1
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
vite-hot-client: 2.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))
|
vite-hot-client: 2.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
|
||||||
|
|
||||||
vite-hot-client@2.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)):
|
vite-hot-client@2.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
|
|
||||||
vite-node@3.2.4(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1):
|
vite-node@3.2.4(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
cac: 6.7.14
|
cac: 6.7.14
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
es-module-lexer: 1.7.0
|
es-module-lexer: 1.7.0
|
||||||
pathe: 2.0.3
|
pathe: 2.0.3
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@types/node'
|
- '@types/node'
|
||||||
- jiti
|
- jiti
|
||||||
@@ -10391,7 +10410,7 @@ snapshots:
|
|||||||
- tsx
|
- tsx
|
||||||
- yaml
|
- yaml
|
||||||
|
|
||||||
vite-plugin-checker@0.11.0(eslint@9.38.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)):
|
vite-plugin-checker@0.11.0(eslint@9.38.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/code-frame': 7.27.1
|
'@babel/code-frame': 7.27.1
|
||||||
chokidar: 4.0.3
|
chokidar: 4.0.3
|
||||||
@@ -10400,14 +10419,14 @@ snapshots:
|
|||||||
picomatch: 4.0.3
|
picomatch: 4.0.3
|
||||||
tiny-invariant: 1.3.3
|
tiny-invariant: 1.3.3
|
||||||
tinyglobby: 0.2.15
|
tinyglobby: 0.2.15
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
vscode-uri: 3.1.0
|
vscode-uri: 3.1.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
eslint: 9.38.0(jiti@2.6.1)
|
eslint: 9.38.0(jiti@2.6.1)
|
||||||
optionator: 0.9.4
|
optionator: 0.9.4
|
||||||
typescript: 5.9.3
|
typescript: 5.9.3
|
||||||
|
|
||||||
vite-plugin-inspect@11.3.3(@nuxt/kit@3.20.0(magicast@0.3.5))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)):
|
vite-plugin-inspect@11.3.3(@nuxt/kit@3.20.0(magicast@0.3.5))(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
|
||||||
dependencies:
|
dependencies:
|
||||||
ansis: 4.2.0
|
ansis: 4.2.0
|
||||||
debug: 4.4.3
|
debug: 4.4.3
|
||||||
@@ -10417,24 +10436,24 @@ snapshots:
|
|||||||
perfect-debounce: 2.0.0
|
perfect-debounce: 2.0.0
|
||||||
sirv: 3.0.2
|
sirv: 3.0.2
|
||||||
unplugin-utils: 0.3.1
|
unplugin-utils: 0.3.1
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
vite-dev-rpc: 1.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))
|
vite-dev-rpc: 1.1.0(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@nuxt/kit': 3.20.0(magicast@0.3.5)
|
'@nuxt/kit': 3.20.0(magicast@0.3.5)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
vite-plugin-vue-tracer@1.0.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)):
|
vite-plugin-vue-tracer@1.0.1(vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vue@3.5.22(typescript@5.9.3)):
|
||||||
dependencies:
|
dependencies:
|
||||||
estree-walker: 3.0.3
|
estree-walker: 3.0.3
|
||||||
exsolve: 1.0.7
|
exsolve: 1.0.7
|
||||||
magic-string: 0.30.21
|
magic-string: 0.30.21
|
||||||
pathe: 2.0.3
|
pathe: 2.0.3
|
||||||
source-map-js: 1.2.1
|
source-map-js: 1.2.1
|
||||||
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)
|
vite: 7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
|
||||||
vue: 3.5.22(typescript@5.9.3)
|
vue: 3.5.22(typescript@5.9.3)
|
||||||
|
|
||||||
vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1):
|
vite@7.1.12(@types/node@22.18.13)(jiti@2.6.1)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1):
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild: 0.25.11
|
esbuild: 0.25.11
|
||||||
fdir: 6.5.0(picomatch@4.0.3)
|
fdir: 6.5.0(picomatch@4.0.3)
|
||||||
@@ -10447,6 +10466,7 @@ snapshots:
|
|||||||
fsevents: 2.3.3
|
fsevents: 2.3.3
|
||||||
jiti: 2.6.1
|
jiti: 2.6.1
|
||||||
terser: 5.44.0
|
terser: 5.44.0
|
||||||
|
tsx: 4.20.6
|
||||||
yaml: 2.8.1
|
yaml: 2.8.1
|
||||||
|
|
||||||
vscode-uri@3.1.0: {}
|
vscode-uri@3.1.0: {}
|
||||||
|
|||||||
50
server/api/products/[id].get.ts
Normal file
50
server/api/products/[id].get.ts
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/**
|
||||||
|
* GET /api/products/[id]
|
||||||
|
*
|
||||||
|
* Returns a single product by UUID.
|
||||||
|
* Returns 404 if product is not found or is inactive.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { z } from 'zod'
|
||||||
|
import { and, eq } from 'drizzle-orm'
|
||||||
|
import { products } from '../../database/schema'
|
||||||
|
|
||||||
|
// UUID validation schema
|
||||||
|
const paramsSchema = z.object({
|
||||||
|
id: z.string().uuid('Invalid product ID format'),
|
||||||
|
})
|
||||||
|
|
||||||
|
export default defineEventHandler(async (event) => {
|
||||||
|
const db = useDatabase()
|
||||||
|
|
||||||
|
// Validate and extract product ID from route params
|
||||||
|
const params = await getValidatedRouterParams(event, paramsSchema.parse)
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Fetch product by ID (must be active)
|
||||||
|
const product = await db.query.products.findFirst({
|
||||||
|
where: and(eq(products.id, params.id), eq(products.active, true)),
|
||||||
|
})
|
||||||
|
|
||||||
|
// Return 404 if product not found or inactive
|
||||||
|
if (!product) {
|
||||||
|
throw createError({
|
||||||
|
statusCode: 404,
|
||||||
|
statusMessage: 'Product not found',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return product
|
||||||
|
} catch (error) {
|
||||||
|
// Re-throw createError errors as-is
|
||||||
|
if (error && typeof error === 'object' && 'statusCode' in error) {
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
|
||||||
|
console.error('Error fetching product:', error)
|
||||||
|
throw createError({
|
||||||
|
statusCode: 500,
|
||||||
|
statusMessage: 'Failed to fetch product',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
29
server/api/products/index.get.ts
Normal file
29
server/api/products/index.get.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/**
|
||||||
|
* GET /api/products
|
||||||
|
*
|
||||||
|
* Returns a list of all active products available for purchase.
|
||||||
|
* Products are sorted by category and name.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { eq } from 'drizzle-orm'
|
||||||
|
import { products } from '../../database/schema'
|
||||||
|
|
||||||
|
export default defineEventHandler(async (event) => {
|
||||||
|
const db = useDatabase()
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Fetch all active products
|
||||||
|
const allProducts = await db.query.products.findMany({
|
||||||
|
where: eq(products.active, true),
|
||||||
|
orderBy: (products, { asc }) => [asc(products.category), asc(products.name)],
|
||||||
|
})
|
||||||
|
|
||||||
|
return allProducts
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching products:', error)
|
||||||
|
throw createError({
|
||||||
|
statusCode: 500,
|
||||||
|
statusMessage: 'Failed to fetch products',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
103
server/database/seed.ts
Normal file
103
server/database/seed.ts
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
/**
|
||||||
|
* Database Seed Script
|
||||||
|
*
|
||||||
|
* Seeds the database with initial mock product data for development and testing.
|
||||||
|
* Run with: pnpm db:seed
|
||||||
|
*/
|
||||||
|
|
||||||
|
import 'dotenv/config'
|
||||||
|
import { drizzle } from 'drizzle-orm/postgres-js'
|
||||||
|
import postgres from 'postgres'
|
||||||
|
import { products } from './schema'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sample annual pass products for experimenta
|
||||||
|
*/
|
||||||
|
const mockProducts = [
|
||||||
|
{
|
||||||
|
navProductId: 'MSPACE-JK-2025',
|
||||||
|
name: 'Makerspace Jahreskarte',
|
||||||
|
description:
|
||||||
|
'Unbegrenzter Zugang zum Makerspace für 365 Tage. Nutze modernste Werkzeuge, 3D-Drucker, Lasercutter und vieles mehr. Perfekt für Maker, Tüftler und kreative Köpfe.',
|
||||||
|
price: '120.00',
|
||||||
|
stockQuantity: 100,
|
||||||
|
category: 'makerspace-annual-pass',
|
||||||
|
active: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
navProductId: 'EXPERIMENTA-JK-2025',
|
||||||
|
name: 'experimenta Jahreskarte',
|
||||||
|
description:
|
||||||
|
'Erlebe die Ausstellungswelt der experimenta ein ganzes Jahr lang. Mit freiem Eintritt zu allen Ausstellungen, Science Dome Shows und Sonderausstellungen.',
|
||||||
|
price: '85.00',
|
||||||
|
stockQuantity: 200,
|
||||||
|
category: 'annual-pass',
|
||||||
|
active: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
navProductId: 'PAEDAGOGEN-JK-2025',
|
||||||
|
name: 'Pädagogen Jahreskarte',
|
||||||
|
description:
|
||||||
|
'Speziell für Lehrkräfte und Pädagogen. Mit exklusiven Fortbildungsangeboten, didaktischen Materialien und freiem Zugang zu allen Ausstellungen.',
|
||||||
|
price: '60.00',
|
||||||
|
stockQuantity: 50,
|
||||||
|
category: 'educator-annual-pass',
|
||||||
|
active: true,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
async function seed() {
|
||||||
|
// Get database connection from environment
|
||||||
|
const connectionString = process.env.DATABASE_URL
|
||||||
|
if (!connectionString) {
|
||||||
|
throw new Error('DATABASE_URL environment variable is not set')
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('🌱 Starting database seed...')
|
||||||
|
|
||||||
|
// Create database connection
|
||||||
|
const client = postgres(connectionString)
|
||||||
|
const db = drizzle(client)
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Insert products
|
||||||
|
console.log(`📦 Inserting ${mockProducts.length} products...`)
|
||||||
|
const insertedProducts = await db
|
||||||
|
.insert(products)
|
||||||
|
.values(mockProducts)
|
||||||
|
.onConflictDoUpdate({
|
||||||
|
target: products.navProductId,
|
||||||
|
set: {
|
||||||
|
name: mockProducts[0].name, // Drizzle requires a set object, using sql.excluded in real impl
|
||||||
|
description: mockProducts[0].description,
|
||||||
|
price: mockProducts[0].price,
|
||||||
|
stockQuantity: mockProducts[0].stockQuantity,
|
||||||
|
updatedAt: new Date(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.returning()
|
||||||
|
|
||||||
|
console.log(`✅ Successfully inserted/updated ${insertedProducts.length} products:`)
|
||||||
|
insertedProducts.forEach((product) => {
|
||||||
|
console.log(` - ${product.name} (${product.navProductId}) - €${product.price}`)
|
||||||
|
})
|
||||||
|
|
||||||
|
console.log('\n✨ Database seed completed successfully!')
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ Error seeding database:', error)
|
||||||
|
throw error
|
||||||
|
} finally {
|
||||||
|
// Close database connection
|
||||||
|
await client.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run seed function
|
||||||
|
seed()
|
||||||
|
.then(() => {
|
||||||
|
process.exit(0)
|
||||||
|
})
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Fatal error:', error)
|
||||||
|
process.exit(1)
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user