For any given “es-shim API”-compliant package
foo, the following invariants must hold:
- This package will run in an environment supporting the oldest JS version in which the spec’s semantics are achievable - ES3, ES5, and/or ES6. The package should indicate its minimum level of required environment support in its README.
- The package must attempt to support
io.js, all versions of all ES3-compliant browsers or later, Web Workers, and
node-webkit. Other environments are a plus, but not expected.
require('foo')is a spec-compliant JS or native function. However, if the function’s behavior depends on a receiver (a “this” value), then the first argument to this function will be used as that receiver. The package should indicate if this is the case in its README.
require('foo/implementation')is a spec-compliant JS function, that will depend on a receiver (a “this” value) as the spec requires.
require('foo/polyfill')is a function that when invoked, will return the most compliant and performant function that it can - if a native version is available, and does not violate the spec, then the native function will be returned - otherwise, either the
implementation, or a custom, wrapped version of the native function, will be returned. This is also the result that will be used as the default export.
require('foo/shim')is a function that when invoked, will call
getPolyfill, and if the polyfill doesn’t match the built-in value, will install it into the global environment.
require('foo/auto')will automatically invoke the
- The only place the package may modify the environment is within its
npm testmust run the package’s tests.
- In every way possible, the package must attempt to make itself robust against the environment being modified after it is
- For example,
require('foo'); delete Function.prototype.call;must not alter the behavior of
- The most useful technique for this is shown in this example:
var callBound = require('call-bind/callBound'); var slice = callBound('Array.prototype.slice'); slice(, 1);— this technique works in ES3 environments, and will ensure that modifying
Function.prototypewill not interfere with the package.
If your package contains multiple shims, you can pass
--multi to apply these invariants:
- The package's main export must be an array of directory names, with no additional properties.
- The entry points and respective invariants listed above apply to the subdirectories listed in the main export
- The root must contain
autoentrypoints that match the same invariants described above. The
shimentry point must invoke the
shimentry point in each of the subdirectories listed in the main export
- The root must NOT contain an
- Please use the es-abstract module to ensure spec-compliant behavior via the spec’s internal abstract operations.
- Please use the define-properties module to trivially define non-enumerable properties, where supported.
- Please use the call-bind module to cache references to all builtin methods, to be robust against later modification of the environment.
How to denote compliance
Prominently in the package’s README, please include the following markdown:
This package implements the [es-shim API](https://github.com/es-shims/api) interface. It works in an ES3-supported environment and complies with the [spec](https://www.ecma-international.org/ecma-262/6.0/).
Please modify “ES3” as needed to the level of support, and please update the spec link so it points directly to the most relevant section of the spec it complies with.
Very simple and shallow tests that a package follows the
--bound to indicate that the function the package is implementing depends on having a receiver (a “this” value).
es-shim-api object-assign es-shim-api array-includes --bound
Simply clone the repo,
npm install, and run