Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

`.a, .b::wat { color: red }` styles `.a`, where a browser drops the whole rule for its unknown pseudo-element

Ouverte
#521 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 3 jours

Personne n'a encore pris cette issue.

Évaluation

Difficulté
3/5
Temps estimé
1-2 jours
Accessibilité débutants
72/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
javascript, react-native, typescript
Domaine
frontend, testing

Piste de recherche

Start with src/compiler/selectors.ts, especially getSelectors and classNameSelector, to trace how selector lists handle custom pseudo-elements and pseudo-classes. Run the reproducer in src/__tests__/native/unknown-pseudo-selector-list.test.tsx; done means the two unknown-pseudo cases leave .a unstyled and produce a warning naming the unreadable selector, while .b::before still styles .a.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Before submitting a new issue
  • I tested using the latest version of the library, as the bug might be already fixed.
  • I tested using a supported version of react native.
  • I checked for possible duplicate issues, with possible answers.
Bug summary

.a, .b::wat { color: red } makes .a red on native, and so does .a, .b:wat. In a browser neither rule applies anywhere: a pseudo-element or pseudo-class the browser does not know makes its selector invalid, and a selector list holding an invalid selector is invalid as a whole (Selectors 4 §3.7). Chromium 156, Firefox 157 and WebKit 27.2 leave .a unstyled for both, and style it for .a, .b::before, whose pseudo-element they know. compile().warnings() reports nothing.

The first two cases fail, .a receiving {"color":"#f00"}; .b::before passes.

getSelectors (src/compiler/selectors.ts) converts each selector of a rule's list on its own and skips one that classNameSelector returns null for, as it does for every pseudo-element and for every pseudo-class outside hover, active, focus, disabled and empty, so the rule keeps the list's other selectors. That is right for a name the browser knows, and wrong for one lightningcss parses as a custom pseudo-element or pseudo-class, whose list a browser drops whole.

Library version

main at 2421ea7 (0.0.0-nightly.2421ea7)

Environment info
System:
  OS: Windows 11 10.0.26300
  CPU: "(32) x64 AMD Ryzen 9 9950X3D 16-Core Processor          "
  Memory: 155.26 GB / 255.67 GB
Binaries:
  Node:
    version: 26.12.1
    path: C:\Program Files\nodejs\node.EXE
  Yarn:
    version: 4.9.2
    path: C:\Users\<user>\AppData\Roaming\npm\yarn.CMD
  npm:
    version: 12.2.1
    path: C:\Program Files\nodejs\npm.CMD
  Watchman: Not Found
SDKs:
  Android SDK:
    API Levels:
      - "33"
      - "35"
      - "35"
      - "35"
      - "36"
      - "37"
    Build Tools:
      - 35.0.0
      - 36.0.0
      - 36.1.0
      - 37.0.0
    System Images:
      - android-26 | Google APIs Intel x86_64 Atom
      - android-28 | Google APIs Intel x86_64 Atom
      - android-29 | Google APIs Intel x86_64 Atom
      - android-30 | Google APIs Intel x86_64 Atom
      - android-31 | Google APIs Intel x86_64 Atom
      - android-32 | Google APIs Intel x86_64 Atom
      - android-33 | Google APIs Intel x86_64 Atom
      - android-34 | Google APIs Intel x86_64 Atom
      - android-35 | Google APIs Intel x86_64 Atom
      - android-36.1 | Google Play Intel x86_64 Atom
      - android-36.1 | Pre-Release 16 KB Page Size Google Play Intel x86_64 Atom
      - android-37.0 | Google APIs Intel x86_64 Atom
    Android NDK: Not Found
  Windows SDK: Not Found
IDEs:
  Android Studio: AI-262.9437.185.2621.16467767
  Visual Studio: Not Found
Languages:
  Java:
    version: 17.0.20.1
    path: C:\Program Files\Microsoft\jdk-17.0.20.101-hotspot\bin\javac.EXE
  Ruby: Not Found
npmPackages:
  "@react-native-community/cli": Not Found
  react:
    installed: 19.2.3
    wanted: 19.2.3
  react-native:
    installed: 0.86.3
    wanted: 0.86.3
  react-native-windows: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: Not found
  newArchEnabled: Not found
iOS:
  hermesEnabled: Not found
  newArchEnabled: Not found
Steps to reproduce
  1. Clone the reproducer branch, which is main at 2421ea7 with one file added, src/__tests__/native/unknown-pseudo-selector-list.test.tsx, and install:
    git clone --branch repro/521-unknown-pseudo-selector-list https://github.com/YevheniiKotyrlo/react-native-css
    cd react-native-css
    yarn install
    
  2. Run yarn jest src/__tests__/native/unknown-pseudo-selector-list.test.tsx.

src/__tests__/native/unknown-pseudo-selector-list.test.tsx:

import { render, screen } from "@testing-library/react-native";
import { compile } from "react-native-css/compiler";
import { Text } from "react-native-css/components/Text";
import { registerCSS, testID } from "react-native-css/jest";

// Whether `.a` is red in Chromium 156, Firefox 157 and WebKit 27.2: browser-readings.json beside this file
const cases = [
  { selector: ".a, .b::wat", browsersStyleA: false },
  { selector: ".a, .b:wat", browsersStyleA: false },
  { selector: ".a, .b::before", browsersStyleA: true },
];

test.each(cases)(
  "$selector { color: red } styles .a as the browsers do: $browsersStyleA",
  ({ selector, browsersStyleA }) => {
    const css = `${selector} { color: red; }`;
    const compiled = compile(css);
    console.log(
      JSON.stringify({
        selector,
        rules: compiled.stylesheet().s?.map(([name]) => name),
        warnings: compiled.warnings(),
      }),
    );

    registerCSS(css);
    render(<Text testID={testID} className="a" />);

    const { style } = screen.getByTestId(testID).props;
    console.log(JSON.stringify({ selector, style }));

    expect(style !== undefined).toBe(browsersStyleA);
  },
);

Expected: neither .a, .b::wat nor .a, .b:wat styles .a, as in a browser, and a warning names the selector it could not read.

Actual: both style .a, and compile().warnings() reports nothing.

The run's output on main at 2421ea7, Windows 11, Node 26.12.1
  console.log
    {"selector":".a, .b::wat","rules":["a"],"warnings":{}}
      at log (src/__tests__/native/unknown-pseudo-selector-list.test.tsx:18:13)
  console.log
    {"selector":".a, .b::wat","style":{"color":"#f00"}}
      at log (src/__tests__/native/unknown-pseudo-selector-list.test.tsx:30:13)
  console.log
    {"selector":".a, .b:wat","rules":["a"],"warnings":{}}
      at log (src/__tests__/native/unknown-pseudo-selector-list.test.tsx:18:13)
  console.log
    {"selector":".a, .b:wat","style":{"color":"#f00"}}
      at log (src/__tests__/native/unknown-pseudo-selector-list.test.tsx:30:13)
  console.log
    {"selector":".a, .b::before","rules":["a"],"warnings":{}}
      at log (src/__tests__/native/unknown-pseudo-selector-list.test.tsx:18:13)
  console.log
    {"selector":".a, .b::before","style":{"color":"#f00"}}
      at log (src/__tests__/native/unknown-pseudo-selector-list.test.tsx:30:13)
FAIL src/__tests__/native/unknown-pseudo-selector-list.test.tsx
  × .a, .b::wat { color: red } styles .a as the browsers do: false (33 ms)
  × .a, .b:wat { color: red } styles .a as the browsers do: false (6 ms)
  √ .a, .b::before { color: red } styles .a as the browsers do: true (2 ms)
  ● .a, .b::wat { color: red } styles .a as the browsers do: false
    expect(received).toBe(expected) // Object.is equality
    Expected: false
    Received: true
      30 |     console.log(JSON.stringify({ selector, style }));
      31 |
    > 32 |     expect(style !== undefined).toBe(browsersStyleA);
         |                                 ^
      33 |   },
      34 | );
      35 |
      at toBe (src/__tests__/native/unknown-pseudo-selector-list.test.tsx:32:33)
  ● .a, .b:wat { color: red } styles .a as the browsers do: false
    expect(received).toBe(expected) // Object.is equality
    Expected: false
    Received: true
      30 |     console.log(JSON.stringify({ selector, style }));
      31 |
    > 32 |     expect(style !== undefined).toBe(browsersStyleA);
         |                                 ^
      33 |   },
      34 | );
      35 |
      at toBe (src/__tests__/native/unknown-pseudo-selector-list.test.tsx:32:33)
Test Suites: 1 failed, 1 total
Tests:       2 failed, 1 passed, 3 total
Snapshots:   0 total
Time:        1.165 s, estimated 2 s
Ran all test suites matching /src\\__tests__\\native\\unknown-pseudo-selector-list.test.tsx/i.
Reproducible example repository

https://github.com/YevheniiKotyrlo/react-native-css/tree/repro/521-unknown-pseudo-selector-list

Langage dominant
TypeScript
Étoiles
166
Forks
45
Merge moyen
13 j 14 h
PR mergées (30 j)
1

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de nativewind/react-native-css

Toutes les issues de nativewind/react-native-css

Issues similaires

Plus d'issues TypeScript

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.