First Init
Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped
Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped
This commit is contained in:
@@ -0,0 +1,201 @@
|
||||
---
|
||||
// SEO Component for page-specific structured data
|
||||
// Use in the head slot of BaseLayout for additional schema markup
|
||||
|
||||
interface BreadcrumbItem {
|
||||
name: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
type?: 'WebPage' | 'BlogPosting' | 'Article' | 'Service' | 'AboutPage' | 'ContactPage' | 'FAQPage';
|
||||
breadcrumbs?: BreadcrumbItem[];
|
||||
article?: {
|
||||
author: string;
|
||||
datePublished: string;
|
||||
dateModified?: string;
|
||||
category?: string;
|
||||
tags?: string[];
|
||||
image?: string;
|
||||
wordCount?: number;
|
||||
};
|
||||
service?: {
|
||||
name: string;
|
||||
description: string;
|
||||
};
|
||||
faq?: Array<{
|
||||
question: string;
|
||||
answer: string;
|
||||
}>;
|
||||
}
|
||||
|
||||
const { type = 'WebPage', breadcrumbs, article, service, faq } = Astro.props;
|
||||
|
||||
const baseUrl = 'https://workroot.in';
|
||||
const currentUrl = Astro.url.href;
|
||||
|
||||
// Get page title and description from parent layout props
|
||||
const pageTitle = (Astro.props as any).title || 'WorkRoot IT Solutions';
|
||||
const pageDescription = (Astro.props as any).description || 'Professional IT services including web development, cloud solutions, and digital transformation for businesses.';
|
||||
|
||||
// Generate BreadcrumbList schema
|
||||
const breadcrumbSchema = breadcrumbs ? {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": breadcrumbs.map((item, index) => ({
|
||||
"@type": "ListItem",
|
||||
"position": index + 1,
|
||||
"name": item.name,
|
||||
"item": `${baseUrl}${item.url}`
|
||||
}))
|
||||
} : null;
|
||||
|
||||
// Generate BlogPosting schema for blog posts (more specific than Article)
|
||||
const blogPostingSchema = article && type === 'BlogPosting' ? {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BlogPosting",
|
||||
"headline": pageTitle,
|
||||
"description": pageDescription,
|
||||
"image": article.image ? {
|
||||
"@type": "ImageObject",
|
||||
"url": article.image,
|
||||
"width": 1200,
|
||||
"height": 675
|
||||
} : undefined,
|
||||
"author": {
|
||||
"@type": "Person",
|
||||
"name": article.author,
|
||||
"url": `${baseUrl}/about`
|
||||
},
|
||||
"datePublished": article.datePublished,
|
||||
"dateModified": article.dateModified || article.datePublished,
|
||||
"publisher": {
|
||||
"@type": "Organization",
|
||||
"name": "WorkRoot IT Solutions",
|
||||
"url": baseUrl,
|
||||
"logo": {
|
||||
"@type": "ImageObject",
|
||||
"url": `${baseUrl}/logo.png`,
|
||||
"width": 512,
|
||||
"height": 512
|
||||
}
|
||||
},
|
||||
"mainEntityOfPage": {
|
||||
"@type": "WebPage",
|
||||
"@id": currentUrl
|
||||
},
|
||||
"keywords": article.tags?.join(', '),
|
||||
"articleSection": article.category,
|
||||
"wordCount": article.wordCount,
|
||||
"inLanguage": "en-US"
|
||||
} : null;
|
||||
|
||||
// Generate Service schema
|
||||
const serviceSchema = service ? {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Service",
|
||||
"name": service.name,
|
||||
"description": service.description,
|
||||
"provider": {
|
||||
"@type": "Organization",
|
||||
"name": "WorkRoot IT Solutions",
|
||||
"url": baseUrl
|
||||
},
|
||||
"areaServed": "Worldwide",
|
||||
"serviceType": service.name
|
||||
} : null;
|
||||
|
||||
// Generate WebPage schema for standard pages
|
||||
const webPageSchema = type === 'WebPage' && Astro.url.pathname !== '/' ? {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebPage",
|
||||
"name": pageTitle,
|
||||
"description": pageDescription,
|
||||
"url": currentUrl,
|
||||
"inLanguage": "en-US",
|
||||
"isPartOf": {
|
||||
"@type": "WebSite",
|
||||
"@id": `${baseUrl}/#website`
|
||||
},
|
||||
"about": {
|
||||
"@type": "Organization",
|
||||
"name": "WorkRoot IT Solutions"
|
||||
},
|
||||
"primaryImageOfPage": {
|
||||
"@type": "ImageObject",
|
||||
"url": `${baseUrl}/og-image.jpg`
|
||||
}
|
||||
} : null;
|
||||
|
||||
// Generate FAQPage schema
|
||||
const faqPageSchema = faq && faq.length > 0 ? {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"mainEntity": faq.map((item) => ({
|
||||
"@type": "Question",
|
||||
"name": item.question,
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": item.answer
|
||||
}
|
||||
}))
|
||||
} : null;
|
||||
|
||||
// Generate AboutPage schema
|
||||
const aboutPageSchema = type === 'AboutPage' ? {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "AboutPage",
|
||||
"name": pageTitle,
|
||||
"description": pageDescription,
|
||||
"url": currentUrl,
|
||||
"inLanguage": "en-US",
|
||||
"mainEntity": {
|
||||
"@type": "Organization",
|
||||
"name": "WorkRoot IT Solutions",
|
||||
"url": baseUrl
|
||||
}
|
||||
} : null;
|
||||
|
||||
// Generate ContactPage schema
|
||||
const contactPageSchema = type === 'ContactPage' ? {
|
||||
"@context": "https://schema.org",
|
||||
"@type": "ContactPage",
|
||||
"name": pageTitle,
|
||||
"description": pageDescription,
|
||||
"url": currentUrl,
|
||||
"inLanguage": "en-US",
|
||||
"mainEntity": {
|
||||
"@type": "Organization",
|
||||
"name": "WorkRoot IT Solutions",
|
||||
"url": baseUrl
|
||||
}
|
||||
} : null;
|
||||
---
|
||||
|
||||
{breadcrumbSchema && (
|
||||
<script type="application/ld+json" set:html={JSON.stringify(breadcrumbSchema)} />
|
||||
)}
|
||||
|
||||
{blogPostingSchema && (
|
||||
<script type="application/ld+json" set:html={JSON.stringify(blogPostingSchema)} />
|
||||
)}
|
||||
|
||||
{serviceSchema && (
|
||||
<script type="application/ld+json" set:html={JSON.stringify(serviceSchema)} />
|
||||
)}
|
||||
|
||||
{webPageSchema && (
|
||||
<script type="application/ld+json" set:html={JSON.stringify(webPageSchema)} />
|
||||
)}
|
||||
|
||||
{faqPageSchema && (
|
||||
<script type="application/ld+json" set:html={JSON.stringify(faqPageSchema)} />
|
||||
)}
|
||||
|
||||
{aboutPageSchema && (
|
||||
<script type="application/ld+json" set:html={JSON.stringify(aboutPageSchema)} />
|
||||
)}
|
||||
|
||||
{contactPageSchema && (
|
||||
<script type="application/ld+json" set:html={JSON.stringify(contactPageSchema)} />
|
||||
)}
|
||||
Reference in New Issue
Block a user