npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

compatibility-reporter

v0.2.3

Published

Generate a report on the Web Platform features that your website uses, and the browser support of each feature.

Downloads

2

Readme

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.

Input

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');

compatibilityReporter.report({
  files: ['spec/fixtures/**/*'],
  browsers: ['chrome 51', 'firefox 47', 'safari 9.1', 'edge 13', 'ie 11', 'ie 10'],
  output: 'compatibility-report.html'
}).then(function(result) {
  console.log(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 caniuse.com 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 https://github.com/Fyrd/caniuse/tree/master/features-json. 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

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

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.

HTML

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