fix(build): correct writeFileSync usage; harden is-client env check; cleanup map→forEach #7708
+21
−15
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
PR description
This PR delivers a focused set of safe improvements that keep existing behavior intact while addressing a real bug and two quality issues:
fs.writeFileSyncwas called with a callback, which is invalid for the synchronous API and throws a TypeError. This breaksnpm run contentand any CI job invoking the script.process.exitCode = 1.windowat module scope can throwReferenceErrorin non‑browser environments (SSR/SSG, tests, or tooling). The file also used CJS export while the rest of the codebase predominantly uses ESM imports.typeof window !== 'undefined' && typeof window.document !== 'undefined'and export a default ESM value. All existing imports already useimport isClient from ..., so this is backward‑compatible.Array.mapwas used purely for side effects (the returned array was ignored) inflatten-content-tree.mjs.mapwithforEachand add a small defensiveArray.isArraycheck. This improves readability and avoids lint noise without changing behavior.Rationale and impact
Testing and verification
node src/scripts/build-content-tree.mjs ./src/content ./src/_content.jsonwill now succeed (assuming deps installed) and log success; failures set a non‑zero exit code.isClientremainstruein browsers andfalseelsewhere. Components importing it (Site,Splash,index.jsx) continue to work unchanged.Backward compatibility
is-clientmatches current import sites; there are norequire()callers in the repository.