import { createHash } from 'node:crypto'; import { lstat, readFile, readdir } from 'node:fs/promises'; import { dirname, relative, resolve, sep } from 'node:path'; import { fileURLToPath, pathToFileURL } from 'node:url'; import { loadProductionInputs } from '../src/content/load-production-inputs.ts'; import { createPageMetadata, createStaticHostArtifacts } from '../src/content/metadata.ts'; import { Window } from 'happy-dom'; import { parseArtifactContract, parseBuildAuthority } from './build-contract.mjs'; import { parseExactConfigArgument } from './config-argument.mjs'; const scriptPath = fileURLToPath(import.meta.url); const repositoryRoot = resolve(dirname(scriptPath), '..'); const canonicalSectionIds = [ 'start', 'profile', 'experience', 'infrastructure', 'selected-builds', 'additional-work', 'toolkit', 'contact', ]; const prohibitedSurfaces = [ /__PORTFOLIO_INPUTS__/iu, /(?:evidenceId|sourcePath|sourceFingerprint|approvalOwner|privacyClassification|denylist|originalFilename)/iu, /sourceMappingURL/iu, ]; const escapeRegularExpression = (value) => value.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&'); const escapeHtml = (value) => value .replace(/&/gu, '&') .replace(//gu, '>') .replace(/"/gu, '"'); const readRequiredText = async (root, name) => { try { return await readFile(resolve(root, name), 'utf8'); } catch (error) { if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT') { throw new Error(`Missing required artifact: ${name}`); } throw error; } }; const listArtifacts = async (root) => { const rootStats = await lstat(root); if (rootStats.isSymbolicLink() || !rootStats.isDirectory()) { throw new Error('Artifact root must be a non-symlink directory.'); } const files = []; for (const entry of await readdir(root, { withFileTypes: true })) { const entryPath = resolve(root, entry.name); if (entry.isSymbolicLink()) throw new Error(`Unexpected linked artifact: ${entry.name}`); if (entry.isDirectory()) { if (entry.name !== 'assets') throw new Error(`Unexpected artifact directory: ${entry.name}`); for (const asset of await readdir(entryPath, { withFileTypes: true })) { if (asset.isSymbolicLink() || !asset.isFile()) { throw new Error(`Unexpected linked or nested artifact: assets/${asset.name}`); } files.push(`assets/${asset.name}`); } continue; } if (!entry.isFile()) throw new Error(`Unexpected special artifact: ${entry.name}`); files.push(entry.name); } return files.sort(); }; const assertArtifactInventory = (files, inputs, contract) => { const expectedRootFiles = new Set(['index.html', 'robots.txt', '_headers.example', '_redirects.example']); if (inputs.site.environment === 'production') expectedRootFiles.add('sitemap.xml'); const expectedAssets = new Set(contract.files.map((record) => record.path)); const expectedPublicAssets = inputs.manifest.assets.map((asset) => `assets/${asset.fileName}`).sort(); if (contract.buildId !== inputs.site.buildId || JSON.stringify(contract.publicAssets) !== JSON.stringify(expectedPublicAssets)) { throw new Error('Artifact contract does not match the validated production inputs.'); } for (const file of files) { if (file.endsWith('.map')) throw new Error(`Source map artifact is prohibited: ${file}`); if (file.startsWith('assets/')) { if (!expectedAssets.has(file)) throw new Error(`Unexpected artifact outside trusted contract: ${file}`); } else if (!expectedRootFiles.has(file)) { if (inputs.site.environment === 'preview' && file === 'sitemap.xml') { throw new Error('Preview artifacts must not publish a sitemap.'); } throw new Error(`Unexpected artifact: ${file}`); } } for (const required of [...expectedRootFiles, ...expectedAssets]) { if (!files.includes(required)) throw new Error(`Missing required artifact: ${required}`); } }; const assertArtifactDigests = async (root, contract) => { for (const record of contract.files) { const digest = createHash('sha256').update(await readFile(resolve(root, record.path))).digest('hex'); if (digest !== record.sha256) throw new Error(`Artifact digest does not match trusted contract: ${record.path}`); } }; const sortedAttributeValues = (elements, attribute) => [...elements].map((element) => element.getAttribute(attribute)).filter((value) => value !== null).sort(); const assertTrustedHtmlAssets = (html, contract) => { const window = new Window(); try { window.document.write(html); const scripts = [...window.document.querySelectorAll('script')]; const jsonLd = scripts.filter((script) => script.type === 'application/ld+json' && !script.hasAttribute('src')); const snapshot = scripts.filter((script) => script.id === 'portfolio-inputs' && script.type === 'application/json' && !script.hasAttribute('src')); const modules = scripts.filter((script) => script.type === 'module' && script.getAttribute('src') === `/${contract.entryModule}`); if (scripts.length !== 3 || jsonLd.length !== 1 || snapshot.length !== 1 || modules.length !== 1) { throw new Error('Unexpected executable script outside the exact JSON-LD, inert snapshot, and trusted client module set.'); } const preloads = sortedAttributeValues(window.document.querySelectorAll('link[rel="modulepreload"]'), 'href'); const expectedPreloads = contract.modulePreloads.map((path) => `/${path}`).sort(); if (JSON.stringify(preloads) !== JSON.stringify(expectedPreloads)) { throw new Error('Final HTML module preload set does not match the trusted contract.'); } const styles = sortedAttributeValues(window.document.querySelectorAll('link[rel="stylesheet"]'), 'href'); const expectedStyles = contract.styles.map((path) => `/${path}`).sort(); if (JSON.stringify(styles) !== JSON.stringify(expectedStyles)) { throw new Error('Final HTML style set does not match the trusted contract.'); } } finally { window.close(); } }; const assertNoProhibitedSurfaces = async (root, files) => { for (const file of files) { const bytes = await readFile(resolve(root, file)); const text = bytes.toString('utf8'); for (const pattern of prohibitedSurfaces) { if (pattern.test(text)) throw new Error(`Prohibited surface detected in ${file}.`); } } }; const exactlyOneMatch = (text, expression, label) => { const matches = [...text.matchAll(expression)]; if (matches.length !== 1) throw new Error(`Expected exactly one ${label}.`); return matches[0]; }; const excludedSemanticContainers = new Set(['SCRIPT', 'STYLE', 'TEMPLATE', 'NOSCRIPT']); const isVisibleSemanticNode = (node, appRoot) => { if (!node.isConnected || !appRoot.contains(node)) return false; let element = node.nodeType === 1 ? node : node.parentElement; while (element !== null) { if (excludedSemanticContainers.has(element.tagName) || element.hasAttribute('hidden') || element.hasAttribute('inert') || element.getAttribute('aria-hidden') === 'true' || element.style?.display === 'none' || element.style?.visibility === 'hidden') { return false; } if (element === appRoot) return true; element = element.parentElement; } return false; }; const visibleText = (node, appRoot) => { if (node.nodeType === 3) return isVisibleSemanticNode(node, appRoot) ? node.textContent ?? '' : ''; if (node.nodeType === 1 && !isVisibleSemanticNode(node, appRoot)) return ''; return [...node.childNodes].map((child) => visibleText(child, appRoot)).join(''); }; const assertSemanticHtml = (html, inputs, contract) => { const window = new Window(); try { window.document.write(html); const document = window.document; if (document.documentElement.lang !== 'en') throw new Error('Final HTML must declare lang=en.'); const appRoots = [...document.querySelectorAll('#app')]; if (appRoots.length !== 1 || !isVisibleSemanticNode(appRoots[0], appRoots[0])) { throw new Error('Expected one connected visible semantic #app root.'); } const appRoot = appRoots[0]; const h1s = [...appRoot.querySelectorAll('h1')].filter((node) => isVisibleSemanticNode(node, appRoot)); if (h1s.length !== 1 || h1s[0].textContent !== inputs.content.identity.name) { throw new Error('Expected exactly one visible H1 with the canonical identity.'); } const role = h1s[0].nextElementSibling; if (role === null || !isVisibleSemanticNode(role, appRoot) || role.textContent !== inputs.content.identity.role) { throw new Error('Expected the visible canonical role immediately after the H1.'); } const navigations = [...appRoot.querySelectorAll('nav[aria-label="Portfolio sections"]')] .filter((node) => isVisibleSemanticNode(node, appRoot)); if (navigations.length !== 1) throw new Error('Expected exactly one visible navigation.'); const navigationLinks = [...navigations[0].querySelectorAll('a')] .filter((node) => isVisibleSemanticNode(node, appRoot)); if (JSON.stringify(navigationLinks.map((link) => link.getAttribute('href'))) !== JSON.stringify(canonicalSectionIds.map((id) => `#${id}`))) { throw new Error('Visible navigation does not contain the exact canonical native links.'); } const sections = [...appRoot.querySelectorAll('main > section')] .filter((node) => isVisibleSemanticNode(node, appRoot)); if (JSON.stringify(sections.map((section) => section.id)) !== JSON.stringify(canonicalSectionIds)) { throw new Error('Visible sections do not match the eight canonical sections.'); } for (const section of sections) { const label = inputs.content.navigation.find((item) => item.id === section.id)?.label; const headings = [...section.querySelectorAll(':scope > h2')] .filter((node) => isVisibleSemanticNode(node, appRoot)); if (label === undefined || headings.length !== 1 || headings[0].id !== `${section.id}-heading` || headings[0].textContent !== label.toUpperCase()) { throw new Error(`Missing visible section heading: ${section.id}`); } } const semanticText = visibleText(appRoot, appRoot); const requiredVisibleCopy = [ inputs.content.systemsOperations.title, inputs.content.infrastructure.title, ...inputs.content.infrastructure.bands.flatMap((band) => [band.title, band.summary]), ...inputs.content.projects.selected.flatMap((project) => [project.title, project.summary]), ...inputs.content.toolkit.flatMap((group) => [group.title, ...group.technologies.map((technology) => technology.name)]), inputs.content.contact.email, ]; for (const copy of requiredVisibleCopy) { if (!semanticText.includes(copy)) throw new Error(`Missing visible semantic evidence: ${copy}`); } const mailLinks = [...appRoot.querySelectorAll(`a[href="mailto:${inputs.content.contact.email}"]`)] .filter((node) => isVisibleSemanticNode(node, appRoot)); if (mailLinks.length !== 1 || mailLinks[0].textContent !== inputs.content.contact.email) { throw new Error('Missing visible semantic mailto contact link.'); } const moduleScript = document.querySelector(`script[type="module"][src="/${contract.entryModule}"]`); const snapshot = document.querySelector('script#portfolio-inputs[type="application/json"]'); if (moduleScript === null || snapshot === null || (appRoot.compareDocumentPosition(moduleScript) & window.Node.DOCUMENT_POSITION_FOLLOWING) === 0 || (snapshot.compareDocumentPosition(moduleScript) & window.Node.DOCUMENT_POSITION_FOLLOWING) === 0) { throw new Error('Connected visible semantic content and snapshot must precede the trusted module script.'); } let parsedSnapshot; try { parsedSnapshot = JSON.parse(snapshot.textContent ?? ''); } catch { throw new Error('The inert input snapshot is malformed.'); } if (JSON.stringify(parsedSnapshot) !== JSON.stringify(inputs)) { throw new Error('Hydration snapshot does not match the server input bytes and meaning.'); } } finally { window.close(); } }; const assertMetadata = (html, inputs) => { const expectedTitle = escapeHtml(inputs.content.metadata.title); const title = exactlyOneMatch(html, /