Skip to content

Commit 08cac11

Browse files
committed
Support media query or
1 parent 6f29a20 commit 08cac11

File tree

1 file changed

+37
-3
lines changed

1 file changed

+37
-3
lines changed

src/media-query.test.ts

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,13 +212,15 @@ type ParsedMediaInParens = ParsedMediaFeature;
212212
class ParsedMediaCondition {
213213
constructor(
214214
public readonly first: ParsedMediaFeature,
215-
public readonly conditions?: ParsedMediaAnds
215+
public readonly conditions?: ParsedMediaAnds | ParsedMediaOrs
216216
) {}
217217

218218
matches(context: MatchMediaContext) {
219219
const base = this.first.matches(context);
220-
if (this.conditions) {
220+
if (this.conditions instanceof ParsedMediaAnds) {
221221
return base && this.conditions.matches(context);
222+
} else if (this.conditions instanceof ParsedMediaOrs) {
223+
return base || this.conditions.matches(context);
222224
} else {
223225
return base;
224226
}
@@ -227,7 +229,11 @@ class ParsedMediaCondition {
227229
static *Parser() {
228230
yield optionalWhitespace;
229231
const first: ParsedMediaInParens = yield parsedMediaInParens;
230-
const conditions: ParsedMediaAnds | '' = yield [ParsedMediaAnds.Parser, ''];
232+
const conditions: ParsedMediaAnds | ParsedMediaOrs | '' = yield [
233+
ParsedMediaAnds.Parser,
234+
ParsedMediaOrs.Parser,
235+
'',
236+
];
231237
if (conditions === '') {
232238
return first;
233239
} else {
@@ -257,6 +263,27 @@ class ParsedMediaAnds {
257263
}
258264
}
259265

266+
class ParsedMediaOrs {
267+
constructor(public readonly list: ReadonlyArray<ParsedMediaInParens>) {}
268+
269+
matches(context: MatchMediaContext) {
270+
return this.list.some((m) => m.matches(context));
271+
}
272+
273+
static *Parser() {
274+
const list: Array<ParsedMediaInParens> = [];
275+
276+
do {
277+
yield requiredWhitespace;
278+
yield 'or';
279+
yield requiredWhitespace;
280+
list.push(yield parsedMediaInParens);
281+
} while (yield hasMore);
282+
283+
return new ParsedMediaOrs(list);
284+
}
285+
}
286+
260287
class ParsedMediaTypeThenConditionWithoutOr {
261288
constructor(
262289
public readonly mediaType: ParsedMediaType | ParsedNotMediaType,
@@ -624,4 +651,11 @@ test('matchMedia()', () => {
624651
'not print and (min-width: 480px) and (orientation: landscape) and (any-hover: hover)'
625652
).matches
626653
).toBe(true);
654+
655+
expect(
656+
matchMedia(
657+
screenSized(480, 100),
658+
'(orientation: landscape) or (orientation: portrait)'
659+
).matches
660+
).toBe(true);
627661
});

0 commit comments

Comments
 (0)