0.2.3 • Public • Published

Compatibility Reporter

Generate a report on the Web Platform features that your website uses, and the browser support of each feature, using data from Can I Use.

Compatibility Reporter crawls through your CSS, JavaScript and HTML and builds up an Abstract Syntax Tree (AST) for each file. It then searches through the relevant parts of each file (such as declaration property names and values in CSS, identifier names in JavaScript, and element and attribute names in HTML), to identify which features are in use. It then extracts support data for each of these features from the Can I Use database for each browser you requested.


The report method accepts one object as a parameter. It will look for the following properties on this object:

Property Required Description
files Required Array of Glob patterns or file paths for the files or directories you want to process.
browsers Required Array of browsers that you would like to be included in the report. For example ['chrome 52', 'ie 11'] will return results for Chrome 52 and IE 11. This array can be generated with Browserslist, for example browserslist('last 1 version, > 10%'); will return results for all browser versions that are the last version of each major browser, or have a usage of over 10% in global usage statistics.
ignore Optional Array of Glob patterns to exclude matches. For example, ['**/node_modules/**', '**/*.min.js'].
output Optional File path where the HTML report should be exported.
fileFilters Optional Object with css, javascript and html properties, as defined below.
fileFilters.css Optional Array of Minimatch patterns to define which files should be parsed as CSS. Defaults to ['*.css'].
fileFilters.javascript Optional Array of Minimatch patterns to define which files should be parsed as JavaScript. Defaults to ['*.js'].
fileFilters.html Optional Array of Minimatch patterns to define which files should be parsed as HTML. Defaults to ['*.html', '*.htm', '*.shtml', '*.erb'].

Example usage

var compatibilityReporter = require('compatibility-reporter');{
  files: ['spec/fixtures/**/*'],
  browsers: ['chrome 51', 'firefox 47', 'safari 9.1', 'edge 13', 'ie 11', 'ie 10'],
  output: 'compatibility-report.html'
}).then(function(result) {

This would generate a file called compatibility-report.html:

Screenshot of compatibility-report.html

And it would log the following to the console:

  "addeventlistener": {
    "title": "EventTarget.addEventListener()",
    "occurances": [{
      "file": "spec/fixtures/addeventlistener.js",
      "line": 13,
      "column": 3
    "stats": {
      "chrome": { "51": "y" },
      "firefox": { "47": "y" },
      "safari": { "9.1": "y" },
      "edge": { "13": "y" },
      "ie": { "10": "y", "11": "y" }
  "arrow-functions": {
    "title": "Arrow functions",
    "occurances": [{
      "file": "spec/fixtures/arrow-functions.js",
      "line": 3,
      "column": 8
    }, {
      "file": "spec/fixtures/arrow-functions.js",
      "line": 5,
      "column": 8
    }, {
      "file": "spec/fixtures/arrow-functions.js",
      "line": 6,
      "column": 9
    "stats": {
      "chrome": { "51": "y" },
      "firefox": { "47": "y" },
      "safari": { "9.1": "n" },
      "edge": { "13": "y" },
      "ie": { "10": "n", "11": "n" }

Each browser version receives a string ID indicating the level of support for this feature:

ID Description
y (Y)es, supported by default
a (A)lmost supported (aka Partial support)
n (N)o support, or disabled by default
p No support, but has (P)olyfill
u Support (u)nknown
x Requires prefi(x) to work
d (D)isabled by default (need to enable flag or something)
#n Where n is a number, starting with 1, corresponds to the notes on the page for this feature. For example: "42":"y #1" means version 42 is supported by default and see note 1.

Support for features

So far Compatibility Reporter checks for the following features:

  • contenteditable (contenteditable attribute (basic support))
  • webworkers (Web Workers)
  • border-image (CSS3 Border images)
  • background-img-opts (CSS3 Background-image options)
  • beacon (Beacon API)
  • css3-boxsizing (CSS3 Box-sizing)
  • transforms2d (CSS3 2D Transforms)
  • devicepixelratio (Window.devicePixelRatio)
  • transforms3d (CSS3 3D Transforms)
  • css-transitions (CSS3 Transitions)
  • css-animation (CSS Animation)
  • css-gradients (CSS Gradients)
  • svg (SVG (basic support))
  • canvas (Canvas (basic support))
  • x-doc-messaging (Cross-document messaging)
  • flexbox (Flexible Box Layout Module)
  • websockets (Web Sockets)
  • hidden (hidden attribute)
  • calc (calc() as CSS unit value)
  • history (Session history management)
  • wordwrap (CSS3 Overflow-wrap)
  • xhr2 (XMLHttpRequest advanced features)
  • notifications (Web Notifications)
  • deviceorientation (DeviceOrientation & DeviceMotion events)
  • matchmedia (matchMedia)
  • word-break (CSS3 word-break)
  • viewport-units (Viewport units: vw, vh, vmin, vmax)
  • channel-messaging (Channel messaging)
  • mutationobserver (Mutation Observer)
  • promises (Promises)
  • serviceworkers (Service Workers)
  • srcset (Srcset attribute)
  • will-change (CSS will-change property)
  • picture (Picture element)
  • atob-btoa (Base64 encoding and decoding)
  • autofocus (Autofocus attribute)
  • background-attachment (CSS background-attachment)
  • css-filter-function (CSS filter() function)
  • const (const)
  • css-all (CSS all property)
  • let (let)
  • arrow-functions (Arrow functions)
  • addeventlistener (EventTarget.addEventListener())
  • proxy (Proxy object)
  • background-position-x-y (background-position-x & background-position-y)

This is only a small subset of the features available on Can I Use. Adding more feature checks is a work in progress. See Adding checks for features.

Adding checks for features

To add a check for a feature, add a JavaScript file in the lib/features folder with the same name as the Can I Use feature definition at Add a CSS, JavaScript and/or HTML fixture to the spec/fixtures folder to verify your check. If you would like to contribute, you can run npm run status to see a list of priority feature checks that need to be added.


CSS checks should define regular expressions to match declaration properties and/or declaration values. See the flexbox test for an example where both the property and value must match for a result to be returned. You can also define checks for at-rules, such as @keyframes.


JavaScript checks should define regular expressions to match identifiers, literals, or variable declarations as per the ESTree specification. Or alternatively they can check for the existence of a node type, for example the Arrow Functions test will return true if the script has a node of type ArrowFunctionExpression - no regular expression matching is necessary.


CSS checks should define regular expressions to match element names or attribute names.




Package Sidebar


npm i compatibility-reporter

Weekly Downloads






Last publish


  • keeganstreet