next.js/test/e2e/app-dir/metadata-static-file/utils.ts
utils.ts81 lines2.3 KB
// @ts-nocheck - On isolated test, this will be a type error.
import type { Playwright } from '../../../lib/next-webdriver'

async function getMetadataLinks(browser: Playwright) {
  const links = await browser.locator('link').evaluateAll((elements: any[]) => {
    return elements
      .filter((el) => {
        if (el.href.includes('/_next/static')) {
          return false
        }

        return [
          '/favicon.ico',
          '/manifest.json',
          '/manifest.webmanifest',
          // Below may have suffixes like /icon1.png, /icon2.png, etc.
          // Or has suffixes like /icon-xxxxxx.png, /icon-image-yyyyyy.jpg, etc.
          '/icon',
          '/apple-icon',
          '/opengraph-image',
          '/twitter-image',
        ].some((file) =>
          new URL(el.href, window.location.origin).pathname.includes(file)
        )
      })
      .map((el) => ({
        href: new URL(el.href, window.location.origin).pathname,
        rel: el.rel,
        ...(el.type && { type: el.type }),
      }))
      .sort((a, b) => a.href.localeCompare(b.href))
  })
  return links
}

async function getMetadataMetas(browser: Playwright) {
  const metas = await browser.locator('meta').evaluateAll((elements: any[]) => {
    return elements
      .filter((meta) => {
        if (!meta.name && !meta.hasAttribute('property')) {
          return false
        }

        const attr = meta.name || meta.getAttribute('property') || ''
        return [
          'og:',
          'twitter:',
          'viewport',
          'description',
          'keywords',
          'robots',
        ].some(
          (prefix) => attr.startsWith(prefix) || attr === prefix.slice(0, -1)
        )
      })
      .map((el) => ({
        ...(el.name && { name: el.name }),
        ...(el.hasAttribute('property') && {
          property: el.getAttribute('property'),
        }),
      }))
      .sort((a, b) => {
        if (a.name && !b.name) return -1
        if (!a.name && b.name) return 1
        return (a.name || a.property || '').localeCompare(
          b.name || b.property || ''
        )
      })
  })
  return metas
}

export async function getCommonMetadataHeadTags(browser: Playwright) {
  const [links, metas] = await Promise.all([
    getMetadataLinks(browser),
    getMetadataMetas(browser),
  ])

  return { links, metas }
}
Quest for Codev2.0.0
/
SIGN IN