diff --git a/.babelrc.json b/.babelrc.json new file mode 100644 index 0000000..ece1d87 --- /dev/null +++ b/.babelrc.json @@ -0,0 +1,5 @@ +{ + "presets": [ + ["@babel/preset-env"] + ] +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d83d722 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +root = true + +[*] +end_of_line = lf +charset = utf-8 +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 + +[*.json] +indent_size = 2 + +[*.yml] +indent_size = 2 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..29af31d --- /dev/null +++ b/.eslintignore @@ -0,0 +1,8 @@ +node_modules +dist + +!.eslintrc.js +coverage + +src/es5-identifier.js +src/es6-identifier.js diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..1507be3 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,48 @@ +'use strict'; +module.exports = { + env: { + browser: true, + commonjs: true, + es6: true, + node: true + }, + extends: 'eslint:recommended', + globals: { + Atomics: 'readonly', + SharedArrayBuffer: 'readonly' + }, + overrides: [{ + files: '.eslintrc.js', + parserOptions: { + sourceType: 'script' + }, + rules: { + strict: 'error' + } + }, { + files: 'test/**', + globals: { + expect: true + }, + env: { + mocha: true + } + }], + parserOptions: { + sourceType: 'module', + ecmaVersion: 2018 + }, + rules: { + semi: ['error'], + indent: ['error', 4, { SwitchCase: 1 }], + 'prefer-const': ['error'], + 'no-var': ['error'], + 'prefer-destructuring': ['error'], + 'object-shorthand': ['error'], + 'object-curly-spacing': ['error', 'always'], + quotes: ['error', 'single'], + 'quote-props': ['error', 'as-needed'], + 'brace-style': ['error', '1tbs', { allowSingleLine: true }], + 'prefer-template': ['error'] + } +}; diff --git a/.gitignore b/.gitignore index 3c3629e..0e75fe5 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ node_modules +dist +coverage diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index f642dae..0000000 --- a/.jshintrc +++ /dev/null @@ -1,16 +0,0 @@ -{ - "curly": true, - "eqeqeq": true, - "immed": true, - "eqnull": true, - "latedef": true, - "noarg": true, - "noempty": true, - "quotmark": "single", - "undef": true, - "unused": true, - "strict": true, - "trailing": true, - - "node": true -} diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..c1ca392 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock = false diff --git a/.travis.yml b/.travis.yml index 4b59f8d..c449b78 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,5 @@ language: node_js node_js: - - "0.10" - - "0.11" - -matrix: - allow_failures: - - node_js: "0.11" + - 12 + - 14 + - 16 diff --git a/README.md b/README.md index e901aac..4deaf82 100644 --- a/README.md +++ b/README.md @@ -4,29 +4,29 @@ utility box for ECMAScript language tools. ## API -## `ast` +## `ast` -### `ast.isExpression(node)` +### `ast.isExpression(node)` Returns `true` if `node` is an `Expression` as defined in ECMA262 edition 5.1 section [11](https://es5.github.io/#x11). -### `ast.isStatement(node)` +### `ast.isStatement(node)` Returns `true` if `node` is a `Statement` as defined in ECMA262 edition 5.1 section [12](https://es5.github.io/#x12). -### `ast.isIterationStatement(node)` +### `ast.isIterationStatement(node)` Returns `true` if `node` is an `IterationStatement` as defined in ECMA262 edition 5.1 section [12.6](https://es5.github.io/#x12.6). -### `ast.isSourceElement(node)` +### `ast.isSourceElement(node)` Returns `true` if `node` is a `SourceElement` as defined in ECMA262 edition 5.1 section [14](https://es5.github.io/#x14). -### `ast.trailingStatement(node)` +### `ast.trailingStatement(node)` Returns `Statement?` if `node` has trailing `Statement`. ```js @@ -35,7 +35,7 @@ if (cond) ``` When taking this `IfStatement`, returns `consequent;` statement. -### `ast.isProblematicIfStatement(node)` +### `ast.isProblematicIfStatement(node)` Returns `true` if `node` is a problematic `IfStatement`. If `node` is a problematic `IfStatement`, `node` cannot be represented as an one-to-one JavaScript code. ```js @@ -54,101 +54,101 @@ Returns `true` if `node` is a problematic `IfStatement`. If `node` is a problema The above node cannot be represented as a JavaScript code, since the top level `else` alternate belongs to an inner `IfStatement`. -## `code` +## `code` -### `code.isDecimalDigit(code)` +### `code.isDecimalDigit(code)` Return `true` if provided code is decimal digit. -### `code.isHexDigit(code)` +### `code.isHexDigit(code)` Return `true` if provided code is hexadecimal digit. -### `code.isOctalDigit(code)` +### `code.isOctalDigit(code)` Return `true` if provided code is octal digit. -### `code.isWhiteSpace(code)` +### `code.isWhiteSpace(code)` -Return `true` if provided code is white space. +Return `true` if provided code is white space. White space characters are formally defined in ECMA262. -### `code.isLineTerminator(code)` +### `code.isLineTerminator(code)` -Return `true` if provided code is line terminator. +Return `true` if provided code is line terminator. Line terminator characters are formally defined in ECMA262. -### `code.isIdentifierStart(code)` +### `code.isIdentifierStart(code)` -Return `true` if provided code can be the first character of ECMA262 `Identifier`. +Return `true` if provided code can be the first character of ECMA262 `Identifier`. They are formally defined in ECMA262. -### `code.isIdentifierPart(code)` +### `code.isIdentifierPart(code)` -Return `true` if provided code can be the trailing character of ECMA262 `Identifier`. +Return `true` if provided code can be the trailing character of ECMA262 `Identifier`. They are formally defined in ECMA262. -## `keyword` +## `keyword` -### `keyword.isKeywordES5(id, strict)` +### `keyword.isKeywordES5(id, strict)` Returns `true` if provided identifier string is a Keyword or Future Reserved Word -in ECMA262 edition 5.1. +in ECMA262 edition 5.1. They are formally defined in ECMA262 sections [7.6.1.1](http://es5.github.io/#x7.6.1.1) and [7.6.1.2](http://es5.github.io/#x7.6.1.2), -respectively. +respectively. If the `strict` flag is truthy, this function additionally checks whether `id` is a `Keyword` or `FutureReservedWord` under strict mode. -### `keyword.isKeywordES6(id, strict)` +### `keyword.isKeywordES6(id, strict)` Returns `true` if provided identifier string is a `Keyword` or `FutureReservedWord` -in ECMA262 edition 6. +in ECMA262 edition 6. They are formally defined in ECMA262 sections [11.6.2.1](http://ecma-international.org/ecma-262/6.0/#sec-keywords) and [11.6.2.2](http://ecma-international.org/ecma-262/6.0/#sec-future-reserved-words), -respectively. +respectively. If the `strict` flag is truthy, this function additionally checks whether `id` is a `Keyword` or `FutureReservedWord` under strict mode. -### `keyword.isReservedWordES5(id, strict)` +### `keyword.isReservedWordES5(id, strict)` Returns `true` if provided identifier string is a `ReservedWord` in ECMA262 edition 5.1. They are formally defined in ECMA262 section [7.6.1](http://es5.github.io/#x7.6.1). If the `strict` flag is truthy, this function additionally checks whether `id` is a `ReservedWord` under strict mode. -### `keyword.isReservedWordES6(id, strict)` +### `keyword.isReservedWordES6(id, strict)` Returns `true` if provided identifier string is a `ReservedWord` in ECMA262 edition 6. They are formally defined in ECMA262 section [11.6.2](http://ecma-international.org/ecma-262/6.0/#sec-reserved-words). If the `strict` flag is truthy, this function additionally checks whether `id` is a `ReservedWord` under strict mode. -### `keyword.isRestrictedWord(id)` +### `keyword.isRestrictedWord(id)` Returns `true` if provided identifier string is one of `eval` or `arguments`. They are restricted in strict mode code throughout ECMA262 edition 5.1 and in ECMA262 edition 6 section [12.1.1](http://ecma-international.org/ecma-262/6.0/#sec-identifiers-static-semantics-early-errors). -### `keyword.isIdentifierNameES5(id)` +### `keyword.isIdentifierNameES5(id)` Return `true` if provided identifier string is an `IdentifierName` as specified in ECMA262 edition 5.1 section [7.6](https://es5.github.io/#x7.6). -### `keyword.isIdentifierNameES6(id)` +### `keyword.isIdentifierNameES6(id)` Return `true` if provided identifier string is an `IdentifierName` as specified in ECMA262 edition 6 section [11.6](http://ecma-international.org/ecma-262/6.0/#sec-names-and-keywords). -### `keyword.isIdentifierES5(id, strict)` +### `keyword.isIdentifierES5(id, strict)` Return `true` if provided identifier string is an `Identifier` as specified in -ECMA262 edition 5.1 section [7.6](https://es5.github.io/#x7.6). -If the `strict` flag is truthy, this function additionally checks whether `id` +ECMA262 edition 5.1 section [7.6](https://es5.github.io/#x7.6). +If the `strict` flag is truthy, this function additionally checks whether `id` is an `Identifier` under strict mode. -### `keyword.isIdentifierES6(id, strict)` +### `keyword.isIdentifierES6(id, strict)` Return `true` if provided identifier string is an `Identifier` as specified in ECMA262 edition 6 section [12.1](http://ecma-international.org/ecma-262/6.0/#sec-identifiers). diff --git a/lib/ast.js b/lib/ast.js deleted file mode 100644 index 8faadae..0000000 --- a/lib/ast.js +++ /dev/null @@ -1,144 +0,0 @@ -/* - Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -(function () { - 'use strict'; - - function isExpression(node) { - if (node == null) { return false; } - switch (node.type) { - case 'ArrayExpression': - case 'AssignmentExpression': - case 'BinaryExpression': - case 'CallExpression': - case 'ConditionalExpression': - case 'FunctionExpression': - case 'Identifier': - case 'Literal': - case 'LogicalExpression': - case 'MemberExpression': - case 'NewExpression': - case 'ObjectExpression': - case 'SequenceExpression': - case 'ThisExpression': - case 'UnaryExpression': - case 'UpdateExpression': - return true; - } - return false; - } - - function isIterationStatement(node) { - if (node == null) { return false; } - switch (node.type) { - case 'DoWhileStatement': - case 'ForInStatement': - case 'ForStatement': - case 'WhileStatement': - return true; - } - return false; - } - - function isStatement(node) { - if (node == null) { return false; } - switch (node.type) { - case 'BlockStatement': - case 'BreakStatement': - case 'ContinueStatement': - case 'DebuggerStatement': - case 'DoWhileStatement': - case 'EmptyStatement': - case 'ExpressionStatement': - case 'ForInStatement': - case 'ForStatement': - case 'IfStatement': - case 'LabeledStatement': - case 'ReturnStatement': - case 'SwitchStatement': - case 'ThrowStatement': - case 'TryStatement': - case 'VariableDeclaration': - case 'WhileStatement': - case 'WithStatement': - return true; - } - return false; - } - - function isSourceElement(node) { - return isStatement(node) || node != null && node.type === 'FunctionDeclaration'; - } - - function trailingStatement(node) { - switch (node.type) { - case 'IfStatement': - if (node.alternate != null) { - return node.alternate; - } - return node.consequent; - - case 'LabeledStatement': - case 'ForStatement': - case 'ForInStatement': - case 'WhileStatement': - case 'WithStatement': - return node.body; - } - return null; - } - - function isProblematicIfStatement(node) { - var current; - - if (node.type !== 'IfStatement') { - return false; - } - if (node.alternate == null) { - return false; - } - current = node.consequent; - do { - if (current.type === 'IfStatement') { - if (current.alternate == null) { - return true; - } - } - current = trailingStatement(current); - } while (current); - - return false; - } - - module.exports = { - isExpression: isExpression, - isStatement: isStatement, - isIterationStatement: isIterationStatement, - isSourceElement: isSourceElement, - isProblematicIfStatement: isProblematicIfStatement, - - trailingStatement: trailingStatement - }; -}()); -/* vim: set sw=4 ts=4 et tw=80 : */ diff --git a/lib/code.js b/lib/code.js deleted file mode 100644 index 23136af..0000000 --- a/lib/code.js +++ /dev/null @@ -1,135 +0,0 @@ -/* - Copyright (C) 2013-2014 Yusuke Suzuki <utatane.tea@gmail.com> - Copyright (C) 2014 Ivan Nikulin <ifaaan@gmail.com> - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -(function () { - 'use strict'; - - var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch; - - // See `tools/generate-identifier-regex.js`. - ES5Regex = { - // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierStart: - NonAsciiIdentifierStart: /[\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-\u1884\u1887-\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\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\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\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\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]/, - // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierPart: - NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\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\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\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\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/ - }; - - ES6Regex = { - // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierStart: - NonAsciiIdentifierStart: /[\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]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/, - // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierPart: - NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\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\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\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\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\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-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ - }; - - function isDecimalDigit(ch) { - return 0x30 <= ch && ch <= 0x39; // 0..9 - } - - function isHexDigit(ch) { - return 0x30 <= ch && ch <= 0x39 || // 0..9 - 0x61 <= ch && ch <= 0x66 || // a..f - 0x41 <= ch && ch <= 0x46; // A..F - } - - function isOctalDigit(ch) { - return ch >= 0x30 && ch <= 0x37; // 0..7 - } - - // 7.2 White Space - - NON_ASCII_WHITESPACES = [ - 0x1680, - 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, - 0x202F, 0x205F, - 0x3000, - 0xFEFF - ]; - - function isWhiteSpace(ch) { - return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || - ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0; - } - - // 7.3 Line Terminators - - function isLineTerminator(ch) { - return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029; - } - - // 7.6 Identifier Names and Identifiers - - function fromCodePoint(cp) { - if (cp <= 0xFFFF) { return String.fromCharCode(cp); } - var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800); - var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00); - return cu1 + cu2; - } - - IDENTIFIER_START = new Array(0x80); - for(ch = 0; ch < 0x80; ++ch) { - IDENTIFIER_START[ch] = - ch >= 0x61 && ch <= 0x7A || // a..z - ch >= 0x41 && ch <= 0x5A || // A..Z - ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) - } - - IDENTIFIER_PART = new Array(0x80); - for(ch = 0; ch < 0x80; ++ch) { - IDENTIFIER_PART[ch] = - ch >= 0x61 && ch <= 0x7A || // a..z - ch >= 0x41 && ch <= 0x5A || // A..Z - ch >= 0x30 && ch <= 0x39 || // 0..9 - ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) - } - - function isIdentifierStartES5(ch) { - return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); - } - - function isIdentifierPartES5(ch) { - return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); - } - - function isIdentifierStartES6(ch) { - return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); - } - - function isIdentifierPartES6(ch) { - return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); - } - - module.exports = { - isDecimalDigit: isDecimalDigit, - isHexDigit: isHexDigit, - isOctalDigit: isOctalDigit, - isWhiteSpace: isWhiteSpace, - isLineTerminator: isLineTerminator, - isIdentifierStartES5: isIdentifierStartES5, - isIdentifierPartES5: isIdentifierPartES5, - isIdentifierStartES6: isIdentifierStartES6, - isIdentifierPartES6: isIdentifierPartES6 - }; -}()); -/* vim: set sw=4 ts=4 et tw=80 : */ diff --git a/package.json b/package.json index cebdd1b..05c6aff 100644 --- a/package.json +++ b/package.json @@ -2,43 +2,74 @@ "name": "esutils", "description": "utility box for ECMAScript language tools", "homepage": "https://github.com/estools/esutils", - "main": "lib/utils.js", + "bugs": "https://github.com/estools/esutils/issues", + "main": "./dist/esutils.min.js", + "exports": { + "import": "./dist/esutils.esm.min.js", + "require": "./dist/esutils.min.js" + }, "version": "2.0.4-dev", "engines": { "node": ">=0.10.0" }, "directories": { - "lib": "./lib" + "lib": "./dist" }, "files": [ "LICENSE.BSD", "README.md", - "lib" + "dist" + ], + "keywords": [ + "ecmascript" ], - "maintainers": [ - { - "name": "Yusuke Suzuki", - "email": "utatane.tea@gmail.com", - "web": "http://github.com/Constellation" - } + "author": { + "name": "Yusuke Suzuki", + "email": "utatane.tea@gmail.com", + "web": "http://github.com/Constellation" + }, + "contributors": [ + "Brett Zamir" ], "repository": { "type": "git", "url": "http://github.com/estools/esutils.git" }, + "dependencies": {}, "devDependencies": { - "chai": "~1.7.2", - "coffee-script": "~1.6.3", - "jshint": "2.6.3", - "mocha": "~2.2.1", - "regenerate": "~1.3.1", - "unicode-9.0.0": "~0.7.0" + "@babel/core": "^7.17.9", + "@babel/preset-env": "^7.16.11", + "@babel/register": "^7.17.7", + "@rollup/plugin-babel": "^5.3.1", + "chai": "~4.3.6", + "coffeescript": "^2.6.1", + "eslint": "^8.12.0", + "mocha": "~9.2.2", + "nyc": "^15.1.0", + "regenerate": "~1.4.2", + "rollup": "^2.70.1", + "rollup-plugin-terser": "^7.0.2", + "unicode-13.0.0": "^0.8.0" }, "license": "BSD-2-Clause", + "nyc": { + "branches": 100, + "lines": 100, + "functions": 100, + "statements": 100, + "reporter": [ + "html", + "text" + ], + "exclude": [ + "test" + ] + }, "scripts": { - "test": "npm run-script lint && npm run-script unit-test", - "lint": "jshint lib/*.js", - "unit-test": "mocha --compilers coffee:coffee-script -R spec", + "build": "rollup -c", + "test": "npm run lint && npm run unit-test", + "lint": "eslint .", + "unit-test": "nyc mocha --require @babel/register --require chai/register-expect.js --require coffeescript/register.js test/**", "generate-regex": "node tools/generate-identifier-regex.js" } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..6c348fe --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,45 @@ +import { terser } from 'rollup-plugin-terser'; + +import babel from '@rollup/plugin-babel'; + +/** + * @external RollupConfig + * @type {PlainObject} + * @see {@link https://rollupjs.org/guide/en#big-list-of-options} + */ + +/** + * @param {PlainObject} [config= {}] + * @param {boolean} [config.minifying=false] + * @param {string} [config.format='umd'] + * @returns {external:RollupConfig} + */ +function getRollupObject ({ minifying, format = 'umd' } = {}) { + const nonMinified = { + input: 'src/utils.js', + output: { + format, + sourcemap: minifying, + file: `dist/esutils${ + format === 'umd' ? '' : `.${format}` + }${minifying ? '.min' : ''}.js`, + name: 'esutils' + }, + plugins: [ + babel({ + babelHelpers: 'bundled' + }) + ] + }; + if (minifying) { + nonMinified.plugins.push(terser()); + } + return nonMinified; +} + +export default [ + getRollupObject({ minifying: true, format: 'umd' }), + getRollupObject({ minifying: false, format: 'umd' }), + getRollupObject({ minifying: true, format: 'esm' }), + getRollupObject({ minifying: false, format: 'esm' }) +]; diff --git a/src/ast.js b/src/ast.js new file mode 100644 index 0000000..59ce678 --- /dev/null +++ b/src/ast.js @@ -0,0 +1,139 @@ +/* + Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +function isExpression(node) { + if (node == null) { return false; } + switch (node.type) { + case 'ArrayExpression': + case 'AssignmentExpression': + case 'BinaryExpression': + case 'CallExpression': + case 'ConditionalExpression': + case 'FunctionExpression': + case 'Identifier': + case 'Literal': + case 'LogicalExpression': + case 'MemberExpression': + case 'NewExpression': + case 'ObjectExpression': + case 'SequenceExpression': + case 'ThisExpression': + case 'UnaryExpression': + case 'UpdateExpression': + return true; + } + return false; +} + +function isIterationStatement(node) { + if (node == null) { return false; } + switch (node.type) { + case 'DoWhileStatement': + case 'ForInStatement': + case 'ForStatement': + case 'WhileStatement': + return true; + } + return false; +} + +function isStatement(node) { + if (node == null) { return false; } + switch (node.type) { + case 'BlockStatement': + case 'BreakStatement': + case 'ContinueStatement': + case 'DebuggerStatement': + case 'DoWhileStatement': + case 'EmptyStatement': + case 'ExpressionStatement': + case 'ForInStatement': + case 'ForStatement': + case 'IfStatement': + case 'LabeledStatement': + case 'ReturnStatement': + case 'SwitchStatement': + case 'ThrowStatement': + case 'TryStatement': + case 'VariableDeclaration': + case 'WhileStatement': + case 'WithStatement': + return true; + } + return false; +} + +function isSourceElement(node) { + return isStatement(node) || node != null && node.type === 'FunctionDeclaration'; +} + +function trailingStatement(node) { + switch (node.type) { + case 'IfStatement': + if (node.alternate != null) { + return node.alternate; + } + return node.consequent; + + case 'LabeledStatement': + case 'ForStatement': + case 'ForInStatement': + case 'WhileStatement': + case 'WithStatement': + return node.body; + } + return null; +} + +function isProblematicIfStatement(node) { + if (node.type !== 'IfStatement') { + return false; + } + if (node.alternate == null) { + return false; + } + let current = node.consequent; + do { + if (current.type === 'IfStatement') { + if (current.alternate == null) { + return true; + } + } + current = trailingStatement(current); + } while (current); + + return false; +} + +export { + isExpression, + isStatement, + isIterationStatement, + isSourceElement, + isProblematicIfStatement, + + trailingStatement +}; + +/* vim: set sw=4 ts=4 et tw=80 : */ diff --git a/src/code.js b/src/code.js new file mode 100644 index 0000000..3bb5b6b --- /dev/null +++ b/src/code.js @@ -0,0 +1,119 @@ +/* eslint-disable no-misleading-character-class */ +/* + Copyright (C) 2013-2014 Yusuke Suzuki <utatane.tea@gmail.com> + Copyright (C) 2014 Ivan Nikulin <ifaaan@gmail.com> + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +import * as ES5Regex from './es5-identifier.js'; +import * as ES6Regex from './es6-identifier.js'; + +function isDecimalDigit(ch) { + return 0x30 <= ch && ch <= 0x39; // 0..9 +} + +function isHexDigit(ch) { + return 0x30 <= ch && ch <= 0x39 || // 0..9 + 0x61 <= ch && ch <= 0x66 || // a..f + 0x41 <= ch && ch <= 0x46; // A..F +} + +function isOctalDigit(ch) { + return ch >= 0x30 && ch <= 0x37; // 0..7 +} + +// 7.2 White Space + +const NON_ASCII_WHITESPACES = [ + 0x1680, + 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, + 0x202F, 0x205F, + 0x3000, + 0xFEFF +]; + +function isWhiteSpace(ch) { + return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || + ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0; +} + +// 7.3 Line Terminators + +function isLineTerminator(ch) { + return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029; +} + +// 7.6 Identifier Names and Identifiers + +function fromCodePoint(cp) { + if (cp <= 0xFFFF) { return String.fromCharCode(cp); } + const cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800); + const cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00); + return cu1 + cu2; +} + +const IDENTIFIER_START = new Array(0x80); +for(let ch = 0; ch < 0x80; ++ch) { + IDENTIFIER_START[ch] = + ch >= 0x61 && ch <= 0x7A || // a..z + ch >= 0x41 && ch <= 0x5A || // A..Z + ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) +} + +const IDENTIFIER_PART = new Array(0x80); +for(let ch = 0; ch < 0x80; ++ch) { + IDENTIFIER_PART[ch] = + ch >= 0x61 && ch <= 0x7A || // a..z + ch >= 0x41 && ch <= 0x5A || // A..Z + ch >= 0x30 && ch <= 0x39 || // 0..9 + ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) +} + +function isIdentifierStartES5(ch) { + return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); +} + +function isIdentifierPartES5(ch) { + return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); +} + +function isIdentifierStartES6(ch) { + return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); +} + +function isIdentifierPartES6(ch) { + return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); +} + +export { + isDecimalDigit, + isHexDigit, + isOctalDigit, + isWhiteSpace, + isLineTerminator, + isIdentifierStartES5, + isIdentifierPartES5, + isIdentifierStartES6, + isIdentifierPartES6 +}; + +/* vim: set sw=4 ts=4 et tw=80 : */ diff --git a/src/es5-identifier.js b/src/es5-identifier.js new file mode 100644 index 0000000..e3145fc --- /dev/null +++ b/src/es5-identifier.js @@ -0,0 +1,9 @@ +// DO NOT EDIT -- File auto-generated from /tools/generate-identifier-regex.js + +// ECMAScript 5.1/Unicode v13.0.0 NonAsciiIdentifierStart: +const NonAsciiIdentifierStart = /[\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\u0560-\u0588\u05D0-\u05EA\u05EF-\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\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\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\u09FC\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\u0D04-\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\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\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-\u1878\u1880-\u1884\u1887-\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\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\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\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\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\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\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-\uAB69\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]/; + +// ECMAScript 5.1/Unicode v13.0.0 NonAsciiIdentifierPart: +const NonAsciiIdentifierPart = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u08D3-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\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\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF\u1AC0\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1DF9\u1DFB-\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\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/; + +export { NonAsciiIdentifierStart, NonAsciiIdentifierPart }; diff --git a/src/es6-identifier.js b/src/es6-identifier.js new file mode 100644 index 0000000..777eb82 --- /dev/null +++ b/src/es6-identifier.js @@ -0,0 +1,9 @@ +// DO NOT EDIT -- File auto-generated from /tools/generate-identifier-regex.js + +// ECMAScript 6/Unicode v13.0.0 NonAsciiIdentifierStart: +const NonAsciiIdentifierStart = /[\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\u0560-\u0588\u05D0-\u05EA\u05EF-\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\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\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\u09FC\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\u0D04-\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\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\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-\u1878\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\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF3\u1CF5\u1CF6\u1CFA\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-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\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-\uAB69\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]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDE80-\uDEA9\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF45\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD47\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC5F-\uDC61\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDEB8\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD2F\uDD3F\uDD41\uDDA0-\uDDA7\uDDAA-\uDDD0\uDDE1\uDDE3\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF50\uDF93-\uDF9F\uDFE0\uDFE1\uDFE3]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD838[\uDD00-\uDD2C\uDD37-\uDD3D\uDD4E\uDEC0-\uDEEB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43\uDD4B]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]/; + +// ECMAScript 6/Unicode v13.0.0 NonAsciiIdentifierPart: +const NonAsciiIdentifierPart = /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05EF-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u07FD\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08C7\u08D3-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u09FE\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B55-\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D81-\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E86-\u0E8A\u0E8C-\u0EA3\u0EA5\u0EA7-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\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\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1878\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1ABF\u1AC0\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CD0-\u1CD2\u1CD4-\u1CFA\u1D00-\u1DF9\u1DFB-\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\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\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-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BF\u31F0-\u31FF\u3400-\u4DBF\u4E00-\u9FFC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7BF\uA7C2-\uA7CA\uA7F5-\uA827\uA82C\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB69\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD27\uDD30-\uDD39\uDE80-\uDEA9\uDEAB\uDEAC\uDEB0\uDEB1\uDF00-\uDF1C\uDF27\uDF30-\uDF50\uDFB0-\uDFC4\uDFE0-\uDFF6]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD44-\uDD47\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDC9-\uDDCC\uDDCE-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3B-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC5E-\uDC61\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB8\uDEC0-\uDEC9\uDF00-\uDF1A\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDC00-\uDC3A\uDCA0-\uDCE9\uDCFF-\uDD06\uDD09\uDD0C-\uDD13\uDD15\uDD16\uDD18-\uDD35\uDD37\uDD38\uDD3B-\uDD43\uDD50-\uDD59\uDDA0-\uDDA7\uDDAA-\uDDD7\uDDDA-\uDDE1\uDDE3\uDDE4\uDE00-\uDE3E\uDE47\uDE50-\uDE99\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD8E\uDD90\uDD91\uDD93-\uDD98\uDDA0-\uDDA9\uDEE0-\uDEF6\uDFB0]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD822\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879\uD880-\uD883][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF4A\uDF4F-\uDF87\uDF8F-\uDF9F\uDFE0\uDFE1\uDFE3\uDFE4\uDFF0\uDFF1]|\uD821[\uDC00-\uDFF7]|\uD823[\uDC00-\uDCD5\uDD00-\uDD08]|\uD82C[\uDC00-\uDD1E\uDD50-\uDD52\uDD64-\uDD67\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A\uDD00-\uDD2C\uDD30-\uDD3D\uDD40-\uDD49\uDD4E\uDEC0-\uDEF9]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4B\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD83E[\uDFF0-\uDFF9]|\uD869[\uDC00-\uDEDD\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uD884[\uDC00-\uDF4A]|\uDB40[\uDD00-\uDDEF]/; + +export { NonAsciiIdentifierStart, NonAsciiIdentifierPart }; diff --git a/lib/keyword.js b/src/keyword.js similarity index 51% rename from lib/keyword.js rename to src/keyword.js index 13c8c6a..8e329c2 100644 --- a/lib/keyword.js +++ b/src/keyword.js @@ -22,13 +22,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -(function () { - 'use strict'; +import * as code from './code.js'; - var code = require('./code'); - - function isStrictModeReservedWordES6(id) { - switch (id) { +function isStrictModeReservedWordES6(id) { + switch (id) { case 'implements': case 'interface': case 'package': @@ -40,23 +37,15 @@ return true; default: return false; - } } +} - function isKeywordES5(id, strict) { - // yield should not be treated as keyword under non-strict mode. - if (!strict && id === 'yield') { - return false; - } - return isKeywordES6(id, strict); +function isKeywordES6(id, strict) { + if (strict && isStrictModeReservedWordES6(id)) { + return true; } - function isKeywordES6(id, strict) { - if (strict && isStrictModeReservedWordES6(id)) { - return true; - } - - switch (id.length) { + switch (id.length) { case 2: return (id === 'if') || (id === 'in') || (id === 'do'); case 3: @@ -79,87 +68,91 @@ return (id === 'instanceof'); default: return false; - } } +} - function isReservedWordES5(id, strict) { - return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict); +function isKeywordES5(id, strict) { + // yield should not be treated as keyword under non-strict mode. + if (!strict && id === 'yield') { + return false; } + return isKeywordES6(id, strict); +} - function isReservedWordES6(id, strict) { - return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict); - } +function isReservedWordES5(id, strict) { + return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict); +} - function isRestrictedWord(id) { - return id === 'eval' || id === 'arguments'; - } +function isReservedWordES6(id, strict) { + return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict); +} - function isIdentifierNameES5(id) { - var i, iz, ch; +function isRestrictedWord(id) { + return id === 'eval' || id === 'arguments'; +} - if (id.length === 0) { return false; } +function isIdentifierNameES5(id) { + if (id.length === 0) { return false; } - ch = id.charCodeAt(0); - if (!code.isIdentifierStartES5(ch)) { - return false; - } - - for (i = 1, iz = id.length; i < iz; ++i) { - ch = id.charCodeAt(i); - if (!code.isIdentifierPartES5(ch)) { - return false; - } - } - return true; + const ch = id.charCodeAt(0); + if (!code.isIdentifierStartES5(ch)) { + return false; } - function decodeUtf16(lead, trail) { - return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; + for (let i = 1, iz = id.length; i < iz; ++i) { + const ch = id.charCodeAt(i); + if (!code.isIdentifierPartES5(ch)) { + return false; + } } - - function isIdentifierNameES6(id) { - var i, iz, ch, lowCh, check; - - if (id.length === 0) { return false; } - - check = code.isIdentifierStartES6; - for (i = 0, iz = id.length; i < iz; ++i) { - ch = id.charCodeAt(i); - if (0xD800 <= ch && ch <= 0xDBFF) { - ++i; - if (i >= iz) { return false; } - lowCh = id.charCodeAt(i); - if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) { - return false; - } - ch = decodeUtf16(ch, lowCh); - } - if (!check(ch)) { + return true; +} + +function decodeUtf16(lead, trail) { + return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; +} + +function isIdentifierNameES6(id) { + if (id.length === 0) { return false; } + + let check = code.isIdentifierStartES6; + for (let i = 0, iz = id.length; i < iz; ++i) { + let ch = id.charCodeAt(i); + if (0xD800 <= ch && ch <= 0xDBFF) { + ++i; + if (i >= iz) { return false; } + const lowCh = id.charCodeAt(i); + if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) { return false; } - check = code.isIdentifierPartES6; + ch = decodeUtf16(ch, lowCh); } - return true; - } - - function isIdentifierES5(id, strict) { - return isIdentifierNameES5(id) && !isReservedWordES5(id, strict); - } - - function isIdentifierES6(id, strict) { - return isIdentifierNameES6(id) && !isReservedWordES6(id, strict); + if (!check(ch)) { + return false; + } + check = code.isIdentifierPartES6; } + return true; +} + +function isIdentifierES5(id, strict) { + return isIdentifierNameES5(id) && !isReservedWordES5(id, strict); +} + +function isIdentifierES6(id, strict) { + return isIdentifierNameES6(id) && !isReservedWordES6(id, strict); +} + +export { + isKeywordES5, + isKeywordES6, + isReservedWordES5, + isReservedWordES6, + isRestrictedWord, + isIdentifierNameES5, + isIdentifierNameES6, + isIdentifierES5, + isIdentifierES6 +}; - module.exports = { - isKeywordES5: isKeywordES5, - isKeywordES6: isKeywordES6, - isReservedWordES5: isReservedWordES5, - isReservedWordES6: isReservedWordES6, - isRestrictedWord: isRestrictedWord, - isIdentifierNameES5: isIdentifierNameES5, - isIdentifierNameES6: isIdentifierNameES6, - isIdentifierES5: isIdentifierES5, - isIdentifierES6: isIdentifierES6 - }; -}()); /* vim: set sw=4 ts=4 et tw=80 : */ diff --git a/lib/utils.js b/src/utils.js similarity index 80% rename from lib/utils.js rename to src/utils.js index ce18faa..d664ac2 100644 --- a/lib/utils.js +++ b/src/utils.js @@ -23,11 +23,17 @@ */ -(function () { - 'use strict'; +import * as ast from './ast.js'; +import * as code from './code.js'; +import * as keyword from './keyword.js'; + +export { ast, code, keyword }; + +/* +// This syntax is shown on MDN, but not recognized by ESLint parser +export * as ast from './ast.js'; +export * as code from './code.js'; +export * as keyword from './keyword.js'; +*/ - exports.ast = require('./ast'); - exports.code = require('./code'); - exports.keyword = require('./keyword'); -}()); /* vim: set sw=4 ts=4 et tw=80 : */ diff --git a/test/ast.coffee b/test/ast.coffee deleted file mode 100644 index 021a7cd..0000000 --- a/test/ast.coffee +++ /dev/null @@ -1,175 +0,0 @@ -# Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -'use strict' - -expect = require('chai').expect -esutils = require '../' - -EMPTY = {type: 'EmptyStatement'} - -describe 'ast', -> - describe 'isExpression', -> - it 'returns false if input is not node', -> - expect(esutils.ast.isExpression(0)).to.be.false - expect(esutils.ast.isExpression(null)).to.be.false - expect(esutils.ast.isExpression(undefined)).to.be.false - expect(esutils.ast.isExpression({})).to.be.false - expect(esutils.ast.isExpression({type: null})).to.be.false - expect(esutils.ast.isExpression({type: undefined})).to.be.false - - it 'returns true if provided node is expression', -> - expect(esutils.ast.isExpression({type: "ThisExpression"})).to.be.true - expect(esutils.ast.isExpression({type: "Literal", value: 0})).to.be.true - - it 'returns false if provided node is not expression', -> - expect(esutils.ast.isExpression({type: "ExpressionStatement"})).to.be.false - expect(esutils.ast.isExpression({type: "Program"})).to.be.false - - - describe 'isIterationStatement', -> - it 'returns false if input is not node', -> - expect(esutils.ast.isIterationStatement(0)).to.be.false - expect(esutils.ast.isIterationStatement(null)).to.be.false - expect(esutils.ast.isIterationStatement(undefined)).to.be.false - expect(esutils.ast.isIterationStatement({})).to.be.false - expect(esutils.ast.isIterationStatement({type: null})).to.be.false - expect(esutils.ast.isIterationStatement({type: undefined})).to.be.false - - it 'returns true if provided node is iteration statement', -> - expect(esutils.ast.isIterationStatement({type: "ForInStatement"})).to.be.true - expect(esutils.ast.isIterationStatement({type: "DoWhileStatement"})).to.be.true - - it 'returns false if provided node is not iteration statement', -> - expect(esutils.ast.isIterationStatement({type: "ExpressionStatement"})).to.be.false - expect(esutils.ast.isIterationStatement({type: "ThisExpression"})).to.be.false - - - describe 'isStatement', -> - it 'returns false if input is not node', -> - expect(esutils.ast.isStatement(0)).to.be.false - expect(esutils.ast.isStatement(null)).to.be.false - expect(esutils.ast.isStatement(undefined)).to.be.false - expect(esutils.ast.isStatement({})).to.be.false - expect(esutils.ast.isStatement({type: null})).to.be.false - expect(esutils.ast.isStatement({type: undefined})).to.be.false - - it 'returns true if provided node is statement', -> - expect(esutils.ast.isStatement({type: "ExpressionStatement"})).to.be.true - expect(esutils.ast.isStatement({type: "WhileStatement"})).to.be.true - - it 'returns false if provided node is not statement', -> - expect(esutils.ast.isStatement({type: "ThisExpression"})).to.be.false - expect(esutils.ast.isStatement({type: "FunctionDeclaration"})).to.be.false - expect(esutils.ast.isStatement({type: "Program"})).to.be.false - - - describe 'isSourceElement', -> - it 'returns false if input is not node', -> - expect(esutils.ast.isSourceElement(0)).to.be.false - expect(esutils.ast.isSourceElement(null)).to.be.false - expect(esutils.ast.isSourceElement(undefined)).to.be.false - expect(esutils.ast.isSourceElement({})).to.be.false - expect(esutils.ast.isSourceElement({type: null})).to.be.false - expect(esutils.ast.isSourceElement({type: undefined})).to.be.false - - it 'returns true if provided node is source element', -> - expect(esutils.ast.isSourceElement({type: "ExpressionStatement"})).to.be.true - expect(esutils.ast.isSourceElement({type: "WhileStatement"})).to.be.true - expect(esutils.ast.isSourceElement({type: "FunctionDeclaration"})).to.be.true - - it 'returns false if provided node is not source element', -> - expect(esutils.ast.isSourceElement({type: "ThisExpression"})).to.be.false - expect(esutils.ast.isSourceElement({type: "Program"})).to.be.false - - describe 'trailingStatement', -> - it 'returns trailing statement if node has it', -> - expect(esutils.ast.trailingStatement({type: 'WhileStatement', body: EMPTY})).to.be.eq EMPTY - expect(esutils.ast.trailingStatement({type: 'WithStatement', body: EMPTY})).to.be.eq EMPTY - expect(esutils.ast.trailingStatement({type: 'ForStatement', body: EMPTY})).to.be.eq EMPTY - expect(esutils.ast.trailingStatement({type: 'ForInStatement', body: EMPTY})).to.be.eq EMPTY - expect(esutils.ast.trailingStatement({type: 'IfStatement', consequent: EMPTY})).to.be.eq EMPTY - expect(esutils.ast.trailingStatement({type: 'IfStatement', consequent: {type:'EmptyStatement'}, alternate: EMPTY})).to.be.eq EMPTY - expect(esutils.ast.trailingStatement({type: 'LabeledStatement', body: EMPTY})).to.be.eq EMPTY - - it 'returns null if node doens\'t have trailing statement', -> - expect(esutils.ast.trailingStatement({type: 'DoWhileStatement', body: EMPTY})).to.be.null - expect(esutils.ast.trailingStatement({type: 'ReturnStatement' })).to.be.null - - describe 'isProblematicIfStatement', -> - it 'returns true if node is problematic if statement', -> - expect(esutils.ast.isProblematicIfStatement( - type: 'IfStatement' - consequent: { - type: 'IfStatement' - consequent: EMPTY - } - alternate: EMPTY - )).to.be.true - - expect(esutils.ast.isProblematicIfStatement( - type: 'IfStatement' - consequent: - type: 'LabeledStatement' - body: - type: 'IfStatement' - consequent: EMPTY - alternate: EMPTY - )).to.be.true - - expect(esutils.ast.isProblematicIfStatement( - type: 'IfStatement' - consequent: - type: 'WithStatement' - body: - type: 'IfStatement' - consequent: EMPTY - alternate: EMPTY - )).to.be.true - - it 'returns false if node is not problematic if statement', -> - expect(esutils.ast.isProblematicIfStatement( - type: 'IfStatement' - consequent: EMPTY - alternate: EMPTY - )).to.be.false - - expect(esutils.ast.isProblematicIfStatement( - type: 'IfStatement' - consequent: - type: 'BlockStatement' - body: [ - type: 'IfStatement' - consequent: EMPTY - ] - alternate: EMPTY - )).to.be.false - - expect(esutils.ast.isProblematicIfStatement( - type: 'IfStatement' - consequent: - type: 'DoWhileStatement' - body: - type: 'IfStatement' - consequent: EMPTY - alternate: EMPTY - )).to.be.false diff --git a/test/ast.js b/test/ast.js new file mode 100644 index 0000000..aff510b --- /dev/null +++ b/test/ast.js @@ -0,0 +1,311 @@ +/* +Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +import * as esutils from '../src/utils.js'; + +const EMPTY = { + type: 'EmptyStatement' +}; + +describe('ast', function() { + describe('isExpression', function() { + it('returns false if input is not node', function() { + expect(esutils.ast.isExpression(0)).to.be.false; + expect(esutils.ast.isExpression(null)).to.be.false; + expect(esutils.ast.isExpression(void 0)).to.be.false; + expect(esutils.ast.isExpression({})).to.be.false; + expect(esutils.ast.isExpression({ + type: null + })).to.be.false; + expect(esutils.ast.isExpression({ + type: void 0 + })).to.be.false; + }); + + it('returns true if provided node is expression', function() { + expect(esutils.ast.isExpression({ + type: 'ArrayExpression' + })).to.be.true; + expect(esutils.ast.isExpression({ + type: 'ThisExpression' + })).to.be.true; + expect(esutils.ast.isExpression({ + type: 'Literal', + value: 0 + })).to.be.true; + }); + + it('returns false if provided node is not expression', function() { + expect(esutils.ast.isExpression({ + type: 'ExpressionStatement' + })).to.be.false; + + expect(esutils.ast.isExpression({ + type: 'Program' + })).to.be.false; + }); + }); + describe('isIterationStatement', function() { + it('returns false if input is not node', function() { + expect(esutils.ast.isIterationStatement(0)).to.be.false; + expect(esutils.ast.isIterationStatement(null)).to.be.false; + expect(esutils.ast.isIterationStatement(void 0)).to.be.false; + expect(esutils.ast.isIterationStatement({})).to.be.false; + expect(esutils.ast.isIterationStatement({ + type: null + })).to.be.false; + expect(esutils.ast.isIterationStatement({ + type: void 0 + })).to.be.false; + }); + it('returns true if provided node is iteration statement', function() { + expect(esutils.ast.isIterationStatement({ + type: 'ForInStatement' + })).to.be.true; + expect(esutils.ast.isIterationStatement({ + type: 'DoWhileStatement' + })).to.be.true; + }); + it('returns false if provided node is not iteration statement', function() { + expect(esutils.ast.isIterationStatement({ + type: 'ExpressionStatement' + })).to.be.false; + expect(esutils.ast.isIterationStatement({ + type: 'ThisExpression' + })).to.be.false; + }); + }); + describe('isStatement', function() { + it('returns false if input is not node', function() { + expect(esutils.ast.isStatement(0)).to.be.false; + expect(esutils.ast.isStatement(null)).to.be.false; + expect(esutils.ast.isStatement(void 0)).to.be.false; + expect(esutils.ast.isStatement({})).to.be.false; + expect(esutils.ast.isStatement({ + type: null + })).to.be.false; + expect(esutils.ast.isStatement({ + type: void 0 + })).to.be.false; + }); + it('returns true if provided node is statement', function() { + expect(esutils.ast.isStatement({ + type: 'BlockStatement' + })).to.be.true; + expect(esutils.ast.isStatement({ + type: 'ExpressionStatement' + })).to.be.true; + expect(esutils.ast.isStatement({ + type: 'WhileStatement' + })).to.be.true; + }); + it('returns false if provided node is not statement', function() { + expect(esutils.ast.isStatement({ + type: 'ThisExpression' + })).to.be.false; + expect(esutils.ast.isStatement({ + type: 'FunctionDeclaration' + })).to.be.false; + expect(esutils.ast.isStatement({ + type: 'Program' + })).to.be.false; + }); + }); + describe('isSourceElement', function() { + it('returns false if input is not node', function() { + expect(esutils.ast.isSourceElement(0)).to.be.false; + expect(esutils.ast.isSourceElement(null)).to.be.false; + expect(esutils.ast.isSourceElement(void 0)).to.be.false; + expect(esutils.ast.isSourceElement({})).to.be.false; + expect(esutils.ast.isSourceElement({ + type: null + })).to.be.false; + expect(esutils.ast.isSourceElement({ + type: void 0 + })).to.be.false; + }); + it('returns true if provided node is source element', function() { + expect(esutils.ast.isSourceElement({ + type: 'ExpressionStatement' + })).to.be.true; + expect(esutils.ast.isSourceElement({ + type: 'WhileStatement' + })).to.be.true; + expect(esutils.ast.isSourceElement({ + type: 'FunctionDeclaration' + })).to.be.true; + }); + it('returns false if provided node is not source element', function() { + expect(esutils.ast.isSourceElement({ + type: 'ThisExpression' + })).to.be.false; + expect(esutils.ast.isSourceElement({ + type: 'Program' + })).to.be.false; + }); + }); + describe('trailingStatement', function() { + it('returns trailing statement if node has it', function() { + expect(esutils.ast.trailingStatement({ + type: 'WhileStatement', + body: EMPTY + })).to.be.eq(EMPTY); + expect(esutils.ast.trailingStatement({ + type: 'WithStatement', + body: EMPTY + })).to.be.eq(EMPTY); + expect(esutils.ast.trailingStatement({ + type: 'ForStatement', + body: EMPTY + })).to.be.eq(EMPTY); + expect(esutils.ast.trailingStatement({ + type: 'ForInStatement', + body: EMPTY + })).to.be.eq(EMPTY); + expect(esutils.ast.trailingStatement({ + type: 'IfStatement', + consequent: EMPTY + })).to.be.eq(EMPTY); + expect(esutils.ast.trailingStatement({ + type: 'IfStatement', + consequent: { + type: 'EmptyStatement' + }, + alternate: EMPTY + })).to.be.eq(EMPTY); + expect(esutils.ast.trailingStatement({ + type: 'LabeledStatement', + body: EMPTY + })).to.be.eq(EMPTY); + }); + it('returns null if node doens\'t have trailing statement', function() { + expect(esutils.ast.trailingStatement({ + type: 'DoWhileStatement', + body: EMPTY + })).to.be.null; + expect(esutils.ast.trailingStatement({ + type: 'ReturnStatement' + })).to.be.null; + }); + }); + describe('isProblematicIfStatement', function() { + it('returns true if node is problematic if statement', function() { + expect(esutils.ast.isProblematicIfStatement({ + type: 'IfStatement', + consequent: { + type: 'IfStatement', + consequent: EMPTY + }, + alternate: EMPTY + })).to.be.true; + expect(esutils.ast.isProblematicIfStatement({ + type: 'IfStatement', + consequent: { + type: 'LabeledStatement', + body: { + type: 'IfStatement', + consequent: EMPTY + } + }, + alternate: EMPTY + })).to.be.true; + expect(esutils.ast.isProblematicIfStatement({ + type: 'IfStatement', + consequent: { + type: 'WithStatement', + body: { + type: 'IfStatement', + consequent: EMPTY + } + }, + alternate: EMPTY + })).to.be.true; + }); + it('returns false if node is not problematic if statement', function() { + expect(esutils.ast.isProblematicIfStatement({ + type: 'ThisExpression' + })).to.be.false; + expect(esutils.ast.isProblematicIfStatement({ + type: 'IfStatement', + consequent: EMPTY, + alternate: EMPTY + })).to.be.false; + expect(esutils.ast.isProblematicIfStatement({ + type: 'IfStatement', + consequent: { + type: 'IfStatement', + consequent: { + type: 'BlockStatement', + body: [] + }, + alternate: { + type: 'BlockStatement', + body: [] + } + }, + alternate: { + type: 'BlockStatement', + body: [] + } + })).to.be.false; + expect(esutils.ast.isProblematicIfStatement({ + type: 'IfStatement', + consequent: { + type: 'BlockStatement', + body: [ + { + type: 'IfStatement', + consequent: EMPTY + } + ] + }, + alternate: null + })).to.be.false; + expect(esutils.ast.isProblematicIfStatement({ + type: 'IfStatement', + consequent: { + type: 'BlockStatement', + body: [ + { + type: 'IfStatement', + consequent: EMPTY + } + ] + }, + alternate: EMPTY + })).to.be.false; + expect(esutils.ast.isProblematicIfStatement({ + type: 'IfStatement', + consequent: { + type: 'DoWhileStatement', + body: { + type: 'IfStatement', + consequent: EMPTY + } + }, + alternate: EMPTY + })).to.be.false; + }); + }); +}); diff --git a/test/code.coffee b/test/code.coffee deleted file mode 100644 index d0eed6f..0000000 --- a/test/code.coffee +++ /dev/null @@ -1,184 +0,0 @@ -# Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -'use strict' - -expect = require('chai').expect -esutils = require '../' - -describe 'code', -> - describe 'isDecimalDigit', -> - it 'returns true if provided code is decimal digit', -> - for ch in [0..9] - expect(esutils.code.isDecimalDigit((ch + '').charCodeAt(0))).to.be.true - - it 'returns false if provided code is not decimal digit', -> - for code in ['a'.charCodeAt(0)..'z'.charCodeAt(0)] - expect(esutils.code.isDecimalDigit(code)).to.be.false - - for code in ['A'.charCodeAt(0)..'Z'.charCodeAt(0)] - expect(esutils.code.isDecimalDigit(code)).to.be.false - - describe 'isHexDigit', -> - it 'returns true if provided code is hexadecimal digit', -> - for ch in [0..9] - expect(esutils.code.isHexDigit((ch + '').charCodeAt(0))).to.be.true - - for code in ['a'.charCodeAt(0)..'f'.charCodeAt(0)] - expect(esutils.code.isHexDigit(code)).to.be.true - - for code in ['A'.charCodeAt(0)..'F'.charCodeAt(0)] - expect(esutils.code.isHexDigit(code)).to.be.true - - it 'returns false if provided code is not hexadecimal digit', -> - for code in ['g'.charCodeAt(0)..'z'.charCodeAt(0)] - expect(esutils.code.isHexDigit(code)).to.be.false - - for code in ['G'.charCodeAt(0)..'Z'.charCodeAt(0)] - expect(esutils.code.isHexDigit(code)).to.be.false - - describe 'isOctalDigit', -> - it 'returns true if provided code is octal digit', -> - for ch in [0..7] - expect(esutils.code.isOctalDigit((ch + '').charCodeAt(0))).to.be.true - - it 'returns false if provided code is not octal digit', -> - for ch in [8..9] - expect(esutils.code.isOctalDigit((ch + '').charCodeAt(0))).to.be.false - - for code in ['a'.charCodeAt(0)..'z'.charCodeAt(0)] - expect(esutils.code.isOctalDigit(code)).to.be.false - - for code in ['A'.charCodeAt(0)..'Z'.charCodeAt(0)] - expect(esutils.code.isOctalDigit(code)).to.be.false - - describe 'isWhiteSpace', -> - it 'returns true if provided code is white space', -> - codes = [ - 0x0009 # TAB - 0x000B # VT - 0x000C # FF - 0x0020 # SP - 0x00A0 # NBSP - 0xFEFF # BOM - - # Zs - 0x1680 - 0x2000 - 0x2001 - 0x2002 - 0x2003 - 0x2004 - 0x2005 - 0x2006 - 0x2007 - 0x2008 - 0x2009 - 0x200A - 0x202F - 0x205F - 0x3000 - ] - for code in codes - expect(esutils.code.isWhiteSpace(code)).to.be.true - - expect(esutils.code.isWhiteSpace(0x180E)).to.be.false - - it 'returns false if provided code is not white space', -> - for ch in [0..9] - expect(esutils.code.isWhiteSpace((ch + '').charCodeAt(0))).to.be.false - - for code in ['a'.charCodeAt(0)..'z'.charCodeAt(0)] - expect(esutils.code.isWhiteSpace(code)).to.be.false - - for code in ['A'.charCodeAt(0)..'Z'.charCodeAt(0)] - expect(esutils.code.isWhiteSpace(code)).to.be.false - - describe 'isLineTerminator', -> - it 'returns true if provided code is line terminator', -> - codes = [ - 0x000A - 0x000D - 0x2028 - 0x2029 - ] - for code in codes - expect(esutils.code.isLineTerminator(code)).to.be.true - - it 'returns false if provided code is not line terminator', -> - for ch in [0..9] - expect(esutils.code.isLineTerminator((ch + '').charCodeAt(0))).to.be.false - - for code in ['a'.charCodeAt(0)..'z'.charCodeAt(0)] - expect(esutils.code.isLineTerminator(code)).to.be.false - - for code in ['A'.charCodeAt(0)..'Z'.charCodeAt(0)] - expect(esutils.code.isLineTerminator(code)).to.be.false - - describe 'isIdentifierStartES5', -> - it 'returns true if provided code can be a start of Identifier in ES5', -> - characters = ['a', '_', '$', 'ゆ'] - for code in characters.map((ch) -> ch.charCodeAt(0)) - expect(esutils.code.isIdentifierStartES5(code)).to.be.true - - it 'returns false if provided code cannot be a start of Identifier in ES5', -> - for ch in [0..9] - expect(esutils.code.isIdentifierStartES5((ch + '').charCodeAt(0))).to.be.false - - describe 'isIdentifierPartES5', -> - it 'returns true if provided code can be a part of Identifier in ES5', -> - characters = ['a', '_', '$', 'ゆ'] - for code in characters.map((ch) -> ch.charCodeAt(0)) - expect(esutils.code.isIdentifierPartES5(code)).to.be.true - - for ch in [0..9] - expect(esutils.code.isIdentifierPartES5((ch + '').charCodeAt(0))).to.be.true - - it 'returns false if provided code cannot be a part of Identifier in ES5', -> - expect(esutils.code.isIdentifierPartES5('+'.charCodeAt(0))).to.be.false - expect(esutils.code.isIdentifierPartES5('-'.charCodeAt(0))).to.be.false - - describe 'isIdentifierStartES6', -> - it 'returns true if provided code can be a start of Identifier in ES6', -> - characters = ['a', '_', '$', 'ゆ', '\u0AF9'] - for code in characters.map((ch) -> ch.charCodeAt(0)) - expect(esutils.code.isIdentifierStartES6(code)).to.be.true - - it 'returns false if provided code cannot be a start of Identifier in ES6', -> - for ch in [0..9] - expect(esutils.code.isIdentifierStartES6((ch + '').charCodeAt(0))).to.be.false - - describe 'isIdentifierPartES6', -> - it 'returns true if provided code can be a part of Identifier in ES6', -> - characters = ['a', '_', '$', 'ゆ'] - for code in characters.map((ch) -> ch.charCodeAt(0)) - expect(esutils.code.isIdentifierPartES6(code)).to.be.true - - for ch in [0..9] - expect(esutils.code.isIdentifierPartES6((ch + '').charCodeAt(0))).to.be.true - - it 'supports astral symbols', -> - expect(esutils.code.isIdentifierPartES6(0xE01D5)).to.be.true - - it 'returns false if provided code cannot be a part of Identifier in ES6', -> - expect(esutils.code.isIdentifierPartES6('+'.charCodeAt(0))).to.be.false - expect(esutils.code.isIdentifierPartES6('-'.charCodeAt(0))).to.be.false diff --git a/test/code.js b/test/code.js new file mode 100644 index 0000000..c462b0e --- /dev/null +++ b/test/code.js @@ -0,0 +1,266 @@ +/* +Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +import * as esutils from '../src/utils.js'; + +describe('code', function() { + describe('isDecimalDigit', function() { + it('returns true if provided code is decimal digit', function() { + const results = []; + for (let ch = 0, i = 0; i <= 9; ch = ++i) { + results.push(expect(esutils.code.isDecimalDigit((String(ch)).charCodeAt(0))).to.be.true); + } + return results; + }); + + it('returns false if provided code is not decimal digit', function() { + let code, i, ref, ref1; + for (code = i = ref = 'a'.charCodeAt(0), ref1 = 'z'.charCodeAt(0); (ref <= ref1 ? i <= ref1 : i >= ref1); code = ref <= ref1 ? ++i : --i) { + expect(esutils.code.isDecimalDigit(code)).to.be.false; + } + const results = []; + + let j, ref2, ref3; + for (code = j = ref2 = 'A'.charCodeAt(0), ref3 = 'Z'.charCodeAt(0); (ref2 <= ref3 ? j <= ref3 : j >= ref3); code = ref2 <= ref3 ? ++j : --j) { + results.push(expect(esutils.code.isDecimalDigit(code)).to.be.false); + } + return results; + }); + }); + describe('isHexDigit', function() { + it('returns true if provided code is hexadecimal digit', function() { + for (let ch = 0, i = 0; i <= 9; ch = ++i) { + expect(esutils.code.isHexDigit((String(ch)).charCodeAt(0))).to.be.true; + } + let j, ref, ref1, code; + for (code = j = ref = 'a'.charCodeAt(0), ref1 = 'f'.charCodeAt(0); (ref <= ref1 ? j <= ref1 : j >= ref1); code = ref <= ref1 ? ++j : --j) { + expect(esutils.code.isHexDigit(code)).to.be.true; + } + const results = []; + let k, ref2, ref3; + for (code = k = ref2 = 'A'.charCodeAt(0), ref3 = 'F'.charCodeAt(0); (ref2 <= ref3 ? k <= ref3 : k >= ref3); code = ref2 <= ref3 ? ++k : --k) { + results.push(expect(esutils.code.isHexDigit(code)).to.be.true); + } + return results; + }); + + it('returns false if provided code is not hexadecimal digit', function() { + let code, i, ref, ref1; + for (code = i = ref = 'g'.charCodeAt(0), ref1 = 'z'.charCodeAt(0); (ref <= ref1 ? i <= ref1 : i >= ref1); code = ref <= ref1 ? ++i : --i) { + expect(esutils.code.isHexDigit(code)).to.be.false; + } + const results = []; + let j, ref2, ref3; + for (code = j = ref2 = 'G'.charCodeAt(0), ref3 = 'Z'.charCodeAt(0); (ref2 <= ref3 ? j <= ref3 : j >= ref3); code = ref2 <= ref3 ? ++j : --j) { + results.push(expect(esutils.code.isHexDigit(code)).to.be.false); + } + return results; + }); + }); + describe('isOctalDigit', function() { + it('returns true if provided code is octal digit', function() { + const results = []; + for (let ch = 0, i = 0; i <= 7; ch = ++i) { + results.push(expect(esutils.code.isOctalDigit((String(ch)).charCodeAt(0))).to.be.true); + } + return results; + }); + + it('returns false if provided code is not octal digit', function() { + for (let ch = 8, i = 8; i <= 9; ch = ++i) { + expect(esutils.code.isOctalDigit((String(ch)).charCodeAt(0))).to.be.false; + } + let code, j, ref, ref1; + for (code = j = ref = 'a'.charCodeAt(0), ref1 = 'z'.charCodeAt(0); (ref <= ref1 ? j <= ref1 : j >= ref1); code = ref <= ref1 ? ++j : --j) { + expect(esutils.code.isOctalDigit(code)).to.be.false; + } + const results = []; + let k, ref2, ref3; + for (code = k = ref2 = 'A'.charCodeAt(0), ref3 = 'Z'.charCodeAt(0); (ref2 <= ref3 ? k <= ref3 : k >= ref3); code = ref2 <= ref3 ? ++k : --k) { + results.push(expect(esutils.code.isOctalDigit(code)).to.be.false); + } + return results; + }); + }); + describe('isWhiteSpace', function() { + it('returns true if provided code is white space', function() { + const codes = [ + 0x0009, // TAB + 0x000B, // VT + 0x000C, // FF + 0x0020, // SP + 0x00A0, // NBSP + 0xFEFF, // BOM + + // Zs + 0x1680, + 0x2000, + 0x2001, + 0x2002, + 0x2003, + 0x2004, + 0x2005, + 0x2006, + 0x2007, + 0x2008, + 0x2009, + 0x200A, + 0x202F, + 0x205F, + 0x3000 + ]; + for (const code of codes) { + expect(esutils.code.isWhiteSpace(code)).to.be.true; + } + expect(esutils.code.isWhiteSpace(0x180E)).to.be.false; + }); + + it('returns false if provided code is not white space', function() { + for (let ch = 0, i = 0; i <= 9; ch = ++i) { + expect(esutils.code.isWhiteSpace((String(ch)).charCodeAt(0))).to.be.false; + } + let code, j, ref, ref1; + for (code = j = ref = 'a'.charCodeAt(0), ref1 = 'z'.charCodeAt(0); (ref <= ref1 ? j <= ref1 : j >= ref1); code = ref <= ref1 ? ++j : --j) { + expect(esutils.code.isWhiteSpace(code)).to.be.false; + } + const results = []; + let k, ref2, ref3; + for (code = k = ref2 = 'A'.charCodeAt(0), ref3 = 'Z'.charCodeAt(0); (ref2 <= ref3 ? k <= ref3 : k >= ref3); code = ref2 <= ref3 ? ++k : --k) { + results.push(expect(esutils.code.isWhiteSpace(code)).to.be.false); + } + return results; + }); + }); + describe('isLineTerminator', function() { + it('returns true if provided code is line terminator', function() { + const codes = [0x000A, 0x000D, 0x2028, 0x2029]; + const results = []; + for (const code of codes) { + results.push(expect(esutils.code.isLineTerminator(code)).to.be.true); + } + return results; + }); + + it('returns false if provided code is not line terminator', function() { + for (let ch = 0, i = 0; i <= 9; ch = ++i) { + expect(esutils.code.isLineTerminator((String(ch)).charCodeAt(0))).to.be.false; + } + let code, j, ref, ref1; + for (code = j = ref = 'a'.charCodeAt(0), ref1 = 'z'.charCodeAt(0); (ref <= ref1 ? j <= ref1 : j >= ref1); code = ref <= ref1 ? ++j : --j) { + expect(esutils.code.isLineTerminator(code)).to.be.false; + } + const results = []; + let k, ref2, ref3; + for (code = k = ref2 = 'A'.charCodeAt(0), ref3 = 'Z'.charCodeAt(0); (ref2 <= ref3 ? k <= ref3 : k >= ref3); code = ref2 <= ref3 ? ++k : --k) { + results.push(expect(esutils.code.isLineTerminator(code)).to.be.false); + } + return results; + }); + }); + describe('isIdentifierStartES5', function() { + it('returns true if provided code can be a start of Identifier in ES5', function() { + const characters = ['a', '_', '$', 'ゆ']; + const ref = characters.map(function(ch) { + return ch.charCodeAt(0); + }); + const results = []; + for (const code of ref) { + results.push(expect(esutils.code.isIdentifierStartES5(code)).to.be.true); + } + return results; + }); + it('returns false if provided code cannot be a start of Identifier in ES5', function() { + const results = []; + for (let ch = 0, i = 0; i <= 9; ch = ++i) { + results.push(expect(esutils.code.isIdentifierStartES5((String(ch)).charCodeAt(0))).to.be.false); + } + return results; + }); + }); + describe('isIdentifierPartES5', function() { + it('returns true if provided code can be a part of Identifier in ES5', function() { + const characters = ['a', '_', '$', 'ゆ']; + const ref = characters.map(function(ch) { + return ch.charCodeAt(0); + }); + for (const code of ref) { + expect(esutils.code.isIdentifierPartES5(code)).to.be.true; + } + const results = []; + for (let ch = 0, j = 0; j <= 9; ch = ++j) { + results.push(expect(esutils.code.isIdentifierPartES5((String(ch)).charCodeAt(0))).to.be.true); + } + return results; + }); + it('returns false if provided code cannot be a part of Identifier in ES5', function() { + expect(esutils.code.isIdentifierPartES5('+'.charCodeAt(0))).to.be.false; + expect(esutils.code.isIdentifierPartES5('-'.charCodeAt(0))).to.be.false; + }); + }); + describe('isIdentifierStartES6', function() { + it('returns true if provided code can be a start of Identifier in ES6', function() { + const characters = ['a', '_', '$', 'ゆ', '\u0AF9']; + const ref = characters.map(function(ch) { + return ch.charCodeAt(0); + }); + const results = []; + for (const code of ref) { + results.push(expect(esutils.code.isIdentifierStartES6(code)).to.be.true); + } + return results; + }); + + it('returns false if provided code cannot be a start of Identifier in ES6', function() { + const results = []; + for (let ch = 0, i = 0; i <= 9; ch = ++i) { + results.push(expect(esutils.code.isIdentifierStartES6((String(ch)).charCodeAt(0))).to.be.false); + } + return results; + }); + }); + + describe('isIdentifierPartES6', function() { + it('returns true if provided code can be a part of Identifier in ES6', function() { + const characters = ['a', '_', '$', 'ゆ']; + const ref = characters.map(function(ch) { + return ch.charCodeAt(0); + }); + for (const code of ref) { + expect(esutils.code.isIdentifierPartES6(code)).to.be.true; + } + const results = []; + for (let ch = 0, j = 0; j <= 9; ch = ++j) { + results.push(expect(esutils.code.isIdentifierPartES6((String(ch)).charCodeAt(0))).to.be.true); + } + return results; + }); + it('supports astral symbols', function() { + expect(esutils.code.isIdentifierPartES6(0xE01D5)).to.be.true; + }); + it('returns false if provided code cannot be a part of Identifier in ES6', function() { + expect(esutils.code.isIdentifierPartES6('+'.charCodeAt(0))).to.be.false; + expect(esutils.code.isIdentifierPartES6('-'.charCodeAt(0))).to.be.false; + }); + }); +}); diff --git a/test/keyword.coffee b/test/keyword.coffee deleted file mode 100644 index 9fef055..0000000 --- a/test/keyword.coffee +++ /dev/null @@ -1,400 +0,0 @@ -# Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -'use strict' - -expect = require('chai').expect -esutils = require '../' - -KW = [ - 'if' - 'in' - 'do' - 'var' - 'for' - 'new' - 'try' - 'this' - 'else' - 'case' - 'void' - 'with' - 'enum' - 'while' - 'break' - 'catch' - 'throw' - 'const' - 'class' - 'super' - 'return' - 'typeof' - 'delete' - 'switch' - 'export' - 'import' - 'default' - 'finally' - 'extends' - 'function' - 'continue' - 'debugger' - 'instanceof' -] - -SRW = [ - 'implements' - 'interface' - 'package' - 'private' - 'protected' - 'public' - 'static' - 'let' -] - -describe 'keyword', -> - describe 'isKeywordES6', -> - it 'returns true if provided string is keyword under non-strict mode', -> - for word in KW - expect(esutils.keyword.isKeywordES6(word, no)).to.be.true - - expect(esutils.keyword.isKeywordES6('yield', no)).to.be.true - - it 'returns false if provided string is not keyword under non-strict mode', -> - words = [ - 'hello' - '20' - '$' - 'ゆゆ式' - ] - - for word in words - expect(esutils.keyword.isKeywordES6(word, no)).to.be.false - - for word in SRW - expect(esutils.keyword.isKeywordES6(word, no)).to.be.false - - it 'returns true if provided string is keyword under strict mode', -> - for word in KW - expect(esutils.keyword.isKeywordES6(word, yes)).to.be.true - - expect(esutils.keyword.isKeywordES6('yield', yes)).to.be.true - - for word in SRW - expect(esutils.keyword.isKeywordES6(word, yes)).to.be.true - - - it 'returns false if provided string is not keyword under strict mode', -> - words = [ - 'hello' - '20' - '$' - 'ゆゆ式' - ] - - for word in words - expect(esutils.keyword.isKeywordES6(word, yes)).to.be.false - - - describe 'isKeywordES5', -> - it 'returns true if provided string is keyword under non-strict mode', -> - for word in KW - expect(esutils.keyword.isKeywordES5(word, no)).to.be.true - - it 'returns false if provided string is not keyword under non-strict mode', -> - words = [ - 'hello' - '20' - '$' - 'ゆゆ式' - ] - - for word in words - expect(esutils.keyword.isKeywordES5(word, no)).to.be.false - - for word in SRW - expect(esutils.keyword.isKeywordES5(word, no)).to.be.false - - expect(esutils.keyword.isKeywordES5('yield', no)).to.be.false - - it 'returns true if provided string is keyword under strict mode', -> - for word in KW - expect(esutils.keyword.isKeywordES5(word, yes)).to.be.true - - expect(esutils.keyword.isKeywordES5('yield', yes)).to.be.true - - for word in SRW - expect(esutils.keyword.isKeywordES5(word, yes)).to.be.true - - - it 'returns false if provided string is not keyword under strict mode', -> - words = [ - 'hello' - '20' - '$' - 'ゆゆ式' - ] - - for word in words - expect(esutils.keyword.isKeywordES5(word, yes)).to.be.false - - - describe 'isReservedWordES6', -> - it 'returns true for null/boolean values', -> - expect(esutils.keyword.isReservedWordES6('null', no)).to.be.true - expect(esutils.keyword.isReservedWordES6('null', yes)).to.be.true - expect(esutils.keyword.isReservedWordES6('true', no)).to.be.true - expect(esutils.keyword.isReservedWordES6('true', yes)).to.be.true - expect(esutils.keyword.isReservedWordES6('false', no)).to.be.true - expect(esutils.keyword.isReservedWordES6('false', yes)).to.be.true - - # isReservedWordES6 has the same properties as isKeywordES6 - - it 'returns true if provided string is keyword under non-strict mode', -> - for word in KW - expect(esutils.keyword.isReservedWordES6(word, no)).to.be.true - - expect(esutils.keyword.isReservedWordES6('yield', no)).to.be.true - - it 'returns false if provided string is not keyword under non-strict mode', -> - words = [ - 'hello' - '20' - '$' - 'ゆゆ式' - ] - - for word in words - expect(esutils.keyword.isReservedWordES6(word, no)).to.be.false - - for word in SRW - expect(esutils.keyword.isReservedWordES6(word, no)).to.be.false - - it 'returns true if provided string is keyword under strict mode', -> - for word in KW - expect(esutils.keyword.isReservedWordES6(word, yes)).to.be.true - - expect(esutils.keyword.isReservedWordES6('yield', yes)).to.be.true - - for word in SRW - expect(esutils.keyword.isReservedWordES6(word, yes)).to.be.true - - - it 'returns false if provided string is not keyword under strict mode', -> - words = [ - 'hello' - '20' - '$' - 'ゆゆ式' - ] - - for word in words - expect(esutils.keyword.isReservedWordES6(word, yes)).to.be.false - - - describe 'isReservedWordES5', -> - it 'returns true for null/boolean values', -> - expect(esutils.keyword.isReservedWordES5('null', no)).to.be.true - expect(esutils.keyword.isReservedWordES5('null', yes)).to.be.true - expect(esutils.keyword.isReservedWordES5('true', no)).to.be.true - expect(esutils.keyword.isReservedWordES5('true', yes)).to.be.true - expect(esutils.keyword.isReservedWordES5('false', no)).to.be.true - expect(esutils.keyword.isReservedWordES5('false', yes)).to.be.true - - # isReservedWordES5 has the same properties as isKeywordES5 - - it 'returns true if provided string is keyword under non-strict mode', -> - for word in KW - expect(esutils.keyword.isReservedWordES5(word, no)).to.be.true - - it 'returns false if provided string is not keyword under non-strict mode', -> - words = [ - 'hello' - '20' - '$' - 'ゆゆ式' - ] - - for word in words - expect(esutils.keyword.isReservedWordES5(word, no)).to.be.false - - for word in SRW - expect(esutils.keyword.isReservedWordES5(word, no)).to.be.false - - expect(esutils.keyword.isReservedWordES5('yield', no)).to.be.false - - it 'returns true if provided string is keyword under strict mode', -> - for word in KW - expect(esutils.keyword.isReservedWordES5(word, yes)).to.be.true - - expect(esutils.keyword.isReservedWordES5('yield', yes)).to.be.true - - for word in SRW - expect(esutils.keyword.isReservedWordES5(word, yes)).to.be.true - - - it 'returns false if provided string is not keyword under strict mode', -> - words = [ - 'hello' - '20' - '$' - 'ゆゆ式' - ] - - for word in words - expect(esutils.keyword.isReservedWordES5(word, yes)).to.be.false - - - describe 'isRestrictedWord', -> - it 'returns true if provided string is "eval" or "arguments"', -> - expect(esutils.keyword.isRestrictedWord('eval')).to.be.true - expect(esutils.keyword.isRestrictedWord('arguments')).to.be.true - - it 'returns false if provided string is not "eval" or "arguments"', -> - words = [ - 'hello' - '20' - '$' - 'ゆゆ式' - ] - - for word in words - expect(esutils.keyword.isRestrictedWord(word)).to.be.false - - - describe 'isIdentifierName', -> - it 'returns false if provided string is empty', -> - expect(esutils.keyword.isIdentifierNameES5('')).to.be.false - expect(esutils.keyword.isIdentifierNameES6('')).to.be.false - - it 'returns true if provided string is IdentifierName', -> - words = [ - 'hello' - '$' - 'ゆゆ式' - '$20' - 'hello20' - '_' - 'if' - ] - - for word in words - expect(esutils.keyword.isIdentifierNameES5(word)).to.be.true - expect(esutils.keyword.isIdentifierNameES6(word)).to.be.true - - - it 'returns false if provided string is not IdentifierName', -> - words = [ - '+hello' - '0$' - '-ゆゆ式' - '#_' - '_#' - ] - - for word in words - expect(esutils.keyword.isIdentifierNameES5(word)).to.be.false - expect(esutils.keyword.isIdentifierNameES6(word)).to.be.false - - it 'supports astral symbols', -> - expect(esutils.keyword.isIdentifierNameES6('x\uDB40\uDDD5')).to.be.true - - - describe 'isIdentifierES5', -> - it 'returns false if provided string is empty', -> - expect(esutils.keyword.isIdentifierES5('')).to.be.false - - it 'returns true if provided string is Identifier', -> - words = [ - 'hello' - '$' - 'ゆゆ式' - '$20' - 'hello20' - '_' - ] - - for word in words - expect(esutils.keyword.isIdentifierES5(word)).to.be.true - - expect(esutils.keyword.isIdentifierES5('yield', no)).to.be.true - expect(esutils.keyword.isIdentifierES5('let', no)).to.be.true - - it 'returns false if provided string is not Identifier', -> - words = [ - '+hello' - '0$' - '-ゆゆ式' - '#_' - '_#' - 'if' - 'null' - 'true' - 'false' - ] - - for word in words - expect(esutils.keyword.isIdentifierES5(word)).to.be.false - - expect(esutils.keyword.isIdentifierES5('yield', yes)).to.be.false - expect(esutils.keyword.isIdentifierES5('let', yes)).to.be.false - - - describe 'isIdentifierES6', -> - it 'returns false if provided string is empty', -> - expect(esutils.keyword.isIdentifierES6('')).to.be.false - - it 'returns true if provided string is Identifier', -> - words = [ - 'hello' - '$' - 'ゆゆ式' - '$20' - 'hello20' - '_' - ] - - for word in words - expect(esutils.keyword.isIdentifierES6(word)).to.be.true - - expect(esutils.keyword.isIdentifierES6('let', no)).to.be.true - - it 'returns false if provided string is not Identifier', -> - words = [ - '+hello' - '0$' - '-ゆゆ式' - '#_' - '_#' - 'if' - 'null' - 'true' - 'false' - ] - - for word in words - expect(esutils.keyword.isIdentifierES6(word)).to.be.false - - expect(esutils.keyword.isIdentifierES6('yield', no)).to.be.false - expect(esutils.keyword.isIdentifierES6('yield', yes)).to.be.false - expect(esutils.keyword.isIdentifierES6('let', yes)).to.be.false diff --git a/test/keyword.js b/test/keyword.js new file mode 100644 index 0000000..0d6926a --- /dev/null +++ b/test/keyword.js @@ -0,0 +1,298 @@ +/* +Copyright (C) 2013 Yusuke Suzuki <utatane.tea@gmail.com> + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +import * as esutils from '../src/utils.js'; + +const KW = ['if', 'in', 'do', 'var', 'for', 'new', 'try', 'this', 'else', 'case', 'void', 'with', 'enum', 'while', 'break', 'catch', 'throw', 'const', 'class', 'super', 'return', 'typeof', 'delete', 'switch', 'export', 'import', 'default', 'finally', 'extends', 'function', 'continue', 'debugger', 'instanceof']; + +const SRW = ['implements', 'interface', 'package', 'private', 'protected', 'public', 'static', 'let']; + +describe('keyword', function() { + describe('isKeywordES6', function() { + it('returns true if provided string is keyword under non-strict mode', function() { + for (const word of KW) { + expect(esutils.keyword.isKeywordES6(word, false)).to.be.true; + } + expect(esutils.keyword.isKeywordES6('yield', false)).to.be.true; + }); + it('returns false if provided string is not keyword under non-strict mode', function() { + const words = ['hello', '20', '$', 'ゆゆ式']; + for (const word of words) { + expect(esutils.keyword.isKeywordES6(word, false)).to.be.false; + } + const results = []; + for (const word of SRW) { + results.push(expect(esutils.keyword.isKeywordES6(word, false)).to.be.false); + } + return results; + }); + it('returns true if provided string is keyword under strict mode', function() { + for (const word of KW) { + expect(esutils.keyword.isKeywordES6(word, true)).to.be.true; + } + expect(esutils.keyword.isKeywordES6('yield', true)).to.be.true; + const results = []; + for (const word of SRW) { + results.push(expect(esutils.keyword.isKeywordES6(word, true)).to.be.true); + } + return results; + }); + it('returns false if provided string is not keyword under strict mode', function() { + const words = ['hello', '20', '$', 'ゆゆ式']; + const results = []; + for (const word of words) { + results.push(expect(esutils.keyword.isKeywordES6(word, true)).to.be.false); + } + return results; + }); + }); + describe('isKeywordES5', function() { + it('returns true if provided string is keyword under non-strict mode', function() { + const results = []; + for (const word of KW) { + results.push(expect(esutils.keyword.isKeywordES5(word, false)).to.be.true); + } + return results; + }); + it('returns false if provided string is not keyword under non-strict mode', function() { + const words = ['hello', '20', '$', 'ゆゆ式']; + for (const word of words) { + expect(esutils.keyword.isKeywordES5(word, false)).to.be.false; + } + for (const word of SRW) { + expect(esutils.keyword.isKeywordES5(word, false)).to.be.false; + } + expect(esutils.keyword.isKeywordES5('yield', false)).to.be.false; + }); + it('returns true if provided string is keyword under strict mode', function() { + for (const word of KW) { + expect(esutils.keyword.isKeywordES5(word, true)).to.be.true; + } + expect(esutils.keyword.isKeywordES5('yield', true)).to.be.true; + const results = []; + for (const word of SRW) { + results.push(expect(esutils.keyword.isKeywordES5(word, true)).to.be.true); + } + return results; + }); + + it('returns false if provided string is not keyword under strict mode', function() { + const words = ['hello', '20', '$', 'ゆゆ式']; + const results = []; + for (const word of words) { + results.push(expect(esutils.keyword.isKeywordES5(word, true)).to.be.false); + } + return results; + }); + }); + describe('isReservedWordES6', function() { + it('returns true for null/boolean values', function() { + expect(esutils.keyword.isReservedWordES6('null', false)).to.be.true; + expect(esutils.keyword.isReservedWordES6('null', true)).to.be.true; + expect(esutils.keyword.isReservedWordES6('true', false)).to.be.true; + expect(esutils.keyword.isReservedWordES6('true', true)).to.be.true; + expect(esutils.keyword.isReservedWordES6('false', false)).to.be.true; + expect(esutils.keyword.isReservedWordES6('false', true)).to.be.true; + }); + // isReservedWordES6 has the same properties as isKeywordES6 + it('returns true if provided string is keyword under non-strict mode', function() { + for (const word of KW) { + expect(esutils.keyword.isReservedWordES6(word, false)).to.be.true; + } + expect(esutils.keyword.isReservedWordES6('yield', false)).to.be.true; + }); + it('returns false if provided string is not keyword under non-strict mode', function() { + const words = ['hello', '20', '$', 'ゆゆ式']; + for (const word of words) { + expect(esutils.keyword.isReservedWordES6(word, false)).to.be.false; + } + const results = []; + for (const word of SRW) { + results.push(expect(esutils.keyword.isReservedWordES6(word, false)).to.be.false); + } + return results; + }); + it('returns true if provided string is keyword under strict mode', function() { + for (const word of KW) { + expect(esutils.keyword.isReservedWordES6(word, true)).to.be.true; + } + expect(esutils.keyword.isReservedWordES6('yield', true)).to.be.true; + const results = []; + for (const word of SRW) { + results.push(expect(esutils.keyword.isReservedWordES6(word, true)).to.be.true); + } + return results; + }); + it('returns false if provided string is not keyword under strict mode', function() { + const words = ['hello', '20', '$', 'ゆゆ式']; + const results = []; + for (const word of words) { + results.push(expect(esutils.keyword.isReservedWordES6(word, true)).to.be.false); + } + return results; + }); + }); + describe('isReservedWordES5', function() { + it('returns true for null/boolean values', function() { + expect(esutils.keyword.isReservedWordES5('null', false)).to.be.true; + expect(esutils.keyword.isReservedWordES5('null', true)).to.be.true; + expect(esutils.keyword.isReservedWordES5('true', false)).to.be.true; + expect(esutils.keyword.isReservedWordES5('true', true)).to.be.true; + expect(esutils.keyword.isReservedWordES5('false', false)).to.be.true; + expect(esutils.keyword.isReservedWordES5('false', true)).to.be.true; + }); + // isReservedWordES5 has the same properties as isKeywordES5 + it('returns true if provided string is keyword under non-strict mode', function() { + const results = []; + for (const word of KW) { + results.push(expect(esutils.keyword.isReservedWordES5(word, false)).to.be.true); + } + return results; + }); + it('returns false if provided string is not keyword under non-strict mode', function() { + const words = ['hello', '20', '$', 'ゆゆ式']; + for (const word of words) { + expect(esutils.keyword.isReservedWordES5(word, false)).to.be.false; + } + for (const word of SRW) { + expect(esutils.keyword.isReservedWordES5(word, false)).to.be.false; + } + expect(esutils.keyword.isReservedWordES5('yield', false)).to.be.false; + }); + + it('returns true if provided string is keyword under strict mode', function() { + for (const word of KW) { + expect(esutils.keyword.isReservedWordES5(word, true)).to.be.true; + } + expect(esutils.keyword.isReservedWordES5('yield', true)).to.be.true; + const results = []; + for (const word of SRW) { + results.push(expect(esutils.keyword.isReservedWordES5(word, true)).to.be.true); + } + return results; + }); + + it('returns false if provided string is not keyword under strict mode', function() { + const words = ['hello', '20', '$', 'ゆゆ式']; + const results = []; + for (const word of words) { + results.push(expect(esutils.keyword.isReservedWordES5(word, true)).to.be.false); + } + return results; + }); + }); + describe('isRestrictedWord', function() { + it('returns true if provided string is "eval" or "arguments"', function() { + expect(esutils.keyword.isRestrictedWord('eval')).to.be.true; + expect(esutils.keyword.isRestrictedWord('arguments')).to.be.true; + }); + + it('returns false if provided string is not "eval" or "arguments"', function() { + const words = ['hello', '20', '$', 'ゆゆ式']; + const results = []; + for (const word of words) { + results.push(expect(esutils.keyword.isRestrictedWord(word)).to.be.false); + } + return results; + }); + }); + describe('isIdentifierName', function() { + it('returns false if provided string is empty', function() { + expect(esutils.keyword.isIdentifierNameES5('')).to.be.false; + expect(esutils.keyword.isIdentifierNameES6('')).to.be.false; + }); + it('returns true if provided string is IdentifierName', function() { + const words = ['hello', '$', 'ゆゆ式', '$20', 'hello20', '_', 'if']; + const results = []; + for (const word of words) { + expect(esutils.keyword.isIdentifierNameES5(word)).to.be.true; + results.push(expect(esutils.keyword.isIdentifierNameES6(word)).to.be.true); + } + return results; + }); + it('returns false if provided string is not IdentifierName', function() { + const words = ['+hello', '0$', '-ゆゆ式', '#_', '_#']; + const results = []; + for (const word of words) { + expect(esutils.keyword.isIdentifierNameES5(word)).to.be.false; + results.push(expect(esutils.keyword.isIdentifierNameES6(word)).to.be.false); + } + return results; + }); + it('returns false if provided an unmatched high surrogate', function () { + const words = ['\uD800a', '\uD800']; + const results = []; + for (const word of words) { + expect(esutils.keyword.isIdentifierNameES5(word)).to.be.false; + results.push(expect(esutils.keyword.isIdentifierNameES6(word)).to.be.false); + } + return results; + }); + it('supports astral symbols', function() { + expect(esutils.keyword.isIdentifierNameES6('x\uDB40\uDDD5')).to.be.true; + }); + }); + describe('isIdentifierES5', function() { + it('returns false if provided string is empty', function() { + expect(esutils.keyword.isIdentifierES5('')).to.be.false; + }); + it('returns true if provided string is Identifier', function() { + const words = ['hello', '$', 'ゆゆ式', '$20', 'hello20', '_']; + for (const word of words) { + expect(esutils.keyword.isIdentifierES5(word)).to.be.true; + } + expect(esutils.keyword.isIdentifierES5('yield', false)).to.be.true; + expect(esutils.keyword.isIdentifierES5('let', false)).to.be.true; + }); + it('returns false if provided string is not Identifier', function() { + const words = ['+hello', '0$', '-ゆゆ式', '#_', '_#', 'if', 'null', 'true', 'false']; + for (const word of words) { + expect(esutils.keyword.isIdentifierES5(word)).to.be.false; + } + expect(esutils.keyword.isIdentifierES5('yield', true)).to.be.false; + expect(esutils.keyword.isIdentifierES5('let', true)).to.be.false; + }); + }); + describe('isIdentifierES6', function() { + it('returns false if provided string is empty', function() { + expect(esutils.keyword.isIdentifierES6('')).to.be.false; + }); + it('returns true if provided string is Identifier', function() { + const words = ['hello', '$', 'ゆゆ式', '$20', 'hello20', '_']; + for (const word of words) { + expect(esutils.keyword.isIdentifierES6(word)).to.be.true; + } + expect(esutils.keyword.isIdentifierES6('let', false)).to.be.true; + }); + it('returns false if provided string is not Identifier', function() { + const words = ['+hello', '0$', '-ゆゆ式', '#_', '_#', 'if', 'null', 'true', 'false']; + for (const word of words) { + expect(esutils.keyword.isIdentifierES6(word)).to.be.false; + } + expect(esutils.keyword.isIdentifierES6('yield', false)).to.be.false; + expect(esutils.keyword.isIdentifierES6('yield', true)).to.be.false; + expect(esutils.keyword.isIdentifierES6('let', true)).to.be.false; + }); + }); +}); diff --git a/tools/generate-identifier-regex.js b/tools/generate-identifier-regex.js index 2aef1f2..1dac1f6 100644 --- a/tools/generate-identifier-regex.js +++ b/tools/generate-identifier-regex.js @@ -1,14 +1,19 @@ // Based on https://gist.github.com/mathiasbynens/6334847 by @mathias 'use strict'; +const { writeFileSync } = require('fs'); +const { join } = require('path'); const regenerate = require('regenerate'); // Which Unicode version should be used? -const version = '9.0.0'; +const pkg = require('../package.json'); +const dependencies = Object.keys(pkg.devDependencies); +const unicodeDep = dependencies.find((name) => /^unicode-\d/.test(name)); +const [, version] = unicodeDep.match(/\D+(.+)$/); // Set up a shorthand function to import Unicode data. const get = function(what) { - return require('unicode-' + version + '/' + what + '/code-points'); + return require(`unicode-${version}/${what}/code-points.js`); }; // Get the Unicode categories needed to construct the ES5 regex. @@ -35,8 +40,8 @@ const es5regexes = (function() { // ES 5.1 .removeRange(0x010000, 0x10FFFF) // remove astral symbols .removeRange(0x00, 0x7F); // remove ASCII symbols (esutils-specific) return { - 'NonAsciiIdentifierStart': '/' + identifierStart + '/', - 'NonAsciiIdentifierPart': '/' + identifierPart + '/', + NonAsciiIdentifierStart: `/${identifierStart}/`, + NonAsciiIdentifierPart: `/${identifierPart}/`, }; }()); @@ -59,29 +64,35 @@ const es6regexes = (function() { .removeRange(0x00, 0x7F); // remove ASCII symbols (esutils-specific) return { - 'NonAsciiIdentifierStart': '/' + identifierStart + '/', - 'NonAsciiIdentifierPart': '/' + identifierPart + '/', + NonAsciiIdentifierStart: `/${identifierStart}/`, + NonAsciiIdentifierPart: `/${identifierPart}/`, }; }()); -console.log( - '// ECMAScript 5.1/Unicode v%s NonAsciiIdentifierStart:\n%s\n', - version, - es5regexes.NonAsciiIdentifierStart -); -console.log( - '// ECMAScript 5.1/Unicode v%s NonAsciiIdentifierPart:\n%s\n', - version, - es5regexes.NonAsciiIdentifierPart -); +writeFileSync( + join(__dirname, '../src/es5-identifier.js'), + `// DO NOT EDIT -- File auto-generated from /tools/generate-identifier-regex.js + +// ECMAScript 5.1/Unicode v${version} NonAsciiIdentifierStart: +const NonAsciiIdentifierStart = ${es5regexes.NonAsciiIdentifierStart}; + +// ECMAScript 5.1/Unicode v${version} NonAsciiIdentifierPart: +const NonAsciiIdentifierPart = ${es5regexes.NonAsciiIdentifierPart}; -console.log( - '// ECMAScript 6/Unicode v%s NonAsciiIdentifierStart:\n%s\n', - version, - es6regexes.NonAsciiIdentifierStart +export { NonAsciiIdentifierStart, NonAsciiIdentifierPart }; +` ); -console.log( - '// ECMAScript 6/Unicode v%s NonAsciiIdentifierPart:\n%s', - version, - es6regexes.NonAsciiIdentifierPart + +writeFileSync( + join(__dirname, '../src/es6-identifier.js'), + `// DO NOT EDIT -- File auto-generated from /tools/generate-identifier-regex.js + +// ECMAScript 6/Unicode v${version} NonAsciiIdentifierStart: +const NonAsciiIdentifierStart = ${es6regexes.NonAsciiIdentifierStart}; + +// ECMAScript 6/Unicode v${version} NonAsciiIdentifierPart: +const NonAsciiIdentifierPart = ${es6regexes.NonAsciiIdentifierPart}; + +export { NonAsciiIdentifierStart, NonAsciiIdentifierPart }; +` );