@brandlab-digital/conformance 3.2.0 → 3.3.0
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/analytics-e2e.d.ts.map +1 -1
- package/dist/analytics-e2e.js +8 -3
- package/dist/analytics-e2e.js.map +1 -1
- package/dist/contact-e2e.d.ts.map +1 -1
- package/dist/contact-e2e.js +3 -1
- package/dist/contact-e2e.js.map +1 -1
- package/dist/current-release.js +5 -5
- package/dist/current-release.js.map +1 -1
- package/dist/engineering.d.ts +2 -0
- package/dist/engineering.d.ts.map +1 -1
- package/dist/engineering.js +197 -7
- package/dist/engineering.js.map +1 -1
- package/dist/estate.d.ts +7 -19
- package/dist/estate.d.ts.map +1 -1
- package/dist/estate.js +38 -2
- package/dist/estate.js.map +1 -1
- package/dist/knip.d.ts.map +1 -1
- package/dist/knip.js +3 -0
- package/dist/knip.js.map +1 -1
- package/dist/rule-registry.d.ts +5 -0
- package/dist/rule-registry.d.ts.map +1 -1
- package/dist/rule-registry.js +1 -0
- package/dist/rule-registry.js.map +1 -1
- package/dist/static-rules.d.ts.map +1 -1
- package/dist/static-rules.js +35 -1
- package/dist/static-rules.js.map +1 -1
- package/dist/verification-policy.js +1 -1
- package/dist/verification-policy.js.map +1 -1
- package/package.json +1 -1
package/dist/engineering.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineering.js","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, posix } from 'node:path';\nimport ts from 'typescript';\nimport { globMatch } from './glob.js';\nimport {\n collectBrandlabSource,\n createBrandlabModuleResolver,\n findImportedCalls,\n isDirectory,\n lineOfNode,\n listModuleReferences,\n objectPropertyValue,\n parseBrandlabSourceFile,\n walkProjectFiles,\n type BrandlabSourceFile,\n} from './source-files.js';\nimport { describeCapabilities } from './static-rules.js';\n\nexport const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'] as const;\n\n/** The exact fast verification command from the Brandlab 3.0 target (section 6). */\nexport const BRANDLAB_EXPECTED_VERIFY_SCRIPT =\n 'npm run check:standards && npm run typecheck && npm run lint && npm run test && npm run check:unused && npm run check:unused:production';\n\n/** Scripts whose exact values the 3.0 target fixes; dev and start must exist. */\nexport const BRANDLAB_EXPECTED_SCRIPTS: Readonly<Record<string, string>> = Object.freeze({\n build: 'next build',\n typecheck: 'next typegen && tsc --noEmit',\n lint: 'eslint .',\n test: 'vitest run',\n 'test:e2e': 'playwright test',\n 'check:unused': 'knip',\n 'check:unused:production': 'knip --production',\n 'check:standards': 'brandlab-verify --mode ci --engineering',\n});\n\nexport type EngineeringFindingSeverity = 'blocker' | 'info';\nexport interface EngineeringFinding { path: string; rule: string; message: string; severity: EngineeringFindingSeverity; line?: number }\nexport interface EngineeringCheck {\n status: 'pass' | 'blocked';\n findings: EngineeringFinding[];\n coverage: string;\n outstandingEvidence: readonly string[];\n}\n\ninterface PackageManifest {\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nconst SRC_DIRECTORIES = new Set(['app', 'config', 'data', 'content', 'lib', 'components', 'types']);\nconst SRC_ROOT_FILES = /^(?:instrumentation(?:-client)?|proxy|mdx-components)\\.(?:ts|tsx)$/;\nconst COMPONENT_ROLES = new Set(['layout', 'ui', 'sections', 'features', 'page-families']);\nconst TEST_DIRECTORIES = new Set(['config', 'data', 'lib', 'components', 'e2e', 'support']);\nconst RETIRED_ROOT_DIRECTORIES = ['app', 'components', 'data', 'lib', 'config', 'content', 'hooks', 'context', 'utils', 'src/components/templates'];\nconst DEV_TOOLING = ['eslint', 'vitest', '@playwright/test', 'knip'];\nconst NEXT_SPECIAL_FILE = /^(?:page|layout|template|loading|error|global-error|not-found|global-not-found|forbidden|unauthorized|default|route|opengraph-image|twitter-image|icon|apple-icon|sitemap|robots|manifest)\\.(?:ts|tsx|js|jsx|mdx)$/;\nconst CODE_OR_STYLE = /\\.(?:[cm]?[jt]sx?|mdx|css)$/;\nconst PASCAL_COMPONENT = /^[A-Z][A-Za-z0-9]*\\.tsx$/;\nconst CAMEL_MODULE = /^[a-z][A-Za-z0-9]*(?:\\.d)?\\.ts$/;\nconst SEMVER = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/;\n\n/** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */\nexport function checkEngineeringStructure(root: string): EngineeringCheck {\n const findings: EngineeringFinding[] = [];\n const add = (path: string, rule: string, message: string, extra: { severity?: EngineeringFindingSeverity; line?: number } = {}) =>\n findings.push({ path, rule, message, severity: extra.severity ?? 'blocker', ...(extra.line ? { line: extra.line } : {}) });\n let pkg: PackageManifest = {};\n try { pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')); }\n catch { add('package.json', 'package-readable', 'A readable package.json is required.'); }\n const config = existsSync(join(root, 'brandlab.config.ts')) ? readFileSync(join(root, 'brandlab.config.ts'), 'utf8') : null;\n const capabilities = describeCapabilities(root, config);\n\n inspectCommands(pkg, add);\n inspectDependencies(pkg, add);\n inspectLayout(root, capabilities, add);\n inspectSourceModules(root, add);\n inspectTests(root, capabilities, add);\n inspectToolPresets(root, add);\n inspectDelivery(root, add);\n\n return { status: findings.some(finding => finding.severity === 'blocker') ? 'blocked' : 'pass', findings,\n coverage: 'Static layout, naming, command, dependency-pin, tool-preset, CI, deployment and documentation structure only. This is not engineering-standard completion.',\n outstandingEvidence: ['Usage and deletion review including assets, configuration and dynamic references', 'Business data and component/style ownership review', 'Clean install, fast checks and production build', 'Full discovered technical URL estate', 'All distinct page families and important browser journeys', 'Exact-source protected Preview', 'Reporting/Ads provider cutover and authorised production verification'] };\n}\n\ntype Add = (path: string, rule: string, message: string, extra?: { severity?: EngineeringFindingSeverity; line?: number }) => void;\n\n// --- commands (section 6) ----------------------------------------------------\n\nfunction inspectCommands(pkg: PackageManifest, add: Add) {\n const scripts = pkg.scripts ?? {};\n for (const command of ['dev', 'start', ...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {\n if (!scripts[command]?.trim()) add('package.json', 'command-contract', `Missing ${command} command.`);\n }\n for (const [name, expected] of Object.entries(BRANDLAB_EXPECTED_SCRIPTS)) {\n const actual = scripts[name]?.trim();\n if (actual && actual.replace(/\\s+/g, ' ') !== expected) {\n add('package.json', 'script-contract', `${name} must be exactly \"${expected}\" (found \"${actual}\").`);\n }\n }\n const verify = scripts.verify?.trim();\n if (verify) {\n const unrecognised = splitCommandChain(verify).filter(segment => scriptReferences(segment, scripts) === null);\n if (unrecognised.length > 0) {\n add('package.json', 'verification-command-form',\n `verify may only chain package scripts (npm run <script>, npm test, run-s, run-p); \"${unrecognised.join('\", \"')}\" is not recognised. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n }\n const reachable = new Set<string>();\n const visit = (name: string) => {\n if (reachable.has(name)) return;\n reachable.add(name);\n for (const segment of splitCommandChain(scripts[name] ?? '')) {\n for (const reference of scriptReferences(segment, scripts) ?? []) visit(reference);\n }\n };\n visit('verify');\n for (const command of ENGINEERING_FAST_COMMANDS) {\n if (!reachable.has(command)) add('package.json', 'verification-wiring', `verify must execute ${command}. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n if (reachable.has('build')) add('package.json', 'single-build', 'Keep the production build separate from fast verify; run it once for the final candidate.');\n}\n\n/** Split a shell command on its chaining operators. */\nexport function splitCommandChain(command: string): string[] {\n return command.split(/&&|\\|\\||[;|&]/).map(segment => segment.trim()).filter(Boolean);\n}\n\n/**\n * The package scripts one command segment runs, or null when the segment is\n * not a recognised script invocation (npm run, npm test, run-s, run-p, npm-run-all).\n */\nexport function scriptReferences(segment: string, scripts: Readonly<Record<string, string>>): string[] | null {\n const words = segment.split(/\\s+/).filter(Boolean);\n while (words[0] && /^[A-Z_][A-Z0-9_]*=/.test(words[0])) words.shift();\n const [tool, ...rest] = words;\n if (tool === 'npm') {\n const [subcommand, ...args] = rest;\n if (subcommand === 'test' || subcommand === 't') return ['test'];\n if (subcommand === 'start' || subcommand === 'stop' || subcommand === 'restart') return [subcommand];\n if (subcommand === 'run' || subcommand === 'run-script') {\n const name = args.find(arg => !arg.startsWith('-'));\n return name ? [name] : null;\n }\n return null;\n }\n if (tool === 'run-s' || tool === 'run-p' || tool === 'npm-run-all') {\n const patterns: string[] = [];\n for (const word of rest) {\n if (word === '--') break;\n if (!word.startsWith('-')) patterns.push(word.replace(/^['\"]|['\"]$/g, ''));\n }\n if (patterns.length === 0) return null;\n // npm-run-all globs: `*` stays within one `:` segment; a whole `**` segment spans several.\n return patterns.flatMap(pattern => pattern.includes('*') || pattern.includes('?') || pattern.includes('[')\n ? Object.keys(scripts).filter(name => globMatch(pattern, name, { separator: ':', globstar: true }))\n : [pattern]);\n }\n return null;\n}\n\n// --- dependencies (section 1) ------------------------------------------------\n\nfunction inspectDependencies(pkg: PackageManifest, add: Add) {\n if (pkg.type !== 'module') add('package.json', 'module-type', 'Declare \"type\": \"module\".');\n const dependencies = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const tool of DEV_TOOLING) {\n const spec = pkg.devDependencies?.[tool];\n if (!spec || !SEMVER.test(spec)) add('package.json', 'dev-tooling', `Pin ${tool} exactly as a development dependency.`);\n }\n // Packed preflight binds the four Brandlab packages to local file: archives; the evaluator verifies those.\n const ranges = Object.entries(dependencies)\n .filter(([name, spec]) => !SEMVER.test(spec) && !(name.startsWith('@brandlab-digital/') && spec.startsWith('file:')))\n .map(([name, spec]) => `${name}@${spec}`);\n if (ranges.length > 0) add('package.json', 'exact-pins', `Pin every dependency to the exact locked version: ${ranges.sort().join(', ')}.`);\n const next = dependencies.next;\n for (const companion of ['eslint-config-next', '@next/mdx']) {\n const spec = dependencies[companion];\n if (spec && spec !== next) add('package.json', 'framework-companion-pin', `${companion} must equal the next version (${next ?? 'missing'}); found ${spec}.`);\n }\n if (!dependencies['eslint-config-next']) add('package.json', 'framework-companion-pin', 'Declare eslint-config-next at the exact next version for brandlab.configs.next.');\n if (pkg.dependencies?.sharp || pkg.devDependencies?.sharp) add('package.json', 'sharp-override-only', 'Remove the direct sharp dependency; the release-owned overrides.sharp pin is the only declaration.');\n}\n\n// --- layout and naming (section 2) --------------------------------------------\n\nfunction inspectLayout(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n for (const path of ['src/app', 'src/config', 'src/data', 'src/lib', 'src/components', 'tests']) {\n if (!isDirectory(join(root, path))) add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);\n }\n for (const path of RETIRED_ROOT_DIRECTORIES) {\n if (existsSync(join(root, path))) add(path, 'retired-source-layout', 'Migrate consumers to the current src responsibilities and remove the superseded directory.');\n }\n const required = [\n 'src/config/site.ts', 'src/config/analytics.ts', 'src/data/business.ts', 'src/data/routes.ts', 'src/data/redirects.ts',\n 'src/lib/seo/metadata.ts', 'src/instrumentation-client.ts', 'src/app/layout.tsx', 'src/app/robots.ts', 'src/app/sitemap.xml/route.ts',\n ...(capabilities.contactEnabled ? ['src/config/contact.ts', 'src/app/api/contact/route.ts'] : []),\n ...(capabilities.reviewsEnabled ? ['src/config/reviews.ts'] : []),\n ...(capabilities.locationsDeclared ? ['src/data/locations/estate.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'owner-file', `The 3.0 layout places this owner at ${path}.`);\n }\n for (const [path, message] of [\n ['src/config/env.ts', 'Remove the local environment parser; site configuration is a source constant.'],\n ['src/lib/analytics', 'Remove the local analytics layer; installBrandlabInstrumentation owns it.'],\n ['src/lib/contact/definition.ts', 'Remove the local contact definition; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/constants.ts', 'Remove the local contact constants; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/runtime.ts', 'Remove the local contact runtime; POST uses createBrandlabContactRouteHandler.'],\n ['src/components/analytics/GoogleTag.tsx', 'Render BrandlabGoogleTag directly in src/app/layout.tsx.'],\n ['src/components/analytics/CoreWebVitalsReporter.tsx', 'Remove the web-vitals reporter.'],\n ['src/lib/seo/sitemaps', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/sitemaps.ts', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/schema/sanitize.ts', 'Remove the local schema sanitiser; the packages own sanitising.'],\n ['src/lib/seo/schema/SchemaScript.tsx', 'Import SchemaScript from @brandlab-digital/site-next/schema.'],\n ['src/lib/seo/index.ts', 'Remove the SEO barrel and import each module directly.'],\n ] as const) {\n if (existsSync(join(root, path))) add(path, 'retired-file', message);\n }\n\n if (isDirectory(join(root, 'src'))) {\n for (const entry of readdirSync(join(root, 'src'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n const path = `src/${entry.name}`;\n if (entry.isDirectory() && SRC_DIRECTORIES.has(entry.name)) {\n if (entry.name === 'types' && walkProjectFiles(root, path).some(file => !file.endsWith('.d.ts'))) {\n add(path, 'standard-layout', 'src/types may hold only ambient .d.ts declarations.');\n }\n continue;\n }\n if (entry.isFile() && SRC_ROOT_FILES.test(entry.name)) continue;\n add(path, 'standard-layout', `${path} is outside the standard layout (src/{app,config,data,content,lib,components}).`);\n }\n }\n if (isDirectory(join(root, 'src/components'))) {\n for (const entry of readdirSync(join(root, 'src/components'), { withFileTypes: true })) {\n if (entry.name.startsWith('.') || entry.name === 'templates') continue;\n if (!entry.isDirectory() || !COMPONENT_ROLES.has(entry.name)) {\n add(`src/components/${entry.name}`, 'component-role', 'Components belong to one role: layout, ui, sections, features or page-families.');\n }\n }\n }\n for (const path of walkProjectFiles(root, 'src')) inspectFileName(root, path, add);\n}\n\nfunction inspectFileName(root: string, path: string, add: Add) {\n const name = posix.basename(path);\n const directory = posix.dirname(path);\n if (directory === 'src' && SRC_ROOT_FILES.test(name)) return;\n if (name.endsWith('.module.css')) {\n const component = name.replace(/\\.module\\.css$/, '');\n if (!['tsx', 'ts', 'jsx'].some(extension => existsSync(join(root, directory, `${component}.${extension}`)))) {\n add(path, 'file-naming', `Keep ${name} beside the ${component} component it styles.`);\n }\n return;\n }\n if (path.startsWith('src/app/')) {\n // Images, fonts and metadata assets are framework-consumed; only code and styles are placed.\n if (!CODE_OR_STYLE.test(name)) return;\n const segments = path.split('/');\n const privateFolder = segments.slice(2, -1).find(segment => segment.startsWith('_') && segment !== '_components');\n if (privateFolder) {\n add(path, 'route-local-code', `Route-local code belongs in src/app/<route>/_components/, not ${privateFolder}/.`);\n return;\n }\n if (!segments.includes('_components')) {\n if (NEXT_SPECIAL_FILE.test(name) || path === 'src/app/globals.css') return;\n add(path, 'route-local-code', 'Route-local code belongs in src/app/<route>/_components/; framework files keep their reserved names.');\n return;\n }\n }\n if (!/\\.(?:ts|tsx)$/.test(name) || path.startsWith('src/content/')) return;\n if (name.endsWith('.tsx') && !PASCAL_COMPONENT.test(name)) {\n add(path, 'file-naming', 'Components use PascalCase .tsx file names.');\n } else if (name.endsWith('.ts') && !CAMEL_MODULE.test(name)) {\n add(path, 'file-naming', 'Data and helper modules use camelCase .ts file names.');\n }\n if (path.startsWith('src/components/page-families/') && name.endsWith('.tsx') && !/^[A-Z][A-Za-z0-9]*Page\\.tsx$/.test(name)) {\n add(path, 'file-naming', 'Page families are named <RouteKind>Page.tsx.');\n }\n}\n\n// --- module structure: barrels, ui data imports, estate ----------------------\n\nfunction inspectSourceModules(root: string, add: Add) {\n const source = collectBrandlabSource(root);\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n for (const file of source.files.filter(candidate => candidate.path.startsWith('src/'))) {\n const references = listModuleReferences(file);\n const forwarding = forwardingExports(file);\n if (isBarrel(file)) {\n add(file.path, 'no-barrels', 'This module only re-exports other modules; import each owner directly.');\n } else {\n for (const line of forwarding) {\n add(file.path, 'no-forwarding-exports', 'This export forwards another module; import the owner directly.', { line });\n }\n }\n if (file.path.startsWith('src/components/ui/')) {\n for (const reference of references.filter(candidate => candidate.kind !== 'export')) {\n const resolved = resolver(file.path, reference.specifier);\n if (resolved?.startsWith('src/data/') || /^@\\/data(?:\\/|$)/.test(reference.specifier)) {\n add(file.path, 'ui-imports-data', 'UI primitives never import data modules; pass prepared props from a section or route.', { line: reference.line });\n }\n }\n }\n inspectRegistryDerivedEstate(file, add);\n }\n const estate = source.byPath.get('src/data/locations/estate.ts');\n if (estate) {\n inspectRetainedExclusions(estate, add);\n inspectSiteOwnedLocations(estate, add);\n }\n}\n\n/** Lines of `export ... from` statements and exports of names this module only imported. */\nfunction forwardingExports(file: BrandlabSourceFile): number[] {\n const source = parseBrandlabSourceFile(file);\n const imported = new Set(listModuleReferences(file).filter(reference => reference.kind === 'import').flatMap(reference => reference.bindings.map(binding => binding.local)));\n const lines: number[] = [];\n for (const statement of source.statements) {\n const forwards =\n (ts.isExportDeclaration(statement) && (statement.moduleSpecifier !== undefined ||\n (statement.exportClause !== undefined && ts.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.some(element => imported.has((element.propertyName ?? element.name).text))))) ||\n (ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression) && imported.has(statement.expression.text));\n if (forwards) lines.push(lineOfNode(file, statement));\n }\n return lines;\n}\n\n/** A module with no declarations or statements of its own besides imports and exports. */\nfunction isBarrel(file: BrandlabSourceFile): boolean {\n const statements = parseBrandlabSourceFile(file).statements;\n return statements.length > 0 && forwardingExports(file).length > 0 &&\n statements.every(statement => ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement) || ts.isExportAssignment(statement));\n}\n\nfunction inspectRegistryDerivedEstate(file: BrandlabSourceFile, add: Add) {\n const derived = listModuleReferences(file)\n .filter(reference => reference.kind === 'import' && /^@brandlab-digital\\/site-core\\//.test(reference.specifier))\n .flatMap(reference => reference.bindings.filter(binding => /WebsiteSuburbs$/.test(binding.imported)).map(binding => ({ ...binding, line: reference.line })));\n const namespaceUse = file.executable.match(/\\.\\s*([a-z][A-Za-z]*WebsiteSuburbs)\\b/);\n const first = derived[0] ?? (namespaceUse ? { imported: namespaceUse[1]!, line: lineAtIndex(file.text, namespaceUse.index ?? 0) } : null);\n if (!first) return;\n add(file.path, 'estate-registry-derived',\n `${first.imported} is a registry candidate list; the published estate in src/data/locations/estate.ts must be literal data, never derived from it.`, { line: first.line });\n}\n\nfunction inspectRetainedExclusions(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const retained = objectPropertyValue(call.arguments[0], 'retainedExclusions');\n if (!retained || !ts.isArrayLiteralExpression(retained) || retained.elements.length === 0) continue;\n const slugs = retained.elements.map(element => {\n if (ts.isStringLiteralLike(element)) return element.text;\n const slug = objectPropertyValue(element, 'slug');\n return slug && ts.isStringLiteralLike(slug) ? slug.text : null;\n }).filter((slug): slug is string => Boolean(slug));\n add(file.path, 'estate-retained-exclusions',\n `${retained.elements.length} policy-excluded location(s) stay published for a later SEO decision${slugs.length ? `: ${slugs.join(', ')}` : ''}.`,\n { severity: 'info', line: lineOfNode(file, retained) });\n }\n}\n\n/** An array literal, directly or through a top-level `const name = [...]` (optionally `as const`) in the same file. */\nfunction arrayLiteral(file: BrandlabSourceFile, node: ts.Expression | undefined): ts.ArrayLiteralExpression | undefined {\n const unwrap = (expression: ts.Expression | undefined): ts.Expression | undefined => {\n let current = expression;\n while (current && (ts.isAsExpression(current) || ts.isSatisfiesExpression(current) || ts.isParenthesizedExpression(current))) {\n current = current.expression;\n }\n return current;\n };\n const value = unwrap(node);\n if (value && ts.isArrayLiteralExpression(value)) return value;\n if (!value || !ts.isIdentifier(value)) return undefined;\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === value.text) {\n const initializer = unwrap(declaration.initializer);\n return initializer && ts.isArrayLiteralExpression(initializer) ? initializer : undefined;\n }\n }\n }\n return undefined;\n}\n\n/** Report the locations the site publishes outside the shared registry, with each group's reason. */\nfunction inspectSiteOwnedLocations(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const declared = objectPropertyValue(call.arguments[0], 'siteOwned');\n if (!declared) continue;\n const groups = arrayLiteral(file, declared);\n if (!groups) {\n add(file.path, 'estate-site-owned',\n 'siteOwned must be literal data in src/data/locations/estate.ts: [{ reason, slugs }], never derived.', { line: lineOfNode(file, declared) });\n continue;\n }\n if (groups.elements.length === 0) continue;\n let total = 0;\n const summaries = groups.elements.map(element => {\n const reason = objectPropertyValue(element, 'reason');\n const slugs = arrayLiteral(file, objectPropertyValue(element, 'slugs'));\n const count = slugs?.elements.length;\n total += count ?? 0;\n const label = reason && ts.isStringLiteralLike(reason) ? reason.text : 'a reason that is not a string literal';\n return `${count ?? 'an unknown number of'} for \"${label}\"`;\n });\n add(file.path, 'estate-site-owned',\n `${total} location(s) are published outside the shared geography registry, declared site-owned: ${summaries.join('; ')}.`,\n { severity: 'info', line: lineOfNode(file, groups) });\n }\n}\n\nfunction lineAtIndex(text: string, index: number): number {\n return text.slice(0, index).split('\\n').length;\n}\n\n// --- tests (sections 2 and 6) -------------------------------------------------\n\nfunction inspectTests(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n if (!isDirectory(join(root, 'tests'))) return;\n for (const entry of readdirSync(join(root, 'tests'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n if (!entry.isDirectory() || !TEST_DIRECTORIES.has(entry.name)) {\n add(`tests/${entry.name}`, 'test-layout', 'Tests live in tests/{config,data,lib,components,e2e,support}.');\n }\n }\n const required = [\n 'tests/data/routes.test.ts', 'tests/config/analytics.test.ts',\n 'tests/e2e/estate.spec.ts', 'tests/e2e/analytics.spec.ts', 'tests/e2e/families.spec.ts',\n ...(capabilities.contactEnabled ? ['tests/config/contact.test.ts', 'tests/e2e/contact.spec.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'shared-tests', `The shared 3.0 test set includes ${path}.`);\n }\n for (const path of walkProjectFiles(root, 'tests')) {\n if (/-darwin\\.png$/.test(path)) add(path, 'committed-snapshots', 'Delete committed darwin snapshots; rendered checks run against the CI build.');\n }\n}\n\n// --- dev presets (section 4) -------------------------------------------------\n\nfunction inspectToolPresets(root: string, add: Add) {\n const eslint = readOptional(join(root, 'eslint.config.mjs'));\n if (eslint === null) add('eslint.config.mjs', 'tool-preset', 'Add eslint.config.mjs: export default brandlab.configs.next.');\n else if (!/@brandlab-digital\\/eslint-plugin/.test(eslint) || !/export\\s+default\\s+[A-Za-z_$][\\w$]*\\.configs\\.next\\s*;?\\s*$/.test(eslint.trim())) {\n add('eslint.config.mjs', 'tool-preset', 'eslint.config.mjs is exactly `export default brandlab.configs.next` (imported from @brandlab-digital/eslint-plugin).');\n }\n const knip = readOptional(join(root, 'knip.ts'));\n if (knip === null) add('knip.ts', 'tool-preset', 'Add knip.ts: export default brandlabKnip({ mdx?, entry? }).');\n else if (!/@brandlab-digital\\/conformance\\/knip/.test(knip) || !/export\\s+default\\s+brandlabKnip\\s*\\(/.test(knip)) {\n add('knip.ts', 'tool-preset', 'knip.ts exports brandlabKnip({ mdx?, entry? }) from @brandlab-digital/conformance/knip.');\n }\n if (!['playwright.config.ts', 'playwright.config.mts'].some(name => existsSync(join(root, name)))) {\n add('playwright.config.ts', 'tool-preset', 'Add the Playwright configuration for the shared e2e specs.');\n }\n if (!['vitest.config.ts', 'vitest.config.mts'].some(name => existsSync(join(root, name)))) {\n add('vitest.config.ts', 'tool-preset', 'Add the Vitest configuration for the binding tests.');\n }\n}\n\n// --- CI, dependencies, Vercel and docs (section 6) ---------------------------\n\nfunction inspectDelivery(root: string, add: Add) {\n const workflowDirectory = join(root, '.github/workflows');\n const workflows = isDirectory(workflowDirectory) ? readdirSync(workflowDirectory).filter(name => /\\.ya?ml$/.test(name)).sort() : [];\n const callers = workflows.filter(name => /uses\\s*:\\s*['\"]?RomieDandan\\/brandlab\\/\\.github\\/workflows\\/verify-next\\.yml@/.test(readFileSync(join(workflowDirectory, name), 'utf8')));\n if (callers.length !== 1 || callers[0] !== 'verify.yml') {\n add('.github/workflows/verify.yml', 'ci-workflow', `Exactly one .github/workflows/verify.yml calls RomieDandan/brandlab/.github/workflows/verify-next.yml at the fleet SHA (found ${callers.length ? callers.join(', ') : 'none'}).`);\n }\n for (const path of ['.github/dependabot.yml', '.github/dependabot.yaml', 'renovate.json', 'renovate.json5', '.github/renovate.json', '.renovaterc', '.renovaterc.json']) {\n if (existsSync(join(root, path))) add(path, 'dependency-bots', 'Exact pins move with Brandlab releases; remove Dependabot/Renovate version updates.');\n }\n const vercel = readOptional(join(root, 'vercel.json'));\n let installCommand: unknown;\n try { installCommand = vercel === null ? undefined : JSON.parse(vercel).installCommand; } catch { installCommand = undefined; }\n if (installCommand !== 'npm ci') add('vercel.json', 'vercel-install', 'vercel.json sets installCommand to \"npm ci\" (keep any existing regions).');\n\n if (!existsSync(join(root, 'README.md'))) add('README.md', 'project-docs', 'Add the generated README.md (commands, architecture, environment names, deployment and rollback).');\n const agents = join(root, 'AGENTS.md');\n if (!existsSync(agents)) add('AGENTS.md', 'project-docs', 'Add AGENTS.md with the fixed sources of truth and guardrails.');\n else if (statSync(agents).size > 3_584) add('AGENTS.md', 'project-docs', `AGENTS.md is ${statSync(agents).size} bytes; keep it to about 3 KB and archive history to the control repo.`);\n const claude = readOptional(join(root, 'CLAUDE.md'));\n if (claude === null || claude.trim() !== '@AGENTS.md') add('CLAUDE.md', 'project-docs', 'CLAUDE.md is the single line @AGENTS.md.');\n}\n\nfunction readOptional(path: string): string | null {\n return existsSync(path) ? readFileSync(path, 'utf8') : null;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"engineering.js","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';\nimport { join, posix } from 'node:path';\nimport ts from 'typescript';\nimport { globMatch } from './glob.js';\nimport {\n collectBrandlabSource,\n createBrandlabModuleResolver,\n findImportedCalls,\n isDirectory,\n lineOfNode,\n listModuleReferences,\n objectPropertyValue,\n parseBrandlabSourceFile,\n walkProjectFiles,\n type BrandlabSourceFile,\n type BrandlabSourceIndex,\n} from './source-files.js';\nimport { describeCapabilities } from './static-rules.js';\n\nexport const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'] as const;\n\n/** The exact fast verification command from the Brandlab 3.0 target (section 6). */\nexport const BRANDLAB_EXPECTED_VERIFY_SCRIPT =\n 'npm run check:standards && npm run typecheck && npm run lint && npm run test && npm run check:unused && npm run check:unused:production';\n\n/** Scripts whose exact values the 3.0 target fixes; dev and start must exist. */\nexport const BRANDLAB_EXPECTED_SCRIPTS: Readonly<Record<string, string>> = Object.freeze({\n build: 'next build',\n typecheck: 'next typegen && tsc --noEmit',\n lint: 'eslint .',\n test: 'vitest run',\n 'test:e2e': 'playwright test',\n 'check:unused': 'knip',\n 'check:unused:production': 'knip --production',\n 'check:standards': 'brandlab-verify --mode ci --engineering',\n});\n\nexport type EngineeringFindingSeverity = 'blocker' | 'info';\nexport interface EngineeringFinding { path: string; rule: string; message: string; severity: EngineeringFindingSeverity; line?: number }\nexport interface EngineeringCheck {\n status: 'pass' | 'blocked';\n findings: EngineeringFinding[];\n coverage: string;\n outstandingEvidence: readonly string[];\n}\n\ninterface PackageManifest {\n type?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nconst SRC_DIRECTORIES = new Set(['app', 'config', 'data', 'content', 'lib', 'components', 'types']);\nconst SRC_ROOT_FILES = /^(?:instrumentation(?:-client)?|proxy|mdx-components)\\.(?:ts|tsx)$/;\nconst COMPONENT_ROLES = new Set(['layout', 'ui', 'sections', 'features', 'page-families']);\nconst TEST_DIRECTORIES = new Set(['config', 'data', 'lib', 'components', 'e2e', 'support']);\nconst RETIRED_ROOT_DIRECTORIES = ['app', 'components', 'data', 'lib', 'config', 'content', 'hooks', 'context', 'utils', 'src/components/templates'];\nconst DEV_TOOLING = ['eslint', 'vitest', '@playwright/test', 'knip'];\nconst NEXT_SPECIAL_FILE = /^(?:page|layout|template|loading|error|global-error|not-found|global-not-found|forbidden|unauthorized|default|route|opengraph-image|twitter-image|icon|apple-icon|sitemap|robots|manifest)\\.(?:ts|tsx|js|jsx|mdx)$/;\nconst CODE_OR_STYLE = /\\.(?:[cm]?[jt]sx?|mdx|css)$/;\nconst PASCAL_COMPONENT = /^[A-Z][A-Za-z0-9]*\\.tsx$/;\nconst CAMEL_MODULE = /^[a-z][A-Za-z0-9]*(?:\\.d)?\\.ts$/;\nconst SEMVER = /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?$/;\n\n/** The Vercel function region of every Brandlab site (3.2.1): Sydney. */\nexport const BRANDLAB_FUNCTION_REGION = 'syd1';\n/** The contact route's delivery options (labels, email style, attachment policy): server-only (3.2.1). */\nconst CONTACT_RUNTIME = 'src/config/contactRuntime.ts';\n/** The business facts' evidence (defineBrandlabBusiness): server-only (3.2.1). */\nconst BUSINESS_EVIDENCE = 'src/data/businessEvidence.ts';\nconst BUSINESS_VALUES = 'src/data/business.ts';\nconst SITE_IDENTITY = 'src/config/site.ts';\nconst BUSINESS_FACT_CALLS = /\\b(?:defineBrandlabBusiness|verifiedFact|unknownFact|notApplicableFact)\\s*\\(/;\n\n/** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */\nexport function checkEngineeringStructure(root: string): EngineeringCheck {\n directoryListings.clear();\n const findings: EngineeringFinding[] = [];\n const add = (path: string, rule: string, message: string, extra: { severity?: EngineeringFindingSeverity; line?: number } = {}) =>\n findings.push({ path, rule, message, severity: extra.severity ?? 'blocker', ...(extra.line ? { line: extra.line } : {}) });\n let pkg: PackageManifest = {};\n try { pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')); }\n catch { add('package.json', 'package-readable', 'A readable package.json is required.'); }\n const config = existsSync(join(root, 'brandlab.config.ts')) ? readFileSync(join(root, 'brandlab.config.ts'), 'utf8') : null;\n const capabilities = describeCapabilities(root, config);\n\n const source = collectBrandlabSource(root);\n\n inspectCommands(pkg, add);\n inspectDependencies(pkg, add);\n inspectLayout(root, capabilities, add);\n inspectSourceModules(root, source, add);\n inspectServerBoundaries(root, capabilities, source, add);\n inspectTests(root, capabilities, add);\n inspectToolPresets(root, add);\n inspectDelivery(root, add);\n\n return { status: findings.some(finding => finding.severity === 'blocker') ? 'blocked' : 'pass', findings,\n coverage: 'Static layout, naming, command, dependency-pin, tool-preset, CI, deployment and documentation structure only. This is not engineering-standard completion.',\n outstandingEvidence: ['Usage and deletion review including assets, configuration and dynamic references', 'Business data and component/style ownership review', 'Clean install, fast checks and production build', 'Full discovered technical URL estate', 'All distinct page families and important browser journeys', 'Exact-source protected Preview', 'Reporting/Ads provider cutover and authorised production verification'] };\n}\n\ntype Add = (path: string, rule: string, message: string, extra?: { severity?: EngineeringFindingSeverity; line?: number }) => void;\n\n// --- commands (section 6) ----------------------------------------------------\n\nfunction inspectCommands(pkg: PackageManifest, add: Add) {\n const scripts = pkg.scripts ?? {};\n for (const command of ['dev', 'start', ...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {\n if (!scripts[command]?.trim()) add('package.json', 'command-contract', `Missing ${command} command.`);\n }\n for (const [name, expected] of Object.entries(BRANDLAB_EXPECTED_SCRIPTS)) {\n const actual = scripts[name]?.trim();\n if (actual && actual.replace(/\\s+/g, ' ') !== expected) {\n add('package.json', 'script-contract', `${name} must be exactly \"${expected}\" (found \"${actual}\").`);\n }\n }\n const verify = scripts.verify?.trim();\n if (verify) {\n const unrecognised = splitCommandChain(verify).filter(segment => scriptReferences(segment, scripts) === null);\n if (unrecognised.length > 0) {\n add('package.json', 'verification-command-form',\n `verify may only chain package scripts (npm run <script>, npm test, run-s, run-p); \"${unrecognised.join('\", \"')}\" is not recognised. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n }\n const reachable = new Set<string>();\n const visit = (name: string) => {\n if (reachable.has(name)) return;\n reachable.add(name);\n for (const segment of splitCommandChain(scripts[name] ?? '')) {\n for (const reference of scriptReferences(segment, scripts) ?? []) visit(reference);\n }\n };\n visit('verify');\n for (const command of ENGINEERING_FAST_COMMANDS) {\n if (!reachable.has(command)) add('package.json', 'verification-wiring', `verify must execute ${command}. Expected \"${BRANDLAB_EXPECTED_VERIFY_SCRIPT}\".`);\n }\n if (reachable.has('build')) add('package.json', 'single-build', 'Keep the production build separate from fast verify; run it once for the final candidate.');\n}\n\n/** Split a shell command on its chaining operators. */\nexport function splitCommandChain(command: string): string[] {\n return command.split(/&&|\\|\\||[;|&]/).map(segment => segment.trim()).filter(Boolean);\n}\n\n/**\n * The package scripts one command segment runs, or null when the segment is\n * not a recognised script invocation (npm run, npm test, run-s, run-p, npm-run-all).\n */\nexport function scriptReferences(segment: string, scripts: Readonly<Record<string, string>>): string[] | null {\n const words = segment.split(/\\s+/).filter(Boolean);\n while (words[0] && /^[A-Z_][A-Z0-9_]*=/.test(words[0])) words.shift();\n const [tool, ...rest] = words;\n if (tool === 'npm') {\n const [subcommand, ...args] = rest;\n if (subcommand === 'test' || subcommand === 't') return ['test'];\n if (subcommand === 'start' || subcommand === 'stop' || subcommand === 'restart') return [subcommand];\n if (subcommand === 'run' || subcommand === 'run-script') {\n const name = args.find(arg => !arg.startsWith('-'));\n return name ? [name] : null;\n }\n return null;\n }\n if (tool === 'run-s' || tool === 'run-p' || tool === 'npm-run-all') {\n const patterns: string[] = [];\n for (const word of rest) {\n if (word === '--') break;\n if (!word.startsWith('-')) patterns.push(word.replace(/^['\"]|['\"]$/g, ''));\n }\n if (patterns.length === 0) return null;\n // npm-run-all globs: `*` stays within one `:` segment; a whole `**` segment spans several.\n return patterns.flatMap(pattern => pattern.includes('*') || pattern.includes('?') || pattern.includes('[')\n ? Object.keys(scripts).filter(name => globMatch(pattern, name, { separator: ':', globstar: true }))\n : [pattern]);\n }\n return null;\n}\n\n// --- dependencies (section 1) ------------------------------------------------\n\nfunction inspectDependencies(pkg: PackageManifest, add: Add) {\n if (pkg.type !== 'module') add('package.json', 'module-type', 'Declare \"type\": \"module\".');\n const dependencies = { ...pkg.dependencies, ...pkg.devDependencies };\n for (const tool of DEV_TOOLING) {\n const spec = pkg.devDependencies?.[tool];\n if (!spec || !SEMVER.test(spec)) add('package.json', 'dev-tooling', `Pin ${tool} exactly as a development dependency.`);\n }\n // Packed preflight binds the four Brandlab packages to local file: archives; the evaluator verifies those.\n const ranges = Object.entries(dependencies)\n .filter(([name, spec]) => !SEMVER.test(spec) && !(name.startsWith('@brandlab-digital/') && spec.startsWith('file:')))\n .map(([name, spec]) => `${name}@${spec}`);\n if (ranges.length > 0) add('package.json', 'exact-pins', `Pin every dependency to the exact locked version: ${ranges.sort().join(', ')}.`);\n const next = dependencies.next;\n for (const companion of ['eslint-config-next', '@next/mdx']) {\n const spec = dependencies[companion];\n if (spec && spec !== next) add('package.json', 'framework-companion-pin', `${companion} must equal the next version (${next ?? 'missing'}); found ${spec}.`);\n }\n if (!dependencies['eslint-config-next']) add('package.json', 'framework-companion-pin', 'Declare eslint-config-next at the exact next version for brandlab.configs.next.');\n if (pkg.dependencies?.sharp || pkg.devDependencies?.sharp) add('package.json', 'sharp-override-only', 'Remove the direct sharp dependency; the release-owned overrides.sharp pin is the only declaration.');\n}\n\n// --- layout and naming (section 2) --------------------------------------------\n\nfunction inspectLayout(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n for (const path of ['src/app', 'src/config', 'src/data', 'src/lib', 'src/components', 'tests']) {\n if (!isDirectory(join(root, path))) add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);\n }\n for (const path of RETIRED_ROOT_DIRECTORIES) {\n if (existsSync(join(root, path))) add(path, 'retired-source-layout', 'Migrate consumers to the current src responsibilities and remove the superseded directory.');\n }\n const required = [\n 'src/config/site.ts', 'src/config/analytics.ts', 'src/data/business.ts', 'src/data/routes.ts', 'src/data/redirects.ts',\n 'src/lib/seo/metadata.ts', 'src/instrumentation-client.ts', 'src/app/layout.tsx', 'src/app/robots.ts', 'src/app/sitemap.xml/route.ts',\n 'src/data/businessEvidence.ts',\n ...(capabilities.contactEnabled ? ['src/config/contact.ts', CONTACT_RUNTIME, 'src/app/api/contact/route.ts'] : []),\n ...(capabilities.reviewsEnabled ? ['src/config/reviews.ts'] : []),\n ...(capabilities.locationsDeclared ? ['src/data/locations/estate.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'owner-file', `The 3.0 layout places this owner at ${path}.`);\n }\n for (const [path, message] of [\n ['src/config/env.ts', 'Remove the local environment parser; site configuration is a source constant.'],\n ['src/lib/analytics', 'Remove the local analytics layer; installBrandlabInstrumentation owns it.'],\n ['src/lib/contact/definition.ts', 'Remove the local contact definition; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/constants.ts', 'Remove the local contact constants; the contract lives in src/config/contact.ts.'],\n ['src/lib/contact/runtime.ts', 'Remove the local contact runtime; POST uses createBrandlabContactRouteHandler.'],\n ['src/components/analytics/GoogleTag.tsx', 'Render BrandlabGoogleTag directly in src/app/layout.tsx.'],\n ['src/components/analytics/CoreWebVitalsReporter.tsx', 'Remove the web-vitals reporter.'],\n ['src/lib/seo/sitemaps', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/sitemaps.ts', 'Remove the local sitemap builders; the sitemap route uses createBrandlabSitemapRoute.'],\n ['src/lib/seo/schema/sanitize.ts', 'Remove the local schema sanitiser; the packages own sanitising.'],\n ['src/lib/seo/schema/SchemaScript.tsx', 'Import SchemaScript from @brandlab-digital/site-next/schema.'],\n ['src/lib/seo/index.ts', 'Remove the SEO barrel and import each module directly.'],\n ] as const) {\n if (existsSync(join(root, path))) add(path, 'retired-file', message);\n }\n\n if (isDirectory(join(root, 'src'))) {\n for (const entry of readdirSync(join(root, 'src'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n const path = `src/${entry.name}`;\n if (entry.isDirectory() && SRC_DIRECTORIES.has(entry.name)) {\n if (entry.name === 'types' && walkProjectFiles(root, path).some(file => !file.endsWith('.d.ts'))) {\n add(path, 'standard-layout', 'src/types may hold only ambient .d.ts declarations.');\n }\n continue;\n }\n if (entry.isFile() && SRC_ROOT_FILES.test(entry.name)) continue;\n add(path, 'standard-layout', `${path} is outside the standard layout (src/{app,config,data,content,lib,components}).`);\n }\n }\n if (isDirectory(join(root, 'src/components'))) {\n for (const entry of readdirSync(join(root, 'src/components'), { withFileTypes: true })) {\n if (entry.name.startsWith('.') || entry.name === 'templates') continue;\n if (!entry.isDirectory() || !COMPONENT_ROLES.has(entry.name)) {\n add(`src/components/${entry.name}`, 'component-role', 'Components belong to one role: layout, ui, sections, features or page-families.');\n }\n }\n }\n for (const path of walkProjectFiles(root, 'src')) inspectFileName(root, path, add);\n}\n\nfunction inspectFileName(root: string, path: string, add: Add) {\n const name = posix.basename(path);\n const directory = posix.dirname(path);\n if (directory === 'src' && SRC_ROOT_FILES.test(name)) return;\n if (name.endsWith('.module.css')) {\n const component = name.replace(/\\.module\\.css$/, '');\n // Exact names from the directory listing: existsSync is case-insensitive on macOS but not on the Linux CI\n // (H&R's button.module.css beside Button.tsx passed locally and failed in CI).\n const siblings = directoryEntries(join(root, directory));\n if (!['tsx', 'ts', 'jsx'].some(extension => siblings.has(`${component}.${extension}`))) {\n add(path, 'file-naming', `Keep ${name} beside the ${component} component it styles (the file names must match exactly, including case).`);\n }\n return;\n }\n if (path.startsWith('src/app/')) {\n // Images, fonts and metadata assets are framework-consumed; only code and styles are placed.\n if (!CODE_OR_STYLE.test(name)) return;\n const segments = path.split('/');\n const privateFolder = segments.slice(2, -1).find(segment => segment.startsWith('_') && segment !== '_components');\n if (privateFolder) {\n add(path, 'route-local-code', `Route-local code belongs in src/app/<route>/_components/, not ${privateFolder}/.`);\n return;\n }\n if (!segments.includes('_components')) {\n if (NEXT_SPECIAL_FILE.test(name) || path === 'src/app/globals.css') return;\n add(path, 'route-local-code', 'Route-local code belongs in src/app/<route>/_components/; framework files keep their reserved names.');\n return;\n }\n }\n if (!/\\.(?:ts|tsx)$/.test(name) || path.startsWith('src/content/')) return;\n if (name.endsWith('.tsx') && !PASCAL_COMPONENT.test(name)) {\n add(path, 'file-naming', 'Components use PascalCase .tsx file names.');\n } else if (name.endsWith('.ts') && !CAMEL_MODULE.test(name)) {\n add(path, 'file-naming', 'Data and helper modules use camelCase .ts file names.');\n }\n if (path.startsWith('src/components/page-families/') && name.endsWith('.tsx') && !/^[A-Z][A-Za-z0-9]*Page\\.tsx$/.test(name)) {\n add(path, 'file-naming', 'Page families are named <RouteKind>Page.tsx.');\n }\n}\n\n// --- module structure: barrels, ui data imports, estate ----------------------\n\nfunction inspectSourceModules(root: string, source: BrandlabSourceIndex, add: Add) {\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n for (const file of source.files.filter(candidate => candidate.path.startsWith('src/'))) {\n const references = listModuleReferences(file);\n const forwarding = forwardingExports(file);\n if (isBarrel(file)) {\n add(file.path, 'no-barrels', 'This module only re-exports other modules; import each owner directly.');\n } else {\n for (const line of forwarding) {\n add(file.path, 'no-forwarding-exports', 'This export forwards another module; import the owner directly.', { line });\n }\n }\n if (file.path.startsWith('src/components/ui/')) {\n for (const reference of references.filter(candidate => candidate.kind !== 'export')) {\n const resolved = resolver(file.path, reference.specifier);\n if (resolved?.startsWith('src/data/') || /^@\\/data(?:\\/|$)/.test(reference.specifier)) {\n add(file.path, 'ui-imports-data', 'UI primitives never import data modules; pass prepared props from a section or route.', { line: reference.line });\n }\n }\n }\n inspectRegistryDerivedEstate(file, add);\n }\n const estate = source.byPath.get('src/data/locations/estate.ts');\n if (estate) {\n inspectRetainedExclusions(estate, add);\n inspectSiteOwnedLocations(estate, add);\n }\n}\n\n// --- server-only boundaries (3.2.1) ------------------------------------------\n\n/**\n * What a browser bundle must never carry. The contact route's delivery options and\n * the business evidence live in server-only modules, alias hosts in next.config, and\n * no module a client component reaches imports a server-only module or holds an\n * evidence record. (Next's build also refuses a client import of `server-only`; this\n * names the chain before a build is needed.)\n */\nfunction inspectServerBoundaries(\n root: string,\n capabilities: ReturnType<typeof describeCapabilities>,\n source: BrandlabSourceIndex,\n add: Add,\n) {\n const contact = source.byPath.get('src/config/contact.ts');\n const runtime = source.byPath.get(CONTACT_RUNTIME);\n if (capabilities.contactEnabled && runtime) {\n if (!importsServerOnly(runtime)) {\n add(CONTACT_RUNTIME, 'server-only-module', `${CONTACT_RUNTIME} imports 'server-only', so no client component can bundle the delivery options.`);\n }\n if (!declaresName(runtime, 'contactRuntime')) {\n add(CONTACT_RUNTIME, 'contact-runtime', `${CONTACT_RUNTIME} exports contactRuntime (the labels, email style and attachment policy createBrandlabContactRouteHandler takes).`);\n }\n }\n const moved = contact ? declaresName(contact, 'contactRuntime') : undefined;\n if (contact && moved) {\n add('src/config/contact.ts', 'contact-runtime', `contactRuntime belongs in ${CONTACT_RUNTIME}: the contact form imports src/config/contact.ts, so everything contactRuntime reads (the site identity, business data) reaches the browser.`, { line: moved });\n }\n\n const evidence = source.byPath.get(BUSINESS_EVIDENCE);\n if (evidence) {\n if (!importsServerOnly(evidence)) {\n add(BUSINESS_EVIDENCE, 'server-only-module', `${BUSINESS_EVIDENCE} imports 'server-only', so no client component can bundle the evidence records.`);\n }\n if (findImportedCalls(evidence, /^@brandlab-digital\\/site-core\\/business$/, 'defineBrandlabBusiness').length === 0) {\n add(BUSINESS_EVIDENCE, 'business-evidence', `${BUSINESS_EVIDENCE} declares the business facts with defineBrandlabBusiness, each with its evidence.`);\n }\n }\n const values = source.byPath.get(BUSINESS_VALUES);\n if (values) {\n const call = BUSINESS_FACT_CALLS.exec(values.executable);\n const record = evidenceRecordLines(values)[0];\n if (call || record) {\n add(BUSINESS_VALUES, 'business-evidence', `${BUSINESS_VALUES} holds the display values only (businessFacts); defineBrandlabBusiness and the evidence belong in ${BUSINESS_EVIDENCE}, which stays on the server.`,\n { line: record ?? lineAtIndex(values.text, call!.index) });\n }\n }\n\n const site = source.byPath.get(SITE_IDENTITY);\n const aliasHosts = site ? declaredAliasHosts(site) : undefined;\n if (aliasHosts) {\n add(SITE_IDENTITY, 'alias-hosts', 'Declare the alias hosts in next.config.ts with defineBrandlabNextConfig({ aliasHosts }): client components import the site identity, so its alias hosts reach the browser.', { line: aliasHosts });\n }\n\n const resolver = createBrandlabModuleResolver(root, new Set(source.byPath.keys()));\n const reached = new Map<string, string | null>();\n const queue = source.files.filter(file => file.path.startsWith('src/') && (isClientModule(file) || /^src\\/instrumentation-client\\.[cm]?[jt]sx?$/.test(file.path)));\n for (const file of queue) reached.set(file.path, null);\n while (queue.length > 0) {\n const file = queue.shift()!;\n for (const reference of listModuleReferences(file)) {\n if (reference.typeOnly) continue;\n const target = resolver(file.path, reference.specifier);\n if (!target || reached.has(target)) continue;\n reached.set(target, file.path);\n const next = source.byPath.get(target);\n if (next) queue.push(next);\n }\n }\n const chain = (path: string) => {\n const steps: string[] = [];\n for (let at: string | null | undefined = path; at; at = reached.get(at)) steps.unshift(at);\n return steps.join(' → ');\n };\n for (const path of [...reached.keys()].sort()) {\n const file = source.byPath.get(path);\n if (!file) continue;\n if (importsServerOnly(file)) {\n add(path, 'client-bundle-boundary', `A client component imports this server-only module (${chain(path)}); pass what it needs as props from a server component.`);\n continue;\n }\n const record = evidenceRecordLines(file)[0];\n if (record) {\n add(path, 'client-bundle-boundary', `An evidence record (sourceKind, verifiedAt) reaches the browser (${chain(path)}); keep evidence in ${BUSINESS_EVIDENCE}.`, { line: record });\n }\n }\n}\n\n/** A module whose directive prologue says 'use client'. */\nfunction isClientModule(file: BrandlabSourceFile): boolean {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isExpressionStatement(statement) || !ts.isStringLiteral(statement.expression)) return false;\n if (statement.expression.text === 'use client') return true;\n }\n return false;\n}\n\n/** `import 'server-only'` at the top level. */\nfunction importsServerOnly(file: BrandlabSourceFile): boolean {\n return parseBrandlabSourceFile(file).statements.some(statement =>\n ts.isImportDeclaration(statement) && !statement.importClause &&\n ts.isStringLiteral(statement.moduleSpecifier) && statement.moduleSpecifier.text === 'server-only');\n}\n\n/** The line of a top-level declaration of `name`, if the module declares it. */\nfunction declaresName(file: BrandlabSourceFile, name: string): number | undefined {\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === name) return lineOfNode(file, statement);\n }\n } else if ((ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) && statement.name?.text === name) {\n return lineOfNode(file, statement);\n }\n }\n return undefined;\n}\n\n/** Lines of object literals that are evidence records: they name both sourceKind and verifiedAt. */\nfunction evidenceRecordLines(file: BrandlabSourceFile): number[] {\n const lines: number[] = [];\n const visit = (node: ts.Node) => {\n if (ts.isObjectLiteralExpression(node)) {\n const names = new Set(node.properties.map(property => property.name && (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) ? property.name.text : ''));\n if (names.has('sourceKind') && names.has('verifiedAt')) lines.push(lineOfNode(file, node));\n }\n ts.forEachChild(node, visit);\n };\n visit(parseBrandlabSourceFile(file));\n return lines;\n}\n\n/** The line of a non-empty `aliasHosts` in the defineBrandlabSite call. */\nfunction declaredAliasHosts(file: BrandlabSourceFile): number | undefined {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/site$/, 'defineBrandlabSite')) {\n let definition: ts.Expression | undefined = call.arguments[0];\n while (definition && (ts.isAsExpression(definition) || ts.isSatisfiesExpression(definition) || ts.isParenthesizedExpression(definition))) {\n definition = definition.expression;\n }\n if (!definition || !ts.isObjectLiteralExpression(definition)) continue;\n const property = definition.properties.find(candidate =>\n (ts.isPropertyAssignment(candidate) || ts.isShorthandPropertyAssignment(candidate)) &&\n (ts.isIdentifier(candidate.name) || ts.isStringLiteral(candidate.name)) && candidate.name.text === 'aliasHosts');\n if (!property) continue;\n const array = ts.isPropertyAssignment(property)\n ? arrayLiteral(file, property.initializer)\n : ts.isShorthandPropertyAssignment(property) ? arrayLiteral(file, property.name) : undefined;\n if (array && array.elements.length === 0) continue;\n return lineOfNode(file, property);\n }\n return undefined;\n}\n\n/** Lines of `export ... from` statements and exports of names this module only imported. */\nfunction forwardingExports(file: BrandlabSourceFile): number[] {\n const source = parseBrandlabSourceFile(file);\n const imported = new Set(listModuleReferences(file).filter(reference => reference.kind === 'import').flatMap(reference => reference.bindings.map(binding => binding.local)));\n const lines: number[] = [];\n for (const statement of source.statements) {\n const forwards =\n (ts.isExportDeclaration(statement) && (statement.moduleSpecifier !== undefined ||\n (statement.exportClause !== undefined && ts.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.some(element => imported.has((element.propertyName ?? element.name).text))))) ||\n (ts.isExportAssignment(statement) && ts.isIdentifier(statement.expression) && imported.has(statement.expression.text));\n if (forwards) lines.push(lineOfNode(file, statement));\n }\n return lines;\n}\n\n/** A module with no declarations or statements of its own besides imports and exports. */\nfunction isBarrel(file: BrandlabSourceFile): boolean {\n const statements = parseBrandlabSourceFile(file).statements;\n return statements.length > 0 && forwardingExports(file).length > 0 &&\n statements.every(statement => ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement) || ts.isExportAssignment(statement));\n}\n\nfunction inspectRegistryDerivedEstate(file: BrandlabSourceFile, add: Add) {\n const derived = listModuleReferences(file)\n .filter(reference => reference.kind === 'import' && /^@brandlab-digital\\/site-core\\//.test(reference.specifier))\n .flatMap(reference => reference.bindings.filter(binding => /WebsiteSuburbs$/.test(binding.imported)).map(binding => ({ ...binding, line: reference.line })));\n const namespaceUse = file.executable.match(/\\.\\s*([a-z][A-Za-z]*WebsiteSuburbs)\\b/);\n const first = derived[0] ?? (namespaceUse ? { imported: namespaceUse[1]!, line: lineAtIndex(file.text, namespaceUse.index ?? 0) } : null);\n if (!first) return;\n add(file.path, 'estate-registry-derived',\n `${first.imported} is a registry candidate list; the published estate in src/data/locations/estate.ts must be literal data, never derived from it.`, { line: first.line });\n}\n\nfunction inspectRetainedExclusions(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const retained = objectPropertyValue(call.arguments[0], 'retainedExclusions');\n if (!retained || !ts.isArrayLiteralExpression(retained) || retained.elements.length === 0) continue;\n const slugs = retained.elements.map(element => {\n if (ts.isStringLiteralLike(element)) return element.text;\n const slug = objectPropertyValue(element, 'slug');\n return slug && ts.isStringLiteralLike(slug) ? slug.text : null;\n }).filter((slug): slug is string => Boolean(slug));\n add(file.path, 'estate-retained-exclusions',\n `${retained.elements.length} policy-excluded location(s) stay published for a later SEO decision${slugs.length ? `: ${slugs.join(', ')}` : ''}.`,\n { severity: 'info', line: lineOfNode(file, retained) });\n }\n}\n\n/** An array literal, directly or through a top-level `const name = [...]` (optionally `as const`) in the same file. */\nfunction arrayLiteral(file: BrandlabSourceFile, node: ts.Expression | undefined): ts.ArrayLiteralExpression | undefined {\n const unwrap = (expression: ts.Expression | undefined): ts.Expression | undefined => {\n let current = expression;\n while (current && (ts.isAsExpression(current) || ts.isSatisfiesExpression(current) || ts.isParenthesizedExpression(current))) {\n current = current.expression;\n }\n return current;\n };\n const value = unwrap(node);\n if (value && ts.isArrayLiteralExpression(value)) return value;\n if (!value || !ts.isIdentifier(value)) return undefined;\n for (const statement of parseBrandlabSourceFile(file).statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name) && declaration.name.text === value.text) {\n const initializer = unwrap(declaration.initializer);\n return initializer && ts.isArrayLiteralExpression(initializer) ? initializer : undefined;\n }\n }\n }\n return undefined;\n}\n\n/** Report the locations the site publishes outside the shared registry, with each group's reason. */\nfunction inspectSiteOwnedLocations(file: BrandlabSourceFile, add: Add) {\n for (const call of findImportedCalls(file, /^@brandlab-digital\\/site-core\\/locations$/, 'defineLocationEstate')) {\n const declared = objectPropertyValue(call.arguments[0], 'siteOwned');\n if (!declared) continue;\n const groups = arrayLiteral(file, declared);\n if (!groups) {\n add(file.path, 'estate-site-owned',\n 'siteOwned must be literal data in src/data/locations/estate.ts: [{ reason, slugs }], never derived.', { line: lineOfNode(file, declared) });\n continue;\n }\n if (groups.elements.length === 0) continue;\n let total = 0;\n const summaries = groups.elements.map(element => {\n const reason = objectPropertyValue(element, 'reason');\n const slugs = arrayLiteral(file, objectPropertyValue(element, 'slugs'));\n const count = slugs?.elements.length;\n total += count ?? 0;\n const label = reason && ts.isStringLiteralLike(reason) ? reason.text : 'a reason that is not a string literal';\n return `${count ?? 'an unknown number of'} for \"${label}\"`;\n });\n add(file.path, 'estate-site-owned',\n `${total} location(s) are published outside the shared geography registry, declared site-owned: ${summaries.join('; ')}.`,\n { severity: 'info', line: lineOfNode(file, groups) });\n }\n}\n\nfunction lineAtIndex(text: string, index: number): number {\n return text.slice(0, index).split('\\n').length;\n}\n\n// --- tests (sections 2 and 6) -------------------------------------------------\n\nfunction inspectTests(root: string, capabilities: ReturnType<typeof describeCapabilities>, add: Add) {\n if (!isDirectory(join(root, 'tests'))) return;\n for (const entry of readdirSync(join(root, 'tests'), { withFileTypes: true })) {\n if (entry.name.startsWith('.')) continue;\n if (!entry.isDirectory() || !TEST_DIRECTORIES.has(entry.name)) {\n add(`tests/${entry.name}`, 'test-layout', 'Tests live in tests/{config,data,lib,components,e2e,support}.');\n }\n }\n const required = [\n 'tests/data/routes.test.ts', 'tests/config/analytics.test.ts',\n 'tests/e2e/estate.spec.ts', 'tests/e2e/analytics.spec.ts', 'tests/e2e/families.spec.ts',\n ...(capabilities.contactEnabled ? ['tests/config/contact.test.ts', 'tests/e2e/contact.spec.ts'] : []),\n ];\n for (const path of required) {\n if (!existsSync(join(root, path))) add(path, 'shared-tests', `The shared 3.0 test set includes ${path}.`);\n }\n for (const path of walkProjectFiles(root, 'tests')) {\n if (/-darwin\\.png$/.test(path)) add(path, 'committed-snapshots', 'Delete committed darwin snapshots; rendered checks run against the CI build.');\n }\n}\n\n// --- dev presets (section 4) -------------------------------------------------\n\nfunction inspectToolPresets(root: string, add: Add) {\n const eslint = readOptional(join(root, 'eslint.config.mjs'));\n if (eslint === null) add('eslint.config.mjs', 'tool-preset', 'Add eslint.config.mjs: export default brandlab.configs.next.');\n else if (!/@brandlab-digital\\/eslint-plugin/.test(eslint) || !/export\\s+default\\s+[A-Za-z_$][\\w$]*\\.configs\\.next\\s*;?\\s*$/.test(eslint.trim())) {\n add('eslint.config.mjs', 'tool-preset', 'eslint.config.mjs is exactly `export default brandlab.configs.next` (imported from @brandlab-digital/eslint-plugin).');\n }\n const knip = readOptional(join(root, 'knip.ts'));\n if (knip === null) add('knip.ts', 'tool-preset', 'Add knip.ts: export default brandlabKnip({ mdx?, entry? }).');\n else if (!/@brandlab-digital\\/conformance\\/knip/.test(knip) || !/export\\s+default\\s+brandlabKnip\\s*\\(/.test(knip)) {\n add('knip.ts', 'tool-preset', 'knip.ts exports brandlabKnip({ mdx?, entry? }) from @brandlab-digital/conformance/knip.');\n }\n if (!['playwright.config.ts', 'playwright.config.mts'].some(name => existsSync(join(root, name)))) {\n add('playwright.config.ts', 'tool-preset', 'Add the Playwright configuration for the shared e2e specs.');\n }\n if (!['vitest.config.ts', 'vitest.config.mts'].some(name => existsSync(join(root, name)))) {\n add('vitest.config.ts', 'tool-preset', 'Add the Vitest configuration for the binding tests.');\n }\n}\n\n// --- CI, dependencies, Vercel and docs (section 6) ---------------------------\n\nfunction inspectDelivery(root: string, add: Add) {\n const workflowDirectory = join(root, '.github/workflows');\n const workflows = isDirectory(workflowDirectory) ? readdirSync(workflowDirectory).filter(name => /\\.ya?ml$/.test(name)).sort() : [];\n const callers = workflows.filter(name => /uses\\s*:\\s*['\"]?RomieDandan\\/brandlab\\/\\.github\\/workflows\\/verify-next\\.yml@/.test(readFileSync(join(workflowDirectory, name), 'utf8')));\n if (callers.length !== 1 || callers[0] !== 'verify.yml') {\n add('.github/workflows/verify.yml', 'ci-workflow', `Exactly one .github/workflows/verify.yml calls RomieDandan/brandlab/.github/workflows/verify-next.yml at the fleet SHA (found ${callers.length ? callers.join(', ') : 'none'}).`);\n }\n for (const path of ['.github/dependabot.yml', '.github/dependabot.yaml', 'renovate.json', 'renovate.json5', '.github/renovate.json', '.renovaterc', '.renovaterc.json']) {\n if (existsSync(join(root, path))) add(path, 'dependency-bots', 'Exact pins move with Brandlab releases; remove Dependabot/Renovate version updates.');\n }\n const vercel = readOptional(join(root, 'vercel.json'));\n let installCommand: unknown;\n try { installCommand = vercel === null ? undefined : JSON.parse(vercel).installCommand; } catch { installCommand = undefined; }\n if (installCommand !== 'npm ci') add('vercel.json', 'vercel-install', 'vercel.json sets installCommand to \"npm ci\".');\n let regions: unknown;\n try { regions = vercel === null ? undefined : JSON.parse(vercel).regions; } catch { regions = undefined; }\n if (!Array.isArray(regions) || regions.length !== 1 || regions[0] !== BRANDLAB_FUNCTION_REGION) {\n add('vercel.json', 'vercel-region', `vercel.json runs the server functions in Sydney: \"regions\": [\"${BRANDLAB_FUNCTION_REGION}\"] (found ${regions === undefined ? 'no regions' : JSON.stringify(regions)}). The visitors are in Australia; a Washington (iad1) function adds a Pacific round trip to every request it serves.`);\n }\n\n if (!existsSync(join(root, 'README.md'))) add('README.md', 'project-docs', 'Add the generated README.md (commands, architecture, environment names, deployment and rollback).');\n const agents = join(root, 'AGENTS.md');\n if (!existsSync(agents)) add('AGENTS.md', 'project-docs', 'Add AGENTS.md with the fixed sources of truth and guardrails.');\n else if (statSync(agents).size > 3_584) add('AGENTS.md', 'project-docs', `AGENTS.md is ${statSync(agents).size} bytes; keep it to about 3 KB and archive history to the control repo.`);\n const claude = readOptional(join(root, 'CLAUDE.md'));\n if (claude === null || claude.trim() !== '@AGENTS.md') add('CLAUDE.md', 'project-docs', 'CLAUDE.md is the single line @AGENTS.md.');\n}\n\nconst directoryListings = new Map<string, ReadonlySet<string>>();\n\n/** The exact file names in a directory (cached per check run). */\nfunction directoryEntries(path: string): ReadonlySet<string> {\n let entries = directoryListings.get(path);\n if (!entries) {\n try { entries = new Set(readdirSync(path)); } catch { entries = new Set(); }\n directoryListings.set(path, entries);\n }\n return entries;\n}\n\nfunction readOptional(path: string): string | null {\n return existsSync(path) ? readFileSync(path, 'utf8') : null;\n}\n"]}
|
package/dist/estate.d.ts
CHANGED
|
@@ -1,22 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The shared technical-estate journey for a Brandlab production build:
|
|
3
|
-
*
|
|
4
|
-
* // tests/e2e/estate.spec.ts
|
|
5
|
-
* import { defineBrandlabEstateTests } from '@brandlab-digital/conformance/estate'
|
|
6
|
-
* import { site } from '../../src/config/site'
|
|
7
|
-
* import { routes } from '../../src/data/routes'
|
|
8
|
-
* import { redirects } from '../../src/data/redirects'
|
|
9
|
-
*
|
|
10
|
-
* defineBrandlabEstateTests({ site, routes, redirects })
|
|
11
|
-
*
|
|
12
|
-
* It asserts the estate and its routes: the sitemap, each route's status,
|
|
13
|
-
* canonical and indexing, internal links, redirects, unknown slugs, the page
|
|
14
|
-
* families rendered on request and robots.txt. Page and structured-data
|
|
15
|
-
* quality is reported, never enforced,
|
|
16
|
-
* by defineBrandlabPageQualityTests: a backend release keeps production's pages
|
|
17
|
-
* as they are, which the comparison harness proves. Counts are always derived
|
|
18
|
-
* from the current catalogue, never a historic constant.
|
|
19
|
-
*/
|
|
20
1
|
import { type APIRequestContext } from '@playwright/test';
|
|
21
2
|
export interface BrandlabEstateRoute {
|
|
22
3
|
path: string;
|
|
@@ -88,6 +69,8 @@ export interface BrandlabPageQualityFinding {
|
|
|
88
69
|
detail: string;
|
|
89
70
|
}
|
|
90
71
|
export declare function defineBrandlabEstateTests(options: BrandlabEstateTestOptions): void;
|
|
72
|
+
/** One response header for a request that names its own Host (the Playwright request context always sends the server's). */
|
|
73
|
+
export declare function responseHeader(server: URL, host: string, path: string, name: string): Promise<string | undefined>;
|
|
91
74
|
/**
|
|
92
75
|
* Every `<loc>` in a sitemap, following one level of sitemap index. Nothing is
|
|
93
76
|
* followed through a redirect, and with `origin` every nested sitemap must be
|
|
@@ -96,6 +79,11 @@ export declare function defineBrandlabEstateTests(options: BrandlabEstateTestOpt
|
|
|
96
79
|
export declare function readSitemap(request: APIRequestContext, path: string, origin?: string): Promise<string[]>;
|
|
97
80
|
export declare function extractSitemapLocations(xml: string): string[];
|
|
98
81
|
export declare function defaultNotFoundPaths(routes: readonly BrandlabEstateRoute[]): string[];
|
|
82
|
+
/** The unknown-slug probes to request, apart from those a redirect rule answers. */
|
|
83
|
+
export declare function unknownSlugProbes(paths: readonly string[], redirects: (path: string) => boolean): {
|
|
84
|
+
probes: string[];
|
|
85
|
+
redirected: string[];
|
|
86
|
+
};
|
|
99
87
|
/** The page of a family its estate check opens: the first one outside the catalogue, else its first page. */
|
|
100
88
|
export declare function familySamplePath(family: Pick<BrandlabEstateFamily, 'paths'>, catalogue: ReadonlySet<string>): string | undefined;
|
|
101
89
|
/**
|
package/dist/estate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"estate.d.ts","sourceRoot":"","sources":["../src/estate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"estate.d.ts","sourceRoot":"","sources":["../src/estate.ts"],"names":[],"mappings":"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"}
|
package/dist/estate.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* as they are, which the comparison harness proves. Counts are always derived
|
|
18
18
|
* from the current catalogue, never a historic constant.
|
|
19
19
|
*/
|
|
20
|
+
import { request as httpRequest } from 'node:http';
|
|
20
21
|
import { expect, test } from '@playwright/test';
|
|
21
22
|
import { extractSearchCertificationHtmlSnapshot } from './search-certification.js';
|
|
22
23
|
const BUSINESS_TYPES = new Set([
|
|
@@ -202,8 +203,14 @@ export function defineBrandlabEstateTests(options) {
|
|
|
202
203
|
expect(failures).toEqual([]);
|
|
203
204
|
});
|
|
204
205
|
}
|
|
205
|
-
test('unknown slugs answer 404 instead of inventing pages', async ({ request }) => {
|
|
206
|
-
|
|
206
|
+
test('unknown slugs answer 404 instead of inventing pages', async ({ request }, testInfo) => {
|
|
207
|
+
// A default probe a redirect rule covers (a wildcard such as /blog/:slug) is the redirect's to answer; the
|
|
208
|
+
// redirect journey proves it. Paths the site lists itself are always probed.
|
|
209
|
+
const { probes: paths, redirected } = options.notFoundPaths
|
|
210
|
+
? { probes: options.notFoundPaths, redirected: [] }
|
|
211
|
+
: unknownSlugProbes(defaultNotFoundPaths(routes), (path) => Boolean(findRedirect(path)));
|
|
212
|
+
for (const path of redirected)
|
|
213
|
+
testInfo.annotations.push({ type: 'skipped', description: `${path}: a redirect rule answers it` });
|
|
207
214
|
const failures = [];
|
|
208
215
|
for (const path of paths) {
|
|
209
216
|
const response = await request.get(path, { maxRedirects: 0 });
|
|
@@ -219,6 +226,27 @@ export function defineBrandlabEstateTests(options) {
|
|
|
219
226
|
expect(body).toMatch(new RegExp(`^sitemap:\\s*${escapeRegExp(`${origin}/sitemap.xml`)}\\s*$`, 'im'));
|
|
220
227
|
expect(body).not.toMatch(/^disallow:\s*\/\s*$/im);
|
|
221
228
|
});
|
|
229
|
+
test('a production deployment tells crawlers not to index any host but its canonical one', async ({ baseURL }) => {
|
|
230
|
+
test.skip(process.env.VERCEL_ENV !== 'production', 'Only a production build (VERCEL_ENV=production, as CI builds it) answers other hosts with noindex.');
|
|
231
|
+
const server = new URL(baseURL ?? 'http://127.0.0.1:3100/');
|
|
232
|
+
const canonicalHost = new URL(origin).hostname;
|
|
233
|
+
// The production *.vercel.app alias serves the full site; its pages must not be indexed.
|
|
234
|
+
const alias = `${canonicalHost.split('.')[0]}-brandlab-e2e.vercel.app`;
|
|
235
|
+
expect(await responseHeader(server, alias, '/', 'x-robots-tag'), `${alias}: X-Robots-Tag`).toBe('noindex');
|
|
236
|
+
expect(await responseHeader(server, canonicalHost, '/', 'x-robots-tag'), `${canonicalHost}: X-Robots-Tag`).not.toMatch(/noindex/);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
/** One response header for a request that names its own Host (the Playwright request context always sends the server's). */
|
|
241
|
+
export function responseHeader(server, host, path, name) {
|
|
242
|
+
return new Promise((resolve, reject) => {
|
|
243
|
+
const request = httpRequest({ hostname: server.hostname, port: server.port || 80, path, method: 'GET', headers: { host, 'x-forwarded-proto': 'https' } }, (response) => {
|
|
244
|
+
response.resume();
|
|
245
|
+
const value = response.headers[name.toLowerCase()];
|
|
246
|
+
resolve(Array.isArray(value) ? value.join(', ') : value);
|
|
247
|
+
});
|
|
248
|
+
request.on('error', reject);
|
|
249
|
+
request.end();
|
|
222
250
|
});
|
|
223
251
|
}
|
|
224
252
|
/**
|
|
@@ -261,6 +289,14 @@ export function defaultNotFoundPaths(routes) {
|
|
|
261
289
|
}
|
|
262
290
|
return [...parents].sort().map((parent) => `${parent}/${UNKNOWN_SLUG}`);
|
|
263
291
|
}
|
|
292
|
+
/** The unknown-slug probes to request, apart from those a redirect rule answers. */
|
|
293
|
+
export function unknownSlugProbes(paths, redirects) {
|
|
294
|
+
const probes = [];
|
|
295
|
+
const redirected = [];
|
|
296
|
+
for (const path of paths)
|
|
297
|
+
(redirects(normalisePath(path)) ? redirected : probes).push(path);
|
|
298
|
+
return { probes, redirected };
|
|
299
|
+
}
|
|
264
300
|
/** The page of a family its estate check opens: the first one outside the catalogue, else its first page. */
|
|
265
301
|
export function familySamplePath(family, catalogue) {
|
|
266
302
|
return family.paths.find((path) => !catalogue.has(normalisePath(path))) ?? family.paths[0];
|