Skip to content

fix: preserve spaces on selector containers - #356

Merged
MoOx merged 1 commit into
postcss:mainfrom
Aschenbath:fix/container-whitespace-172
Nov 8, 2026
Merged

MoOx merged 1 commit into
postcss:mainfrom
Aschenbath:fix/container-whitespace-172

Conversation

@Aschenbath

Copy link
Copy Markdown
Contributor

Fixes #172.

Selector and Root containers currently discard their own spaces when serialized. This loses formatting when constructing nested selectors and can change a .b into a.b when a transform replaces a pseudo with its inner selector and transfers the pseudo's spaces.

Honor the existing rawSpaceBefore and rawSpaceAfter properties around container contents. Child spaces remain additive, raw spaces retain their usual precedence, and root trailing commas stay inside the surrounding spaces. Document these rules and cover construction, empty containers, cloning, nested pseudos, and replacement transforms.

Validation on Node 24.22.0:

  • All 9 new regression tests fail against the unchanged implementation; the 48 existing container tests pass.
  • npm test: all 906 tests pass, including lint, type checking, build, and coverage gates (95.20% lines, 95.57% branches, 97.74% functions). Lint reports two warnings in the unchanged exceptions.mjs.
  • Changed source files pass oxfmt --check; git diff --check passes.
  • An installed npm archive passes six assertions covering the original issue example, synchronous/asynchronous processing, and preserved descendant-selector semantics.

OpenAI Codex assisted with the implementation, tests, and description.

@MoOx
MoOx merged commit 112b494 into postcss:main Nov 8, 2026
4 checks passed
MoOx added a commit to wozhenbang2004/postcss-selector-parser that referenced this pull request Nov 8, 2026
* origin/main:
  feat: support the case-sensitive attribute flag (s) per Selectors Level 4 (postcss#327)
  fix: escape values assigned to an id through the value setter (postcss#326)
  fix: escape class values supplied to the constructor (postcss#349)
  fix: preserve the spaces declared on selector and root containers (postcss#356)
  fix: forward the default options given to the parser factory (postcss#345)
  7.1.8
  fix: remove four more quadratic paths from selector parsing

# Conflicts:
#	src/parser.js
MoOx added a commit to theRizwan/postcss-selector-parser that referenced this pull request Nov 8, 2026
* origin/main:
  fix: preserve selector delimiters after escaped backslashes (postcss#354)
  fix: keep the processor's entry points usable when destructured
  feat: support the case-sensitive attribute flag (s) per Selectors Level 4 (postcss#327)
  fix: escape values assigned to an id through the value setter (postcss#326)
  fix: escape class values supplied to the constructor (postcss#349)
  fix: preserve the spaces declared on selector and root containers (postcss#356)
  fix: forward the default options given to the parser factory (postcss#345)
  7.1.8
  fix: remove four more quadratic paths from selector parsing
  chore(deps): bump tinypool and oxfmt (postcss#351)
  7.1.7
  docs: add CVE-2026-104844 to the 7.1.6 changelog entry
  fix: keep whitespace around the namespace separator in attribute selectors (postcss#339)
  fix: invalidate stale raw spelling on combinator value assignment (postcss#342)
  fix: set parents for all variadic inserted nodes (postcss#343)
  Consume whitespace after hexadecimal CSS escapes (postcss#340)
  fix: lossless mode drops whitespace when a selector ends empty (postcss#337)
  chore(deps-dev): bump source-map-js from 1.2.1 to 1.2.2 (postcss#347)
  7.1.6
  fix: parse flat selectors in linear time, closing a CPU exhaustion vulnerability

# Conflicts:
#	src/parser.js
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spaces on selectors (or containers in general) don't work

2 participants