UNPKG

grandsea_utils

Version:

javascript commom utils

1,040 lines (956 loc) 505 kB
/** * Modules in this bundle * @license * * power-assert: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * contributors: azu, Masahiro Wakame, Yosuke Furukawa, Teppei Sato, Kenta Mori, falsandtru, James Talmage, Lesha Koss, Daijirō Wachi * homepage: https://github.com/power-assert-js/power-assert * version: 1.4.4 * * acorn: * license: MIT (http://opensource.org/licenses/MIT) * maintainers: marijn <marijnh@gmail.com> * contributors: List of Acorn contributors. Updated before every release., Adrian Rakovsky, Alistair Braidwood, Amila Welihinda, Andres Suarez, Angelo, Aparajita Fishman, Arian Stolwijk, Artem Govorov, Brandon Mills, Charles Hughes, Conrad Irwin, Daniel Tschinder, David Bonnet, Domenico Matteo, Forbes Lindesay, Gilad Peleg, impinball, Ingvar Stepanyan, Jackson Ray Hamilton, Jesse McCarthy, Jiaxing Wang, Joel Kemp, Johannes Herr, Jordan Klassen, Jürg Lehni, Kai Cataldo, keeyipchan, Keheliya Gallaba, Kevin Irish, Kevin Kwok, krator, Marijn Haverbeke, Martin Carlberg, Mat Garcia, Mathias Bynens, Mathieu 'p01' Henri, Matthew Bastien, Max Schaefer, Max Zerzouri, Mihai Bazon, Mike Rennie, naoh, Nicholas C. Zakas, Nick Fitzgerald, Olivier Thomann, Oskar Schöldström, Paul Harper, Peter Rust, PlNG, Prayag Verma, ReadmeCritic, r-e-d, Richard Gibson, Rich Harris, Sebastian McKenzie, Simen Bekkhus, Timothy Gu, Toru Nagashima, Wexpo Lyu, zsjforcn * homepage: https://github.com/ternjs/acorn * version: 4.0.13 * * acorn-es7-plugin: * license: MIT (http://opensource.org/licenses/MIT) * author: matatbread * maintainers: matatbread <npm@mailed.me.uk> * homepage: https://github.com/MatAtBread/acorn-es7-plugin#readme * version: 1.1.7 * * array-filter: * license: MIT (http://opensource.org/licenses/MIT) * author: Julian Gruber <mail@juliangruber.com> * maintainers: juliangruber <julian@juliangruber.com> * homepage: https://github.com/juliangruber/array-filter * version: 1.0.0 * * assert: * license: MIT (http://opensource.org/licenses/MIT) * maintainers: coolaj86 <coolaj86@gmail.com>, cwmma <calvin.metcalf@gmail.com>, defunctzombie <shtylman@gmail.com> * homepage: https://github.com/defunctzombie/commonjs-assert * version: 1.4.1 * * base64-js: * license: MIT (http://opensource.org/licenses/MIT) * author: T. Jameson Little <t.jameson.little@gmail.com> * maintainers: beatgammit <t.jameson.little@gmail.com>, feross <feross@feross.org> * homepage: https://github.com/beatgammit/base64-js * version: 1.2.0 * * buffer: * license: MIT (http://opensource.org/licenses/MIT) * author: Feross Aboukhadijeh <feross@feross.org> * maintainers: feross <feross@feross.org> * contributors: Romain Beauxis <toots@rastageeks.org>, James Halliday <mail@substack.net> * homepage: https://github.com/feross/buffer * version: 4.9.1 * * call-signature: * license: MIT (http://opensource.org/licenses/MIT) * author: James Talmage <james@talmage.io> * maintainers: jamestalmage <james@talmage.io>, twada <takuto.wada@gmail.com> * homepage: https://github.com/jamestalmage/call-signature#readme * version: 0.0.2 * * core-js: * license: MIT (http://opensource.org/licenses/MIT) * maintainers: zloirock <zloirock@zloirock.ru> * homepage: https://github.com/zloirock/core-js#readme * version: 2.4.1 * * define-properties: * license: MIT (http://opensource.org/licenses/MIT) * author: Jordan Harband * maintainers: ljharb <ljharb@gmail.com> * homepage: https://github.com/ljharb/define-properties#readme * version: 1.1.2 * * diff-match-patch: * license: http://www.apache.org/licenses/LICENSE-2.0 * maintainers: forbeslindesay <forbes@lindeay.co.uk> * homepage: https://github.com/ForbesLindesay/diff-match-patch#readme * version: 1.0.0 * * eastasianwidth: * license: MIT (http://opensource.org/licenses/MIT) * author: Masaki Komagata * maintainers: komagata <komagata@gmail.com> * homepage: https://github.com/komagata/eastasianwidth#readme * version: 0.1.1 * * empower: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * contributors: James Talmage * homepage: https://github.com/power-assert-js/empower * version: 1.2.3 * * empower-core: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * contributors: James Talmage * homepage: http://github.com/twada/empower-core * version: 0.6.2 * * espurify: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/estools/espurify * version: 1.7.0 * * estraverse: * license: BSD-2-Clause (http://opensource.org/licenses/BSD-2-Clause) * maintainers: constellation <utatane.tea@gmail.com>, michaelficarra <npm@michael.ficarra.me>, nzakas <nicholas@nczconsulting.com> * homepage: https://github.com/estools/estraverse * version: 4.2.0 * * events: * license: MIT (http://opensource.org/licenses/MIT) * author: Irakli Gozalishvili <rfobic@gmail.com> * maintainers: gozala <rfobic@gmail.com>, defunctzombie <shtylman@gmail.com> * homepage: https://github.com/Gozala/events#readme * version: 1.1.1 * * foreach: * license: MIT (http://opensource.org/licenses/MIT) * author: Manuel Stofer <manuel@takimata.ch> * maintainers: manuelstofer <manuel@takimata.ch> * contributors: Manuel Stofer, Jordan Harband * homepage: https://github.com/manuelstofer/foreach * version: 2.0.5 * * ieee754: * license: BSD-3-Clause (http://opensource.org/licenses/BSD-3-Clause) * author: Feross Aboukhadijeh <feross@feross.org> * maintainers: feross <feross@feross.org> * contributors: Romain Beauxis <toots@rastageeks.org> * homepage: https://github.com/feross/ieee754#readme * version: 1.1.8 * * indexof: * maintainers: tjholowaychuk <tj@vision-media.ca> * version: 0.0.1 * * inherits: * license: ISC (http://opensource.org/licenses/ISC) * maintainers: isaacs <i@izs.me> * homepage: https://github.com/isaacs/inherits#readme * version: 2.0.1 * * isarray: * license: MIT (http://opensource.org/licenses/MIT) * author: Julian Gruber <mail@juliangruber.com> * maintainers: juliangruber <julian@juliangruber.com> * homepage: https://github.com/juliangruber/isarray * version: 1.0.0 * * object-keys: * license: MIT (http://opensource.org/licenses/MIT) * author: Jordan Harband <ljharb@gmail.com> * maintainers: ljharb <ljharb@gmail.com> * contributors: Jordan Harband <ljharb@gmail.com>, Raynos <raynos2@gmail.com>, Nathan Rajlich <nathan@tootallnate.net>, Ivan Starkov <istarkov@gmail.com>, Gary Katsevman <git@gkatsev.com> * homepage: https://github.com/ljharb/object-keys#readme * version: 1.0.11 * * power-assert-context-formatter: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/twada/power-assert-runtime * version: 1.1.1 * * power-assert-context-reducer-ast: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * contributors: Haoliang Gao * homepage: https://github.com/twada/power-assert-runtime * version: 1.1.2 * * power-assert-context-traversal: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/twada/power-assert-runtime * version: 1.1.1 * * power-assert-formatter: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * contributors: James Talmage * homepage: https://github.com/power-assert-js/power-assert-formatter * version: 1.4.1 * * power-assert-renderer-assertion: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/twada/power-assert-runtime * version: 1.1.1 * * power-assert-renderer-base: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/twada/power-assert-runtime * version: 1.1.1 * * power-assert-renderer-comparison: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/twada/power-assert-runtime * version: 1.1.1 * * power-assert-renderer-diagram: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/twada/power-assert-runtime * version: 1.1.2 * * power-assert-renderer-file: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/twada/power-assert-runtime * version: 1.1.1 * * power-assert-util-string-width: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/twada/power-assert-runtime * version: 1.1.1 * * process: * license: MIT (http://opensource.org/licenses/MIT) * author: Roman Shtylman <shtylman@gmail.com> * maintainers: coolaj86 <coolaj86@gmail.com>, cwmma <calvin.metcalf@gmail.com>, defunctzombie <shtylman@gmail.com> * homepage: https://github.com/shtylman/node-process#readme * version: 0.11.10 * * stringifier: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * homepage: https://github.com/twada/stringifier * version: 1.3.0 * * traverse: * license: MIT (http://opensource.org/licenses/MIT) * author: James Halliday <mail@substack.net> * maintainers: substack <mail@substack.net> * homepage: https://github.com/substack/js-traverse * version: 0.6.6 * * type-name: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * contributors: azu, Yosuke Furukawa, Athan, Andrew Moss * homepage: https://github.com/twada/type-name * version: 2.0.2 * * universal-deep-strict-equal: * license: MIT (http://opensource.org/licenses/MIT) * author: Takuto Wada <takuto.wada@gmail.com> * maintainers: twada <takuto.wada@gmail.com> * contributors: azu * homepage: https://github.com/twada/universal-deep-strict-equal * version: 1.2.2 * * util: * license: MIT (http://opensource.org/licenses/MIT) * author: Joyent * maintainers: shtylman <shtylman@gmail.com> * homepage: https://github.com/defunctzombie/node-util * version: 0.10.3 * * xtend: * license: MIT (http://opensource.org/licenses/MIT) * author: Raynos <raynos2@gmail.com> * maintainers: raynos <raynos2@gmail.com> * contributors: Jake Verbaten, Matt Esch * homepage: https://github.com/Raynos/xtend * version: 4.0.1 * * This header is generated by licensify (https://github.com/twada/licensify) */ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.assert = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw (f.code="MODULE_NOT_FOUND", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){ /** * power-assert.js - Power Assert in JavaScript. * * https://github.com/power-assert-js/power-assert * * Copyright (c) 2013-2017 Takuto Wada * Licensed under the MIT license. * https://github.com/power-assert-js/power-assert/blob/master/MIT-LICENSE.txt */ 'use strict'; var baseAssert = _dereq_('assert'); var _deepEqual = _dereq_('universal-deep-strict-equal'); var empower = _dereq_('empower'); var formatter = _dereq_('power-assert-formatter'); var extend = _dereq_('xtend'); var define = _dereq_('define-properties'); var empowerOptions = { modifyMessageOnRethrow: true, saveContextOnRethrow: true }; if (typeof baseAssert.deepStrictEqual !== 'function') { baseAssert.deepStrictEqual = function deepStrictEqual (actual, expected, message) { if (!_deepEqual(actual, expected, true)) { baseAssert.fail(actual, expected, message, 'deepStrictEqual'); } }; } if (typeof baseAssert.notDeepStrictEqual !== 'function') { baseAssert.notDeepStrictEqual = function notDeepStrictEqual (actual, expected, message) { if (_deepEqual(actual, expected, true)) { baseAssert.fail(actual, expected, message, 'notDeepStrictEqual'); } }; } function customize (customOptions) { var options = customOptions || {}; var poweredAssert = empower( baseAssert, formatter(options.output), extend(empowerOptions, options.assertion) ); poweredAssert.customize = customize; return poweredAssert; } var defaultAssert = customize(); define(defaultAssert, { '__esModule': true }); defaultAssert['default'] = defaultAssert; module.exports = defaultAssert; },{"assert":7,"define-properties":80,"empower":88,"power-assert-formatter":114,"universal-deep-strict-equal":131,"xtend":135}],2:[function(_dereq_,module,exports){ module.exports = function(acorn) { switch (parseInt(acorn.version)) { case 2: case 3: acorn.plugins.asyncawait = _dereq_('./acorn-v3') ; break ; case 4: acorn.plugins.asyncawait = _dereq_('./acorn-v4') ; break ; case 5: acorn.plugins.asyncawait = _dereq_('./acorn-v4') ; break ; default: throw new Error("acorn-es7-plugin requires Acorn v2, 3, 4 or 5") ; } return acorn } },{"./acorn-v3":3,"./acorn-v4":4}],3:[function(_dereq_,module,exports){ var NotAsync = {} ; var asyncExit = /^async[\t ]+(return|throw)/ ; var asyncFunction = /^async[\t ]+function/ ; var atomOrPropertyOrLabel = /^\s*[():;]/ ; var removeComments = /([^\n])\/\*(\*(?!\/)|[^\n*])*\*\/([^\n])/g ; var matchAsyncGet = /\s*(get|set)\s*\(/ ; function hasLineTerminatorBeforeNext(st, since) { return st.lineStart >= since; } function test(regex,st,noComment) { var src = st.input.slice(st.start) ; if (noComment) { src = src.replace(removeComments,"$1 $3") ; } return regex.test(src); } /* Create a new parser derived from the specified parser, so that in the * event of an error we can back out and try again */ function subParse(parser, pos, extensions,parens) { var p = new parser.constructor(parser.options, parser.input, pos); if (extensions) for (var k in extensions) p[k] = extensions[k] ; var src = parser ; var dest = p ; ['inFunction','inAsyncFunction','inAsync','inGenerator','inModule'].forEach(function(k){ if (k in src) dest[k] = src[k] ; }) ; if (parens) p.options.preserveParens = true ; p.nextToken(); return p; } //TODO: Implement option noAsyncGetters function asyncAwaitPlugin (parser,options){ var es7check = function(){} ; parser.extend("initialContext",function(base){ return function(){ if (this.options.ecmaVersion < 7) { es7check = function(node) { parser.raise(node.start,"async/await keywords only available when ecmaVersion>=7") ; } ; } this.reservedWords = new RegExp(this.reservedWords.toString().replace(/await|async/g,"").replace("|/","/").replace("/|","/").replace("||","|")) ; this.reservedWordsStrict = new RegExp(this.reservedWordsStrict.toString().replace(/await|async/g,"").replace("|/","/").replace("/|","/").replace("||","|")) ; this.reservedWordsStrictBind = new RegExp(this.reservedWordsStrictBind.toString().replace(/await|async/g,"").replace("|/","/").replace("/|","/").replace("||","|")) ; this.inAsyncFunction = options.inAsyncFunction ; if (options.awaitAnywhere && options.inAsyncFunction) parser.raise(node.start,"The options awaitAnywhere and inAsyncFunction are mutually exclusive") ; return base.apply(this,arguments); } }) ; parser.extend("shouldParseExportStatement",function(base){ return function(){ if (this.type.label==='name' && this.value==='async' && test(asyncFunction,this)) { return true ; } return base.apply(this,arguments) ; } }) ; parser.extend("parseStatement",function(base){ return function (declaration, topLevel) { var start = this.start; var startLoc = this.startLoc; if (this.type.label==='name') { if (test(asyncFunction,this,true)) { var wasAsync = this.inAsyncFunction ; try { this.inAsyncFunction = true ; this.next() ; var r = this.parseStatement(declaration, topLevel) ; r.async = true ; r.start = start; r.loc && (r.loc.start = startLoc); r.range && (r.range[0] = start); return r ; } finally { this.inAsyncFunction = wasAsync ; } } else if ((typeof options==="object" && options.asyncExits) && test(asyncExit,this)) { // NON-STANDARD EXTENSION iff. options.asyncExits is set, the // extensions 'async return <expr>?' and 'async throw <expr>?' // are enabled. In each case they are the standard ESTree nodes // with the flag 'async:true' this.next() ; var r = this.parseStatement(declaration, topLevel) ; r.async = true ; r.start = start; r.loc && (r.loc.start = startLoc); r.range && (r.range[0] = start); return r ; } } return base.apply(this,arguments); } }) ; parser.extend("parseIdent",function(base){ return function(liberal){ var id = base.apply(this,arguments); if (this.inAsyncFunction && id.name==='await') { if (arguments.length===0) { this.raise(id.start,"'await' is reserved within async functions") ; } } return id ; } }) ; parser.extend("parseExprAtom",function(base){ return function(refShorthandDefaultPos){ var start = this.start ; var startLoc = this.startLoc; var rhs,r = base.apply(this,arguments); if (r.type==='Identifier') { if (r.name==='async' && !hasLineTerminatorBeforeNext(this, r.end)) { // Is this really an async function? var isAsync = this.inAsyncFunction ; try { this.inAsyncFunction = true ; var pp = this ; var inBody = false ; var parseHooks = { parseFunctionBody:function(node,isArrowFunction){ try { var wasInBody = inBody ; inBody = true ; return pp.parseFunctionBody.apply(this,arguments) ; } finally { inBody = wasInBody ; } }, raise:function(){ try { return pp.raise.apply(this,arguments) ; } catch(ex) { throw inBody?ex:NotAsync ; } } } ; rhs = subParse(this,this.start,parseHooks,true).parseExpression() ; if (rhs.type==='SequenceExpression') rhs = rhs.expressions[0] ; if (rhs.type === 'CallExpression') rhs = rhs.callee ; if (rhs.type==='FunctionExpression' || rhs.type==='FunctionDeclaration' || rhs.type==='ArrowFunctionExpression') { // Because we don't know if the top level parser supprts preserveParens, we have to re-parse // without it set rhs = subParse(this,this.start,parseHooks).parseExpression() ; if (rhs.type==='SequenceExpression') rhs = rhs.expressions[0] ; if (rhs.type === 'CallExpression') rhs = rhs.callee ; rhs.async = true ; rhs.start = start; rhs.loc && (rhs.loc.start = startLoc); rhs.range && (rhs.range[0] = start); this.pos = rhs.end; this.end = rhs.end ; this.endLoc = rhs.endLoc ; this.next(); es7check(rhs) ; return rhs ; } } catch (ex) { if (ex!==NotAsync) throw ex ; } finally { this.inAsyncFunction = isAsync ; } } else if (r.name==='await') { var n = this.startNodeAt(r.start, r.loc && r.loc.start); if (this.inAsyncFunction) { rhs = this.parseExprSubscripts() ; n.operator = 'await' ; n.argument = rhs ; n = this.finishNodeAt(n,'AwaitExpression', rhs.end, rhs.loc && rhs.loc.end) ; es7check(n) ; return n ; } // NON-STANDARD EXTENSION iff. options.awaitAnywhere is true, // an 'AwaitExpression' is allowed anywhere the token 'await' // could not be an identifier with the name 'await'. // Look-ahead to see if this is really a property or label called async or await if (this.input.slice(r.end).match(atomOrPropertyOrLabel)) { if (!options.awaitAnywhere && this.options.sourceType === 'module') return this.raise(r.start,"'await' is reserved within modules") ; return r ; // This is a valid property name or label } if (typeof options==="object" && options.awaitAnywhere) { start = this.start ; rhs = subParse(this,start-4).parseExprSubscripts() ; if (rhs.end<=start) { rhs = subParse(this,start).parseExprSubscripts() ; n.operator = 'await' ; n.argument = rhs ; n = this.finishNodeAt(n,'AwaitExpression', rhs.end, rhs.loc && rhs.loc.end) ; this.pos = rhs.end; this.end = rhs.end ; this.endLoc = rhs.endLoc ; this.next(); es7check(n) ; return n ; } } if (!options.awaitAnywhere && this.options.sourceType === 'module') return this.raise(r.start,"'await' is reserved within modules") ; } } return r ; } }) ; parser.extend('finishNodeAt',function(base){ return function(node,type,pos,loc) { if (node.__asyncValue) { delete node.__asyncValue ; node.value.async = true ; } return base.apply(this,arguments) ; } }) ; parser.extend('finishNode',function(base){ return function(node,type) { if (node.__asyncValue) { delete node.__asyncValue ; node.value.async = true ; } return base.apply(this,arguments) ; } }) ; var allowedPropSpecifiers = { get:true, set:true, async:true }; parser.extend("parsePropertyName",function(base){ return function (prop) { var prevName = prop.key && prop.key.name ; var key = base.apply(this,arguments) ; if (key.type === "Identifier" && (key.name === "async") && !hasLineTerminatorBeforeNext(this, key.end)) { // Look-ahead to see if this is really a property or label called async or await if (!this.input.slice(key.end).match(atomOrPropertyOrLabel)){ // Cheese - eliminate the cases 'async get(){}' and async set(){}' if (matchAsyncGet.test(this.input.slice(key.end))) { key = base.apply(this,arguments) ; prop.__asyncValue = true ; } else { es7check(prop) ; if (prop.kind === 'set') this.raise(key.start,"'set <member>(value)' cannot be be async") ; key = base.apply(this,arguments) ; if (key.type==='Identifier') { if (key.name==='set') this.raise(key.start,"'set <member>(value)' cannot be be async") ; } prop.__asyncValue = true ; } } } return key; }; }) ; parser.extend("parseClassMethod",function(base){ return function (classBody, method, isGenerator) { var wasAsync ; if (method.__asyncValue) { if (method.kind==='constructor') this.raise(method.start,"class constructor() cannot be be async") ; wasAsync = this.inAsyncFunction ; this.inAsyncFunction = true ; } var r = base.apply(this,arguments) ; this.inAsyncFunction = wasAsync ; return r ; } }) ; parser.extend("parseMethod",function(base){ return function (isGenerator) { var wasAsync ; if (this.__currentProperty && this.__currentProperty.__asyncValue) { wasAsync = this.inAsyncFunction ; this.inAsyncFunction = true ; } var r = base.apply(this,arguments) ; this.inAsyncFunction = wasAsync ; return r ; } }) ; parser.extend("parsePropertyValue",function(base){ return function (prop, isPattern, isGenerator, startPos, startLoc, refDestructuringErrors) { var prevProp = this.__currentProperty ; this.__currentProperty = prop ; var wasAsync ; if (prop.__asyncValue) { wasAsync = this.inAsyncFunction ; this.inAsyncFunction = true ; } var r = base.apply(this,arguments) ; this.inAsyncFunction = wasAsync ; this.__currentProperty = prevProp ; return r ; } }) ; } module.exports = asyncAwaitPlugin ; },{}],4:[function(_dereq_,module,exports){ var asyncExit = /^async[\t ]+(return|throw)/ ; var atomOrPropertyOrLabel = /^\s*[):;]/ ; var removeComments = /([^\n])\/\*(\*(?!\/)|[^\n*])*\*\/([^\n])/g ; function hasLineTerminatorBeforeNext(st, since) { return st.lineStart >= since; } function test(regex,st,noComment) { var src = st.input.slice(st.start) ; if (noComment) { src = src.replace(removeComments,"$1 $3") ; } return regex.test(src); } /* Create a new parser derived from the specified parser, so that in the * event of an error we can back out and try again */ function subParse(parser, pos, extensions) { var p = new parser.constructor(parser.options, parser.input, pos); if (extensions) for (var k in extensions) p[k] = extensions[k] ; var src = parser ; var dest = p ; ['inFunction','inAsync','inGenerator','inModule'].forEach(function(k){ if (k in src) dest[k] = src[k] ; }) ; p.nextToken(); return p; } function asyncAwaitPlugin (parser,options){ if (!options || typeof options !== "object") options = {} ; parser.extend("parse",function(base){ return function(){ this.inAsync = options.inAsyncFunction ; if (options.awaitAnywhere && options.inAsyncFunction) parser.raise(node.start,"The options awaitAnywhere and inAsyncFunction are mutually exclusive") ; return base.apply(this,arguments); } }) ; parser.extend("parseStatement",function(base){ return function (declaration, topLevel) { var start = this.start; var startLoc = this.startLoc; if (this.type.label==='name') { if ((options.asyncExits) && test(asyncExit,this)) { // TODO: Ensure this function is itself nested in an async function or Method this.next() ; var r = this.parseStatement(declaration, topLevel) ; r.async = true ; r.start = start; r.loc && (r.loc.start = startLoc); r.range && (r.range[0] = start); return r ; } } return base.apply(this,arguments); } }) ; parser.extend("parseIdent",function(base){ return function(liberal) { if (this.options.sourceType==='module' && this.options.ecmaVersion >= 8 && options.awaitAnywhere) return base.call(this,true) ; // Force liberal mode if awaitAnywhere is set return base.apply(this,arguments) ; } }) ; parser.extend("parseExprAtom",function(base){ var NotAsync = {}; return function(refShorthandDefaultPos){ var start = this.start ; var startLoc = this.startLoc; var rhs,r = base.apply(this,arguments); if (r.type==='Identifier') { if (r.name==='await' && !this.inAsync) { if (options.awaitAnywhere) { var n = this.startNodeAt(r.start, r.loc && r.loc.start); start = this.start ; var parseHooks = { raise:function(){ try { return pp.raise.apply(this,arguments) ; } catch(ex) { throw /*inBody?ex:*/NotAsync ; } } } ; try { rhs = subParse(this,start-4,parseHooks).parseExprSubscripts() ; if (rhs.end<=start) { rhs = subParse(this,start,parseHooks).parseExprSubscripts() ; n.argument = rhs ; n = this.finishNodeAt(n,'AwaitExpression', rhs.end, rhs.loc && rhs.loc.end) ; this.pos = rhs.end; this.end = rhs.end ; this.endLoc = rhs.endLoc ; this.next(); return n ; } } catch (ex) { if (ex===NotAsync) return r ; throw ex ; } } } } return r ; } }) ; var allowedPropValues = { undefined:true, get:true, set:true, "static":true, async:true, constructor:true }; parser.extend("parsePropertyName",function(base){ return function (prop) { var prevName = prop.key && prop.key.name ; var key = base.apply(this,arguments) ; if (this.value==='get') { prop.__maybeStaticAsyncGetter = true ; } var next ; if (allowedPropValues[this.value]) return key ; if (key.type === "Identifier" && (key.name === "async" || prevName === "async") && !hasLineTerminatorBeforeNext(this, key.end) // Look-ahead to see if this is really a property or label called async or await && !this.input.slice(key.end).match(atomOrPropertyOrLabel)) { if (prop.kind === 'set' || key.name === 'set') this.raise(key.start,"'set <member>(value)' cannot be be async") ; else { this.__isAsyncProp = true ; key = base.apply(this,arguments) ; if (key.type==='Identifier') { if (key.name==='set') this.raise(key.start,"'set <member>(value)' cannot be be async") ; } } } else { delete prop.__maybeStaticAsyncGetter ; } return key; }; }) ; parser.extend("parseClassMethod",function(base){ return function (classBody, method, isGenerator) { var r = base.apply(this,arguments) ; if (method.__maybeStaticAsyncGetter) { delete method.__maybeStaticAsyncGetter ; if (method.key.name!=='get') method.kind = "get" ; } return r ; } }) ; parser.extend("parseFunctionBody",function(base){ return function (node, isArrowFunction) { var wasAsync = this.inAsync ; if (this.__isAsyncProp) { node.async = true ; this.inAsync = true ; delete this.__isAsyncProp ; } var r = base.apply(this,arguments) ; this.inAsync = wasAsync ; return r ; } }) ; } module.exports = asyncAwaitPlugin ; },{}],5:[function(_dereq_,module,exports){ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global.acorn = global.acorn || {}))); }(this, (function (exports) { 'use strict'; // Reserved word lists for various dialects of the language var reservedWords = { 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile", 5: "class enum extends super const export import", 6: "enum", strict: "implements interface let package private protected public static yield", strictBind: "eval arguments" } // And the keywords var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this" var keywords = { 5: ecma5AndLessKeywords, 6: ecma5AndLessKeywords + " const class extends export import super" } // ## Character categories // Big ugly regular expressions that match characters in the // whitespace, identifier, and identifier-start categories. These // are only applied when a character is found to actually have a // code point above 128. // Generated by `bin/generate-identifier-regex.js`. var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0-\u08b4\u08b6-\u08bd\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fd5\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ae\ua7b0-\ua7b7\ua7f7-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab65\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc" var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d4-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d01-\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1cf8\u1cf9\u1dc0-\u1df5\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f" var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]") var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]") nonASCIIidentifierStartChars = nonASCIIidentifierChars = null // These are a run-length and offset encoded representation of the // >0xffff code points that are a valid part of identifiers. The // offset starts at 0x10000, and each pair of numbers represents an // offset to the next range, and then a size of the range. They were // generated by bin/generate-identifier-regex.js var astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,17,26,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,26,45,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,785,52,76,44,33,24,27,35,42,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,54,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,86,25,391,63,32,0,449,56,264,8,2,36,18,0,50,29,881,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,881,68,12,0,67,12,65,0,32,6124,20,754,9486,1,3071,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,4149,196,60,67,1213,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,10591,541] var astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,1306,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,52,0,13,2,49,13,10,2,4,9,83,11,7,0,161,11,6,9,7,3,57,0,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,87,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,423,9,838,7,2,7,17,9,57,21,2,13,19882,9,135,4,60,6,26,9,1016,45,17,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,2214,6,110,6,6,9,792487,239] // This has a complexity linear to the value of the code. The // assumption is that looking up astral identifier characters is // rare. function isInAstralSet(code, set) { var pos = 0x10000 for (var i = 0; i < set.length; i += 2) { pos += set[i] if (pos > code) return false pos += set[i + 1] if (pos >= code) return true } } // Test whether a given character code starts an identifier. function isIdentifierStart(code, astral) { if (code < 65) return code === 36 if (code < 91) return true if (code < 97) return code === 95 if (code < 123) return true if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) if (astral === false) return false return isInAstralSet(code, astralIdentifierStartCodes) } // Test whether a given character is part of an identifier. function isIdentifierChar(code, astral) { if (code < 48) return code === 36 if (code < 58) return true if (code < 65) return false if (code < 91) return true if (code < 97) return code === 95 if (code < 123) return true if (code <= 0xffff) return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) if (astral === false) return false return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes) } // ## Token types // The assignment of fine-grained, information-carrying type objects // allows the tokenizer to store the information it has about a // token in a way that is very cheap for the parser to look up. // All token type variables start with an underscore, to make them // easy to recognize. // The `beforeExpr` property is used to disambiguate between regular // expressions and divisions. It is set on all token types that can // be followed by an expression (thus, a slash after them would be a // regular expression). // // The `startsExpr` property is used to check if the token ends a // `yield` expression. It is set on all token types that either can // directly start an expression (like a quotation mark) or can // continue an expression (like the body of a string). // // `isLoop` marks a keyword as starting a loop, which is important // to know when parsing a label, in order to allow or disallow // continue jumps to that label. var TokenType = function TokenType(label, conf) { if ( conf === void 0 ) conf = {}; this.label = label this.keyword = conf.keyword this.beforeExpr = !!conf.beforeExpr this.startsExpr = !!conf.startsExpr this.isLoop = !!conf.isLoop this.isAssign = !!conf.isAssign this.prefix = !!conf.prefix this.postfix = !!conf.postfix this.binop = conf.binop || null this.updateContext = null }; function binop(name, prec) { return new TokenType(name, {beforeExpr: true, binop: prec}) } var beforeExpr = {beforeExpr: true}; var startsExpr = {startsExpr: true}; // Map keyword names to token types. var keywordTypes = {} // Succinct definitions of keyword token types function kw(name, options) { if ( options === void 0 ) options = {}; options.keyword = name return keywordTypes[name] = new TokenType(name, options) } var tt = { num: new TokenType("num", startsExpr), regexp: new TokenType