Skip to content

fix(cli): create no-clobber output files atomically - #4135

Merged
UziTech merged 1 commit into
markedjs:masterfrom
xiehuanyi:fix/atomic-no-clobber-output
Oct 26, 2026
Merged

UziTech merged 1 commit into
markedjs:masterfrom
xiehuanyi:fix/atomic-no-clobber-output

Conversation

@xiehuanyi

Copy link
Copy Markdown
Contributor

--no-clobber currently checks the output with access() before calling writeFile(). A dangling output symlink fails that check, so the CLI follows it and creates its target instead of rejecting the existing path. A file created by another writer between those calls can also be overwritten.

Use the exclusive wx file flag for no-clobber output and preserve the existing diagnostic for EEXIST. Normal output retains its overwrite behavior. The regression uses a real dangling symlink and checks that its target remains absent; other tests cover existing files, new files, and default overwriting. The symlink test is skipped on Windows, where creating one requires additional privileges.

Validation: the symlink regression fails before the fix. npm test and git diff --check pass, including the complete spec suite, unit tests, UMD/CJS, type/export checks, docs build and ESLint.

Prepared and tested with OpenAI Codex assistance.

Copilot AI balanced review requested due to automatic review settings October 12, 2026 19:01

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@vercel

vercel Bot commented Oct 12, 2026

Copy link
Copy Markdown

@xiehuanyi is attempting to deploy a commit to the MarkedJS Team on Vercel.

A member of the Team first needs to authorize it.

@vercel

vercel Bot commented Oct 17, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
marked-website Ready Ready Preview Oct 17, 2026 3:22pm UTC

Request Review

@UziTech UziTech left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! 💯

@UziTech
UziTech merged commit e7c4f64 into markedjs:master Oct 26, 2026
8 checks passed
github-actions Bot pushed a commit that referenced this pull request Oct 26, 2026
## [18.1.2](v18.1.1...v18.1.2) (2026-10-26)

### Bug Fixes

* allow a tab or end of input after a type 6 html block tag name ([#4128](#4128)) ([e09c40d](e09c40d))
* apply emphasis flanking and rules 9-10 to the whole delimiter run ([#4145](#4145)) ([5d8e234](5d8e234))
* **cli:** await config functions before parsing ([#4138](#4138)) ([3a11ad1](3a11ad1))
* **cli:** create no-clobber output files atomically ([#4135](#4135)) ([e7c4f64](e7c4f64))
* do not continue a block quote paragraph from a whitespace-only line ([#4134](#4134)) ([42f34a8](42f34a8))
* expand a tab after the block quote marker to the next tab stop ([#4110](#4110)) ([2d3899b](2d3899b))
* honor per-call async options when composing hooks ([#4139](#4139)) ([379be9d](379be9d))
* keep a line starting with # but no space in the list item ([#4127](#4127)) ([6b63189](6b63189))
* keep duplicate link definitions in the tokens ([#4132](#4132)) ([2784acc](2784acc))
* keep lazy lines after a list in a nested blockquote ([#4137](#4137)) ([38c7e55](38c7e55))
* keep lazy setext underlines in list items as text ([#4126](#4126)) ([398234c](398234c))
* render nested image alt formatting as plain text ([#4131](#4131)) ([15f59bb](15f59bb))
* stop an unclosed inline raw tag from unescaping later blocks ([#4130](#4130)) ([4562b6f](4562b6f))

### Performance Improvements

* ~16% faster parsing by skipping em/strong masking for runs without *, _ or ~ ([#4142](#4142)) ([f0fd3e0](f0fd3e0))

This branch was successfully deployed

1 active deployment
Preview — 2aaf2b2d Deployed Oct 17, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

3 participants