feat(cli): replace hardcoded scaffolding with giget-based template downloads

- Rewrite create-project.ts to use giget for downloading templates from
  the repo instead of shelling out to nuxi/create-vite or inline file generation
- Add giget dependency, support SHADCN_TEMPLATE_DIR env var for local dev
- Update template choices: Nuxt 4, Vite, Astro, Laravel (drop vite-router)
- Update Nuxt template: use @tailwindcss/vite + shadcn-nuxt, Nuxt 4 app/ structure
- Update init.ts validation messages and help text
- Update tests for new giget-based flow
- Remove stray console.log from fetcher.ts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
zernonia
2026-04-07 01:31:56 +08:00
parent e5770a9bbe
commit bc8d6a2beb
15 changed files with 556 additions and 527 deletions
+1
View File
@@ -88,6 +88,7 @@
"fs-extra": "^11.3.2",
"fuzzysort": "^3.1.0",
"get-tsconfig": "^4.13.0",
"giget": "catalog:",
"magic-string": "^0.30.21",
"nypm": "^0.6.2",
"ofetch": "^1.5.1",
+168 -139
View File
@@ -128,7 +128,7 @@ export const initOptionsSchema = z.object({
return true
},
{
message: 'Invalid template. Please use \'nuxt\', \'vite\', or \'vite-router\'.',
message: 'Invalid template. Please use \'nuxt\', \'vite\', \'astro\', or \'laravel\'.',
},
),
base: z
@@ -217,7 +217,7 @@ export const init = new Command()
)
.option(
'-t, --template <template>',
'the template to use. (nuxt, vite, vite-router)',
'the template to use. (nuxt, vite, astro, laravel)',
)
.option(
'--base <base>',
@@ -281,6 +281,7 @@ export const init = new Command()
opts.iconLibrary = opts.iconLibrary ?? preset.iconLibrary
opts.font = opts.font ?? preset.font
opts.baseColor = opts.baseColor ?? preset.baseColor
opts.yes = true
}
// Apply defaults when --defaults flag is set.
@@ -422,7 +423,7 @@ export async function runInit(
let config = projectConfig
? await promptForMinimalConfig(projectConfig, options)
: await promptForConfig(await getConfig(options.cwd))
: await promptForConfig(await getConfig(options.cwd), options)
if (!options.yes) {
const { proceed } = await prompts({
@@ -516,151 +517,179 @@ export async function runInit(
return fullConfig
}
async function promptForConfig(defaultConfig: Config | null = null) {
const [styles, baseColors] = await Promise.all([
getRegistryStyles(),
getRegistryBaseColors(),
])
async function promptForConfig(defaultConfig: Config | null = null, opts?: z.infer<typeof initOptionsSchema>) {
let base = opts?.base ?? 'reka'
let style = opts?.style ?? 'vega'
let font = opts?.font ?? 'inter'
let iconLibrary = opts?.iconLibrary ?? 'lucide'
let baseColor = opts?.baseColor ?? 'neutral'
let typescript = defaultConfig?.typescript ?? true
let tailwindCss = defaultConfig?.tailwind.css ?? DEFAULT_TAILWIND_CSS
let tailwindCssVariables = opts?.cssVariables ?? defaultConfig?.tailwind.cssVariables ?? true
let tailwindPrefix = defaultConfig?.tailwind.prefix ?? ''
let tailwindConfig = defaultConfig?.tailwind.config ?? DEFAULT_TAILWIND_CONFIG
let componentsAlias = defaultConfig?.aliases.components ?? DEFAULT_COMPONENTS
let utilsAlias = defaultConfig?.aliases.utils ?? DEFAULT_UTILS
logger.info('')
const options = await prompts([
{
type: 'toggle',
name: 'typescript',
message: `Would you like to use ${highlighter.info(
'TypeScript',
)} (recommended)?`,
initial: defaultConfig?.typescript ?? true,
active: 'yes',
inactive: 'no',
},
{
type: 'select',
name: 'base',
message: `Which ${highlighter.info('component library')} would you like to use?`,
choices: BASES.map(base => ({
title: base.label,
value: base.name,
description: base.description,
})),
initial: 0,
},
{
type: 'select',
name: 'style',
message: `Which ${highlighter.info('visual style')} would you like to use?`,
choices: [
...STYLES.map(style => ({
title: style.label,
value: style.name,
description: style.description,
if (opts?.preset === undefined && !opts?.defaults) {
const [styles, baseColors] = await Promise.all([
getRegistryStyles(),
getRegistryBaseColors(),
])
logger.info('')
const options = await prompts([
{
type: 'toggle',
name: 'typescript',
message: `Would you like to use ${highlighter.info(
'TypeScript',
)} (recommended)?`,
initial: typescript,
active: 'yes',
inactive: 'no',
},
{
type: 'select',
name: 'base',
message: `Which ${highlighter.info('component library')} would you like to use?`,
choices: BASES.map(b => ({
title: b.label,
value: b.name,
description: b.description,
})),
...styles.filter(s => !STYLES.find(st => st.name === s.name)).map(style => ({
title: style.label,
value: style.name,
initial: 0,
},
{
type: 'select',
name: 'style',
message: `Which ${highlighter.info('visual style')} would you like to use?`,
choices: [
...STYLES.map(s => ({
title: s.label,
value: s.name,
description: s.description,
})),
...styles.filter(s => !STYLES.find(st => st.name === s.name)).map(s => ({
title: s.label,
value: s.name,
})),
],
initial: 0,
},
{
type: 'select',
name: 'iconLibrary',
message: `Which ${highlighter.info('icon library')} would you like to use?`,
choices: ICON_LIBRARIES.map(lib => ({
title: lib.label,
value: lib.name,
})),
],
initial: 0,
},
{
type: 'select',
name: 'iconLibrary',
message: `Which ${highlighter.info('icon library')} would you like to use?`,
choices: ICON_LIBRARIES.map(lib => ({
title: lib.label,
value: lib.name,
})),
initial: 0,
},
{
type: 'select',
name: 'font',
message: `Which ${highlighter.info('font')} would you like to use?`,
choices: FONTS.map(font => ({
title: font.label,
value: font.name,
})),
initial: 0,
},
{
type: 'select',
name: 'tailwindBaseColor',
message: `Which color would you like to use as the ${highlighter.info(
'base color',
)}?`,
choices: baseColors.map(color => ({
title: color.label,
value: color.name,
})),
},
{
type: 'text',
name: 'tailwindCss',
message: `Where is your ${highlighter.info('global CSS')} file?`,
initial: defaultConfig?.tailwind.css ?? DEFAULT_TAILWIND_CSS,
},
{
type: 'toggle',
name: 'tailwindCssVariables',
message: `Would you like to use ${highlighter.info(
'CSS variables',
)} for theming?`,
initial: defaultConfig?.tailwind.cssVariables ?? true,
active: 'yes',
inactive: 'no',
},
{
type: 'text',
name: 'tailwindPrefix',
message: `Are you using a custom ${highlighter.info(
'tailwind prefix eg. tw-',
)}? (Leave blank if not)`,
initial: '',
},
{
type: 'text',
name: 'tailwindConfig',
message: `Where is your ${highlighter.info(
'tailwind.config.js',
)} located?`,
initial: defaultConfig?.tailwind.config ?? DEFAULT_TAILWIND_CONFIG,
},
{
type: 'text',
name: 'components',
message: `Configure the import alias for ${highlighter.info(
'components',
)}:`,
initial: defaultConfig?.aliases.components ?? DEFAULT_COMPONENTS,
},
{
type: 'text',
name: 'utils',
message: `Configure the import alias for ${highlighter.info('utils')}:`,
initial: defaultConfig?.aliases.utils ?? DEFAULT_UTILS,
},
])
initial: 0,
},
{
type: 'select',
name: 'font',
message: `Which ${highlighter.info('font')} would you like to use?`,
choices: FONTS.map(f => ({
title: f.label,
value: f.name,
})),
initial: 0,
},
{
type: 'select',
name: 'tailwindBaseColor',
message: `Which color would you like to use as the ${highlighter.info(
'base color',
)}?`,
choices: baseColors.map(color => ({
title: color.label,
value: color.name,
})),
},
{
type: 'text',
name: 'tailwindCss',
message: `Where is your ${highlighter.info('global CSS')} file?`,
initial: tailwindCss,
},
{
type: 'toggle',
name: 'tailwindCssVariables',
message: `Would you like to use ${highlighter.info(
'CSS variables',
)} for theming?`,
initial: tailwindCssVariables,
active: 'yes',
inactive: 'no',
},
{
type: 'text',
name: 'tailwindPrefix',
message: `Are you using a custom ${highlighter.info(
'tailwind prefix eg. tw-',
)}? (Leave blank if not)`,
initial: '',
},
{
type: 'text',
name: 'tailwindConfig',
message: `Where is your ${highlighter.info(
'tailwind.config.js',
)} located?`,
initial: tailwindConfig,
},
{
type: 'text',
name: 'components',
message: `Configure the import alias for ${highlighter.info(
'components',
)}:`,
initial: componentsAlias,
},
{
type: 'text',
name: 'utils',
message: `Configure the import alias for ${highlighter.info('utils')}:`,
initial: utilsAlias,
},
])
base = options.base ?? base
style = options.style ?? style
font = options.font ?? font
iconLibrary = options.iconLibrary ?? iconLibrary
baseColor = options.tailwindBaseColor ?? baseColor
typescript = options.typescript ?? typescript
tailwindCss = options.tailwindCss ?? tailwindCss
tailwindCssVariables = options.tailwindCssVariables ?? tailwindCssVariables
tailwindPrefix = options.tailwindPrefix ?? tailwindPrefix
tailwindConfig = options.tailwindConfig ?? tailwindConfig
componentsAlias = options.components ?? componentsAlias
utilsAlias = options.utils ?? utilsAlias
}
return rawConfigSchema.parse({
$schema: 'https://shadcn-vue.com/schema.json',
base: options.base,
style: options.style,
font: options.font,
iconLibrary: options.iconLibrary,
base,
style,
font,
iconLibrary,
tailwind: {
config: options.tailwindConfig,
css: options.tailwindCss,
baseColor: options.tailwindBaseColor,
cssVariables: options.tailwindCssVariables,
prefix: options.tailwindPrefix,
config: tailwindConfig,
css: tailwindCss,
baseColor,
cssVariables: tailwindCssVariables,
prefix: tailwindPrefix,
},
typescript: options.typescript,
typescript,
aliases: {
utils: options.utils,
components: options.components,
utils: utilsAlias,
components: componentsAlias,
// TODO: fix this.
lib: options.components.replace(/\/components$/, '/lib'),
composables: options.components.replace(/\/components$/, '/composables'),
lib: componentsAlias.replace(/\/components$/, '/lib'),
composables: componentsAlias.replace(/\/components$/, '/composables'),
},
})
}
@@ -676,7 +705,7 @@ async function promptForMinimalConfig(
let baseColor = opts.baseColor
let cssVariables = defaultConfig.tailwind.cssVariables
if (!opts.defaults) {
if (opts.preset === undefined && !opts.defaults) {
const [styles, baseColors, tailwindVersion] = await Promise.all([
getRegistryStyles(),
getRegistryBaseColors(),
+1 -1
View File
@@ -489,7 +489,7 @@ async function resolveRegistryDependencies(
)
const style = config.resolvedPaths?.cwd
? await getTargetStyleFromConfig(config.resolvedPaths.cwd, config.style)
? resolveRegistryStyle(await getTargetStyleFromConfig(config.resolvedPaths.cwd, config.style))
: resolveRegistryStyle(config.style)
const urls = registryNames.map(name =>
+49 -311
View File
@@ -1,6 +1,7 @@
import type { z } from 'zod'
import type { initOptionsSchema } from '@/src/commands/init'
import fs from 'fs-extra'
import { downloadTemplate } from 'giget'
import { detectPackageManager } from 'nypm'
import path from 'pathe'
import prompts from 'prompts'
@@ -11,13 +12,16 @@ import { logger } from '@/src/utils/logger'
import { spinner } from '@/src/utils/spinner'
export const TEMPLATES = {
'nuxt': 'nuxt',
'vite': 'vite',
'vite-router': 'vite-router',
nuxt: 'nuxt',
vite: 'vite',
astro: 'astro',
laravel: 'laravel',
} as const
export type TemplateType = keyof typeof TEMPLATES
const REPO = 'github:unovue/shadcn-vue'
export async function createProject(
options: Pick<
z.infer<typeof initOptionsSchema>,
@@ -39,9 +43,10 @@ export async function createProject(
options.cwd,
)} does not contain a package.json file.\n Would you like to start a new project?`,
choices: [
{ title: 'Nuxt', value: 'nuxt' },
{ title: 'Nuxt 4', value: 'nuxt' },
{ title: 'Vite', value: 'vite' },
{ title: 'Vite + Vue Router', value: 'vite-router' },
{ title: 'Astro', value: 'astro' },
{ title: 'Laravel', value: 'laravel' },
],
initial: 0,
},
@@ -92,25 +97,48 @@ export async function createProject(
process.exit(1)
}
if (template === TEMPLATES.nuxt) {
await createNuxtProject(projectPath, {
cwd: options.cwd,
packageManager: packageManager?.name || 'npm',
})
}
const createSpinner = spinner(
`Creating a new ${template} project. This may take a few minutes.`,
).start()
if (template === TEMPLATES.vite) {
await createViteProject(projectPath, {
cwd: options.cwd,
packageManager: packageManager?.name || 'npm',
})
}
try {
// Download template
const templateDir = process.env.SHADCN_TEMPLATE_DIR
if (templateDir) {
await fs.copy(path.join(templateDir, template), projectPath)
}
else {
await downloadTemplate(`${REPO}/templates/${template}`, {
dir: projectPath,
})
}
if (template === TEMPLATES['vite-router']) {
await createViteRouterProject(projectPath, {
cwd: options.cwd,
packageManager: packageManager?.name || 'npm',
// Update package.json name
const pkgPath = path.join(projectPath, 'package.json')
const pkg = await fs.readJson(pkgPath)
pkg.name = projectName
await fs.writeJson(pkgPath, pkg, { spaces: 2 })
// Initialize git repository
await x('git', ['init'], {
nodeOptions: {
cwd: projectPath,
},
})
// Install dependencies
await x(packageManager?.name || 'npm', ['install'], {
throwOnError: true,
nodeOptions: {
cwd: projectPath,
},
})
createSpinner?.succeed(`Created a new ${template} project.`)
}
catch (error) {
createSpinner?.fail(`Something went wrong creating a new ${template} project.`)
handleError(error)
}
return {
@@ -119,293 +147,3 @@ export async function createProject(
template,
}
}
async function createNuxtProject(
projectPath: string,
options: {
cwd: string
packageManager: string
},
) {
const createSpinner = spinner(
`Creating a new Nuxt project. This may take a few minutes.`,
).start()
try {
// Use nuxi to create a new Nuxt project
const args = [
'nuxi@latest',
'init',
projectPath,
'--packageManager',
options.packageManager,
'--no-install',
]
await x('npx', args, {
nodeOptions: {
cwd: options.cwd,
},
})
// Install dependencies
await x(options.packageManager, ['install'], {
nodeOptions: {
cwd: projectPath,
},
})
createSpinner?.succeed('Created a new Nuxt project.')
}
catch (error) {
createSpinner?.fail('Something went wrong creating a new Nuxt project.')
handleError(error)
}
}
async function createViteProject(
projectPath: string,
options: {
cwd: string
packageManager: string
},
) {
const createSpinner = spinner(
`Creating a new Vite + Vue project. This may take a few minutes.`,
).start()
try {
// Use create-vite to create a new Vue project
const projectName = path.basename(projectPath)
const args = [
'create-vite@latest',
projectName,
'--template',
'vue-ts',
]
await x('npx', args, {
nodeOptions: {
cwd: options.cwd,
},
})
// Install dependencies
await x(options.packageManager, ['install'], {
nodeOptions: {
cwd: projectPath,
},
})
createSpinner?.succeed('Created a new Vite + Vue project.')
}
catch (error) {
createSpinner?.fail('Something went wrong creating a new Vite + Vue project.')
handleError(error)
}
}
async function createViteRouterProject(
projectPath: string,
options: {
cwd: string
packageManager: string
},
) {
const createSpinner = spinner(
`Creating a new Vite + Vue Router project. This may take a few minutes.`,
).start()
try {
const projectName = path.basename(projectPath)
// Create project directory
await fs.ensureDir(projectPath)
// Initialize package.json
const packageJson = {
name: projectName,
private: true,
version: '0.0.0',
type: 'module',
scripts: {
dev: 'vite',
build: 'vue-tsc -b && vite build',
preview: 'vite preview',
},
dependencies: {
'vue': '^3.5.13',
'vue-router': '^4.5.0',
},
devDependencies: {
'@types/node': '^22.10.0',
'@vitejs/plugin-vue': '^5.2.1',
'typescript': '~5.7.2',
'vite': '^6.0.0',
'vue-tsc': '^2.2.0',
},
}
await fs.writeJson(path.join(projectPath, 'package.json'), packageJson, { spaces: 2 })
// Create vite.config.ts
const viteConfig = `import { fileURLToPath, URL } from 'node:url'
import vue from '@vitejs/plugin-vue'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url)),
},
},
})
`
await fs.writeFile(path.join(projectPath, 'vite.config.ts'), viteConfig)
// Create tsconfig.json
const tsConfig = {
compilerOptions: {
target: 'ES2022',
useDefineForClassFields: true,
module: 'ESNext',
lib: ['ES2022', 'DOM', 'DOM.Iterable'],
skipLibCheck: true,
moduleResolution: 'bundler',
allowImportingTsExtensions: true,
resolveJsonModule: true,
isolatedModules: true,
noEmit: true,
jsx: 'preserve',
strict: true,
noUnusedLocals: true,
noUnusedParameters: true,
noFallthroughCasesInSwitch: true,
paths: {
'@/*': ['./src/*'],
},
},
include: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.vue'],
references: [{ path: './tsconfig.node.json' }],
}
await fs.writeJson(path.join(projectPath, 'tsconfig.json'), tsConfig, { spaces: 2 })
// Create tsconfig.node.json
const tsConfigNode = {
compilerOptions: {
target: 'ES2022',
lib: ['ES2023'],
module: 'ESNext',
skipLibCheck: true,
moduleResolution: 'bundler',
allowImportingTsExtensions: true,
resolveJsonModule: true,
isolatedModules: true,
noEmit: true,
strict: true,
noUnusedLocals: true,
noUnusedParameters: true,
noFallthroughCasesInSwitch: true,
},
include: ['vite.config.ts'],
}
await fs.writeJson(path.join(projectPath, 'tsconfig.node.json'), tsConfigNode, { spaces: 2 })
// Create directory structure
await fs.ensureDir(path.join(projectPath, 'src'))
await fs.ensureDir(path.join(projectPath, 'src/components'))
await fs.ensureDir(path.join(projectPath, 'src/views'))
await fs.ensureDir(path.join(projectPath, 'src/router'))
// Create index.html
const indexHtml = `<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>${projectName}</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
`
await fs.writeFile(path.join(projectPath, 'index.html'), indexHtml)
// Create main.ts
const mainTs = `import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import './assets/index.css'
const app = createApp(App)
app.use(router)
app.mount('#app')
`
await fs.writeFile(path.join(projectPath, 'src/main.ts'), mainTs)
// Create App.vue
const appVue = `<script setup lang="ts">
import { RouterView } from 'vue-router'
</script>
<template>
<RouterView />
</template>
`
await fs.writeFile(path.join(projectPath, 'src/App.vue'), appVue)
// Create router/index.ts
const routerTs = `import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'home',
component: HomeView,
},
],
})
export default router
`
await fs.writeFile(path.join(projectPath, 'src/router/index.ts'), routerTs)
// Create HomeView.vue
const homeView = `<script setup lang="ts">
</script>
<template>
<main class="min-h-screen flex items-center justify-center">
<h1 class="text-4xl font-bold">Welcome to Vue + Vite</h1>
</main>
</template>
`
await fs.writeFile(path.join(projectPath, 'src/views/HomeView.vue'), homeView)
// Create assets directory with empty CSS file
await fs.ensureDir(path.join(projectPath, 'src/assets'))
await fs.writeFile(path.join(projectPath, 'src/assets/index.css'), '')
// Install dependencies
await x(options.packageManager, ['install'], {
nodeOptions: {
cwd: projectPath,
},
})
createSpinner?.succeed('Created a new Vite + Vue Router project.')
}
catch (error) {
createSpinner?.fail('Something went wrong creating a new Vite + Vue Router project.')
handleError(error)
}
}
+2 -2
View File
@@ -342,8 +342,8 @@ describe('createOptionsSchema', () => {
expect(result.name).toBe('my-project')
})
it('accepts all three templates', () => {
for (const template of ['nuxt', 'vite', 'vite-router']) {
it('accepts all four templates', () => {
for (const template of ['nuxt', 'vite', 'astro', 'laravel']) {
const result = createOptionsSchema.parse({ ...base, template })
expect(result.template).toBe(template)
}
+136 -8
View File
@@ -1,5 +1,6 @@
import type { MockInstance } from 'vitest'
import fs from 'fs-extra'
import { downloadTemplate } from 'giget'
import prompts from 'prompts'
import { x } from 'tinyexec'
import {
@@ -16,6 +17,7 @@ import { spinner } from '../../src/utils/spinner'
// Mock dependencies
vi.mock('fs-extra')
vi.mock('giget')
vi.mock('tinyexec')
vi.mock('prompts')
vi.mock('nypm', () => ({
@@ -39,8 +41,12 @@ describe('createProject', () => {
// Reset all fs mocks
vi.mocked(fs.access).mockResolvedValue(undefined)
vi.mocked(fs.existsSync).mockReturnValue(false)
vi.mocked(fs.ensureDir).mockResolvedValue(undefined)
vi.mocked(fs.writeFile).mockResolvedValue(undefined)
vi.mocked(fs.copy).mockResolvedValue(undefined)
vi.mocked(fs.readJson).mockResolvedValue({ name: 'my-vue-app' })
vi.mocked(fs.writeJson).mockResolvedValue(undefined)
// Mock giget
vi.mocked(downloadTemplate).mockResolvedValue({} as any)
// Mock x (tinyexec) to resolve immediately without actual execution
vi.mocked(x).mockResolvedValue({ stdout: '', stderr: '' } as any)
@@ -61,9 +67,10 @@ describe('createProject', () => {
afterEach(() => {
vi.resetAllMocks()
mockExit?.mockRestore()
delete process.env.SHADCN_TEMPLATE_DIR
})
it('should create a Nuxt project with default options', async () => {
it('should download template via giget for nuxt', async () => {
vi.mocked(prompts).mockResolvedValue({ type: 'nuxt', name: 'my-app' })
const result = await createProject({
@@ -80,14 +87,13 @@ describe('createProject', () => {
template: TEMPLATES.nuxt,
})
expect(x).toHaveBeenCalledWith(
'npx',
expect.arrayContaining(['nuxi@latest', 'init', '/test/my-app']),
expect.any(Object),
expect(downloadTemplate).toHaveBeenCalledWith(
'github:unovue/shadcn-vue/templates/nuxt',
{ dir: '/test/my-app' },
)
})
it('should create a Vite project when selected', async () => {
it('should download template via giget for vite', async () => {
vi.mocked(prompts).mockResolvedValue({ type: 'vite', name: 'my-vite-app' })
const result = await createProject({
@@ -103,6 +109,128 @@ describe('createProject', () => {
projectName: 'my-vite-app',
template: TEMPLATES.vite,
})
expect(downloadTemplate).toHaveBeenCalledWith(
'github:unovue/shadcn-vue/templates/vite',
{ dir: '/test/my-vite-app' },
)
})
it('should download template via giget for astro', async () => {
vi.mocked(prompts).mockResolvedValue({ type: 'astro', name: 'my-astro-app' })
const result = await createProject({
cwd: '/test',
force: false,
name: undefined,
components: undefined,
template: undefined,
})
expect(result).toEqual({
projectPath: '/test/my-astro-app',
projectName: 'my-astro-app',
template: TEMPLATES.astro,
})
expect(downloadTemplate).toHaveBeenCalledWith(
'github:unovue/shadcn-vue/templates/astro',
{ dir: '/test/my-astro-app' },
)
})
it('should download template via giget for laravel', async () => {
vi.mocked(prompts).mockResolvedValue({ type: 'laravel', name: 'my-laravel-app' })
const result = await createProject({
cwd: '/test',
force: false,
name: undefined,
components: undefined,
template: undefined,
})
expect(result).toEqual({
projectPath: '/test/my-laravel-app',
projectName: 'my-laravel-app',
template: TEMPLATES.laravel,
})
expect(downloadTemplate).toHaveBeenCalledWith(
'github:unovue/shadcn-vue/templates/laravel',
{ dir: '/test/my-laravel-app' },
)
})
it('should use local template dir when SHADCN_TEMPLATE_DIR is set', async () => {
process.env.SHADCN_TEMPLATE_DIR = '/local/templates'
vi.mocked(prompts).mockResolvedValue({ type: 'vite', name: 'my-app' })
await createProject({
cwd: '/test',
force: false,
name: undefined,
components: undefined,
template: undefined,
})
expect(fs.copy).toHaveBeenCalledWith('/local/templates/vite', '/test/my-app')
expect(downloadTemplate).not.toHaveBeenCalled()
})
it('should update package.json name after download', async () => {
vi.mocked(prompts).mockResolvedValue({ type: 'nuxt', name: 'custom-name' })
vi.mocked(fs.readJson).mockResolvedValue({ name: 'my-vue-app', private: true })
await createProject({
cwd: '/test',
force: false,
name: undefined,
components: undefined,
template: undefined,
})
expect(fs.writeJson).toHaveBeenCalledWith(
'/test/custom-name/package.json',
{ name: 'custom-name', private: true },
{ spaces: 2 },
)
})
it('should run git init after download', async () => {
vi.mocked(prompts).mockResolvedValue({ type: 'nuxt', name: 'my-app' })
await createProject({
cwd: '/test',
force: false,
name: undefined,
components: undefined,
template: undefined,
})
expect(x).toHaveBeenCalledWith(
'git',
['init'],
{ nodeOptions: { cwd: '/test/my-app' } },
)
})
it('should install dependencies after download', async () => {
vi.mocked(prompts).mockResolvedValue({ type: 'nuxt', name: 'my-app' })
await createProject({
cwd: '/test',
force: false,
name: undefined,
components: undefined,
template: undefined,
})
expect(x).toHaveBeenCalledWith(
'npm',
['install'],
{ throwOnError: true, nodeOptions: { cwd: '/test/my-app' } },
)
})
it('should throw error if project path already exists', async () => {
+169 -61
View File
@@ -39,6 +39,9 @@ catalogs:
date-fns:
specifier: ^4.1.0
version: 4.1.0
giget:
specifier: ^3.2.0
version: 3.2.0
open:
specifier: ^10.2.0
version: 10.2.0
@@ -156,13 +159,13 @@ importers:
version: 3.10.0
'@nuxt/content':
specifier: ^3.9.0
version: 3.9.0(magicast@0.5.1)
version: 3.9.0(magicast@0.3.5)
'@nuxt/fonts':
specifier: 0.12.1
version: 0.12.1(db0@0.3.4)(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))
version: 0.12.1(db0@0.3.4)(ioredis@5.8.2)(magicast@0.3.5)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))
'@nuxt/image':
specifier: 2.0.0
version: 2.0.0(db0@0.3.4)(ioredis@5.8.2)(magicast@0.5.1)
version: 2.0.0(db0@0.3.4)(ioredis@5.8.2)(magicast@0.3.5)
'@phosphor-icons/vue':
specifier: ^2.2.1
version: 2.2.1(vue@3.5.25(typescript@5.9.3))
@@ -225,10 +228,10 @@ importers:
version: 0.555.0(vue@3.5.25(typescript@5.9.3))
nuxt:
specifier: ^4.2.1
version: 4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)
version: 4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)
nuxt-og-image:
specifier: 5.1.12
version: 5.1.12(@unhead/vue@2.0.19(vue@3.5.25(typescript@5.9.3)))(h3@1.15.4)(magicast@0.5.1)(unstorage@1.17.3(db0@0.3.4)(ioredis@5.8.2))(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))
version: 5.1.12(@unhead/vue@2.0.19(vue@3.5.25(typescript@5.9.3)))(h3@1.15.4)(magicast@0.3.5)(unstorage@1.17.3(db0@0.3.4)(ioredis@5.8.2))(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))
qrcode:
specifier: 'catalog:'
version: 1.5.4
@@ -264,20 +267,20 @@ importers:
version: 0.3.2(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3))
vue-sonner:
specifier: 'catalog:'
version: 2.0.9(@nuxt/kit@4.2.1(magicast@0.5.1))(@nuxt/schema@4.2.1)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))
version: 2.0.9(@nuxt/kit@4.2.1(magicast@0.3.5))(@nuxt/schema@4.2.1)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))
zod:
specifier: 'catalog:'
version: 3.25.76
devDependencies:
'@nuxtjs/color-mode':
specifier: ^4.0.0
version: 4.0.0(magicast@0.5.1)
version: 4.0.0(magicast@0.3.5)
'@types/qrcode':
specifier: 'catalog:'
version: 1.5.6
nuxt-shiki:
specifier: ^0.3.1
version: 0.3.1(magicast@0.5.1)
version: 0.3.1(magicast@0.3.5)
oxc-parser:
specifier: 'catalog:'
version: 0.102.0
@@ -344,6 +347,9 @@ importers:
get-tsconfig:
specifier: ^4.13.0
version: 4.13.0
giget:
specifier: 'catalog:'
version: 3.2.0
magic-string:
specifier: ^0.30.21
version: 0.30.21
@@ -6017,6 +6023,10 @@ packages:
resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==}
hasBin: true
giget@3.2.0:
resolution: {integrity: sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==}
hasBin: true
git-raw-commits@4.0.0:
resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==}
engines: {node: '>=16'}
@@ -10079,10 +10089,10 @@ snapshots:
transitivePeerDependencies:
- magicast
'@dxup/nuxt@0.2.1(magicast@0.5.1)':
'@dxup/nuxt@0.2.1(magicast@0.3.5)':
dependencies:
'@dxup/unimport': 0.1.1
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
chokidar: 3.6.0
pathe: 2.0.3
tinyglobby: 0.2.15
@@ -10869,6 +10879,35 @@ snapshots:
dependencies:
'@nolyfill/shared': 1.0.44
'@nuxt/cli@3.30.0(magicast@0.3.5)':
dependencies:
c12: 3.3.2(magicast@0.3.5)
citty: 0.1.6
confbox: 0.2.2
consola: 3.4.2
copy-paste: 2.2.0
defu: 6.1.4
exsolve: 1.0.7
fuse.js: 7.1.0
giget: 2.0.0
jiti: 2.6.1
listhen: 1.9.0
nypm: 0.6.2
ofetch: 1.5.1
ohash: 2.0.11
pathe: 2.0.3
perfect-debounce: 2.0.0
pkg-types: 2.3.0
scule: 1.3.0
semver: 7.7.3
srvx: 0.9.4
std-env: 3.10.0
tinyexec: 1.0.2
ufo: 1.6.1
youch: 4.1.0-beta.12
transitivePeerDependencies:
- magicast
'@nuxt/cli@3.30.0(magicast@0.5.1)':
dependencies:
c12: 3.3.2(magicast@0.5.1)
@@ -10898,15 +10937,15 @@ snapshots:
transitivePeerDependencies:
- magicast
'@nuxt/content@3.9.0(magicast@0.5.1)':
'@nuxt/content@3.9.0(magicast@0.3.5)':
dependencies:
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxtjs/mdc': 0.19.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
'@nuxtjs/mdc': 0.19.1(magicast@0.3.5)
'@shikijs/langs': 3.18.0
'@sqlite.org/sqlite-wasm': 3.50.4-build1
'@standard-schema/spec': 1.0.0
'@webcontainer/env': 1.1.1
c12: 3.3.2(magicast@0.5.1)
c12: 3.3.2(magicast@0.3.5)
chokidar: 3.6.0
consola: 3.4.2
db0: 0.3.4
@@ -10928,7 +10967,7 @@ snapshots:
minimark: 0.2.0
minimatch: 10.1.1
modern-tar: 0.7.2
nuxt-component-meta: 0.15.0(magicast@0.5.1)
nuxt-component-meta: 0.15.0(magicast@0.3.5)
nypm: 0.6.2
ohash: 2.0.11
pathe: 2.0.3
@@ -10966,9 +11005,9 @@ snapshots:
transitivePeerDependencies:
- magicast
'@nuxt/devtools-kit@2.7.0(magicast@0.5.1)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))':
'@nuxt/devtools-kit@3.1.0(magicast@0.3.5)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
'@nuxt/kit': 3.20.0(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
execa: 8.0.1
vite: 7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2)
transitivePeerDependencies:
@@ -11076,7 +11115,7 @@ snapshots:
structured-clone-es: 1.0.0
tinyglobby: 0.2.15
vite: 7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2)
vite-plugin-inspect: 11.3.3(@nuxt/kit@4.2.1(magicast@0.5.1))(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))
vite-plugin-inspect: 11.3.3(@nuxt/kit@4.2.1(magicast@0.3.5))(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))
vite-plugin-vue-tracer: 1.1.3(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))
which: 5.0.0
ws: 8.18.3
@@ -11126,10 +11165,10 @@ snapshots:
- supports-color
- typescript
'@nuxt/fonts@0.12.1(db0@0.3.4)(ioredis@5.8.2)(magicast@0.5.1)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))':
'@nuxt/fonts@0.12.1(db0@0.3.4)(ioredis@5.8.2)(magicast@0.3.5)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))':
dependencies:
'@nuxt/devtools-kit': 3.1.0(magicast@0.5.1)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/devtools-kit': 3.1.0(magicast@0.3.5)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))
'@nuxt/kit': 4.2.1(magicast@0.3.5)
consola: 3.4.2
css-tree: 3.1.0
defu: 6.1.4
@@ -11172,9 +11211,9 @@ snapshots:
- uploadthing
- vite
'@nuxt/image@2.0.0(db0@0.3.4)(ioredis@5.8.2)(magicast@0.5.1)':
'@nuxt/image@2.0.0(db0@0.3.4)(ioredis@5.8.2)(magicast@0.3.5)':
dependencies:
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
consola: 3.4.2
defu: 6.1.4
h3: 1.15.4
@@ -11312,6 +11351,31 @@ snapshots:
transitivePeerDependencies:
- magicast
'@nuxt/kit@4.2.0(magicast@0.3.5)':
dependencies:
c12: 3.3.2(magicast@0.3.5)
consola: 3.4.2
defu: 6.1.4
destr: 2.0.5
errx: 0.1.0
exsolve: 1.0.7
ignore: 7.0.5
jiti: 2.6.1
klona: 2.0.6
mlly: 1.8.0
ohash: 2.0.11
pathe: 2.0.3
pkg-types: 2.3.0
rc9: 2.1.2
scule: 1.3.0
semver: 7.7.3
tinyglobby: 0.2.15
ufo: 1.6.1
unctx: 2.4.1
untyped: 2.0.0
transitivePeerDependencies:
- magicast
'@nuxt/kit@4.2.0(magicast@0.5.1)':
dependencies:
c12: 3.3.2(magicast@0.5.1)
@@ -11337,6 +11401,31 @@ snapshots:
transitivePeerDependencies:
- magicast
'@nuxt/kit@4.2.1(magicast@0.3.5)':
dependencies:
c12: 3.3.2(magicast@0.3.5)
consola: 3.4.2
defu: 6.1.4
destr: 2.0.5
errx: 0.1.0
exsolve: 1.0.7
ignore: 7.0.5
jiti: 2.6.1
klona: 2.0.6
mlly: 1.8.0
ohash: 2.0.11
pathe: 2.0.3
pkg-types: 2.3.0
rc9: 2.1.2
scule: 1.3.0
semver: 7.7.3
tinyglobby: 0.2.15
ufo: 1.6.1
unctx: 2.4.1
untyped: 2.0.0
transitivePeerDependencies:
- magicast
'@nuxt/kit@4.2.1(magicast@0.5.1)':
dependencies:
c12: 3.3.2(magicast@0.5.1)
@@ -11449,10 +11538,10 @@ snapshots:
- uploadthing
- xml2js
'@nuxt/nitro-server@4.2.1(db0@0.3.4)(encoding@0.1.13)(ioredis@5.8.2)(magicast@0.5.1)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-beta.53)(typescript@5.9.3)':
'@nuxt/nitro-server@4.2.1(db0@0.3.4)(encoding@0.1.13)(ioredis@5.8.2)(magicast@0.3.5)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-beta.53)(typescript@5.9.3)':
dependencies:
'@nuxt/devalue': 2.0.2
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
'@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3))
'@vue/shared': 3.5.24
consola: 3.4.2
@@ -11467,7 +11556,7 @@ snapshots:
klona: 2.0.6
mocked-exports: 0.1.1
nitropack: 2.12.9(encoding@0.1.13)(rolldown@1.0.0-beta.53)
nuxt: 4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)
nuxt: 4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)
pathe: 2.0.3
pkg-types: 2.3.0
radix3: 1.1.2
@@ -11529,6 +11618,23 @@ snapshots:
pkg-types: 2.3.0
std-env: 3.10.0
'@nuxt/telemetry@2.6.6(magicast@0.3.5)':
dependencies:
'@nuxt/kit': 3.20.1(magicast@0.3.5)
citty: 0.1.6
consola: 3.4.2
destr: 2.0.5
dotenv: 16.6.1
git-url-parse: 16.1.0
is-docker: 3.0.0
ofetch: 1.5.1
package-manager-detector: 1.5.0
pathe: 2.0.3
rc9: 2.1.2
std-env: 3.10.0
transitivePeerDependencies:
- magicast
'@nuxt/telemetry@2.6.6(magicast@0.5.1)':
dependencies:
'@nuxt/kit': 3.20.1(magicast@0.5.1)
@@ -11644,9 +11750,9 @@ snapshots:
- vue-tsc
- yaml
'@nuxt/vite-builder@4.2.1(@types/node@24.10.0)(eslint@9.39.1(jiti@2.6.1))(lightningcss@1.30.2)(magicast@0.5.1)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2)':
'@nuxt/vite-builder@4.2.1(@types/node@24.10.0)(eslint@9.39.1(jiti@2.6.1))(lightningcss@1.30.2)(magicast@0.3.5)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2)':
dependencies:
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
'@rollup/plugin-replace': 6.0.3(rollup@4.52.5)
'@vitejs/plugin-vue': 6.0.1(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))
'@vitejs/plugin-vue-jsx': 5.1.1(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))
@@ -11664,7 +11770,7 @@ snapshots:
magic-string: 0.30.21
mlly: 1.8.0
mocked-exports: 0.1.1
nuxt: 4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)
nuxt: 4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)
pathe: 2.0.3
pkg-types: 2.3.0
postcss: 8.5.6
@@ -11714,9 +11820,9 @@ snapshots:
transitivePeerDependencies:
- magicast
'@nuxtjs/color-mode@4.0.0(magicast@0.5.1)':
'@nuxtjs/color-mode@4.0.0(magicast@0.3.5)':
dependencies:
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
exsolve: 1.0.8
pathe: 2.0.3
pkg-types: 2.3.0
@@ -11724,9 +11830,9 @@ snapshots:
transitivePeerDependencies:
- magicast
'@nuxtjs/mdc@0.19.1(magicast@0.5.1)':
'@nuxtjs/mdc@0.19.1(magicast@0.3.5)':
dependencies:
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
'@shikijs/core': 3.18.0
'@shikijs/langs': 3.18.0
'@shikijs/themes': 3.18.0
@@ -14125,7 +14231,7 @@ snapshots:
bytes@3.1.2: {}
c12@3.3.1(magicast@0.5.1):
c12@3.3.1(magicast@0.3.5):
dependencies:
chokidar: 3.6.0
confbox: 0.2.2
@@ -14140,7 +14246,7 @@ snapshots:
pkg-types: 2.3.0
rc9: 2.1.2
optionalDependencies:
magicast: 0.5.1
magicast: 0.3.5
c12@3.3.2(magicast@0.3.5):
dependencies:
@@ -15756,6 +15862,8 @@ snapshots:
nypm: 0.6.2
pathe: 2.0.3
giget@3.2.0: {}
git-raw-commits@4.0.0:
dependencies:
dargs: 8.1.0
@@ -17391,9 +17499,9 @@ snapshots:
dependencies:
boolbase: 1.0.0
nuxt-component-meta@0.15.0(magicast@0.5.1):
nuxt-component-meta@0.15.0(magicast@0.3.5):
dependencies:
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
citty: 0.1.6
json-schema-to-zod: 2.7.0
mlly: 1.8.0
@@ -17405,10 +17513,10 @@ snapshots:
transitivePeerDependencies:
- magicast
nuxt-og-image@5.1.12(@unhead/vue@2.0.19(vue@3.5.25(typescript@5.9.3)))(h3@1.15.4)(magicast@0.5.1)(unstorage@1.17.3(db0@0.3.4)(ioredis@5.8.2))(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)):
nuxt-og-image@5.1.12(@unhead/vue@2.0.19(vue@3.5.25(typescript@5.9.3)))(h3@1.15.4)(magicast@0.3.5)(unstorage@1.17.3(db0@0.3.4)(ioredis@5.8.2))(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)):
dependencies:
'@nuxt/devtools-kit': 2.7.0(magicast@0.5.1)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))
'@nuxt/kit': 4.2.0(magicast@0.5.1)
'@nuxt/devtools-kit': 2.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))
'@nuxt/kit': 4.2.0(magicast@0.3.5)
'@resvg/resvg-js': 2.6.2
'@resvg/resvg-wasm': 2.6.2
'@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3))
@@ -17421,7 +17529,7 @@ snapshots:
image-size: 2.0.2
magic-string: 0.30.21
mocked-exports: 0.1.1
nuxt-site-config: 3.2.11(h3@1.15.4)(magicast@0.5.1)(vue@3.5.25(typescript@5.9.3))
nuxt-site-config: 3.2.11(h3@1.15.4)(magicast@0.3.5)(vue@3.5.25(typescript@5.9.3))
nypm: 0.6.2
ofetch: 1.5.1
ohash: 2.0.11
@@ -17446,18 +17554,18 @@ snapshots:
- vite
- vue
nuxt-shiki@0.3.1(magicast@0.5.1):
nuxt-shiki@0.3.1(magicast@0.3.5):
dependencies:
'@nuxt/kit': 3.20.0(magicast@0.5.1)
'@nuxt/kit': 3.20.0(magicast@0.3.5)
knitwork: 1.2.0
shiki: 3.19.0
unwasm: 0.3.11
transitivePeerDependencies:
- magicast
nuxt-site-config-kit@3.2.11(magicast@0.5.1)(vue@3.5.25(typescript@5.9.3)):
nuxt-site-config-kit@3.2.11(magicast@0.3.5)(vue@3.5.25(typescript@5.9.3)):
dependencies:
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
pkg-types: 2.3.0
site-config-stack: 3.2.11(vue@3.5.25(typescript@5.9.3))
std-env: 3.10.0
@@ -17466,11 +17574,11 @@ snapshots:
- magicast
- vue
nuxt-site-config@3.2.11(h3@1.15.4)(magicast@0.5.1)(vue@3.5.25(typescript@5.9.3)):
nuxt-site-config@3.2.11(h3@1.15.4)(magicast@0.3.5)(vue@3.5.25(typescript@5.9.3)):
dependencies:
'@nuxt/kit': 4.2.0(magicast@0.5.1)
'@nuxt/kit': 4.2.0(magicast@0.3.5)
h3: 1.15.4
nuxt-site-config-kit: 3.2.11(magicast@0.5.1)(vue@3.5.25(typescript@5.9.3))
nuxt-site-config-kit: 3.2.11(magicast@0.3.5)(vue@3.5.25(typescript@5.9.3))
pathe: 2.0.3
pkg-types: 2.3.0
sirv: 3.0.2
@@ -17600,19 +17708,19 @@ snapshots:
- xml2js
- yaml
nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2):
nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2):
dependencies:
'@dxup/nuxt': 0.2.1(magicast@0.5.1)
'@nuxt/cli': 3.30.0(magicast@0.5.1)
'@dxup/nuxt': 0.2.1(magicast@0.3.5)
'@nuxt/cli': 3.30.0(magicast@0.3.5)
'@nuxt/devtools': 3.1.0(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/nitro-server': 4.2.1(db0@0.3.4)(encoding@0.1.13)(ioredis@5.8.2)(magicast@0.5.1)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-beta.53)(typescript@5.9.3)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
'@nuxt/nitro-server': 4.2.1(db0@0.3.4)(encoding@0.1.13)(ioredis@5.8.2)(magicast@0.3.5)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(rolldown@1.0.0-beta.53)(typescript@5.9.3)
'@nuxt/schema': 4.2.1
'@nuxt/telemetry': 2.6.6(magicast@0.5.1)
'@nuxt/vite-builder': 4.2.1(@types/node@24.10.0)(eslint@9.39.1(jiti@2.6.1))(lightningcss@1.30.2)(magicast@0.5.1)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2)
'@nuxt/telemetry': 2.6.6(magicast@0.3.5)
'@nuxt/vite-builder': 4.2.1(@types/node@24.10.0)(eslint@9.39.1(jiti@2.6.1))(lightningcss@1.30.2)(magicast@0.3.5)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vue-tsc@3.1.8(typescript@5.9.3))(vue@3.5.25(typescript@5.9.3))(yaml@2.8.2)
'@unhead/vue': 2.0.19(vue@3.5.25(typescript@5.9.3))
'@vue/shared': 3.5.24
c12: 3.3.1(magicast@0.5.1)
c12: 3.3.1(magicast@0.3.5)
chokidar: 3.6.0
compatx: 0.2.0
consola: 3.4.2
@@ -19971,7 +20079,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
vite-plugin-inspect@11.3.3(@nuxt/kit@4.2.1(magicast@0.5.1))(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2)):
vite-plugin-inspect@11.3.3(@nuxt/kit@4.2.1(magicast@0.3.5))(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2)):
dependencies:
ansis: 4.2.0
debug: 4.4.3
@@ -19984,7 +20092,7 @@ snapshots:
vite: 7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2)
vite-dev-rpc: 1.1.0(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))
optionalDependencies:
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
transitivePeerDependencies:
- supports-color
@@ -20191,11 +20299,11 @@ snapshots:
esbuild: 0.27.0
vue: 3.5.25(typescript@5.9.3)
vue-sonner@2.0.9(@nuxt/kit@4.2.1(magicast@0.5.1))(@nuxt/schema@4.2.1)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)):
vue-sonner@2.0.9(@nuxt/kit@4.2.1(magicast@0.3.5))(@nuxt/schema@4.2.1)(nuxt@4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)):
optionalDependencies:
'@nuxt/kit': 4.2.1(magicast@0.5.1)
'@nuxt/kit': 4.2.1(magicast@0.3.5)
'@nuxt/schema': 4.2.1
nuxt: 4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.5.1)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)
nuxt: 4.2.1(@parcel/watcher@2.5.1)(@types/node@24.10.0)(@vue/compiler-sfc@3.5.25)(db0@0.3.4)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.8.2)(lightningcss@1.30.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.53)(rollup@4.52.5)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(stylus@0.57.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.2))(vue-tsc@3.1.8(typescript@5.9.3))(yaml@2.8.2)
vue-tsc@3.1.8(typescript@5.9.3):
dependencies:
+1
View File
@@ -14,6 +14,7 @@ catalog:
class-variance-authority: ^0.7.1
clsx: ^2.1.1
date-fns: ^4.1.0
giget: ^3.2.0
open: ^10.2.0
oxc-parser: ^0.102.0
pathe: ^2.0.3
+1
View File
@@ -0,0 +1 @@
node_modules
+1
View File
@@ -0,0 +1 @@
node_modules
+2
View File
@@ -0,0 +1,2 @@
node_modules
.nuxt
+21 -4
View File
@@ -1,7 +1,24 @@
import tailwindcss from '@tailwindcss/vite'
export default defineNuxtConfig({
future: {
compatibilityVersion: 4,
},
css: ['~/assets/css/tailwind.css'],
compatibilityDate: '2025-01-01',
modules: ['@nuxtjs/tailwindcss'],
vite: {
plugins: [tailwindcss()],
},
modules: ['shadcn-nuxt'],
shadcn: {
/**
* Prefix for all the imported component.
* @default "Ui"
*/
prefix: 'Ui',
/**
* Directory that the component lives in.
* Will respect the Nuxt aliases.
* @link https://nuxt.com/docs/api/nuxt-config#alias
* @default "@/components/ui"
*/
componentDir: '@/components/ui',
},
})
+3 -1
View File
@@ -14,7 +14,9 @@
"vue": "^3.5.13"
},
"devDependencies": {
"@nuxtjs/tailwindcss": "^7.0.0",
"@tailwindcss/vite": "^4.0.0",
"shadcn-nuxt": "^2.5.1",
"tailwindcss": "^4.0.0",
"typescript": "^5.7.2"
}
}
+1
View File
@@ -0,0 +1 @@
node_modules