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

acorn-es7-plugin

v1.1.7

Published

A plugin for the Acorn parser that understands the ES7 keywords async and await

Downloads

604,329

Readme

NPM

acorn-es7-plugin

acorn-es7-plugin is a plugin for the Acorn parser that generates ESTrees following the 'experimental' specification for asynchronous functions.

npm install --save acorn-es7-plugin

Usage

Adding the plugin

// Require acorn as usual
var acorn = require("acorn");
// Add the es7-plugin
require('./acorn-es7-plugin')(acorn) ;

Using the plugin

var code = "async function x(){ if (x) return await(x-1) ; return 0 ; }\n";
var ast = acorn.parse(code,{
	// Specify use of the plugin
	plugins:{asyncawait:true},
	// Specify the ecmaVersion
	ecmaVersion:7
}) ;
// Show the AST
console.log(JSON.stringify(ast,null,2)) ;

Output:

{
	"type": "Program",
	"body": [
	{
	  "type": "FunctionDeclaration",
	  "id": {
	    "type": "Identifier",
	    "name": "x"
	  },
	  "generator": false,
	  "expression": false,
	  "params": [],
	  "body": {
	    "type": "BlockStatement",
	    "body": [
	      {
	        "type": "IfStatement",
	        "test": {
	          "type": "Identifier",
	          "name": "x"
	        },
	        "consequent": {
	          "type": "ReturnStatement",
	          "argument": {
	            "type": "AwaitExpression",
	            "operator": "await",
	            "argument": {
	              "type": "BinaryExpression",
	              "left": {
	                "type": "Identifier",
	                "name": "x"
	              },
	              "operator": "-",
	              "right": {
	                "type": "Literal",
	                "value": 1,
	                "raw": "1"
	              }
	            }
	          }
	        },
	        "alternate": null
	      },
	      {
	        "type": "ReturnStatement",
	        "argument": {
	          "type": "Literal",
	          "value": 0,
	          "raw": "0"
	        }
	      }
	    ]
	  },
	  "async": true
	}
	],
	"sourceType": "script"
}

Options & Compliance

The parser attempts to enforce strict contextualisation of async and await. Specifically, async is only a keyword if it precedes a function declaration, function expression or arrow function. await is only a keyword inside an async function. Outside of these contexts, both tokens are treated as identifiers (as they were in ES6 and earlier).

When using the plugin, you can supply an object in place of the 'true' flag with the following options.

| flag | meaning | |------|---------| | awaitAnywhere | If await is used outside of an async function and could not be an identifier, generate an AwaitExpression node. This typically means you can use await anywhere except when its argument would require parentheses, as this parses to a call to 'await(....)'. Should not be used with inAsyncFunction option | | inAsyncFunction | Parse the code as if it is the body of an async function. This means await cannot be an identifier and is always an AwaitExpression, even if the argument is parenthesized. Should not be used with the awaitAnywhere option | | asyncExits | Allow the additional sequences async return <optional-expression> and async throw <expression>. These sequences are used with nodent. In each case, as with async functions, a standard ReturnStatement (or ThrowStatement) node is generated, with an additional member 'async' set to true.

The parser also accepts async getters in object literals and classes, which is currently disallowed by the ES7 specification.

Changelog

30-Mar-17: v1.1.7

  • Fix parsing of IIAFE (async function (){ }()) with acorn v3.

07-Oct-16: v1.1.1

  • Fix disambiguation of async, get and set tokens (and add tests) when defining object properties:

| Code | Interpretation |-----------------------|-------------------------| | get async(){} | Is a standard ES6 getter called 'async' | set async(v){} | Is a standard ES6 setter called 'async' | async get(...){} | Is a standard ES7 async method called 'get' | async set(...){} | Is a standard ES7 async method called 'set' | async get x(){} | Is an extension that defines an async getter called 'x' | get async x(){} | Is an extension that defines an async getter called 'x', but is deprecated (async should proceed get)

In previous version of the plugin, the standard ES7 constructs were hidden by the plugin extensions and a SyntaxError was incorrectly thrown

25-Sep-16: v1.1.0

  • Update to work with acorn v4 if present. Note that async and await are fully parsed by acorn v4. The only use case for the plugin with acorn v4 is with the flags above which are enable specific parsing modes.

24-Sep-16: v1.0.18

  • Correctly parse async(()=>0) as a call to the Identifer 'async', not a failed attempt to define an async arrow.

20-Jul-16: v1.0.17

  • Correctly set non-standard "range" property on async nodes, as used by Webpack

27-Jun-16: v1.0.15

03-May-16: v1.0.14

  • Correctly parse async statements containing comments.
  • Implement the option inAsyncFunction

03-May-16: v1.0.13

  • Correctly parse the statement export async function name(){...} as async function name(){...} is a valid named declaration.

26-Feb-16: v1.0.12

  • Updated to return the original acorn object on installation. See https://github.com/MatAtBread/acorn-es7-plugin/pull/4

19-Dec-15: v1.0.11

  • Generate error if 'await' is used as an identifier within an async function.

10-Dec-15: v1.0.10

  • Update the plugin code to remove 'async' and 'await' from the super-strict keyword tests introduced in acorn v2.6.x that generate parse errors before the plugin gets a chance to manage them.