@brandlab-digital/conformance 1.3.1 → 2.1.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/cli.d.ts CHANGED
@@ -6,6 +6,8 @@ interface CliOptions {
6
6
  mode: BrandlabConformanceMode;
7
7
  json: boolean;
8
8
  help: boolean;
9
+ engineering: boolean;
10
+ packedReleaseReceipt?: string;
9
11
  }
10
12
  interface CliIo {
11
13
  stdout: (value: string) => void;
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAIA,OAAO,EAGL,KAAK,uBAAuB,EAE7B,MAAM,cAAc,CAAC;AAEtB,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;CACf;AAED,UAAU,KAAK;IACb,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAmBD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CA2BhF;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAGH,GACA,MAAM,CAkBR;AAmDD,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAOT"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAKA,OAAO,EAGL,KAAK,uBAAuB,EAE7B,MAAM,cAAc,CAAC;AAEtB,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,KAAK;IACb,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAsBD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,CA8BhF;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAGH,GACA,MAAM,CAqBR;AAoDD,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAOT"}
package/dist/cli.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { realpathSync } from "node:fs";
3
3
  import { resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
+ import { checkEngineeringStructure } from "./engineering.js";
5
6
  import { evaluateBrandlabProject, shouldFailBrandlabConformance, } from "./project.js";
6
7
  const HELP = `Brandlab verification
7
8
 
@@ -10,7 +11,8 @@ Runs the current objective verification checks for one project.
10
11
  Usage:
11
12
  brandlab-verify [--root <path>]
12
13
  [--installed-release <version|unadopted>]
13
- [--mode <local|ci|preflight>] [--json]
14
+ [--mode <local|ci|preflight>] [--engineering] [--json]
15
+ [--packed-release <receipt.json> (preflight only)]
14
16
 
15
17
  Exit status:
16
18
  local/ci fail only for objective current-release blockers
@@ -18,6 +20,8 @@ Exit status:
18
20
 
19
21
  Static verification reports tests, builds, browsers and deployments as not run
20
22
  until real evidence is supplied.
23
+ --engineering adds the complete-migration structural checks. It does not certify
24
+ manual review, unused-code analysis, runtime journeys or provider cutover.
21
25
  `;
22
26
  export function parseBrandlabConformanceArgs(argv) {
23
27
  const parsed = {
@@ -25,6 +29,7 @@ export function parseBrandlabConformanceArgs(argv) {
25
29
  mode: "local",
26
30
  json: false,
27
31
  help: false,
32
+ engineering: false,
28
33
  };
29
34
  for (let index = 0; index < argv.length; index += 1) {
30
35
  const argument = argv[index];
@@ -32,6 +37,10 @@ export function parseBrandlabConformanceArgs(argv) {
32
37
  parsed.help = true;
33
38
  else if (argument === "--json")
34
39
  parsed.json = true;
40
+ else if (argument === "--engineering")
41
+ parsed.engineering = true;
42
+ else if (argument === "--packed-release")
43
+ parsed.packedReleaseReceipt = resolve(requireValue(argv, ++index, "--packed-release"));
35
44
  else if (argument === "--root") {
36
45
  parsed.root = resolve(requireValue(argv, ++index, "--root"));
37
46
  }
@@ -66,9 +75,12 @@ export function runBrandlabConformanceCli(argv, io = {
66
75
  root: options.root,
67
76
  installedRelease: options.installedRelease,
68
77
  mode: options.mode,
78
+ packedReleaseReceipt: options.packedReleaseReceipt,
69
79
  });
70
- io.stdout(options.json ? `${JSON.stringify(result, null, 2)}\n` : formatResult(result));
71
- return shouldFailBrandlabConformance(result) ? 1 : 0;
80
+ const engineering = options.engineering ? checkEngineeringStructure(options.root) : undefined;
81
+ io.stdout(options.json ? `${JSON.stringify({ ...result, ...(engineering ? { engineering } : {}) }, null, 2)}\n`
82
+ : formatResult(result) + (engineering ? `Engineering structure: ${engineering.status}\n${engineering.coverage}\n${engineering.findings.map(f => `[${f.rule}] ${f.path}: ${f.message}\n`).join('')}` : ''));
83
+ return shouldFailBrandlabConformance(result) || engineering?.status === 'blocked' ? 1 : 0;
72
84
  }
73
85
  catch (error) {
74
86
  io.stderr(`${error instanceof Error ? error.message : String(error)}\n\n${HELP}`);
@@ -85,6 +97,7 @@ function formatResult(result) {
85
97
  const lines = [
86
98
  "Brandlab verification",
87
99
  `installed: ${result.installedRelease ?? "unadopted"}`,
100
+ ...(result.packedPreflight ? ['provenance: verified local packed preflight; registry publication and deployment not established'] : []),
88
101
  `policy: ${result.verification.policyVersion}`,
89
102
  `static checks: ${staticStatus}`,
90
103
  `external evidence: ${externalChecks.length > 0
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n evaluateBrandlabProject,\n shouldFailBrandlabConformance,\n type BrandlabConformanceMode,\n type BrandlabConformanceResult,\n} from \"./project.js\";\n\ninterface CliOptions {\n root: string;\n installedRelease?: string | null;\n mode: BrandlabConformanceMode;\n json: boolean;\n help: boolean;\n}\n\ninterface CliIo {\n stdout: (value: string) => void;\n stderr: (value: string) => void;\n}\n\nconst HELP = `Brandlab verification\n\nRuns the current objective verification checks for one project.\n\nUsage:\n brandlab-verify [--root <path>]\n [--installed-release <version|unadopted>]\n [--mode <local|ci|preflight>] [--json]\n\nExit status:\n local/ci fail only for objective current-release blockers\n preflight uses the same checks against an isolated candidate\n\nStatic verification reports tests, builds, browsers and deployments as not run\nuntil real evidence is supplied.\n`;\n\nexport function parseBrandlabConformanceArgs(argv: readonly string[]): CliOptions {\n const parsed: CliOptions = {\n root: process.cwd(),\n mode: \"local\",\n json: false,\n help: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index];\n if (argument === \"--help\" || argument === \"-h\") parsed.help = true;\n else if (argument === \"--json\") parsed.json = true;\n else if (argument === \"--root\") {\n parsed.root = resolve(requireValue(argv, ++index, \"--root\"));\n } else if (argument === \"--installed-release\") {\n const value = requireValue(argv, ++index, \"--installed-release\");\n parsed.installedRelease = value === \"unadopted\" ? null : value;\n } else if (argument === \"--mode\") {\n const value = requireValue(argv, ++index, \"--mode\");\n if (![\"local\", \"ci\", \"preflight\"].includes(value)) {\n throw new Error(`Invalid --mode ${value}.`);\n }\n parsed.mode = value as BrandlabConformanceMode;\n } else {\n throw new Error(`Unknown argument ${argument}.`);\n }\n }\n return parsed;\n}\n\nexport function runBrandlabConformanceCli(\n argv: readonly string[],\n io: CliIo = {\n stdout: (value) => process.stdout.write(value),\n stderr: (value) => process.stderr.write(value),\n },\n): number {\n try {\n const options = parseBrandlabConformanceArgs(argv);\n if (options.help) {\n io.stdout(HELP);\n return 0;\n }\n const result = evaluateBrandlabProject({\n root: options.root,\n installedRelease: options.installedRelease,\n mode: options.mode,\n });\n io.stdout(options.json ? `${JSON.stringify(result, null, 2)}\\n` : formatResult(result));\n return shouldFailBrandlabConformance(result) ? 1 : 0;\n } catch (error) {\n io.stderr(`${error instanceof Error ? error.message : String(error)}\\n\\n${HELP}`);\n return 2;\n }\n}\n\nfunction formatResult(result: BrandlabConformanceResult): string {\n const externalChecks = result.verification.checks.filter(\n (check) => check.status === \"not_run\",\n );\n const staticStatus =\n result.verification.summary.blockers > 0\n ? \"blocked\"\n : result.verification.summary.warnings > 0\n ? \"warning\"\n : \"pass\";\n const lines = [\n \"Brandlab verification\",\n `installed: ${result.installedRelease ?? \"unadopted\"}`,\n `policy: ${result.verification.policyVersion}`,\n `static checks: ${staticStatus}`,\n `external evidence: ${\n externalChecks.length > 0\n ? `not run (${externalChecks.map((check) => check.title).join(\", \")})`\n : \"complete\"\n }`,\n `findings: ${formatSummary(result.verification.summary)}`,\n ];\n for (const family of result.verification.families) {\n if (family.status === \"pass\") continue;\n lines.push(\n `[${family.status}] ${family.title}: ${family.blockers} blocker(s), ${family.warnings} warning(s)`,\n );\n }\n for (const finding of result.operationalFindings) {\n const location = finding.path\n ? ` (${finding.path}${finding.line ? `:${finding.line}` : \"\"})`\n : \"\";\n lines.push(\n `[${finding.familyId}/${finding.severity}] ${finding.ruleId}${location}: ${finding.actual}`,\n );\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatSummary(summary: BrandlabConformanceResult[\"summary\"]): string {\n return `${summary.status}; ${summary.blockers} blocker(s), ${summary.warnings} warning(s), ${summary.info} info`;\n}\n\nfunction requireValue(argv: readonly string[], index: number, argument: string): string {\n const value = argv[index];\n if (!value || value.startsWith(\"--\")) throw new Error(`${argument} requires a value.`);\n return value;\n}\n\nexport function isBrandlabConformanceCliEntrypoint(\n moduleUrl: string,\n argvPath: string | undefined,\n): boolean {\n if (!argvPath) return false;\n try {\n return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(resolve(argvPath));\n } catch {\n return false;\n }\n}\n\nif (isBrandlabConformanceCliEntrypoint(import.meta.url, process.argv[1])) {\n process.exitCode = runBrandlabConformanceCli(process.argv.slice(2));\n}\n"]}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { realpathSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { checkEngineeringStructure } from \"./engineering.js\";\nimport {\n evaluateBrandlabProject,\n shouldFailBrandlabConformance,\n type BrandlabConformanceMode,\n type BrandlabConformanceResult,\n} from \"./project.js\";\n\ninterface CliOptions {\n root: string;\n installedRelease?: string | null;\n mode: BrandlabConformanceMode;\n json: boolean;\n help: boolean;\n engineering: boolean;\n packedReleaseReceipt?: string;\n}\n\ninterface CliIo {\n stdout: (value: string) => void;\n stderr: (value: string) => void;\n}\n\nconst HELP = `Brandlab verification\n\nRuns the current objective verification checks for one project.\n\nUsage:\n brandlab-verify [--root <path>]\n [--installed-release <version|unadopted>]\n [--mode <local|ci|preflight>] [--engineering] [--json]\n [--packed-release <receipt.json> (preflight only)]\n\nExit status:\n local/ci fail only for objective current-release blockers\n preflight uses the same checks against an isolated candidate\n\nStatic verification reports tests, builds, browsers and deployments as not run\nuntil real evidence is supplied.\n--engineering adds the complete-migration structural checks. It does not certify\nmanual review, unused-code analysis, runtime journeys or provider cutover.\n`;\n\nexport function parseBrandlabConformanceArgs(argv: readonly string[]): CliOptions {\n const parsed: CliOptions = {\n root: process.cwd(),\n mode: \"local\",\n json: false,\n help: false,\n engineering: false,\n };\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index];\n if (argument === \"--help\" || argument === \"-h\") parsed.help = true;\n else if (argument === \"--json\") parsed.json = true;\n else if (argument === \"--engineering\") parsed.engineering = true;\n else if (argument === \"--packed-release\") parsed.packedReleaseReceipt = resolve(requireValue(argv, ++index, \"--packed-release\"));\n else if (argument === \"--root\") {\n parsed.root = resolve(requireValue(argv, ++index, \"--root\"));\n } else if (argument === \"--installed-release\") {\n const value = requireValue(argv, ++index, \"--installed-release\");\n parsed.installedRelease = value === \"unadopted\" ? null : value;\n } else if (argument === \"--mode\") {\n const value = requireValue(argv, ++index, \"--mode\");\n if (![\"local\", \"ci\", \"preflight\"].includes(value)) {\n throw new Error(`Invalid --mode ${value}.`);\n }\n parsed.mode = value as BrandlabConformanceMode;\n } else {\n throw new Error(`Unknown argument ${argument}.`);\n }\n }\n return parsed;\n}\n\nexport function runBrandlabConformanceCli(\n argv: readonly string[],\n io: CliIo = {\n stdout: (value) => process.stdout.write(value),\n stderr: (value) => process.stderr.write(value),\n },\n): number {\n try {\n const options = parseBrandlabConformanceArgs(argv);\n if (options.help) {\n io.stdout(HELP);\n return 0;\n }\n const result = evaluateBrandlabProject({\n root: options.root,\n installedRelease: options.installedRelease,\n mode: options.mode,\n packedReleaseReceipt: options.packedReleaseReceipt,\n });\n const engineering = options.engineering ? checkEngineeringStructure(options.root) : undefined;\n io.stdout(options.json ? `${JSON.stringify({ ...result, ...(engineering ? { engineering } : {}) }, null, 2)}\\n`\n : formatResult(result) + (engineering ? `Engineering structure: ${engineering.status}\\n${engineering.coverage}\\n${engineering.findings.map(f => `[${f.rule}] ${f.path}: ${f.message}\\n`).join('')}` : ''));\n return shouldFailBrandlabConformance(result) || engineering?.status === 'blocked' ? 1 : 0;\n } catch (error) {\n io.stderr(`${error instanceof Error ? error.message : String(error)}\\n\\n${HELP}`);\n return 2;\n }\n}\n\nfunction formatResult(result: BrandlabConformanceResult): string {\n const externalChecks = result.verification.checks.filter(\n (check) => check.status === \"not_run\",\n );\n const staticStatus =\n result.verification.summary.blockers > 0\n ? \"blocked\"\n : result.verification.summary.warnings > 0\n ? \"warning\"\n : \"pass\";\n const lines = [\n \"Brandlab verification\",\n `installed: ${result.installedRelease ?? \"unadopted\"}`,\n ...(result.packedPreflight ? ['provenance: verified local packed preflight; registry publication and deployment not established'] : []),\n `policy: ${result.verification.policyVersion}`,\n `static checks: ${staticStatus}`,\n `external evidence: ${\n externalChecks.length > 0\n ? `not run (${externalChecks.map((check) => check.title).join(\", \")})`\n : \"complete\"\n }`,\n `findings: ${formatSummary(result.verification.summary)}`,\n ];\n for (const family of result.verification.families) {\n if (family.status === \"pass\") continue;\n lines.push(\n `[${family.status}] ${family.title}: ${family.blockers} blocker(s), ${family.warnings} warning(s)`,\n );\n }\n for (const finding of result.operationalFindings) {\n const location = finding.path\n ? ` (${finding.path}${finding.line ? `:${finding.line}` : \"\"})`\n : \"\";\n lines.push(\n `[${finding.familyId}/${finding.severity}] ${finding.ruleId}${location}: ${finding.actual}`,\n );\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction formatSummary(summary: BrandlabConformanceResult[\"summary\"]): string {\n return `${summary.status}; ${summary.blockers} blocker(s), ${summary.warnings} warning(s), ${summary.info} info`;\n}\n\nfunction requireValue(argv: readonly string[], index: number, argument: string): string {\n const value = argv[index];\n if (!value || value.startsWith(\"--\")) throw new Error(`${argument} requires a value.`);\n return value;\n}\n\nexport function isBrandlabConformanceCliEntrypoint(\n moduleUrl: string,\n argvPath: string | undefined,\n): boolean {\n if (!argvPath) return false;\n try {\n return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(resolve(argvPath));\n } catch {\n return false;\n }\n}\n\nif (isBrandlabConformanceCliEntrypoint(import.meta.url, process.argv[1])) {\n process.exitCode = runBrandlabConformanceCli(process.argv.slice(2));\n}\n"]}
@@ -15,27 +15,27 @@ export const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze({
15
15
  ],
16
16
  "contracts": {
17
17
  "analytics": "analytics-v4",
18
- "architecture": "architecture-v5",
19
- "configuration": "project-config-v5",
18
+ "architecture": "architecture-v6",
19
+ "configuration": "project-config-v6",
20
20
  "contact": "contact-v4",
21
21
  "seo": "seo-v4"
22
22
  },
23
23
  "kind": "brandlab-runtime-release-contract",
24
24
  "packages": {
25
25
  "@brandlab-digital/conformance": {
26
- "version": "1.3.1"
26
+ "version": "2.1.0"
27
27
  },
28
28
  "@brandlab-digital/eslint-plugin": {
29
- "version": "1.3.1"
29
+ "version": "2.1.0"
30
30
  },
31
31
  "@brandlab-digital/site-core": {
32
- "version": "1.3.1"
32
+ "version": "2.1.0"
33
33
  },
34
34
  "@brandlab-digital/site-next": {
35
- "version": "1.3.1"
35
+ "version": "2.1.0"
36
36
  }
37
37
  },
38
- "releaseVersion": "1.3.1",
38
+ "releaseVersion": "2.1.0",
39
39
  "runtime": {
40
40
  "bundler": "turbopack",
41
41
  "cacheComponents": false,
@@ -1 +1 @@
1
- {"version":3,"file":"current-release.js","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,OAAO,EAEL,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAC7D;IACE,cAAc,EAAE;QACd,uCAAuC;QACvC,8BAA8B;QAC9B,yBAAyB;QACzB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;QAC5B,kCAAkC;QAClC,wCAAwC;QACxC,yBAAyB;KAC1B;IACD,WAAW,EAAE;QACX,WAAW,EAAE,cAAc;QAC3B,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,mBAAmB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,QAAQ;KAChB;IACD,MAAM,EAAE,mCAAmC;IAC3C,UAAU,EAAE;QACV,+BAA+B,EAAE;YAC/B,SAAS,EAAE,OAAO;SACnB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;KACF;IACD,gBAAgB,EAAE,OAAO;IACzB,SAAS,EAAE;QACT,SAAS,EAAE,WAAW;QACtB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,QAAQ;QAChB,mBAAmB,EAAE,OAAO;QAC5B,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,aAAa;QAC/B,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,OAAO;KACtB;IACD,eAAe,EAAE,sCAAsC;CACxD,CAC6C,CAAC;AAE/C,sCAAsC,CAAC,gCAAgC,CAAC,CAAC","sourcesContent":["// Generated by standards/scripts/generate-conformance-current-release.mjs.\n// Each exact package release verifies its own current runtime contract.\nimport {\n type BrandlabRuntimeReleaseContract,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\n\nexport const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze(\n{\n \"capabilities\": [\n \"typed-project-business-and-route-data\",\n \"essential-search-foundations\",\n \"shared-contact-delivery\",\n \"privacy-safe-lead-analytics\",\n \"security-patched-runtime\",\n \"live-google-review-summary\",\n \"high-signal-project-verification\",\n \"packed-positive-and-negative-consumers\",\n \"changesets-oidc-release\"\n ],\n \"contracts\": {\n \"analytics\": \"analytics-v4\",\n \"architecture\": \"architecture-v5\",\n \"configuration\": \"project-config-v5\",\n \"contact\": \"contact-v4\",\n \"seo\": \"seo-v4\"\n },\n \"kind\": \"brandlab-runtime-release-contract\",\n \"packages\": {\n \"@brandlab-digital/conformance\": {\n \"version\": \"1.3.1\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"1.3.1\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"1.3.1\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"1.3.1\"\n }\n },\n \"releaseVersion\": \"1.3.1\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.3.6\",\n \"nextVersionPolicy\": \"exact\",\n \"node\": \"24.x\",\n \"packageManager\": \"npm@11.14.1\",\n \"react\": \"19.2.8\",\n \"reactDom\": \"19.2.8\",\n \"router\": \"app\",\n \"sharp\": \"0.35.4\",\n \"typescript\": \"6.0.3\"\n },\n \"schemaVersion\": \"brandlab.runtime-release-contract.v1\"\n},\n) as unknown as BrandlabRuntimeReleaseContract;\n\nvalidateBrandlabRuntimeReleaseContract(BRANDLAB_CURRENT_RUNTIME_RELEASE);\n"]}
1
+ {"version":3,"file":"current-release.js","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wEAAwE;AACxE,OAAO,EAEL,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAC7D;IACE,cAAc,EAAE;QACd,uCAAuC;QACvC,8BAA8B;QAC9B,yBAAyB;QACzB,6BAA6B;QAC7B,0BAA0B;QAC1B,4BAA4B;QAC5B,kCAAkC;QAClC,wCAAwC;QACxC,yBAAyB;KAC1B;IACD,WAAW,EAAE;QACX,WAAW,EAAE,cAAc;QAC3B,cAAc,EAAE,iBAAiB;QACjC,eAAe,EAAE,mBAAmB;QACpC,SAAS,EAAE,YAAY;QACvB,KAAK,EAAE,QAAQ;KAChB;IACD,MAAM,EAAE,mCAAmC;IAC3C,UAAU,EAAE;QACV,+BAA+B,EAAE;YAC/B,SAAS,EAAE,OAAO;SACnB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,OAAO;SACnB;KACF;IACD,gBAAgB,EAAE,OAAO;IACzB,SAAS,EAAE;QACT,SAAS,EAAE,WAAW;QACtB,iBAAiB,EAAE,KAAK;QACxB,MAAM,EAAE,QAAQ;QAChB,mBAAmB,EAAE,OAAO;QAC5B,MAAM,EAAE,MAAM;QACd,gBAAgB,EAAE,aAAa;QAC/B,OAAO,EAAE,QAAQ;QACjB,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,QAAQ;QACjB,YAAY,EAAE,OAAO;KACtB;IACD,eAAe,EAAE,sCAAsC;CACxD,CAC6C,CAAC;AAE/C,sCAAsC,CAAC,gCAAgC,CAAC,CAAC","sourcesContent":["// Generated by standards/scripts/generate-conformance-current-release.mjs.\n// Each exact package release verifies its own current runtime contract.\nimport {\n type BrandlabRuntimeReleaseContract,\n validateBrandlabRuntimeReleaseContract,\n} from \"./release-manifest.js\";\n\nexport const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze(\n{\n \"capabilities\": [\n \"typed-project-business-and-route-data\",\n \"essential-search-foundations\",\n \"shared-contact-delivery\",\n \"privacy-safe-lead-analytics\",\n \"security-patched-runtime\",\n \"live-google-review-summary\",\n \"high-signal-project-verification\",\n \"packed-positive-and-negative-consumers\",\n \"changesets-oidc-release\"\n ],\n \"contracts\": {\n \"analytics\": \"analytics-v4\",\n \"architecture\": \"architecture-v6\",\n \"configuration\": \"project-config-v6\",\n \"contact\": \"contact-v4\",\n \"seo\": \"seo-v4\"\n },\n \"kind\": \"brandlab-runtime-release-contract\",\n \"packages\": {\n \"@brandlab-digital/conformance\": {\n \"version\": \"2.1.0\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"2.1.0\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"2.1.0\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"2.1.0\"\n }\n },\n \"releaseVersion\": \"2.1.0\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.3.6\",\n \"nextVersionPolicy\": \"exact\",\n \"node\": \"24.x\",\n \"packageManager\": \"npm@11.14.1\",\n \"react\": \"19.2.8\",\n \"reactDom\": \"19.2.8\",\n \"router\": \"app\",\n \"sharp\": \"0.35.4\",\n \"typescript\": \"6.0.3\"\n },\n \"schemaVersion\": \"brandlab.runtime-release-contract.v1\"\n},\n) as unknown as BrandlabRuntimeReleaseContract;\n\nvalidateBrandlabRuntimeReleaseContract(BRANDLAB_CURRENT_RUNTIME_RELEASE);\n"]}
@@ -0,0 +1,15 @@
1
+ export declare const ENGINEERING_FAST_COMMANDS: readonly ["typecheck", "lint", "test", "check:unused", "check:unused:production", "check:standards"];
2
+ export interface EngineeringFinding {
3
+ path: string;
4
+ rule: string;
5
+ message: string;
6
+ }
7
+ export interface EngineeringCheck {
8
+ status: 'pass' | 'blocked';
9
+ findings: EngineeringFinding[];
10
+ coverage: string;
11
+ outstandingEvidence: readonly string[];
12
+ }
13
+ /** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */
14
+ export declare function checkEngineeringStructure(root: string): EngineeringCheck;
15
+ //# sourceMappingURL=engineering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineering.d.ts","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,sGAAuG,CAAC;AAE9I,MAAM,WAAW,kBAAkB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACnF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,iGAAiG;AACjG,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CA4DxE"}
@@ -0,0 +1,86 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { join, relative } from 'node:path';
3
+ import ts from 'typescript';
4
+ export const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'];
5
+ /** Opt-in structural check. Static success must never masquerade as whole-project acceptance. */
6
+ export function checkEngineeringStructure(root) {
7
+ const findings = [];
8
+ const add = (path, rule, message) => findings.push({ path, rule, message });
9
+ let pkg = {};
10
+ try {
11
+ pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
12
+ }
13
+ catch {
14
+ add('package.json', 'package-readable', 'A readable package.json is required.');
15
+ }
16
+ for (const path of ['src/app', 'src/data', 'src/config', 'src/components']) {
17
+ if (!existsSync(join(root, path)))
18
+ add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);
19
+ }
20
+ for (const path of ['app', 'components', 'data', 'lib', 'config', 'content', 'src/components/templates']) {
21
+ if (existsSync(join(root, path)))
22
+ add(path, 'retired-source-layout', 'Migrate consumers to the current src responsibilities and remove the superseded directory.');
23
+ }
24
+ const scripts = pkg.scripts ?? {};
25
+ for (const command of [...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {
26
+ if (!scripts[command]?.trim())
27
+ add('package.json', 'command-contract', `Missing ${command} command.`);
28
+ }
29
+ const reachable = new Set();
30
+ function visit(name) {
31
+ if (reachable.has(name))
32
+ return;
33
+ reachable.add(name);
34
+ for (const match of (scripts[name] ?? '').matchAll(/\bnpm\s+run\s+([\w:-]+)/g))
35
+ visit(match[1]);
36
+ }
37
+ visit('verify');
38
+ for (const command of ENGINEERING_FAST_COMMANDS) {
39
+ if (!reachable.has(command))
40
+ add('package.json', 'verification-wiring', `verify must execute ${command}.`);
41
+ }
42
+ if (reachable.has('build'))
43
+ add('package.json', 'single-build', 'Keep the production build separate from fast verify; run it once for the final candidate.');
44
+ if (!/\bknip\b/.test(scripts['check:unused'] ?? '') || /--(?:no-exit-code|max-issues|fix)\b/.test(scripts['check:unused'] ?? '')) {
45
+ add('package.json', 'unused-graph', 'check:unused must run Knip without bypassing failures or automatically deleting files.');
46
+ }
47
+ if (!/\bknip\b[^\n]*--production\b/.test(scripts['check:unused:production'] ?? ''))
48
+ add('package.json', 'production-graph', 'check:unused:production must run Knip production analysis.');
49
+ const knip = pkg.devDependencies?.knip;
50
+ if (!knip || !/^\d+\.\d+\.\d+$/.test(knip))
51
+ add('package.json', 'unused-tool-pin', 'Pin Knip exactly as a development dependency.');
52
+ if (!/\bbrandlab-verify\b[^\n]*--engineering\b/.test(scripts['check:standards'] ?? ''))
53
+ add('package.json', 'standards-wiring', 'check:standards must execute brandlab-verify --engineering.');
54
+ function inspect(directory) {
55
+ if (!existsSync(directory))
56
+ return;
57
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
58
+ const path = join(directory, entry.name);
59
+ if (entry.isSymbolicLink())
60
+ continue;
61
+ if (entry.isDirectory()) {
62
+ inspect(path);
63
+ continue;
64
+ }
65
+ if (!/\.(?:tsx?|jsx?|mjs|cjs)$/.test(entry.name) || /\.(?:test|spec)\./.test(entry.name))
66
+ continue;
67
+ const source = ts.createSourceFile(path, readFileSync(path, 'utf8'), ts.ScriptTarget.Latest, true);
68
+ const location = relative(root, path).replaceAll('\\', '/');
69
+ function walk(node) {
70
+ if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text.startsWith('@brandlab-digital/')) {
71
+ const bindings = node.importClause?.namedBindings;
72
+ if (bindings && ts.isNamedImports(bindings) && bindings.elements.some(element => (element.propertyName ?? element.name).text === 'trackPhoneCall')) {
73
+ add(location, 'retired-phone-api', 'Use trackPhoneLinkClick; the deprecated alias is removed in the current major.');
74
+ }
75
+ }
76
+ ts.forEachChild(node, walk);
77
+ }
78
+ walk(source);
79
+ }
80
+ }
81
+ inspect(join(root, 'src'));
82
+ return { status: findings.length ? 'blocked' : 'pass', findings,
83
+ coverage: 'Static source organisation, command wiring and retired API imports only. This is not engineering-standard completion.',
84
+ 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'] };
85
+ }
86
+ //# sourceMappingURL=engineering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineering.js","sourceRoot":"","sources":["../src/engineering.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport ts from 'typescript';\n\nexport const ENGINEERING_FAST_COMMANDS = ['typecheck', 'lint', 'test', 'check:unused', 'check:unused:production', 'check:standards'] as const;\n\nexport interface EngineeringFinding { path: string; rule: string; message: string }\nexport interface EngineeringCheck {\n status: 'pass' | 'blocked';\n findings: EngineeringFinding[];\n coverage: string;\n outstandingEvidence: readonly string[];\n}\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) => findings.push({ path, rule, message });\n let pkg: { scripts?: Record<string, string>; dependencies?: Record<string, string>; devDependencies?: Record<string, string> } = {};\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 for (const path of ['src/app', 'src/data', 'src/config', 'src/components']) {\n if (!existsSync(join(root, path))) add(path, 'source-organisation', `Place the corresponding implementation under ${path}.`);\n }\n for (const path of ['app', 'components', 'data', 'lib', 'config', 'content', 'src/components/templates']) {\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 scripts = pkg.scripts ?? {};\n for (const command of [...ENGINEERING_FAST_COMMANDS, 'verify', 'build', 'test:e2e']) {\n if (!scripts[command]?.trim()) add('package.json', 'command-contract', `Missing ${command} command.`);\n }\n const reachable = new Set<string>();\n function visit(name: string) {\n if (reachable.has(name)) return;\n reachable.add(name);\n for (const match of (scripts[name] ?? '').matchAll(/\\bnpm\\s+run\\s+([\\w:-]+)/g)) visit(match[1]);\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}.`);\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 if (!/\\bknip\\b/.test(scripts['check:unused'] ?? '') || /--(?:no-exit-code|max-issues|fix)\\b/.test(scripts['check:unused'] ?? '')) {\n add('package.json', 'unused-graph', 'check:unused must run Knip without bypassing failures or automatically deleting files.');\n }\n if (!/\\bknip\\b[^\\n]*--production\\b/.test(scripts['check:unused:production'] ?? '')) add('package.json', 'production-graph', 'check:unused:production must run Knip production analysis.');\n const knip = pkg.devDependencies?.knip;\n if (!knip || !/^\\d+\\.\\d+\\.\\d+$/.test(knip)) add('package.json', 'unused-tool-pin', 'Pin Knip exactly as a development dependency.');\n if (!/\\bbrandlab-verify\\b[^\\n]*--engineering\\b/.test(scripts['check:standards'] ?? '')) add('package.json', 'standards-wiring', 'check:standards must execute brandlab-verify --engineering.');\n\n function inspect(directory: string) {\n if (!existsSync(directory)) return;\n for (const entry of readdirSync(directory, { withFileTypes: true })) {\n const path = join(directory, entry.name);\n if (entry.isSymbolicLink()) continue;\n if (entry.isDirectory()) { inspect(path); continue; }\n if (!/\\.(?:tsx?|jsx?|mjs|cjs)$/.test(entry.name) || /\\.(?:test|spec)\\./.test(entry.name)) continue;\n const source = ts.createSourceFile(path, readFileSync(path, 'utf8'), ts.ScriptTarget.Latest, true);\n const location = relative(root, path).replaceAll('\\\\', '/');\n function walk(node: ts.Node) {\n if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier) && node.moduleSpecifier.text.startsWith('@brandlab-digital/')) {\n const bindings = node.importClause?.namedBindings;\n if (bindings && ts.isNamedImports(bindings) && bindings.elements.some(element => (element.propertyName ?? element.name).text === 'trackPhoneCall')) {\n add(location, 'retired-phone-api', 'Use trackPhoneLinkClick; the deprecated alias is removed in the current major.');\n }\n }\n ts.forEachChild(node, walk);\n }\n walk(source);\n }\n }\n inspect(join(root, 'src'));\n return { status: findings.length ? 'blocked' : 'pass', findings,\n coverage: 'Static source organisation, command wiring and retired API imports 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"]}
@@ -0,0 +1,13 @@
1
+ export interface PackedPreflight {
2
+ version: string;
3
+ receiptDigest: string;
4
+ publication: 'not-established';
5
+ packages: Record<string, {
6
+ spec: string;
7
+ integrity: string;
8
+ artifact: string;
9
+ }>;
10
+ }
11
+ /** Verify real local archives and their installed bindings without rewriting them as registry URLs. */
12
+ export declare function verifyPackedPreflight(root: string, receiptPath: string): PackedPreflight;
13
+ //# sourceMappingURL=packed-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packed-preflight.d.ts","sourceRoot":"","sources":["../src/packed-preflight.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjF;AAED,uGAAuG;AACvG,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,CAoCxF"}
@@ -0,0 +1,51 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFileSync, realpathSync } from 'node:fs';
3
+ import { basename, dirname, join, resolve } from 'node:path';
4
+ import { BRANDLAB_SHARED_PACKAGE_NAMES, isBrandlabSemver } from './release-manifest.js';
5
+ /** Verify real local archives and their installed bindings without rewriting them as registry URLs. */
6
+ export function verifyPackedPreflight(root, receiptPath) {
7
+ const bytes = readFileSync(receiptPath);
8
+ const receipt = JSON.parse(bytes.toString('utf8'));
9
+ if (receipt.state !== 'unpublished-local-test-artifacts' || !Array.isArray(receipt.packages)
10
+ || receipt.packages.length !== BRANDLAB_SHARED_PACKAGE_NAMES.length)
11
+ throw new Error('Packed preflight requires a complete unpublished four-package receipt.');
12
+ const rows = new Map(receipt.packages.map((row) => [row.name, row]));
13
+ if (rows.size !== BRANDLAB_SHARED_PACKAGE_NAMES.length)
14
+ throw new Error('Packed receipt contains duplicate packages.');
15
+ const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
16
+ const lock = JSON.parse(readFileSync(join(root, 'package-lock.json'), 'utf8'));
17
+ const packages = {};
18
+ let version;
19
+ for (const name of BRANDLAB_SHARED_PACKAGE_NAMES) {
20
+ const row = rows.get(name);
21
+ if (!row || !row.version || !isBrandlabSemver(row.version) || !row.filename
22
+ || basename(row.filename) !== row.filename || !row.filename.endsWith('.tgz'))
23
+ throw new Error(`Invalid packed receipt for ${name}.`);
24
+ version ??= row.version;
25
+ if (row.version !== version)
26
+ throw new Error('Packed versions must match across all four packages.');
27
+ const artifact = realpathSync(resolve(dirname(receiptPath), row.filename));
28
+ if (dirname(artifact) !== realpathSync(dirname(receiptPath)))
29
+ throw new Error('Packed artifacts must remain beside their receipt.');
30
+ const integrity = `sha512-${createHash('sha512').update(readFileSync(artifact)).digest('base64')}`;
31
+ if (integrity !== row.integrity)
32
+ throw new Error(`Packed archive integrity differs for ${name}.`);
33
+ const spec = pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];
34
+ const locked = lock.packages?.['']?.dependencies?.[name] ?? lock.packages?.['']?.devDependencies?.[name];
35
+ const resolved = lock.packages?.[`node_modules/${name}`];
36
+ const filePath = (value) => typeof value === 'string' && value.startsWith('file:')
37
+ ? realpathSync(resolve(root, value.slice(5))) : null;
38
+ if (pkg.dependencies?.[name] && pkg.devDependencies?.[name])
39
+ throw new Error(`Duplicate packed declaration for ${name}.`);
40
+ if (spec !== locked || filePath(spec) !== artifact || filePath(resolved?.resolved) !== artifact
41
+ || resolved?.version !== version || resolved?.integrity !== integrity || resolved?.link === true) {
42
+ throw new Error(`Packed declaration/lockfile does not match ${name}.`);
43
+ }
44
+ const installed = JSON.parse(readFileSync(join(root, 'node_modules', name, 'package.json'), 'utf8'));
45
+ if (installed.name !== name || installed.version !== version)
46
+ throw new Error(`Installed packed identity differs for ${name}.`);
47
+ packages[name] = { spec, integrity, artifact };
48
+ }
49
+ return { version: version, receiptDigest: createHash('sha256').update(bytes).digest('hex'), publication: 'not-established', packages };
50
+ }
51
+ //# sourceMappingURL=packed-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packed-preflight.js","sourceRoot":"","sources":["../src/packed-preflight.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from 'node:crypto';\nimport { readFileSync, realpathSync } from 'node:fs';\nimport { basename, dirname, join, resolve } from 'node:path';\nimport { BRANDLAB_SHARED_PACKAGE_NAMES, isBrandlabSemver } from './release-manifest.js';\n\nexport interface PackedPreflight {\n version: string;\n receiptDigest: string;\n publication: 'not-established';\n packages: Record<string, { spec: string; integrity: string; artifact: string }>;\n}\n\n/** Verify real local archives and their installed bindings without rewriting them as registry URLs. */\nexport function verifyPackedPreflight(root: string, receiptPath: string): PackedPreflight {\n const bytes = readFileSync(receiptPath);\n const receipt = JSON.parse(bytes.toString('utf8'));\n if (receipt.state !== 'unpublished-local-test-artifacts' || !Array.isArray(receipt.packages)\n || receipt.packages.length !== BRANDLAB_SHARED_PACKAGE_NAMES.length) throw new Error('Packed preflight requires a complete unpublished four-package receipt.');\n const rows = new Map(receipt.packages.map((row: { name: string }) => [row.name, row]));\n if (rows.size !== BRANDLAB_SHARED_PACKAGE_NAMES.length) throw new Error('Packed receipt contains duplicate packages.');\n const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));\n const lock = JSON.parse(readFileSync(join(root, 'package-lock.json'), 'utf8'));\n const packages: PackedPreflight['packages'] = {};\n let version: string | undefined;\n for (const name of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const row = rows.get(name) as { version?: string; filename?: string; integrity?: string } | undefined;\n if (!row || !row.version || !isBrandlabSemver(row.version) || !row.filename\n || basename(row.filename) !== row.filename || !row.filename.endsWith('.tgz')) throw new Error(`Invalid packed receipt for ${name}.`);\n version ??= row.version;\n if (row.version !== version) throw new Error('Packed versions must match across all four packages.');\n const artifact = realpathSync(resolve(dirname(receiptPath), row.filename));\n if (dirname(artifact) !== realpathSync(dirname(receiptPath))) throw new Error('Packed artifacts must remain beside their receipt.');\n const integrity = `sha512-${createHash('sha512').update(readFileSync(artifact)).digest('base64')}`;\n if (integrity !== row.integrity) throw new Error(`Packed archive integrity differs for ${name}.`);\n const spec = pkg.dependencies?.[name] ?? pkg.devDependencies?.[name];\n const locked = lock.packages?.['']?.dependencies?.[name] ?? lock.packages?.['']?.devDependencies?.[name];\n const resolved = lock.packages?.[`node_modules/${name}`];\n const filePath = (value: unknown) => typeof value === 'string' && value.startsWith('file:')\n ? realpathSync(resolve(root, value.slice(5))) : null;\n if (pkg.dependencies?.[name] && pkg.devDependencies?.[name]) throw new Error(`Duplicate packed declaration for ${name}.`);\n if (spec !== locked || filePath(spec) !== artifact || filePath(resolved?.resolved) !== artifact\n || resolved?.version !== version || resolved?.integrity !== integrity || resolved?.link === true) {\n throw new Error(`Packed declaration/lockfile does not match ${name}.`);\n }\n const installed = JSON.parse(readFileSync(join(root, 'node_modules', name, 'package.json'), 'utf8'));\n if (installed.name !== name || installed.version !== version) throw new Error(`Installed packed identity differs for ${name}.`);\n packages[name] = { spec, integrity, artifact };\n }\n return { version: version!, receiptDigest: createHash('sha256').update(bytes).digest('hex'), publication: 'not-established', packages };\n}\n"]}
package/dist/project.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type PackedPreflight } from "./packed-preflight.js";
1
2
  import { type BrandlabContractVersions, type BrandlabReleaseManifest, type BrandlabRuntimeReleaseContract } from "./release-manifest.js";
2
3
  import { type BrandlabOperationalFinding, type BrandlabVerificationEvidence, type BrandlabVerificationResult } from "./verification-policy.js";
3
4
  export { BRANDLAB_VERIFICATION_CHECKS, BRANDLAB_VERIFICATION_FAMILIES, BRANDLAB_VERIFICATION_POLICY_VERSION, type BrandlabVerificationCheckId, type BrandlabVerificationCheckResult, type BrandlabVerificationEvidence, type BrandlabVerificationEvidenceKind, type BrandlabVerificationFamilyId, type BrandlabVerificationFamilyResult, type BrandlabVerificationResult, type BrandlabVerificationStatus, } from "./verification-policy.js";
@@ -28,6 +29,7 @@ export interface ConformanceSummary {
28
29
  info: number;
29
30
  }
30
31
  export interface BrandlabConformanceResult {
32
+ packedPreflight?: PackedPreflight;
31
33
  schemaVersion: typeof BRANDLAB_CONFORMANCE_SCHEMA_VERSION;
32
34
  evaluatorVersion: typeof BRANDLAB_CONFORMANCE_EVALUATOR_VERSION;
33
35
  authorityDigest: string;
@@ -41,6 +43,7 @@ export interface BrandlabConformanceResult {
41
43
  summary: ConformanceSummary;
42
44
  }
43
45
  export interface EvaluateBrandlabProjectOptions {
46
+ packedReleaseReceipt?: string;
44
47
  root: string;
45
48
  installedRelease?: string | null;
46
49
  mode?: BrandlabConformanceMode;
@@ -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
@@ -1,6 +1,7 @@
1
1
  import { existsSync, readFileSync, readdirSync } from "node:fs";
2
2
  import { join, relative, resolve } from "node:path";
3
3
  import { BRANDLAB_CURRENT_RUNTIME_RELEASE } from "./current-release.js";
4
+ import { verifyPackedPreflight } from "./packed-preflight.js";
4
5
  import { BRANDLAB_SHARED_PACKAGE_NAMES, compareBrandlabSemver, digestBrandlabAuthority, isBrandlabSemver, projectBrandlabRuntimeReleaseContract, validateBrandlabReleaseManifest, validateBrandlabRuntimeReleaseContract, } from "./release-manifest.js";
5
6
  import { applyBrandlabVerificationPolicy, BRANDLAB_VERIFICATION_POLICY_VERSION, } from "./verification-policy.js";
6
7
  export { BRANDLAB_VERIFICATION_CHECKS, BRANDLAB_VERIFICATION_FAMILIES, BRANDLAB_VERIFICATION_POLICY_VERSION, } from "./verification-policy.js";
@@ -120,7 +121,12 @@ export function evaluateBrandlabProject(options) {
120
121
  }
121
122
  const packageJson = readPackageJson(root);
122
123
  const packageLock = readPackageLock(root);
123
- const detectedRelease = detectInstalledBrandlabRelease(packageJson);
124
+ if (options.packedReleaseReceipt && mode !== "preflight") {
125
+ throw new Error("Local packed artifacts are permitted only in explicit preflight mode.");
126
+ }
127
+ const packedPreflight = options.packedReleaseReceipt
128
+ ? verifyPackedPreflight(root, resolve(options.packedReleaseReceipt)) : undefined;
129
+ const detectedRelease = packedPreflight?.version ?? detectInstalledBrandlabRelease(packageJson);
124
130
  const installedRelease = options.installedRelease === undefined ? detectedRelease : options.installedRelease;
125
131
  const manifest = release.releaseVersion === installedRelease ? release : null;
126
132
  const attestation = options.releaseManifest?.releaseVersion === installedRelease
@@ -135,6 +141,7 @@ export function evaluateBrandlabProject(options) {
135
141
  detectedRelease,
136
142
  manifest,
137
143
  attestation,
144
+ packedPreflight,
138
145
  });
139
146
  if (manifest?.runtime.nextVersionPolicy === "exact")
140
147
  inspectImageRuntime(root, findings);
@@ -146,6 +153,7 @@ export function evaluateBrandlabProject(options) {
146
153
  const authorityDigest = digestBrandlabAuthority({
147
154
  release,
148
155
  releaseManifest: options.releaseManifest ?? null,
156
+ ...(packedPreflight ? { packedReceipt: packedPreflight.receiptDigest } : {}),
149
157
  });
150
158
  const contractDigest = digestBrandlabAuthority({
151
159
  installed: manifest?.contracts ?? null,
@@ -167,6 +175,7 @@ export function evaluateBrandlabProject(options) {
167
175
  });
168
176
  return {
169
177
  schemaVersion: BRANDLAB_CONFORMANCE_SCHEMA_VERSION,
178
+ ...(packedPreflight ? { packedPreflight } : {}),
170
179
  evaluatorVersion: BRANDLAB_CONFORMANCE_EVALUATOR_VERSION,
171
180
  authorityDigest,
172
181
  contractDigest,
@@ -214,6 +223,7 @@ function inspectRelease(options) {
214
223
  packageLock: options.packageLock,
215
224
  installedRelease: options.installedRelease,
216
225
  attestation: options.attestation,
226
+ packedPreflight: options.packedPreflight,
217
227
  });
218
228
  inspectRuntime({
219
229
  findings: options.findings,
@@ -233,7 +243,8 @@ function inspectBrandlabPackages(options) {
233
243
  const resolved = options.packageLock.resolvedPackages.get(packageName);
234
244
  const duplicate = options.packageJson.dependencies?.[packageName] !== undefined &&
235
245
  options.packageJson.devDependencies?.[packageName] !== undefined;
236
- if (duplicate || declared !== options.installedRelease || locked !== declared) {
246
+ const packed = options.packedPreflight?.packages[packageName];
247
+ if (duplicate || declared !== (packed?.spec ?? options.installedRelease) || locked !== declared) {
237
248
  options.findings.push(releaseFinding("brandlab-release-package-pin-mismatch", `${packageName}@${options.installedRelease} declared once and locked exactly`, `package.json=${declared ?? "missing"}; lockfile=${locked ?? "missing"}; duplicate=${String(duplicate)}.`, "Restore exact lockstep package declarations and regenerate the lockfile.", "package.json"));
238
249
  }
239
250
  if (!resolved ||
@@ -241,7 +252,7 @@ function inspectBrandlabPackages(options) {
241
252
  resolved.linked ||
242
253
  !resolved.integrity ||
243
254
  !resolved.resolved ||
244
- !isApprovedRegistryResolution(resolved.resolved, packageName, options.installedRelease)) {
255
+ (!packed && !isApprovedRegistryResolution(resolved.resolved, packageName, options.installedRelease))) {
245
256
  options.findings.push(releaseFinding("brandlab-release-package-resolution-mismatch", `${packageName}@${options.installedRelease} from the canonical npm registry`, !resolved
246
257
  ? "The resolved lockfile package is missing."
247
258
  : `version=${resolved.version ?? "missing"}; linked=${String(resolved.linked)}; integrity=${resolved.integrity ? "present" : "missing"}.`, "Run a clean npm install from the exact published release.", "package-lock.json"));
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport { join, relative, resolve } from \"node:path\";\nimport { BRANDLAB_CURRENT_RUNTIME_RELEASE } from \"./current-release.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 applyBrandlabVerificationPolicy,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabOperationalFinding,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationResult,\n} from \"./verification-policy.js\";\n\nexport {\n BRANDLAB_VERIFICATION_CHECKS,\n BRANDLAB_VERIFICATION_FAMILIES,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\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\nconst SOURCE_EXTENSIONS = new Set([\".js\", \".jsx\", \".mjs\", \".ts\", \".tsx\"]);\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 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 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}\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|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\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 const detectedRelease = 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\n inspectRelease({\n findings,\n packageJson,\n packageLock,\n installedRelease,\n detectedRelease,\n manifest,\n attestation,\n });\n if (manifest?.runtime.nextVersionPolicy === \"exact\") inspectImageRuntime(root, findings);\n inspectProjectConfig(root, findings);\n inspectProjectSource(root, findings);\n\n const sortedFindings = findings.sort(compareFindings);\n const policyResult = applyBrandlabVerificationPolicy(\n sortedFindings,\n options.verificationEvidence,\n );\n const operationalFindings = policyResult.operationalFindings.sort(compareFindings);\n const authorityDigest = digestBrandlabAuthority({\n release,\n releaseManifest: options.releaseManifest ?? null,\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 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 findings: BrandlabFinding[];\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 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 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 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 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 packageJson: options.packageJson,\n packageLock: options.packageLock,\n installedRelease: options.installedRelease,\n attestation: options.attestation,\n });\n inspectRuntime({\n findings: options.findings,\n packageJson: options.packageJson,\n packageLock: options.packageLock,\n manifest: options.manifest,\n });\n}\n\nfunction inspectBrandlabPackages(options: {\n findings: BrandlabFinding[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n installedRelease: string;\n attestation: BrandlabReleaseManifest | null;\n}) {\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 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 if (duplicate || declared !== 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 !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 (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 packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n manifest: BrandlabRuntimeReleaseContract;\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 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(root: string, findings: BrandlabFinding[]) {\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 (/^\\s*import\\s*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]/m.test(source) ||\n /^\\s*require\\(\\s*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]\\s*\\)/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(root: string, findings: BrandlabFinding[]) {\n const configPath = join(root, \"brandlab.config.ts\");\n const source = readOptionalText(configPath);\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 if (\n !/\\bdefineBrandlabProject\\s*\\(\\s*\\{/.test(source) ||\n !/\\bprojectId\\s*:\\s*['\"][a-z0-9][a-z0-9-]*['\"]/.test(source) ||\n !/\\bprofile\\s*:\\s*['\"]next-(?:local-service|root-level)['\"]/.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 and profile\",\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 envSource = readOptionalText(join(root, \".env.example\")) ?? \"\";\n if (/\\bcontact\\s*:\\s*\\{/.test(source)) {\n requireEnvKey(findings, envSource, \"RESEND_API_KEY\", \"contact\");\n requireEnvKey(findings, envSource, \"CONTACT_EMAIL\", \"contact\");\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, envSource, \"GOOGLE_MAPS_PLATFORM_API_KEY\", \"reviews\");\n }\n for (const retired of [\"CONTACT_CONTEXT_SECRET\", \"KV_REST_API_URL\", \"KV_REST_API_TOKEN\"]) {\n if (new RegExp(`^${retired}=`, \"m\").test(envSource)) {\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\nfunction requireEnvKey(\n findings: BrandlabFinding[],\n envSource: string,\n key: string,\n capability: string,\n) {\n if (new RegExp(`^${key}=`, \"m\").test(envSource)) return;\n findings.push(staticFinding({\n ruleId: `brandlab-environment-${capability}-${slugify(key)}`,\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(root: string, findings: BrandlabFinding[]) {\n const sourceRoot = join(root, \"src\");\n if (!existsSync(sourceRoot)) return;\n for (const file of sourceFiles(sourceRoot)) {\n const source = readFileSync(file, \"utf8\");\n const executableSource = stripCommentsPreservingLayout(source);\n for (const rule of SOURCE_RULES) {\n const match = executableSource.match(rule.pattern);\n if (!match || match.index === undefined) continue;\n findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: normalizePath(relative(root, file)),\n line: lineAt(source, match.index),\n expected: rule.expected,\n actual: \"A project-owned implementation was detected.\",\n remediation: rule.remediation,\n }));\n }\n }\n}\n\nfunction stripCommentsPreservingLayout(source: string): string {\n const output = [...source];\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" =\n \"code\";\n let escaped = false;\n\n for (let index = 0; index < output.length; index += 1) {\n const current = output[index];\n const next = output[index + 1];\n\n if (state === \"line\") {\n if (current === \"\\n\" || current === \"\\r\") {\n state = \"code\";\n } else {\n output[index] = \" \";\n }\n continue;\n }\n\n if (state === \"block\") {\n if (current === \"*\" && next === \"/\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"code\";\n } else if (current !== \"\\n\" && current !== \"\\r\") {\n output[index] = \" \";\n }\n continue;\n }\n\n if (state !== \"code\") {\n if (escaped) {\n escaped = false;\n } else if (current === \"\\\\\") {\n escaped = true;\n } else if (\n (state === \"single\" && current === \"'\") ||\n (state === \"double\" && current === '\"') ||\n (state === \"template\" && current === \"`\")\n ) {\n state = \"code\";\n }\n continue;\n }\n\n if (current === \"'\") {\n state = \"single\";\n } else if (current === '\"') {\n state = \"double\";\n } else if (current === \"`\") {\n state = \"template\";\n } else if (current === \"/\" && next === \"/\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"line\";\n } else if (current === \"/\" && next === \"*\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"block\";\n }\n }\n\n return output.join(\"\");\n}\n\nfunction sourceFiles(root: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const path = join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...sourceFiles(path));\n continue;\n }\n if (\n SOURCE_EXTENSIONS.has(extension(entry.name)) &&\n !/\\.(?:test|spec)\\.[cm]?[jt]sx?$/.test(entry.name)\n ) {\n files.push(path);\n }\n }\n return files.sort();\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 staticFinding(options: {\n ruleId: string;\n surface: string;\n expected: string;\n actual: string;\n remediation: string;\n path?: string;\n line?: number;\n}): BrandlabFinding {\n return {\n ruleId: options.ruleId,\n surface: options.surface,\n severity: \"blocker\",\n contract: { name: \"project\", version: \"current-only-v2\" },\n evidenceKind: \"static\",\n ...(options.path ? { path: options.path } : {}),\n ...(options.line ? { line: options.line } : {}),\n expected: options.expected,\n actual: options.actual,\n remediation: options.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 readOptionalText(path: string): string | null {\n return existsSync(path) ? readFileSync(path, \"utf8\") : null;\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 extension(name: string): string {\n const index = name.lastIndexOf(\".\");\n return index === -1 ? \"\" : name.slice(index);\n}\n\nfunction lineAt(source: string, index: number): number {\n return source.slice(0, index).split(\"\\n\").length;\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\nfunction normalizePath(value: string): string {\n return value.split(/[/\\\\]/).join(\"/\");\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, readFileSync, readdirSync } from \"node:fs\";\nimport { join, relative, 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 applyBrandlabVerificationPolicy,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\n type BrandlabOperationalFinding,\n type BrandlabVerificationEvidence,\n type BrandlabVerificationResult,\n} from \"./verification-policy.js\";\n\nexport {\n BRANDLAB_VERIFICATION_CHECKS,\n BRANDLAB_VERIFICATION_FAMILIES,\n BRANDLAB_VERIFICATION_POLICY_VERSION,\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\nconst SOURCE_EXTENSIONS = new Set([\".js\", \".jsx\", \".mjs\", \".ts\", \".tsx\"]);\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}\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|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\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\n inspectRelease({\n findings,\n packageJson,\n packageLock,\n installedRelease,\n detectedRelease,\n manifest,\n attestation,\n packedPreflight,\n });\n if (manifest?.runtime.nextVersionPolicy === \"exact\") inspectImageRuntime(root, findings);\n inspectProjectConfig(root, findings);\n inspectProjectSource(root, findings);\n\n const sortedFindings = findings.sort(compareFindings);\n const policyResult = applyBrandlabVerificationPolicy(\n sortedFindings,\n options.verificationEvidence,\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 packageJson: ProjectPackageJsonLike | null;\n packageLock: PackageLockInspection;\n installedRelease: string | null;\n detectedRelease: string | null;\n manifest: BrandlabRuntimeReleaseContract | null;\n attestation: BrandlabReleaseManifest | null;\n}) {\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 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 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 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 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 packageJson: options.packageJson,\n packageLock: options.packageLock,\n manifest: options.manifest,\n });\n}\n\nfunction inspectBrandlabPackages(options: {\n packedPreflight?: PackedPreflight;\n findings: BrandlabFinding[];\n packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n installedRelease: string;\n attestation: BrandlabReleaseManifest | null;\n}) {\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 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 (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 packageJson: ProjectPackageJsonLike;\n packageLock: PackageLockInspection;\n manifest: BrandlabRuntimeReleaseContract;\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 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(root: string, findings: BrandlabFinding[]) {\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 (/^\\s*import\\s*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]/m.test(source) ||\n /^\\s*require\\(\\s*['\"]@brandlab-digital\\/site-next\\/image-runtime['\"]\\s*\\)/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(root: string, findings: BrandlabFinding[]) {\n const configPath = join(root, \"brandlab.config.ts\");\n const source = readOptionalText(configPath);\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 if (\n !/\\bdefineBrandlabProject\\s*\\(\\s*\\{/.test(source) ||\n !/\\bprojectId\\s*:\\s*['\"][a-z0-9][a-z0-9-]*['\"]/.test(source) ||\n !/\\bprofile\\s*:\\s*['\"]next-(?:local-service|root-level)['\"]/.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 and profile\",\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 envSource = readOptionalText(join(root, \".env.example\")) ?? \"\";\n if (/\\bcontact\\s*:\\s*\\{/.test(source)) {\n requireEnvKey(findings, envSource, \"RESEND_API_KEY\", \"contact\");\n requireEnvKey(findings, envSource, \"CONTACT_EMAIL\", \"contact\");\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, envSource, \"GOOGLE_MAPS_PLATFORM_API_KEY\", \"reviews\");\n }\n for (const retired of [\"CONTACT_CONTEXT_SECRET\", \"KV_REST_API_URL\", \"KV_REST_API_TOKEN\"]) {\n if (new RegExp(`^${retired}=`, \"m\").test(envSource)) {\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\nfunction requireEnvKey(\n findings: BrandlabFinding[],\n envSource: string,\n key: string,\n capability: string,\n) {\n if (new RegExp(`^${key}=`, \"m\").test(envSource)) return;\n findings.push(staticFinding({\n ruleId: `brandlab-environment-${capability}-${slugify(key)}`,\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(root: string, findings: BrandlabFinding[]) {\n const sourceRoot = join(root, \"src\");\n if (!existsSync(sourceRoot)) return;\n for (const file of sourceFiles(sourceRoot)) {\n const source = readFileSync(file, \"utf8\");\n const executableSource = stripCommentsPreservingLayout(source);\n for (const rule of SOURCE_RULES) {\n const match = executableSource.match(rule.pattern);\n if (!match || match.index === undefined) continue;\n findings.push(staticFinding({\n ruleId: rule.ruleId,\n surface: rule.surface,\n path: normalizePath(relative(root, file)),\n line: lineAt(source, match.index),\n expected: rule.expected,\n actual: \"A project-owned implementation was detected.\",\n remediation: rule.remediation,\n }));\n }\n }\n}\n\nfunction stripCommentsPreservingLayout(source: string): string {\n const output = [...source];\n let state: \"code\" | \"single\" | \"double\" | \"template\" | \"line\" | \"block\" =\n \"code\";\n let escaped = false;\n\n for (let index = 0; index < output.length; index += 1) {\n const current = output[index];\n const next = output[index + 1];\n\n if (state === \"line\") {\n if (current === \"\\n\" || current === \"\\r\") {\n state = \"code\";\n } else {\n output[index] = \" \";\n }\n continue;\n }\n\n if (state === \"block\") {\n if (current === \"*\" && next === \"/\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"code\";\n } else if (current !== \"\\n\" && current !== \"\\r\") {\n output[index] = \" \";\n }\n continue;\n }\n\n if (state !== \"code\") {\n if (escaped) {\n escaped = false;\n } else if (current === \"\\\\\") {\n escaped = true;\n } else if (\n (state === \"single\" && current === \"'\") ||\n (state === \"double\" && current === '\"') ||\n (state === \"template\" && current === \"`\")\n ) {\n state = \"code\";\n }\n continue;\n }\n\n if (current === \"'\") {\n state = \"single\";\n } else if (current === '\"') {\n state = \"double\";\n } else if (current === \"`\") {\n state = \"template\";\n } else if (current === \"/\" && next === \"/\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"line\";\n } else if (current === \"/\" && next === \"*\") {\n output[index] = \" \";\n output[index + 1] = \" \";\n index += 1;\n state = \"block\";\n }\n }\n\n return output.join(\"\");\n}\n\nfunction sourceFiles(root: string): string[] {\n const files: string[] = [];\n for (const entry of readdirSync(root, { withFileTypes: true })) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const path = join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...sourceFiles(path));\n continue;\n }\n if (\n SOURCE_EXTENSIONS.has(extension(entry.name)) &&\n !/\\.(?:test|spec)\\.[cm]?[jt]sx?$/.test(entry.name)\n ) {\n files.push(path);\n }\n }\n return files.sort();\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 staticFinding(options: {\n ruleId: string;\n surface: string;\n expected: string;\n actual: string;\n remediation: string;\n path?: string;\n line?: number;\n}): BrandlabFinding {\n return {\n ruleId: options.ruleId,\n surface: options.surface,\n severity: \"blocker\",\n contract: { name: \"project\", version: \"current-only-v2\" },\n evidenceKind: \"static\",\n ...(options.path ? { path: options.path } : {}),\n ...(options.line ? { line: options.line } : {}),\n expected: options.expected,\n actual: options.actual,\n remediation: options.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 readOptionalText(path: string): string | null {\n return existsSync(path) ? readFileSync(path, \"utf8\") : null;\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 extension(name: string): string {\n const index = name.lastIndexOf(\".\");\n return index === -1 ? \"\" : name.slice(index);\n}\n\nfunction lineAt(source: string, index: number): number {\n return source.slice(0, index).split(\"\\n\").length;\n}\n\nfunction slugify(value: string): string {\n return value.toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\");\n}\n\nfunction normalizePath(value: string): string {\n return value.split(/[/\\\\]/).join(\"/\");\n}\n\nexport type { BrandlabContractVersions };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brandlab-digital/conformance",
3
- "version": "1.3.1",
3
+ "version": "2.1.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/RomieDandan/brandlab.git",
@@ -16,7 +16,7 @@
16
16
  "dist"
17
17
  ],
18
18
  "scripts": {
19
- "build": "rm -rf dist && tsc -p tsconfig.json",
19
+ "build": "rm -rf dist && tsc -p tsconfig.json && chmod +x dist/cli.js",
20
20
  "test": "vitest run",
21
21
  "typecheck": "tsc --noEmit -p tsconfig.json"
22
22
  },