@brandlab-digital/conformance 1.0.12 → 1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"current-release.d.ts","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,8BAA8B,EAEpC,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,gCAAgC,EAmD7B,8BAA8B,CAAC"}
1
+ {"version":3,"file":"current-release.d.ts","sourceRoot":"","sources":["../src/current-release.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,8BAA8B,EAEpC,MAAM,uBAAuB,CAAC;AAE/B,eAAO,MAAM,gCAAgC,EAkD7B,8BAA8B,CAAC"}
@@ -23,30 +23,29 @@ export const BRANDLAB_CURRENT_RUNTIME_RELEASE = Object.freeze({
23
23
  "kind": "brandlab-runtime-release-contract",
24
24
  "packages": {
25
25
  "@brandlab-digital/conformance": {
26
- "version": "1.0.12"
26
+ "version": "1.1.0"
27
27
  },
28
28
  "@brandlab-digital/eslint-plugin": {
29
- "version": "1.0.12"
29
+ "version": "1.1.0"
30
30
  },
31
31
  "@brandlab-digital/site-core": {
32
- "version": "1.0.12"
32
+ "version": "1.1.0"
33
33
  },
34
34
  "@brandlab-digital/site-next": {
35
- "version": "1.0.12"
35
+ "version": "1.1.0"
36
36
  }
37
37
  },
38
- "releaseVersion": "1.0.12",
38
+ "releaseVersion": "1.1.0",
39
39
  "runtime": {
40
40
  "bundler": "turbopack",
41
41
  "cacheComponents": false,
42
- "next": "16.3.3",
43
- "nextVersionPolicy": "exact",
42
+ "next": "16.3.0",
44
43
  "node": "24.x",
45
44
  "packageManager": "npm@11.14.1",
46
45
  "react": "19.2.8",
47
46
  "reactDom": "19.2.8",
48
47
  "router": "app",
49
- "sharp": "0.35.4",
48
+ "sharp": "0.35.3",
50
49
  "typescript": "6.0.3"
51
50
  },
52
51
  "schemaVersion": "brandlab.runtime-release-contract.v1"
@@ -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,QAAQ;SACpB;QACD,iCAAiC,EAAE;YACjC,SAAS,EAAE,QAAQ;SACpB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,QAAQ;SACpB;QACD,6BAA6B,EAAE;YAC7B,SAAS,EAAE,QAAQ;SACpB;KACF;IACD,gBAAgB,EAAE,QAAQ;IAC1B,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.0.12\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"1.0.12\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"1.0.12\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"1.0.12\"\n }\n },\n \"releaseVersion\": \"1.0.12\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.3.3\",\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,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.1.0\"\n },\n \"@brandlab-digital/eslint-plugin\": {\n \"version\": \"1.1.0\"\n },\n \"@brandlab-digital/site-core\": {\n \"version\": \"1.1.0\"\n },\n \"@brandlab-digital/site-next\": {\n \"version\": \"1.1.0\"\n }\n },\n \"releaseVersion\": \"1.1.0\",\n \"runtime\": {\n \"bundler\": \"turbopack\",\n \"cacheComponents\": false,\n \"next\": \"16.3.0\",\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.3\",\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 +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
@@ -17,9 +17,9 @@ const SOURCE_RULES = [
17
17
  {
18
18
  ruleId: "brandlab-source-retired-analytics-event",
19
19
  surface: "analytics",
20
- pattern: /\b(?:contact_form_submission|phone_calls|form_start|cta_click)\b/,
20
+ pattern: /\b(?:contact_form_submission|phone_call|phone_calls|form_start|cta_click)\b/,
21
21
  expected: "Only the current Brandlab analytics event contract is used.",
22
- remediation: "Use the canonical phone_call and contact_form events.",
22
+ remediation: "Use contact_form for accepted forms and phone_link_click for telephone-link diagnostics.",
23
23
  },
24
24
  {
25
25
  ruleId: "brandlab-source-local-google-tag-bootstrap",
@@ -254,11 +254,11 @@ function inspectRuntime(options) {
254
254
  const declared = declaredPackageSpec(options.packageJson, packageName);
255
255
  const locked = lockedRootSpec(options.packageLock, packageName);
256
256
  const resolved = options.packageLock.resolvedPackages.get(packageName);
257
- if (!runtimeVersionSatisfiesRelease(packageName, declared, expected, options.manifest.runtime.nextVersionPolicy) ||
257
+ if (!runtimeVersionSatisfiesRelease(packageName, declared, expected) ||
258
258
  locked !== declared ||
259
259
  resolved?.version !== declared ||
260
260
  resolved.linked) {
261
- options.findings.push(runtimeFinding(`brandlab-runtime-${slugify(packageName)}`, runtimeExpectation(packageName, expected, options.manifest.runtime.nextVersionPolicy), `package.json=${declared ?? "missing"}; lockfile=${locked ?? "missing"}; resolved=${resolved?.version ?? "missing"}.`, `Use the runtime versions permitted by the ${options.manifest.releaseVersion} contract; an exact mitigation pin requires a reviewed policy change before upgrading.`, "package.json"));
261
+ options.findings.push(runtimeFinding(`brandlab-runtime-${slugify(packageName)}`, runtimeExpectation(packageName, expected), `package.json=${declared ?? "missing"}; lockfile=${locked ?? "missing"}; resolved=${resolved?.version ?? "missing"}.`, `Use the supported ${options.manifest.releaseVersion} runtime or a newer exact stable release in the same framework major.`, "package.json"));
262
262
  }
263
263
  }
264
264
  const node = options.packageJson.engines?.node ?? null;
@@ -541,9 +541,7 @@ function emptyPackageLock(state, fingerprint = {}) {
541
541
  fingerprint: { state, ...fingerprint },
542
542
  };
543
543
  }
544
- function runtimeVersionSatisfiesRelease(packageName, actual, expected, nextVersionPolicy) {
545
- if (packageName === "next" && nextVersionPolicy === "exact")
546
- return actual === expected;
544
+ function runtimeVersionSatisfiesRelease(packageName, actual, expected) {
547
545
  if (!actual || !isBrandlabSemver(actual))
548
546
  return false;
549
547
  if (!["next", "react", "react-dom"].includes(packageName))
@@ -558,9 +556,7 @@ function runtimeVersionSatisfiesRelease(packageName, actual, expected, nextVersi
558
556
  sameSupportedLine &&
559
557
  compareBrandlabSemver(actual, expected) >= 0);
560
558
  }
561
- function runtimeExpectation(packageName, expected, nextVersionPolicy) {
562
- if (packageName === "next" && nextVersionPolicy === "exact")
563
- return `${packageName}@${expected} (exact HEIF mitigation pin)`;
559
+ function runtimeExpectation(packageName, expected) {
564
560
  if (packageName === "next") {
565
561
  return `${packageName}@${expected} or a newer exact stable release in the same major line`;
566
562
  }
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EACL,6BAA6B,EAC7B,qBAAqB,EACrB,uBAAuB,EACvB,gBAAgB,EAIhB,qCAAqC,EACrC,+BAA+B,EAC/B,sCAAsC,GACvC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,+BAA+B,EAC/B,oCAAoC,GAIrC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,4BAA4B,EAC5B,8BAA8B,EAC9B,oCAAoC,GASrC,MAAM,0BAA0B,CAAC;AAElC,MAAM,CAAC,MAAM,mCAAmC,GAAG,yBAAyB,CAAC;AAC7E,MAAM,CAAC,MAAM,sCAAsC,GAAG,iBAAiB,CAAC;AAExE,MAAM,sBAAsB,GAAG;IAC7B,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,OAAO,EAAE,OAAO,CAAC;IAClB,CAAC,WAAW,EAAE,UAAU,CAAC;IACzB,CAAC,YAAY,EAAE,YAAY,CAAC;CACpB,CAAC;AAEX,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAmF1E,MAAM,YAAY,GAA0B;IAC1C;QACE,MAAM,EAAE,yCAAyC;QACjD,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE,kEAAkE;QAC3E,QAAQ,EAAE,6DAA6D;QACvE,WAAW,EAAE,uDAAuD;KACrE;IACD;QACE,MAAM,EAAE,4CAA4C;QACpD,OAAO,EAAE,WAAW;QACpB,OAAO,EAAE,gGAAgG;QACzG,QAAQ,EAAE,gEAAgE;QAC1E,WAAW,EAAE,oFAAoF;KAClG;IACD;QACE,MAAM,EAAE,wCAAwC;QAChD,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,+CAA+C;QACxD,QAAQ,EAAE,wDAAwD;QAClE,WAAW,EAAE,kFAAkF;KAChG;IACD;QACE,MAAM,EAAE,8CAA8C;QACtD,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,6CAA6C;QACtD,QAAQ,EAAE,iEAAiE;QAC3E,WAAW,EAAE,4EAA4E;KAC1F;IACD;QACE,MAAM,EAAE,2CAA2C;QACnD,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,gJAAgJ;QACzJ,QAAQ,EAAE,wEAAwE;QAClF,WAAW,EAAE,oFAAoF;KAClG;IACD;QACE,MAAM,EAAE,2CAA2C;QACnD,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,gDAAgD;QACzD,QAAQ,EAAE,uDAAuD;QACjE,WAAW,EAAE,qEAAqE;KACnF;IACD;QACE,MAAM,EAAE,4CAA4C;QACpD,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,sCAAsC;QAChD,WAAW,EAAE,+DAA+D;KAC7E;IACD;QACE,MAAM,EAAE,6BAA6B;QACrC,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,kEAAkE;QAC5E,WAAW,EAAE,mEAAmE;KACjF;IACD;QACE,MAAM,EAAE,4CAA4C;QACpD,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,0CAA0C;QACpD,WAAW,EAAE,yFAAyF;KACvG;IACD;QACE,MAAM,EAAE,wCAAwC;QAChD,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,uDAAuD;QAChE,QAAQ,EAAE,6CAA6C;QACvD,WAAW,EAAE,+DAA+D;KAC7E;IACD;QACE,MAAM,EAAE,4CAA4C;QACpD,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,iEAAiE;QAC1E,QAAQ,EAAE,+DAA+D;QACzE,WAAW,EAAE,uEAAuE;KACrF;IACD;QACE,MAAM,EAAE,+BAA+B;QACvC,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,gDAAgD;QACzD,QAAQ,EAAE,6BAA6B;QACvC,WAAW,EAAE,sEAAsE;KACpF;IACD;QACE,MAAM,EAAE,uCAAuC;QAC/C,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,0DAA0D;QACnE,QAAQ,EAAE,gFAAgF;QAC1F,WAAW,EAAE,uFAAuF;KACrG;CACF,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,OAAuC;IAEvC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,gCAAgC,CAAC;IACpE,sCAAsC,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,+BAA+B,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACzD,IACE,uBAAuB,CAAC,qCAAqC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACvF,uBAAuB,CAAC,OAAO,CAAC,EAChC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,8BAA8B,CAAC,WAAW,CAAC,CAAC;IACpE,MAAM,gBAAgB,GACpB,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACtF,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,KAAK,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9E,MAAM,WAAW,GACf,OAAO,CAAC,eAAe,EAAE,cAAc,KAAK,gBAAgB;QAC1D,CAAC,CAAC,OAAO,CAAC,eAAe;QACzB,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,QAAQ,GAAsB,EAAE,CAAC;IAEvC,cAAc,CAAC;QACb,QAAQ;QACR,WAAW;QACX,WAAW;QACX,gBAAgB;QAChB,eAAe;QACf,QAAQ;QACR,WAAW;KACZ,CAAC,CAAC;IACH,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAErC,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,+BAA+B,CAClD,cAAc,EACd,OAAO,CAAC,oBAAoB,CAC7B,CAAC;IACF,MAAM,mBAAmB,GAAG,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnF,MAAM,eAAe,GAAG,uBAAuB,CAAC;QAC9C,OAAO;QACP,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,IAAI;KACjD,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,uBAAuB,CAAC;QAC7C,SAAS,EAAE,QAAQ,EAAE,SAAS,IAAI,IAAI;QACtC,SAAS,EAAE,sCAAsC;QACjD,kBAAkB,EAAE,oCAAoC;KACzD,CAAC,CAAC;IACH,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;QACxD,WAAW,EAAE,WAAW,IAAI,IAAI;QAChC,WAAW,EAAE,WAAW,CAAC,WAAW;QACpC,cAAc,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QAClE,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAClE,MAAM;YACN,QAAQ;YACR,IAAI,EAAE,IAAI,IAAI,IAAI;YAClB,IAAI,EAAE,IAAI,IAAI,IAAI;SACnB,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO;QACL,aAAa,EAAE,mCAAmC;QAClD,gBAAgB,EAAE,sCAAsC;QACxD,eAAe;QACf,cAAc;QACd,yBAAyB;QACzB,IAAI;QACJ,gBAAgB;QAChB,QAAQ,EAAE,mBAAmB;QAC7B,mBAAmB;QACnB,YAAY,EAAE,YAAY,CAAC,YAAY;QACvC,OAAO,EAAE,YAAY,CAAC,YAAY,CAAC,OAAO;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAiC;IAC7E,OAAO,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,8BAA8B,CAC5C,WAA0C;IAE1C,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,QAAQ,GAAG,6BAA6B,CAAC,GAAG,CAChD,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC;QACvC,WAAW,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC;QAC1C,IAAI,CACP,CAAC;IACF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,CAAC;AAED,SAAS,cAAc,CAAC,OAQvB;IACC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,uCAAuC,EACvC,yBAAyB,EACzB,qCAAqC,EACrC,+BAA+B,CAChC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,+CAA+C,EAC/C,wDAAwD,EACxD,uDAAuD,EACvD,uDAAuD,CACxD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,8BAA8B,EAC9B,qDAAqD,EACrD,GAAG,OAAO,CAAC,gBAAgB,2CAA2C,EACtE,mEAAmE,CACpE,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,eAAe,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC;QACzD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,8CAA8C,EAC9C,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,eAAe,IAAI,YAAY,EACvC,sEAAsE,EACtE,cAAc,CACf,CAAC,CAAC;IACL,CAAC;IAED,uBAAuB,CAAC;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;IACH,cAAc,CAAC;QACb,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAAC,OAMhC;IACC,IAAI,OAAO,CAAC,WAAW,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,iCAAiC,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,EAC5D,+BAA+B,EAC/B,8BAA8B,OAAO,CAAC,WAAW,CAAC,KAAK,GAAG,EAC1D,8DAA8D,EAC9D,mBAAmB,CACpB,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,KAAK,MAAM,WAAW,IAAI,6BAA6B,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvE,MAAM,SAAS,GACb,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC,KAAK,SAAS;YAC7D,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,KAAK,SAAS,CAAC;QACnE,IAAI,SAAS,IAAI,QAAQ,KAAK,OAAO,CAAC,gBAAgB,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC9E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,uCAAuC,EACvC,GAAG,WAAW,IAAI,OAAO,CAAC,gBAAgB,mCAAmC,EAC7E,gBAAgB,QAAQ,IAAI,SAAS,cAAc,MAAM,IAAI,SAAS,eAAe,MAAM,CAAC,SAAS,CAAC,GAAG,EACzG,0EAA0E,EAC1E,cAAc,CACf,CAAC,CAAC;QACL,CAAC;QACD,IACE,CAAC,QAAQ;YACT,QAAQ,CAAC,OAAO,KAAK,OAAO,CAAC,gBAAgB;YAC7C,QAAQ,CAAC,MAAM;YACf,CAAC,QAAQ,CAAC,SAAS;YACnB,CAAC,QAAQ,CAAC,QAAQ;YAClB,CAAC,4BAA4B,CAC3B,QAAQ,CAAC,QAAQ,EACjB,WAAW,EACX,OAAO,CAAC,gBAAgB,CACzB,EACD,CAAC;YACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,8CAA8C,EAC9C,GAAG,WAAW,IAAI,OAAO,CAAC,gBAAgB,kCAAkC,EAC5E,CAAC,QAAQ;gBACP,CAAC,CAAC,2CAA2C;gBAC7C,CAAC,CAAC,WAAW,QAAQ,CAAC,OAAO,IAAI,SAAS,YAAY,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,EAC3I,2DAA2D,EAC3D,mBAAmB,CACpB,CAAC,CAAC;QACL,CAAC;QACD,MAAM,iBAAiB,GACrB,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;QACxE,IAAI,iBAAiB,IAAI,QAAQ,EAAE,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACnE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,6CAA6C,EAC7C,GAAG,WAAW,4CAA4C,EAC1D,8DAA8D,EAC9D,6DAA6D,EAC7D,mBAAmB,CACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAKvB;IACC,KAAK,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,sBAAsB,EAAE,CAAC;QACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvE,IACE,CAAC,8BAA8B,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAC5G,MAAM,KAAK,QAAQ;YACnB,QAAQ,EAAE,OAAO,KAAK,QAAQ;YAC9B,QAAQ,CAAC,MAAM,EACf,CAAC;YACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,oBAAoB,OAAO,CAAC,WAAW,CAAC,EAAE,EAC1C,kBAAkB,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,EACrF,gBAAgB,QAAQ,IAAI,SAAS,cAAc,MAAM,IAAI,SAAS,cAAc,QAAQ,EAAE,OAAO,IAAI,SAAS,GAAG,EACrH,6CAA6C,OAAO,CAAC,QAAQ,CAAC,cAAc,wFAAwF,EACpK,cAAc,CACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,CAAC;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC;IAC9D,IAAI,IAAI,KAAK,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAChE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,uBAAuB,EACvB,gBAAgB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAC/C,gBAAgB,IAAI,IAAI,SAAS,cAAc,QAAQ,IAAI,SAAS,GAAG,EACvE,gEAAgE,EAChE,cAAc,CACf,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,CAAC,cAAc,KAAK,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QACnF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,kCAAkC,EAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EACvC,OAAO,CAAC,WAAW,CAAC,cAAc,IAAI,SAAS,EAC/C,0DAA0D,EAC1D,cAAc,CACf,CAAC,CAAC;IACL,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;IACrD,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC;QAC9D,IACE,QAAQ,KAAK,aAAa;YAC1B,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YACjD,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,aAAa,EAClE,CAAC;YACD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAClC,wBAAwB,EACxB,aAAa,aAAa,aAAa,EACvC,YAAY,QAAQ,IAAI,SAAS,iBAAiB,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,EAC/J,uEAAuE,EACvE,mBAAmB,CACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,QAA2B;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;YAC1B,MAAM,EAAE,yBAAyB;YACjC,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,gDAAgD;YAC1D,MAAM,EAAE,gCAAgC;YACxC,WAAW,EAAE,gEAAgE;SAC9E,CAAC,CAAC,CAAC;QACJ,OAAO;IACT,CAAC;IACD,IACE,CAAC,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC;QACjD,CAAC,8CAA8C,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5D,CAAC,2DAA2D,CAAC,IAAI,CAAC,MAAM,CAAC,EACzE,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;YAC1B,MAAM,EAAE,yBAAyB;YACjC,OAAO,EAAE,QAAQ;YACjB,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,0EAA0E;YACpF,MAAM,EAAE,8DAA8D;YACtE,WAAW,EAAE,kEAAkE;SAChF,CAAC,CAAC,CAAC;IACN,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAChE,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9E,MAAM,2BAA2B,GAC/B,wCAAwC,CAAC,IAAI,CAAC,aAAa,CAAC;QAC5D,uCAAuC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9D,IAAI,2BAA2B,EAAE,CAAC;QAChC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,8BAA8B,EAAE,SAAS,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,CAAC,wBAAwB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACzF,IAAI,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACpD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;gBAC1B,MAAM,EAAE,4CAA4C;gBACpD,OAAO,EAAE,aAAa;gBACtB,IAAI,EAAE,cAAc;gBACpB,QAAQ,EAAE,4CAA4C;gBACtD,MAAM,EAAE,GAAG,OAAO,uBAAuB;gBACzC,WAAW,EAAE,UAAU,OAAO,sDAAsD;aACrF,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,QAA2B,EAC3B,SAAiB,EACjB,GAAW,EACX,UAAkB;IAElB,IAAI,IAAI,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO;IACxD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;QAC1B,MAAM,EAAE,wBAAwB,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAC5D,OAAO,EAAE,aAAa;QACtB,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,GAAG,GAAG,+BAA+B,UAAU,aAAa;QACtE,MAAM,EAAE,GAAG,GAAG,gCAAgC;QAC9C,WAAW,EAAE,2BAA2B,GAAG,mDAAmD;KAC/F,CAAC,CAAC,CAAC;AACN,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,QAA2B;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO;IACpC,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;gBAAE,SAAS;YAClD,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;gBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC;gBACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,8CAA8C;gBACtD,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CAAC,MAAc;IACnD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IAC3B,IAAI,KAAK,GACP,MAAM,CAAC;IACT,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE/B,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACzC,KAAK,GAAG,MAAM,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;YACtB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,IAAI,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;gBACpB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;gBACxB,KAAK,IAAI,CAAC,CAAC;gBACX,KAAK,GAAG,MAAM,CAAC;YACjB,CAAC;iBAAM,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBAChD,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;YACtB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;iBAAM,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC5B,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,IACL,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,GAAG,CAAC;gBACvC,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,GAAG,CAAC;gBACvC,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,KAAK,GAAG,CAAC,EACzC,CAAC;gBACD,KAAK,GAAG,MAAM,CAAC;YACjB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,KAAK,GAAG,QAAQ,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YAC3B,KAAK,GAAG,QAAQ,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YAC3B,KAAK,GAAG,UAAU,CAAC;QACrB,CAAC;aAAM,IAAI,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;YACpB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACxB,KAAK,IAAI,CAAC,CAAC;YACX,KAAK,GAAG,MAAM,CAAC;QACjB,CAAC;aAAM,IAAI,OAAO,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;YACpB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;YACxB,KAAK,IAAI,CAAC,CAAC;YACX,KAAK,GAAG,OAAO,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,SAAS;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QACD,IACE,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAClD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAA2B,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM;QAAE,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAChD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,eAAe,GACnB,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7E,IAAI,eAAe,KAAK,CAAC,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,gBAAgB,CAAC,aAAa,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,gBAAgB,GAAG,YAAY,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAChE,MAAM,mBAAmB,GAAG,YAAY,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC1D,MAAM,YAAY,GAAG;QACnB,GAAG,6BAA6B;QAChC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC;QAC/C,OAAO;KACR,CAAC;IACF,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAC/B,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE;YAChC,OAAO,EAAE,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACjE,QAAQ,EAAE,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;YACpE,SAAS,EAAE,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACvE,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,IAAI;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SACrD,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,oBAAoB,IAAI,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;SACzF,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACvB,IAAI;QACJ,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;KACrF,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,OAAO;QACL,KAAK,EAAE,OAAO;QACd,eAAe;QACf,gBAAgB;QAChB,mBAAmB;QACnB,WAAW;QACX,gBAAgB;QAChB,gBAAgB;QAChB,WAAW,EAAE;YACX,eAAe;YACf,gBAAgB;YAChB,mBAAmB;YACnB,WAAW;YACX,QAAQ,EAAE,MAAM,CAAC,WAAW,CAC1B,CAAC,GAAG,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;gBAC3C,IAAI;gBACJ,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;aACjD,CAAC,CACH;YACD,gBAAgB;SACjB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAuD,EACvD,cAAuC,EAAE;IAEzC,OAAO;QACL,KAAK;QACL,eAAe,EACb,OAAO,WAAW,CAAC,eAAe,KAAK,QAAQ;YAC7C,CAAC,CAAC,WAAW,CAAC,eAAe;YAC7B,CAAC,CAAC,IAAI;QACV,gBAAgB,EAAE,EAAE;QACpB,mBAAmB,EAAE,EAAE;QACvB,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,EAAE,KAAK,EAAE,GAAG,WAAW,EAAE;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CACrC,WAAuD,EACvD,MAAqB,EACrB,QAAgB,EAChB,iBAA2B;IAE3B,IAAI,WAAW,KAAK,MAAM,IAAI,iBAAiB,KAAK,OAAO;QAAE,OAAO,MAAM,KAAK,QAAQ,CAAC;IACxF,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,MAAM,KAAK,QAAQ,CAAC;IACtF,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC9D,MAAM,iBAAiB,GAAG,WAAW,KAAK,MAAM;QAC9C,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC,CAAC,CAAC;QACzC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IACvF,OAAO,OAAO,CACZ,WAAW;QACX,aAAa;QACb,iBAAiB;QACjB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAC7C,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,WAAmB,EAAE,QAAgB,EAAE,iBAA2B;IAC5F,IAAI,WAAW,KAAK,MAAM,IAAI,iBAAiB,KAAK,OAAO;QAAE,OAAO,GAAG,WAAW,IAAI,QAAQ,8BAA8B,CAAC;IAC7H,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,GAAG,WAAW,IAAI,QAAQ,yDAAyD,CAAC;IAC7F,CAAC;IACD,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;QACjD,CAAC,CAAC,GAAG,WAAW,IAAI,QAAQ,sDAAsD;QAClF,CAAC,CAAC,GAAG,WAAW,IAAI,QAAQ,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,4BAA4B,CACnC,QAAgB,EAChB,WAAmB,EACnB,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,OAAO,CACZ,QAAQ;YACR,GAAG,CAAC,QAAQ,KAAK,QAAQ;YACzB,GAAG,CAAC,QAAQ,KAAK,oBAAoB;YACrC,GAAG,CAAC,QAAQ,KAAK,IAAI,WAAW,MAAM,QAAQ,IAAI,OAAO,MAAM,CAChE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,WAAmC,EACnC,WAAmB;IAEnB,OAAO,CACL,WAAW,CAAC,YAAY,EAAE,CAAC,WAAW,CAAC;QACvC,WAAW,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC;QAC1C,IAAI,CACL,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,IAA2B,EAC3B,WAAmB;IAEnB,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;AAC7F,CAAC;AAED,SAAS,cAAc,CACrB,MAAc,EACd,QAAgB,EAChB,MAAc,EACd,WAAmB,EACnB,IAAa;IAEb,OAAO;QACL,MAAM;QACN,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE;QACzD,YAAY,EAAE,QAAQ;QACtB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,QAAQ;QACR,MAAM;QACN,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CACrB,MAAc,EACd,QAAgB,EAChB,MAAc,EACd,WAAmB,EACnB,IAAY;IAEZ,OAAO;QACL,MAAM;QACN,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE;QAC3D,YAAY,EAAE,QAAQ;QACtB,IAAI;QACJ,QAAQ;QACR,MAAM;QACN,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,OAQtB;IACC,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,iBAAiB,EAAE;QACzD,YAAY,EAAE,QAAQ;QACtB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAqB,EAAE,KAAsB;IACpE,OAAO,CACL,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;QACvC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QACjD,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CACrC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAC1B,CAAC,KAAK,EAA6B,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CACnE,CACF,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,MAAM,CAAC,MAAc,EAAE,KAAa;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;AACnD,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxC,CAAC","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_calls|form_start|cta_click)\\b/,\n expected: \"Only the current Brandlab analytics event contract is used.\",\n remediation: \"Use the canonical phone_call and contact_form events.\",\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 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 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 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 {\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 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 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) ||\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),\n `package.json=${declared ?? \"missing\"}; lockfile=${locked ?? \"missing\"}; resolved=${resolved?.version ?? \"missing\"}.`,\n `Use the supported ${options.manifest.releaseVersion} runtime or a newer exact stable release in the same framework major.`,\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 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): boolean {\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): string {\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"]}
@@ -2,7 +2,6 @@ export declare const BRANDLAB_SHARED_PACKAGE_NAMES: readonly ["@brandlab-digital
2
2
  export type BrandlabSharedPackageName = (typeof BRANDLAB_SHARED_PACKAGE_NAMES)[number];
3
3
  export interface BrandlabRuntimeBaseline {
4
4
  next: string;
5
- nextVersionPolicy?: "exact";
6
5
  sharp?: string;
7
6
  react: string;
8
7
  reactDom: string;
@@ -1 +1 @@
1
- {"version":3,"file":"release-manifest.d.ts","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"release-manifest.d.ts","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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"}
@@ -177,9 +177,6 @@ function validateRuntime(value) {
177
177
  if (!isBrandlabSemver(runtime[field]))
178
178
  fail(`runtime.${field} must be exact semver`);
179
179
  }
180
- if (runtime.nextVersionPolicy !== undefined && runtime.nextVersionPolicy !== "exact") {
181
- fail("runtime.nextVersionPolicy is invalid");
182
- }
183
180
  if (runtime.sharp !== undefined && !isBrandlabSemver(runtime.sharp)) {
184
181
  fail("runtime.sharp must be exact semver");
185
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"release-manifest.js","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport const BRANDLAB_SHARED_PACKAGE_NAMES = [\n \"@brandlab-digital/site-core\",\n \"@brandlab-digital/site-next\",\n \"@brandlab-digital/conformance\",\n \"@brandlab-digital/eslint-plugin\",\n] as const;\n\nexport type BrandlabSharedPackageName =\n (typeof BRANDLAB_SHARED_PACKAGE_NAMES)[number];\n\nexport interface BrandlabRuntimeBaseline {\n next: string;\n nextVersionPolicy?: \"exact\";\n sharp?: string;\n react: string;\n reactDom: string;\n node: string;\n typescript: string;\n packageManager: string;\n router: \"app\";\n bundler: \"turbopack\";\n cacheComponents: boolean;\n}\n\nexport interface BrandlabContractVersions {\n architecture: string;\n configuration: string;\n contact: string;\n seo: string;\n analytics: string;\n}\n\nexport interface BrandlabRuntimeReleaseContract {\n schemaVersion: \"brandlab.runtime-release-contract.v1\";\n kind: \"brandlab-runtime-release-contract\";\n releaseVersion: string;\n packages: Record<BrandlabSharedPackageName, { version: string }>;\n runtime: BrandlabRuntimeBaseline;\n contracts: BrandlabContractVersions;\n capabilities: string[];\n}\n\nexport interface BrandlabReleaseManifest {\n schemaVersion: 1;\n kind: \"brandlab-release-manifest\";\n releaseVersion: string;\n releasedAt: string;\n channel: \"prerelease\" | \"rc\" | \"stable\";\n packages: Record<\n BrandlabSharedPackageName,\n {\n version: string;\n registry: {\n state: \"verified\" | \"published-unverified\" | \"not-published\";\n shasum: string | null;\n integrity: string | null;\n };\n }\n >;\n runtime: BrandlabRuntimeBaseline;\n contracts: BrandlabContractVersions;\n capabilities: string[];\n evidence: {\n recordState: \"verified\" | \"reconstructed\" | \"planned\";\n sourceCommit: string | null;\n releaseNotes: string;\n releaseEvidence: string | null;\n testCount: number | null;\n verificationCommands: string[];\n };\n fingerprints: {\n publicApi: string | null;\n fixtures: string | null;\n };\n rollback: {\n targetRelease: string | null;\n strategy: string;\n };\n}\n\nconst SEMVER_PATTERN =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/;\nconst DATE_PATTERN = /^20\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/;\nconst SHA1_PATTERN = /^[a-f0-9]{40}$/;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/;\n\nexport function isBrandlabSemver(value: unknown): value is string {\n return typeof value === \"string\" && SEMVER_PATTERN.test(value);\n}\n\nexport function compareBrandlabSemver(first: string, second: string): number {\n const left = parseSemver(first);\n const right = parseSemver(second);\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (left[key] !== right[key]) return left[key] - right[key];\n }\n if (left.prerelease.length === 0 && right.prerelease.length > 0) return 1;\n if (right.prerelease.length === 0 && left.prerelease.length > 0) return -1;\n const length = Math.max(left.prerelease.length, right.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const a = left.prerelease[index];\n const b = right.prerelease[index];\n if (a === undefined) return -1;\n if (b === undefined) return 1;\n if (a === b) continue;\n const aNumeric = /^\\d+$/.test(a);\n const bNumeric = /^\\d+$/.test(b);\n if (aNumeric && bNumeric) return Number(a) - Number(b);\n if (aNumeric) return -1;\n if (bNumeric) return 1;\n return a.localeCompare(b);\n }\n return 0;\n}\n\nexport function projectBrandlabRuntimeReleaseContract(\n input: unknown,\n): BrandlabRuntimeReleaseContract {\n validateBrandlabReleaseManifest(input);\n return {\n schemaVersion: \"brandlab.runtime-release-contract.v1\",\n kind: \"brandlab-runtime-release-contract\",\n releaseVersion: input.releaseVersion,\n packages: Object.fromEntries(\n BRANDLAB_SHARED_PACKAGE_NAMES.map((name) => [\n name,\n { version: input.packages[name].version },\n ]),\n ) as Record<BrandlabSharedPackageName, { version: string }>,\n runtime: { ...input.runtime },\n contracts: { ...input.contracts },\n capabilities: [...input.capabilities],\n };\n}\n\nexport function validateBrandlabRuntimeReleaseContract(\n input: unknown,\n): asserts input is BrandlabRuntimeReleaseContract {\n const contract = asObject(input, \"runtime release contract\");\n exactKeys(contract, [\n \"schemaVersion\",\n \"kind\",\n \"releaseVersion\",\n \"packages\",\n \"runtime\",\n \"contracts\",\n \"capabilities\",\n ], \"runtime release contract\");\n if (contract.schemaVersion !== \"brandlab.runtime-release-contract.v1\") {\n fail(\"runtime release contract schemaVersion is invalid\");\n }\n if (contract.kind !== \"brandlab-runtime-release-contract\") {\n fail(\"runtime release contract kind is invalid\");\n }\n validateReleaseVersionAndPackages(contract);\n validateRuntime(contract.runtime);\n validateContracts(contract.contracts);\n stringArray(contract.capabilities, \"capabilities\", true);\n}\n\nexport function validateBrandlabReleaseManifest(\n input: unknown,\n): asserts input is BrandlabReleaseManifest {\n const manifest = asObject(input, \"release manifest\");\n if (manifest.schemaVersion !== 1 || manifest.kind !== \"brandlab-release-manifest\") {\n fail(\"release manifest schema is invalid\");\n }\n if (!isDate(manifest.releasedAt)) fail(\"releasedAt must be an ISO date\");\n if (!includes([\"prerelease\", \"rc\", \"stable\"], manifest.channel)) {\n fail(\"channel is invalid\");\n }\n validateReleaseVersionAndPackages(manifest, true);\n validateRuntime(manifest.runtime);\n validateContracts(manifest.contracts);\n stringArray(manifest.capabilities, \"capabilities\", true);\n\n const evidence = asObject(manifest.evidence, \"evidence\");\n if (!includes([\"verified\", \"reconstructed\", \"planned\"], evidence.recordState)) {\n fail(\"evidence.recordState is invalid\");\n }\n if (evidence.sourceCommit !== null && !SHA1_PATTERN.test(String(evidence.sourceCommit))) {\n fail(\"evidence.sourceCommit must be a full Git commit\");\n }\n if (!nonEmptyString(evidence.releaseNotes)) fail(\"evidence.releaseNotes is required\");\n if (evidence.releaseEvidence !== null && !nonEmptyString(evidence.releaseEvidence)) {\n fail(\"evidence.releaseEvidence is invalid\");\n }\n if (\n evidence.testCount !== null &&\n (!Number.isInteger(evidence.testCount) || Number(evidence.testCount) < 0)\n ) {\n fail(\"evidence.testCount is invalid\");\n }\n stringArray(evidence.verificationCommands, \"verificationCommands\", false);\n\n const fingerprints = asObject(manifest.fingerprints, \"fingerprints\");\n optionalDigest(fingerprints.publicApi, SHA256_PATTERN, \"public API fingerprint\");\n optionalDigest(fingerprints.fixtures, SHA256_PATTERN, \"fixture fingerprint\");\n\n const rollback = asObject(manifest.rollback, \"rollback\");\n if (rollback.targetRelease !== null && !isBrandlabSemver(rollback.targetRelease)) {\n fail(\"rollback.targetRelease is invalid\");\n }\n if (!nonEmptyString(rollback.strategy)) fail(\"rollback.strategy is required\");\n}\n\nexport function digestBrandlabAuthority(value: unknown): string {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction validateReleaseVersionAndPackages(\n record: Record<string, unknown>,\n withRegistry = false,\n) {\n if (!isBrandlabSemver(record.releaseVersion)) fail(\"releaseVersion is invalid\");\n const packages = asObject(record.packages, \"packages\");\n if (\n JSON.stringify(Object.keys(packages).sort()) !==\n JSON.stringify([...BRANDLAB_SHARED_PACKAGE_NAMES].sort())\n ) {\n fail(\"packages must contain the four Brandlab packages\");\n }\n for (const name of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const entry = asObject(packages[name], `packages.${name}`);\n if (entry.version !== record.releaseVersion) {\n fail(`${name} must use the lockstep releaseVersion`);\n }\n if (!withRegistry) {\n exactKeys(entry, [\"version\"], `packages.${name}`);\n continue;\n }\n const registry = asObject(entry.registry, `${name}.registry`);\n if (!includes([\"verified\", \"published-unverified\", \"not-published\"], registry.state)) {\n fail(`${name} registry state is invalid`);\n }\n optionalDigest(registry.shasum, SHA1_PATTERN, `${name} shasum`);\n if (\n registry.integrity !== null &&\n (typeof registry.integrity !== \"string\" ||\n !/^sha512-[A-Za-z0-9+/=]+$/.test(registry.integrity))\n ) {\n fail(`${name} integrity is invalid`);\n }\n if (\n registry.state === \"verified\" &&\n registry.shasum === null &&\n registry.integrity === null\n ) {\n fail(`${name} verified registry evidence is empty`);\n }\n }\n}\n\nfunction validateRuntime(value: unknown) {\n const runtime = asObject(value, \"runtime\");\n for (const field of [\n \"next\",\n \"react\",\n \"reactDom\",\n \"node\",\n \"typescript\",\n \"packageManager\",\n ] as const) {\n if (!nonEmptyString(runtime[field])) fail(`runtime.${field} is required`);\n }\n for (const field of [\"next\", \"react\", \"reactDom\", \"typescript\"] as const) {\n if (!isBrandlabSemver(runtime[field])) fail(`runtime.${field} must be exact semver`);\n }\n if (runtime.nextVersionPolicy !== undefined && runtime.nextVersionPolicy !== \"exact\") {\n fail(\"runtime.nextVersionPolicy is invalid\");\n }\n if (runtime.sharp !== undefined && !isBrandlabSemver(runtime.sharp)) {\n fail(\"runtime.sharp must be exact semver\");\n }\n if (!/^\\d+\\.x$/.test(String(runtime.node))) fail(\"runtime.node is invalid\");\n if (!/^npm@\\d+\\.\\d+\\.\\d+$/.test(String(runtime.packageManager))) {\n fail(\"runtime.packageManager is invalid\");\n }\n if (\n runtime.router !== \"app\" ||\n runtime.bundler !== \"turbopack\" ||\n typeof runtime.cacheComponents !== \"boolean\"\n ) {\n fail(\"runtime architecture is invalid\");\n }\n}\n\nfunction validateContracts(value: unknown) {\n const contracts = asObject(value, \"contracts\");\n for (const field of [\n \"architecture\",\n \"configuration\",\n \"contact\",\n \"seo\",\n \"analytics\",\n ] as const) {\n if (!nonEmptyString(contracts[field])) fail(`contracts.${field} is required`);\n }\n}\n\nfunction parseSemver(value: string) {\n const match = value.match(SEMVER_PATTERN);\n if (!match) throw new Error(`Invalid semver: ${value}`);\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4]?.split(\".\") ?? [],\n };\n}\n\nfunction stableStringify(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(\",\")}]`;\n if (value && typeof value === \"object\") {\n return `{${Object.entries(value)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, child]) => `${JSON.stringify(key)}:${stableStringify(child)}`)\n .join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"null\";\n}\n\nfunction asObject(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n fail(`${label} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction exactKeys(value: Record<string, unknown>, keys: readonly string[], label: string) {\n if (\n JSON.stringify(Object.keys(value).sort()) !== JSON.stringify([...keys].sort())\n ) {\n fail(`${label} contains unsupported fields`);\n }\n}\n\nfunction stringArray(value: unknown, label: string, unique: boolean) {\n if (!Array.isArray(value) || value.some((entry) => !nonEmptyString(entry))) {\n fail(`${label} must be an array of strings`);\n }\n if (unique && new Set(value).size !== value.length) fail(`${label} must be unique`);\n}\n\nfunction optionalDigest(value: unknown, pattern: RegExp, label: string) {\n if (value !== null && (typeof value !== \"string\" || !pattern.test(value))) {\n fail(`${label} is invalid`);\n }\n}\n\nfunction isDate(value: unknown): value is string {\n if (typeof value !== \"string\" || !DATE_PATTERN.test(value)) return false;\n return new Date(`${value}T00:00:00.000Z`).toISOString().startsWith(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction includes(values: readonly string[], value: unknown): value is string {\n return typeof value === \"string\" && values.includes(value);\n}\n\nfunction fail(message: string): never {\n throw new Error(`Invalid Brandlab release: ${message}.`);\n}\n"]}
1
+ {"version":3,"file":"release-manifest.js","sourceRoot":"","sources":["../src/release-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\n\nexport const BRANDLAB_SHARED_PACKAGE_NAMES = [\n \"@brandlab-digital/site-core\",\n \"@brandlab-digital/site-next\",\n \"@brandlab-digital/conformance\",\n \"@brandlab-digital/eslint-plugin\",\n] as const;\n\nexport type BrandlabSharedPackageName =\n (typeof BRANDLAB_SHARED_PACKAGE_NAMES)[number];\n\nexport interface BrandlabRuntimeBaseline {\n next: string;\n sharp?: string;\n react: string;\n reactDom: string;\n node: string;\n typescript: string;\n packageManager: string;\n router: \"app\";\n bundler: \"turbopack\";\n cacheComponents: boolean;\n}\n\nexport interface BrandlabContractVersions {\n architecture: string;\n configuration: string;\n contact: string;\n seo: string;\n analytics: string;\n}\n\nexport interface BrandlabRuntimeReleaseContract {\n schemaVersion: \"brandlab.runtime-release-contract.v1\";\n kind: \"brandlab-runtime-release-contract\";\n releaseVersion: string;\n packages: Record<BrandlabSharedPackageName, { version: string }>;\n runtime: BrandlabRuntimeBaseline;\n contracts: BrandlabContractVersions;\n capabilities: string[];\n}\n\nexport interface BrandlabReleaseManifest {\n schemaVersion: 1;\n kind: \"brandlab-release-manifest\";\n releaseVersion: string;\n releasedAt: string;\n channel: \"prerelease\" | \"rc\" | \"stable\";\n packages: Record<\n BrandlabSharedPackageName,\n {\n version: string;\n registry: {\n state: \"verified\" | \"published-unverified\" | \"not-published\";\n shasum: string | null;\n integrity: string | null;\n };\n }\n >;\n runtime: BrandlabRuntimeBaseline;\n contracts: BrandlabContractVersions;\n capabilities: string[];\n evidence: {\n recordState: \"verified\" | \"reconstructed\" | \"planned\";\n sourceCommit: string | null;\n releaseNotes: string;\n releaseEvidence: string | null;\n testCount: number | null;\n verificationCommands: string[];\n };\n fingerprints: {\n publicApi: string | null;\n fixtures: string | null;\n };\n rollback: {\n targetRelease: string | null;\n strategy: string;\n };\n}\n\nconst SEMVER_PATTERN =\n /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$/;\nconst DATE_PATTERN = /^20\\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])$/;\nconst SHA1_PATTERN = /^[a-f0-9]{40}$/;\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/;\n\nexport function isBrandlabSemver(value: unknown): value is string {\n return typeof value === \"string\" && SEMVER_PATTERN.test(value);\n}\n\nexport function compareBrandlabSemver(first: string, second: string): number {\n const left = parseSemver(first);\n const right = parseSemver(second);\n for (const key of [\"major\", \"minor\", \"patch\"] as const) {\n if (left[key] !== right[key]) return left[key] - right[key];\n }\n if (left.prerelease.length === 0 && right.prerelease.length > 0) return 1;\n if (right.prerelease.length === 0 && left.prerelease.length > 0) return -1;\n const length = Math.max(left.prerelease.length, right.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const a = left.prerelease[index];\n const b = right.prerelease[index];\n if (a === undefined) return -1;\n if (b === undefined) return 1;\n if (a === b) continue;\n const aNumeric = /^\\d+$/.test(a);\n const bNumeric = /^\\d+$/.test(b);\n if (aNumeric && bNumeric) return Number(a) - Number(b);\n if (aNumeric) return -1;\n if (bNumeric) return 1;\n return a.localeCompare(b);\n }\n return 0;\n}\n\nexport function projectBrandlabRuntimeReleaseContract(\n input: unknown,\n): BrandlabRuntimeReleaseContract {\n validateBrandlabReleaseManifest(input);\n return {\n schemaVersion: \"brandlab.runtime-release-contract.v1\",\n kind: \"brandlab-runtime-release-contract\",\n releaseVersion: input.releaseVersion,\n packages: Object.fromEntries(\n BRANDLAB_SHARED_PACKAGE_NAMES.map((name) => [\n name,\n { version: input.packages[name].version },\n ]),\n ) as Record<BrandlabSharedPackageName, { version: string }>,\n runtime: { ...input.runtime },\n contracts: { ...input.contracts },\n capabilities: [...input.capabilities],\n };\n}\n\nexport function validateBrandlabRuntimeReleaseContract(\n input: unknown,\n): asserts input is BrandlabRuntimeReleaseContract {\n const contract = asObject(input, \"runtime release contract\");\n exactKeys(contract, [\n \"schemaVersion\",\n \"kind\",\n \"releaseVersion\",\n \"packages\",\n \"runtime\",\n \"contracts\",\n \"capabilities\",\n ], \"runtime release contract\");\n if (contract.schemaVersion !== \"brandlab.runtime-release-contract.v1\") {\n fail(\"runtime release contract schemaVersion is invalid\");\n }\n if (contract.kind !== \"brandlab-runtime-release-contract\") {\n fail(\"runtime release contract kind is invalid\");\n }\n validateReleaseVersionAndPackages(contract);\n validateRuntime(contract.runtime);\n validateContracts(contract.contracts);\n stringArray(contract.capabilities, \"capabilities\", true);\n}\n\nexport function validateBrandlabReleaseManifest(\n input: unknown,\n): asserts input is BrandlabReleaseManifest {\n const manifest = asObject(input, \"release manifest\");\n if (manifest.schemaVersion !== 1 || manifest.kind !== \"brandlab-release-manifest\") {\n fail(\"release manifest schema is invalid\");\n }\n if (!isDate(manifest.releasedAt)) fail(\"releasedAt must be an ISO date\");\n if (!includes([\"prerelease\", \"rc\", \"stable\"], manifest.channel)) {\n fail(\"channel is invalid\");\n }\n validateReleaseVersionAndPackages(manifest, true);\n validateRuntime(manifest.runtime);\n validateContracts(manifest.contracts);\n stringArray(manifest.capabilities, \"capabilities\", true);\n\n const evidence = asObject(manifest.evidence, \"evidence\");\n if (!includes([\"verified\", \"reconstructed\", \"planned\"], evidence.recordState)) {\n fail(\"evidence.recordState is invalid\");\n }\n if (evidence.sourceCommit !== null && !SHA1_PATTERN.test(String(evidence.sourceCommit))) {\n fail(\"evidence.sourceCommit must be a full Git commit\");\n }\n if (!nonEmptyString(evidence.releaseNotes)) fail(\"evidence.releaseNotes is required\");\n if (evidence.releaseEvidence !== null && !nonEmptyString(evidence.releaseEvidence)) {\n fail(\"evidence.releaseEvidence is invalid\");\n }\n if (\n evidence.testCount !== null &&\n (!Number.isInteger(evidence.testCount) || Number(evidence.testCount) < 0)\n ) {\n fail(\"evidence.testCount is invalid\");\n }\n stringArray(evidence.verificationCommands, \"verificationCommands\", false);\n\n const fingerprints = asObject(manifest.fingerprints, \"fingerprints\");\n optionalDigest(fingerprints.publicApi, SHA256_PATTERN, \"public API fingerprint\");\n optionalDigest(fingerprints.fixtures, SHA256_PATTERN, \"fixture fingerprint\");\n\n const rollback = asObject(manifest.rollback, \"rollback\");\n if (rollback.targetRelease !== null && !isBrandlabSemver(rollback.targetRelease)) {\n fail(\"rollback.targetRelease is invalid\");\n }\n if (!nonEmptyString(rollback.strategy)) fail(\"rollback.strategy is required\");\n}\n\nexport function digestBrandlabAuthority(value: unknown): string {\n return createHash(\"sha256\").update(stableStringify(value)).digest(\"hex\");\n}\n\nfunction validateReleaseVersionAndPackages(\n record: Record<string, unknown>,\n withRegistry = false,\n) {\n if (!isBrandlabSemver(record.releaseVersion)) fail(\"releaseVersion is invalid\");\n const packages = asObject(record.packages, \"packages\");\n if (\n JSON.stringify(Object.keys(packages).sort()) !==\n JSON.stringify([...BRANDLAB_SHARED_PACKAGE_NAMES].sort())\n ) {\n fail(\"packages must contain the four Brandlab packages\");\n }\n for (const name of BRANDLAB_SHARED_PACKAGE_NAMES) {\n const entry = asObject(packages[name], `packages.${name}`);\n if (entry.version !== record.releaseVersion) {\n fail(`${name} must use the lockstep releaseVersion`);\n }\n if (!withRegistry) {\n exactKeys(entry, [\"version\"], `packages.${name}`);\n continue;\n }\n const registry = asObject(entry.registry, `${name}.registry`);\n if (!includes([\"verified\", \"published-unverified\", \"not-published\"], registry.state)) {\n fail(`${name} registry state is invalid`);\n }\n optionalDigest(registry.shasum, SHA1_PATTERN, `${name} shasum`);\n if (\n registry.integrity !== null &&\n (typeof registry.integrity !== \"string\" ||\n !/^sha512-[A-Za-z0-9+/=]+$/.test(registry.integrity))\n ) {\n fail(`${name} integrity is invalid`);\n }\n if (\n registry.state === \"verified\" &&\n registry.shasum === null &&\n registry.integrity === null\n ) {\n fail(`${name} verified registry evidence is empty`);\n }\n }\n}\n\nfunction validateRuntime(value: unknown) {\n const runtime = asObject(value, \"runtime\");\n for (const field of [\n \"next\",\n \"react\",\n \"reactDom\",\n \"node\",\n \"typescript\",\n \"packageManager\",\n ] as const) {\n if (!nonEmptyString(runtime[field])) fail(`runtime.${field} is required`);\n }\n for (const field of [\"next\", \"react\", \"reactDom\", \"typescript\"] as const) {\n if (!isBrandlabSemver(runtime[field])) fail(`runtime.${field} must be exact semver`);\n }\n if (runtime.sharp !== undefined && !isBrandlabSemver(runtime.sharp)) {\n fail(\"runtime.sharp must be exact semver\");\n }\n if (!/^\\d+\\.x$/.test(String(runtime.node))) fail(\"runtime.node is invalid\");\n if (!/^npm@\\d+\\.\\d+\\.\\d+$/.test(String(runtime.packageManager))) {\n fail(\"runtime.packageManager is invalid\");\n }\n if (\n runtime.router !== \"app\" ||\n runtime.bundler !== \"turbopack\" ||\n typeof runtime.cacheComponents !== \"boolean\"\n ) {\n fail(\"runtime architecture is invalid\");\n }\n}\n\nfunction validateContracts(value: unknown) {\n const contracts = asObject(value, \"contracts\");\n for (const field of [\n \"architecture\",\n \"configuration\",\n \"contact\",\n \"seo\",\n \"analytics\",\n ] as const) {\n if (!nonEmptyString(contracts[field])) fail(`contracts.${field} is required`);\n }\n}\n\nfunction parseSemver(value: string) {\n const match = value.match(SEMVER_PATTERN);\n if (!match) throw new Error(`Invalid semver: ${value}`);\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4]?.split(\".\") ?? [],\n };\n}\n\nfunction stableStringify(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableStringify).join(\",\")}]`;\n if (value && typeof value === \"object\") {\n return `{${Object.entries(value)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, child]) => `${JSON.stringify(key)}:${stableStringify(child)}`)\n .join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"null\";\n}\n\nfunction asObject(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n fail(`${label} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction exactKeys(value: Record<string, unknown>, keys: readonly string[], label: string) {\n if (\n JSON.stringify(Object.keys(value).sort()) !== JSON.stringify([...keys].sort())\n ) {\n fail(`${label} contains unsupported fields`);\n }\n}\n\nfunction stringArray(value: unknown, label: string, unique: boolean) {\n if (!Array.isArray(value) || value.some((entry) => !nonEmptyString(entry))) {\n fail(`${label} must be an array of strings`);\n }\n if (unique && new Set(value).size !== value.length) fail(`${label} must be unique`);\n}\n\nfunction optionalDigest(value: unknown, pattern: RegExp, label: string) {\n if (value !== null && (typeof value !== \"string\" || !pattern.test(value))) {\n fail(`${label} is invalid`);\n }\n}\n\nfunction isDate(value: unknown): value is string {\n if (typeof value !== \"string\" || !DATE_PATTERN.test(value)) return false;\n return new Date(`${value}T00:00:00.000Z`).toISOString().startsWith(value);\n}\n\nfunction nonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nfunction includes(values: readonly string[], value: unknown): value is string {\n return typeof value === \"string\" && values.includes(value);\n}\n\nfunction fail(message: string): never {\n throw new Error(`Invalid Brandlab release: ${message}.`);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brandlab-digital/conformance",
3
- "version": "1.0.12",
3
+ "version": "1.1.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/RomieDandan/brandlab.git",