
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
es-feature-detection
Advanced tools
ECMAScript feature and API detection in the browser.
It detects which syntax features and built-in components are supported in the current browser.
npm i es-feature-detection
The different tests are divided into several sections:
You can either run all tests for a specific section by addressing its index.js file.
When called will it return an object where each key is a specific feature,
and its value a boolean indicating if the feature is supported or not (eg. Intl.Collator: true).
import localization from 'es-feature-detection/localization';
const supportedIntlFeatures = localization();
Or you can access specific tests individually for fine grained testing:
import mathLog2 from 'es-feature-detection/builtins/Math.log2';
const mathLog2IsSupported = mathLog2();
For convenience a allOk function is added in the utils folder, which can be
handy if you want to check if all values in an object is true:
import localization from 'es-feature-detection/localization';
import allOk from 'es-feature-detection/utils/allOk';
const fullIntlSupport = allOk(localization());
If not every property is supported an array of unsupported fields is returned instead of true:
if (fullIntlSupport !== true) {
console.log('Unsupported features:')
fullIntlSupport.forEach((key) => console.log(key));
}
If you have a specific feature you want to test, you can use the testExpression function,
placed in the utils folder, to validate a specific string (it is the one used for all tests in this module):
import testExpression from 'es-feature-detection/utils/testExpression';
// Ok this is a lame example, but it illustrates how to use it
const myFeatureIsSupported = testExpression('return MyFeature.someThingToTest()');
The expression you pass in must be passed as a string and it can either return true/false or it can fail or not. Both cases the test will return true or false
If you need to test the features introduced in a given EchmaScript version a file for each version has been placed at the root of the module:
import es2020 from 'es-feature-detection/es2020';
import allOk from 'es-feature-detection/utils/allOk';
const fullES2020Support = allOk(es2020());
These esXX files includes both builtins and syntax features introduces in the given version.
The idea behind this module is to facilitate the detection of what a given browser support of JS features. Does it support the ES6 syntax and what kind of polyfills would the browser need?
The norm is and have been for quite a while to just transpile your ES6 into ES5 and then just fill you script with the polyfills you need and you are good to go. This works pretty well and you don't have to worry about cross browser support of your code. But there are several drawbacks by doing so:
Personally I needed a proper tool to detect features that was actually used in the script file, so I could decide what to load, so I build this.
babel-env is really great tool and should definitely be the first choice. Sometimes,
though, you might have some modules (mostly 3rd party) you don't want to run through
the transpiler, but might use some built-in methods that are not necessarily
supported by all browsers. In this case there are some polyfills that are not detected
and added at compile-time.
So having the builtins (or dom) detection which can detect which polyfills you need
to load can be a good backup.
The syntax is useful for when you want to have two separate builds: One for newer
browsers that understand the new goodies. And one that use plain old ES 5.
Have any ideas, improvement request or bugs you have found, don't hesitate to file an issue in the issue list or throw me a PR if you have done some improvements you want to bring to the script.
FAQs
ECMAScript feature and API detection
We found that es-feature-detection 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
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.