40 lines
1.2 KiB
JavaScript
40 lines
1.2 KiB
JavaScript
import { readFile } from 'node:fs/promises';
|
|
import path from 'node:path';
|
|
import { fail, pass, repositoryRoot } from './lib.mjs';
|
|
|
|
const errors = [];
|
|
const metadata = await readFile(
|
|
path.join(repositoryRoot, 'src', 'lib', 'metadata', 'build-metadata.ts'),
|
|
'utf8',
|
|
);
|
|
const homepage = await readFile(
|
|
path.join(repositoryRoot, 'src', 'app', '[locale]', 'page.tsx'),
|
|
'utf8',
|
|
);
|
|
const pending = await readFile(
|
|
path.join(repositoryRoot, 'src', 'app', '[locale]', '[slug]', 'page.tsx'),
|
|
'utf8',
|
|
);
|
|
|
|
for (const required of [
|
|
'alternates',
|
|
'canonical',
|
|
'hreflangMap',
|
|
'openGraph',
|
|
'alternateLocale',
|
|
'twitter',
|
|
'robots',
|
|
]) {
|
|
if (!metadata.includes(required)) errors.push(`Metadata foundation omits ${required}.`);
|
|
}
|
|
if (!homepage.includes("routeId: 'home'")) errors.push('Homepage metadata is not route-ID driven.');
|
|
if (!pending.includes('indexable: false')) {
|
|
errors.push('Unapproved route shells must remain noindex.');
|
|
}
|
|
if (/application\/ld\+json|aggregateRating|priceCurrency/.test(metadata + homepage + pending)) {
|
|
errors.push('Unsupported structured data or pricing metadata was introduced.');
|
|
}
|
|
|
|
if (errors.length) fail(errors);
|
|
else pass('Localized canonical, hreflang, Open Graph, social, and robots foundations are present.');
|