nuxt-schema-org
Version:
The quickest and easiest way to build Schema.org graphs for Nuxt.
1 lines • 16.8 kB
JavaScript
import{At as e,Dt as t,G as n,H as r,K as i,S as a,_ as o,g as s,h as c,it as l,l as u,m as d,pt as f,v as p,w as m,wt as h,x as g,y as _}from"./BJm6aQik.js";import"./BHnqSpjH.js";import{g as v,r as y}from"./B-pXgC-0.js";import{t as b}from"./CHHO6nw6.js";import{a as x,i as S,n as C,r as w}from"#entry";import{t as T}from"./CjC_woKp.js";var E={class:`devtools-empty`},D={class:`devtools-empty-title`},O={key:0,class:`devtools-empty-description`},k={key:1,class:`devtools-empty-actions`},ee=Object.assign(b(m({__name:`DevtoolsEmptyState`,props:{icon:{default:`carbon:search`},title:{},description:{},variant:{default:`default`}},setup(n){return(s,l)=>{let u=v;return r(),p(`div`,E,[c(`div`,{class:t([`devtools-empty-icon`,`devtools-empty-icon-${n.variant}`])},[a(u,{name:n.icon,class:`w-8 h-8`,"aria-hidden":`true`},null,8,[`name`])],2),c(`h2`,D,e(n.title),1),n.description||s.$slots.description?(r(),p(`p`,O,[i(s.$slots,`description`,{},()=>[g(e(n.description),1)],!0)])):o(``,!0),s.$slots.default?(r(),p(`div`,k,[i(s.$slots,`default`,{},void 0,!0)])):o(``,!0)])}}}),[[`__scopeId`,`data-v-eadf6668`]]),{__name:`DevtoolsEmptyState`}),A=new Set(`Article.NewsArticle.BlogPosting.ScholarlyArticle.Product.AggregateOffer.Offer.FAQPage.Question.HowTo.HowToStep.Recipe.Event.LocalBusiness.Restaurant.JobPosting.Course.Movie.Book.SoftwareApplication.VideoObject.Review.AggregateRating.BreadcrumbList.SearchAction.Dataset.SpecialAnnouncement.Person.NewsMediaOrganization.Organization`.split(`.`)),j={Article:{required:[],recommended:[`author`,`author.name`,`dateModified`,`datePublished`,`headline`,`image`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/article`},NewsArticle:{required:[],recommended:[`author`,`author.name`,`dateModified`,`datePublished`,`headline`,`image`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/article`},BlogPosting:{required:[],recommended:[`author`,`author.name`,`dateModified`,`datePublished`,`headline`,`image`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/article`},Product:{required:[`name`],recommended:[`description`,`offers`,`offers.price`,`offers.priceCurrency`,`offers.availability`,`aggregateRating`,`review`,`image`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/product`},FAQPage:{required:[`mainEntity`],recommended:[],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/faqpage`},Recipe:{required:[`name`,`image`],recommended:[`aggregateRating`,`author`,`cookTime`,`datePublished`,`description`,`keywords`,`nutrition`,`prepTime`,`recipeCategory`,`recipeCuisine`,`recipeIngredient`,`recipeInstructions`,`recipeYield`,`totalTime`,`video`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/recipe`},Event:{required:[`name`,`location`,`startDate`],recommended:[`description`,`endDate`,`eventStatus`,`image`,`offers`,`performer`,`organizer`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/event`},LocalBusiness:{required:[`name`,`address`],recommended:[`aggregateRating`,`department`,`geo`,`openingHoursSpecification`,`priceRange`,`telephone`,`url`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/local-business`},Restaurant:{required:[`name`,`address`],recommended:[`aggregateRating`,`servesCuisine`,`hasMenu`,`geo`,`openingHoursSpecification`,`priceRange`,`telephone`,`url`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/local-business`},Review:{required:[`author`,`itemReviewed`,`reviewRating`],recommended:[`datePublished`,`reviewRating.bestRating`,`reviewRating.worstRating`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/review-snippet`},AggregateRating:{required:[`itemReviewed`,`ratingValue`],recommended:[`bestRating`,`worstRating`,`ratingCount`,`reviewCount`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/review-snippet`},BreadcrumbList:{required:[`itemListElement`],recommended:[],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/breadcrumb`},Organization:{required:[],recommended:[`name`,`logo`,`url`,`email`,`telephone`,`contactPoint`,`sameAs`,`address`,`description`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/organization`},Person:{required:[],recommended:[`name`,`url`,`image`,`sameAs`,`jobTitle`,`worksFor`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/person`},SoftwareApplication:{required:[`name`,`offers`],recommended:[`applicationCategory`,`operatingSystem`,`aggregateRating`,`review`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/software-app`},VideoObject:{required:[`name`,`thumbnailUrl`,`uploadDate`],recommended:[`contentUrl`,`description`,`duration`,`embedUrl`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/video`},JobPosting:{required:[`datePosted`,`description`,`hiringOrganization`,`jobLocation`,`title`],recommended:[`applicantLocationRequirements`,`baseSalary`,`employmentType`,`jobLocationType`,`validThrough`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/job-posting`},Course:{required:[`description`,`name`],recommended:[`provider`],documentationUrl:`https://developers.google.com/search/docs/appearance/structured-data/course`}};function M(e,t,n){if(!(!e||typeof e!=`object`||n.has(e))){n.add(e),e[`@type`]&&Object.keys(e).length>1&&t.push(e);for(let r of Object.values(e))if(Array.isArray(r))for(let e of r)M(e,t,n);else typeof r==`object`&&M(r,t,n)}}function N(e,t){let n={...e};return Object.keys(n).forEach(e=>{let r=n[e];r&&typeof r==`object`&&!Array.isArray(r)&&Object.keys(r).length===1&&r[`@id`]&&t.has(r[`@id`])?n[e]={...t.get(r[`@id`])}:Array.isArray(r)?n[e]=r.map(e=>e&&typeof e==`object`&&Object.keys(e).length===1&&e[`@id`]&&t.has(e[`@id`])?{...t.get(e[`@id`])}:e):r&&typeof r==`object`&&!Array.isArray(r)&&Object.keys(r).length>1&&(n[e]=N(r,t))}),n}function P(e){let t=[];if(!e)return t;let n=new Set;if(e[`@graph`]&&Array.isArray(e[`@graph`])){let r=new Map;e[`@graph`].forEach(e=>{e&&typeof e==`object`&&e[`@id`]&&r.set(e[`@id`],e)});let i=new Set;e[`@graph`].forEach(e=>{if(e&&typeof e==`object`){if(Object.keys(e).length===1&&e[`@id`]||e[`@id`]&&i.has(e[`@id`]))return;M(N(e,r),t,n),e[`@id`]&&i.add(e[`@id`])}})}else e[`@type`]&&M(e,t,n);let r=[],i=new Set;for(let e of t){let t=e[`@id`];if(t){if(i.has(t))continue;i.add(t)}r.push(e)}return r}function F(e){return!e||!e[`@type`]?`Unknown`:Array.isArray(e[`@type`])?e[`@type`][0]:e[`@type`]}function I(e){return A.has(e)}function L(e){let t=F(e);return e.name?e.name:e.headline?e.headline:e.title?e.title:e.description?typeof e.description==`string`?e.description.substring(0,100)+(e.description.length>100?`...`:``):``:e[`@id`]?e[`@id`]:e.url?e.url:`${t} Schema`}function R(e,t){let n=t.split(`.`),r=e;for(let e of n)if(r&&typeof r==`object`&&e in r)r=r[e];else return;return r}function z(e){let t=j[F(e)];if(!t)return{missingRequired:[],missingRecommended:[],presentProperties:{}};let n=[],r=[],i={};return t.required.forEach(t=>{let r=R(e,t);r==null||r===``?n.push(t):i[t]=r}),t.recommended.forEach(t=>{let n=R(e,t);n==null||n===``?r.push(t):i[t]=n}),{missingRequired:n,missingRecommended:r,presentProperties:i}}function B(e){return e==null?`null`:typeof e==`string`?e.length>50?`${e.substring(0,50)}...`:e:typeof e==`number`?e.toString():typeof e==`boolean`?e?`true`:`false`:Array.isArray(e)?`[${e.length} items]`:typeof e==`object`&&e[`@type`]?e[`@type`]:typeof e==`object`?`{...}`:String(e)}function V(e){return{Article:`carbon:document`,NewsArticle:`carbon:news`,BlogPosting:`carbon:blog`,Product:`carbon:shopping-cart`,FAQPage:`carbon:help`,Organization:`carbon:building`,LocalBusiness:`carbon:location`,Person:`carbon:user`,Event:`carbon:calendar`,SoftwareApplication:`carbon:application`,Recipe:`carbon:restaurant`,HowTo:`carbon:list-numbered`,WebSite:`carbon:earth`,WebPage:`carbon:page-first`,BreadcrumbList:`carbon:flow`,VideoObject:`carbon:video`,Review:`carbon:star`,AggregateRating:`carbon:star-filled`,SearchAction:`carbon:search`}[e]||`carbon:code`}var H={article:[`Article`,`NewsArticle`,`BlogPosting`],book:[`Book`],breadcrumb:[`BreadcrumbList`],carousel:[`ItemList`],"course-info":[`Course`],course:[`Course`],dataset:[`Dataset`],"discussion-forum":[`DiscussionForumPosting`],"education-qa":[`Question`,`Answer`],"employer-rating":[`EmployerAggregateRating`],"estimated-salary":[`OccupationalExperienceRequirements`],event:[`Event`],factcheck:[`ClaimReview`],faqpage:[`FAQPage`],"image-license-metadata":[`ImageObject`],"job-posting":[`JobPosting`],"learning-video":[`LearningResource`,`VideoObject`],"local-business":[`LocalBusiness`],"math-solvers":[`MathSolver`],movie:[`Movie`],organization:[`Organization`],"practice-problems":[`Quiz`,`Question`],product:[`Product`],"product-snippet":[`Product`],"merchant-listing":[`Product`,`Offer`],"product-variants":[`Product`],"profile-page":[`ProfilePage`,`Person`],qapage:[`QAPage`],recipe:[`Recipe`],"review-snippet":[`Review`],"software-app":[`SoftwareApplication`],speakable:[`SpeakableSpecification`],"special-announcements":[`SpecialAnnouncement`],"paywalled-content":[`CreativeWork`],"vacation-rental":[`Accommodation`,`LodgingBusiness`],"vehicle-listing":[`Vehicle`],video:[`VideoObject`]};function U(e){let t=e.replace(`https://schema.org/`,``),n=Object.entries(H).find(([e,n])=>n.includes(t))?.[0];return{type:t,schemaOrg:`https://schema.org/${t}`,googlePage:n?`https://developers.google.com/search/docs/appearance/structured-data/${n}`:null}}function W(e){let t=P(e),n=0,r=0,i=0;for(let e of t){I(F(e))&&i++;let t=z(e);n+=t.missingRequired.length,r+=t.missingRecommended.length}return{nodes:t,summary:{totalNodes:t.length,richResultNodes:i,totalErrors:n,totalWarnings:r}}}var G={class:`space-y-4 stagger-children`},K={class:`font-medium`},q={class:`flex items-center gap-2`},J={class:`flex items-start justify-between mb-3`},Y={class:`flex items-center gap-2 min-w-0`},X={class:`font-semibold text-sm`},Z={class:`flex items-center shrink-0`},Q={key:0,class:`text-xs text-[var(--color-text-muted)] mb-3 truncate`},te={class:`ml-1 opacity-80`},ne={class:`ml-1 opacity-80`},re={class:`space-y-3`},ie={key:0},ae={class:`space-y-1.5`},oe={class:`font-mono text-[var(--seo-green)]`},se={key:0,class:`text-[var(--color-text-subtle)] truncate`},ce={key:1,class:`text-red-500`},$={class:`space-y-1.5`},le={class:`font-mono text-[var(--seo-green)] opacity-70`},ue={key:0,class:`text-[var(--color-text-subtle)] truncate`},de={key:1,class:`text-[var(--color-text-subtle)] opacity-50`},fe={key:2,class:`json-view`},pe={class:`flex items-center gap-1 mt-2`},me=Object.assign(b(m({__name:`SchemaValidator`,props:{graph:{}},setup(i){let m=d(()=>{try{return JSON.parse(i.graph)}catch{return null}}),b=d(()=>m.value?W(m.value):null),C=d(()=>{if(!b.value)return null;let{summary:e}=b.value;return e.totalNodes===0?{variant:`warning`,icon:`carbon:warning`,message:`No structured data nodes detected on this page.`}:e.totalErrors>0?{variant:`error`,icon:`carbon:close-filled`,message:`Found ${e.totalErrors} missing required property${e.totalErrors>1?`ies`:`y`} across ${e.totalNodes} node${e.totalNodes>1?`s`:``}`}:e.totalWarnings>0?{variant:`warning`,icon:`carbon:warning`,message:`${e.totalWarnings} missing recommended property${e.totalWarnings>1?`ies`:`y`}, but all required fields present`}:{variant:`success`,icon:`carbon:checkmark-filled`,message:`All ${e.totalNodes} node${e.totalNodes>1?`s`:``} validated successfully.`}}),E=d(()=>b.value?b.value.nodes.filter(e=>F(e)!==`Unknown`):[]),D=f(new Map);function O(e){return D.get(e)??`validate`}function k(e){let t=F(e),n=j[t],r=z(e);return n?.recommended?.length&&r.missingRecommended.length===0&&r.missingRequired.length===0?`node-card-success`:I(t)&&(r.missingRecommended.length>0||r.missingRequired.length>0)?`node-card-active`:``}let A=new Set([`WebSite`,`WebPage`,`ImageObject`]),M=d(()=>E.value.length>0&&E.value.every(e=>A.has(F(e))));return(i,d)=>{let f=x,m=S,A=ee,N=v,P=y,H=w,W=T;return r(),p(`div`,G,[h(C)?(r(),s(m,{key:0,variant:h(C).variant,icon:h(C).icon},_({default:l(()=>[c(`span`,K,e(h(C).message),1)]),_:2},[h(b)?{name:`action`,fn:l(()=>[c(`div`,q,[a(f,null,{default:l(()=>[g(e(h(b).summary.totalNodes)+` nodes `,1)]),_:1}),h(b).summary.richResultNodes>0?(r(),s(f,{key:0,color:`primary`},{default:l(()=>[g(e(h(b).summary.richResultNodes)+` rich result eligible `,1)]),_:1})):o(``,!0)])]),key:`0`}:void 0]),1032,[`variant`,`icon`])):o(``,!0),h(M)?(r(),s(A,{key:1,title:`Only foundation schemas detected`,description:`Only WebSite, WebPage, and ImageObject found. Consider adding rich result schemas for better search visibility.`,icon:`carbon:information`})):o(``,!0),(r(!0),p(u,null,n(h(E),(i,_)=>(r(),p(`div`,{key:_,class:t([`node-card`,k(i)])},[c(`div`,J,[c(`div`,Y,[a(N,{name:h(V)(h(F)(i)),class:t([h(I)(h(F)(i))?`text-[var(--seo-green)]`:`text-[var(--color-text-muted)]`,`shrink-0`])},null,8,[`name`,`class`]),c(`span`,X,e(h(F)(i)),1),h(I)(h(F)(i))?(r(),s(f,{key:0,color:`primary`},{default:l(()=>[...d[0]||=[g(` Rich Result `,-1)]]),_:1})):o(``,!0)]),c(`div`,Z,[a(P,{icon:`carbon:checkmark-outline`,size:`xs`,variant:O(_)===`validate`?`subtle`:`ghost`,color:O(_)===`validate`?`primary`:`neutral`,title:`Validation view`,onClick:e=>h(D).set(_,`validate`)},null,8,[`variant`,`color`,`onClick`]),a(P,{icon:`carbon:code`,size:`xs`,variant:O(_)===`json`?`subtle`:`ghost`,color:O(_)===`json`?`primary`:`neutral`,title:`JSON view`,onClick:e=>h(D).set(_,`json`)},null,8,[`variant`,`color`,`onClick`]),h(j)[h(F)(i)]?(r(),s(P,{key:0,icon:`carbon:launch`,size:`xs`,variant:`ghost`,color:`neutral`,to:h(j)[h(F)(i)].documentationUrl,target:`_blank`,title:`Google Rich Results docs`},null,8,[`to`])):o(``,!0)])]),h(L)(i)?(r(),p(`p`,Q,e(h(L)(i)),1)):o(``,!0),O(_)===`validate`?(r(),p(u,{key:1},[h(z)(i).missingRequired.length>0?(r(),s(m,{key:0,variant:`error`,class:`mb-3`},{default:l(()=>[d[1]||=c(`span`,{class:`font-medium`},`Missing required:`,-1),c(`span`,te,e(h(z)(i).missingRequired.join(`, `)),1)]),_:2},1024)):h(j)[h(F)(i)]?.recommended?.length>0&&h(z)(i).missingRecommended.length===0?(r(),s(m,{key:1,variant:`success`,class:`mb-3`},{default:l(()=>[...d[2]||=[c(`span`,{class:`font-medium`},`Excellent!`,-1),c(`span`,{class:`ml-1 opacity-80`},`All recommended properties present`,-1)]]),_:1})):h(z)(i).missingRecommended.length>0&&h(z)(i).missingRecommended.length<=5?(r(),s(m,{key:2,variant:`warning`,class:`mb-3`},{default:l(()=>[d[3]||=c(`span`,{class:`font-medium`},`Missing recommended:`,-1),c(`span`,ne,e(h(z)(i).missingRecommended.slice(0,5).join(`, `)),1)]),_:2},1024)):o(``,!0),c(`div`,re,[h(j)[h(F)(i)]?.required?.length>0?(r(),p(`div`,ie,[d[4]||=c(`h5`,{class:`text-xs font-medium mb-2`},` Required Properties `,-1),c(`div`,ae,[(r(!0),p(u,null,n(h(j)[h(F)(i)].required,n=>(r(),p(`div`,{key:n,class:`flex items-center gap-2 text-xs`},[a(N,{name:h(R)(i,n)?`carbon:checkmark-filled`:`carbon:close-filled`,class:t(h(R)(i,n)?`text-green-500`:`text-red-500`)},null,8,[`name`,`class`]),c(`span`,oe,e(n)+`:`,1),h(R)(i,n)?(r(),p(`span`,se,e(h(B)(h(R)(i,n))),1)):(r(),p(`span`,ce,`missing`))]))),128))])])):o(``,!0),h(j)[h(F)(i)]?.recommended?.length>0?(r(),s(H,{key:1,text:`Recommended Properties (${Object.keys(h(z)(i).presentProperties).filter(e=>h(j)[h(F)(i)]?.recommended.includes(e)).length}/${h(j)[h(F)(i)]?.recommended.length})`,open:!1},{default:l(()=>[c(`div`,$,[(r(!0),p(u,null,n(h(j)[h(F)(i)].recommended,n=>(r(),p(`div`,{key:n,class:`flex items-center gap-2 text-xs`},[a(N,{name:h(R)(i,n)?`carbon:checkmark`:`carbon:subtract`,class:t(h(R)(i,n)?`text-green-500`:`text-[var(--color-text-subtle)]`)},null,8,[`name`,`class`]),c(`span`,le,e(n)+`:`,1),h(R)(i,n)?(r(),p(`span`,ue,e(h(B)(h(R)(i,n))),1)):(r(),p(`span`,de,`not set`))]))),128))])]),_:2},1032,[`text`])):o(``,!0)])],64)):(r(),p(`div`,fe,[a(W,{code:JSON.stringify(i,null,2),lang:`json`,label:h(F)(i)},null,8,[`code`,`label`]),c(`div`,pe,[a(P,{to:h(U)(h(F)(i)).schemaOrg,target:`_blank`,size:`xs`,variant:`ghost`,color:`neutral`,"trailing-icon":`carbon:launch`,label:`Schema.org`},null,8,[`to`]),h(U)(h(F)(i)).googlePage?(r(),s(P,{key:0,to:h(U)(h(F)(i)).googlePage,target:`_blank`,size:`xs`,variant:`ghost`,color:`neutral`,"trailing-icon":`carbon:launch`,label:`Rich Results`},null,8,[`to`])):o(``,!0)])]))],2))),128))])}}}),[[`__scopeId`,`data-v-89f88aa9`]]),{__name:`SchemaValidator`}),he=m({__name:`index`,setup(e){return(e,t)=>{let n=me;return r(),s(n,{graph:h(C)},null,8,[`graph`])}}});export{he as default};