Skip to content

Commit 01b4d52

Browse files
committed
fix: gate website validation for clean checkouts
1 parent dfaeac2 commit 01b4d52

5 files changed

Lines changed: 89 additions & 6 deletions

‎package.json‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,9 @@
275275
"scripts/test-r10-control-plane-honesty.js",
276276
"scripts/test-process-enforcement-e2e.js",
277277
"scripts/test-docs-surface-inventory.js",
278+
"scripts/run-website-build-if-present.js",
279+
"scripts/check-generated-site-links-if-present.js",
280+
"scripts/check-generated-site-links.js",
278281
"scripts/test-delivery-honesty.js",
279282
"scripts/test-ecr-closure.js",
280283
"scripts/lib/docs-surface-inventory.js",
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!/usr/bin/env node
2+
'use strict'
3+
4+
const fs = require('fs')
5+
const path = require('path')
6+
const { scanGeneratedSite } = require('./check-generated-site-links')
7+
8+
const ROOT = path.resolve(__dirname, '..')
9+
10+
function main(options = {}) {
11+
const root = options.root ? path.resolve(options.root) : ROOT
12+
const websitePackage = path.join(root, 'website', 'package.json')
13+
if (!fs.existsSync(websitePackage)) {
14+
console.log('Generated site link check skipped: website/package.json not present')
15+
return 0
16+
}
17+
18+
try {
19+
const result = scanGeneratedSite({ rootDir: path.join(root, 'website', 'dist') })
20+
console.log(`Generated site links: html=${result.htmlCount} missing=${result.missing.length} uniqueTargets=${result.uniqueTargets.length}`)
21+
for (const item of result.missing) {
22+
console.error(`MISSING ${item.source} -> ${item.href} (${item.target})`)
23+
}
24+
return result.missing.length > 0 ? 2 : 0
25+
} catch (error) {
26+
console.error(error.message)
27+
return 1
28+
}
29+
}
30+
31+
if (require.main === module) process.exitCode = main()
32+
33+
module.exports = { main }
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/env node
2+
'use strict'
3+
4+
const fs = require('fs')
5+
const path = require('path')
6+
const { CheckedCommandError, runChecked } = require('./lib/checked-command')
7+
8+
const ROOT = path.resolve(__dirname, '..')
9+
10+
function main(options = {}) {
11+
const root = options.root ? path.resolve(options.root) : ROOT
12+
const websitePackage = path.join(root, 'website', 'package.json')
13+
if (!fs.existsSync(websitePackage)) {
14+
console.log('Website build skipped: website/package.json not present')
15+
return 0
16+
}
17+
18+
try {
19+
const evidence = runChecked('npm', ['--prefix', 'website', 'run', 'build'], {
20+
cwd: root,
21+
timeoutMs: 240000,
22+
summaryLimit: 12000
23+
})
24+
if (evidence.stdout) process.stdout.write(evidence.stdout)
25+
if (evidence.stderr) process.stderr.write(evidence.stderr)
26+
return 0
27+
} catch (error) {
28+
if (error instanceof CheckedCommandError) {
29+
if (error.evidence.stdout) process.stdout.write(error.evidence.stdout)
30+
if (error.evidence.stderr) process.stderr.write(error.evidence.stderr)
31+
console.error(error.message)
32+
return error.evidence.exitCode || 1
33+
}
34+
console.error(error.message)
35+
return 1
36+
}
37+
}
38+
39+
if (require.main === module) process.exitCode = main()
40+
41+
module.exports = { main }

‎scripts/test-generated-site-links.js‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ const fs = require('fs')
77
const os = require('os')
88
const path = require('path')
99
const { scanGeneratedSite } = require('./check-generated-site-links')
10+
const { main: checkGeneratedSiteLinksIfPresent } = require('./check-generated-site-links-if-present')
11+
const { main: runWebsiteBuildIfPresent } = require('./run-website-build-if-present')
1012

1113
const rootDir = fs.mkdtempSync(path.join(os.tmpdir(), 'devcodex-generated-links-'))
14+
const cleanRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'devcodex-generated-links-clean-'))
1215

1316
try {
1417
fs.mkdirSync(path.join(rootDir, 'guide'), { recursive: true })
@@ -30,7 +33,11 @@ try {
3033
assert.strictEqual(broken.missing[0].target, 'missing')
3134
assert.deepStrictEqual(broken.uniqueTargets, ['missing'])
3235

36+
assert.strictEqual(runWebsiteBuildIfPresent({ root: cleanRoot }), 0)
37+
assert.strictEqual(checkGeneratedSiteLinksIfPresent({ root: cleanRoot }), 0)
38+
3339
console.log('Generated site link checker tests passed')
3440
} finally {
3541
fs.rmSync(rootDir, { recursive: true, force: true })
42+
fs.rmSync(cleanRoot, { recursive: true, force: true })
3643
}

‎scripts/validation-manifest.json‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4285,12 +4285,9 @@
42854285
"schemaVersion": "ValidationNodeV1",
42864286
"id": "website-build",
42874287
"owner": "website-build",
4288-
"command": "npm",
4288+
"command": "node",
42894289
"args": [
4290-
"--prefix",
4291-
"website",
4292-
"run",
4293-
"build"
4290+
"scripts/run-website-build-if-present.js"
42944291
],
42954292
"dependencies": [
42964293
"generated-site-precheck",
@@ -4300,6 +4297,7 @@
43004297
"website/**",
43014298
"README.md",
43024299
"scripts/test-generated-site-links.js",
4300+
"scripts/run-website-build-if-present.js",
43034301
"scripts/check-generated-site-links.js"
43044302
],
43054303
"consumers": [
@@ -4331,7 +4329,7 @@
43314329
"owner": "website-validation",
43324330
"command": "node",
43334331
"args": [
4334-
"scripts/check-generated-site-links.js"
4332+
"scripts/check-generated-site-links-if-present.js"
43354333
],
43364334
"dependencies": [
43374335
"generated-site-precheck",
@@ -4340,6 +4338,7 @@
43404338
"inputs": [
43414339
"website/**",
43424340
"README.md",
4341+
"scripts/check-generated-site-links-if-present.js",
43434342
"scripts/check-generated-site-links.js"
43444343
],
43454344
"consumers": [],

0 commit comments

Comments
 (0)