X Enterprises
nuxt-x-restaurants

v0.10.0 Release Notes

First stable release — quality gates green, ~85% composable statement coverage, caret peer ranges, OG image generation disabled. Upgrade notes from 0.9.x included.

nuxt-x-restaurants v0.10.0 — Stable

Released: 2026-07-11

First stable release. Quality gates green, ~85% composable statement coverage, caret peer ranges, OG image generation disabled.

Highlights

  • Typecheck clean (strict TS fixes across filters, hours, pages, sitemap)
  • Full Vitest coverage of 11 composables via #imports mocks
  • ogImage.enabled: false — no @takumi-rs/core noise
  • server/ shipped in package files for sitemap URL source

Upgrade from 0.9.x

  1. Bump to @xenterprises/nuxt-x-restaurants@^0.10.0
  2. Ensure peers: @nuxt/ui, @nuxt/content, @nuxtjs/seo, @xenterprises/nuxt-x-marketing, @xenterprises/nuxt-x-cards satisfy caret ranges
  3. Run nuxi typecheck in the consumer app

nuxt-x-restaurants v0.9.0 — Schema & meta consolidation

Released: 2026-06-28

A focused polish release that adds the useSchema composable family and migrates all 22 pages from hand-rolled useHead({ script: [{ type: 'application/ld+json', ... }] }) boilerplate to composable calls. No new components, no new pages — purely an internal refactor that makes future sites consistent out of the box.

Why this release

Before v0.9.0, every page that needed SEO had a 15-20 line useHead(...) block with hand-written JSON-LD inline. The same pattern repeated across 22 pages, and the boilerplate grew with each new feature. This release consolidates it into one composable per schema shape.

What's new

useSchema composable family

ComposableEmitsDrives
useArticleSchema(input)BlogPosting with author + publisher + datesArticle rich results
useReviewSchema(input)Review + Rating blockPer-review SERP snippets
useProductSchema(input)Product + AggregateRating + OfferStar SERPs (Yelp's pattern)
useBreadcrumbSchema(input)BreadcrumbListBreadcrumb SERPs
useItemListSchema(input)ItemList (top 50)Carousel / sitelinks SERPs
useSiteMeta(input)<title>, <meta>, OG, Twitter Card, canonical, robotsStandard meta tags

All composables read site identity from appConfig.xRestaurants.name and appConfig.xSchema.siteUrl automatically. Pattern adapted from nuxt-x-affiliate/app/composables/useSchema.ts.

useSiteMeta consolidates the meta boilerplate

Before:

useHead(computed(() => ({
  title: `About Us — ${siteName.value}`,
  meta: [
    { name: 'description', content: '...' },
    { property: 'og:type', content: 'website' },
    { property: 'og:title', content: `About Us — ${siteName.value}` },
    { property: 'og:description', content: '...' },
    ...(siteUrl.value ? [{ property: 'og:url', content: `${siteUrl.value}/about` }] : []),
    { property: 'og:site_name', content: siteName.value },
    { name: 'twitter:card', content: 'summary_large_image' },
    { name: 'twitter:title', content: `About Us — ${siteName.value}` },
    { name: 'twitter:description', content: '...' },
  ],
})))

After:

useSiteMeta({
  title: `About Us — ${siteName.value}`,
  description: '...',
  path: '/about',
})

Migration

npm install @xenterprises/nuxt-x-restaurants@0.9.0

No breaking changes. If you've written your own pages with hand-rolled useHead, you can opt-in to the composables at your own pace — the old pattern still works. For new pages, prefer useSiteMeta + the relevant schema composables.

Pages migrated (22 total)

  • articles/[...slug].vue, articles/index.vueuseArticleSchema + useBreadcrumbSchema + useSiteMeta
  • features/[...slug].vue, features/index.vueuseArticleSchema + useBreadcrumbSchema + useSiteMeta
  • cuisines/[slug].vue, neighborhoods/[slug].vueuseItemListSchema + useSiteMeta
  • cuisines/index.vue, neighborhoods/index.vueuseSiteMeta
  • restaurants/[slug].vue + sub-routes — useSiteMeta
  • restaurants/index.vue, popular/index.vue, index.vue, about.vue, contact.vue, list-restaurant.vue, sitemap.vue, terms.vue, privacy.vueuseSiteMeta

Future work (deferred)

  • useReviewSchema + useProductSchema are exported but not yet wired into any page — they'll plug into the restaurant profile page when review aggregate data becomes available.
  • ~48 as any casts throughout the layer (mostly xRestaurants/xMarketing namespace access). Documented as deliberate pattern.

Upgrading

npm install @xenterprises/nuxt-x-restaurants@0.9.0

No breaking changes. All existing pages continue to work.

Roadmap

Full roadmap at tasks/yelp-roadmap.md.

Full changelog

See CHANGELOG.md.


AI Context

release: v0.9.0
package: "@xenterprises/nuxt-x-restaurants"
released: 2026-06-28
breaking-changes: none
major-features:
  - useArticleSchema composable (BlogPosting JSON-LD)
  - useReviewSchema composable (Review + Rating)
  - useProductSchema composable (Product + AggregateRating + Offer)
  - useBreadcrumbSchema composable (BreadcrumbList)
  - useItemListSchema composable (ItemList, top 50)
  - useSiteMeta composable (consolidated title + description + OG + Twitter Card + canonical + robots)
internal-refactor:
  - 22 pages migrated from hand-rolled useHead + useSeoMeta + application/ld+json boilerplate to composable calls
  - ~280 lines of duplicated SEO boilerplate removed
  - Pattern adapted from nuxt-x-affiliate/app/composables/useSchema.ts
Copyright © 2026