JavaScript Environment Capability Detection
capability.js is a lightweight JavaScript library designed for detecting specific environmental capabilities, primarily focusing on browser features. Released in 2016, its current stable version is 0.2.5, indicating it has not seen significant development since its initial release. The library allows developers to define custom capability tests using a simple API and then query or enforce these capabilities. Unlike comprehensive feature detection libraries like Modernizr, `capability.js` provides a minimalist approach for defining and checking individual features such as `Object.create`, `Array.prototype.forEach`, or `Function.prototype.bind`. Its release cadence appears to be inactive, with no recent updates. It relies on CommonJS modules and requires a bundler like Webpack or Browserify for use in browser environments, as native ES modules were not widely supported when it was developed. This makes it less suitable for modern projects that typically use native ES modules and rely on built-in browser feature detection or more actively maintained polyfill solutions.
Common errors
-
Error: Cannot find module 'capability'
cause Attempting to `import` 'capability' in a CommonJS-only Node.js environment or without proper bundler configuration for CommonJS modules.fixUse `const capability = require('capability');` instead of `import capability from 'capability';` or ensure your build tool correctly processes CommonJS modules for browser/ESM environments. -
TypeError: capability.test is not a function
cause Incorrectly importing the `capability` object, such as attempting a named import `import { test } from 'capability'` when `test` is a method of the default export.fixEnsure you are importing the entire module as a default object: `const capability = require('capability');` and then calling `capability.test('feature');`.
Warnings
- gotcha This library was last updated in 2016 and is likely unmaintained. Use in new projects is not recommended, and direct feature detection or actively maintained polyfill libraries are generally preferred for modern web development.
- breaking The library primarily uses CommonJS `require()` syntax. Attempting to use ES module `import` syntax directly will fail in most environments without a build step that handles CommonJS modules.
- gotcha For browser usage, the library explicitly states it requires a 'node module loader' like Browserify or Webpack. It is not designed for direct inclusion via `<script>` tags without a bundling step.
Install
-
npm install capability -
yarn add capability -
pnpm add capability
Imports
- capability
import capability from 'capability';
const capability = require('capability'); - capability.define
const capability = require('capability'); capability.define('myFeature', () => /* test logic */); - capability.test
import { test } from 'capability';const capability = require('capability'); const isSupported = capability.test('Object.create'); - es5
import { es5 } from 'capability';require('capability/es5');
Quickstart
const capability = require('capability');
// Define a custom capability
capability.define('XMLHttpRequest', function () {
return typeof XMLHttpRequest !== 'undefined';
});
// Test if a capability is supported
const hasObjectCreate = capability.test('Object.create');
console.log(`Object.create is supported: ${hasObjectCreate}`);
const hasCustomFeature = capability('XMLHttpRequest'); // Shorthand for capability.test
console.log(`XMLHttpRequest is supported: ${hasCustomFeature}`);
// Enforce a capability (will throw an error if not supported)
try {
capability.check('Array.prototype.forEach');
console.log('Array.prototype.forEach is available.');
} catch (error) {
console.error(`Error: ${error.message}`);
}
// Load a specific capability group to enforce its requirements
try {
require('capability/es5'); // This will run checks for all ES5 capabilities defined in the library
console.log('Environment meets ES5 requirements (via /es5 module).');
} catch (error) {
console.error(`Error loading ES5 capabilities: ${error.message}`);
}