Skip to content

Commit 35476d7

Browse files
Kikobeatsclaude
andcommitted
fix(scripts): validate every browser entry and write the data atomically
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent ae63eb5 commit 35476d7

1 file changed

Lines changed: 17 additions & 3 deletions

File tree

‎scripts/update-headers-order.js‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict'
22

3-
const { writeFile } = require('fs/promises')
3+
const { writeFile, rename, rm } = require('fs/promises')
44
const path = require('path')
55

66
const SOURCE_URL =
@@ -16,7 +16,10 @@ const isHeaderList = value =>
1616
value.every(header => typeof header === 'string')
1717

1818
const assertHeadersOrder = headersOrder => {
19-
const invalid = REQUIRED_BROWSERS.filter(
19+
const browsers = [
20+
...new Set([...REQUIRED_BROWSERS, ...Object.keys(headersOrder ?? {})])
21+
]
22+
const invalid = browsers.filter(
2023
browser => !isHeaderList(headersOrder?.[browser])
2124
)
2225
if (invalid.length > 0) {
@@ -25,11 +28,22 @@ const assertHeadersOrder = headersOrder => {
2528
return headersOrder
2629
}
2730

31+
const writeAtomically = async (destination, content) => {
32+
const temporary = `${destination}.${process.pid}.tmp`
33+
try {
34+
await writeFile(temporary, content)
35+
await rename(temporary, destination)
36+
} catch (error) {
37+
await rm(temporary, { force: true })
38+
throw error
39+
}
40+
}
41+
2842
const main = async () => {
2943
const response = await fetch(SOURCE_URL)
3044
if (!response.ok) throw new Error(`HTTP ${response.status} for ${SOURCE_URL}`)
3145
const headersOrder = assertHeadersOrder(await response.json())
32-
await writeFile(DESTINATION, JSON.stringify(headersOrder, null, 2))
46+
await writeAtomically(DESTINATION, JSON.stringify(headersOrder, null, 2))
3347
}
3448

3549
main().catch(error => {

0 commit comments

Comments
 (0)