Chalarangelo/30-seconds-of-code

View on GitHub
src/blocks/utilities/schemer.js

Summary

Maintainability
A
0 mins
Test Coverage
import settings from '#settings/global';

const { websiteUrl, ownerName, ownerUrl } = settings;
const orgLogoSrc = '/assets/30s-icon.png';

/**
 * Utility for generating structured data for pages.
 */
export class Schemer {
  static generateSnippetData = ({
    title,
    slug,
    description,
    cover,
    dateModified,
  }) => {
    const url = `${websiteUrl}${slug}`;
    const coverSrc = cover ? cover.replace('.jpg', '.webp') : orgLogoSrc;

    return {
      '@context': 'https://schema.org',
      '@type': 'TechArticle',
      name: title,
      url,
      mainEntityOfPage: { '@type': 'WebPage', '@id': url },
      headline: title,
      description,
      image: `${websiteUrl}${coverSrc}`,
      datePublished: dateModified,
      dateModified,
      publisher: { '@type': 'Person', name: ownerName, url: ownerUrl },
    };
  };

  static generateListingData = ({ title, slug, pageNumber, items }) => {
    const name = pageNumber === 1 ? title : `${title} - Page ${pageNumber}`;
    const url = `${websiteUrl}${slug}`;

    return {
      '@context': 'https://schema.org',
      '@type': 'ItemList',
      name,
      url,
      mainEntityOfPage: { '@type': 'WebPage', '@id': url },
      numberOfItems: items.length,
      itemListElement: items.map((li, i) => ({
        '@type': 'ListItem',
        position: i + 1,
        url: `${websiteUrl}${li.url}`,
        name: li.title,
      })),
    };
  };

  static generateHomeData = () => {
    return {
      '@context': 'https://schema.org',
      '@type': 'WebSite',
      url: websiteUrl,
    };
  };
}