@brandlab-digital/conformance 3.3.3 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/current-release.js +6 -6
- package/dist/current-release.js.map +1 -1
- package/dist/engineering.d.ts +4 -1
- package/dist/engineering.d.ts.map +1 -1
- package/dist/engineering.js +10 -7
- package/dist/engineering.js.map +1 -1
- package/dist/estate.d.ts +38 -1
- package/dist/estate.d.ts.map +1 -1
- package/dist/estate.js +201 -6
- package/dist/estate.js.map +1 -1
- package/dist/families-e2e.d.ts +21 -0
- package/dist/families-e2e.d.ts.map +1 -1
- package/dist/families-e2e.js +69 -1
- package/dist/families-e2e.js.map +1 -1
- package/dist/hosting.d.ts +27 -0
- package/dist/hosting.d.ts.map +1 -0
- package/dist/hosting.js +193 -0
- package/dist/hosting.js.map +1 -0
- package/dist/page-standard.d.ts +198 -0
- package/dist/page-standard.d.ts.map +1 -0
- package/dist/page-standard.js +536 -0
- package/dist/page-standard.js.map +1 -0
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +14 -0
- package/dist/project.js.map +1 -1
- package/dist/rule-registry.d.ts +10 -0
- package/dist/rule-registry.d.ts.map +1 -1
- package/dist/rule-registry.js +2 -0
- package/dist/rule-registry.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-standard.js","sourceRoot":"","sources":["../src/page-standard.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The Brandlab on-page and location standard (3.4.0) as pure checks over the\n * server HTML of a production build. The estate journey enforces the objective\n * ones; the page-quality journey reports the judgement ones without failing.\n *\n * Every function reads only the HTML a crawler receives before any script runs.\n */\n// Conformance compiles without the other packages (the operations evaluator builds it from source alone), so\n// the few site-core rules it needs are mirrored here; page-standard.test.ts keeps them identical to site-core.\n\n/** A suburb's centre in GDA2020 degrees (site-core/geography's nswSuburbCentres). */\nexport interface SuburbCentre {\n latitude: number;\n longitude: number;\n}\n\nexport type SuburbCentreLookup = (slug: string) => SuburbCentre | undefined;\n\n/** Great-circle distance in kilometres, as site-core's distanceBetweenCentresKm. */\nexport function distanceBetweenCentresKm(from: SuburbCentre, to: SuburbCentre): number {\n const radians = (degrees: number) => (degrees * Math.PI) / 180;\n const latitudeDelta = radians(to.latitude - from.latitude);\n const longitudeDelta = radians(to.longitude - from.longitude);\n const haversine =\n Math.sin(latitudeDelta / 2) ** 2 +\n Math.cos(radians(from.latitude)) * Math.cos(radians(to.latitude)) * Math.sin(longitudeDelta / 2) ** 2;\n return 2 * 6371.0088 * Math.asin(Math.min(1, Math.sqrt(haversine)));\n}\n\n/** The first place listed after a farther one, as site-core's findNeighbourOrderProblem. */\nexport function findNeighbourOrderProblem(\n origin: string,\n slugs: readonly string[],\n centreOf: SuburbCentreLookup,\n toleranceKm = 0.05,\n): { index: number; slug: string; previous: string; detail: string } | null {\n const from = centreOf(origin);\n if (!from) return null;\n let previous: { slug: string; distanceKm: number } | undefined;\n for (const [index, slug] of slugs.entries()) {\n const to = centreOf(slug);\n if (!to) continue;\n const current = { slug, distanceKm: distanceBetweenCentresKm(from, to) };\n if (previous && current.distanceKm + toleranceKm < previous.distanceKm) {\n return {\n index,\n slug,\n previous: previous.slug,\n detail: `${slug} (${current.distanceKm.toFixed(1)} km) is listed after ${previous.slug} (${previous.distanceKm.toFixed(1)} km); nearby places are ranked nearest first`,\n };\n }\n previous = current;\n }\n return null;\n}\n\nexport type BrandlabSitemapFamily = 'core' | 'services' | 'locations' | 'service-locations' | 'blog' | 'projects';\n\nconst SITEMAP_FAMILY_BY_KIND: Readonly<Record<string, BrandlabSitemapFamily>> = Object.freeze({\n service: 'services',\n location: 'locations',\n 'service-location': 'service-locations',\n 'blog-post': 'blog',\n project: 'projects',\n});\n\n/** The split sitemap family of a route kind, as site-core's sitemapFamilyForKind. */\nexport function sitemapFamilyForKind(kind: string): BrandlabSitemapFamily {\n return Object.hasOwn(SITEMAP_FAMILY_BY_KIND, kind) ? SITEMAP_FAMILY_BY_KIND[kind]! : 'core';\n}\n\n// ---------------------------------------------------------------------------\n// Location index policy (mirrors site-core/location-policy)\n// ---------------------------------------------------------------------------\n\nexport interface LocationPolicyRoute {\n id?: string;\n path: string;\n kind?: string;\n indexing: string;\n locationDecision?: { evidence?: readonly string[]; review?: string };\n}\n\n/** A capacity recorded with site-core's defineLocationCapacity. */\nexport interface LocationCapacityRecord {\n limit: number;\n recordedAt: string;\n indexableAtRecord: number;\n approval?: { approvedBy: string; approvedAt: string; reviewBy: string; maxIndexable?: number };\n}\n\nconst LOCATION_ROUTE_KINDS = new Set(['location', 'service-location']);\n\nfunction isIndexableLocationRoute(route: LocationPolicyRoute): boolean {\n return LOCATION_ROUTE_KINDS.has(route.kind ?? '') && route.indexing === 'index';\n}\n\n/** As site-core's checkLocationCapacity: blocked only beyond both the limit and the pages at record (or the approval). */\nexport function checkLocationCapacity(\n routes: readonly LocationPolicyRoute[],\n capacity: LocationCapacityRecord | null | undefined,\n): { indexable: number; limit: number | null; allowed: number | null; overCapacity: boolean; blocked: boolean; detail: string } {\n const indexable = routes.filter(isIndexableLocationRoute).length;\n if (!capacity) {\n return { indexable, limit: null, allowed: null, overCapacity: false, blocked: false, detail: `${indexable} indexable location page(s); no location capacity is recorded yet.` };\n }\n const approval = capacity.approval;\n const allowed = approval ? approval.maxIndexable ?? Number.POSITIVE_INFINITY : Math.max(capacity.limit, capacity.indexableAtRecord);\n const overCapacity = indexable > capacity.limit;\n const blocked = indexable > allowed;\n const approved = approval ? ` under ${approval.approvedBy}'s approval of ${approval.approvedAt} (review by ${approval.reviewBy})` : '';\n const detail = blocked\n ? `${indexable} indexable location page(s) exceed what the site may carry (${allowed}: capacity ${capacity.limit} recorded ${capacity.recordedAt} with ${capacity.indexableAtRecord} at record${approved}). Add pages only within capacity, or record Romie's approval.`\n : overCapacity\n ? `${indexable} indexable location page(s) against a capacity of ${capacity.limit} (recorded ${capacity.recordedAt})${approved}; no pages may be added.`\n : `${indexable} indexable location page(s) within a capacity of ${capacity.limit} (recorded ${capacity.recordedAt}).`;\n return { indexable, limit: capacity.limit, allowed: Number.isFinite(allowed) ? allowed : null, overCapacity, blocked, detail };\n}\n\n/** As site-core's buildLocationReviewList: indexable location pages without evidence or with an open review flag. */\nexport function buildLocationReviewList(\n routes: readonly LocationPolicyRoute[],\n): { id?: string; path: string; evidence: readonly string[]; reasons: readonly string[] }[] {\n const items: { id?: string; path: string; evidence: readonly string[]; reasons: readonly string[] }[] = [];\n for (const route of routes) {\n if (!isIndexableLocationRoute(route)) continue;\n const evidence = route.locationDecision?.evidence ?? [];\n const reasons: string[] = [];\n if (evidence.length === 0) {\n reasons.push('no qualifying evidence recorded (job, base suburb, facts and demand, existing clicks or enquiries, or an approved exception)');\n }\n const review = route.locationDecision?.review?.trim();\n if (review) reasons.push(review);\n if (reasons.length > 0) items.push({ ...(route.id ? { id: route.id } : {}), path: route.path, evidence, reasons });\n }\n return items.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n// ---------------------------------------------------------------------------\n// Geography, loaded from the site's installed site-core at run time\n// ---------------------------------------------------------------------------\n\ninterface GeographyRecord {\n slug: string;\n name: string;\n}\n\ninterface GeographyRegistryLike {\n suburbs: readonly GeographyRecord[];\n nonSuburbLocalities: readonly GeographyRecord[];\n councils: readonly GeographyRecord[];\n regions: readonly (GeographyRecord & { seoName: string; alternateNames?: readonly string[] })[];\n subRegions: readonly GeographyRecord[];\n}\n\nexport interface BrandlabGeography {\n centreOf: SuburbCentreLookup;\n /** Registry place names by slug: suburbs, localities, regions and sub-regions. */\n placeNames: ReadonlyMap<string, string>;\n /** Masks every registry place name and postcode. */\n maskPlaces: (text: string) => string;\n}\n\n// A variable specifier: the module is the site's own site-core (3.4.0 or later), resolved when a journey runs.\nconst GEOGRAPHY_MODULE: string = '@brandlab-digital/site-core/geography';\nlet geography: Promise<BrandlabGeography> | undefined;\n\n/** The suburb centres and place names of the site's installed site-core geography. */\nexport function loadBrandlabGeography(): Promise<BrandlabGeography> {\n geography ??= (import(GEOGRAPHY_MODULE) as Promise<{\n getSuburbCentre?: SuburbCentreLookup;\n sydneyGeography: GeographyRegistryLike;\n centralCoastGeography: GeographyRegistryLike;\n }>).then((module) => {\n if (typeof module.getSuburbCentre !== 'function') {\n throw new Error('@brandlab-digital/site-core/geography has no getSuburbCentre: install site-core 3.4.0 or later with the conformance package.');\n }\n const registries = [module.sydneyGeography, module.centralCoastGeography];\n const placeNames = new Map<string, string>();\n const names: string[] = [];\n for (const registry of registries) {\n for (const record of [...registry.suburbs, ...registry.nonSuburbLocalities, ...registry.regions, ...registry.subRegions]) {\n if (!placeNames.has(record.slug)) placeNames.set(record.slug, record.name);\n }\n for (const record of [...registry.suburbs, ...registry.nonSuburbLocalities, ...registry.councils, ...registry.subRegions]) names.push(record.name);\n for (const region of registry.regions) names.push(region.name, region.seoName, ...(region.alternateNames ?? []));\n }\n return { centreOf: module.getSuburbCentre, placeNames, maskPlaces: createPlaceMask(names) };\n });\n return geography;\n}\n\n// ---------------------------------------------------------------------------\n// Structured data\n// ---------------------------------------------------------------------------\n\n/** Types that describe the business itself; a rating on them is a self-serving rating. */\nexport const BUSINESS_SCHEMA_TYPES = new Set([\n 'LocalBusiness', 'HomeAndConstructionBusiness', 'GeneralContractor', 'Plumber', 'Electrician',\n 'RoofingContractor', 'HousePainter', 'Locksmith', 'MovingCompany', 'HVACBusiness', 'ProfessionalService',\n 'Organization', 'Corporation', 'EmergencyService',\n]);\nconst RETIRED_RICH_RESULT_TYPES = new Set(['FAQPage', 'HowTo']);\n\nexport interface StructuredDataCheckOptions {\n origin: string;\n /** The home route: it must carry a WebSite node naming the site and its URL. */\n home: boolean;\n /** The business node's @id (default `<origin>/#business`). */\n businessId?: string | false;\n /** The business facts record: the business node's name and telephone must match it. */\n business?: { name?: string; telephone?: string };\n}\n\nfunction schemaTypes(node: Record<string, unknown>): string[] {\n return ([] as unknown[]).concat(node['@type'] ?? []).map((type) => String(type).replace(/^(?:https?:\\/\\/)?schema\\.org\\//i, ''));\n}\n\nfunction collectNodes(payloads: readonly unknown[]): Record<string, unknown>[] {\n const nodes: Record<string, unknown>[] = [];\n const visit = (value: unknown) => {\n if (!value || typeof value !== 'object') return;\n if (Array.isArray(value)) {\n value.forEach(visit);\n return;\n }\n const node = value as Record<string, unknown>;\n nodes.push(node);\n Object.values(node).forEach(visit);\n };\n payloads.forEach(visit);\n return nodes;\n}\n\nfunction digits(value: unknown): string {\n return String(value ?? '').replace(/\\D/g, '').replace(/^61/, '0');\n}\n\n/**\n * The structured-data rules a crawler can check on one page: no FAQPage or\n * HowTo, no rating on the business itself, a WebSite node with name and url on\n * the homepage, and the business name and telephone matching the facts record.\n */\nexport function structuredDataProblems(payloads: readonly unknown[], options: StructuredDataCheckOptions): string[] {\n const problems: string[] = [];\n const nodes = collectNodes(payloads);\n const businessId = options.businessId === undefined ? `${options.origin}/#business` : options.businessId;\n for (const node of nodes) {\n const types = schemaTypes(node);\n const retired = types.find((type) => RETIRED_RICH_RESULT_TYPES.has(type));\n if (retired) problems.push(`JSON-LD declares ${retired}; FAQ and HowTo markup is no longer used`);\n const isBusiness = types.some((type) => BUSINESS_SCHEMA_TYPES.has(type)) || (businessId !== false && node['@id'] === businessId && types.length > 0);\n if (!isBusiness) continue;\n if (node.aggregateRating !== undefined || node.review !== undefined || node.reviews !== undefined) {\n problems.push(`JSON-LD rates the business itself (${String(node['@id'] ?? types.join('/'))} has ${node.aggregateRating !== undefined ? 'aggregateRating' : 'review'}); stars are not allowed for the business's own rating`);\n }\n if (options.business && (businessId === false || node['@id'] === businessId)) {\n const { name, telephone } = options.business;\n if (name && typeof node.name === 'string' && node.name.trim() !== name.trim()) {\n problems.push(`JSON-LD business name \"${node.name}\" does not match the business facts (\"${name}\")`);\n }\n if (telephone && node.telephone !== undefined && digits(node.telephone) !== digits(telephone)) {\n problems.push(`JSON-LD business telephone ${String(node.telephone)} does not match the business facts (${telephone})`);\n }\n }\n }\n if (options.home) {\n const website = nodes.find((node) => schemaTypes(node).includes('WebSite'));\n const expected = new URL('/', options.origin).href;\n if (!website) {\n problems.push('the homepage JSON-LD has no WebSite node (name and url) for the site name');\n } else {\n if (typeof website.name !== 'string' || !website.name.trim()) problems.push('the homepage WebSite node has no name');\n const url = typeof website.url === 'string' ? safeHref(website.url, options.origin) : null;\n if (!url || url.replace(/\\/$/, '') !== expected.replace(/\\/$/, '')) {\n problems.push(`the homepage WebSite node's url is ${String(website.url ?? 'missing')} (expected ${expected})`);\n }\n }\n }\n return [...new Set(problems)];\n}\n\nfunction safeHref(value: string, base: string): string | null {\n try {\n return new URL(value, base).href;\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Sitemaps\n// ---------------------------------------------------------------------------\n\nexport interface SitemapUrlEntry {\n url: string;\n lastmod?: string;\n}\n\nexport interface SitemapFile {\n path: string;\n entries: readonly SitemapUrlEntry[];\n}\n\nexport function parseSitemapEntries(xml: string): SitemapUrlEntry[] {\n return [...xml.matchAll(/<url>([\\s\\S]*?)<\\/url>/gi)].flatMap((match) => {\n const loc = /<loc>\\s*([^<\\s]+)\\s*<\\/loc>/i.exec(match[1]!)?.[1];\n if (!loc) return [];\n const lastmod = /<lastmod>\\s*([^<\\s]+)\\s*<\\/lastmod>/i.exec(match[1]!)?.[1];\n return [{ url: new URL(decodeXml(loc)).href, ...(lastmod ? { lastmod: decodeXml(lastmod) } : {}) }];\n });\n}\n\nexport interface SitemapRoute {\n path: string;\n canonicalPath?: string;\n kind?: string;\n indexing: string;\n lastSignificantChange?: string;\n}\n\n/**\n * Whether the sitemap is split by page family (services, locations,\n * service-in-suburb, blog, projects and the rest) once the catalogue's\n * indexable pages span more than one family, each file holding one family.\n */\nexport function sitemapFamilyProblems(input: {\n index: boolean;\n files: readonly SitemapFile[];\n routes: readonly SitemapRoute[];\n origin: string;\n}): string[] {\n const familyOf = new Map<string, BrandlabSitemapFamily>();\n for (const route of input.routes) {\n if (route.indexing !== 'index') continue;\n familyOf.set(new URL(route.canonicalPath ?? route.path, `${input.origin}/`).href, sitemapFamilyForKind(route.kind ?? ''));\n }\n const families = new Set(familyOf.values());\n if (families.size <= 1) return [];\n if (!input.index) {\n return [`the sitemap is one file for ${families.size} page families (${[...families].sort().join(', ')}); split it by family (brandlab.config sitemap.mode 'split') so Search Console reports each family's coverage`];\n }\n const problems: string[] = [];\n for (const file of input.files) {\n const inFile = new Set(file.entries.map((entry) => familyOf.get(entry.url)).filter((family): family is BrandlabSitemapFamily => Boolean(family)));\n if (inFile.size > 1) problems.push(`${file.path} mixes page families (${[...inFile].sort().join(', ')}); each sitemap file holds one family`);\n }\n return problems;\n}\n\n/** Hours before the run in which a shared timestamp looks like the build, not a content change. */\nconst BUILD_WINDOW_HOURS = 48;\n\n/**\n * `lastmod` must date the content, never the build: it equals the route's\n * `lastSignificantChange` (and is absent without one), is never in the future,\n * and pages do not share one fresh timestamp.\n */\nexport function sitemapLastmodProblems(\n entries: readonly SitemapUrlEntry[],\n routes: readonly SitemapRoute[],\n origin: string,\n now = Date.now(),\n): string[] {\n const routeByUrl = new Map(routes.map((route) => [new URL(route.canonicalPath ?? route.path, `${origin}/`).href, route]));\n const problems: string[] = [];\n const recentTimestamps = new Map<string, number>();\n for (const entry of entries) {\n if (!entry.lastmod) continue;\n const time = Date.parse(entry.lastmod);\n if (Number.isNaN(time)) {\n problems.push(`${entry.url}: lastmod \"${entry.lastmod}\" is not a date`);\n continue;\n }\n if (time > now + 24 * 3_600_000) problems.push(`${entry.url}: lastmod ${entry.lastmod} is in the future`);\n const route = routeByUrl.get(entry.url);\n if (route && !route.lastSignificantChange) {\n problems.push(`${entry.url}: lastmod ${entry.lastmod} without a content date (the route has no lastSignificantChange)`);\n } else if (route?.lastSignificantChange && Date.parse(route.lastSignificantChange) !== time) {\n problems.push(`${entry.url}: lastmod ${entry.lastmod} is not the route's content date ${route.lastSignificantChange}`);\n }\n if (/T\\d{2}:\\d{2}/.test(entry.lastmod) && now - time >= 0 && now - time < BUILD_WINDOW_HOURS * 3_600_000) {\n recentTimestamps.set(entry.lastmod, (recentTimestamps.get(entry.lastmod) ?? 0) + 1);\n }\n }\n for (const [timestamp, count] of recentTimestamps) {\n if (count > 1) problems.push(`${count} URLs share the lastmod ${timestamp}, a timestamp from the last ${BUILD_WINDOW_HOURS} hours: lastmod must be the content date, not the build time`);\n }\n return problems;\n}\n\n// ---------------------------------------------------------------------------\n// HTML structure: main content, link groups and text blocks\n// ---------------------------------------------------------------------------\n\nconst VOID_ELEMENTS = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'source', 'track', 'wbr']);\nconst LIST_ELEMENTS = new Set(['ul', 'ol']);\nconst CONTAINER_ELEMENTS = new Set(['div', 'section', 'aside', 'article', 'p', 'dl', 'table', 'tbody', 'nav', 'main', 'figure']);\nconst CHROME_ELEMENTS = new Set(['header', 'footer', 'nav']);\n\nfunction stripInert(html: string): string {\n return html.replace(/<(script|style|template|noscript|svg)\\b[\\s\\S]*?<\\/\\1>/gi, ' ').replace(/<!--[\\s\\S]*?-->/g, ' ');\n}\n\n/** The page's main content: `<main>` when present, else the body. */\nexport function mainContent(html: string): string {\n const cleaned = stripInert(html);\n const main = /<main\\b[^>]*>([\\s\\S]*)<\\/main>/i.exec(cleaned)?.[1];\n if (main !== undefined) return main;\n return /<body\\b[^>]*>([\\s\\S]*?)(?:<\\/body>|$)/i.exec(cleaned)?.[1] ?? cleaned;\n}\n\ninterface OpenElement {\n tag: string;\n id: number;\n}\n\n/**\n * The links of the main content grouped by the list (or, outside a list, the\n * nearest container) that holds them, in document order; links inside a\n * header, footer or navigation block are left out.\n */\nexport function extractLinkGroups(html: string): string[][] {\n const content = mainContent(html);\n const stack: OpenElement[] = [];\n const groups = new Map<number, string[]>();\n let nextId = 1;\n for (const match of content.matchAll(/<(\\/?)([a-zA-Z][a-zA-Z0-9-]*)\\b([^>]*)>/g)) {\n const closing = match[1] === '/';\n const tag = match[2]!.toLowerCase();\n const attributes = match[3] ?? '';\n if (closing) {\n const index = stack.map((element) => element.tag).lastIndexOf(tag);\n if (index >= 0) stack.length = index;\n continue;\n }\n if (tag === 'a') {\n const href = /\\bhref=(?:\"([^\"]*)\"|'([^']*)')/i.exec(attributes);\n if (href && !stack.some((element) => CHROME_ELEMENTS.has(element.tag))) {\n const holder =\n [...stack].reverse().find((element) => LIST_ELEMENTS.has(element.tag)) ??\n [...stack].reverse().find((element) => CONTAINER_ELEMENTS.has(element.tag));\n const key = holder?.id ?? 0;\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(decodeXml(href[1] ?? href[2] ?? ''));\n }\n }\n if (VOID_ELEMENTS.has(tag) || attributes.trimEnd().endsWith('/')) continue;\n stack.push({ tag, id: nextId++ });\n }\n return [...groups.values()];\n}\n\n/** The most links a list may hold and still be a nearby list rather than a directory. */\nconst NEARBY_LIST_MAX = 12;\n\nexport interface NeighbourOrderInput {\n html: string;\n /** The page's own place slug. */\n origin: string;\n /** The page's absolute URL, which relative links resolve against. */\n pageUrl: string;\n /** The place slug a link's path names when it is a location page, else undefined. */\n placeOf: (path: string) => string | undefined;\n centreOf: SuburbCentreLookup;\n}\n\n/**\n * Nearby lists on a location page must be ranked by distance: any list of 3 to\n * 12 links to other places with a centre is checked; a directory longer than\n * that is not a nearby list.\n */\nexport function neighbourOrderProblems(input: NeighbourOrderInput): string[] {\n const problems: string[] = [];\n const base = new URL(input.pageUrl);\n for (const group of extractLinkGroups(input.html)) {\n const places: string[] = [];\n for (const href of group) {\n let url: URL;\n try {\n url = new URL(href, base);\n } catch {\n continue;\n }\n if (url.origin !== base.origin) continue;\n const place = input.placeOf(normalisePath(url.pathname));\n if (place && !places.includes(place)) places.push(place);\n }\n const located = places.filter((place) => place !== input.origin && input.centreOf(place));\n if (located.length < 3 || places.length > NEARBY_LIST_MAX) continue;\n const problem = findNeighbourOrderProblem(input.origin, located, input.centreOf);\n if (problem) problems.push(`nearby list [${located.join(', ')}] is not ranked by distance: ${problem.detail}`);\n }\n return problems;\n}\n\nconst BLOCK_TAGS = /<\\/?(?:p|li|h[1-6]|td|th|dt|dd|blockquote|figcaption|caption|div|section|article|aside|br|tr|summary|details|label|button)\\b[^>]*>/gi;\n\n/** The main content's text blocks (header, footer and navigation removed), lower-cased with whitespace collapsed. */\nexport function textBlocks(html: string): string[] {\n let content = mainContent(html);\n for (const tag of CHROME_ELEMENTS) content = content.replace(new RegExp(`<${tag}\\\\b[\\\\s\\\\S]*?<\\\\/${tag}>`, 'gi'), ' ');\n return decodeXml(content.replace(BLOCK_TAGS, '\\n').replace(/<[^>]+>/g, ' '))\n .replace(/ | /g, ' ')\n .split('\\n')\n .map((block) => block.toLowerCase().replace(/\\s+/g, ' ').trim())\n .filter((block) => block.split(' ').length >= 3);\n}\n\n/** Masks place names and postcodes so name-swapped copy compares as the same text. */\nexport function createPlaceMask(names: readonly string[]): (text: string) => string {\n const unique = [...new Set(names.map((name) => name.trim().toLowerCase()).filter((name) => name.length >= 3))]\n .sort((a, b) => b.length - a.length)\n .map((name) => name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\s+/g, '\\\\s+'));\n const pattern = unique.length ? new RegExp(`\\\\b(?:${unique.join('|')})\\\\b`, 'g') : null;\n return (text) => (pattern ? text.replace(pattern, '{place}') : text).replace(/\\b2\\d{3}\\b/g, '{postcode}');\n}\n\nconst SHINGLE = 5;\n\nfunction shingles(words: readonly string[]): Set<string> {\n const result = new Set<string>();\n for (let index = 0; index + SHINGLE <= words.length; index += 1) result.add(words.slice(index, index + SHINGLE).join(' '));\n return result;\n}\n\nfunction words(text: string): string[] {\n return text.replace(/[^a-z0-9{}' -]+/g, ' ').split(/\\s+/).filter(Boolean);\n}\n\nexport interface SimilarityPage {\n path: string;\n place: string;\n /** Masked text blocks of the page's main content. */\n blocks: readonly string[];\n}\n\nexport interface SimilarityScore {\n path: string;\n /** Share of the page's five-word phrases also on its most similar near sibling: 0 nothing shared, 1 identical. */\n score: number;\n sibling: string | null;\n /** Words of page-specific text left after shared blocks are removed. */\n uniqueWords: number;\n}\n\n/**\n * Centerpiece similarity: shared blocks (on half or more of the location pages)\n * are removed, place names are masked, and each page's five-word phrases are\n * compared with its three nearest siblings that have a centre. Pages without a\n * centre are not scored.\n */\nexport function centerpieceSimilarity(\n pages: readonly SimilarityPage[],\n centreOf: SuburbCentreLookup,\n siblings = 3,\n): SimilarityScore[] {\n const located = pages.filter((page) => centreOf(page.place));\n if (located.length < 2) return [];\n const frequency = new Map<string, number>();\n for (const page of located) for (const block of new Set(page.blocks)) frequency.set(block, (frequency.get(block) ?? 0) + 1);\n const threshold = Math.max(2, Math.ceil(located.length / 2));\n const prepared = located.map((page) => {\n const unique = page.blocks.filter((block) => (frequency.get(block) ?? 0) < threshold);\n const tokens = unique.flatMap(words);\n return { page, tokens, shingles: shingles(tokens), centre: centreOf(page.place)! };\n });\n return prepared.map((current) => {\n const nearest = prepared\n .filter((other) => other !== current && other.page.place !== current.page.place)\n .map((other) => ({ other, distance: Math.hypot(other.centre.latitude - current.centre.latitude, (other.centre.longitude - current.centre.longitude) * Math.cos((current.centre.latitude * Math.PI) / 180)) }))\n .sort((a, b) => a.distance - b.distance)\n .slice(0, siblings);\n if (current.shingles.size === 0) {\n return { path: current.page.path, score: nearest.length ? 1 : 0, sibling: nearest[0]?.other.page.path ?? null, uniqueWords: current.tokens.length };\n }\n let best = { score: 0, sibling: null as string | null };\n for (const { other } of nearest) {\n let shared = 0;\n for (const phrase of current.shingles) if (other.shingles.has(phrase)) shared += 1;\n const score = shared / current.shingles.size;\n if (score > best.score) best = { score, sibling: other.page.path };\n }\n return { path: current.page.path, score: Math.round(best.score * 1000) / 1000, sibling: best.sibling, uniqueWords: current.tokens.length };\n });\n}\n\n/** Similarity at or above this is reported as a warning. */\nexport const SIMILARITY_WARN = 0.5;\n/** Similarity at or above this puts the page on the review list; it stays indexed. */\nexport const SIMILARITY_REVIEW = 0.7;\n\n// ---------------------------------------------------------------------------\n// Titles, headings, descriptions and page weight\n// ---------------------------------------------------------------------------\n\nexport const TITLE_MAX_LENGTH = 60;\nexport const DESCRIPTION_MIN_LENGTH = 70;\nexport const DESCRIPTION_MAX_LENGTH = 170;\nexport const HTML_MAX_BYTES = 1_048_576;\n\n/** Title format warnings: over 60 characters, more than one pipe, brackets, emoji, capitals or \"near me\". */\nexport function titleFormatProblems(title: string): string[] {\n const problems: string[] = [];\n const length = [...title].length;\n if (length > TITLE_MAX_LENGTH) problems.push(`${length} characters (keep to about ${TITLE_MAX_LENGTH})`);\n const pipes = title.split('|').length - 1;\n if (pipes > 1) problems.push(`${pipes} pipes (use one hyphen or colon as the separator)`);\n if (/[[\\](){}]/.test(title)) problems.push('brackets');\n if (/\\p{Extended_Pictographic}/u.test(title)) problems.push('emoji');\n const letters = title.replace(/[^A-Za-z]/g, '');\n if (letters.length >= 6 && letters === letters.toUpperCase()) problems.push('all capitals');\n else if (/\\b[A-Z]{5,}\\b/.test(title)) problems.push(`capitalised word ${/\\b[A-Z]{5,}\\b/.exec(title)![0]}`);\n if (/\\bnear (?:me|you)\\b/i.test(title)) problems.push('\"near me\" wording');\n return problems;\n}\n\nconst STOP_WORDS = new Set(['a', 'an', 'and', 'the', 'in', 'for', 'of', 'to', 'on', 'at', 'by', 'with', 'our', 'your', 'from', 'we', 'you', 'is', 'are', 'best', 'local', 'sydney-wide']);\n\nfunction contentWords(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/&/g, ' and ')\n .replace(/[^a-z0-9' ]+/g, ' ')\n .split(/\\s+/)\n .map((word) => word.replace(/'s$|'$/, '').replace(/(?<=[a-z]{3})s$/, ''))\n .filter((word) => word && !STOP_WORDS.has(word));\n}\n\n/** The title's primary phrase: the part before its first separator. */\nexport function primaryTitlePhrase(title: string): string {\n return title.split(/\\s+[|–—-]\\s+|:\\s+/)[0]!.trim();\n}\n\n/**\n * Whether the title and the H1 share the page's primary phrase: half or more of\n * the title's primary words appear in the H1, and the page's place (when it has\n * one) appears in both.\n */\nexport function titleHeadingProblems(title: string, h1: string, place?: string): string[] {\n const primary = contentWords(primaryTitlePhrase(title));\n const heading = new Set(contentWords(h1));\n const problems: string[] = [];\n if (primary.length > 0) {\n const shared = primary.filter((word) => heading.has(word)).length;\n if (shared / primary.length < 0.5) problems.push(`the H1 \"${h1}\" does not say what the title's primary phrase \"${primaryTitlePhrase(title)}\" says`);\n }\n if (place) {\n const pattern = new RegExp(`\\\\b${place.toLowerCase().replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/\\s+/g, '\\\\s+')}\\\\b`);\n if (!pattern.test(title.toLowerCase())) problems.push(`the title does not name ${place}`);\n if (!pattern.test(h1.toLowerCase())) problems.push(`the H1 does not name ${place}`);\n }\n return problems;\n}\n\nexport function descriptionLengthProblem(description: string): string | null {\n const length = [...description].length;\n if (length < DESCRIPTION_MIN_LENGTH) return `${length} characters (aim for ${DESCRIPTION_MIN_LENGTH}–${DESCRIPTION_MAX_LENGTH})`;\n if (length > DESCRIPTION_MAX_LENGTH) return `${length} characters (aim for ${DESCRIPTION_MIN_LENGTH}–${DESCRIPTION_MAX_LENGTH})`;\n return null;\n}\n\n/** The text of every H1 in the server HTML. */\nexport function headingTexts(html: string): string[] {\n return [...stripInert(html).matchAll(/<h1\\b[^>]*>([\\s\\S]*?)<\\/h1>/gi)].map((match) =>\n decodeXml(match[1]!.replace(/<[^>]+>/g, ' ')).replace(/\\s+/g, ' ').trim());\n}\n\nexport function normalisePath(path: string): string {\n const pathname = path.split(/[?#]/)[0] || '/';\n return pathname.length > 1 ? pathname.replace(/\\/+$/, '') : '/';\n}\n\nexport function decodeXml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'|'|'/g, \"'\");\n}\n"]}
|
package/dist/project.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
package/dist/project.js
CHANGED
|
@@ -80,6 +80,20 @@ const SOURCE_RULES = [
|
|
|
80
80
|
expected: "No self-serving aggregate rating schema.",
|
|
81
81
|
remediation: "Show verified review proof visibly without LocalBusiness or Organization rating schema.",
|
|
82
82
|
},
|
|
83
|
+
{
|
|
84
|
+
ruleId: "brandlab-source-faq-howto-schema",
|
|
85
|
+
surface: "schema",
|
|
86
|
+
pattern: /['"]@type['"]\s*:\s*['"](?:FAQPage|HowTo)['"]/,
|
|
87
|
+
expected: "No FAQPage or HowTo markup (FAQ rich results ended on 7 May 2026).",
|
|
88
|
+
remediation: "Keep the questions visible on the page and remove the FAQPage or HowTo node.",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
ruleId: "brandlab-sitemap-build-time-lastmod",
|
|
92
|
+
surface: "sitemap",
|
|
93
|
+
pattern: /\b(?:lastSignificantChange|lastModified)\s*:\s*(?:new\s+Date\(\s*\)|Date\.now\(\s*\))/,
|
|
94
|
+
expected: "Sitemap lastmod is the date the content last changed, never the build time.",
|
|
95
|
+
remediation: "Set lastSignificantChange from the page's content dates (latestContentDate from site-core/sitemaps).",
|
|
96
|
+
},
|
|
83
97
|
{
|
|
84
98
|
ruleId: "brandlab-source-synthetic-offer-schema",
|
|
85
99
|
surface: "schema",
|
package/dist/project.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { BRANDLAB_CURRENT_RUNTIME_RELEASE } from \"./current-release.js\";\nimport { verifyPackedPreflight, type PackedPreflight } from \"./packed-preflight.js\";\nimport {\n BRANDLAB_SHARED_PACKAGE_NAMES,\n compareBrandlabSemver,\n digestBrandlabAuthority,\n isBrandlabSemver,\n type BrandlabContractVersions,\n type BrandlabReleaseManifest,\n type BrandlabRuntimeReleaseContract,\n projectBrandlabRuntimeReleaseContract,\n validateBrandlabReleaseManifest,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\nimport {\n BRANDLAB_SOURCE_ROOT_DIRECTORIES,\n collectBrandlabSource,\n lineAt,\n readOptionalText,\n stripCommentsPreservingLayout,\n type BrandlabSourceIndex,\n} from \"./source-files.js\";\nimport {\n findContactContractRecipients,\n inspectStaticRules,\n recordEvaluation,\n staticFinding,\n} from \"./static-rules.js\";\nimport {\n applyBrandlabVerificationPolicy,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabOperationalFinding,\n type BrandlabRuleEvaluation,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationResult,\n} from \"./verification-policy.js\";\n\nexport {\n BRANDLAB_STATIC_RULES,\n matchesBrandlabStaticRule,\n type BrandlabStaticRule,\n} from \"./rule-registry.js\";\nexport {\n BRANDLAB_VERIFICATION_CHECKS,\n BRANDLAB_VERIFICATION_FAMILIES,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n checkForRule,\n type BrandlabRuleEvaluation,\n type BrandlabVerificationCheckId,\n type BrandlabVerificationCheckResult,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationEvidenceKind,\n type BrandlabVerificationFamilyId,\n type BrandlabVerificationFamilyResult,\n type BrandlabVerificationResult,\n type BrandlabVerificationStatus,\n} from \"./verification-policy.js\";\n\nexport const BRANDLAB_CONFORMANCE_SCHEMA_VERSION = \"brandlab.conformance.v2\";\nexport const BRANDLAB_CONFORMANCE_EVALUATOR_VERSION = \"current-only-v2\";\n\nconst RUNTIME_PACKAGE_FIELDS = [\n [\"next\", \"next\"],\n [\"react\", \"react\"],\n [\"react-dom\", \"reactDom\"],\n [\"typescript\", \"typescript\"],\n] as const;\n\nexport type BrandlabConformanceMode = \"local\" | \"ci\" | \"preflight\";\nexport type BrandlabFindingSeverity = \"blocker\" | \"warning\" | \"info\";\n\nexport interface BrandlabFinding {\n ruleId: string;\n surface: string;\n severity: BrandlabFindingSeverity;\n contract: { name: string; version: string };\n evidenceKind: \"static\" | \"behavioural\" | \"runtime\";\n path?: string;\n line?: number;\n expected: string;\n actual: string;\n remediation: string;\n}\n\nexport interface ConformanceSummary {\n status: \"pass\" | \"warning\" | \"blocked\";\n total: number;\n blockers: number;\n warnings: number;\n info: number;\n}\n\nexport interface BrandlabConformanceResult {\n packedPreflight?: PackedPreflight;\n schemaVersion: typeof BRANDLAB_CONFORMANCE_SCHEMA_VERSION;\n evaluatorVersion: typeof BRANDLAB_CONFORMANCE_EVALUATOR_VERSION;\n authorityDigest: string;\n contractDigest: string;\n implementationFingerprint: string;\n mode: BrandlabConformanceMode;\n installedRelease: string | null;\n findings: BrandlabFinding[];\n operationalFindings: BrandlabOperationalFinding[];\n verification: BrandlabVerificationResult;\n summary: ConformanceSummary;\n}\n\nexport interface EvaluateBrandlabProjectOptions {\n packedReleaseReceipt?: string;\n root: string;\n installedRelease?: string | null;\n mode?: BrandlabConformanceMode;\n release?: BrandlabRuntimeReleaseContract;\n releaseManifest?: BrandlabReleaseManifest;\n verificationEvidence?: readonly BrandlabVerificationEvidence[];\n}\n\ninterface ProjectPackageJsonLike {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n engines?: Record<string, string>;\n overrides?: Record<string, string>;\n packageManager?: string;\n}\n\ninterface LockedPackage {\n version: string | null;\n resolved: string | null;\n integrity: string | null;\n linked: boolean;\n}\n\ninterface PackageLockInspection {\n state: \"valid\" | \"missing\" | \"invalid\" | \"unsupported\";\n lockfileVersion: number | null;\n rootDependencies: Record<string, string>;\n rootDevDependencies: Record<string, string>;\n rootEngines: Record<string, string>;\n resolvedPackages: ReadonlyMap<string, LockedPackage>;\n sharpResolutions: readonly { path: string; version: string | null }[];\n fingerprint: Record<string, unknown>;\n}\n\ninterface SourceRule {\n ruleId: string;\n surface: string;\n pattern: RegExp;\n expected: string;\n remediation: string;\n actual?: string;\n}\n\nconst SOURCE_RULES: readonly SourceRule[] = [\n {\n ruleId: \"brandlab-source-retired-analytics-event\",\n surface: \"analytics\",\n pattern: /\\b(?:contact_form_submission|phone_call|phone_calls|form_start|form_submit|generate_lead|cta_click)\\b/,\n expected: \"Only the current Brandlab analytics event contract is used.\",\n remediation: \"Use contact_form for accepted forms and phone_link_click for telephone-link diagnostics.\",\n },\n {\n ruleId: \"brandlab-source-local-google-tag-bootstrap\",\n surface: \"analytics\",\n pattern: /googletagmanager\\.com\\/gtag\\/js|window\\.dataLayer\\s*=\\s*window\\.dataLayer|function\\s+gtag\\s*\\(/,\n expected: \"Google tag bootstrap is owned by the shared analytics runtime.\",\n remediation: \"Remove the project-local bootstrap and supply only approved analytics identifiers.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-delivery\",\n surface: \"contact\",\n pattern: /\\.emails\\.send\\s*\\(|resend\\.emails\\.send\\s*\\(/,\n expected: \"Email delivery is owned by the shared contact runtime.\",\n remediation: \"Pass the Resend client to the shared contact adapter instead of sending locally.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-email-renderer\",\n surface: \"contact\",\n pattern: /\\bContactFormEmail\\b|\\brenderContactEmail\\b/,\n expected: \"Contact email rendering is owned by the shared contact runtime.\",\n remediation: \"Remove the local email renderer and configure shared brand variation only.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-attachments\",\n surface: \"contact\",\n pattern: /from\\s+['\\\"]browser-image-compression['\\\"]|import\\s*\\(\\s*['\\\"]browser-image-compression['\\\"]\\s*\\)|(?:function|const)\\s+useContactAttachments\\b/,\n expected: \"Contact attachment preparation is owned by the shared contact runtime.\",\n remediation: \"Use useBrandlabContactAttachments from @brandlab-digital/site-next/contact/client.\",\n },\n {\n ruleId: \"brandlab-source-contact-draft-persistence\",\n surface: \"contact\",\n pattern: /(?:function|const)\\s+useFormDraftPersistence\\b/,\n expected: \"Contact details are not persisted in browser storage.\",\n remediation: \"Keep contact details in memory and clear them when the page closes.\",\n },\n {\n ruleId: \"brandlab-source-dangerously-set-inner-html\",\n surface: \"security\",\n pattern: /\\bdangerouslySetInnerHTML\\b/,\n expected: \"No project-owned raw HTML injection.\",\n remediation: \"Use structured React output or the shared sanitised renderer.\",\n },\n {\n ruleId: \"brandlab-source-raw-json-ld\",\n surface: \"schema\",\n pattern: /application\\/ld\\+json/,\n expected: \"Structured data is rendered through the shared schema component.\",\n remediation: \"Replace raw JSON-LD output with the shared schema graph renderer.\",\n },\n {\n ruleId: \"brandlab-source-self-serving-rating-schema\",\n surface: \"schema\",\n pattern: /['\"]AggregateRating['\"]/,\n expected: \"No self-serving aggregate rating schema.\",\n remediation: \"Show verified review proof visibly without LocalBusiness or Organization rating schema.\",\n },\n {\n ruleId: \"brandlab-source-synthetic-offer-schema\",\n surface: \"schema\",\n pattern: /\\bpriceValidUntil\\b|['\"]@type['\"]\\s*:\\s*['\"]Offer['\"]/,\n expected: \"No synthetic Offer markup on service pages.\",\n remediation: \"Remove invented Offer data and use the shared service schema.\",\n },\n {\n ruleId: \"brandlab-source-local-google-reviews-fetch\",\n surface: \"reviews\",\n pattern: /places\\.googleapis\\.com|maps\\.googleapis\\.com\\/maps\\/api\\/place/,\n expected: \"Google Places fetching is owned by the shared review runtime.\",\n remediation: \"Provide only the verified Place ID, Maps URL and server-side API key.\",\n },\n {\n ruleId: \"brandlab-source-public-secret\",\n surface: \"security\",\n pattern: /NEXT_PUBLIC_[A-Z0-9_]*(?:API_KEY|SECRET|TOKEN)/,\n expected: \"Secrets remain server-only.\",\n remediation: \"Move the credential to an approved server-only environment variable.\",\n },\n {\n ruleId: \"brandlab-source-retired-contact-state\",\n surface: \"contact\",\n pattern: /\\bCONTACT_CONTEXT_SECRET\\b|\\bKV_REST_API_(?:URL|TOKEN)\\b/,\n expected: \"The simplified contact runtime has no project-level state-service requirement.\",\n remediation: \"Remove the retired contact state variables and use the shared stateless contact flow.\",\n },\n {\n ruleId: \"brandlab-analytics-retired-phone-api\",\n surface: \"analytics\",\n pattern: /\\btrackPhoneCall\\b/,\n expected: \"Telephone taps are reported only as phone_link_click by the shared instrumentation.\",\n actual: \"The retired trackPhoneCall API is still referenced.\",\n remediation: \"Remove trackPhoneCall; installBrandlabInstrumentation reports one phone_link_click per tap.\",\n },\n {\n ruleId: \"brandlab-analytics-web-vitals\",\n surface: \"analytics\",\n pattern: /\\b(?:useReportWebVitals|reportWebVitals|reportBrandlabWebVital|createBrandlabWebVitalsReporter|CoreWebVitalsReporter)\\b|['\"](?:next\\/web-vitals|web-vitals|web_vital)['\"]|\\bwebVitals\\s*:/,\n expected: \"No web-vitals reporter; speed evidence comes from Search Console.\",\n actual: \"A web-vitals reporter, web_vital event or webVitals flag is still wired.\",\n remediation: \"Remove the web-vitals reporter and the webVitals flag; web_vital events are not sent in 3.0.\",\n },\n];\n\nexport function evaluateBrandlabProject(\n options: EvaluateBrandlabProjectOptions,\n): BrandlabConformanceResult {\n const root = resolve(options.root);\n const mode = options.mode ?? \"local\";\n const release = options.release ?? BRANDLAB_CURRENT_RUNTIME_RELEASE;\n validateBrandlabRuntimeReleaseContract(release);\n if (options.releaseManifest) {\n validateBrandlabReleaseManifest(options.releaseManifest);\n if (\n digestBrandlabAuthority(projectBrandlabRuntimeReleaseContract(options.releaseManifest)) !==\n digestBrandlabAuthority(release)\n ) {\n throw new Error(\"The release manifest differs from the embedded current release.\");\n }\n }\n\n const packageJson = readPackageJson(root);\n const packageLock = readPackageLock(root);\n if (options.packedReleaseReceipt && mode !== \"preflight\") {\n throw new Error(\"Local packed artifacts are permitted only in explicit preflight mode.\");\n }\n const packedPreflight = options.packedReleaseReceipt\n ? verifyPackedPreflight(root, resolve(options.packedReleaseReceipt)) : undefined;\n const detectedRelease = packedPreflight?.version ?? detectInstalledBrandlabRelease(packageJson);\n const installedRelease =\n options.installedRelease === undefined ? detectedRelease : options.installedRelease;\n const manifest = release.releaseVersion === installedRelease ? release : null;\n const attestation =\n options.releaseManifest?.releaseVersion === installedRelease\n ? options.releaseManifest\n : null;\n const findings: BrandlabFinding[] = [];\n const evaluations: BrandlabRuleEvaluation[] = [];\n const source = collectBrandlabSource(root);\n\n inspectRelease({\n findings,\n evaluations,\n packageJson,\n packageLock,\n installedRelease,\n detectedRelease,\n manifest,\n attestation,\n packedPreflight,\n });\n if (manifest?.runtime.nextVersionPolicy === \"exact\") {\n inspectImageRuntime(root, findings, evaluations);\n }\n inspectProjectConfig(root, source, findings, evaluations);\n inspectProjectSource(source, findings, evaluations);\n inspectStaticRules({\n root,\n source,\n config: readOptionalText(join(root, \"brandlab.config.ts\")),\n findings,\n evaluations,\n });\n\n const sortedFindings = findings.sort(compareFindings);\n const policyResult = applyBrandlabVerificationPolicy(\n sortedFindings,\n options.verificationEvidence,\n evaluations,\n );\n const operationalFindings = policyResult.operationalFindings.sort(compareFindings);\n const authorityDigest = digestBrandlabAuthority({\n release,\n releaseManifest: options.releaseManifest ?? null,\n ...(packedPreflight ? { packedReceipt: packedPreflight.receiptDigest } : {}),\n });\n const contractDigest = digestBrandlabAuthority({\n installed: manifest?.contracts ?? null,\n evaluator: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,\n verificationPolicy: BRANDLAB_VERIFICATION_POLICY_VERSION,\n });\n const implementationFingerprint = digestBrandlabAuthority({\n packageJson: packageJson ?? null,\n packageLock: packageLock.fingerprint,\n brandlabConfig: readOptionalText(join(root, \"brandlab.config.ts\")),\n nextConfig: [\"next.config.ts\", \"next.config.mts\", \"next.config.mjs\", \"next.config.js\"]\n .map((name) => [name, readOptionalText(join(root, name))]),\n findings: sortedFindings.map(({ ruleId, severity, path, line }) => ({\n ruleId,\n severity,\n path: path ?? null,\n line: line ?? null,\n })),\n });\n\n return {\n schemaVersion: BRANDLAB_CONFORMANCE_SCHEMA_VERSION,\n ...(packedPreflight ? { packedPreflight } : {}),\n evaluatorVersion: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,\n authorityDigest,\n contractDigest,\n implementationFingerprint,\n mode,\n installedRelease,\n findings: operationalFindings,\n operationalFindings,\n verification: policyResult.verification,\n summary: policyResult.verification.summary,\n };\n}\n\nexport function shouldFailBrandlabConformance(result: BrandlabConformanceResult): boolean {\n return result.verification.summary.blockers > 0;\n}\n\nexport function detectInstalledBrandlabRelease(\n packageJson: ProjectPackageJsonLike | null,\n): string | null {\n if (!packageJson) return null;\n const versions = BRANDLAB_SHARED_PACKAGE_NAMES.map(\n (packageName) =>\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n null,\n );\n if (versions.some((version) => !version || !isBrandlabSemver(version))) return null;\n return new Set(versions).size === 1 ? versions[0] : null;\n}\n\nfunction inspectRelease(options: {\n packedPreflight?: PackedPreflight;\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike | null;\n packageLock: PackageLockInspection;\n installedRelease: string | null;\n detectedRelease: string | null;\n manifest: BrandlabRuntimeReleaseContract | null;\n attestation: BrandlabReleaseManifest | null;\n}) {\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-json-missing\");\n if (!options.packageJson) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-json-missing\",\n \"A readable package.json\",\n \"package.json is missing or invalid.\",\n \"Restore a valid package.json.\",\n ));\n return;\n }\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-installed-version-unresolved\");\n if (!options.installedRelease) {\n options.findings.push(releaseFinding(\n \"brandlab-release-installed-version-unresolved\",\n \"All four Brandlab packages pinned to one exact release\",\n \"The installed Brandlab release could not be resolved.\",\n \"Pin all four packages to one exact supported version.\",\n ));\n return;\n }\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-unsupported\");\n if (!options.manifest) {\n options.findings.push(releaseFinding(\n \"brandlab-release-unsupported\",\n \"The release selected by the active Brandlab channel\",\n `${options.installedRelease} is not supported by the active platform.`,\n \"Upgrade the project to the current candidate before further work.\",\n ));\n return;\n }\n\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-declared-installed-mismatch\");\n if (options.detectedRelease !== options.installedRelease) {\n options.findings.push(releaseFinding(\n \"brandlab-release-declared-installed-mismatch\",\n options.installedRelease,\n options.detectedRelease ?? \"unresolved\",\n \"Restore one exact package version across all four Brandlab packages.\",\n \"package.json\",\n ));\n }\n\n inspectBrandlabPackages({\n findings: options.findings,\n evaluations: options.evaluations,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n installedRelease: options.installedRelease,\n attestation: options.attestation,\n packedPreflight: options.packedPreflight,\n });\n inspectRuntime({\n findings: options.findings,\n evaluations: options.evaluations,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n manifest: options.manifest,\n });\n}\n\nfunction inspectBrandlabPackages(options: {\n packedPreflight?: PackedPreflight;\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n installedRelease: string;\n attestation: BrandlabReleaseManifest | null;\n}) {\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-lock\");\n if (options.packageLock.state !== \"valid\") {\n options.findings.push(releaseFinding(\n `brandlab-release-package-lock-${options.packageLock.state}`,\n \"A valid npm lockfile v2 or v3\",\n `package-lock.json state is ${options.packageLock.state}.`,\n \"Regenerate the lockfile from the exact package declarations.\",\n \"package-lock.json\",\n ));\n return;\n }\n\n recordEvaluation(\n options.evaluations,\n \"release\",\n \"brandlab-release-package-pin-mismatch\",\n \"brandlab-release-package-resolution-mismatch\",\n ...(options.attestation ? [\"brandlab-release-package-integrity-mismatch\"] : []),\n );\n for (const packageName of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const declared = declaredPackageSpec(options.packageJson, packageName);\n const locked = lockedRootSpec(options.packageLock, packageName);\n const resolved = options.packageLock.resolvedPackages.get(packageName);\n const duplicate =\n options.packageJson.dependencies?.[packageName] !== undefined &&\n options.packageJson.devDependencies?.[packageName] !== undefined;\n const packed = options.packedPreflight?.packages[packageName];\n if (duplicate || declared !== (packed?.spec ?? options.installedRelease) || locked !== declared) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-pin-mismatch\",\n `${packageName}@${options.installedRelease} declared once and locked exactly`,\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; duplicate=${String(duplicate)}.`,\n \"Restore exact lockstep package declarations and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n if (\n !resolved ||\n resolved.version !== options.installedRelease ||\n resolved.linked ||\n !resolved.integrity ||\n !resolved.resolved ||\n (!packed && !isApprovedRegistryResolution(\n resolved.resolved,\n packageName,\n options.installedRelease,\n ))\n ) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-resolution-mismatch\",\n `${packageName}@${options.installedRelease} from the canonical npm registry`,\n !resolved\n ? \"The resolved lockfile package is missing.\"\n : `version=${resolved.version ?? \"missing\"}; linked=${String(resolved.linked)}; integrity=${resolved.integrity ? \"present\" : \"missing\"}.`,\n \"Run a clean npm install from the exact published release.\",\n \"package-lock.json\",\n ));\n }\n const expectedIntegrity =\n options.attestation?.packages[packageName].registry.integrity ?? null;\n if (options.attestation && !packed && !expectedIntegrity) {\n // A bound manifest without registry integrity cannot prove the lockfile.\n options.findings.push(releaseFinding(\n \"brandlab-release-package-integrity-mismatch\",\n `${packageName} integrity matching the immutable manifest`,\n \"The release manifest records no registry integrity for this package.\",\n \"Bind the verified release manifest recorded after registry publication.\",\n \"package-lock.json\",\n ));\n } else if (expectedIntegrity && resolved?.integrity !== expectedIntegrity) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-integrity-mismatch\",\n `${packageName} integrity matching the immutable manifest`,\n \"The lockfile integrity differs from the release attestation.\",\n \"Regenerate the lockfile from the verified registry package.\",\n \"package-lock.json\",\n ));\n }\n }\n}\n\nfunction inspectRuntime(options: {\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n manifest: BrandlabRuntimeReleaseContract;\n}) {\n recordEvaluation(\n options.evaluations,\n \"runtime\",\n ...RUNTIME_PACKAGE_FIELDS.map(([packageName]) => `brandlab-runtime-${slugify(packageName)}`),\n \"brandlab-runtime-react-pair\",\n \"brandlab-runtime-node\",\n \"brandlab-runtime-package-manager\",\n ...(options.manifest.runtime.sharp ? [\"brandlab-runtime-sharp\"] : []),\n );\n for (const [packageName, runtimeField] of RUNTIME_PACKAGE_FIELDS) {\n const expected = options.manifest.runtime[runtimeField];\n const declared = declaredPackageSpec(options.packageJson, packageName);\n const locked = lockedRootSpec(options.packageLock, packageName);\n const resolved = options.packageLock.resolvedPackages.get(packageName);\n if (\n !runtimeVersionSatisfiesRelease(packageName, declared, expected, options.manifest.runtime.nextVersionPolicy) ||\n locked !== declared ||\n resolved?.version !== declared ||\n resolved.linked\n ) {\n options.findings.push(runtimeFinding(\n `brandlab-runtime-${slugify(packageName)}`,\n runtimeExpectation(packageName, expected, options.manifest.runtime.nextVersionPolicy),\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; resolved=${resolved?.version ?? \"missing\"}.`,\n `Use the runtime versions permitted by the ${options.manifest.releaseVersion} contract; an exact mitigation pin requires a reviewed policy change before upgrading.`,\n \"package.json\",\n ));\n }\n }\n\n // React and React DOM are one runtime: a newer patch of one alone is a mismatch.\n const declaredReact = declaredPackageSpec(options.packageJson, \"react\");\n const declaredReactDom = declaredPackageSpec(options.packageJson, \"react-dom\");\n const lockedReact = options.packageLock.resolvedPackages.get(\"react\")?.version ?? null;\n const lockedReactDom = options.packageLock.resolvedPackages.get(\"react-dom\")?.version ?? null;\n if (!declaredReact || declaredReact !== declaredReactDom || lockedReact !== lockedReactDom) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-react-pair\",\n \"react and react-dom declared and locked at the same exact version\",\n `package.json react=${declaredReact ?? \"missing\"}, react-dom=${declaredReactDom ?? \"missing\"}; lockfile react=${lockedReact ?? \"missing\"}, react-dom=${lockedReactDom ?? \"missing\"}.`,\n \"Pin react and react-dom to one exact version and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n\n const node = options.packageJson.engines?.node ?? null;\n const lockNode = options.packageLock.rootEngines.node ?? null;\n if (node !== options.manifest.runtime.node || lockNode !== node) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-node\",\n `engines.node=${options.manifest.runtime.node}`,\n `package.json=${node ?? \"missing\"}; lockfile=${lockNode ?? \"missing\"}.`,\n \"Restore the supported Node engine and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n if (options.packageJson.packageManager !== options.manifest.runtime.packageManager) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-package-manager\",\n options.manifest.runtime.packageManager,\n options.packageJson.packageManager ?? \"missing\",\n \"Use the package manager declared by the current release.\",\n \"package.json\",\n ));\n }\n\n const expectedSharp = options.manifest.runtime.sharp;\n if (expectedSharp) {\n const override = options.packageJson.overrides?.sharp ?? null;\n if (\n override !== expectedSharp ||\n options.packageLock.sharpResolutions.length !== 1 ||\n options.packageLock.sharpResolutions[0]?.version !== expectedSharp\n ) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-sharp\",\n `one sharp@${expectedSharp} resolution`,\n `override=${override ?? \"missing\"}; resolutions=${options.packageLock.sharpResolutions.map((entry) => `${entry.path}=${entry.version}`).join(\", \") || \"none\"}.`,\n \"Restore the release-owned Sharp override and regenerate the lockfile.\",\n \"package-lock.json\",\n ));\n }\n }\n}\n\nfunction inspectImageRuntime(\n root: string,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"runtime\", \"brandlab-runtime-image-initialisation\");\n const filename = [\"next.config.ts\", \"next.config.mts\", \"next.config.mjs\", \"next.config.js\"]\n .find((name) => existsSync(join(root, name)));\n const source = filename ? stripCommentsPreservingLayout(readOptionalText(join(root, filename)) ?? \"\") : \"\";\n // A direct side-effect import executes the shared guard before Next starts.\n // This source check is not runtime certification; packed/browser checks prove that separately.\n if (/^[ \\t]*import[ \\t]*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]/m.test(source) ||\n /^[ \\t]*require\\([ \\t]*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"][ \\t]*\\)/m.test(source)) return;\n findings.push(runtimeFinding(\n \"brandlab-runtime-image-initialisation\",\n \"The shared image-runtime side-effect import in next.config\",\n \"The startup decoder exclusion could not be established from configuration.\",\n \"Import @brandlab-digital/site-next/image-runtime at the top of next.config; verify the packed runtime and affected images.\",\n filename ?? \"next.config.ts\",\n ));\n}\n\nfunction inspectProjectConfig(\n root: string,\n projectSource: BrandlabSourceIndex,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n const configPath = join(root, \"brandlab.config.ts\");\n const source = readOptionalText(configPath);\n recordEvaluation(evaluations, \"routes\", \"brandlab-config-missing\", \"brandlab-config-invalid\");\n if (!source) {\n findings.push(staticFinding({\n ruleId: \"brandlab-config-missing\",\n surface: \"routes\",\n path: \"brandlab.config.ts\",\n expected: \"One small typed Brandlab project configuration\",\n actual: \"brandlab.config.ts is missing.\",\n remediation: \"Add project identity, route families and enabled capabilities.\",\n }));\n return;\n }\n // 3.0 removed the profile field; a leftover one is reported as a retired API.\n if (\n !/\\bdefineBrandlabProject\\s*\\(\\s*\\{/.test(source) ||\n !/\\bprojectId\\s*:\\s*['\"][a-z0-9][a-z0-9-]*['\"]/.test(source)\n ) {\n findings.push(staticFinding({\n ruleId: \"brandlab-config-invalid\",\n surface: \"routes\",\n path: \"brandlab.config.ts\",\n expected: \"A literal defineBrandlabProject configuration with projectId\",\n actual: \"The minimum project identity contract could not be verified.\",\n remediation: \"Keep the configuration literal and limited to project variation.\",\n }));\n }\n\n const envKeys = parseEnvironmentKeys(readOptionalText(join(root, \".env.example\")) ?? \"\");\n const contracts = findContactContractRecipients(projectSource);\n if (/\\bcontact\\s*:\\s*\\{/.test(source) || contracts.length > 0) {\n requireEnvKey(findings, evaluations, envKeys, \"RESEND_API_KEY\", \"contact\");\n inspectContactRecipients(contracts, envKeys, findings, evaluations);\n }\n const reviewsConfig = source.match(/\\breviews\\s*:\\s*\\{([^{}]*)\\}/)?.[1] ?? \"\";\n const usesLiveGooglePlacesReviews =\n /\\bprovider\\s*:\\s*['\"]google-places['\"]/.test(reviewsConfig) &&\n /\\bmode\\s*:\\s*['\"](?:summary|full)['\"]/.test(reviewsConfig);\n if (usesLiveGooglePlacesReviews) {\n requireEnvKey(findings, evaluations, envKeys, \"GOOGLE_MAPS_PLATFORM_API_KEY\", \"reviews\");\n }\n recordEvaluation(evaluations, \"environment\", \"brandlab-environment-retired-contact-state\");\n for (const retired of [\"CONTACT_CONTEXT_SECRET\", \"KV_REST_API_URL\", \"KV_REST_API_TOKEN\"]) {\n if (envKeys.has(retired)) {\n findings.push(staticFinding({\n ruleId: \"brandlab-environment-retired-contact-state\",\n surface: \"environment\",\n path: \".env.example\",\n expected: \"Only current contact environment variables\",\n actual: `${retired} is still documented.`,\n remediation: `Remove ${retired}; it is not part of the simplified contact standard.`,\n }));\n }\n }\n}\n\n/** The environment variable key rule site-core applies to delivery.recipientEnv. */\nconst ENV_KEY_PATTERN = /^[A-Z][A-Z0-9_]*$/;\n\n/** Variable names documented in an env example file (`KEY=`, `export KEY=`); values are ignored. */\nexport function parseEnvironmentKeys(text: string): Set<string> {\n const keys = new Set<string>();\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const assignment = line.startsWith(\"export \") ? line.slice(\"export \".length).trimStart() : line;\n const separator = assignment.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = assignment.slice(0, separator).trimEnd();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) keys.add(key);\n }\n return keys;\n}\n\n/** The recipient variable is whatever the contact contract declares, never an assumed name. */\nfunction inspectContactRecipients(\n contracts: ReturnType<typeof findContactContractRecipients>,\n envKeys: ReadonlySet<string>,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"contact\", \"brandlab-contact-recipient-env\");\n if (contracts.length === 0) {\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: \"src/config/contact.ts\",\n expected: \"One defineContactContract contract declaring delivery.recipientEnv\",\n actual: \"The contact capability is enabled but no contact contract was found.\",\n remediation: \"Declare the contact contract with defineContactContract in src/config/contact.ts.\",\n }));\n return;\n }\n for (const contract of contracts.filter(({ recipientEnv }) => !recipientEnv)) {\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: contract.path,\n line: contract.line,\n expected: \"delivery.recipientEnv declared as a literal environment variable key\",\n actual: \"The recipient environment variable could not be read from the contract.\",\n remediation: \"Write delivery.recipientEnv as a string literal such as 'CONTACT_EMAIL'.\",\n }));\n }\n for (const contract of contracts) {\n if (!contract.recipientEnv || ENV_KEY_PATTERN.test(contract.recipientEnv)) continue;\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: contract.path,\n line: contract.line,\n expected: \"delivery.recipientEnv is an environment variable key (A-Z, 0-9 and _, starting with a letter)\",\n actual: `delivery.recipientEnv ${JSON.stringify(contract.recipientEnv.slice(0, 64))} is not an environment variable key.`,\n remediation: \"Name the recipient variable in upper case, for example 'CONTACT_EMAIL'.\",\n }));\n }\n const keys = [...new Set(contracts.flatMap(({ recipientEnv }) =>\n recipientEnv && ENV_KEY_PATTERN.test(recipientEnv) ? [recipientEnv] : []))];\n for (const key of keys.sort()) requireEnvKey(findings, evaluations, envKeys, key, \"contact\");\n}\n\nfunction requireEnvKey(\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n envKeys: ReadonlySet<string>,\n key: string,\n capability: string,\n) {\n const ruleId = `brandlab-environment-${capability}-${slugify(key)}`;\n recordEvaluation(evaluations, \"environment\", ruleId);\n if (envKeys.has(key)) return;\n findings.push(staticFinding({\n ruleId,\n surface: \"environment\",\n path: \".env.example\",\n expected: `${key} documented for the enabled ${capability} capability`,\n actual: `${key} is missing from .env.example.`,\n remediation: `Document the non-secret ${key} variable name without adding a credential value.`,\n }));\n}\n\nfunction inspectProjectSource(\n source: BrandlabSourceIndex,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"source\", \"brandlab-source-root-missing\");\n if (source.directoryRoots.length === 0) {\n findings.push(staticFinding({\n ruleId: \"brandlab-source-root-missing\",\n surface: \"source\",\n expected: `Project source under a recognised root (${BRANDLAB_SOURCE_ROOT_DIRECTORIES.map((name) => `${name}/`).join(\", \")})`,\n actual: \"No recognised source root was found, so no source rule could run.\",\n remediation: \"Keep application source under src/ (or a recognised legacy root) and rerun verification.\",\n }));\n }\n if (source.files.length === 0) return;\n for (const rule of SOURCE_RULES) recordEvaluation(evaluations, rule.surface, rule.ruleId);\n for (const file of source.files) {\n for (const rule of SOURCE_RULES) {\n const match = file.executable.match(rule.pattern);\n if (!match || match.index === undefined) continue;\n findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: file.path,\n line: lineAt(file.text, match.index),\n expected: rule.expected,\n actual: rule.actual ?? \"A project-owned implementation was detected.\",\n remediation: rule.remediation,\n }));\n }\n }\n}\n\n\nfunction readPackageJson(root: string): ProjectPackageJsonLike | null {\n const source = readOptionalText(join(root, \"package.json\"));\n if (!source) return null;\n try {\n return JSON.parse(source) as ProjectPackageJsonLike;\n } catch {\n return null;\n }\n}\n\nfunction readPackageLock(root: string): PackageLockInspection {\n const source = readOptionalText(join(root, \"package-lock.json\"));\n if (!source) return emptyPackageLock(\"missing\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n return emptyPackageLock(\"invalid\", { digest: digestBrandlabAuthority(source) });\n }\n if (!isRecord(parsed)) return emptyPackageLock(\"invalid\");\n const lockfileVersion =\n typeof parsed.lockfileVersion === \"number\" ? parsed.lockfileVersion : null;\n if (lockfileVersion !== 2 && lockfileVersion !== 3) {\n return emptyPackageLock(\"unsupported\", { lockfileVersion });\n }\n if (!isRecord(parsed.packages) || !isRecord(parsed.packages[\"\"])) {\n return emptyPackageLock(\"invalid\", { lockfileVersion });\n }\n\n const rootPackage = parsed.packages[\"\"];\n const rootDependencies = stringRecord(rootPackage.dependencies);\n const rootDevDependencies = stringRecord(rootPackage.devDependencies);\n const rootEngines = stringRecord(rootPackage.engines);\n const resolvedPackages = new Map<string, LockedPackage>();\n const packageNames = [\n ...BRANDLAB_SHARED_PACKAGE_NAMES,\n ...RUNTIME_PACKAGE_FIELDS.map(([name]) => name),\n \"sharp\",\n ];\n for (const packageName of packageNames) {\n const entry = parsed.packages[`node_modules/${packageName}`];\n if (!isRecord(entry)) continue;\n resolvedPackages.set(packageName, {\n version: typeof entry.version === \"string\" ? entry.version : null,\n resolved: typeof entry.resolved === \"string\" ? entry.resolved : null,\n integrity: typeof entry.integrity === \"string\" ? entry.integrity : null,\n linked: entry.link === true,\n });\n }\n const sharpResolutions = Object.entries(parsed.packages)\n .filter(([path]) => path === \"node_modules/sharp\" || path.endsWith(\"/node_modules/sharp\"))\n .map(([path, entry]) => ({\n path,\n version: isRecord(entry) && typeof entry.version === \"string\" ? entry.version : null,\n }))\n .sort((left, right) => left.path.localeCompare(right.path));\n return {\n state: \"valid\",\n lockfileVersion,\n rootDependencies,\n rootDevDependencies,\n rootEngines,\n resolvedPackages,\n sharpResolutions,\n fingerprint: {\n lockfileVersion,\n rootDependencies,\n rootDevDependencies,\n rootEngines,\n resolved: Object.fromEntries(\n [...resolvedPackages].map(([name, value]) => [\n name,\n { version: value.version, linked: value.linked },\n ]),\n ),\n sharpResolutions,\n },\n };\n}\n\nfunction emptyPackageLock(\n state: Exclude<PackageLockInspection[\"state\"], \"valid\">,\n fingerprint: Record<string, unknown> = {},\n): PackageLockInspection {\n return {\n state,\n lockfileVersion:\n typeof fingerprint.lockfileVersion === \"number\"\n ? fingerprint.lockfileVersion\n : null,\n rootDependencies: {},\n rootDevDependencies: {},\n rootEngines: {},\n resolvedPackages: new Map(),\n sharpResolutions: [],\n fingerprint: { state, ...fingerprint },\n };\n}\n\nfunction runtimeVersionSatisfiesRelease(\n packageName: (typeof RUNTIME_PACKAGE_FIELDS)[number][0],\n actual: string | null,\n expected: string,\n nextVersionPolicy?: \"exact\",\n): boolean {\n if (packageName === \"next\" && nextVersionPolicy === \"exact\") return actual === expected;\n if (!actual || !isBrandlabSemver(actual)) return false;\n if (![\"next\", \"react\", \"react-dom\"].includes(packageName)) return actual === expected;\n const actualParts = actual.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n const expectedParts = expected.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n const sameSupportedLine = packageName === \"next\"\n ? actualParts?.[1] === expectedParts?.[1]\n : actualParts?.[1] === expectedParts?.[1] && actualParts?.[2] === expectedParts?.[2];\n return Boolean(\n actualParts &&\n expectedParts &&\n sameSupportedLine &&\n compareBrandlabSemver(actual, expected) >= 0,\n );\n}\n\nfunction runtimeExpectation(packageName: string, expected: string, nextVersionPolicy?: \"exact\"): string {\n if (packageName === \"next\" && nextVersionPolicy === \"exact\") return `${packageName}@${expected} (exact HEIF mitigation pin)`;\n if (packageName === \"next\") {\n return `${packageName}@${expected} or a newer exact stable release in the same major line`;\n }\n return [\"react\", \"react-dom\"].includes(packageName)\n ? `${packageName}@${expected} or a newer exact patch in the same major/minor line`\n : `${packageName}@${expected}`;\n}\n\nfunction isApprovedRegistryResolution(\n resolved: string,\n packageName: string,\n version: string,\n): boolean {\n try {\n const url = new URL(resolved);\n const artifact = packageName.split(\"/\").at(-1);\n return Boolean(\n artifact &&\n url.protocol === \"https:\" &&\n url.hostname === \"registry.npmjs.org\" &&\n url.pathname === `/${packageName}/-/${artifact}-${version}.tgz`,\n );\n } catch {\n return false;\n }\n}\n\nfunction declaredPackageSpec(\n packageJson: ProjectPackageJsonLike,\n packageName: string,\n): string | null {\n return (\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n null\n );\n}\n\nfunction lockedRootSpec(\n lock: PackageLockInspection,\n packageName: string,\n): string | null {\n return lock.rootDependencies[packageName] ?? lock.rootDevDependencies[packageName] ?? null;\n}\n\nfunction releaseFinding(\n ruleId: string,\n expected: string,\n actual: string,\n remediation: string,\n path?: string,\n): BrandlabFinding {\n return {\n ruleId,\n surface: \"release\",\n severity: \"blocker\",\n contract: { name: \"release\", version: \"current-release\" },\n evidenceKind: \"static\",\n ...(path ? { path } : {}),\n expected,\n actual,\n remediation,\n };\n}\n\nfunction runtimeFinding(\n ruleId: string,\n expected: string,\n actual: string,\n remediation: string,\n path: string,\n): BrandlabFinding {\n return {\n ruleId,\n surface: \"runtime\",\n severity: \"blocker\",\n contract: { name: \"runtime\", version: \"installed-release\" },\n evidenceKind: \"static\",\n path,\n expected,\n actual,\n remediation,\n };\n}\n\nfunction compareFindings(left: BrandlabFinding, right: BrandlabFinding): number {\n return (\n left.ruleId.localeCompare(right.ruleId) ||\n (left.path ?? \"\").localeCompare(right.path ?? \"\") ||\n (left.line ?? 0) - (right.line ?? 0)\n );\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!isRecord(value)) return {};\n return Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\nexport type { BrandlabContractVersions };\n"]}
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { BRANDLAB_CURRENT_RUNTIME_RELEASE } from \"./current-release.js\";\nimport { verifyPackedPreflight, type PackedPreflight } from \"./packed-preflight.js\";\nimport {\n BRANDLAB_SHARED_PACKAGE_NAMES,\n compareBrandlabSemver,\n digestBrandlabAuthority,\n isBrandlabSemver,\n type BrandlabContractVersions,\n type BrandlabReleaseManifest,\n type BrandlabRuntimeReleaseContract,\n projectBrandlabRuntimeReleaseContract,\n validateBrandlabReleaseManifest,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\nimport {\n BRANDLAB_SOURCE_ROOT_DIRECTORIES,\n collectBrandlabSource,\n lineAt,\n readOptionalText,\n stripCommentsPreservingLayout,\n type BrandlabSourceIndex,\n} from \"./source-files.js\";\nimport {\n findContactContractRecipients,\n inspectStaticRules,\n recordEvaluation,\n staticFinding,\n} from \"./static-rules.js\";\nimport {\n applyBrandlabVerificationPolicy,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabOperationalFinding,\n type BrandlabRuleEvaluation,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationResult,\n} from \"./verification-policy.js\";\n\nexport {\n BRANDLAB_STATIC_RULES,\n matchesBrandlabStaticRule,\n type BrandlabStaticRule,\n} from \"./rule-registry.js\";\nexport {\n BRANDLAB_VERIFICATION_CHECKS,\n BRANDLAB_VERIFICATION_FAMILIES,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n checkForRule,\n type BrandlabRuleEvaluation,\n type BrandlabVerificationCheckId,\n type BrandlabVerificationCheckResult,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationEvidenceKind,\n type BrandlabVerificationFamilyId,\n type BrandlabVerificationFamilyResult,\n type BrandlabVerificationResult,\n type BrandlabVerificationStatus,\n} from \"./verification-policy.js\";\n\nexport const BRANDLAB_CONFORMANCE_SCHEMA_VERSION = \"brandlab.conformance.v2\";\nexport const BRANDLAB_CONFORMANCE_EVALUATOR_VERSION = \"current-only-v2\";\n\nconst RUNTIME_PACKAGE_FIELDS = [\n [\"next\", \"next\"],\n [\"react\", \"react\"],\n [\"react-dom\", \"reactDom\"],\n [\"typescript\", \"typescript\"],\n] as const;\n\nexport type BrandlabConformanceMode = \"local\" | \"ci\" | \"preflight\";\nexport type BrandlabFindingSeverity = \"blocker\" | \"warning\" | \"info\";\n\nexport interface BrandlabFinding {\n ruleId: string;\n surface: string;\n severity: BrandlabFindingSeverity;\n contract: { name: string; version: string };\n evidenceKind: \"static\" | \"behavioural\" | \"runtime\";\n path?: string;\n line?: number;\n expected: string;\n actual: string;\n remediation: string;\n}\n\nexport interface ConformanceSummary {\n status: \"pass\" | \"warning\" | \"blocked\";\n total: number;\n blockers: number;\n warnings: number;\n info: number;\n}\n\nexport interface BrandlabConformanceResult {\n packedPreflight?: PackedPreflight;\n schemaVersion: typeof BRANDLAB_CONFORMANCE_SCHEMA_VERSION;\n evaluatorVersion: typeof BRANDLAB_CONFORMANCE_EVALUATOR_VERSION;\n authorityDigest: string;\n contractDigest: string;\n implementationFingerprint: string;\n mode: BrandlabConformanceMode;\n installedRelease: string | null;\n findings: BrandlabFinding[];\n operationalFindings: BrandlabOperationalFinding[];\n verification: BrandlabVerificationResult;\n summary: ConformanceSummary;\n}\n\nexport interface EvaluateBrandlabProjectOptions {\n packedReleaseReceipt?: string;\n root: string;\n installedRelease?: string | null;\n mode?: BrandlabConformanceMode;\n release?: BrandlabRuntimeReleaseContract;\n releaseManifest?: BrandlabReleaseManifest;\n verificationEvidence?: readonly BrandlabVerificationEvidence[];\n}\n\ninterface ProjectPackageJsonLike {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n engines?: Record<string, string>;\n overrides?: Record<string, string>;\n packageManager?: string;\n}\n\ninterface LockedPackage {\n version: string | null;\n resolved: string | null;\n integrity: string | null;\n linked: boolean;\n}\n\ninterface PackageLockInspection {\n state: \"valid\" | \"missing\" | \"invalid\" | \"unsupported\";\n lockfileVersion: number | null;\n rootDependencies: Record<string, string>;\n rootDevDependencies: Record<string, string>;\n rootEngines: Record<string, string>;\n resolvedPackages: ReadonlyMap<string, LockedPackage>;\n sharpResolutions: readonly { path: string; version: string | null }[];\n fingerprint: Record<string, unknown>;\n}\n\ninterface SourceRule {\n ruleId: string;\n surface: string;\n pattern: RegExp;\n expected: string;\n remediation: string;\n actual?: string;\n}\n\nconst SOURCE_RULES: readonly SourceRule[] = [\n {\n ruleId: \"brandlab-source-retired-analytics-event\",\n surface: \"analytics\",\n pattern: /\\b(?:contact_form_submission|phone_call|phone_calls|form_start|form_submit|generate_lead|cta_click)\\b/,\n expected: \"Only the current Brandlab analytics event contract is used.\",\n remediation: \"Use contact_form for accepted forms and phone_link_click for telephone-link diagnostics.\",\n },\n {\n ruleId: \"brandlab-source-local-google-tag-bootstrap\",\n surface: \"analytics\",\n pattern: /googletagmanager\\.com\\/gtag\\/js|window\\.dataLayer\\s*=\\s*window\\.dataLayer|function\\s+gtag\\s*\\(/,\n expected: \"Google tag bootstrap is owned by the shared analytics runtime.\",\n remediation: \"Remove the project-local bootstrap and supply only approved analytics identifiers.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-delivery\",\n surface: \"contact\",\n pattern: /\\.emails\\.send\\s*\\(|resend\\.emails\\.send\\s*\\(/,\n expected: \"Email delivery is owned by the shared contact runtime.\",\n remediation: \"Pass the Resend client to the shared contact adapter instead of sending locally.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-email-renderer\",\n surface: \"contact\",\n pattern: /\\bContactFormEmail\\b|\\brenderContactEmail\\b/,\n expected: \"Contact email rendering is owned by the shared contact runtime.\",\n remediation: \"Remove the local email renderer and configure shared brand variation only.\",\n },\n {\n ruleId: \"brandlab-source-local-contact-attachments\",\n surface: \"contact\",\n pattern: /from\\s+['\\\"]browser-image-compression['\\\"]|import\\s*\\(\\s*['\\\"]browser-image-compression['\\\"]\\s*\\)|(?:function|const)\\s+useContactAttachments\\b/,\n expected: \"Contact attachment preparation is owned by the shared contact runtime.\",\n remediation: \"Use useBrandlabContactAttachments from @brandlab-digital/site-next/contact/client.\",\n },\n {\n ruleId: \"brandlab-source-contact-draft-persistence\",\n surface: \"contact\",\n pattern: /(?:function|const)\\s+useFormDraftPersistence\\b/,\n expected: \"Contact details are not persisted in browser storage.\",\n remediation: \"Keep contact details in memory and clear them when the page closes.\",\n },\n {\n ruleId: \"brandlab-source-dangerously-set-inner-html\",\n surface: \"security\",\n pattern: /\\bdangerouslySetInnerHTML\\b/,\n expected: \"No project-owned raw HTML injection.\",\n remediation: \"Use structured React output or the shared sanitised renderer.\",\n },\n {\n ruleId: \"brandlab-source-raw-json-ld\",\n surface: \"schema\",\n pattern: /application\\/ld\\+json/,\n expected: \"Structured data is rendered through the shared schema component.\",\n remediation: \"Replace raw JSON-LD output with the shared schema graph renderer.\",\n },\n {\n ruleId: \"brandlab-source-self-serving-rating-schema\",\n surface: \"schema\",\n pattern: /['\"]AggregateRating['\"]/,\n expected: \"No self-serving aggregate rating schema.\",\n remediation: \"Show verified review proof visibly without LocalBusiness or Organization rating schema.\",\n },\n {\n ruleId: \"brandlab-source-faq-howto-schema\",\n surface: \"schema\",\n pattern: /['\"]@type['\"]\\s*:\\s*['\"](?:FAQPage|HowTo)['\"]/,\n expected: \"No FAQPage or HowTo markup (FAQ rich results ended on 7 May 2026).\",\n remediation: \"Keep the questions visible on the page and remove the FAQPage or HowTo node.\",\n },\n {\n ruleId: \"brandlab-sitemap-build-time-lastmod\",\n surface: \"sitemap\",\n pattern: /\\b(?:lastSignificantChange|lastModified)\\s*:\\s*(?:new\\s+Date\\(\\s*\\)|Date\\.now\\(\\s*\\))/,\n expected: \"Sitemap lastmod is the date the content last changed, never the build time.\",\n remediation: \"Set lastSignificantChange from the page's content dates (latestContentDate from site-core/sitemaps).\",\n },\n {\n ruleId: \"brandlab-source-synthetic-offer-schema\",\n surface: \"schema\",\n pattern: /\\bpriceValidUntil\\b|['\"]@type['\"]\\s*:\\s*['\"]Offer['\"]/,\n expected: \"No synthetic Offer markup on service pages.\",\n remediation: \"Remove invented Offer data and use the shared service schema.\",\n },\n {\n ruleId: \"brandlab-source-local-google-reviews-fetch\",\n surface: \"reviews\",\n pattern: /places\\.googleapis\\.com|maps\\.googleapis\\.com\\/maps\\/api\\/place/,\n expected: \"Google Places fetching is owned by the shared review runtime.\",\n remediation: \"Provide only the verified Place ID, Maps URL and server-side API key.\",\n },\n {\n ruleId: \"brandlab-source-public-secret\",\n surface: \"security\",\n pattern: /NEXT_PUBLIC_[A-Z0-9_]*(?:API_KEY|SECRET|TOKEN)/,\n expected: \"Secrets remain server-only.\",\n remediation: \"Move the credential to an approved server-only environment variable.\",\n },\n {\n ruleId: \"brandlab-source-retired-contact-state\",\n surface: \"contact\",\n pattern: /\\bCONTACT_CONTEXT_SECRET\\b|\\bKV_REST_API_(?:URL|TOKEN)\\b/,\n expected: \"The simplified contact runtime has no project-level state-service requirement.\",\n remediation: \"Remove the retired contact state variables and use the shared stateless contact flow.\",\n },\n {\n ruleId: \"brandlab-analytics-retired-phone-api\",\n surface: \"analytics\",\n pattern: /\\btrackPhoneCall\\b/,\n expected: \"Telephone taps are reported only as phone_link_click by the shared instrumentation.\",\n actual: \"The retired trackPhoneCall API is still referenced.\",\n remediation: \"Remove trackPhoneCall; installBrandlabInstrumentation reports one phone_link_click per tap.\",\n },\n {\n ruleId: \"brandlab-analytics-web-vitals\",\n surface: \"analytics\",\n pattern: /\\b(?:useReportWebVitals|reportWebVitals|reportBrandlabWebVital|createBrandlabWebVitalsReporter|CoreWebVitalsReporter)\\b|['\"](?:next\\/web-vitals|web-vitals|web_vital)['\"]|\\bwebVitals\\s*:/,\n expected: \"No web-vitals reporter; speed evidence comes from Search Console.\",\n actual: \"A web-vitals reporter, web_vital event or webVitals flag is still wired.\",\n remediation: \"Remove the web-vitals reporter and the webVitals flag; web_vital events are not sent in 3.0.\",\n },\n];\n\nexport function evaluateBrandlabProject(\n options: EvaluateBrandlabProjectOptions,\n): BrandlabConformanceResult {\n const root = resolve(options.root);\n const mode = options.mode ?? \"local\";\n const release = options.release ?? BRANDLAB_CURRENT_RUNTIME_RELEASE;\n validateBrandlabRuntimeReleaseContract(release);\n if (options.releaseManifest) {\n validateBrandlabReleaseManifest(options.releaseManifest);\n if (\n digestBrandlabAuthority(projectBrandlabRuntimeReleaseContract(options.releaseManifest)) !==\n digestBrandlabAuthority(release)\n ) {\n throw new Error(\"The release manifest differs from the embedded current release.\");\n }\n }\n\n const packageJson = readPackageJson(root);\n const packageLock = readPackageLock(root);\n if (options.packedReleaseReceipt && mode !== \"preflight\") {\n throw new Error(\"Local packed artifacts are permitted only in explicit preflight mode.\");\n }\n const packedPreflight = options.packedReleaseReceipt\n ? verifyPackedPreflight(root, resolve(options.packedReleaseReceipt)) : undefined;\n const detectedRelease = packedPreflight?.version ?? detectInstalledBrandlabRelease(packageJson);\n const installedRelease =\n options.installedRelease === undefined ? detectedRelease : options.installedRelease;\n const manifest = release.releaseVersion === installedRelease ? release : null;\n const attestation =\n options.releaseManifest?.releaseVersion === installedRelease\n ? options.releaseManifest\n : null;\n const findings: BrandlabFinding[] = [];\n const evaluations: BrandlabRuleEvaluation[] = [];\n const source = collectBrandlabSource(root);\n\n inspectRelease({\n findings,\n evaluations,\n packageJson,\n packageLock,\n installedRelease,\n detectedRelease,\n manifest,\n attestation,\n packedPreflight,\n });\n if (manifest?.runtime.nextVersionPolicy === \"exact\") {\n inspectImageRuntime(root, findings, evaluations);\n }\n inspectProjectConfig(root, source, findings, evaluations);\n inspectProjectSource(source, findings, evaluations);\n inspectStaticRules({\n root,\n source,\n config: readOptionalText(join(root, \"brandlab.config.ts\")),\n findings,\n evaluations,\n });\n\n const sortedFindings = findings.sort(compareFindings);\n const policyResult = applyBrandlabVerificationPolicy(\n sortedFindings,\n options.verificationEvidence,\n evaluations,\n );\n const operationalFindings = policyResult.operationalFindings.sort(compareFindings);\n const authorityDigest = digestBrandlabAuthority({\n release,\n releaseManifest: options.releaseManifest ?? null,\n ...(packedPreflight ? { packedReceipt: packedPreflight.receiptDigest } : {}),\n });\n const contractDigest = digestBrandlabAuthority({\n installed: manifest?.contracts ?? null,\n evaluator: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,\n verificationPolicy: BRANDLAB_VERIFICATION_POLICY_VERSION,\n });\n const implementationFingerprint = digestBrandlabAuthority({\n packageJson: packageJson ?? null,\n packageLock: packageLock.fingerprint,\n brandlabConfig: readOptionalText(join(root, \"brandlab.config.ts\")),\n nextConfig: [\"next.config.ts\", \"next.config.mts\", \"next.config.mjs\", \"next.config.js\"]\n .map((name) => [name, readOptionalText(join(root, name))]),\n findings: sortedFindings.map(({ ruleId, severity, path, line }) => ({\n ruleId,\n severity,\n path: path ?? null,\n line: line ?? null,\n })),\n });\n\n return {\n schemaVersion: BRANDLAB_CONFORMANCE_SCHEMA_VERSION,\n ...(packedPreflight ? { packedPreflight } : {}),\n evaluatorVersion: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,\n authorityDigest,\n contractDigest,\n implementationFingerprint,\n mode,\n installedRelease,\n findings: operationalFindings,\n operationalFindings,\n verification: policyResult.verification,\n summary: policyResult.verification.summary,\n };\n}\n\nexport function shouldFailBrandlabConformance(result: BrandlabConformanceResult): boolean {\n return result.verification.summary.blockers > 0;\n}\n\nexport function detectInstalledBrandlabRelease(\n packageJson: ProjectPackageJsonLike | null,\n): string | null {\n if (!packageJson) return null;\n const versions = BRANDLAB_SHARED_PACKAGE_NAMES.map(\n (packageName) =>\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n null,\n );\n if (versions.some((version) => !version || !isBrandlabSemver(version))) return null;\n return new Set(versions).size === 1 ? versions[0] : null;\n}\n\nfunction inspectRelease(options: {\n packedPreflight?: PackedPreflight;\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike | null;\n packageLock: PackageLockInspection;\n installedRelease: string | null;\n detectedRelease: string | null;\n manifest: BrandlabRuntimeReleaseContract | null;\n attestation: BrandlabReleaseManifest | null;\n}) {\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-json-missing\");\n if (!options.packageJson) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-json-missing\",\n \"A readable package.json\",\n \"package.json is missing or invalid.\",\n \"Restore a valid package.json.\",\n ));\n return;\n }\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-installed-version-unresolved\");\n if (!options.installedRelease) {\n options.findings.push(releaseFinding(\n \"brandlab-release-installed-version-unresolved\",\n \"All four Brandlab packages pinned to one exact release\",\n \"The installed Brandlab release could not be resolved.\",\n \"Pin all four packages to one exact supported version.\",\n ));\n return;\n }\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-unsupported\");\n if (!options.manifest) {\n options.findings.push(releaseFinding(\n \"brandlab-release-unsupported\",\n \"The release selected by the active Brandlab channel\",\n `${options.installedRelease} is not supported by the active platform.`,\n \"Upgrade the project to the current candidate before further work.\",\n ));\n return;\n }\n\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-declared-installed-mismatch\");\n if (options.detectedRelease !== options.installedRelease) {\n options.findings.push(releaseFinding(\n \"brandlab-release-declared-installed-mismatch\",\n options.installedRelease,\n options.detectedRelease ?? \"unresolved\",\n \"Restore one exact package version across all four Brandlab packages.\",\n \"package.json\",\n ));\n }\n\n inspectBrandlabPackages({\n findings: options.findings,\n evaluations: options.evaluations,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n installedRelease: options.installedRelease,\n attestation: options.attestation,\n packedPreflight: options.packedPreflight,\n });\n inspectRuntime({\n findings: options.findings,\n evaluations: options.evaluations,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n manifest: options.manifest,\n });\n}\n\nfunction inspectBrandlabPackages(options: {\n packedPreflight?: PackedPreflight;\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n installedRelease: string;\n attestation: BrandlabReleaseManifest | null;\n}) {\n recordEvaluation(options.evaluations, \"release\", \"brandlab-release-package-lock\");\n if (options.packageLock.state !== \"valid\") {\n options.findings.push(releaseFinding(\n `brandlab-release-package-lock-${options.packageLock.state}`,\n \"A valid npm lockfile v2 or v3\",\n `package-lock.json state is ${options.packageLock.state}.`,\n \"Regenerate the lockfile from the exact package declarations.\",\n \"package-lock.json\",\n ));\n return;\n }\n\n recordEvaluation(\n options.evaluations,\n \"release\",\n \"brandlab-release-package-pin-mismatch\",\n \"brandlab-release-package-resolution-mismatch\",\n ...(options.attestation ? [\"brandlab-release-package-integrity-mismatch\"] : []),\n );\n for (const packageName of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const declared = declaredPackageSpec(options.packageJson, packageName);\n const locked = lockedRootSpec(options.packageLock, packageName);\n const resolved = options.packageLock.resolvedPackages.get(packageName);\n const duplicate =\n options.packageJson.dependencies?.[packageName] !== undefined &&\n options.packageJson.devDependencies?.[packageName] !== undefined;\n const packed = options.packedPreflight?.packages[packageName];\n if (duplicate || declared !== (packed?.spec ?? options.installedRelease) || locked !== declared) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-pin-mismatch\",\n `${packageName}@${options.installedRelease} declared once and locked exactly`,\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; duplicate=${String(duplicate)}.`,\n \"Restore exact lockstep package declarations and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n if (\n !resolved ||\n resolved.version !== options.installedRelease ||\n resolved.linked ||\n !resolved.integrity ||\n !resolved.resolved ||\n (!packed && !isApprovedRegistryResolution(\n resolved.resolved,\n packageName,\n options.installedRelease,\n ))\n ) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-resolution-mismatch\",\n `${packageName}@${options.installedRelease} from the canonical npm registry`,\n !resolved\n ? \"The resolved lockfile package is missing.\"\n : `version=${resolved.version ?? \"missing\"}; linked=${String(resolved.linked)}; integrity=${resolved.integrity ? \"present\" : \"missing\"}.`,\n \"Run a clean npm install from the exact published release.\",\n \"package-lock.json\",\n ));\n }\n const expectedIntegrity =\n options.attestation?.packages[packageName].registry.integrity ?? null;\n if (options.attestation && !packed && !expectedIntegrity) {\n // A bound manifest without registry integrity cannot prove the lockfile.\n options.findings.push(releaseFinding(\n \"brandlab-release-package-integrity-mismatch\",\n `${packageName} integrity matching the immutable manifest`,\n \"The release manifest records no registry integrity for this package.\",\n \"Bind the verified release manifest recorded after registry publication.\",\n \"package-lock.json\",\n ));\n } else if (expectedIntegrity && resolved?.integrity !== expectedIntegrity) {\n options.findings.push(releaseFinding(\n \"brandlab-release-package-integrity-mismatch\",\n `${packageName} integrity matching the immutable manifest`,\n \"The lockfile integrity differs from the release attestation.\",\n \"Regenerate the lockfile from the verified registry package.\",\n \"package-lock.json\",\n ));\n }\n }\n}\n\nfunction inspectRuntime(options: {\n findings: BrandlabFinding[];\n evaluations: BrandlabRuleEvaluation[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n manifest: BrandlabRuntimeReleaseContract;\n}) {\n recordEvaluation(\n options.evaluations,\n \"runtime\",\n ...RUNTIME_PACKAGE_FIELDS.map(([packageName]) => `brandlab-runtime-${slugify(packageName)}`),\n \"brandlab-runtime-react-pair\",\n \"brandlab-runtime-node\",\n \"brandlab-runtime-package-manager\",\n ...(options.manifest.runtime.sharp ? [\"brandlab-runtime-sharp\"] : []),\n );\n for (const [packageName, runtimeField] of RUNTIME_PACKAGE_FIELDS) {\n const expected = options.manifest.runtime[runtimeField];\n const declared = declaredPackageSpec(options.packageJson, packageName);\n const locked = lockedRootSpec(options.packageLock, packageName);\n const resolved = options.packageLock.resolvedPackages.get(packageName);\n if (\n !runtimeVersionSatisfiesRelease(packageName, declared, expected, options.manifest.runtime.nextVersionPolicy) ||\n locked !== declared ||\n resolved?.version !== declared ||\n resolved.linked\n ) {\n options.findings.push(runtimeFinding(\n `brandlab-runtime-${slugify(packageName)}`,\n runtimeExpectation(packageName, expected, options.manifest.runtime.nextVersionPolicy),\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; resolved=${resolved?.version ?? \"missing\"}.`,\n `Use the runtime versions permitted by the ${options.manifest.releaseVersion} contract; an exact mitigation pin requires a reviewed policy change before upgrading.`,\n \"package.json\",\n ));\n }\n }\n\n // React and React DOM are one runtime: a newer patch of one alone is a mismatch.\n const declaredReact = declaredPackageSpec(options.packageJson, \"react\");\n const declaredReactDom = declaredPackageSpec(options.packageJson, \"react-dom\");\n const lockedReact = options.packageLock.resolvedPackages.get(\"react\")?.version ?? null;\n const lockedReactDom = options.packageLock.resolvedPackages.get(\"react-dom\")?.version ?? null;\n if (!declaredReact || declaredReact !== declaredReactDom || lockedReact !== lockedReactDom) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-react-pair\",\n \"react and react-dom declared and locked at the same exact version\",\n `package.json react=${declaredReact ?? \"missing\"}, react-dom=${declaredReactDom ?? \"missing\"}; lockfile react=${lockedReact ?? \"missing\"}, react-dom=${lockedReactDom ?? \"missing\"}.`,\n \"Pin react and react-dom to one exact version and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n\n const node = options.packageJson.engines?.node ?? null;\n const lockNode = options.packageLock.rootEngines.node ?? null;\n if (node !== options.manifest.runtime.node || lockNode !== node) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-node\",\n `engines.node=${options.manifest.runtime.node}`,\n `package.json=${node ?? \"missing\"}; lockfile=${lockNode ?? \"missing\"}.`,\n \"Restore the supported Node engine and regenerate the lockfile.\",\n \"package.json\",\n ));\n }\n if (options.packageJson.packageManager !== options.manifest.runtime.packageManager) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-package-manager\",\n options.manifest.runtime.packageManager,\n options.packageJson.packageManager ?? \"missing\",\n \"Use the package manager declared by the current release.\",\n \"package.json\",\n ));\n }\n\n const expectedSharp = options.manifest.runtime.sharp;\n if (expectedSharp) {\n const override = options.packageJson.overrides?.sharp ?? null;\n if (\n override !== expectedSharp ||\n options.packageLock.sharpResolutions.length !== 1 ||\n options.packageLock.sharpResolutions[0]?.version !== expectedSharp\n ) {\n options.findings.push(runtimeFinding(\n \"brandlab-runtime-sharp\",\n `one sharp@${expectedSharp} resolution`,\n `override=${override ?? \"missing\"}; resolutions=${options.packageLock.sharpResolutions.map((entry) => `${entry.path}=${entry.version}`).join(\", \") || \"none\"}.`,\n \"Restore the release-owned Sharp override and regenerate the lockfile.\",\n \"package-lock.json\",\n ));\n }\n }\n}\n\nfunction inspectImageRuntime(\n root: string,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"runtime\", \"brandlab-runtime-image-initialisation\");\n const filename = [\"next.config.ts\", \"next.config.mts\", \"next.config.mjs\", \"next.config.js\"]\n .find((name) => existsSync(join(root, name)));\n const source = filename ? stripCommentsPreservingLayout(readOptionalText(join(root, filename)) ?? \"\") : \"\";\n // A direct side-effect import executes the shared guard before Next starts.\n // This source check is not runtime certification; packed/browser checks prove that separately.\n if (/^[ \\t]*import[ \\t]*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]/m.test(source) ||\n /^[ \\t]*require\\([ \\t]*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"][ \\t]*\\)/m.test(source)) return;\n findings.push(runtimeFinding(\n \"brandlab-runtime-image-initialisation\",\n \"The shared image-runtime side-effect import in next.config\",\n \"The startup decoder exclusion could not be established from configuration.\",\n \"Import @brandlab-digital/site-next/image-runtime at the top of next.config; verify the packed runtime and affected images.\",\n filename ?? \"next.config.ts\",\n ));\n}\n\nfunction inspectProjectConfig(\n root: string,\n projectSource: BrandlabSourceIndex,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n const configPath = join(root, \"brandlab.config.ts\");\n const source = readOptionalText(configPath);\n recordEvaluation(evaluations, \"routes\", \"brandlab-config-missing\", \"brandlab-config-invalid\");\n if (!source) {\n findings.push(staticFinding({\n ruleId: \"brandlab-config-missing\",\n surface: \"routes\",\n path: \"brandlab.config.ts\",\n expected: \"One small typed Brandlab project configuration\",\n actual: \"brandlab.config.ts is missing.\",\n remediation: \"Add project identity, route families and enabled capabilities.\",\n }));\n return;\n }\n // 3.0 removed the profile field; a leftover one is reported as a retired API.\n if (\n !/\\bdefineBrandlabProject\\s*\\(\\s*\\{/.test(source) ||\n !/\\bprojectId\\s*:\\s*['\"][a-z0-9][a-z0-9-]*['\"]/.test(source)\n ) {\n findings.push(staticFinding({\n ruleId: \"brandlab-config-invalid\",\n surface: \"routes\",\n path: \"brandlab.config.ts\",\n expected: \"A literal defineBrandlabProject configuration with projectId\",\n actual: \"The minimum project identity contract could not be verified.\",\n remediation: \"Keep the configuration literal and limited to project variation.\",\n }));\n }\n\n const envKeys = parseEnvironmentKeys(readOptionalText(join(root, \".env.example\")) ?? \"\");\n const contracts = findContactContractRecipients(projectSource);\n if (/\\bcontact\\s*:\\s*\\{/.test(source) || contracts.length > 0) {\n requireEnvKey(findings, evaluations, envKeys, \"RESEND_API_KEY\", \"contact\");\n inspectContactRecipients(contracts, envKeys, findings, evaluations);\n }\n const reviewsConfig = source.match(/\\breviews\\s*:\\s*\\{([^{}]*)\\}/)?.[1] ?? \"\";\n const usesLiveGooglePlacesReviews =\n /\\bprovider\\s*:\\s*['\"]google-places['\"]/.test(reviewsConfig) &&\n /\\bmode\\s*:\\s*['\"](?:summary|full)['\"]/.test(reviewsConfig);\n if (usesLiveGooglePlacesReviews) {\n requireEnvKey(findings, evaluations, envKeys, \"GOOGLE_MAPS_PLATFORM_API_KEY\", \"reviews\");\n }\n recordEvaluation(evaluations, \"environment\", \"brandlab-environment-retired-contact-state\");\n for (const retired of [\"CONTACT_CONTEXT_SECRET\", \"KV_REST_API_URL\", \"KV_REST_API_TOKEN\"]) {\n if (envKeys.has(retired)) {\n findings.push(staticFinding({\n ruleId: \"brandlab-environment-retired-contact-state\",\n surface: \"environment\",\n path: \".env.example\",\n expected: \"Only current contact environment variables\",\n actual: `${retired} is still documented.`,\n remediation: `Remove ${retired}; it is not part of the simplified contact standard.`,\n }));\n }\n }\n}\n\n/** The environment variable key rule site-core applies to delivery.recipientEnv. */\nconst ENV_KEY_PATTERN = /^[A-Z][A-Z0-9_]*$/;\n\n/** Variable names documented in an env example file (`KEY=`, `export KEY=`); values are ignored. */\nexport function parseEnvironmentKeys(text: string): Set<string> {\n const keys = new Set<string>();\n for (const rawLine of text.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n const assignment = line.startsWith(\"export \") ? line.slice(\"export \".length).trimStart() : line;\n const separator = assignment.indexOf(\"=\");\n if (separator <= 0) continue;\n const key = assignment.slice(0, separator).trimEnd();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) keys.add(key);\n }\n return keys;\n}\n\n/** The recipient variable is whatever the contact contract declares, never an assumed name. */\nfunction inspectContactRecipients(\n contracts: ReturnType<typeof findContactContractRecipients>,\n envKeys: ReadonlySet<string>,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"contact\", \"brandlab-contact-recipient-env\");\n if (contracts.length === 0) {\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: \"src/config/contact.ts\",\n expected: \"One defineContactContract contract declaring delivery.recipientEnv\",\n actual: \"The contact capability is enabled but no contact contract was found.\",\n remediation: \"Declare the contact contract with defineContactContract in src/config/contact.ts.\",\n }));\n return;\n }\n for (const contract of contracts.filter(({ recipientEnv }) => !recipientEnv)) {\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: contract.path,\n line: contract.line,\n expected: \"delivery.recipientEnv declared as a literal environment variable key\",\n actual: \"The recipient environment variable could not be read from the contract.\",\n remediation: \"Write delivery.recipientEnv as a string literal such as 'CONTACT_EMAIL'.\",\n }));\n }\n for (const contract of contracts) {\n if (!contract.recipientEnv || ENV_KEY_PATTERN.test(contract.recipientEnv)) continue;\n findings.push(staticFinding({\n ruleId: \"brandlab-contact-recipient-env\",\n surface: \"contact\",\n path: contract.path,\n line: contract.line,\n expected: \"delivery.recipientEnv is an environment variable key (A-Z, 0-9 and _, starting with a letter)\",\n actual: `delivery.recipientEnv ${JSON.stringify(contract.recipientEnv.slice(0, 64))} is not an environment variable key.`,\n remediation: \"Name the recipient variable in upper case, for example 'CONTACT_EMAIL'.\",\n }));\n }\n const keys = [...new Set(contracts.flatMap(({ recipientEnv }) =>\n recipientEnv && ENV_KEY_PATTERN.test(recipientEnv) ? [recipientEnv] : []))];\n for (const key of keys.sort()) requireEnvKey(findings, evaluations, envKeys, key, \"contact\");\n}\n\nfunction requireEnvKey(\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n envKeys: ReadonlySet<string>,\n key: string,\n capability: string,\n) {\n const ruleId = `brandlab-environment-${capability}-${slugify(key)}`;\n recordEvaluation(evaluations, \"environment\", ruleId);\n if (envKeys.has(key)) return;\n findings.push(staticFinding({\n ruleId,\n surface: \"environment\",\n path: \".env.example\",\n expected: `${key} documented for the enabled ${capability} capability`,\n actual: `${key} is missing from .env.example.`,\n remediation: `Document the non-secret ${key} variable name without adding a credential value.`,\n }));\n}\n\nfunction inspectProjectSource(\n source: BrandlabSourceIndex,\n findings: BrandlabFinding[],\n evaluations: BrandlabRuleEvaluation[],\n) {\n recordEvaluation(evaluations, \"source\", \"brandlab-source-root-missing\");\n if (source.directoryRoots.length === 0) {\n findings.push(staticFinding({\n ruleId: \"brandlab-source-root-missing\",\n surface: \"source\",\n expected: `Project source under a recognised root (${BRANDLAB_SOURCE_ROOT_DIRECTORIES.map((name) => `${name}/`).join(\", \")})`,\n actual: \"No recognised source root was found, so no source rule could run.\",\n remediation: \"Keep application source under src/ (or a recognised legacy root) and rerun verification.\",\n }));\n }\n if (source.files.length === 0) return;\n for (const rule of SOURCE_RULES) recordEvaluation(evaluations, rule.surface, rule.ruleId);\n for (const file of source.files) {\n for (const rule of SOURCE_RULES) {\n const match = file.executable.match(rule.pattern);\n if (!match || match.index === undefined) continue;\n findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: file.path,\n line: lineAt(file.text, match.index),\n expected: rule.expected,\n actual: rule.actual ?? \"A project-owned implementation was detected.\",\n remediation: rule.remediation,\n }));\n }\n }\n}\n\n\nfunction readPackageJson(root: string): ProjectPackageJsonLike | null {\n const source = readOptionalText(join(root, \"package.json\"));\n if (!source) return null;\n try {\n return JSON.parse(source) as ProjectPackageJsonLike;\n } catch {\n return null;\n }\n}\n\nfunction readPackageLock(root: string): PackageLockInspection {\n const source = readOptionalText(join(root, \"package-lock.json\"));\n if (!source) return emptyPackageLock(\"missing\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n return emptyPackageLock(\"invalid\", { digest: digestBrandlabAuthority(source) });\n }\n if (!isRecord(parsed)) return emptyPackageLock(\"invalid\");\n const lockfileVersion =\n typeof parsed.lockfileVersion === \"number\" ? parsed.lockfileVersion : null;\n if (lockfileVersion !== 2 && lockfileVersion !== 3) {\n return emptyPackageLock(\"unsupported\", { lockfileVersion });\n }\n if (!isRecord(parsed.packages) || !isRecord(parsed.packages[\"\"])) {\n return emptyPackageLock(\"invalid\", { lockfileVersion });\n }\n\n const rootPackage = parsed.packages[\"\"];\n const rootDependencies = stringRecord(rootPackage.dependencies);\n const rootDevDependencies = stringRecord(rootPackage.devDependencies);\n const rootEngines = stringRecord(rootPackage.engines);\n const resolvedPackages = new Map<string, LockedPackage>();\n const packageNames = [\n ...BRANDLAB_SHARED_PACKAGE_NAMES,\n ...RUNTIME_PACKAGE_FIELDS.map(([name]) => name),\n \"sharp\",\n ];\n for (const packageName of packageNames) {\n const entry = parsed.packages[`node_modules/${packageName}`];\n if (!isRecord(entry)) continue;\n resolvedPackages.set(packageName, {\n version: typeof entry.version === \"string\" ? entry.version : null,\n resolved: typeof entry.resolved === \"string\" ? entry.resolved : null,\n integrity: typeof entry.integrity === \"string\" ? entry.integrity : null,\n linked: entry.link === true,\n });\n }\n const sharpResolutions = Object.entries(parsed.packages)\n .filter(([path]) => path === \"node_modules/sharp\" || path.endsWith(\"/node_modules/sharp\"))\n .map(([path, entry]) => ({\n path,\n version: isRecord(entry) && typeof entry.version === \"string\" ? entry.version : null,\n }))\n .sort((left, right) => left.path.localeCompare(right.path));\n return {\n state: \"valid\",\n lockfileVersion,\n rootDependencies,\n rootDevDependencies,\n rootEngines,\n resolvedPackages,\n sharpResolutions,\n fingerprint: {\n lockfileVersion,\n rootDependencies,\n rootDevDependencies,\n rootEngines,\n resolved: Object.fromEntries(\n [...resolvedPackages].map(([name, value]) => [\n name,\n { version: value.version, linked: value.linked },\n ]),\n ),\n sharpResolutions,\n },\n };\n}\n\nfunction emptyPackageLock(\n state: Exclude<PackageLockInspection[\"state\"], \"valid\">,\n fingerprint: Record<string, unknown> = {},\n): PackageLockInspection {\n return {\n state,\n lockfileVersion:\n typeof fingerprint.lockfileVersion === \"number\"\n ? fingerprint.lockfileVersion\n : null,\n rootDependencies: {},\n rootDevDependencies: {},\n rootEngines: {},\n resolvedPackages: new Map(),\n sharpResolutions: [],\n fingerprint: { state, ...fingerprint },\n };\n}\n\nfunction runtimeVersionSatisfiesRelease(\n packageName: (typeof RUNTIME_PACKAGE_FIELDS)[number][0],\n actual: string | null,\n expected: string,\n nextVersionPolicy?: \"exact\",\n): boolean {\n if (packageName === \"next\" && nextVersionPolicy === \"exact\") return actual === expected;\n if (!actual || !isBrandlabSemver(actual)) return false;\n if (![\"next\", \"react\", \"react-dom\"].includes(packageName)) return actual === expected;\n const actualParts = actual.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n const expectedParts = expected.match(/^(\\d+)\\.(\\d+)\\.(\\d+)$/);\n const sameSupportedLine = packageName === \"next\"\n ? actualParts?.[1] === expectedParts?.[1]\n : actualParts?.[1] === expectedParts?.[1] && actualParts?.[2] === expectedParts?.[2];\n return Boolean(\n actualParts &&\n expectedParts &&\n sameSupportedLine &&\n compareBrandlabSemver(actual, expected) >= 0,\n );\n}\n\nfunction runtimeExpectation(packageName: string, expected: string, nextVersionPolicy?: \"exact\"): string {\n if (packageName === \"next\" && nextVersionPolicy === \"exact\") return `${packageName}@${expected} (exact HEIF mitigation pin)`;\n if (packageName === \"next\") {\n return `${packageName}@${expected} or a newer exact stable release in the same major line`;\n }\n return [\"react\", \"react-dom\"].includes(packageName)\n ? `${packageName}@${expected} or a newer exact patch in the same major/minor line`\n : `${packageName}@${expected}`;\n}\n\nfunction isApprovedRegistryResolution(\n resolved: string,\n packageName: string,\n version: string,\n): boolean {\n try {\n const url = new URL(resolved);\n const artifact = packageName.split(\"/\").at(-1);\n return Boolean(\n artifact &&\n url.protocol === \"https:\" &&\n url.hostname === \"registry.npmjs.org\" &&\n url.pathname === `/${packageName}/-/${artifact}-${version}.tgz`,\n );\n } catch {\n return false;\n }\n}\n\nfunction declaredPackageSpec(\n packageJson: ProjectPackageJsonLike,\n packageName: string,\n): string | null {\n return (\n packageJson.dependencies?.[packageName] ??\n packageJson.devDependencies?.[packageName] ??\n null\n );\n}\n\nfunction lockedRootSpec(\n lock: PackageLockInspection,\n packageName: string,\n): string | null {\n return lock.rootDependencies[packageName] ?? lock.rootDevDependencies[packageName] ?? null;\n}\n\nfunction releaseFinding(\n ruleId: string,\n expected: string,\n actual: string,\n remediation: string,\n path?: string,\n): BrandlabFinding {\n return {\n ruleId,\n surface: \"release\",\n severity: \"blocker\",\n contract: { name: \"release\", version: \"current-release\" },\n evidenceKind: \"static\",\n ...(path ? { path } : {}),\n expected,\n actual,\n remediation,\n };\n}\n\nfunction runtimeFinding(\n ruleId: string,\n expected: string,\n actual: string,\n remediation: string,\n path: string,\n): BrandlabFinding {\n return {\n ruleId,\n surface: \"runtime\",\n severity: \"blocker\",\n contract: { name: \"runtime\", version: \"installed-release\" },\n evidenceKind: \"static\",\n path,\n expected,\n actual,\n remediation,\n };\n}\n\nfunction compareFindings(left: BrandlabFinding, right: BrandlabFinding): number {\n return (\n left.ruleId.localeCompare(right.ruleId) ||\n (left.path ?? \"\").localeCompare(right.path ?? \"\") ||\n (left.line ?? 0) - (right.line ?? 0)\n );\n}\n\nfunction stringRecord(value: unknown): Record<string, string> {\n if (!isRecord(value)) return {};\n return Object.fromEntries(\n Object.entries(value).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\",\n ),\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\nexport type { BrandlabContractVersions };\n"]}
|
package/dist/rule-registry.d.ts
CHANGED
|
@@ -251,6 +251,16 @@ export declare const BRANDLAB_STATIC_RULES: readonly [{
|
|
|
251
251
|
readonly surface: "schema";
|
|
252
252
|
readonly checkId: "structured-data";
|
|
253
253
|
readonly summary: "No self-serving AggregateRating schema.";
|
|
254
|
+
}, {
|
|
255
|
+
readonly ruleId: "brandlab-source-faq-howto-schema";
|
|
256
|
+
readonly surface: "schema";
|
|
257
|
+
readonly checkId: "structured-data";
|
|
258
|
+
readonly summary: "No FAQPage or HowTo markup.";
|
|
259
|
+
}, {
|
|
260
|
+
readonly ruleId: "brandlab-sitemap-build-time-lastmod";
|
|
261
|
+
readonly surface: "sitemap";
|
|
262
|
+
readonly checkId: "search-routing";
|
|
263
|
+
readonly summary: "Sitemap lastmod comes from content dates (lastSignificantChange), never new Date() or Date.now().";
|
|
254
264
|
}, {
|
|
255
265
|
readonly ruleId: "brandlab-source-synthetic-offer-schema";
|
|
256
266
|
readonly surface: "schema";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-registry.d.ts","sourceRoot":"","sources":["../src/rule-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,2BAA2B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"rule-registry.d.ts","sourceRoot":"","sources":["../src/rule-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,2BAA2B,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4DgB,CAAC;AAEnD,6FAA6F;AAC7F,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAM3F"}
|
package/dist/rule-registry.js
CHANGED
|
@@ -47,6 +47,8 @@ export const BRANDLAB_STATIC_RULES = [
|
|
|
47
47
|
{ ruleId: "brandlab-site-identity", surface: "metadata", checkId: "search-routing", summary: "Exactly one module declares the site identity (canonical URL, locale, titles) with defineBrandlabSite.", },
|
|
48
48
|
{ ruleId: "brandlab-source-raw-json-ld", surface: "schema", checkId: "structured-data", summary: "JSON-LD is rendered only by the shared schema component.", },
|
|
49
49
|
{ ruleId: "brandlab-source-self-serving-rating-schema", surface: "schema", checkId: "structured-data", summary: "No self-serving AggregateRating schema.", },
|
|
50
|
+
{ ruleId: "brandlab-source-faq-howto-schema", surface: "schema", checkId: "structured-data", summary: "No FAQPage or HowTo markup.", },
|
|
51
|
+
{ ruleId: "brandlab-sitemap-build-time-lastmod", surface: "sitemap", checkId: "search-routing", summary: "Sitemap lastmod comes from content dates (lastSignificantChange), never new Date() or Date.now().", },
|
|
50
52
|
{ ruleId: "brandlab-source-synthetic-offer-schema", surface: "schema", checkId: "structured-data", summary: "No invented Offer markup.", },
|
|
51
53
|
{ ruleId: "brandlab-source-local-google-reviews-fetch", surface: "reviews", checkId: "structured-data", summary: "Google Places reviews are fetched only by the shared review runtime.", },
|
|
52
54
|
{ ruleId: "brandlab-business-facts", surface: "business", checkId: "business-identity", summary: "Exactly one module declares the business facts with defineBrandlabBusiness.", },
|