especially

Abstract operations and other functions drawn from the ECMAScript specification

ECMAScript Spec Operations, in ECMAScript

Have you ever wanted to write a to-the-letter implementation of some ECMAScript spec function? Maybe you want to run tests against it; maybe you're just crazy and like self-hosting JavaScript in JavaScript. In either case, this is the package for you!

Especially has a small-but-growing collection of meta-textual and abstract operations drawn directly from the pages of the ECMAScript 6 draft specification. From common things like Get to dealing with internal slots, Especially has you covered.

Especially has no main module (gasp). Instead, you'll require one of the top-level modules that contain the stuff you want.

A variety of math operations from the Algorithm Conventions section of the spec:

  • abs(x)
  • sign(x)
  • min(x1, x2, …, xn)
  • floor(x)
  • assert: ensures you pass it a boolean, then throws if it's not true
  • define_built_in_data_property: a shortcut for defining a built-in data property with the usual property descriptor.
  • Internal slot management:
    • make_slots(object, arrayOfSlotNames): call this to initialize an object's internal slots. Often referenced in the spec as "instances of (something) are initially created with the internal slots listed in (some table)."
    • get_slot(object, name): get the value of an internal slot. Often referenced in the spec as "the value of (object)'s [[SlotName]] internal slot."
    • set_slot(object, name): set the value of an internal slot. Often referenced in the spec as "Set (object)'s [[SlotName]] internal slot to (a value)."
    • has_slot(object): check whether an object has an internal slot with the given name. Often referenced in the spec as "If (object) does not have a [[SlotName]] internal slot."

A few well-known symbol are included:

  • "@@create" will give you a symbol that is used by OrdinaryConstruct and related operations.
  • "@@iterator" will give you a symbol that is used by GetIterator.

Some of the well-known intrinsic objects are included by name, e.g. "%ObjectPrototype%". These are used by GetPrototypeFromConstructor and related operations.

Especially is meant to run in Node.js 0.11.9+, at least for now. It uses certain ES6 features so far only implemented in bleeding-edge V8, with the --harmony flag turned on.

Install it from npm into your project with npm install especially. And don't forget to run your program, or your tests, with the --harmony flag.

You can see examples of it in use in the reference implementation of the ES6 promises specification.