
Security News
TypeScript is Porting Its Compiler to Go for 10x Faster Builds
TypeScript is porting its compiler to Go, delivering 10x faster builds, lower memory usage, and improved editor performance for a smoother developer experience.
mock-match-media
Advanced tools
Simple server-side compatible substitution for window.matchMedia()
based on css-mediaquery.
mock-match-media
?mock-match-media
is a ponyfill for window.matchMedia
but for Node.
This mock is fully compliant with the spec (see doc on MDN or Other features).
We currently support Node v12, v14, v16, v18 and v19.
It's also coded in TypeScript.
const { matchMedia, setMedia } = require("mock-match-media");
// Define current media
setMedia({
width: "50px",
type: "screen",
orientation: "landscape",
"prefers-color-scheme": "light",
});
matchMedia("(min-width: 250px)").matches;
// > false
matchMedia("(min-width: 40px)").matches;
// > true
// Only redefine what changed
setMedia({
width: "500px",
});
matchMedia("(min-width: 250px)").matches;
// > true
mock-match-media
also supports even listeners:
const { matchMedia, setMedia } = require("mock-match-media");
setMedia({
width: "50px",
});
const listener = (event) => console.log(event.matches);
const matcher = matchMedia("(min-width: 250px)");
matcher.addEventListener("change", listener);
// And also the deprecated version
// matchMedia("(min-width: 250px)").addListener(event => console.log(event.matches));
setMedia({
width: "100px",
});
// outputs nothing because `matches` hasn't changed
setMedia({
width: "1000px",
});
// outputs `true`
matcher.removeEventListener("change", listener);
setMedia({
width: "100px",
});
// outputs nothing because the listener is removed
mock-match-media
provides 3 cleanup functions:
const { cleanupListeners, cleanupMedia, cleanup } = require("mock-match-media");
cleanupListeners
cleanupListeners
clears all listeners called via matchMedia().addListener()
or matchMedia().addEventListener()
(to avoid calling in side effects).
cleanupMedia
cleanupMedia
resets the state of the window set via setMedia()
.
cleanup
cleanup
at the same time clears all listeners (like cleanupListeners
), and clears the state of the window (like cleanupMedia
).
If you don't want to change your code or to setup mocks with your testing library, you can do:
require("mock-match-media/polyfill");
And then global variables matchMedia
and MediaQueryListEvent
will be set.
And thus, you won't have to import those (you'll still have to import setMedia
, and the cleanup
functions).
This library covers most of the aspects of matchMedia
. In addition to the API presented above, it also supports:
once
event listenersconst { matchMedia } = require("mock-match-media");
const mql = matchMedia("(min-width: 250px)");
mql.addEventListener("change", listener, { once: true }); // the listener will be removed after 1 received event
.dispatchEvent
& MediaQueryListEvent
Like every other EventTarget, you can .dispatchEvent(event)
to manually dispatch event (it’s not that useful to be honest, but as it’s in the spec, we implemented it).
const { matchMedia, MediaQueryListEvent } = require("mock-match-media");
const mql = matchMedia("(min-width: 250px)");
mql.dispatchEvent(new MediaQueryListEvent("change", { matches: false, media: "(custom-non-valid)" }));
// Works also with a regular event but it’s not recommended:
mql.dispatchEvent(new Event("change"));
.onchange
Like on any HTML element, you can attach a .onchange
legacy event handler:
const { matchMedia } = require("mock-match-media");
const mql = matchMedia("(min-width: 250px)");
mql.onchange = listener;
We follow how browsers implemented interactions like:
const { matchMedia } = require("mock-match-media");
const mql = matchMedia("(min-width: 250px)");
mql.onchange = listener;
mql.addListener(listener);
mql.addEventListener("change", listener);
mql.addEventListener("change", listener, { once: true });
And all of those are tested.
We also ship 2 versions of this library:
This is also true for the polyfills, but the setup-jest
file is only available in CJS (Jest doesn't work that well with ESM).
In jest.setup.js
, you only need to import mock-match-media/jest-setup
(or mock-match-media/jest-setup.cjs
depending on your config). It'll:
matchMedia
and MediaQueryListEvent
)cleanup
in afterAll
to auto-cleanup your env in after each test
/it
.You can set import jest-setup
in setupFiles
or in setupFilesAfterEnv
in your jest config.
And then you can use setMedia
in your tests.
You can find an example here that includes Jest, react testing library and react-scripts.
You can find an example here for how to use mock-match-media
with NextJS.
FAQs
mock window.matchMedia for tests or node
The npm package mock-match-media receives a total of 26,519 weekly downloads. As such, mock-match-media popularity was classified as popular.
We found that mock-match-media demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
TypeScript is porting its compiler to Go, delivering 10x faster builds, lower memory usage, and improved editor performance for a smoother developer experience.
Research
Security News
The Socket Research Team has discovered six new malicious npm packages linked to North Korea’s Lazarus Group, designed to steal credentials and deploy backdoors.
Security News
Socket CEO Feross Aboukhadijeh discusses the open web, open source security, and how Socket tackles software supply chain attacks on The Pair Program podcast.