aboutsummaryrefslogtreecommitdiff
path: root/node_modules/es-abstract
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/es-abstract
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/es-abstract')
-rw-r--r--node_modules/es-abstract/.editorconfig13
-rw-r--r--node_modules/es-abstract/.eslintrc23
-rw-r--r--node_modules/es-abstract/.jscs.json174
-rw-r--r--node_modules/es-abstract/.nycrc14
-rw-r--r--node_modules/es-abstract/.travis.yml232
-rw-r--r--node_modules/es-abstract/CHANGELOG.md175
-rw-r--r--node_modules/es-abstract/GetIntrinsic.js177
-rw-r--r--node_modules/es-abstract/LICENSE21
-rw-r--r--node_modules/es-abstract/Makefile61
-rw-r--r--node_modules/es-abstract/README.md44
-rw-r--r--node_modules/es-abstract/es2015.js693
-rw-r--r--node_modules/es-abstract/es2016.js16
-rw-r--r--node_modules/es-abstract/es2017.js25
-rw-r--r--node_modules/es-abstract/es5.js242
-rw-r--r--node_modules/es-abstract/es6.js3
-rw-r--r--node_modules/es-abstract/es7.js3
-rw-r--r--node_modules/es-abstract/helpers/assign.js17
-rw-r--r--node_modules/es-abstract/helpers/isFinite.js3
-rw-r--r--node_modules/es-abstract/helpers/isNaN.js3
-rw-r--r--node_modules/es-abstract/helpers/isPrimitive.js3
-rw-r--r--node_modules/es-abstract/helpers/mod.js4
-rw-r--r--node_modules/es-abstract/helpers/sign.js3
-rw-r--r--node_modules/es-abstract/index.js22
-rw-r--r--node_modules/es-abstract/operations/2015.js78
-rw-r--r--node_modules/es-abstract/operations/2016.js80
-rw-r--r--node_modules/es-abstract/operations/2017.js82
-rw-r--r--node_modules/es-abstract/operations/es5.js10
-rw-r--r--node_modules/es-abstract/package.json98
-rw-r--r--node_modules/es-abstract/test/.eslintrc11
-rw-r--r--node_modules/es-abstract/test/GetIntrinsic.js34
-rw-r--r--node_modules/es-abstract/test/diffOps.js24
-rw-r--r--node_modules/es-abstract/test/es2015.js11
-rw-r--r--node_modules/es-abstract/test/es2016.js11
-rw-r--r--node_modules/es-abstract/test/es2017.js11
-rw-r--r--node_modules/es-abstract/test/es5.js415
-rw-r--r--node_modules/es-abstract/test/es6.js18
-rw-r--r--node_modules/es-abstract/test/es7.js18
-rw-r--r--node_modules/es-abstract/test/helpers/values.js53
-rw-r--r--node_modules/es-abstract/test/index.js28
-rw-r--r--node_modules/es-abstract/test/tests.js1610
40 files changed, 4563 insertions, 0 deletions
diff --git a/node_modules/es-abstract/.editorconfig b/node_modules/es-abstract/.editorconfig
new file mode 100644
index 00000000..eaa21416
--- /dev/null
+++ b/node_modules/es-abstract/.editorconfig
@@ -0,0 +1,13 @@
+root = true
+
+[*]
+indent_style = tab;
+insert_final_newline = true;
+quote_type = auto;
+space_after_anonymous_functions = true;
+space_after_control_statements = true;
+spaces_around_operators = true;
+trim_trailing_whitespace = true;
+spaces_in_brackets = false;
+end_of_line = lf;
+
diff --git a/node_modules/es-abstract/.eslintrc b/node_modules/es-abstract/.eslintrc
new file mode 100644
index 00000000..9478bfa1
--- /dev/null
+++ b/node_modules/es-abstract/.eslintrc
@@ -0,0 +1,23 @@
+{
+ "root": true,
+
+ "extends": "@ljharb",
+
+ "rules": {
+ "array-bracket-newline": 0,
+ "array-element-newline": 0,
+ "complexity": 0,
+ "eqeqeq": [2, "allow-null"],
+ "func-name-matching": 0,
+ "id-length": [2, { "min": 1, "max": 30 }],
+ "max-lines": [2, 700],
+ "max-params": [2, 4],
+ "max-statements": [2, 24],
+ "max-statements-per-line": [2, { "max": 2 }],
+ "no-magic-numbers": 0,
+ "new-cap": 0,
+ "no-extra-parens": 1,
+ "operator-linebreak": [2, "before"],
+ "sort-keys": 0
+ }
+}
diff --git a/node_modules/es-abstract/.jscs.json b/node_modules/es-abstract/.jscs.json
new file mode 100644
index 00000000..857f88f1
--- /dev/null
+++ b/node_modules/es-abstract/.jscs.json
@@ -0,0 +1,174 @@
+{
+ "es3": true,
+
+ "additionalRules": [],
+
+ "requireSemicolons": true,
+
+ "disallowMultipleSpaces": true,
+
+ "disallowIdentifierNames": [],
+
+ "requireCurlyBraces": {
+ "allExcept": [],
+ "keywords": ["if", "else", "for", "while", "do", "try", "catch"]
+ },
+
+ "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
+
+ "disallowSpaceAfterKeywords": [],
+
+ "disallowSpaceBeforeComma": true,
+ "disallowSpaceAfterComma": false,
+ "disallowSpaceBeforeSemicolon": true,
+
+ "disallowNodeTypes": [
+ "DebuggerStatement",
+ "ForInStatement",
+ "LabeledStatement",
+ "SwitchCase",
+ "SwitchStatement",
+ "WithStatement"
+ ],
+
+ "requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
+
+ "requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
+ "requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
+ "requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
+ "disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
+
+ "requireSpaceBetweenArguments": true,
+
+ "disallowSpacesInsideParentheses": true,
+
+ "disallowSpacesInsideArrayBrackets": true,
+
+ "disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },
+
+ "disallowSpaceAfterObjectKeys": true,
+
+ "requireCommaBeforeLineBreak": true,
+
+ "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
+ "requireSpaceAfterPrefixUnaryOperators": [],
+
+ "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
+ "requireSpaceBeforePostfixUnaryOperators": [],
+
+ "disallowSpaceBeforeBinaryOperators": [],
+ "requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+
+ "requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
+ "disallowSpaceAfterBinaryOperators": [],
+
+ "disallowImplicitTypeConversion": ["binary", "string"],
+
+ "disallowKeywords": ["with", "eval"],
+
+ "requireKeywordsOnNewLine": [],
+ "disallowKeywordsOnNewLine": ["else"],
+
+ "requireLineFeedAtFileEnd": true,
+
+ "disallowTrailingWhitespace": true,
+
+ "disallowTrailingComma": true,
+
+ "excludeFiles": ["node_modules/**", "vendor/**"],
+
+ "disallowMultipleLineStrings": true,
+
+ "requireDotNotation": { "allExcept": ["keywords"] },
+
+ "requireParenthesesAroundIIFE": true,
+
+ "validateLineBreaks": "LF",
+
+ "validateQuoteMarks": {
+ "escape": true,
+ "mark": "'"
+ },
+
+ "disallowOperatorBeforeLineBreak": [],
+
+ "requireSpaceBeforeKeywords": [
+ "do",
+ "for",
+ "if",
+ "else",
+ "switch",
+ "case",
+ "try",
+ "catch",
+ "finally",
+ "while",
+ "with",
+ "return"
+ ],
+
+ "validateAlignedFunctionParameters": {
+ "lineBreakAfterOpeningBraces": true,
+ "lineBreakBeforeClosingBraces": true
+ },
+
+ "requirePaddingNewLinesBeforeExport": true,
+
+ "validateNewlineAfterArrayElements": {
+ "maximum": 9
+ },
+
+ "requirePaddingNewLinesAfterUseStrict": true,
+
+ "disallowArrowFunctions": true,
+
+ "disallowMultiLineTernary": false,
+
+ "validateOrderInObjectKeys": false,
+
+ "disallowIdenticalDestructuringNames": true,
+
+ "disallowNestedTernaries": { "maxLevel": 1 },
+
+ "requireSpaceAfterComma": { "allExcept": ["trailing"] },
+ "requireAlignedMultilineParams": false,
+
+ "requireSpacesInGenerator": {
+ "afterStar": true
+ },
+
+ "disallowSpacesInGenerator": {
+ "beforeStar": true
+ },
+
+ "disallowVar": false,
+
+ "requireArrayDestructuring": false,
+
+ "requireEnhancedObjectLiterals": false,
+
+ "requireObjectDestructuring": false,
+
+ "requireEarlyReturn": false,
+
+ "requireCapitalizedConstructorsNew": false,
+
+ "requireImportAlphabetized": false,
+
+ "requireSpaceBeforeObjectValues": true,
+ "requireSpaceBeforeDestructuredValues": true,
+
+ "disallowSpacesInsideTemplateStringPlaceholders": true,
+
+ "disallowArrayDestructuringReturn": false,
+
+ "requireNewlineBeforeSingleStatementsInIf": false,
+
+ "disallowUnusedVariables": true,
+
+ "requireSpacesInsideImportedObjectBraces": true,
+
+ "requireUseStrict": true
+}
+
diff --git a/node_modules/es-abstract/.nycrc b/node_modules/es-abstract/.nycrc
new file mode 100644
index 00000000..1b02cf18
--- /dev/null
+++ b/node_modules/es-abstract/.nycrc
@@ -0,0 +1,14 @@
+{
+ "all": true,
+ "check-coverage": true,
+ "reporter": ["text-summary", "text", "html", "json"],
+ "lines": 87.03,
+ "statements": 86.87,
+ "functions": 82.43,
+ "branches": 76.06,
+ "exclude": [
+ "coverage",
+ "operations",
+ "test"
+ ]
+}
diff --git a/node_modules/es-abstract/.travis.yml b/node_modules/es-abstract/.travis.yml
new file mode 100644
index 00000000..ce65a2f9
--- /dev/null
+++ b/node_modules/es-abstract/.travis.yml
@@ -0,0 +1,232 @@
+language: node_js
+os:
+ - linux
+node_js:
+ - "10.2"
+ - "9.11"
+ - "8.11"
+ - "7.10"
+ - "6.14"
+ - "5.12"
+ - "4.9"
+ - "iojs-v3.3"
+ - "iojs-v2.5"
+ - "iojs-v1.8"
+ - "0.12"
+ - "0.10"
+ - "0.8"
+ - "0.6"
+cache:
+ directories:
+ - "$HOME/.npm"
+ - "$(nvm cache dir)"
+ - "$(nvm_version_path $(nvm_version_remote 0.4))"
+ - "$(nvm_version_path $(nvm_version_remote 0.6))"
+ - "$(nvm_version_path $(nvm_version_remote 0.10))"
+before_install:
+ - 'case "${TRAVIS_NODE_VERSION}" in 0.*) export NPM_CONFIG_STRICT_SSL=false ;; esac'
+ - 'nvm install-latest-npm'
+install:
+ - 'if [ "${TRAVIS_NODE_VERSION}" = "0.6" ] || [ "${TRAVIS_NODE_VERSION}" = "0.9" ]; then nvm install --latest-npm 0.8 && npm install && nvm use "${TRAVIS_NODE_VERSION}"; else npm install; fi;'
+script:
+ - 'if [ -n "${PRETEST-}" ]; then npm run pretest ; fi'
+ - 'if [ -n "${POSTTEST-}" ]; then npm run posttest ; fi'
+ - 'if [ -n "${COVERAGE-}" ]; then npm run coverage && bash <(curl -s https://codecov.io/bash) -f coverage/*.json; fi'
+ - 'if [ -n "${TEST-}" ]; then npm run tests-only ; fi'
+sudo: false
+env:
+ - TEST=true
+matrix:
+ fast_finish: true
+ include:
+ - node_js: "lts/*"
+ env: PRETEST=true
+ - node_js: "lts/*"
+ env: POSTTEST=true
+ - node_js: "0.8"
+ env: COVERAGE=true
+ - node_js: "0.12"
+ env: COVERAGE=true
+ - node_js: "4"
+ env: COVERAGE=true
+ - node_js: "8"
+ env: COVERAGE=true
+ - node_js: "10.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "10.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.10"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.9"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.8"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.7"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.6"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.5"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.4"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.3"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.2"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "9.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.10"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.9"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.8"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.7"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.6"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.5"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.4"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.3"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.2"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "8.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.9"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.8"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.7"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.6"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.5"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.4"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.3"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.2"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "7.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.13"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.12"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.11"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.10"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.9"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.8"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.7"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.6"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.5"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.4"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.3"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.2"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "6.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.11"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.10"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.9"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.8"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.7"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.6"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.5"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.4"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.3"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.2"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "5.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "4.8"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "4.7"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "4.6"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "4.5"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "4.4"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "4.3"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "4.2"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "4.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "4.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v3.2"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v3.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v3.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v2.4"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v2.3"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v2.2"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v2.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v2.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v1.7"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v1.6"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v1.5"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v1.4"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v1.3"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v1.2"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v1.1"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "iojs-v1.0"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "0.11"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "0.9"
+ env: TEST=true ALLOW_FAILURE=true
+ - node_js: "0.4"
+ env: TEST=true ALLOW_FAILURE=true
+ allow_failures:
+ - os: osx
+ - env: TEST=true ALLOW_FAILURE=true
diff --git a/node_modules/es-abstract/CHANGELOG.md b/node_modules/es-abstract/CHANGELOG.md
new file mode 100644
index 00000000..daa7b660
--- /dev/null
+++ b/node_modules/es-abstract/CHANGELOG.md
@@ -0,0 +1,175 @@
+1.12.0 / 2018-05-31
+=================
+ * [New] add `GetIntrinsic` entry point
+ * [New] `ES2015`+: add `ObjectCreate`
+ * [Robustness]: `ES2015+`: ensure `Math.{abs,floor}` and `Function.call` are cached
+
+1.11.0 / 2018-03-21
+=================
+ * [New] `ES2015+`: add iterator abstract ops
+ * [Dev Deps] update `eslint`, `nsp`, `object.assign`, `semver`, `tape`
+ * [Tests] up to `node` `v9.8`, `v8.10`, `v6.13`
+
+1.10.0 / 2017-11-24
+=================
+ * [New] ES2015+: `AdvanceStringIndex`
+ * [Dev Deps] update `eslint`, `nsp`
+ * [Tests] require node 0.6 to pass again
+ * [Tests] up to `node` `v9.2`, `v8.9`, `v6.12`; use `nvm install-latest-npm`; pin included builds to LTS
+
+1.9.0 / 2017-09-30
+=================
+ * [New] `es2015+`: add `ArraySpeciesCreate`
+ * [New] ES2015+: add `CreateDataProperty` and `CreateDataPropertyOrThrow`
+ * [Tests] consolidate duplicated tests
+ * [Tests] increase coverage
+ * [Dev Deps] update `nsp`, `eslint`
+
+1.8.2 / 2017-09-03
+=================
+ * [Fix] `es2015`+: `ToNumber`: provide the proper hint for Date objects (#27)
+ * [Dev Deps] update `eslint`
+
+1.8.1 / 2017-08-30
+=================
+ * [Fix] ES2015+: `ToPropertyKey`: should return a symbol for Symbols (#26)
+ * [Deps] update `function-bind`
+ * [Dev Deps] update `eslint`, `@ljharb/eslint-config`
+ * [Docs] github broke markdown parsing
+
+1.8.0 / 2017-08-04
+=================
+ * [New] add ES2017
+ * [New] move es6+ to es2015+; leave es6/es7 as aliases
+ * [New] ES5+: add `IsPropertyDescriptor`, `IsAccessorDescriptor`, `IsDataDescriptor`, `IsGenericDescriptor`, `FromPropertyDescriptor`, `ToPropertyDescriptor`
+ * [New] ES2015+: add `CompletePropertyDescriptor`, `Set`, `HasOwnProperty`, `HasProperty`, `IsConcatSpreadable`, `Invoke`, `CreateIterResultObject`, `RegExpExec`
+ * [Fix] es7/es2016: do not mutate ES6
+ * [Fix] assign helper only supports one source
+ * [Deps] update `is-regex`
+ * [Dev Deps] update `nsp`, `eslint`, `@ljharb/eslint-config`
+ * [Dev Deps] update `eslint`, `@ljharb/eslint-config`, `nsp`, `semver`, `tape`
+ * [Tests] add tests for missing and excess operations
+ * [Tests] add codecov for coverage
+ * [Tests] up to `node` `v8.2`, `v7.10`, `v6.11`, `v4.8`; newer npm breaks on older node
+ * [Tests] use same lists of value types across tests; ensure tests are the same when ops are the same
+ * [Tests] ES2015: add ToNumber symbol tests
+ * [Tests] switch to `nyc` for code coverage
+ * [Tests] make IsRegExp tests consistent across editions
+
+1.7.0 / 2017-01-22
+=================
+ * [New] ES6: Add `GetMethod` (#16)
+ * [New] ES6: Add `GetV` (#16)
+ * [New] ES6: Add `Get` (#17)
+ * [Tests] up to `node` `v7.4`, `v6.9`, `v4.6`; improve test matrix
+ * [Dev Deps] update `tape`, `nsp`, `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`
+
+1.6.1 / 2016-08-21
+=================
+ * [Fix] ES6: IsConstructor should return true for `class` constructors.
+
+1.6.0 / 2016-08-20
+=================
+ * [New] ES5 / ES6: add `Type`
+ * [New] ES6: `SpeciesConstructor`
+ * [Dev Deps] update `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`, `semver`; add `safe-publish-latest`
+ * [Tests] up to `node` `v6.4`, `v5.12`, `v4.5`
+
+1.5.1 / 2016-05-30
+=================
+ * [Fix] `ES.IsRegExp`: actually look up `Symbol.match` on the argument
+ * [Refactor] create `isNaN` helper
+ * [Deps] update `is-callable`, `function-bind`
+ * [Deps] update `es-to-primitive`, fix ES5 tests
+ * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config`, `tape`, `nsp`
+ * [Tests] up to `node` `v6.2`, `v5.11`, `v4.4`
+ * [Tests] use pretest/posttest for linting/security
+
+1.5.0 / 2015-12-27
+=================
+ * [New] adds `Symbol.toPrimitive` support via `es-to-primitive`
+ * [Deps] update `is-callable`, `es-to-primitive`
+ * [Dev Deps] update `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`, `semver`, `tape`
+ * [Tests] up to `node` `v5.3`
+
+1.4.3 / 2015-11-04
+=================
+ * [Fix] `ES6.ToNumber`: should give `NaN` for explicitly signed hex strings (#4)
+ * [Refactor] `ES6.ToNumber`: No need to double-trim
+ * [Refactor] group tests better
+ * [Tests] should still pass on `node` `v0.8`
+
+1.4.2 / 2015-11-02
+=================
+ * [Fix] ensure `ES.ToNumber` trims whitespace, and does not trim non-whitespace (#3)
+
+1.4.1 / 2015-10-31
+=================
+ * [Fix] ensure only 0-1 are valid binary and 0-7 are valid octal digits (#2)
+ * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`
+ * [Tests] on `node` `v5.0`
+ * [Tests] fix npm upgrades for older node versions
+ * package.json: use object form of "authors", add "contributors"
+
+1.4.0 / 2015-09-26
+=================
+ * [Deps] update `is-callable`
+ * [Dev Deps] update `tape`, `jscs`, `eslint`, `@ljharb/eslint-config`
+ * [Tests] on `node` `v4.2`
+ * [New] Add `SameValueNonNumber` to ES7
+
+1.3.2 / 2015-09-26
+=================
+ * [Fix] Fix `ES6.IsRegExp` to properly handle `Symbol.match`, per spec.
+ * [Tests] up to `io.js` `v3.3`, `node` `v4.1`
+ * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`, `semver`
+
+1.3.1 / 2015-08-15
+=================
+ * [Fix] Ensure that objects that `toString` to a binary or octal literal also convert properly
+
+1.3.0 / 2015-08-15
+=================
+ * [New] ES6’s ToNumber now supports binary and octal literals.
+ * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config`, `tape`
+ * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
+ * [Tests] up to `io.js` `v3.0`
+
+1.2.2 / 2015-07-28
+=================
+ * [Fix] Both `ES5.CheckObjectCoercible` and `ES6.RequireObjectCoercible` return the value if they don't throw.
+ * [Tests] Test on latest `io.js` versions.
+ * [Dev Deps] Update `eslint`, `jscs`, `tape`, `semver`, `covert`, `nsp`
+
+1.2.1 / 2015-03-20
+=================
+ * Fix `isFinite` helper.
+
+1.2.0 / 2015-03-19
+=================
+ * Use `es-to-primitive` for ToPrimitive methods.
+ * Test on latest `io.js` versions; allow failures on all but 2 latest `node`/`io.js` versions.
+
+1.1.2 / 2015-03-20
+=================
+ * Fix isFinite helper.
+
+1.1.1 / 2015-03-19
+=================
+ * Fix isPrimitive check for functions
+ * Update `eslint`, `editorconfig-tools`, `semver`, `nsp`
+
+1.1.0 / 2015-02-17
+=================
+ * Add ES7 export (non-default).
+ * All grade A-supported `node`/`iojs` versions now ship with an `npm` that understands `^`.
+ * Test on `iojs-v1.2`.
+
+1.0.1 / 2015-01-30
+=================
+ * Use `is-callable` instead of an internal function.
+ * Update `tape`, `jscs`, `nsp`, `eslint`
+
+1.0.0 / 2015-01-10
+=================
+ * v1.0.0
diff --git a/node_modules/es-abstract/GetIntrinsic.js b/node_modules/es-abstract/GetIntrinsic.js
new file mode 100644
index 00000000..62dbf05d
--- /dev/null
+++ b/node_modules/es-abstract/GetIntrinsic.js
@@ -0,0 +1,177 @@
+'use strict';
+
+/* globals
+ Set,
+ Map,
+ WeakSet,
+ WeakMap,
+
+ Promise,
+
+ Symbol,
+ Proxy,
+
+ Atomics,
+ SharedArrayBuffer,
+
+ ArrayBuffer,
+ DataView,
+ Uint8Array,
+ Float32Array,
+ Float64Array,
+ Int8Array,
+ Int16Array,
+ Int32Array,
+ Uint8ClampedArray,
+ Uint16Array,
+ Uint32Array,
+*/
+
+var undefined; // eslint-disable-line no-shadow-restricted-names
+
+var ThrowTypeError = Object.getOwnPropertyDescriptor
+ ? (function () { return Object.getOwnPropertyDescriptor(arguments, 'callee').get; }())
+ : function () { throw new TypeError(); };
+
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+
+var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
+
+var generator; // = function * () {};
+var generatorFunction = generator ? getProto(generator) : undefined;
+var asyncFn; // async function() {};
+var asyncFunction = asyncFn ? asyncFn.constructor : undefined;
+var asyncGen; // async function * () {};
+var asyncGenFunction = asyncGen ? getProto(asyncGen) : undefined;
+var asyncGenIterator = asyncGen ? asyncGen() : undefined;
+
+var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);
+
+var INTRINSICS = {
+ '$ %Array%': Array,
+ '$ %ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,
+ '$ %ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer.prototype,
+ '$ %ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,
+ '$ %ArrayPrototype%': Array.prototype,
+ '$ %ArrayProto_entries%': Array.prototype.entries,
+ '$ %ArrayProto_forEach%': Array.prototype.forEach,
+ '$ %ArrayProto_keys%': Array.prototype.keys,
+ '$ %ArrayProto_values%': Array.prototype.values,
+ '$ %AsyncFromSyncIteratorPrototype%': undefined,
+ '$ %AsyncFunction%': asyncFunction,
+ '$ %AsyncFunctionPrototype%': asyncFunction ? asyncFunction.prototype : undefined,
+ '$ %AsyncGenerator%': asyncGen ? getProto(asyncGenIterator) : undefined,
+ '$ %AsyncGeneratorFunction%': asyncGenFunction,
+ '$ %AsyncGeneratorPrototype%': asyncGenFunction ? asyncGenFunction.prototype : undefined,
+ '$ %AsyncIteratorPrototype%': asyncGenIterator && hasSymbols && Symbol.asyncIterator ? asyncGenIterator[Symbol.asyncIterator]() : undefined,
+ '$ %Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,
+ '$ %Boolean%': Boolean,
+ '$ %BooleanPrototype%': Boolean.prototype,
+ '$ %DataView%': typeof DataView === 'undefined' ? undefined : DataView,
+ '$ %DataViewPrototype%': typeof DataView === 'undefined' ? undefined : DataView.prototype,
+ '$ %Date%': Date,
+ '$ %DatePrototype%': Date.prototype,
+ '$ %decodeURI%': decodeURI,
+ '$ %decodeURIComponent%': decodeURIComponent,
+ '$ %encodeURI%': encodeURI,
+ '$ %encodeURIComponent%': encodeURIComponent,
+ '$ %Error%': Error,
+ '$ %ErrorPrototype%': Error.prototype,
+ '$ %eval%': eval, // eslint-disable-line no-eval
+ '$ %EvalError%': EvalError,
+ '$ %EvalErrorPrototype%': EvalError.prototype,
+ '$ %Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,
+ '$ %Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined : Float32Array.prototype,
+ '$ %Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,
+ '$ %Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined : Float64Array.prototype,
+ '$ %Function%': Function,
+ '$ %FunctionPrototype%': Function.prototype,
+ '$ %Generator%': generator ? getProto(generator()) : undefined,
+ '$ %GeneratorFunction%': generatorFunction,
+ '$ %GeneratorPrototype%': generatorFunction ? generatorFunction.prototype : undefined,
+ '$ %Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,
+ '$ %Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined : Int8Array.prototype,
+ '$ %Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,
+ '$ %Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined : Int8Array.prototype,
+ '$ %Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,
+ '$ %Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined : Int32Array.prototype,
+ '$ %isFinite%': isFinite,
+ '$ %isNaN%': isNaN,
+ '$ %IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,
+ '$ %JSON%': JSON,
+ '$ %JSONParse%': JSON.parse,
+ '$ %Map%': typeof Map === 'undefined' ? undefined : Map,
+ '$ %MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),
+ '$ %MapPrototype%': typeof Map === 'undefined' ? undefined : Map.prototype,
+ '$ %Math%': Math,
+ '$ %Number%': Number,
+ '$ %NumberPrototype%': Number.prototype,
+ '$ %Object%': Object,
+ '$ %ObjectPrototype%': Object.prototype,
+ '$ %ObjProto_toString%': Object.prototype.toString,
+ '$ %ObjProto_valueOf%': Object.prototype.valueOf,
+ '$ %parseFloat%': parseFloat,
+ '$ %parseInt%': parseInt,
+ '$ %Promise%': typeof Promise === 'undefined' ? undefined : Promise,
+ '$ %PromisePrototype%': typeof Promise === 'undefined' ? undefined : Promise.prototype,
+ '$ %PromiseProto_then%': typeof Promise === 'undefined' ? undefined : Promise.prototype.then,
+ '$ %Promise_all%': typeof Promise === 'undefined' ? undefined : Promise.all,
+ '$ %Promise_reject%': typeof Promise === 'undefined' ? undefined : Promise.reject,
+ '$ %Promise_resolve%': typeof Promise === 'undefined' ? undefined : Promise.resolve,
+ '$ %Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,
+ '$ %RangeError%': RangeError,
+ '$ %RangeErrorPrototype%': RangeError.prototype,
+ '$ %ReferenceError%': ReferenceError,
+ '$ %ReferenceErrorPrototype%': ReferenceError.prototype,
+ '$ %Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,
+ '$ %RegExp%': RegExp,
+ '$ %RegExpPrototype%': RegExp.prototype,
+ '$ %Set%': typeof Set === 'undefined' ? undefined : Set,
+ '$ %SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),
+ '$ %SetPrototype%': typeof Set === 'undefined' ? undefined : Set.prototype,
+ '$ %SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,
+ '$ %SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer.prototype,
+ '$ %String%': String,
+ '$ %StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,
+ '$ %StringPrototype%': String.prototype,
+ '$ %Symbol%': hasSymbols ? Symbol : undefined,
+ '$ %SymbolPrototype%': hasSymbols ? Symbol.prototype : undefined,
+ '$ %SyntaxError%': SyntaxError,
+ '$ %SyntaxErrorPrototype%': SyntaxError.prototype,
+ '$ %ThrowTypeError%': ThrowTypeError,
+ '$ %TypedArray%': TypedArray,
+ '$ %TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined,
+ '$ %TypeError%': TypeError,
+ '$ %TypeErrorPrototype%': TypeError.prototype,
+ '$ %Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,
+ '$ %Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array.prototype,
+ '$ %Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,
+ '$ %Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray.prototype,
+ '$ %Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,
+ '$ %Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array.prototype,
+ '$ %Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,
+ '$ %Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array.prototype,
+ '$ %URIError%': URIError,
+ '$ %URIErrorPrototype%': URIError.prototype,
+ '$ %WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,
+ '$ %WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined : WeakMap.prototype,
+ '$ %WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,
+ '$ %WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined : WeakSet.prototype
+};
+
+module.exports = function GetIntrinsic(name, allowMissing) {
+ if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
+ throw new TypeError('"allowMissing" argument must be a boolean');
+ }
+
+ var key = '$ ' + name;
+ if (!(key in INTRINSICS)) {
+ throw new SyntaxError('intrinsic ' + name + ' does not exist!');
+ }
+
+ // istanbul ignore if // hopefully this is impossible to test :-)
+ if (typeof INTRINSICS[key] === 'undefined' && !allowMissing) {
+ throw new TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
+ }
+ return INTRINSICS[key];
+};
diff --git a/node_modules/es-abstract/LICENSE b/node_modules/es-abstract/LICENSE
new file mode 100644
index 00000000..8c271c14
--- /dev/null
+++ b/node_modules/es-abstract/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (C) 2015 Jordan Harband
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE. \ No newline at end of file
diff --git a/node_modules/es-abstract/Makefile b/node_modules/es-abstract/Makefile
new file mode 100644
index 00000000..959bbd49
--- /dev/null
+++ b/node_modules/es-abstract/Makefile
@@ -0,0 +1,61 @@
+# Since we rely on paths relative to the makefile location, abort if make isn't being run from there.
+$(if $(findstring /,$(MAKEFILE_LIST)),$(error Please only invoke this makefile from the directory it resides in))
+
+ # The files that need updating when incrementing the version number.
+VERSIONED_FILES := *.js */*.js *.json README*
+
+
+# Add the local npm packages' bin folder to the PATH, so that `make` can find them, when invoked directly.
+# Note that rather than using `$(npm bin)` the 'node_modules/.bin' path component is hard-coded, so that invocation works even from an environment
+# where npm is (temporarily) unavailable due to having deactivated an nvm instance loaded into the calling shell in order to avoid interference with tests.
+export PATH := $(shell printf '%s' "$$PWD/node_modules/.bin:$$PATH")
+UTILS := semver
+# Make sure that all required utilities can be located.
+UTIL_CHECK := $(or $(shell PATH="$(PATH)" which $(UTILS) >/dev/null && echo 'ok'),$(error Did you forget to run `npm install` after cloning the repo? At least one of the required supporting utilities not found: $(UTILS)))
+
+# Default target (by virtue of being the first non '.'-prefixed in the file).
+.PHONY: _no-target-specified
+_no-target-specified:
+ $(error Please specify the target to make - `make list` shows targets. Alternatively, use `npm test` to run the default tests; `npm run` shows all tests)
+
+# Lists all targets defined in this makefile.
+.PHONY: list
+list:
+ @$(MAKE) -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | command grep -v -e '^[^[:alnum:]]' -e '^$@$$command ' | sort
+
+# All-tests target: invokes the specified test suites for ALL shells defined in $(SHELLS).
+.PHONY: test
+test:
+ @npm test
+
+.PHONY: _ensure-tag
+_ensure-tag:
+ifndef TAG
+ $(error Please invoke with `make TAG=<new-version> release`, where <new-version> is either an increment specifier (patch, minor, major, prepatch, preminor, premajor, prerelease), or an explicit major.minor.patch version number)
+endif
+
+CHANGELOG_ERROR = $(error No CHANGELOG specified)
+.PHONY: _ensure-changelog
+_ensure-changelog:
+ @ (git status -sb --porcelain | command grep -E '^( M|[MA] ) CHANGELOG.md' > /dev/null) || (echo no CHANGELOG.md specified && exit 2)
+
+# Ensures that the git workspace is clean.
+.PHONY: _ensure-clean
+_ensure-clean:
+ @[ -z "$$((git status --porcelain --untracked-files=no || echo err) | command grep -v 'CHANGELOG.md')" ] || { echo "Workspace is not clean; please commit changes first." >&2; exit 2; }
+
+# Makes a release; invoke with `make TAG=<versionOrIncrementSpec> release`.
+.PHONY: release
+release: _ensure-tag _ensure-changelog _ensure-clean
+ @old_ver=`git describe --abbrev=0 --tags --match 'v[0-9]*.[0-9]*.[0-9]*'` || { echo "Failed to determine current version." >&2; exit 1; }; old_ver=$${old_ver#v}; \
+ new_ver=`echo "$(TAG)" | sed 's/^v//'`; new_ver=$${new_ver:-patch}; \
+ if printf "$$new_ver" | command grep -q '^[0-9]'; then \
+ semver "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be major.minor.patch' >&2; exit 2; }; \
+ semver -r "> $$old_ver" "$$new_ver" >/dev/null || { echo 'Invalid version number specified: $(TAG) - must be HIGHER than current one.' >&2; exit 2; } \
+ else \
+ new_ver=`semver -i "$$new_ver" "$$old_ver"` || { echo 'Invalid version-increment specifier: $(TAG)' >&2; exit 2; } \
+ fi; \
+ printf "=== Bumping version **$$old_ver** to **$$new_ver** before committing and tagging:\n=== TYPE 'proceed' TO PROCEED, anything else to abort: " && read response && [ "$$response" = 'proceed' ] || { echo 'Aborted.' >&2; exit 2; }; \
+ replace "$$old_ver" "$$new_ver" -- $(VERSIONED_FILES) && \
+ git commit -m "v$$new_ver" $(VERSIONED_FILES) CHANGELOG.md && \
+ git tag -a -m "v$$new_ver" "v$$new_ver"
diff --git a/node_modules/es-abstract/README.md b/node_modules/es-abstract/README.md
new file mode 100644
index 00000000..0fbf079c
--- /dev/null
+++ b/node_modules/es-abstract/README.md
@@ -0,0 +1,44 @@
+# es-abstract <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
+
+[![Build Status][travis-svg]][travis-url]
+[![dependency status][deps-svg]][deps-url]
+[![dev dependency status][dev-deps-svg]][dev-deps-url]
+[![License][license-image]][license-url]
+[![Downloads][downloads-image]][downloads-url]
+
+[![npm badge][npm-badge-png]][package-url]
+
+[![browser support][testling-svg]][testling-url]
+
+ECMAScript spec abstract operations.
+When different versions of the spec conflict, the default export will be the latest version of the abstract operation.
+All abstract operations will also be available under an `es5`/`es2015`/`es2016` entry point, and exported property, if you require a specific version.
+
+## Example
+
+```js
+var ES = require('es-abstract');
+var assert = require('assert');
+
+assert(ES.isCallable(function () {}));
+assert(!ES.isCallable(/a/g));
+```
+
+## Tests
+Simply clone the repo, `npm install`, and run `npm test`
+
+[package-url]: https://npmjs.org/package/es-abstract
+[npm-version-svg]: http://versionbadg.es/ljharb/es-abstract.svg
+[travis-svg]: https://travis-ci.org/ljharb/es-abstract.svg
+[travis-url]: https://travis-ci.org/ljharb/es-abstract
+[deps-svg]: https://david-dm.org/ljharb/es-abstract.svg
+[deps-url]: https://david-dm.org/ljharb/es-abstract
+[dev-deps-svg]: https://david-dm.org/ljharb/es-abstract/dev-status.svg
+[dev-deps-url]: https://david-dm.org/ljharb/es-abstract#info=devDependencies
+[testling-svg]: https://ci.testling.com/ljharb/es-abstract.png
+[testling-url]: https://ci.testling.com/ljharb/es-abstract
+[npm-badge-png]: https://nodei.co/npm/es-abstract.png?downloads=true&stars=true
+[license-image]: https://img.shields.io/npm/l/es-abstract.svg
+[license-url]: LICENSE
+[downloads-image]: https://img.shields.io/npm/dm/es-abstract.svg
+[downloads-url]: https://npm-stat.com/charts.html?package=es-abstract
diff --git a/node_modules/es-abstract/es2015.js b/node_modules/es-abstract/es2015.js
new file mode 100644
index 00000000..1a4d7de5
--- /dev/null
+++ b/node_modules/es-abstract/es2015.js
@@ -0,0 +1,693 @@
+'use strict';
+
+var has = require('has');
+var toPrimitive = require('es-to-primitive/es6');
+
+var GetIntrinsic = require('./GetIntrinsic');
+
+var $TypeError = GetIntrinsic('%TypeError%');
+var $SyntaxError = GetIntrinsic('%SyntaxError%');
+var $Array = GetIntrinsic('%Array%');
+var $String = GetIntrinsic('%String%');
+var $Object = GetIntrinsic('%Object%');
+var $Number = GetIntrinsic('%Number%');
+var $Symbol = GetIntrinsic('%Symbol%', true);
+var $RegExp = GetIntrinsic('%RegExp%');
+
+var hasSymbols = !!$Symbol;
+
+var $isNaN = require('./helpers/isNaN');
+var $isFinite = require('./helpers/isFinite');
+var MAX_SAFE_INTEGER = $Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
+
+var assign = require('./helpers/assign');
+var sign = require('./helpers/sign');
+var mod = require('./helpers/mod');
+var isPrimitive = require('./helpers/isPrimitive');
+var parseInteger = parseInt;
+var bind = require('function-bind');
+var arraySlice = bind.call(Function.call, $Array.prototype.slice);
+var strSlice = bind.call(Function.call, $String.prototype.slice);
+var isBinary = bind.call(Function.call, $RegExp.prototype.test, /^0b[01]+$/i);
+var isOctal = bind.call(Function.call, $RegExp.prototype.test, /^0o[0-7]+$/i);
+var regexExec = bind.call(Function.call, $RegExp.prototype.exec);
+var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
+var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
+var hasNonWS = bind.call(Function.call, $RegExp.prototype.test, nonWSregex);
+var invalidHexLiteral = /^[-+]0x[0-9a-f]+$/i;
+var isInvalidHexLiteral = bind.call(Function.call, $RegExp.prototype.test, invalidHexLiteral);
+var $charCodeAt = bind.call(Function.call, $String.prototype.charCodeAt);
+
+var toStr = bind.call(Function.call, Object.prototype.toString);
+
+var $floor = Math.floor;
+var $abs = Math.abs;
+
+var $ObjectCreate = Object.create;
+var $gOPD = $Object.getOwnPropertyDescriptor;
+
+var $isExtensible = $Object.isExtensible;
+
+// whitespace from: http://es5.github.io/#x15.5.4.20
+// implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
+var ws = [
+ '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
+ '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
+ '\u2029\uFEFF'
+].join('');
+var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
+var replace = bind.call(Function.call, $String.prototype.replace);
+var trim = function (value) {
+ return replace(value, trimRegex, '');
+};
+
+var ES5 = require('./es5');
+
+var hasRegExpMatcher = require('is-regex');
+
+// https://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations
+var ES6 = assign(assign({}, ES5), {
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args
+ Call: function Call(F, V) {
+ var args = arguments.length > 2 ? arguments[2] : [];
+ if (!this.IsCallable(F)) {
+ throw new $TypeError(F + ' is not a function');
+ }
+ return F.apply(V, args);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive
+ ToPrimitive: toPrimitive,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toboolean
+ // ToBoolean: ES5.ToBoolean,
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-tonumber
+ ToNumber: function ToNumber(argument) {
+ var value = isPrimitive(argument) ? argument : toPrimitive(argument, $Number);
+ if (typeof value === 'symbol') {
+ throw new $TypeError('Cannot convert a Symbol value to a number');
+ }
+ if (typeof value === 'string') {
+ if (isBinary(value)) {
+ return this.ToNumber(parseInteger(strSlice(value, 2), 2));
+ } else if (isOctal(value)) {
+ return this.ToNumber(parseInteger(strSlice(value, 2), 8));
+ } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
+ return NaN;
+ } else {
+ var trimmed = trim(value);
+ if (trimmed !== value) {
+ return this.ToNumber(trimmed);
+ }
+ }
+ }
+ return $Number(value);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tointeger
+ // ToInteger: ES5.ToNumber,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint32
+ // ToInt32: ES5.ToInt32,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint32
+ // ToUint32: ES5.ToUint32,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint16
+ ToInt16: function ToInt16(argument) {
+ var int16bit = this.ToUint16(argument);
+ return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint16
+ // ToUint16: ES5.ToUint16,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint8
+ ToInt8: function ToInt8(argument) {
+ var int8bit = this.ToUint8(argument);
+ return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8
+ ToUint8: function ToUint8(argument) {
+ var number = this.ToNumber(argument);
+ if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+ var posInt = sign(number) * $floor($abs(number));
+ return mod(posInt, 0x100);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8clamp
+ ToUint8Clamp: function ToUint8Clamp(argument) {
+ var number = this.ToNumber(argument);
+ if ($isNaN(number) || number <= 0) { return 0; }
+ if (number >= 0xFF) { return 0xFF; }
+ var f = $floor(argument);
+ if (f + 0.5 < number) { return f + 1; }
+ if (number < f + 0.5) { return f; }
+ if (f % 2 !== 0) { return f + 1; }
+ return f;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring
+ ToString: function ToString(argument) {
+ if (typeof argument === 'symbol') {
+ throw new $TypeError('Cannot convert a Symbol value to a string');
+ }
+ return $String(argument);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject
+ ToObject: function ToObject(value) {
+ this.RequireObjectCoercible(value);
+ return $Object(value);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey
+ ToPropertyKey: function ToPropertyKey(argument) {
+ var key = this.ToPrimitive(argument, $String);
+ return typeof key === 'symbol' ? key : this.ToString(key);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+ ToLength: function ToLength(argument) {
+ var len = this.ToInteger(argument);
+ if (len <= 0) { return 0; } // includes converting -0 to +0
+ if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
+ return len;
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
+ CanonicalNumericIndexString: function CanonicalNumericIndexString(argument) {
+ if (toStr(argument) !== '[object String]') {
+ throw new $TypeError('must be a string');
+ }
+ if (argument === '-0') { return -0; }
+ var n = this.ToNumber(argument);
+ if (this.SameValue(this.ToString(n), argument)) { return n; }
+ return void 0;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-requireobjectcoercible
+ RequireObjectCoercible: ES5.CheckObjectCoercible,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray
+ IsArray: $Array.isArray || function IsArray(argument) {
+ return toStr(argument) === '[object Array]';
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iscallable
+ // IsCallable: ES5.IsCallable,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor
+ IsConstructor: function IsConstructor(argument) {
+ return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isextensible-o
+ IsExtensible: Object.preventExtensions
+ ? function IsExtensible(obj) {
+ if (isPrimitive(obj)) {
+ return false;
+ }
+ return $isExtensible(obj);
+ }
+ : function isExtensible(obj) { return true; }, // eslint-disable-line no-unused-vars
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isinteger
+ IsInteger: function IsInteger(argument) {
+ if (typeof argument !== 'number' || $isNaN(argument) || !$isFinite(argument)) {
+ return false;
+ }
+ var abs = $abs(argument);
+ return $floor(abs) === abs;
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ispropertykey
+ IsPropertyKey: function IsPropertyKey(argument) {
+ return typeof argument === 'string' || typeof argument === 'symbol';
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-isregexp
+ IsRegExp: function IsRegExp(argument) {
+ if (!argument || typeof argument !== 'object') {
+ return false;
+ }
+ if (hasSymbols) {
+ var isRegExp = argument[$Symbol.match];
+ if (typeof isRegExp !== 'undefined') {
+ return ES5.ToBoolean(isRegExp);
+ }
+ }
+ return hasRegExpMatcher(argument);
+ },
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevalue
+ // SameValue: ES5.SameValue,
+
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero
+ SameValueZero: function SameValueZero(x, y) {
+ return (x === y) || ($isNaN(x) && $isNaN(y));
+ },
+
+ /**
+ * 7.3.2 GetV (V, P)
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let O be ToObject(V).
+ * 3. ReturnIfAbrupt(O).
+ * 4. Return O.[[Get]](P, V).
+ */
+ GetV: function GetV(V, P) {
+ // 7.3.2.1
+ if (!this.IsPropertyKey(P)) {
+ throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+ }
+
+ // 7.3.2.2-3
+ var O = this.ToObject(V);
+
+ // 7.3.2.4
+ return O[P];
+ },
+
+ /**
+ * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
+ * 1. Assert: IsPropertyKey(P) is true.
+ * 2. Let func be GetV(O, P).
+ * 3. ReturnIfAbrupt(func).
+ * 4. If func is either undefined or null, return undefined.
+ * 5. If IsCallable(func) is false, throw a TypeError exception.
+ * 6. Return func.
+ */
+ GetMethod: function GetMethod(O, P) {
+ // 7.3.9.1
+ if (!this.IsPropertyKey(P)) {
+ throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+ }
+
+ // 7.3.9.2
+ var func = this.GetV(O, P);
+
+ // 7.3.9.4
+ if (func == null) {
+ return void 0;
+ }
+
+ // 7.3.9.5
+ if (!this.IsCallable(func)) {
+ throw new $TypeError(P + 'is not a function');
+ }
+
+ // 7.3.9.6
+ return func;
+ },
+
+ /**
+ * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
+ * 1. Assert: Type(O) is Object.
+ * 2. Assert: IsPropertyKey(P) is true.
+ * 3. Return O.[[Get]](P, O).
+ */
+ Get: function Get(O, P) {
+ // 7.3.1.1
+ if (this.Type(O) !== 'Object') {
+ throw new $TypeError('Assertion failed: Type(O) is not Object');
+ }
+ // 7.3.1.2
+ if (!this.IsPropertyKey(P)) {
+ throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+ }
+ // 7.3.1.3
+ return O[P];
+ },
+
+ Type: function Type(x) {
+ if (typeof x === 'symbol') {
+ return 'Symbol';
+ }
+ return ES5.Type(x);
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
+ SpeciesConstructor: function SpeciesConstructor(O, defaultConstructor) {
+ if (this.Type(O) !== 'Object') {
+ throw new $TypeError('Assertion failed: Type(O) is not Object');
+ }
+ var C = O.constructor;
+ if (typeof C === 'undefined') {
+ return defaultConstructor;
+ }
+ if (this.Type(C) !== 'Object') {
+ throw new $TypeError('O.constructor is not an Object');
+ }
+ var S = hasSymbols && $Symbol.species ? C[$Symbol.species] : void 0;
+ if (S == null) {
+ return defaultConstructor;
+ }
+ if (this.IsConstructor(S)) {
+ return S;
+ }
+ throw new $TypeError('no constructor found');
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
+ CompletePropertyDescriptor: function CompletePropertyDescriptor(Desc) {
+ if (!this.IsPropertyDescriptor(Desc)) {
+ throw new $TypeError('Desc must be a Property Descriptor');
+ }
+
+ if (this.IsGenericDescriptor(Desc) || this.IsDataDescriptor(Desc)) {
+ if (!has(Desc, '[[Value]]')) {
+ Desc['[[Value]]'] = void 0;
+ }
+ if (!has(Desc, '[[Writable]]')) {
+ Desc['[[Writable]]'] = false;
+ }
+ } else {
+ if (!has(Desc, '[[Get]]')) {
+ Desc['[[Get]]'] = void 0;
+ }
+ if (!has(Desc, '[[Set]]')) {
+ Desc['[[Set]]'] = void 0;
+ }
+ }
+ if (!has(Desc, '[[Enumerable]]')) {
+ Desc['[[Enumerable]]'] = false;
+ }
+ if (!has(Desc, '[[Configurable]]')) {
+ Desc['[[Configurable]]'] = false;
+ }
+ return Desc;
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
+ Set: function Set(O, P, V, Throw) {
+ if (this.Type(O) !== 'Object') {
+ throw new $TypeError('O must be an Object');
+ }
+ if (!this.IsPropertyKey(P)) {
+ throw new $TypeError('P must be a Property Key');
+ }
+ if (this.Type(Throw) !== 'Boolean') {
+ throw new $TypeError('Throw must be a Boolean');
+ }
+ if (Throw) {
+ O[P] = V;
+ return true;
+ } else {
+ try {
+ O[P] = V;
+ } catch (e) {
+ return false;
+ }
+ }
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
+ HasOwnProperty: function HasOwnProperty(O, P) {
+ if (this.Type(O) !== 'Object') {
+ throw new $TypeError('O must be an Object');
+ }
+ if (!this.IsPropertyKey(P)) {
+ throw new $TypeError('P must be a Property Key');
+ }
+ return has(O, P);
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
+ HasProperty: function HasProperty(O, P) {
+ if (this.Type(O) !== 'Object') {
+ throw new $TypeError('O must be an Object');
+ }
+ if (!this.IsPropertyKey(P)) {
+ throw new $TypeError('P must be a Property Key');
+ }
+ return P in O;
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
+ IsConcatSpreadable: function IsConcatSpreadable(O) {
+ if (this.Type(O) !== 'Object') {
+ return false;
+ }
+ if (hasSymbols && typeof $Symbol.isConcatSpreadable === 'symbol') {
+ var spreadable = this.Get(O, Symbol.isConcatSpreadable);
+ if (typeof spreadable !== 'undefined') {
+ return this.ToBoolean(spreadable);
+ }
+ }
+ return this.IsArray(O);
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-invoke
+ Invoke: function Invoke(O, P) {
+ if (!this.IsPropertyKey(P)) {
+ throw new $TypeError('P must be a Property Key');
+ }
+ var argumentsList = arraySlice(arguments, 2);
+ var func = this.GetV(O, P);
+ return this.Call(func, O, argumentsList);
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-getiterator
+ GetIterator: function GetIterator(obj, method) {
+ if (!hasSymbols) {
+ throw new SyntaxError('ES.GetIterator depends on native iterator support.');
+ }
+
+ var actualMethod = method;
+ if (arguments.length < 2) {
+ actualMethod = this.GetMethod(obj, $Symbol.iterator);
+ }
+ var iterator = this.Call(actualMethod, obj);
+ if (this.Type(iterator) !== 'Object') {
+ throw new $TypeError('iterator must return an object');
+ }
+
+ return iterator;
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
+ IteratorNext: function IteratorNext(iterator, value) {
+ var result = this.Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
+ if (this.Type(result) !== 'Object') {
+ throw new $TypeError('iterator next must return an object');
+ }
+ return result;
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
+ IteratorComplete: function IteratorComplete(iterResult) {
+ if (this.Type(iterResult) !== 'Object') {
+ throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+ }
+ return this.ToBoolean(this.Get(iterResult, 'done'));
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
+ IteratorValue: function IteratorValue(iterResult) {
+ if (this.Type(iterResult) !== 'Object') {
+ throw new $TypeError('Assertion failed: Type(iterResult) is not Object');
+ }
+ return this.Get(iterResult, 'value');
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
+ IteratorStep: function IteratorStep(iterator) {
+ var result = this.IteratorNext(iterator);
+ var done = this.IteratorComplete(result);
+ return done === true ? false : result;
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
+ IteratorClose: function IteratorClose(iterator, completion) {
+ if (this.Type(iterator) !== 'Object') {
+ throw new $TypeError('Assertion failed: Type(iterator) is not Object');
+ }
+ if (!this.IsCallable(completion)) {
+ throw new $TypeError('Assertion failed: completion is not a thunk for a Completion Record');
+ }
+ var completionThunk = completion;
+
+ var iteratorReturn = this.GetMethod(iterator, 'return');
+
+ if (typeof iteratorReturn === 'undefined') {
+ return completionThunk();
+ }
+
+ var completionRecord;
+ try {
+ var innerResult = this.Call(iteratorReturn, iterator, []);
+ } catch (e) {
+ // if we hit here, then "e" is the innerResult completion that needs re-throwing
+
+ // if the completion is of type "throw", this will throw.
+ completionRecord = completionThunk();
+ completionThunk = null; // ensure it's not called twice.
+
+ // if not, then return the innerResult completion
+ throw e;
+ }
+ completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
+ completionThunk = null; // ensure it's not called twice.
+
+ if (this.Type(innerResult) !== 'Object') {
+ throw new $TypeError('iterator .return must return an object');
+ }
+
+ return completionRecord;
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
+ CreateIterResultObject: function CreateIterResultObject(value, done) {
+ if (this.Type(done) !== 'Boolean') {
+ throw new $TypeError('Assertion failed: Type(done) is not Boolean');
+ }
+ return {
+ value: value,
+ done: done
+ };
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
+ RegExpExec: function RegExpExec(R, S) {
+ if (this.Type(R) !== 'Object') {
+ throw new $TypeError('R must be an Object');
+ }
+ if (this.Type(S) !== 'String') {
+ throw new $TypeError('S must be a String');
+ }
+ var exec = this.Get(R, 'exec');
+ if (this.IsCallable(exec)) {
+ var result = this.Call(exec, R, [S]);
+ if (result === null || this.Type(result) === 'Object') {
+ return result;
+ }
+ throw new $TypeError('"exec" method must return `null` or an Object');
+ }
+ return regexExec(R, S);
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
+ ArraySpeciesCreate: function ArraySpeciesCreate(originalArray, length) {
+ if (!this.IsInteger(length) || length < 0) {
+ throw new $TypeError('Assertion failed: length must be an integer >= 0');
+ }
+ var len = length === 0 ? 0 : length;
+ var C;
+ var isArray = this.IsArray(originalArray);
+ if (isArray) {
+ C = this.Get(originalArray, 'constructor');
+ // TODO: figure out how to make a cross-realm normal Array, a same-realm Array
+ // if (this.IsConstructor(C)) {
+ // if C is another realm's Array, C = undefined
+ // Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
+ // }
+ if (this.Type(C) === 'Object' && hasSymbols && $Symbol.species) {
+ C = this.Get(C, $Symbol.species);
+ if (C === null) {
+ C = void 0;
+ }
+ }
+ }
+ if (typeof C === 'undefined') {
+ return $Array(len);
+ }
+ if (!this.IsConstructor(C)) {
+ throw new $TypeError('C must be a constructor');
+ }
+ return new C(len); // this.Construct(C, len);
+ },
+
+ CreateDataProperty: function CreateDataProperty(O, P, V) {
+ if (this.Type(O) !== 'Object') {
+ throw new $TypeError('Assertion failed: Type(O) is not Object');
+ }
+ if (!this.IsPropertyKey(P)) {
+ throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+ }
+ var oldDesc = $gOPD(O, P);
+ var extensible = oldDesc || (typeof $isExtensible !== 'function' || $isExtensible(O));
+ var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
+ if (immutable || !extensible) {
+ return false;
+ }
+ var newDesc = {
+ configurable: true,
+ enumerable: true,
+ value: V,
+ writable: true
+ };
+ Object.defineProperty(O, P, newDesc);
+ return true;
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
+ CreateDataPropertyOrThrow: function CreateDataPropertyOrThrow(O, P, V) {
+ if (this.Type(O) !== 'Object') {
+ throw new $TypeError('Assertion failed: Type(O) is not Object');
+ }
+ if (!this.IsPropertyKey(P)) {
+ throw new $TypeError('Assertion failed: IsPropertyKey(P) is not true');
+ }
+ var success = this.CreateDataProperty(O, P, V);
+ if (!success) {
+ throw new $TypeError('unable to create data property');
+ }
+ return success;
+ },
+
+ // https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate
+ ObjectCreate: function ObjectCreate(proto, internalSlotsList) {
+ if (proto !== null && this.Type(proto) !== 'Object') {
+ throw new $TypeError('Assertion failed: proto must be null or an object');
+ }
+ var slots = arguments.length < 2 ? [] : internalSlotsList;
+ if (slots.length > 0) {
+ throw new $SyntaxError('es-abstract does not yet support internal slots');
+ }
+
+ if (proto === null && !$ObjectCreate) {
+ throw new $SyntaxError('native Object.create support is required to create null objects');
+ }
+
+ return $ObjectCreate(proto);
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
+ AdvanceStringIndex: function AdvanceStringIndex(S, index, unicode) {
+ if (this.Type(S) !== 'String') {
+ throw new $TypeError('S must be a String');
+ }
+ if (!this.IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
+ throw new $TypeError('Assertion failed: length must be an integer >= 0 and <= 2**53');
+ }
+ if (this.Type(unicode) !== 'Boolean') {
+ throw new $TypeError('Assertion failed: unicode must be a Boolean');
+ }
+ if (!unicode) {
+ return index + 1;
+ }
+ var length = S.length;
+ if ((index + 1) >= length) {
+ return index + 1;
+ }
+
+ var first = $charCodeAt(S, index);
+ if (first < 0xD800 || first > 0xDBFF) {
+ return index + 1;
+ }
+
+ var second = $charCodeAt(S, index + 1);
+ if (second < 0xDC00 || second > 0xDFFF) {
+ return index + 1;
+ }
+
+ return index + 2;
+ }
+});
+
+delete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
+
+module.exports = ES6;
diff --git a/node_modules/es-abstract/es2016.js b/node_modules/es-abstract/es2016.js
new file mode 100644
index 00000000..c9166cea
--- /dev/null
+++ b/node_modules/es-abstract/es2016.js
@@ -0,0 +1,16 @@
+'use strict';
+
+var ES2015 = require('./es2015');
+var assign = require('./helpers/assign');
+
+var ES2016 = assign(assign({}, ES2015), {
+ // https://github.com/tc39/ecma262/pull/60
+ SameValueNonNumber: function SameValueNonNumber(x, y) {
+ if (typeof x === 'number' || typeof x !== typeof y) {
+ throw new TypeError('SameValueNonNumber requires two non-number values of the same type.');
+ }
+ return this.SameValue(x, y);
+ }
+});
+
+module.exports = ES2016;
diff --git a/node_modules/es-abstract/es2017.js b/node_modules/es-abstract/es2017.js
new file mode 100644
index 00000000..af3ff480
--- /dev/null
+++ b/node_modules/es-abstract/es2017.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var ES2016 = require('./es2016');
+var assign = require('./helpers/assign');
+
+var ES2017 = assign(assign({}, ES2016), {
+ ToIndex: function ToIndex(value) {
+ if (typeof value === 'undefined') {
+ return 0;
+ }
+ var integerIndex = this.ToInteger(value);
+ if (integerIndex < 0) {
+ throw new RangeError('index must be >= 0');
+ }
+ var index = this.ToLength(integerIndex);
+ if (!this.SameValueZero(integerIndex, index)) {
+ throw new RangeError('index must be >= 0 and < 2 ** 53 - 1');
+ }
+ return index;
+ }
+});
+
+delete ES2017.EnumerableOwnNames; // replaced with EnumerableOwnProperties
+
+module.exports = ES2017;
diff --git a/node_modules/es-abstract/es5.js b/node_modules/es-abstract/es5.js
new file mode 100644
index 00000000..3af7e7ea
--- /dev/null
+++ b/node_modules/es-abstract/es5.js
@@ -0,0 +1,242 @@
+'use strict';
+
+var GetIntrinsic = require('./GetIntrinsic');
+
+var $Object = GetIntrinsic('%Object%');
+var $TypeError = GetIntrinsic('%TypeError%');
+var $String = GetIntrinsic('%String%');
+
+var $isNaN = require('./helpers/isNaN');
+var $isFinite = require('./helpers/isFinite');
+
+var sign = require('./helpers/sign');
+var mod = require('./helpers/mod');
+
+var IsCallable = require('is-callable');
+var toPrimitive = require('es-to-primitive/es5');
+
+var has = require('has');
+
+// https://es5.github.io/#x9
+var ES5 = {
+ ToPrimitive: toPrimitive,
+
+ ToBoolean: function ToBoolean(value) {
+ return !!value;
+ },
+ ToNumber: function ToNumber(value) {
+ return +value; // eslint-disable-line no-implicit-coercion
+ },
+ ToInteger: function ToInteger(value) {
+ var number = this.ToNumber(value);
+ if ($isNaN(number)) { return 0; }
+ if (number === 0 || !$isFinite(number)) { return number; }
+ return sign(number) * Math.floor(Math.abs(number));
+ },
+ ToInt32: function ToInt32(x) {
+ return this.ToNumber(x) >> 0;
+ },
+ ToUint32: function ToUint32(x) {
+ return this.ToNumber(x) >>> 0;
+ },
+ ToUint16: function ToUint16(value) {
+ var number = this.ToNumber(value);
+ if ($isNaN(number) || number === 0 || !$isFinite(number)) { return 0; }
+ var posInt = sign(number) * Math.floor(Math.abs(number));
+ return mod(posInt, 0x10000);
+ },
+ ToString: function ToString(value) {
+ return $String(value);
+ },
+ ToObject: function ToObject(value) {
+ this.CheckObjectCoercible(value);
+ return $Object(value);
+ },
+ CheckObjectCoercible: function CheckObjectCoercible(value, optMessage) {
+ /* jshint eqnull:true */
+ if (value == null) {
+ throw new $TypeError(optMessage || 'Cannot call method on ' + value);
+ }
+ return value;
+ },
+ IsCallable: IsCallable,
+ SameValue: function SameValue(x, y) {
+ if (x === y) { // 0 === -0, but they are not identical.
+ if (x === 0) { return 1 / x === 1 / y; }
+ return true;
+ }
+ return $isNaN(x) && $isNaN(y);
+ },
+
+ // https://www.ecma-international.org/ecma-262/5.1/#sec-8
+ Type: function Type(x) {
+ if (x === null) {
+ return 'Null';
+ }
+ if (typeof x === 'undefined') {
+ return 'Undefined';
+ }
+ if (typeof x === 'function' || typeof x === 'object') {
+ return 'Object';
+ }
+ if (typeof x === 'number') {
+ return 'Number';
+ }
+ if (typeof x === 'boolean') {
+ return 'Boolean';
+ }
+ if (typeof x === 'string') {
+ return 'String';
+ }
+ },
+
+ // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
+ IsPropertyDescriptor: function IsPropertyDescriptor(Desc) {
+ if (this.Type(Desc) !== 'Object') {
+ return false;
+ }
+ var allowed = {
+ '[[Configurable]]': true,
+ '[[Enumerable]]': true,
+ '[[Get]]': true,
+ '[[Set]]': true,
+ '[[Value]]': true,
+ '[[Writable]]': true
+ };
+ // jscs:disable
+ for (var key in Desc) { // eslint-disable-line
+ if (has(Desc, key) && !allowed[key]) {
+ return false;
+ }
+ }
+ // jscs:enable
+ var isData = has(Desc, '[[Value]]');
+ var IsAccessor = has(Desc, '[[Get]]') || has(Desc, '[[Set]]');
+ if (isData && IsAccessor) {
+ throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
+ }
+ return true;
+ },
+
+ // https://ecma-international.org/ecma-262/5.1/#sec-8.10.1
+ IsAccessorDescriptor: function IsAccessorDescriptor(Desc) {
+ if (typeof Desc === 'undefined') {
+ return false;
+ }
+
+ if (!this.IsPropertyDescriptor(Desc)) {
+ throw new $TypeError('Desc must be a Property Descriptor');
+ }
+
+ if (!has(Desc, '[[Get]]') && !has(Desc, '[[Set]]')) {
+ return false;
+ }
+
+ return true;
+ },
+
+ // https://ecma-international.org/ecma-262/5.1/#sec-8.10.2
+ IsDataDescriptor: function IsDataDescriptor(Desc) {
+ if (typeof Desc === 'undefined') {
+ return false;
+ }
+
+ if (!this.IsPropertyDescriptor(Desc)) {
+ throw new $TypeError('Desc must be a Property Descriptor');
+ }
+
+ if (!has(Desc, '[[Value]]') && !has(Desc, '[[Writable]]')) {
+ return false;
+ }
+
+ return true;
+ },
+
+ // https://ecma-international.org/ecma-262/5.1/#sec-8.10.3
+ IsGenericDescriptor: function IsGenericDescriptor(Desc) {
+ if (typeof Desc === 'undefined') {
+ return false;
+ }
+
+ if (!this.IsPropertyDescriptor(Desc)) {
+ throw new $TypeError('Desc must be a Property Descriptor');
+ }
+
+ if (!this.IsAccessorDescriptor(Desc) && !this.IsDataDescriptor(Desc)) {
+ return true;
+ }
+
+ return false;
+ },
+
+ // https://ecma-international.org/ecma-262/5.1/#sec-8.10.4
+ FromPropertyDescriptor: function FromPropertyDescriptor(Desc) {
+ if (typeof Desc === 'undefined') {
+ return Desc;
+ }
+
+ if (!this.IsPropertyDescriptor(Desc)) {
+ throw new $TypeError('Desc must be a Property Descriptor');
+ }
+
+ if (this.IsDataDescriptor(Desc)) {
+ return {
+ value: Desc['[[Value]]'],
+ writable: !!Desc['[[Writable]]'],
+ enumerable: !!Desc['[[Enumerable]]'],
+ configurable: !!Desc['[[Configurable]]']
+ };
+ } else if (this.IsAccessorDescriptor(Desc)) {
+ return {
+ get: Desc['[[Get]]'],
+ set: Desc['[[Set]]'],
+ enumerable: !!Desc['[[Enumerable]]'],
+ configurable: !!Desc['[[Configurable]]']
+ };
+ } else {
+ throw new $TypeError('FromPropertyDescriptor must be called with a fully populated Property Descriptor');
+ }
+ },
+
+ // https://ecma-international.org/ecma-262/5.1/#sec-8.10.5
+ ToPropertyDescriptor: function ToPropertyDescriptor(Obj) {
+ if (this.Type(Obj) !== 'Object') {
+ throw new $TypeError('ToPropertyDescriptor requires an object');
+ }
+
+ var desc = {};
+ if (has(Obj, 'enumerable')) {
+ desc['[[Enumerable]]'] = this.ToBoolean(Obj.enumerable);
+ }
+ if (has(Obj, 'configurable')) {
+ desc['[[Configurable]]'] = this.ToBoolean(Obj.configurable);
+ }
+ if (has(Obj, 'value')) {
+ desc['[[Value]]'] = Obj.value;
+ }
+ if (has(Obj, 'writable')) {
+ desc['[[Writable]]'] = this.ToBoolean(Obj.writable);
+ }
+ if (has(Obj, 'get')) {
+ var getter = Obj.get;
+ if (typeof getter !== 'undefined' && !this.IsCallable(getter)) {
+ throw new TypeError('getter must be a function');
+ }
+ desc['[[Get]]'] = getter;
+ }
+ if (has(Obj, 'set')) {
+ var setter = Obj.set;
+ if (typeof setter !== 'undefined' && !this.IsCallable(setter)) {
+ throw new $TypeError('setter must be a function');
+ }
+ desc['[[Set]]'] = setter;
+ }
+
+ if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
+ throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
+ }
+ return desc;
+ }
+};
+
+module.exports = ES5;
diff --git a/node_modules/es-abstract/es6.js b/node_modules/es-abstract/es6.js
new file mode 100644
index 00000000..2d1f4dc9
--- /dev/null
+++ b/node_modules/es-abstract/es6.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('./es2015');
diff --git a/node_modules/es-abstract/es7.js b/node_modules/es-abstract/es7.js
new file mode 100644
index 00000000..f2f15c0a
--- /dev/null
+++ b/node_modules/es-abstract/es7.js
@@ -0,0 +1,3 @@
+'use strict';
+
+module.exports = require('./es2016');
diff --git a/node_modules/es-abstract/helpers/assign.js b/node_modules/es-abstract/helpers/assign.js
new file mode 100644
index 00000000..2533d20a
--- /dev/null
+++ b/node_modules/es-abstract/helpers/assign.js
@@ -0,0 +1,17 @@
+var bind = require('function-bind');
+var has = bind.call(Function.call, Object.prototype.hasOwnProperty);
+
+var $assign = Object.assign;
+
+module.exports = function assign(target, source) {
+ if ($assign) {
+ return $assign(target, source);
+ }
+
+ for (var key in source) {
+ if (has(source, key)) {
+ target[key] = source[key];
+ }
+ }
+ return target;
+};
diff --git a/node_modules/es-abstract/helpers/isFinite.js b/node_modules/es-abstract/helpers/isFinite.js
new file mode 100644
index 00000000..46585376
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isFinite.js
@@ -0,0 +1,3 @@
+var $isNaN = Number.isNaN || function (a) { return a !== a; };
+
+module.exports = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
diff --git a/node_modules/es-abstract/helpers/isNaN.js b/node_modules/es-abstract/helpers/isNaN.js
new file mode 100644
index 00000000..e4d4f95f
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isNaN.js
@@ -0,0 +1,3 @@
+module.exports = Number.isNaN || function isNaN(a) {
+ return a !== a;
+};
diff --git a/node_modules/es-abstract/helpers/isPrimitive.js b/node_modules/es-abstract/helpers/isPrimitive.js
new file mode 100644
index 00000000..36691564
--- /dev/null
+++ b/node_modules/es-abstract/helpers/isPrimitive.js
@@ -0,0 +1,3 @@
+module.exports = function isPrimitive(value) {
+ return value === null || (typeof value !== 'function' && typeof value !== 'object');
+};
diff --git a/node_modules/es-abstract/helpers/mod.js b/node_modules/es-abstract/helpers/mod.js
new file mode 100644
index 00000000..5867fd97
--- /dev/null
+++ b/node_modules/es-abstract/helpers/mod.js
@@ -0,0 +1,4 @@
+module.exports = function mod(number, modulo) {
+ var remain = number % modulo;
+ return Math.floor(remain >= 0 ? remain : remain + modulo);
+};
diff --git a/node_modules/es-abstract/helpers/sign.js b/node_modules/es-abstract/helpers/sign.js
new file mode 100644
index 00000000..2ac0bf1b
--- /dev/null
+++ b/node_modules/es-abstract/helpers/sign.js
@@ -0,0 +1,3 @@
+module.exports = function sign(number) {
+ return number >= 0 ? 1 : -1;
+};
diff --git a/node_modules/es-abstract/index.js b/node_modules/es-abstract/index.js
new file mode 100644
index 00000000..cee856bb
--- /dev/null
+++ b/node_modules/es-abstract/index.js
@@ -0,0 +1,22 @@
+'use strict';
+
+var assign = require('./helpers/assign');
+
+var ES5 = require('./es5');
+var ES2015 = require('./es2015');
+var ES2016 = require('./es2016');
+var ES2017 = require('./es2017');
+
+var ES = {
+ ES5: ES5,
+ ES6: ES2015,
+ ES2015: ES2015,
+ ES7: ES2016,
+ ES2016: ES2016,
+ ES2017: ES2017
+};
+assign(ES, ES5);
+delete ES.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
+assign(ES, ES2015);
+
+module.exports = ES;
diff --git a/node_modules/es-abstract/operations/2015.js b/node_modules/es-abstract/operations/2015.js
new file mode 100644
index 00000000..1df63c3f
--- /dev/null
+++ b/node_modules/es-abstract/operations/2015.js
@@ -0,0 +1,78 @@
+'use strict';
+
+module.exports = {
+ IsPropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type',
+ IsAccessorDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-isaccessordescriptor',
+ IsDataDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-isdatadescriptor',
+ IsGenericDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-isgenericdescriptor',
+ FromPropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-frompropertydescriptor',
+ ToPropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-topropertydescriptor',
+ CompletePropertyDescriptor: 'https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor',
+ ToPrimitive: 'https://ecma-international.org/ecma-262/6.0/#sec-toprimitive',
+ ToBoolean: 'https://ecma-international.org/ecma-262/6.0/#sec-toboolean',
+ ToNumber: 'https://ecma-international.org/ecma-262/6.0/#sec-tonumber',
+ ToInteger: 'https://ecma-international.org/ecma-262/6.0/#sec-tointeger',
+ ToInt32: 'https://ecma-international.org/ecma-262/6.0/#sec-toint32',
+ ToUint32: 'https://ecma-international.org/ecma-262/6.0/#sec-touint32',
+ ToInt16: 'https://ecma-international.org/ecma-262/6.0/#sec-toint16',
+ ToUint16: 'https://ecma-international.org/ecma-262/6.0/#sec-touint16',
+ ToInt8: 'https://ecma-international.org/ecma-262/6.0/#sec-toint8',
+ ToUint8: 'https://ecma-international.org/ecma-262/6.0/#sec-touint8',
+ ToUint8Clamp: 'https://ecma-international.org/ecma-262/6.0/#sec-touint8clamp',
+ ToString: 'https://ecma-international.org/ecma-262/6.0/#sec-tostring',
+ ToObject: 'https://ecma-international.org/ecma-262/6.0/#sec-toobject',
+ ToPropertyKey: 'https://ecma-international.org/ecma-262/6.0/#sec-topropertykey',
+ ToLength: 'https://ecma-international.org/ecma-262/6.0/#sec-tolength',
+ CanonicalNumericIndexString: 'https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring',
+ RequireObjectCoercible: 'https://ecma-international.org/ecma-262/6.0/#sec-requireobjectcoercible',
+ IsArray: 'https://ecma-international.org/ecma-262/6.0/#sec-isarray',
+ IsCallable: 'https://ecma-international.org/ecma-262/6.0/#sec-iscallable',
+ IsConstructor: 'https://ecma-international.org/ecma-262/6.0/#sec-isconstructor',
+ IsExtensible: 'https://ecma-international.org/ecma-262/6.0/#sec-isextensible-o',
+ IsInteger: 'https://ecma-international.org/ecma-262/6.0/#sec-isinteger',
+ IsPropertyKey: 'https://ecma-international.org/ecma-262/6.0/#sec-ispropertykey',
+ IsRegExp: 'https://ecma-international.org/ecma-262/6.0/#sec-isregexp',
+ SameValue: 'https://ecma-international.org/ecma-262/6.0/#sec-samevalue',
+ SameValueZero: 'https://ecma-international.org/ecma-262/6.0/#sec-samevaluezero',
+ Get: 'https://ecma-international.org/ecma-262/6.0/#sec-get-o-p',
+ GetV: 'https://ecma-international.org/ecma-262/6.0/#sec-getv',
+ Set: 'https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw',
+ CreateDataProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-createdataproperty',
+ CreateMethodProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-createmethodproperty',
+ CreateDataPropertyOrThrow: 'https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow',
+ DefinePropertyOrThrow: 'https://ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow',
+ DeletePropertyOrThrow: 'https://ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow',
+ GetMethod: 'https://ecma-international.org/ecma-262/6.0/#sec-getmethod',
+ HasProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-hasproperty',
+ HasOwnProperty: 'https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty',
+ Call: 'https://ecma-international.org/ecma-262/6.0/#sec-call',
+ Construct: 'https://ecma-international.org/ecma-262/6.0/#sec-construct',
+ SetIntegrityLevel: 'https://ecma-international.org/ecma-262/6.0/#sec-setintegritylevel',
+ TestIntegrityLevel: 'https://ecma-international.org/ecma-262/6.0/#sec-testintegritylevel',
+ CreateArrayFromList: 'https://ecma-international.org/ecma-262/6.0/#sec-createarrayfromlist',
+ CreateListFromArrayLike: 'https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike',
+ Invoke: 'https://ecma-international.org/ecma-262/6.0/#sec-invoke',
+ OrdinaryHasInstance: 'https://ecma-international.org/ecma-262/6.0/#sec-ordinaryhasinstance',
+ SpeciesConstructor: 'https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor',
+ EnumerableOwnNames: 'https://ecma-international.org/ecma-262/6.0/#sec-enumerableownnames',
+ GetIterator: 'https://ecma-international.org/ecma-262/6.0/#sec-getiterator',
+ IteratorNext: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratornext',
+ IteratorComplete: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete',
+ IteratorValue: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue',
+ IteratorStep: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep',
+ IteratorClose: 'https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose',
+ CreateIterResultObject: 'https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject',
+ CreateListIterator: 'https://ecma-international.org/ecma-262/6.0/#sec-createlistiterator',
+ Type: 'https://ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types',
+ thisNumberValue: 'https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object',
+ thisTimeValue: 'https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object',
+ thisStringValue: 'https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object',
+ RegExpExec: 'https://ecma-international.org/ecma-262/6.0/#sec-regexpexec',
+ RegExpBuiltinExec: 'https://ecma-international.org/ecma-262/6.0/#sec-regexpbuiltinexec',
+ IsConcatSpreadable: 'https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable',
+ IsPromise: 'https://ecma-international.org/ecma-262/6.0/#sec-ispromise',
+ ArraySpeciesCreate: 'https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate',
+ ObjectCreate: 'https://ecma-international.org/ecma-262/6.0/#sec-objectcreate',
+ AdvanceStringIndex: 'https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex',
+ NormalCompletion: 'https://ecma-international.org/ecma-262/6.0/#sec-normalcompletion'
+};
diff --git a/node_modules/es-abstract/operations/2016.js b/node_modules/es-abstract/operations/2016.js
new file mode 100644
index 00000000..6ac8aae7
--- /dev/null
+++ b/node_modules/es-abstract/operations/2016.js
@@ -0,0 +1,80 @@
+'use strict';
+
+module.exports = {
+ IsPropertyDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-property-descriptor-specification-type',
+ IsAccessorDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-isaccessordescriptor',
+ IsDataDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-isdatadescriptor',
+ IsGenericDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-isgenericdescriptor',
+ FromPropertyDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-frompropertydescriptor',
+ ToPropertyDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-topropertydescriptor',
+ CompletePropertyDescriptor: 'https://ecma-international.org/ecma-262/7.0/#sec-completepropertydescriptor',
+ ToPrimitive: 'https://ecma-international.org/ecma-262/7.0/#sec-toprimitive',
+ ToBoolean: 'https://ecma-international.org/ecma-262/7.0/#sec-toboolean',
+ ToNumber: 'https://ecma-international.org/ecma-262/7.0/#sec-tonumber',
+ ToInteger: 'https://ecma-international.org/ecma-262/7.0/#sec-tointeger',
+ ToInt32: 'https://ecma-international.org/ecma-262/7.0/#sec-toint32',
+ ToUint32: 'https://ecma-international.org/ecma-262/7.0/#sec-touint32',
+ ToInt16: 'https://ecma-international.org/ecma-262/7.0/#sec-toint16',
+ ToUint16: 'https://ecma-international.org/ecma-262/7.0/#sec-touint16',
+ ToInt8: 'https://ecma-international.org/ecma-262/7.0/#sec-toint8',
+ ToUint8: 'https://ecma-international.org/ecma-262/7.0/#sec-touint8',
+ ToUint8Clamp: 'https://ecma-international.org/ecma-262/7.0/#sec-touint8clamp',
+ ToString: 'https://ecma-international.org/ecma-262/7.0/#sec-tostring',
+ ToObject: 'https://ecma-international.org/ecma-262/7.0/#sec-toobject',
+ ToPropertyKey: 'https://ecma-international.org/ecma-262/7.0/#sec-topropertykey',
+ ToLength: 'https://ecma-international.org/ecma-262/7.0/#sec-tolength',
+ CanonicalNumericIndexString: 'https://ecma-international.org/ecma-262/7.0/#sec-canonicalnumericindexstring',
+ RequireObjectCoercible: 'https://ecma-international.org/ecma-262/7.0/#sec-requireobjectcoercible',
+ IsArray: 'https://ecma-international.org/ecma-262/7.0/#sec-isarray',
+ IsCallable: 'https://ecma-international.org/ecma-262/7.0/#sec-iscallable',
+ IsConstructor: 'https://ecma-international.org/ecma-262/7.0/#sec-isconstructor',
+ IsExtensible: 'https://ecma-international.org/ecma-262/7.0/#sec-isextensible-o',
+ IsInteger: 'https://ecma-international.org/ecma-262/7.0/#sec-isinteger',
+ IsPropertyKey: 'https://ecma-international.org/ecma-262/7.0/#sec-ispropertykey',
+ IsRegExp: 'https://ecma-international.org/ecma-262/7.0/#sec-isregexp',
+ SameValue: 'https://ecma-international.org/ecma-262/7.0/#sec-samevalue',
+ SameValueZero: 'https://ecma-international.org/ecma-262/7.0/#sec-samevaluezero',
+ SameValueNonNumber: 'https://ecma-international.org/ecma-262/7.0/#sec-samevaluenonnumber',
+ Get: 'https://ecma-international.org/ecma-262/7.0/#sec-get-o-p',
+ GetV: 'https://ecma-international.org/ecma-262/7.0/#sec-getv',
+ Set: 'https://ecma-international.org/ecma-262/7.0/#sec-set-o-p-v-throw',
+ CreateDataProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-createdataproperty',
+ CreateMethodProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-createmethodproperty',
+ CreateDataPropertyOrThrow: 'https://ecma-international.org/ecma-262/7.0/#sec-createdatapropertyorthrow',
+ DefinePropertyOrThrow: 'https://ecma-international.org/ecma-262/7.0/#sec-definepropertyorthrow',
+ DeletePropertyOrThrow: 'https://ecma-international.org/ecma-262/7.0/#sec-deletepropertyorthrow',
+ GetMethod: 'https://ecma-international.org/ecma-262/7.0/#sec-getmethod',
+ HasProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-hasproperty',
+ HasOwnProperty: 'https://ecma-international.org/ecma-262/7.0/#sec-hasownproperty',
+ Call: 'https://ecma-international.org/ecma-262/7.0/#sec-call',
+ Construct: 'https://ecma-international.org/ecma-262/7.0/#sec-construct',
+ SetIntegrityLevel: 'https://ecma-international.org/ecma-262/7.0/#sec-setintegritylevel',
+ TestIntegrityLevel: 'https://ecma-international.org/ecma-262/7.0/#sec-testintegritylevel',
+ CreateArrayFromList: 'https://ecma-international.org/ecma-262/7.0/#sec-createarrayfromlist',
+ CreateListFromArrayLike: 'https://ecma-international.org/ecma-262/7.0/#sec-createlistfromarraylike',
+ Invoke: 'https://ecma-international.org/ecma-262/7.0/#sec-invoke',
+ OrdinaryHasInstance: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinaryhasinstance',
+ SpeciesConstructor: 'https://ecma-international.org/ecma-262/7.0/#sec-speciesconstructor',
+ EnumerableOwnNames: 'https://ecma-international.org/ecma-262/7.0/#sec-enumerableownnames',
+ GetIterator: 'https://ecma-international.org/ecma-262/7.0/#sec-getiterator',
+ IteratorNext: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratornext',
+ IteratorComplete: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratorcomplete',
+ IteratorValue: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratorvalue',
+ IteratorStep: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratorstep',
+ IteratorClose: 'https://ecma-international.org/ecma-262/7.0/#sec-iteratorclose',
+ CreateIterResultObject: 'https://ecma-international.org/ecma-262/7.0/#sec-createiterresultobject',
+ CreateListIterator: 'https://ecma-international.org/ecma-262/7.0/#sec-createlistiterator',
+ Type: 'https://ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types',
+ thisNumberValue: 'https://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-number-prototype-object',
+ thisTimeValue: 'https://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-date-prototype-object',
+ thisStringValue: 'https://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-string-prototype-object',
+ RegExpExec: 'https://ecma-international.org/ecma-262/7.0/#sec-regexpexec',
+ RegExpBuiltinExec: 'https://ecma-international.org/ecma-262/7.0/#sec-regexpbuiltinexec',
+ IsConcatSpreadable: 'https://ecma-international.org/ecma-262/7.0/#sec-isconcatspreadable',
+ IsPromise: 'https://ecma-international.org/ecma-262/7.0/#sec-ispromise',
+ ArraySpeciesCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-arrayspeciescreate',
+ ObjectCreate: 'https://ecma-international.org/ecma-262/7.0/#sec-objectcreate',
+ AdvanceStringIndex: 'https://ecma-international.org/ecma-262/7.0/#sec-advancestringindex',
+ OrdinarySet: 'https://ecma-international.org/ecma-262/7.0/#sec-ordinaryset',
+ NormalCompletion: 'https://ecma-international.org/ecma-262/7.0/#sec-normalcompletion'
+};
diff --git a/node_modules/es-abstract/operations/2017.js b/node_modules/es-abstract/operations/2017.js
new file mode 100644
index 00000000..c8c3aa49
--- /dev/null
+++ b/node_modules/es-abstract/operations/2017.js
@@ -0,0 +1,82 @@
+'use strict';
+
+module.exports = {
+ IsPropertyDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-property-descriptor-specification-type',
+ IsAccessorDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-isaccessordescriptor',
+ IsDataDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-isdatadescriptor',
+ IsGenericDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-isgenericdescriptor',
+ FromPropertyDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-frompropertydescriptor',
+ ToPropertyDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-topropertydescriptor',
+ CompletePropertyDescriptor: 'https://ecma-international.org/ecma-262/8.0/#sec-completepropertydescriptor',
+ ToPrimitive: 'https://ecma-international.org/ecma-262/8.0/#sec-toprimitive',
+ ToBoolean: 'https://ecma-international.org/ecma-262/8.0/#sec-toboolean',
+ ToNumber: 'https://ecma-international.org/ecma-262/8.0/#sec-tonumber',
+ ToInteger: 'https://ecma-international.org/ecma-262/8.0/#sec-tointeger',
+ ToInt32: 'https://ecma-international.org/ecma-262/8.0/#sec-toint32',
+ ToUint32: 'https://ecma-international.org/ecma-262/8.0/#sec-touint32',
+ ToInt16: 'https://ecma-international.org/ecma-262/8.0/#sec-toint16',
+ ToUint16: 'https://ecma-international.org/ecma-262/8.0/#sec-touint16',
+ ToInt8: 'https://ecma-international.org/ecma-262/8.0/#sec-toint8',
+ ToUint8: 'https://ecma-international.org/ecma-262/8.0/#sec-touint8',
+ ToUint8Clamp: 'https://ecma-international.org/ecma-262/8.0/#sec-touint8clamp',
+ ToString: 'https://ecma-international.org/ecma-262/8.0/#sec-tostring',
+ ToObject: 'https://ecma-international.org/ecma-262/8.0/#sec-toobject',
+ ToPropertyKey: 'https://ecma-international.org/ecma-262/8.0/#sec-topropertykey',
+ ToLength: 'https://ecma-international.org/ecma-262/8.0/#sec-tolength',
+ CanonicalNumericIndexString: 'https://ecma-international.org/ecma-262/8.0/#sec-canonicalnumericindexstring',
+ ToIndex: 'https://ecma-international.org/ecma-262/8.0/#sec-toindex',
+ RequireObjectCoercible: 'https://ecma-international.org/ecma-262/8.0/#sec-requireobjectcoercible',
+ IsArray: 'https://ecma-international.org/ecma-262/8.0/#sec-isarray',
+ IsCallable: 'https://ecma-international.org/ecma-262/8.0/#sec-iscallable',
+ IsConstructor: 'https://ecma-international.org/ecma-262/8.0/#sec-isconstructor',
+ IsExtensible: 'https://ecma-international.org/ecma-262/8.0/#sec-isextensible-o',
+ IsInteger: 'https://ecma-international.org/ecma-262/8.0/#sec-isinteger',
+ IsPropertyKey: 'https://ecma-international.org/ecma-262/8.0/#sec-ispropertykey',
+ IsRegExp: 'https://ecma-international.org/ecma-262/8.0/#sec-isregexp',
+ SameValue: 'https://ecma-international.org/ecma-262/8.0/#sec-samevalue',
+ SameValueZero: 'https://ecma-international.org/ecma-262/8.0/#sec-samevaluezero',
+ SameValueNonNumber: 'https://ecma-international.org/ecma-262/8.0/#sec-samevaluenonnumber',
+ Get: 'https://ecma-international.org/ecma-262/8.0/#sec-get-o-p',
+ GetV: 'https://ecma-international.org/ecma-262/8.0/#sec-getv',
+ Set: 'https://ecma-international.org/ecma-262/8.0/#sec-set-o-p-v-throw',
+ CreateDataProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-createdataproperty',
+ CreateMethodProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-createmethodproperty',
+ CreateDataPropertyOrThrow: 'https://ecma-international.org/ecma-262/8.0/#sec-createdatapropertyorthrow',
+ DefinePropertyOrThrow: 'https://ecma-international.org/ecma-262/8.0/#sec-definepropertyorthrow',
+ DeletePropertyOrThrow: 'https://ecma-international.org/ecma-262/8.0/#sec-deletepropertyorthrow',
+ GetMethod: 'https://ecma-international.org/ecma-262/8.0/#sec-getmethod',
+ HasProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-hasproperty',
+ HasOwnProperty: 'https://ecma-international.org/ecma-262/8.0/#sec-hasownproperty',
+ Call: 'https://ecma-international.org/ecma-262/8.0/#sec-call',
+ Construct: 'https://ecma-international.org/ecma-262/8.0/#sec-construct',
+ SetIntegrityLevel: 'https://ecma-international.org/ecma-262/8.0/#sec-setintegritylevel',
+ TestIntegrityLevel: 'https://ecma-international.org/ecma-262/8.0/#sec-testintegritylevel',
+ CreateArrayFromList: 'https://ecma-international.org/ecma-262/8.0/#sec-createarrayfromlist',
+ CreateListFromArrayLike: 'https://ecma-international.org/ecma-262/8.0/#sec-createlistfromarraylike',
+ Invoke: 'https://ecma-international.org/ecma-262/8.0/#sec-invoke',
+ OrdinaryHasInstance: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinaryhasinstance',
+ SpeciesConstructor: 'https://ecma-international.org/ecma-262/8.0/#sec-speciesconstructor',
+ EnumerableOwnProperties: 'https://ecma-international.org/ecma-262/8.0/#sec-enumerableownproperties',
+ GetIterator: 'https://ecma-international.org/ecma-262/8.0/#sec-getiterator',
+ IteratorNext: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratornext',
+ IteratorComplete: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratorcomplete',
+ IteratorValue: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratorvalue',
+ IteratorStep: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratorstep',
+ IteratorClose: 'https://ecma-international.org/ecma-262/8.0/#sec-iteratorclose',
+ CreateIterResultObject: 'https://ecma-international.org/ecma-262/8.0/#sec-createiterresultobject',
+ CreateListIterator: 'https://ecma-international.org/ecma-262/8.0/#sec-createlistiterator',
+ Type: 'https://ecma-international.org/ecma-262/8.0/#sec-ecmascript-language-types',
+ thisNumberValue: 'https://ecma-international.org/ecma-262/8.0/#sec-properties-of-the-number-prototype-object',
+ thisTimeValue: 'https://ecma-international.org/ecma-262/8.0/#sec-properties-of-the-date-prototype-object',
+ thisStringValue: 'https://ecma-international.org/ecma-262/8.0/#sec-properties-of-the-string-prototype-object',
+ RegExpExec: 'https://ecma-international.org/ecma-262/8.0/#sec-regexpexec',
+ RegExpBuiltinExec: 'https://ecma-international.org/ecma-262/8.0/#sec-regexpbuiltinexec',
+ IsConcatSpreadable: 'https://ecma-international.org/ecma-262/8.0/#sec-isconcatspreadable',
+ IsPromise: 'https://ecma-international.org/ecma-262/8.0/#sec-ispromise',
+ ArraySpeciesCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-arrayspeciescreate',
+ ObjectCreate: 'https://ecma-international.org/ecma-262/8.0/#sec-objectcreate',
+ AdvanceStringIndex: 'https://ecma-international.org/ecma-262/8.0/#sec-advancestringindex',
+ OrdinarySet: 'https://ecma-international.org/ecma-262/8.0/#sec-ordinaryset',
+ NormalCompletion: 'https://ecma-international.org/ecma-262/8.0/#sec-normalcompletion',
+ IsSharedArrayBuffer: 'https://ecma-international.org/ecma-262/8.0/#sec-issharedarraybuffer',
+};
diff --git a/node_modules/es-abstract/operations/es5.js b/node_modules/es-abstract/operations/es5.js
new file mode 100644
index 00000000..205d1e68
--- /dev/null
+++ b/node_modules/es-abstract/operations/es5.js
@@ -0,0 +1,10 @@
+'use strict';
+
+module.exports = {
+ IsPropertyDescriptor: 'https://ecma-international.org/ecma-262/5.1/#sec-8.10',
+ IsAccessorDescriptor: 'https://ecma-international.org/ecma-262/5.1/#sec-8.10.1',
+ IsDataDescriptor: 'https://ecma-international.org/ecma-262/5.1/#sec-8.10.2',
+ IsGenericDescriptor: 'https://ecma-international.org/ecma-262/5.1/#sec-8.10.3',
+ FromPropertyDescriptor: 'https://ecma-international.org/ecma-262/5.1/#sec-8.10.4',
+ ToPropertyDescriptor: 'https://ecma-international.org/ecma-262/5.1/#sec-8.10.5'
+};
diff --git a/node_modules/es-abstract/package.json b/node_modules/es-abstract/package.json
new file mode 100644
index 00000000..43fb94c3
--- /dev/null
+++ b/node_modules/es-abstract/package.json
@@ -0,0 +1,98 @@
+{
+ "name": "es-abstract",
+ "version": "1.12.0",
+ "author": {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ },
+ "contributors": [
+ {
+ "name": "Jordan Harband",
+ "email": "ljharb@gmail.com",
+ "url": "http://ljharb.codes"
+ }
+ ],
+ "description": "ECMAScript spec abstract operations.",
+ "license": "MIT",
+ "main": "index.js",
+ "scripts": {
+ "prepublish": "safe-publish-latest",
+ "pretest": "npm run --silent lint",
+ "test": "npm run tests-only",
+ "posttest": "npm run --silent security",
+ "tests-only": "node test",
+ "coverage": "nyc npm run --silent tests-only >/dev/null",
+ "postcoverage": "nyc report",
+ "lint": "npm run --silent jscs && npm run --silent eslint",
+ "jscs": "jscs test/*.js *.js",
+ "eslint": "eslint test/*.js *.js",
+ "eccheck": "editorconfig-tools check *.js **/*.js > /dev/null",
+ "security": "nsp check"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/ljharb/es-abstract.git"
+ },
+ "keywords": [
+ "ECMAScript",
+ "ES",
+ "abstract",
+ "operation",
+ "abstract operation",
+ "JavaScript",
+ "ES5",
+ "ES6",
+ "ES7"
+ ],
+ "dependencies": {
+ "es-to-primitive": "^1.1.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.1",
+ "is-callable": "^1.1.3",
+ "is-regex": "^1.0.4"
+ },
+ "devDependencies": {
+ "@ljharb/eslint-config": "^12.2.1",
+ "editorconfig-tools": "^0.1.1",
+ "eslint": "^4.19.1",
+ "foreach": "^2.0.5",
+ "jscs": "^3.0.7",
+ "nsp": "^3.2.1",
+ "nyc": "^10.3.2",
+ "object-inspect": "^1.6.0",
+ "object-is": "^1.0.1",
+ "object.assign": "^4.1.0",
+ "replace": "^1.0.0",
+ "safe-publish-latest": "^1.1.1",
+ "semver": "^5.5.0",
+ "tape": "^4.9.0"
+ },
+ "testling": {
+ "files": "test/index.js",
+ "browsers": [
+ "iexplore/6.0..latest",
+ "firefox/3.0..6.0",
+ "firefox/15.0..latest",
+ "firefox/nightly",
+ "chrome/4.0..10.0",
+ "chrome/20.0..latest",
+ "chrome/canary",
+ "opera/10.0..latest",
+ "opera/next",
+ "safari/4.0..latest",
+ "ipad/6.0..latest",
+ "iphone/6.0..latest",
+ "android-browser/4.2"
+ ]
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "greenkeeper": {
+ "//": "nyc is ignored because it requires node 4+, and we support older than that",
+ "ignore": [
+ "nyc"
+ ]
+ }
+}
diff --git a/node_modules/es-abstract/test/.eslintrc b/node_modules/es-abstract/test/.eslintrc
new file mode 100644
index 00000000..904e833b
--- /dev/null
+++ b/node_modules/es-abstract/test/.eslintrc
@@ -0,0 +1,11 @@
+{
+ "rules": {
+ "id-length": 0,
+ "max-lines": 0,
+ "max-statements-per-line": [2, { "max": 3 }],
+ "max-nested-callbacks": [2, 3],
+ "max-statements": 0,
+ "no-implicit-coercion": [1],
+ "no-invalid-this": [1]
+ }
+}
diff --git a/node_modules/es-abstract/test/GetIntrinsic.js b/node_modules/es-abstract/test/GetIntrinsic.js
new file mode 100644
index 00000000..ed8e7ecc
--- /dev/null
+++ b/node_modules/es-abstract/test/GetIntrinsic.js
@@ -0,0 +1,34 @@
+'use strict';
+
+var GetIntrinsic = require('../GetIntrinsic');
+
+var test = require('tape');
+var forEach = require('foreach');
+var debug = require('object-inspect');
+
+var v = require('./helpers/values');
+
+test('export', function (t) {
+ t.equal(typeof GetIntrinsic, 'function', 'it is a function');
+ t.equal(GetIntrinsic.length, 2, 'function has length of 2');
+
+ t.end();
+});
+
+test('throws', function (t) {
+ t['throws'](
+ function () { GetIntrinsic('not an intrinsic'); },
+ SyntaxError,
+ 'nonexistent intrinsic throws a syntax error'
+ );
+
+ forEach(v.nonBooleans, function (nonBoolean) {
+ t['throws'](
+ function () { GetIntrinsic('%', nonBoolean); },
+ TypeError,
+ debug(nonBoolean) + ' is not a Boolean'
+ );
+ });
+
+ t.end();
+});
diff --git a/node_modules/es-abstract/test/diffOps.js b/node_modules/es-abstract/test/diffOps.js
new file mode 100644
index 00000000..2d870897
--- /dev/null
+++ b/node_modules/es-abstract/test/diffOps.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var keys = require('object-keys');
+var forEach = require('foreach');
+
+module.exports = function diffOperations(actual, expected, expectedMissing) {
+ var actualKeys = keys(actual);
+ var expectedKeys = keys(expected);
+
+ var extra = [];
+ var missing = [];
+ forEach(actualKeys, function (op) {
+ if (!(op in expected)) {
+ extra.push(op);
+ }
+ });
+ forEach(expectedKeys, function (op) {
+ if (!(op in actual) && expectedMissing.indexOf(op) === -1) {
+ missing.push(op);
+ }
+ });
+
+ return { missing: missing, extra: extra };
+};
diff --git a/node_modules/es-abstract/test/es2015.js b/node_modules/es-abstract/test/es2015.js
new file mode 100644
index 00000000..51b94d2e
--- /dev/null
+++ b/node_modules/es-abstract/test/es2015.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var ES = require('../').ES2015;
+
+var ops = require('../operations/2015');
+
+// jscs:disable
+var expectedMissing = ['CreateMethodProperty', 'DefinePropertyOrThrow', 'DeletePropertyOrThrow', 'Construct', 'SetIntegrityLevel', 'TestIntegrityLevel', 'CreateArrayFromList', 'CreateListFromArrayLike', 'OrdinaryHasInstance', 'EnumerableOwnNames', 'GetIterator', 'IteratorNext', 'IteratorComplete', 'IteratorValue', 'IteratorStep', 'IteratorClose', 'CreateListIterator', 'thisNumberValue', 'thisTimeValue', 'thisStringValue', 'RegExpBuiltinExec', 'IsPromise', 'NormalCompletion'];
+// jscs:enable
+
+require('./tests').es2015(ES, ops, expectedMissing);
diff --git a/node_modules/es-abstract/test/es2016.js b/node_modules/es-abstract/test/es2016.js
new file mode 100644
index 00000000..4e9dd2af
--- /dev/null
+++ b/node_modules/es-abstract/test/es2016.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var ES = require('../').ES2016;
+
+var ops = require('../operations/2016');
+
+// jscs:disable
+var expectedMissing = ['CreateMethodProperty', 'DefinePropertyOrThrow', 'DeletePropertyOrThrow', 'Construct', 'SetIntegrityLevel', 'TestIntegrityLevel', 'CreateArrayFromList', 'CreateListFromArrayLike', 'OrdinaryHasInstance', 'EnumerableOwnNames', 'GetIterator', 'IteratorNext', 'IteratorComplete', 'IteratorValue', 'IteratorStep', 'IteratorClose', 'CreateListIterator', 'thisNumberValue', 'thisTimeValue', 'thisStringValue', 'RegExpBuiltinExec', 'IsPromise', 'OrdinarySet', 'NormalCompletion'];
+// jscs:enable
+
+require('./tests').es2016(ES, ops, expectedMissing);
diff --git a/node_modules/es-abstract/test/es2017.js b/node_modules/es-abstract/test/es2017.js
new file mode 100644
index 00000000..82533049
--- /dev/null
+++ b/node_modules/es-abstract/test/es2017.js
@@ -0,0 +1,11 @@
+'use strict';
+
+var ES = require('../').ES2017;
+
+var ops = require('../operations/2017');
+
+// jscs:disable
+var expectedMissing = ['CreateMethodProperty', 'DefinePropertyOrThrow', 'DeletePropertyOrThrow', 'Construct', 'SetIntegrityLevel', 'TestIntegrityLevel', 'CreateArrayFromList', 'CreateListFromArrayLike', 'OrdinaryHasInstance', 'EnumerableOwnProperties', 'GetIterator', 'IteratorNext', 'IteratorComplete', 'IteratorValue', 'IteratorStep', 'IteratorClose', 'CreateListIterator', 'thisNumberValue', 'thisTimeValue', 'thisStringValue', 'RegExpBuiltinExec', 'IsPromise', 'OrdinarySet', 'NormalCompletion', 'IsSharedArrayBuffer'];
+// jscs:enable
+
+require('./tests').es2017(ES, ops, expectedMissing);
diff --git a/node_modules/es-abstract/test/es5.js b/node_modules/es-abstract/test/es5.js
new file mode 100644
index 00000000..cca30304
--- /dev/null
+++ b/node_modules/es-abstract/test/es5.js
@@ -0,0 +1,415 @@
+'use strict';
+
+var ES = require('../').ES5;
+var test = require('tape');
+
+var forEach = require('foreach');
+var is = require('object-is');
+
+var coercibleObject = { valueOf: function () { return '3'; }, toString: function () { return 42; } };
+var coercibleFnObject = {
+ valueOf: function () { return function valueOfFn() {}; },
+ toString: function () { return 42; }
+};
+var valueOfOnlyObject = { valueOf: function () { return 4; }, toString: function () { return {}; } };
+var toStringOnlyObject = { valueOf: function () { return {}; }, toString: function () { return 7; } };
+var uncoercibleObject = { valueOf: function () { return {}; }, toString: function () { return {}; } };
+var uncoercibleFnObject = {
+ valueOf: function () { return function valueOfFn() {}; },
+ toString: function () { return function toStrFn() {}; }
+};
+var objects = [{}, coercibleObject, toStringOnlyObject, valueOfOnlyObject];
+var numbers = [0, -0, Infinity, -Infinity, 42];
+var nonNullPrimitives = [true, false, 'foo', ''].concat(numbers);
+var primitives = [undefined, null].concat(nonNullPrimitives);
+
+test('ToPrimitive', function (t) {
+ t.test('primitives', function (st) {
+ var testPrimitive = function (primitive) {
+ st.ok(is(ES.ToPrimitive(primitive), primitive), primitive + ' is returned correctly');
+ };
+ forEach(primitives, testPrimitive);
+ st.end();
+ });
+
+ t.test('objects', function (st) {
+ st.equal(ES.ToPrimitive(coercibleObject), coercibleObject.valueOf(), 'coercibleObject coerces to valueOf');
+ st.equal(ES.ToPrimitive(coercibleObject, Number), coercibleObject.valueOf(), 'coercibleObject with hint Number coerces to valueOf');
+ st.equal(ES.ToPrimitive(coercibleObject, String), coercibleObject.toString(), 'coercibleObject with hint String coerces to toString');
+ st.equal(ES.ToPrimitive(coercibleFnObject), coercibleFnObject.toString(), 'coercibleFnObject coerces to toString');
+ st.equal(ES.ToPrimitive(toStringOnlyObject), toStringOnlyObject.toString(), 'toStringOnlyObject returns toString');
+ st.equal(ES.ToPrimitive(valueOfOnlyObject), valueOfOnlyObject.valueOf(), 'valueOfOnlyObject returns valueOf');
+ st.equal(ES.ToPrimitive({}), '[object Object]', '{} with no hint coerces to Object#toString');
+ st.equal(ES.ToPrimitive({}, String), '[object Object]', '{} with hint String coerces to Object#toString');
+ st.equal(ES.ToPrimitive({}, Number), '[object Object]', '{} with hint Number coerces to Object#toString');
+ st['throws'](function () { return ES.ToPrimitive(uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+ st['throws'](function () { return ES.ToPrimitive(uncoercibleFnObject); }, TypeError, 'uncoercibleFnObject throws a TypeError');
+ st.end();
+ });
+
+ t.end();
+});
+
+test('ToBoolean', function (t) {
+ t.equal(false, ES.ToBoolean(undefined), 'undefined coerces to false');
+ t.equal(false, ES.ToBoolean(null), 'null coerces to false');
+ t.equal(false, ES.ToBoolean(false), 'false returns false');
+ t.equal(true, ES.ToBoolean(true), 'true returns true');
+ forEach([0, -0, NaN], function (falsyNumber) {
+ t.equal(false, ES.ToBoolean(falsyNumber), 'falsy number ' + falsyNumber + ' coerces to false');
+ });
+ forEach([Infinity, 42, 1, -Infinity], function (truthyNumber) {
+ t.equal(true, ES.ToBoolean(truthyNumber), 'truthy number ' + truthyNumber + ' coerces to true');
+ });
+ t.equal(false, ES.ToBoolean(''), 'empty string coerces to false');
+ t.equal(true, ES.ToBoolean('foo'), 'nonempty string coerces to true');
+ forEach(objects, function (obj) {
+ t.equal(true, ES.ToBoolean(obj), 'object coerces to true');
+ });
+ t.equal(true, ES.ToBoolean(uncoercibleObject), 'uncoercibleObject coerces to true');
+ t.end();
+});
+
+test('ToNumber', function (t) {
+ t.ok(is(NaN, ES.ToNumber(undefined)), 'undefined coerces to NaN');
+ t.ok(is(ES.ToNumber(null), 0), 'null coerces to +0');
+ t.ok(is(ES.ToNumber(false), 0), 'false coerces to +0');
+ t.equal(1, ES.ToNumber(true), 'true coerces to 1');
+ t.ok(is(NaN, ES.ToNumber(NaN)), 'NaN returns itself');
+ forEach([0, -0, 42, Infinity, -Infinity], function (num) {
+ t.equal(num, ES.ToNumber(num), num + ' returns itself');
+ });
+ forEach(['foo', '0', '4a', '2.0', 'Infinity', '-Infinity'], function (numString) {
+ t.ok(is(+numString, ES.ToNumber(numString)), '"' + numString + '" coerces to ' + Number(numString));
+ });
+ forEach(objects, function (object) {
+ t.ok(is(ES.ToNumber(object), ES.ToNumber(ES.ToPrimitive(object))), 'object ' + object + ' coerces to same as ToPrimitive of object does');
+ });
+ t['throws'](function () { return ES.ToNumber(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToInteger', function (t) {
+ t.ok(is(0, ES.ToInteger(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity, 42], function (num) {
+ t.ok(is(num, ES.ToInteger(num)), num + ' returns itself');
+ t.ok(is(-num, ES.ToInteger(-num)), '-' + num + ' returns itself');
+ });
+ t.equal(3, ES.ToInteger(Math.PI), 'pi returns 3');
+ t['throws'](function () { return ES.ToInteger(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToInt32', function (t) {
+ t.ok(is(0, ES.ToInt32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt32(-num)), '-' + num + ' returns +0');
+ });
+ t['throws'](function () { return ES.ToInt32(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt32(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt32(0x80000000), -0x80000000), '2^31 returns -2^31');
+ t.ok(is(ES.ToInt32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToInt32(num), ES.ToInt32(ES.ToUint32(num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToInt32(-num), ES.ToInt32(ES.ToUint32(-num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+});
+
+test('ToUint32', function (t) {
+ t.ok(is(0, ES.ToUint32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint32(-num)), '-' + num + ' returns +0');
+ });
+ t['throws'](function () { return ES.ToUint32(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint32(0x100000000 - 1), 0x100000000 - 1), '2^32 - 1 returns 2^32 - 1');
+ t.ok(is(ES.ToUint32(0x80000000), 0x80000000), '2^31 returns 2^31');
+ t.ok(is(ES.ToUint32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToUint32(num), ES.ToUint32(ES.ToInt32(num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToUint32(-num), ES.ToUint32(ES.ToInt32(-num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+});
+
+test('ToUint16', function (t) {
+ t.ok(is(0, ES.ToUint16(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint16(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint16(-num)), '-' + num + ' returns +0');
+ });
+ t['throws'](function () { return ES.ToUint16(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint16(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint16(0x100000000 - 1), 0x10000 - 1), '2^32 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToUint16(0x80000000 - 1), 0x10000 - 1), '2^31 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToUint16(0x10000 - 1), 0x10000 - 1), '2^16 - 1 returns 2^16 - 1');
+ t.end();
+});
+
+test('ToString', function (t) {
+ t['throws'](function () { return ES.ToString(uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+});
+
+test('ToObject', function (t) {
+ t['throws'](function () { return ES.ToObject(undefined); }, TypeError, 'undefined throws');
+ t['throws'](function () { return ES.ToObject(null); }, TypeError, 'null throws');
+ forEach(numbers, function (number) {
+ var obj = ES.ToObject(number);
+ t.equal(typeof obj, 'object', 'number ' + number + ' coerces to object');
+ t.equal(true, obj instanceof Number, 'object of ' + number + ' is Number object');
+ t.ok(is(obj.valueOf(), number), 'object of ' + number + ' coerces to ' + number);
+ });
+ t.end();
+});
+
+test('CheckObjectCoercible', function (t) {
+ t['throws'](function () { return ES.CheckObjectCoercible(undefined); }, TypeError, 'undefined throws');
+ t['throws'](function () { return ES.CheckObjectCoercible(null); }, TypeError, 'null throws');
+ var checkCoercible = function (value) {
+ t.doesNotThrow(function () { return ES.CheckObjectCoercible(value); }, '"' + value + '" does not throw');
+ };
+ forEach(objects.concat(nonNullPrimitives), checkCoercible);
+ t.end();
+});
+
+test('IsCallable', function (t) {
+ t.equal(true, ES.IsCallable(function () {}), 'function is callable');
+ var nonCallables = [/a/g, {}, Object.prototype, NaN].concat(primitives);
+ forEach(nonCallables, function (nonCallable) {
+ t.equal(false, ES.IsCallable(nonCallable), nonCallable + ' is not callable');
+ });
+ t.end();
+});
+
+test('SameValue', function (t) {
+ t.equal(true, ES.SameValue(NaN, NaN), 'NaN is SameValue as NaN');
+ t.equal(false, ES.SameValue(0, -0), '+0 is not SameValue as -0');
+ forEach(objects.concat(primitives), function (val) {
+ t.equal(val === val, ES.SameValue(val, val), '"' + val + '" is SameValue to itself');
+ });
+ t.end();
+});
+
+test('Type', function (t) {
+ t.equal(ES.Type(), 'Undefined', 'Type() is Undefined');
+ t.equal(ES.Type(undefined), 'Undefined', 'Type(undefined) is Undefined');
+ t.equal(ES.Type(null), 'Null', 'Type(null) is Null');
+ t.equal(ES.Type(true), 'Boolean', 'Type(true) is Boolean');
+ t.equal(ES.Type(false), 'Boolean', 'Type(false) is Boolean');
+ t.equal(ES.Type(0), 'Number', 'Type(0) is Number');
+ t.equal(ES.Type(NaN), 'Number', 'Type(NaN) is Number');
+ t.equal(ES.Type('abc'), 'String', 'Type("abc") is String');
+ t.equal(ES.Type(function () {}), 'Object', 'Type(function () {}) is Object');
+ t.equal(ES.Type({}), 'Object', 'Type({}) is Object');
+ t.end();
+});
+
+var bothDescriptor = function () {
+ return { '[[Get]]': function () {}, '[[Value]]': true };
+};
+var accessorDescriptor = function () {
+ return {
+ '[[Get]]': function () {},
+ '[[Enumerable]]': true,
+ '[[Configurable]]': true
+ };
+};
+var mutatorDescriptor = function () {
+ return {
+ '[[Set]]': function () {},
+ '[[Enumerable]]': true,
+ '[[Configurable]]': true
+ };
+};
+var dataDescriptor = function () {
+ return {
+ '[[Value]]': 42,
+ '[[Writable]]': false,
+ '[[Configurable]]': false
+ };
+};
+var genericDescriptor = function () {
+ return {
+ '[[Configurable]]': true,
+ '[[Enumerable]]': false
+ };
+};
+
+test('IsPropertyDescriptor', function (t) {
+ forEach(primitives, function (primitive) {
+ t.equal(ES.IsPropertyDescriptor(primitive), false, primitive + ' is not a Property Descriptor');
+ });
+
+ t.equal(ES.IsPropertyDescriptor({ invalid: true }), false, 'invalid keys not allowed on a Property Descriptor');
+
+ t.equal(ES.IsPropertyDescriptor({}), true, 'empty object is an incomplete Property Descriptor');
+
+ t.equal(ES.IsPropertyDescriptor(accessorDescriptor()), true, 'accessor descriptor is a Property Descriptor');
+ t.equal(ES.IsPropertyDescriptor(mutatorDescriptor()), true, 'mutator descriptor is a Property Descriptor');
+ t.equal(ES.IsPropertyDescriptor(dataDescriptor()), true, 'data descriptor is a Property Descriptor');
+ t.equal(ES.IsPropertyDescriptor(genericDescriptor()), true, 'generic descriptor is a Property Descriptor');
+
+ t['throws'](function () {
+ ES.IsPropertyDescriptor(bothDescriptor());
+ }, TypeError, 'a Property Descriptor can not be both a Data and an Accessor Descriptor');
+
+ t.end();
+});
+
+test('IsAccessorDescriptor', function (t) {
+ forEach(nonNullPrimitives.concat(null), function (primitive) {
+ t['throws'](function () { ES.IsAccessorDescriptor(primitive); }, TypeError, primitive + ' is not a Property Descriptor');
+ });
+
+ t.equal(ES.IsAccessorDescriptor(), false, 'no value is not an Accessor Descriptor');
+ t.equal(ES.IsAccessorDescriptor(undefined), false, 'undefined value is not an Accessor Descriptor');
+
+ t.equal(ES.IsAccessorDescriptor(accessorDescriptor()), true, 'accessor descriptor is an Accessor Descriptor');
+ t.equal(ES.IsAccessorDescriptor(mutatorDescriptor()), true, 'mutator descriptor is an Accessor Descriptor');
+ t.equal(ES.IsAccessorDescriptor(dataDescriptor()), false, 'data descriptor is not an Accessor Descriptor');
+ t.equal(ES.IsAccessorDescriptor(genericDescriptor()), false, 'generic descriptor is not an Accessor Descriptor');
+
+ t.end();
+});
+
+test('IsDataDescriptor', function (t) {
+ forEach(nonNullPrimitives.concat(null), function (primitive) {
+ t['throws'](function () { ES.IsDataDescriptor(primitive); }, TypeError, primitive + ' is not a Property Descriptor');
+ });
+
+ t.equal(ES.IsDataDescriptor(), false, 'no value is not a Data Descriptor');
+ t.equal(ES.IsDataDescriptor(undefined), false, 'undefined value is not a Data Descriptor');
+
+ t.equal(ES.IsDataDescriptor(accessorDescriptor()), false, 'accessor descriptor is not a Data Descriptor');
+ t.equal(ES.IsDataDescriptor(mutatorDescriptor()), false, 'mutator descriptor is not a Data Descriptor');
+ t.equal(ES.IsDataDescriptor(dataDescriptor()), true, 'data descriptor is a Data Descriptor');
+ t.equal(ES.IsDataDescriptor(genericDescriptor()), false, 'generic descriptor is not a Data Descriptor');
+
+ t.end();
+});
+
+test('IsGenericDescriptor', function (t) {
+ forEach(nonNullPrimitives.concat(null), function (primitive) {
+ t['throws'](
+ function () { ES.IsGenericDescriptor(primitive); },
+ TypeError,
+ primitive + ' is not a Property Descriptor'
+ );
+ });
+
+ t.equal(ES.IsGenericDescriptor(), false, 'no value is not a Data Descriptor');
+ t.equal(ES.IsGenericDescriptor(undefined), false, 'undefined value is not a Data Descriptor');
+
+ t.equal(ES.IsGenericDescriptor(accessorDescriptor()), false, 'accessor descriptor is not a generic Descriptor');
+ t.equal(ES.IsGenericDescriptor(mutatorDescriptor()), false, 'mutator descriptor is not a generic Descriptor');
+ t.equal(ES.IsGenericDescriptor(dataDescriptor()), false, 'data descriptor is not a generic Descriptor');
+
+ t.equal(ES.IsGenericDescriptor(genericDescriptor()), true, 'generic descriptor is a generic Descriptor');
+
+ t.end();
+});
+
+test('FromPropertyDescriptor', function (t) {
+ t.equal(ES.FromPropertyDescriptor(), undefined, 'no value begets undefined');
+ t.equal(ES.FromPropertyDescriptor(undefined), undefined, 'undefined value begets undefined');
+
+ forEach(nonNullPrimitives.concat(null), function (primitive) {
+ t['throws'](
+ function () { ES.FromPropertyDescriptor(primitive); },
+ TypeError,
+ primitive + ' is not a Property Descriptor'
+ );
+ });
+
+ var accessor = accessorDescriptor();
+ t.deepEqual(ES.FromPropertyDescriptor(accessor), {
+ get: accessor['[[Get]]'],
+ set: accessor['[[Set]]'],
+ enumerable: !!accessor['[[Enumerable]]'],
+ configurable: !!accessor['[[Configurable]]']
+ });
+
+ var mutator = mutatorDescriptor();
+ t.deepEqual(ES.FromPropertyDescriptor(mutator), {
+ get: mutator['[[Get]]'],
+ set: mutator['[[Set]]'],
+ enumerable: !!mutator['[[Enumerable]]'],
+ configurable: !!mutator['[[Configurable]]']
+ });
+ var data = dataDescriptor();
+ t.deepEqual(ES.FromPropertyDescriptor(data), {
+ value: data['[[Value]]'],
+ writable: data['[[Writable]]'],
+ enumerable: !!data['[[Enumerable]]'],
+ configurable: !!data['[[Configurable]]']
+ });
+
+ t['throws'](
+ function () { ES.FromPropertyDescriptor(genericDescriptor()); },
+ TypeError,
+ 'a complete Property Descriptor is required'
+ );
+
+ t.end();
+});
+
+test('ToPropertyDescriptor', function (t) {
+ forEach(nonNullPrimitives.concat(null), function (primitive) {
+ t['throws'](
+ function () { ES.ToPropertyDescriptor(primitive); },
+ TypeError,
+ primitive + ' is not an Object'
+ );
+ });
+
+ var accessor = accessorDescriptor();
+ t.deepEqual(ES.ToPropertyDescriptor({
+ get: accessor['[[Get]]'],
+ enumerable: !!accessor['[[Enumerable]]'],
+ configurable: !!accessor['[[Configurable]]']
+ }), accessor);
+
+ var mutator = mutatorDescriptor();
+ t.deepEqual(ES.ToPropertyDescriptor({
+ set: mutator['[[Set]]'],
+ enumerable: !!mutator['[[Enumerable]]'],
+ configurable: !!mutator['[[Configurable]]']
+ }), mutator);
+
+ var data = dataDescriptor();
+ t.deepEqual(ES.ToPropertyDescriptor({
+ value: data['[[Value]]'],
+ writable: data['[[Writable]]'],
+ configurable: !!data['[[Configurable]]']
+ }), data);
+
+ var both = bothDescriptor();
+ t['throws'](
+ function () {
+ ES.ToPropertyDescriptor({ get: both['[[Get]]'], value: both['[[Value]]'] });
+ },
+ TypeError,
+ 'data and accessor descriptors are mutually exclusive'
+ );
+
+ t['throws'](
+ function () { ES.ToPropertyDescriptor({ get: 'not callable' }); },
+ TypeError,
+ '"get" must be undefined or callable'
+ );
+
+ t['throws'](
+ function () { ES.ToPropertyDescriptor({ set: 'not callable' }); },
+ TypeError,
+ '"set" must be undefined or callable'
+ );
+
+ t.end();
+});
diff --git a/node_modules/es-abstract/test/es6.js b/node_modules/es-abstract/test/es6.js
new file mode 100644
index 00000000..e7c9d98a
--- /dev/null
+++ b/node_modules/es-abstract/test/es6.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var test = require('tape');
+
+var ES = require('../');
+var ES6 = ES.ES6;
+var ES2015 = ES.ES2015;
+var ES6entry = require('../es6');
+
+test('legacy es6 export', function (t) {
+ t.equal(ES6, ES2015, 'main ES6 === main ES2015');
+ t.end();
+});
+
+test('legacy es6 entry point', function (t) {
+ t.equal(ES6, ES6entry, 'main ES6 === ES6 entry point');
+ t.end();
+});
diff --git a/node_modules/es-abstract/test/es7.js b/node_modules/es-abstract/test/es7.js
new file mode 100644
index 00000000..ee57e153
--- /dev/null
+++ b/node_modules/es-abstract/test/es7.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var test = require('tape');
+
+var ES = require('../');
+var ES7 = ES.ES7;
+var ES2016 = ES.ES2016;
+var ES7entry = require('../es7');
+
+test('legacy es7 export', function (t) {
+ t.equal(ES7, ES2016, 'main ES7 === main ES2016');
+ t.end();
+});
+
+test('legacy es7 entry point', function (t) {
+ t.equal(ES7, ES7entry, 'main ES7 === ES7 entry point');
+ t.end();
+});
diff --git a/node_modules/es-abstract/test/helpers/values.js b/node_modules/es-abstract/test/helpers/values.js
new file mode 100644
index 00000000..02408dd6
--- /dev/null
+++ b/node_modules/es-abstract/test/helpers/values.js
@@ -0,0 +1,53 @@
+'use strict';
+
+var hasSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
+
+var coercibleObject = { valueOf: function () { return 3; }, toString: function () { return 42; } };
+var valueOfOnlyObject = { valueOf: function () { return 4; }, toString: function () { return {}; } };
+var toStringOnlyObject = { valueOf: function () { return {}; }, toString: function () { return 7; } };
+var uncoercibleObject = { valueOf: function () { return {}; }, toString: function () { return {}; } };
+var objects = [{}, coercibleObject, toStringOnlyObject, valueOfOnlyObject];
+var nullPrimitives = [undefined, null];
+var nonIntegerNumbers = [-1.3, 0.2, 1.8, 1 / 3];
+var numbers = [0, -0, Infinity, -Infinity, 42];
+var strings = ['', 'foo'];
+var booleans = [true, false];
+var symbols = hasSymbols ? [Symbol.iterator, Symbol('foo')] : [];
+var nonSymbolPrimitives = [].concat(nullPrimitives, booleans, strings, numbers);
+var nonNumberPrimitives = [].concat(nullPrimitives, booleans, strings, symbols);
+var nonNullPrimitives = [].concat(booleans, strings, numbers, symbols);
+var nonUndefinedPrimitives = [].concat(null, nonNullPrimitives);
+var nonStrings = [].concat(nullPrimitives, booleans, numbers, symbols, objects);
+var primitives = [].concat(nullPrimitives, nonNullPrimitives);
+var nonPropertyKeys = [].concat(nullPrimitives, booleans, numbers, objects);
+var propertyKeys = [].concat(strings, symbols);
+var nonBooleans = [].concat(nullPrimitives, strings, symbols, numbers, objects);
+var falsies = [].concat(nullPrimitives, false, '', 0, -0, NaN);
+var truthies = [].concat(true, 'foo', 42, symbols, objects);
+
+module.exports = {
+ coercibleObject: coercibleObject,
+ valueOfOnlyObject: valueOfOnlyObject,
+ toStringOnlyObject: toStringOnlyObject,
+ uncoercibleObject: uncoercibleObject,
+ objects: objects,
+ nullPrimitives: nullPrimitives,
+ numbers: numbers,
+ strings: strings,
+ booleans: booleans,
+ symbols: symbols,
+ hasSymbols: hasSymbols,
+ nonSymbolPrimitives: nonSymbolPrimitives,
+ nonNumberPrimitives: nonNumberPrimitives,
+ nonNullPrimitives: nonNullPrimitives,
+ nonUndefinedPrimitives: nonUndefinedPrimitives,
+ nonStrings: nonStrings,
+ nonNumbers: nonNumberPrimitives.concat(objects),
+ nonIntegerNumbers: nonIntegerNumbers,
+ primitives: primitives,
+ nonPropertyKeys: nonPropertyKeys,
+ propertyKeys: propertyKeys,
+ nonBooleans: nonBooleans,
+ falsies: falsies,
+ truthies: truthies
+};
diff --git a/node_modules/es-abstract/test/index.js b/node_modules/es-abstract/test/index.js
new file mode 100644
index 00000000..63271ac2
--- /dev/null
+++ b/node_modules/es-abstract/test/index.js
@@ -0,0 +1,28 @@
+'use strict';
+
+var ES = require('../');
+var test = require('tape');
+
+var ESkeys = Object.keys(ES).sort();
+var ES6keys = Object.keys(ES.ES6).sort();
+
+test('exposed properties', function (t) {
+ t.deepEqual(ESkeys, ES6keys.concat(['ES2017', 'ES7', 'ES2016', 'ES6', 'ES2015', 'ES5']).sort(), 'main ES object keys match ES6 keys');
+ t.end();
+});
+
+test('methods match', function (t) {
+ ES6keys.forEach(function (key) {
+ t.equal(ES.ES6[key], ES[key], 'method ' + key + ' on main ES object is ES6 method');
+ });
+ t.end();
+});
+
+require('./GetIntrinsic');
+
+require('./es5');
+require('./es6');
+require('./es2015');
+require('./es7');
+require('./es2016');
+require('./es2017');
diff --git a/node_modules/es-abstract/test/tests.js b/node_modules/es-abstract/test/tests.js
new file mode 100644
index 00000000..df52c82c
--- /dev/null
+++ b/node_modules/es-abstract/test/tests.js
@@ -0,0 +1,1610 @@
+'use strict';
+
+var test = require('tape');
+
+var forEach = require('foreach');
+var is = require('object-is');
+var debug = require('object-inspect');
+var assign = require('object.assign');
+
+var v = require('./helpers/values');
+var diffOps = require('./diffOps');
+
+var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
+
+var getArraySubclassWithSpeciesConstructor = function getArraySubclass(speciesConstructor) {
+ var Bar = function Bar() {
+ var inst = [];
+ Object.setPrototypeOf(inst, Bar.prototype);
+ Object.defineProperty(inst, 'constructor', { value: Bar });
+ return inst;
+ };
+ Bar.prototype = Object.create(Array.prototype);
+ Object.setPrototypeOf(Bar, Array);
+ Object.defineProperty(Bar, Symbol.species, { value: speciesConstructor });
+
+ return Bar;
+};
+
+var hasSpecies = v.hasSymbols && Symbol.species;
+
+var hasGroups = 'groups' in (/a/).exec('a');
+var groups = function groups(matchObject) {
+ return hasGroups ? assign(matchObject, { groups: matchObject.groups }) : matchObject;
+};
+
+var es2015 = function ES2015(ES, ops, expectedMissing) {
+ test('has expected operations', function (t) {
+ var diff = diffOps(ES, ops, expectedMissing);
+
+ t.deepEqual(diff.extra, [], 'no extra ops');
+
+ t.deepEqual(diff.missing, [], 'no unexpected missing ops');
+
+ t.end();
+ });
+
+ test('ToPrimitive', function (t) {
+ t.test('primitives', function (st) {
+ var testPrimitive = function (primitive) {
+ st.ok(is(ES.ToPrimitive(primitive), primitive), debug(primitive) + ' is returned correctly');
+ };
+ forEach(v.primitives, testPrimitive);
+ st.end();
+ });
+
+ t.test('objects', function (st) {
+ st.equal(ES.ToPrimitive(v.coercibleObject), 3, 'coercibleObject with no hint coerces to valueOf');
+ st.ok(is(ES.ToPrimitive({}), '[object Object]'), '{} with no hint coerces to Object#toString');
+ st.equal(ES.ToPrimitive(v.coercibleObject, Number), 3, 'coercibleObject with hint Number coerces to valueOf');
+ st.ok(is(ES.ToPrimitive({}, Number), '[object Object]'), '{} with hint Number coerces to NaN');
+ st.equal(ES.ToPrimitive(v.coercibleObject, String), 42, 'coercibleObject with hint String coerces to nonstringified toString');
+ st.equal(ES.ToPrimitive({}, String), '[object Object]', '{} with hint String coerces to Object#toString');
+ st.equal(ES.ToPrimitive(v.toStringOnlyObject), 7, 'toStringOnlyObject returns non-stringified toString');
+ st.equal(ES.ToPrimitive(v.valueOfOnlyObject), 4, 'valueOfOnlyObject returns valueOf');
+ st['throws'](function () { return ES.ToPrimitive(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+ st.end();
+ });
+
+ t.test('dates', function (st) {
+ var invalid = new Date(NaN);
+ st.equal(ES.ToPrimitive(invalid), Date.prototype.toString.call(invalid), 'invalid Date coerces to Date#toString');
+ var now = new Date();
+ st.equal(ES.ToPrimitive(now), Date.prototype.toString.call(now), 'Date coerces to Date#toString');
+ st.end();
+ });
+
+ t.end();
+ });
+
+ test('ToBoolean', function (t) {
+ t.equal(false, ES.ToBoolean(undefined), 'undefined coerces to false');
+ t.equal(false, ES.ToBoolean(null), 'null coerces to false');
+ t.equal(false, ES.ToBoolean(false), 'false returns false');
+ t.equal(true, ES.ToBoolean(true), 'true returns true');
+
+ t.test('numbers', function (st) {
+ forEach([0, -0, NaN], function (falsyNumber) {
+ st.equal(false, ES.ToBoolean(falsyNumber), 'falsy number ' + falsyNumber + ' coerces to false');
+ });
+ forEach([Infinity, 42, 1, -Infinity], function (truthyNumber) {
+ st.equal(true, ES.ToBoolean(truthyNumber), 'truthy number ' + truthyNumber + ' coerces to true');
+ });
+
+ st.end();
+ });
+
+ t.equal(false, ES.ToBoolean(''), 'empty string coerces to false');
+ t.equal(true, ES.ToBoolean('foo'), 'nonempty string coerces to true');
+
+ t.test('objects', function (st) {
+ forEach(v.objects, function (obj) {
+ st.equal(true, ES.ToBoolean(obj), 'object coerces to true');
+ });
+ st.equal(true, ES.ToBoolean(v.uncoercibleObject), 'uncoercibleObject coerces to true');
+
+ st.end();
+ });
+
+ t.end();
+ });
+
+ test('ToNumber', function (t) {
+ t.ok(is(NaN, ES.ToNumber(undefined)), 'undefined coerces to NaN');
+ t.ok(is(ES.ToNumber(null), 0), 'null coerces to +0');
+ t.ok(is(ES.ToNumber(false), 0), 'false coerces to +0');
+ t.equal(1, ES.ToNumber(true), 'true coerces to 1');
+
+ t.test('numbers', function (st) {
+ st.ok(is(NaN, ES.ToNumber(NaN)), 'NaN returns itself');
+ forEach([0, -0, 42, Infinity, -Infinity], function (num) {
+ st.equal(num, ES.ToNumber(num), num + ' returns itself');
+ });
+ forEach(['foo', '0', '4a', '2.0', 'Infinity', '-Infinity'], function (numString) {
+ st.ok(is(+numString, ES.ToNumber(numString)), '"' + numString + '" coerces to ' + Number(numString));
+ });
+ st.end();
+ });
+
+ t.test('objects', function (st) {
+ forEach(v.objects, function (object) {
+ st.ok(is(ES.ToNumber(object), ES.ToNumber(ES.ToPrimitive(object))), 'object ' + object + ' coerces to same as ToPrimitive of object does');
+ });
+ st['throws'](function () { return ES.ToNumber(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ st.end();
+ });
+
+ t.test('binary literals', function (st) {
+ st.equal(ES.ToNumber('0b10'), 2, '0b10 is 2');
+ st.equal(ES.ToNumber({ toString: function () { return '0b11'; } }), 3, 'Object that toStrings to 0b11 is 3');
+
+ st.equal(true, is(ES.ToNumber('0b12'), NaN), '0b12 is NaN');
+ st.equal(true, is(ES.ToNumber({ toString: function () { return '0b112'; } }), NaN), 'Object that toStrings to 0b112 is NaN');
+ st.end();
+ });
+
+ t.test('octal literals', function (st) {
+ st.equal(ES.ToNumber('0o10'), 8, '0o10 is 8');
+ st.equal(ES.ToNumber({ toString: function () { return '0o11'; } }), 9, 'Object that toStrings to 0o11 is 9');
+
+ st.equal(true, is(ES.ToNumber('0o18'), NaN), '0o18 is NaN');
+ st.equal(true, is(ES.ToNumber({ toString: function () { return '0o118'; } }), NaN), 'Object that toStrings to 0o118 is NaN');
+ st.end();
+ });
+
+ t.test('signed hex numbers', function (st) {
+ st.equal(true, is(ES.ToNumber('-0xF'), NaN), '-0xF is NaN');
+ st.equal(true, is(ES.ToNumber(' -0xF '), NaN), 'space-padded -0xF is NaN');
+ st.equal(true, is(ES.ToNumber('+0xF'), NaN), '+0xF is NaN');
+ st.equal(true, is(ES.ToNumber(' +0xF '), NaN), 'space-padded +0xF is NaN');
+
+ st.end();
+ });
+
+ t.test('trimming of whitespace and non-whitespace characters', function (st) {
+ var whitespace = ' \t\x0b\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000';
+ st.equal(0, ES.ToNumber(whitespace + 0 + whitespace), 'whitespace is trimmed');
+
+ // Zero-width space (zws), next line character (nel), and non-character (bom) are not whitespace.
+ var nonWhitespaces = {
+ '\\u0085': '\u0085',
+ '\\u200b': '\u200b',
+ '\\ufffe': '\ufffe'
+ };
+
+ forEach(nonWhitespaces, function (desc, nonWS) {
+ st.equal(true, is(ES.ToNumber(nonWS + 0 + nonWS), NaN), 'non-whitespace ' + desc + ' not trimmed');
+ });
+
+ st.end();
+ });
+
+ forEach(v.symbols, function (symbol) {
+ t['throws'](
+ function () { ES.ToNumber(symbol); },
+ TypeError,
+ 'Symbols can’t be converted to a Number: ' + debug(symbol)
+ );
+ });
+
+ t.test('dates', function (st) {
+ var invalid = new Date(NaN);
+ st.ok(is(ES.ToNumber(invalid), NaN), 'invalid Date coerces to NaN');
+ var now = Date.now();
+ st.equal(ES.ToNumber(new Date(now)), now, 'Date coerces to timestamp');
+ st.end();
+ });
+
+ t.end();
+ });
+
+ test('ToInteger', function (t) {
+ t.ok(is(0, ES.ToInteger(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity, 42], function (num) {
+ t.ok(is(num, ES.ToInteger(num)), num + ' returns itself');
+ t.ok(is(-num, ES.ToInteger(-num)), '-' + num + ' returns itself');
+ });
+ t.equal(3, ES.ToInteger(Math.PI), 'pi returns 3');
+ t['throws'](function () { return ES.ToInteger(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.end();
+ });
+
+ test('ToInt32', function (t) {
+ t.ok(is(0, ES.ToInt32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt32(-num)), '-' + num + ' returns +0');
+ });
+ t['throws'](function () { return ES.ToInt32(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt32(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt32(0x80000000), -0x80000000), '2^31 returns -2^31');
+ t.ok(is(ES.ToInt32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToInt32(num), ES.ToInt32(ES.ToUint32(num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToInt32(-num), ES.ToInt32(ES.ToUint32(-num))), 'ToInt32(x) === ToInt32(ToUint32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+ });
+
+ test('ToUint32', function (t) {
+ t.ok(is(0, ES.ToUint32(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint32(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint32(-num)), '-' + num + ' returns +0');
+ });
+ t['throws'](function () { return ES.ToUint32(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint32(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint32(0x100000000 - 1), 0x100000000 - 1), '2^32 - 1 returns 2^32 - 1');
+ t.ok(is(ES.ToUint32(0x80000000), 0x80000000), '2^31 returns 2^31');
+ t.ok(is(ES.ToUint32(0x80000000 - 1), 0x80000000 - 1), '2^31 - 1 returns 2^31 - 1');
+ forEach([0, Infinity, NaN, 0x100000000, 0x80000000, 0x10000, 0x42], function (num) {
+ t.ok(is(ES.ToUint32(num), ES.ToUint32(ES.ToInt32(num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for 0x' + num.toString(16));
+ t.ok(is(ES.ToUint32(-num), ES.ToUint32(ES.ToInt32(-num))), 'ToUint32(x) === ToUint32(ToInt32(x)) for -0x' + num.toString(16));
+ });
+ t.end();
+ });
+
+ test('ToInt16', function (t) {
+ t.ok(is(0, ES.ToInt16(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt16(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt16(-num)), '-' + num + ' returns +0');
+ });
+ t['throws'](function () { return ES.ToInt16(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt16(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt16(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt16(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToInt16(0x80000000 - 1), -1), '2^31 - 1 returns -1');
+ t.ok(is(ES.ToInt16(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToInt16(0x10000 - 1), -1), '2^16 - 1 returns -1');
+ t.end();
+ });
+
+ test('ToUint16', function (t) {
+ t.ok(is(0, ES.ToUint16(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint16(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint16(-num)), '-' + num + ' returns +0');
+ });
+ t['throws'](function () { return ES.ToUint16(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint16(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint16(0x100000000 - 1), 0x10000 - 1), '2^32 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToUint16(0x80000000 - 1), 0x10000 - 1), '2^31 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint16(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToUint16(0x10000 - 1), 0x10000 - 1), '2^16 - 1 returns 2^16 - 1');
+ t.end();
+ });
+
+ test('ToInt8', function (t) {
+ t.ok(is(0, ES.ToInt8(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToInt8(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToInt8(-num)), '-' + num + ' returns +0');
+ });
+ t['throws'](function () { return ES.ToInt8(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToInt8(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToInt8(0x100000000 - 1), -1), '2^32 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToInt8(0x80000000 - 1), -1), '2^31 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToInt8(0x10000 - 1), -1), '2^16 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x100), 0), '2^8 returns +0');
+ t.ok(is(ES.ToInt8(0x100 - 1), -1), '2^8 - 1 returns -1');
+ t.ok(is(ES.ToInt8(0x10), 0x10), '2^4 returns 2^4');
+ t.end();
+ });
+
+ test('ToUint8', function (t) {
+ t.ok(is(0, ES.ToUint8(NaN)), 'NaN coerces to +0');
+ forEach([0, Infinity], function (num) {
+ t.ok(is(0, ES.ToUint8(num)), num + ' returns +0');
+ t.ok(is(0, ES.ToUint8(-num)), '-' + num + ' returns +0');
+ });
+ t['throws'](function () { return ES.ToUint8(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ t.ok(is(ES.ToUint8(0x100000000), 0), '2^32 returns +0');
+ t.ok(is(ES.ToUint8(0x100000000 - 1), 0x100 - 1), '2^32 - 1 returns 2^8 - 1');
+ t.ok(is(ES.ToUint8(0x80000000), 0), '2^31 returns +0');
+ t.ok(is(ES.ToUint8(0x80000000 - 1), 0x100 - 1), '2^31 - 1 returns 2^8 - 1');
+ t.ok(is(ES.ToUint8(0x10000), 0), '2^16 returns +0');
+ t.ok(is(ES.ToUint8(0x10000 - 1), 0x100 - 1), '2^16 - 1 returns 2^8 - 1');
+ t.ok(is(ES.ToUint8(0x100), 0), '2^8 returns +0');
+ t.ok(is(ES.ToUint8(0x100 - 1), 0x100 - 1), '2^8 - 1 returns 2^16 - 1');
+ t.ok(is(ES.ToUint8(0x10), 0x10), '2^4 returns 2^4');
+ t.ok(is(ES.ToUint8(0x10 - 1), 0x10 - 1), '2^4 - 1 returns 2^4 - 1');
+ t.end();
+ });
+
+ test('ToUint8Clamp', function (t) {
+ t.ok(is(0, ES.ToUint8Clamp(NaN)), 'NaN coerces to +0');
+ t.ok(is(0, ES.ToUint8Clamp(0)), '+0 returns +0');
+ t.ok(is(0, ES.ToUint8Clamp(-0)), '-0 returns +0');
+ t.ok(is(0, ES.ToUint8Clamp(-Infinity)), '-Infinity returns +0');
+ t['throws'](function () { return ES.ToUint8Clamp(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+ forEach([255, 256, 0x100000, Infinity], function (number) {
+ t.ok(is(255, ES.ToUint8Clamp(number)), number + ' coerces to 255');
+ });
+ t.equal(1, ES.ToUint8Clamp(1.49), '1.49 coerces to 1');
+ t.equal(2, ES.ToUint8Clamp(1.5), '1.5 coerces to 2, because 2 is even');
+ t.equal(2, ES.ToUint8Clamp(1.51), '1.51 coerces to 2');
+
+ t.equal(2, ES.ToUint8Clamp(2.49), '2.49 coerces to 2');
+ t.equal(2, ES.ToUint8Clamp(2.5), '2.5 coerces to 2, because 2 is even');
+ t.equal(3, ES.ToUint8Clamp(2.51), '2.51 coerces to 3');
+ t.end();
+ });
+
+ test('ToString', function (t) {
+ forEach(v.objects.concat(v.nonSymbolPrimitives), function (item) {
+ t.equal(ES.ToString(item), String(item), 'ES.ToString(' + debug(item) + ') ToStrings to String(' + debug(item) + ')');
+ });
+
+ t['throws'](function () { return ES.ToString(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws');
+
+ forEach(v.symbols, function (symbol) {
+ t['throws'](function () { return ES.ToString(symbol); }, TypeError, debug(symbol) + ' throws');
+ });
+ t.end();
+ });
+
+ test('ToObject', function (t) {
+ t['throws'](function () { return ES.ToObject(undefined); }, TypeError, 'undefined throws');
+ t['throws'](function () { return ES.ToObject(null); }, TypeError, 'null throws');
+ forEach(v.numbers, function (number) {
+ var obj = ES.ToObject(number);
+ t.equal(typeof obj, 'object', 'number ' + number + ' coerces to object');
+ t.equal(true, obj instanceof Number, 'object of ' + number + ' is Number object');
+ t.ok(is(obj.valueOf(), number), 'object of ' + number + ' coerces to ' + number);
+ });
+ t.end();
+ });
+
+ test('RequireObjectCoercible', function (t) {
+ t.equal(false, 'CheckObjectCoercible' in ES, 'CheckObjectCoercible -> RequireObjectCoercible in ES6');
+ t['throws'](function () { return ES.RequireObjectCoercible(undefined); }, TypeError, 'undefined throws');
+ t['throws'](function () { return ES.RequireObjectCoercible(null); }, TypeError, 'null throws');
+ var isCoercible = function (value) {
+ t.doesNotThrow(function () { return ES.RequireObjectCoercible(value); }, debug(value) + ' does not throw');
+ };
+ forEach(v.objects.concat(v.nonNullPrimitives), isCoercible);
+ t.end();
+ });
+
+ test('IsCallable', function (t) {
+ t.equal(true, ES.IsCallable(function () {}), 'function is callable');
+ var nonCallables = [/a/g, {}, Object.prototype, NaN].concat(v.primitives);
+ forEach(nonCallables, function (nonCallable) {
+ t.equal(false, ES.IsCallable(nonCallable), debug(nonCallable) + ' is not callable');
+ });
+ t.end();
+ });
+
+ test('SameValue', function (t) {
+ t.equal(true, ES.SameValue(NaN, NaN), 'NaN is SameValue as NaN');
+ t.equal(false, ES.SameValue(0, -0), '+0 is not SameValue as -0');
+ forEach(v.objects.concat(v.primitives), function (val) {
+ t.equal(val === val, ES.SameValue(val, val), debug(val) + ' is SameValue to itself');
+ });
+ t.end();
+ });
+
+ test('SameValueZero', function (t) {
+ t.equal(true, ES.SameValueZero(NaN, NaN), 'NaN is SameValueZero as NaN');
+ t.equal(true, ES.SameValueZero(0, -0), '+0 is SameValueZero as -0');
+ forEach(v.objects.concat(v.primitives), function (val) {
+ t.equal(val === val, ES.SameValueZero(val, val), debug(val) + ' is SameValueZero to itself');
+ });
+ t.end();
+ });
+
+ test('ToPropertyKey', function (t) {
+ forEach(v.objects.concat(v.nonSymbolPrimitives), function (value) {
+ t.equal(ES.ToPropertyKey(value), String(value), 'ToPropertyKey(value) === String(value) for non-Symbols');
+ });
+
+ forEach(v.symbols, function (symbol) {
+ t.equal(
+ ES.ToPropertyKey(symbol),
+ symbol,
+ 'ToPropertyKey(' + debug(symbol) + ') === ' + debug(symbol)
+ );
+ t.equal(
+ ES.ToPropertyKey(Object(symbol)),
+ symbol,
+ 'ToPropertyKey(' + debug(Object(symbol)) + ') === ' + debug(symbol)
+ );
+ });
+
+ t.end();
+ });
+
+ test('ToLength', function (t) {
+ t['throws'](function () { return ES.ToLength(v.uncoercibleObject); }, TypeError, 'uncoercibleObject throws a TypeError');
+ t.equal(3, ES.ToLength(v.coercibleObject), 'coercibleObject coerces to 3');
+ t.equal(42, ES.ToLength('42.5'), '"42.5" coerces to 42');
+ t.equal(7, ES.ToLength(7.3), '7.3 coerces to 7');
+ forEach([-0, -1, -42, -Infinity], function (negative) {
+ t.ok(is(0, ES.ToLength(negative)), negative + ' coerces to +0');
+ });
+ t.equal(MAX_SAFE_INTEGER, ES.ToLength(MAX_SAFE_INTEGER + 1), '2^53 coerces to 2^53 - 1');
+ t.equal(MAX_SAFE_INTEGER, ES.ToLength(MAX_SAFE_INTEGER + 3), '2^53 + 2 coerces to 2^53 - 1');
+ t.end();
+ });
+
+ test('IsArray', function (t) {
+ t.equal(true, ES.IsArray([]), '[] is array');
+ t.equal(false, ES.IsArray({}), '{} is not array');
+ t.equal(false, ES.IsArray({ length: 1, 0: true }), 'arraylike object is not array');
+ forEach(v.objects.concat(v.primitives), function (value) {
+ t.equal(false, ES.IsArray(value), debug(value) + ' is not array');
+ });
+ t.end();
+ });
+
+ test('IsRegExp', function (t) {
+ forEach([/a/g, new RegExp('a', 'g')], function (regex) {
+ t.equal(true, ES.IsRegExp(regex), regex + ' is regex');
+ });
+
+ forEach(v.objects.concat(v.primitives), function (nonRegex) {
+ t.equal(false, ES.IsRegExp(nonRegex), debug(nonRegex) + ' is not regex');
+ });
+
+ t.test('Symbol.match', { skip: !v.hasSymbols || !Symbol.match }, function (st) {
+ var obj = {};
+ obj[Symbol.match] = true;
+ st.equal(true, ES.IsRegExp(obj), 'object with truthy Symbol.match is regex');
+
+ var regex = /a/;
+ regex[Symbol.match] = false;
+ st.equal(false, ES.IsRegExp(regex), 'regex with falsy Symbol.match is not regex');
+
+ st.end();
+ });
+
+ t.end();
+ });
+
+ test('IsPropertyKey', function (t) {
+ forEach(v.numbers.concat(v.objects), function (notKey) {
+ t.equal(false, ES.IsPropertyKey(notKey), debug(notKey) + ' is not property key');
+ });
+
+ t.equal(true, ES.IsPropertyKey('foo'), 'string is property key');
+
+ forEach(v.symbols, function (symbol) {
+ t.equal(true, ES.IsPropertyKey(symbol), debug(symbol) + ' is property key');
+ });
+ t.end();
+ });
+
+ test('IsInteger', function (t) {
+ for (var i = -100; i < 100; i += 10) {
+ t.equal(true, ES.IsInteger(i), i + ' is integer');
+ t.equal(false, ES.IsInteger(i + 0.2), (i + 0.2) + ' is not integer');
+ }
+ t.equal(true, ES.IsInteger(-0), '-0 is integer');
+ var notInts = v.nonNumbers.concat(v.nonIntegerNumbers, [Infinity, -Infinity, NaN, [], new Date()]);
+ forEach(notInts, function (notInt) {
+ t.equal(false, ES.IsInteger(notInt), debug(notInt) + ' is not integer');
+ });
+ t.equal(false, ES.IsInteger(v.uncoercibleObject), 'uncoercibleObject is not integer');
+ t.end();
+ });
+
+ test('IsExtensible', function (t) {
+ forEach(v.objects, function (object) {
+ t.equal(true, ES.IsExtensible(object), debug(object) + ' object is extensible');
+ });
+ forEach(v.primitives, function (primitive) {
+ t.equal(false, ES.IsExtensible(primitive), debug(primitive) + ' is not extensible');
+ });
+ if (Object.preventExtensions) {
+ t.equal(false, ES.IsExtensible(Object.preventExtensions({})), 'object with extensions prevented is not extensible');
+ }
+ t.end();
+ });
+
+ test('CanonicalNumericIndexString', function (t) {
+ var throwsOnNonString = function (notString) {
+ t['throws'](
+ function () { return ES.CanonicalNumericIndexString(notString); },
+ TypeError,
+ debug(notString) + ' is not a string'
+ );
+ };
+ forEach(v.objects.concat(v.numbers), throwsOnNonString);
+ t.ok(is(-0, ES.CanonicalNumericIndexString('-0')), '"-0" returns -0');
+ for (var i = -50; i < 50; i += 10) {
+ t.equal(i, ES.CanonicalNumericIndexString(String(i)), '"' + i + '" returns ' + i);
+ t.equal(undefined, ES.CanonicalNumericIndexString(String(i) + 'a'), '"' + i + 'a" returns undefined');
+ }
+ t.end();
+ });
+
+ test('IsConstructor', function (t) {
+ t.equal(true, ES.IsConstructor(function () {}), 'function is constructor');
+ t.equal(false, ES.IsConstructor(/a/g), 'regex is not constructor');
+ forEach(v.objects, function (object) {
+ t.equal(false, ES.IsConstructor(object), object + ' object is not constructor');
+ });
+
+ try {
+ var foo = Function('return class Foo {}')(); // eslint-disable-line no-new-func
+ t.equal(ES.IsConstructor(foo), true, 'class is constructor');
+ } catch (e) {
+ t.comment('SKIP: class syntax not supported.');
+ }
+ t.end();
+ });
+
+ test('Call', function (t) {
+ var receiver = {};
+ var notFuncs = v.objects.concat(v.primitives).concat([/a/g, new RegExp('a', 'g')]);
+ t.plan(notFuncs.length + 4);
+ var throwsIfNotCallable = function (notFunc) {
+ t['throws'](
+ function () { return ES.Call(notFunc, receiver); },
+ TypeError,
+ debug(notFunc) + ' (' + typeof notFunc + ') is not callable'
+ );
+ };
+ forEach(notFuncs, throwsIfNotCallable);
+ ES.Call(function (a, b) {
+ t.equal(this, receiver, 'context matches expected');
+ t.deepEqual([a, b], [1, 2], 'named args are correct');
+ t.equal(arguments.length, 3, 'extra argument was passed');
+ t.equal(arguments[2], 3, 'extra argument was correct');
+ }, receiver, [1, 2, 3]);
+ t.end();
+ });
+
+ test('GetV', function (t) {
+ t['throws'](function () { return ES.GetV({ 7: 7 }, 7); }, TypeError, 'Throws a TypeError if `P` is not a property key');
+ var obj = { a: function () {} };
+ t.equal(ES.GetV(obj, 'a'), obj.a, 'returns property if it exists');
+ t.equal(ES.GetV(obj, 'b'), undefined, 'returns undefiend if property does not exist');
+ t.end();
+ });
+
+ test('GetMethod', function (t) {
+ t['throws'](function () { return ES.GetMethod({ 7: 7 }, 7); }, TypeError, 'Throws a TypeError if `P` is not a property key');
+ t.equal(ES.GetMethod({}, 'a'), undefined, 'returns undefined in property is undefined');
+ t.equal(ES.GetMethod({ a: null }, 'a'), undefined, 'returns undefined if property is null');
+ t.equal(ES.GetMethod({ a: undefined }, 'a'), undefined, 'returns undefined if property is undefined');
+ var obj = { a: function () {} };
+ t['throws'](function () { ES.GetMethod({ a: 'b' }, 'a'); }, TypeError, 'throws TypeError if property exists and is not callable');
+ t.equal(ES.GetMethod(obj, 'a'), obj.a, 'returns property if it is callable');
+ t.end();
+ });
+
+ test('Get', function (t) {
+ t['throws'](function () { return ES.Get('a', 'a'); }, TypeError, 'Throws a TypeError if `O` is not an Object');
+ t['throws'](function () { return ES.Get({ 7: 7 }, 7); }, TypeError, 'Throws a TypeError if `P` is not a property key');
+
+ var value = {};
+ t.test('Symbols', { skip: !v.hasSymbols }, function (st) {
+ var sym = Symbol('sym');
+ var obj = {};
+ obj[sym] = value;
+ st.equal(ES.Get(obj, sym), value, 'returns property `P` if it exists on object `O`');
+ st.end();
+ });
+ t.equal(ES.Get({ a: value }, 'a'), value, 'returns property `P` if it exists on object `O`');
+ t.end();
+ });
+
+ test('Type', { skip: !v.hasSymbols }, function (t) {
+ t.equal(ES.Type(Symbol.iterator), 'Symbol', 'Type(Symbol.iterator) is Symbol');
+ t.end();
+ });
+
+ test('SpeciesConstructor', function (t) {
+ t['throws'](function () { ES.SpeciesConstructor(null); }, TypeError);
+ t['throws'](function () { ES.SpeciesConstructor(undefined); }, TypeError);
+
+ var defaultConstructor = function Foo() {};
+
+ t.equal(
+ ES.SpeciesConstructor({ constructor: undefined }, defaultConstructor),
+ defaultConstructor,
+ 'undefined constructor returns defaultConstructor'
+ );
+
+ t['throws'](
+ function () { return ES.SpeciesConstructor({ constructor: null }, defaultConstructor); },
+ TypeError,
+ 'non-undefined non-object constructor throws'
+ );
+
+ t.test('with Symbol.species', { skip: !hasSpecies }, function (st) {
+ var Bar = function Bar() {};
+ Bar[Symbol.species] = null;
+
+ st.equal(
+ ES.SpeciesConstructor(new Bar(), defaultConstructor),
+ defaultConstructor,
+ 'undefined/null Symbol.species returns default constructor'
+ );
+
+ var Baz = function Baz() {};
+ Baz[Symbol.species] = Bar;
+ st.equal(
+ ES.SpeciesConstructor(new Baz(), defaultConstructor),
+ Bar,
+ 'returns Symbol.species constructor value'
+ );
+
+ Baz[Symbol.species] = {};
+ st['throws'](
+ function () { ES.SpeciesConstructor(new Baz(), defaultConstructor); },
+ TypeError,
+ 'throws when non-constructor non-null non-undefined species value found'
+ );
+
+ st.end();
+ });
+
+ t.end();
+ });
+
+ var bothDescriptor = function () {
+ return { '[[Get]]': function () {}, '[[Value]]': true };
+ };
+ var accessorDescriptor = function () {
+ return {
+ '[[Get]]': function () {},
+ '[[Enumerable]]': true,
+ '[[Configurable]]': true
+ };
+ };
+ var mutatorDescriptor = function () {
+ return {
+ '[[Set]]': function () {},
+ '[[Enumerable]]': true,
+ '[[Configurable]]': true
+ };
+ };
+ var dataDescriptor = function () {
+ return {
+ '[[Value]]': 42,
+ '[[Writable]]': false
+ };
+ };
+ var genericDescriptor = function () {
+ return {
+ '[[Configurable]]': true,
+ '[[Enumerable]]': false
+ };
+ };
+
+ test('IsPropertyDescriptor', function (t) {
+ forEach(v.nonUndefinedPrimitives, function (primitive) {
+ t.equal(
+ ES.IsPropertyDescriptor(primitive),
+ false,
+ debug(primitive) + ' is not a Property Descriptor'
+ );
+ });
+
+ t.equal(ES.IsPropertyDescriptor({ invalid: true }), false, 'invalid keys not allowed on a Property Descriptor');
+
+ t.equal(ES.IsPropertyDescriptor({}), true, 'empty object is an incomplete Property Descriptor');
+
+ t.equal(ES.IsPropertyDescriptor(accessorDescriptor()), true, 'accessor descriptor is a Property Descriptor');
+ t.equal(ES.IsPropertyDescriptor(mutatorDescriptor()), true, 'mutator descriptor is a Property Descriptor');
+ t.equal(ES.IsPropertyDescriptor(dataDescriptor()), true, 'data descriptor is a Property Descriptor');
+ t.equal(ES.IsPropertyDescriptor(genericDescriptor()), true, 'generic descriptor is a Property Descriptor');
+
+ t['throws'](function () {
+ ES.IsPropertyDescriptor(bothDescriptor());
+ }, TypeError, 'a Property Descriptor can not be both a Data and an Accessor Descriptor');
+
+ t.end();
+ });
+
+ test('IsAccessorDescriptor', function (t) {
+ forEach(v.nonUndefinedPrimitives, function (primitive) {
+ t['throws'](
+ function () { ES.IsAccessorDescriptor(primitive); },
+ TypeError,
+ debug(primitive) + ' is not a Property Descriptor'
+ );
+ });
+
+ t.equal(ES.IsAccessorDescriptor(), false, 'no value is not an Accessor Descriptor');
+ t.equal(ES.IsAccessorDescriptor(undefined), false, 'undefined value is not an Accessor Descriptor');
+
+ t.equal(ES.IsAccessorDescriptor(accessorDescriptor()), true, 'accessor descriptor is an Accessor Descriptor');
+ t.equal(ES.IsAccessorDescriptor(mutatorDescriptor()), true, 'mutator descriptor is an Accessor Descriptor');
+ t.equal(ES.IsAccessorDescriptor(dataDescriptor()), false, 'data descriptor is not an Accessor Descriptor');
+ t.equal(ES.IsAccessorDescriptor(genericDescriptor()), false, 'generic descriptor is not an Accessor Descriptor');
+
+ t.end();
+ });
+
+ test('IsDataDescriptor', function (t) {
+ forEach(v.nonUndefinedPrimitives, function (primitive) {
+ t['throws'](
+ function () { ES.IsDataDescriptor(primitive); },
+ TypeError,
+ debug(primitive) + ' is not a Property Descriptor'
+ );
+ });
+
+ t.equal(ES.IsDataDescriptor(), false, 'no value is not a Data Descriptor');
+ t.equal(ES.IsDataDescriptor(undefined), false, 'undefined value is not a Data Descriptor');
+
+ t.equal(ES.IsDataDescriptor(accessorDescriptor()), false, 'accessor descriptor is not a Data Descriptor');
+ t.equal(ES.IsDataDescriptor(mutatorDescriptor()), false, 'mutator descriptor is not a Data Descriptor');
+ t.equal(ES.IsDataDescriptor(dataDescriptor()), true, 'data descriptor is a Data Descriptor');
+ t.equal(ES.IsDataDescriptor(genericDescriptor()), false, 'generic descriptor is not a Data Descriptor');
+
+ t.end();
+ });
+
+ test('IsGenericDescriptor', function (t) {
+ forEach(v.nonUndefinedPrimitives, function (primitive) {
+ t['throws'](
+ function () { ES.IsGenericDescriptor(primitive); },
+ TypeError,
+ debug(primitive) + ' is not a Property Descriptor'
+ );
+ });
+
+ t.equal(ES.IsGenericDescriptor(), false, 'no value is not a Data Descriptor');
+ t.equal(ES.IsGenericDescriptor(undefined), false, 'undefined value is not a Data Descriptor');
+
+ t.equal(ES.IsGenericDescriptor(accessorDescriptor()), false, 'accessor descriptor is not a generic Descriptor');
+ t.equal(ES.IsGenericDescriptor(mutatorDescriptor()), false, 'mutator descriptor is not a generic Descriptor');
+ t.equal(ES.IsGenericDescriptor(dataDescriptor()), false, 'data descriptor is not a generic Descriptor');
+
+ t.equal(ES.IsGenericDescriptor(genericDescriptor()), true, 'generic descriptor is a generic Descriptor');
+
+ t.end();
+ });
+
+ test('FromPropertyDescriptor', function (t) {
+ t.equal(ES.FromPropertyDescriptor(), undefined, 'no value begets undefined');
+ t.equal(ES.FromPropertyDescriptor(undefined), undefined, 'undefined value begets undefined');
+
+ forEach(v.nonUndefinedPrimitives, function (primitive) {
+ t['throws'](
+ function () { ES.FromPropertyDescriptor(primitive); },
+ TypeError,
+ debug(primitive) + ' is not a Property Descriptor'
+ );
+ });
+
+ var accessor = accessorDescriptor();
+ t.deepEqual(ES.FromPropertyDescriptor(accessor), {
+ get: accessor['[[Get]]'],
+ set: accessor['[[Set]]'],
+ enumerable: !!accessor['[[Enumerable]]'],
+ configurable: !!accessor['[[Configurable]]']
+ });
+
+ var mutator = mutatorDescriptor();
+ t.deepEqual(ES.FromPropertyDescriptor(mutator), {
+ get: mutator['[[Get]]'],
+ set: mutator['[[Set]]'],
+ enumerable: !!mutator['[[Enumerable]]'],
+ configurable: !!mutator['[[Configurable]]']
+ });
+ var data = dataDescriptor();
+ t.deepEqual(ES.FromPropertyDescriptor(data), {
+ value: data['[[Value]]'],
+ writable: data['[[Writable]]'],
+ enumerable: !!data['[[Enumerable]]'],
+ configurable: !!data['[[Configurable]]']
+ });
+
+ t['throws'](
+ function () { ES.FromPropertyDescriptor(genericDescriptor()); },
+ TypeError,
+ 'a complete Property Descriptor is required'
+ );
+
+ t.end();
+ });
+
+ test('ToPropertyDescriptor', function (t) {
+ forEach(v.nonUndefinedPrimitives, function (primitive) {
+ t['throws'](
+ function () { ES.ToPropertyDescriptor(primitive); },
+ TypeError,
+ debug(primitive) + ' is not an Object'
+ );
+ });
+
+ var accessor = accessorDescriptor();
+ t.deepEqual(ES.ToPropertyDescriptor({
+ get: accessor['[[Get]]'],
+ enumerable: !!accessor['[[Enumerable]]'],
+ configurable: !!accessor['[[Configurable]]']
+ }), accessor);
+
+ var mutator = mutatorDescriptor();
+ t.deepEqual(ES.ToPropertyDescriptor({
+ set: mutator['[[Set]]'],
+ enumerable: !!mutator['[[Enumerable]]'],
+ configurable: !!mutator['[[Configurable]]']
+ }), mutator);
+
+ var data = dataDescriptor();
+ t.deepEqual(ES.ToPropertyDescriptor({
+ value: data['[[Value]]'],
+ writable: data['[[Writable]]'],
+ configurable: !!data['[[Configurable]]']
+ }), assign(data, { '[[Configurable]]': false }));
+
+ var both = bothDescriptor();
+ t['throws'](
+ function () {
+ ES.FromPropertyDescriptor({ get: both['[[Get]]'], value: both['[[Value]]'] });
+ },
+ TypeError,
+ 'data and accessor descriptors are mutually exclusive'
+ );
+
+ t.end();
+ });
+
+ test('CompletePropertyDescriptor', function (t) {
+ forEach(v.nonUndefinedPrimitives, function (primitive) {
+ t['throws'](
+ function () { ES.CompletePropertyDescriptor(primitive); },
+ TypeError,
+ debug(primitive) + ' is not a Property Descriptor'
+ );
+ });
+
+ var generic = genericDescriptor();
+ t.deepEqual(ES.CompletePropertyDescriptor(generic), {
+ '[[Configurable]]': !!generic['[[Configurable]]'],
+ '[[Enumerable]]': !!generic['[[Enumerable]]'],
+ '[[Value]]': undefined,
+ '[[Writable]]': false
+ }, 'completes a Generic Descriptor');
+
+ var data = dataDescriptor();
+ t.deepEqual(ES.CompletePropertyDescriptor(data), {
+ '[[Configurable]]': !!data['[[Configurable]]'],
+ '[[Enumerable]]': false,
+ '[[Value]]': data['[[Value]]'],
+ '[[Writable]]': !!data['[[Writable]]']
+ }, 'completes a Data Descriptor');
+
+ var accessor = accessorDescriptor();
+ t.deepEqual(ES.CompletePropertyDescriptor(accessor), {
+ '[[Get]]': accessor['[[Get]]'],
+ '[[Enumerable]]': !!accessor['[[Enumerable]]'],
+ '[[Configurable]]': !!accessor['[[Configurable]]'],
+ '[[Set]]': undefined
+ }, 'completes an Accessor Descriptor');
+
+ var mutator = mutatorDescriptor();
+ t.deepEqual(ES.CompletePropertyDescriptor(mutator), {
+ '[[Set]]': mutator['[[Set]]'],
+ '[[Enumerable]]': !!mutator['[[Enumerable]]'],
+ '[[Configurable]]': !!mutator['[[Configurable]]'],
+ '[[Get]]': undefined
+ }, 'completes a mutator Descriptor');
+
+ t['throws'](
+ function () { ES.CompletePropertyDescriptor(bothDescriptor()); },
+ TypeError,
+ 'data and accessor descriptors are mutually exclusive'
+ );
+
+ t.end();
+ });
+
+ test('Set', function (t) {
+ forEach(v.primitives, function (primitive) {
+ t['throws'](
+ function () { ES.Set(primitive, '', null, false); },
+ TypeError,
+ debug(primitive) + ' is not an Object'
+ );
+ });
+
+ forEach(v.nonPropertyKeys, function (nonKey) {
+ t['throws'](
+ function () { ES.Set({}, nonKey, null, false); },
+ TypeError,
+ debug(nonKey) + ' is not a Property Key'
+ );
+ });
+
+ forEach(v.nonBooleans, function (nonBoolean) {
+ t['throws'](
+ function () { ES.Set({}, '', null, nonBoolean); },
+ TypeError,
+ debug(nonBoolean) + ' is not a Boolean'
+ );
+ });
+
+ var o = {};
+ var value = {};
+ ES.Set(o, 'key', value, true);
+ t.deepEqual(o, { key: value }, 'key is set');
+
+ t.test('nonwritable', { skip: !Object.defineProperty }, function (st) {
+ var obj = { a: value };
+ Object.defineProperty(obj, 'a', { writable: false });
+
+ st['throws'](
+ function () { ES.Set(obj, 'a', value, true); },
+ TypeError,
+ 'can not Set nonwritable property'
+ );
+
+ st.doesNotThrow(
+ function () { ES.Set(obj, 'a', value, false); },
+ 'setting Throw to false prevents an exception'
+ );
+
+ st.end();
+ });
+
+ t.test('nonconfigurable', { skip: !Object.defineProperty }, function (st) {
+ var obj = { a: value };
+ Object.defineProperty(obj, 'a', { configurable: false });
+
+ ES.Set(obj, 'a', value, true);
+ st.deepEqual(obj, { a: value }, 'key is set');
+
+ st.end();
+ });
+
+ t.end();
+ });
+
+ test('HasOwnProperty', function (t) {
+ forEach(v.primitives, function (primitive) {
+ t['throws'](
+ function () { ES.HasOwnProperty(primitive, 'key'); },
+ TypeError,
+ debug(primitive) + ' is not an Object'
+ );
+ });
+
+ forEach(v.nonPropertyKeys, function (nonKey) {
+ t['throws'](
+ function () { ES.HasOwnProperty({}, nonKey); },
+ TypeError,
+ debug(nonKey) + ' is not a Property Key'
+ );
+ });
+
+ t.equal(ES.HasOwnProperty({}, 'toString'), false, 'inherited properties are not own');
+ t.equal(
+ ES.HasOwnProperty({ toString: 1 }, 'toString'),
+ true,
+ 'shadowed inherited own properties are own'
+ );
+ t.equal(ES.HasOwnProperty({ a: 1 }, 'a'), true, 'own properties are own');
+
+ t.end();
+ });
+
+ test('HasProperty', function (t) {
+ forEach(v.primitives, function (primitive) {
+ t['throws'](
+ function () { ES.HasProperty(primitive, 'key'); },
+ TypeError,
+ debug(primitive) + ' is not an Object'
+ );
+ });
+
+ forEach(v.nonPropertyKeys, function (nonKey) {
+ t['throws'](
+ function () { ES.HasProperty({}, nonKey); },
+ TypeError,
+ debug(nonKey) + ' is not a Property Key'
+ );
+ });
+
+ t.equal(ES.HasProperty({}, 'nope'), false, 'object does not have nonexistent properties');
+ t.equal(ES.HasProperty({}, 'toString'), true, 'object has inherited properties');
+ t.equal(
+ ES.HasProperty({ toString: 1 }, 'toString'),
+ true,
+ 'object has shadowed inherited own properties'
+ );
+ t.equal(ES.HasProperty({ a: 1 }, 'a'), true, 'object has own properties');
+
+ t.end();
+ });
+
+ test('IsConcatSpreadable', function (t) {
+ forEach(v.primitives, function (primitive) {
+ t.equal(ES.IsConcatSpreadable(primitive), false, debug(primitive) + ' is not an Object');
+ });
+
+ var hasSymbolConcatSpreadable = v.hasSymbols && Symbol.isConcatSpreadable;
+ t.test('Symbol.isConcatSpreadable', { skip: !hasSymbolConcatSpreadable }, function (st) {
+ forEach(v.falsies, function (falsy) {
+ var obj = {};
+ obj[Symbol.isConcatSpreadable] = falsy;
+ st.equal(
+ ES.IsConcatSpreadable(obj),
+ false,
+ 'an object with ' + debug(falsy) + ' as Symbol.isConcatSpreadable is not concat spreadable'
+ );
+ });
+
+ forEach(v.truthies, function (truthy) {
+ var obj = {};
+ obj[Symbol.isConcatSpreadable] = truthy;
+ st.equal(
+ ES.IsConcatSpreadable(obj),
+ true,
+ 'an object with ' + debug(truthy) + ' as Symbol.isConcatSpreadable is concat spreadable'
+ );
+ });
+
+ st.end();
+ });
+
+ forEach(v.objects, function (object) {
+ t.equal(
+ ES.IsConcatSpreadable(object),
+ false,
+ 'non-array without Symbol.isConcatSpreadable is not concat spreadable'
+ );
+ });
+
+ t.equal(ES.IsConcatSpreadable([]), true, 'arrays are concat spreadable');
+
+ t.end();
+ });
+
+ test('Invoke', function (t) {
+ forEach(v.nonPropertyKeys, function (nonKey) {
+ t['throws'](
+ function () { ES.Invoke({}, nonKey); },
+ TypeError,
+ debug(nonKey) + ' is not a Property Key'
+ );
+ });
+
+ t['throws'](function () { ES.Invoke({ o: false }, 'o'); }, TypeError, 'fails on a non-function');
+
+ t.test('invoked callback', function (st) {
+ var aValue = {};
+ var bValue = {};
+ var obj = {
+ f: function (a) {
+ st.equal(arguments.length, 2, '2 args passed');
+ st.equal(a, aValue, 'first arg is correct');
+ st.equal(arguments[1], bValue, 'second arg is correct');
+ }
+ };
+ st.plan(3);
+ ES.Invoke(obj, 'f', aValue, bValue);
+ });
+
+ t.end();
+ });
+
+ test('GetIterator', { skip: true });
+
+ test('IteratorNext', { skip: true });
+
+ test('IteratorComplete', { skip: true });
+
+ test('IteratorValue', { skip: true });
+
+ test('IteratorStep', { skip: true });
+
+ test('IteratorClose', { skip: true });
+
+ test('CreateIterResultObject', function (t) {
+ forEach(v.nonBooleans, function (nonBoolean) {
+ t['throws'](
+ function () { ES.CreateIterResultObject({}, nonBoolean); },
+ TypeError,
+ '"done" argument must be a boolean; ' + debug(nonBoolean) + ' is not'
+ );
+ });
+
+ var value = {};
+ t.deepEqual(ES.CreateIterResultObject(value, true), {
+ value: value,
+ done: true
+ }, 'creates a "done" iteration result');
+ t.deepEqual(ES.CreateIterResultObject(value, false), {
+ value: value,
+ done: false
+ }, 'creates a "not done" iteration result');
+
+ t.end();
+ });
+
+ test('RegExpExec', function (t) {
+ forEach(v.primitives, function (primitive) {
+ t['throws'](
+ function () { ES.RegExpExec(primitive); },
+ TypeError,
+ '"R" argument must be an object; ' + debug(primitive) + ' is not'
+ );
+ });
+
+ forEach(v.nonStrings, function (nonString) {
+ t['throws'](
+ function () { ES.RegExpExec({}, nonString); },
+ TypeError,
+ '"S" argument must be a String; ' + debug(nonString) + ' is not'
+ );
+ });
+
+ t.test('gets and calls a callable "exec"', function (st) {
+ var str = '123';
+ var o = {
+ exec: function (S) {
+ st.equal(this, o, '"exec" receiver is R');
+ st.equal(S, str, '"exec" argument is S');
+
+ return null;
+ }
+ };
+ st.plan(2);
+ ES.RegExpExec(o, str);
+ st.end();
+ });
+
+ t.test('throws if a callable "exec" returns a non-null non-object', function (st) {
+ var str = '123';
+ st.plan(v.nonNullPrimitives.length);
+ forEach(v.nonNullPrimitives, function (nonNullPrimitive) {
+ st['throws'](
+ function () { ES.RegExpExec({ exec: function () { return nonNullPrimitive; } }, str); },
+ TypeError,
+ '"exec" method must return `null` or an Object; ' + debug(nonNullPrimitive) + ' is not'
+ );
+ });
+ st.end();
+ });
+
+ t.test('actual regex that should match against a string', function (st) {
+ var S = 'aabc';
+ var R = /a/g;
+ var match1 = ES.RegExpExec(R, S);
+ var match2 = ES.RegExpExec(R, S);
+ var match3 = ES.RegExpExec(R, S);
+ st.deepEqual(match1, assign(['a'], groups({ index: 0, input: S })), 'match object 1 is as expected');
+ st.deepEqual(match2, assign(['a'], groups({ index: 1, input: S })), 'match object 2 is as expected');
+ st.equal(match3, null, 'match 3 is null as expected');
+ st.end();
+ });
+
+ t.test('actual regex that should match against a string, with shadowed "exec"', function (st) {
+ var S = 'aabc';
+ var R = /a/g;
+ R.exec = undefined;
+ var match1 = ES.RegExpExec(R, S);
+ var match2 = ES.RegExpExec(R, S);
+ var match3 = ES.RegExpExec(R, S);
+ st.deepEqual(match1, assign(['a'], groups({ index: 0, input: S })), 'match object 1 is as expected');
+ st.deepEqual(match2, assign(['a'], groups({ index: 1, input: S })), 'match object 2 is as expected');
+ st.equal(match3, null, 'match 3 is null as expected');
+ st.end();
+ });
+ t.end();
+ });
+
+ test('ArraySpeciesCreate', function (t) {
+ t.test('errors', function (st) {
+ var testNonNumber = function (nonNumber) {
+ st['throws'](
+ function () { ES.ArraySpeciesCreate([], nonNumber); },
+ TypeError,
+ debug(nonNumber) + ' is not a number'
+ );
+ };
+ forEach(v.nonNumbers, testNonNumber);
+
+ st['throws'](
+ function () { ES.ArraySpeciesCreate([], -1); },
+ TypeError,
+ '-1 is not >= 0'
+ );
+ st['throws'](
+ function () { ES.ArraySpeciesCreate([], -Infinity); },
+ TypeError,
+ '-Infinity is not >= 0'
+ );
+
+ var testNonIntegers = function (nonInteger) {
+ st['throws'](
+ function () { ES.ArraySpeciesCreate([], nonInteger); },
+ TypeError,
+ debug(nonInteger) + ' is not an integer'
+ );
+ };
+ forEach(v.nonIntegerNumbers, testNonIntegers);
+
+ st.end();
+ });
+
+ t.test('works with a non-array', function (st) {
+ forEach(v.objects.concat(v.primitives), function (nonArray) {
+ var arr = ES.ArraySpeciesCreate(nonArray, 0);
+ st.ok(ES.IsArray(arr), 'is an array');
+ st.equal(arr.length, 0, 'length is correct');
+ st.equal(arr.constructor, Array, 'constructor is correct');
+ });
+
+ st.end();
+ });
+
+ t.test('works with a normal array', function (st) {
+ var len = 2;
+ var orig = [1, 2, 3];
+ var arr = ES.ArraySpeciesCreate(orig, len);
+
+ st.ok(ES.IsArray(arr), 'is an array');
+ st.equal(arr.length, len, 'length is correct');
+ st.equal(arr.constructor, orig.constructor, 'constructor is correct');
+
+ st.end();
+ });
+
+ t.test('-0 length produces +0 length', function (st) {
+ var len = -0;
+ st.ok(is(len, -0), '-0 is negative zero');
+ st.notOk(is(len, 0), '-0 is not positive zero');
+
+ var orig = [1, 2, 3];
+ var arr = ES.ArraySpeciesCreate(orig, len);
+
+ st.equal(ES.IsArray(arr), true);
+ st.ok(is(arr.length, 0));
+ st.equal(arr.constructor, orig.constructor);
+
+ st.end();
+ });
+
+ t.test('works with species construtor', { skip: !hasSpecies }, function (st) {
+ var sentinel = {};
+ var Foo = function Foo(len) {
+ this.length = len;
+ this.sentinel = sentinel;
+ };
+ var Bar = getArraySubclassWithSpeciesConstructor(Foo);
+ var bar = new Bar();
+
+ t.equal(ES.IsArray(bar), true, 'Bar instance is an array');
+
+ var arr = ES.ArraySpeciesCreate(bar, 3);
+ st.equal(arr.constructor, Foo, 'result used species constructor');
+ st.equal(arr.length, 3, 'length property is correct');
+ st.equal(arr.sentinel, sentinel, 'Foo constructor was exercised');
+
+ st.end();
+ });
+
+ t.test('works with null species constructor', { skip: !hasSpecies }, function (st) {
+ var Bar = getArraySubclassWithSpeciesConstructor(null);
+ var bar = new Bar();
+
+ t.equal(ES.IsArray(bar), true, 'Bar instance is an array');
+
+ var arr = ES.ArraySpeciesCreate(bar, 3);
+ st.equal(arr.constructor, Array, 'result used default constructor');
+ st.equal(arr.length, 3, 'length property is correct');
+
+ st.end();
+ });
+
+ t.test('works with undefined species constructor', { skip: !hasSpecies }, function (st) {
+ var Bar = getArraySubclassWithSpeciesConstructor();
+ var bar = new Bar();
+
+ t.equal(ES.IsArray(bar), true, 'Bar instance is an array');
+
+ var arr = ES.ArraySpeciesCreate(bar, 3);
+ st.equal(arr.constructor, Array, 'result used default constructor');
+ st.equal(arr.length, 3, 'length property is correct');
+
+ st.end();
+ });
+
+ t.test('throws with object non-construtor species constructor', { skip: !hasSpecies }, function (st) {
+ forEach(v.objects, function (obj) {
+ var Bar = getArraySubclassWithSpeciesConstructor(obj);
+ var bar = new Bar();
+
+ st.equal(ES.IsArray(bar), true, 'Bar instance is an array');
+
+ st['throws'](
+ function () { ES.ArraySpeciesCreate(bar, 3); },
+ TypeError,
+ debug(obj) + ' is not a constructor'
+ );
+ });
+
+ st.end();
+ });
+
+ t.end();
+ });
+
+ test('CreateDataProperty', function (t) {
+ forEach(v.primitives, function (primitive) {
+ t['throws'](
+ function () { ES.CreateDataProperty(primitive); },
+ TypeError,
+ debug(primitive) + ' is not an object'
+ );
+ });
+
+ forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+ t['throws'](
+ function () { ES.CreateDataProperty({}, nonPropertyKey); },
+ TypeError,
+ debug(nonPropertyKey) + ' is not a property key'
+ );
+ });
+
+ var sentinel = {};
+ forEach(v.propertyKeys, function (propertyKey) {
+ var obj = {};
+ var status = ES.CreateDataProperty(obj, propertyKey, sentinel);
+ t.equal(status, true, 'status is true');
+ t.equal(
+ obj[propertyKey],
+ sentinel,
+ debug(sentinel) + ' is installed on "' + debug(propertyKey) + '" on the object'
+ );
+
+ if (typeof Object.defineProperty === 'function') {
+ var nonWritable = Object.defineProperty({}, propertyKey, { configurable: true, writable: false });
+
+ var nonWritableStatus = ES.CreateDataProperty(nonWritable, propertyKey, sentinel);
+ t.equal(nonWritableStatus, false, 'create data property failed');
+ t.notEqual(
+ nonWritable[propertyKey],
+ sentinel,
+ debug(sentinel) + ' is not installed on "' + debug(propertyKey) + '" on the object when key is nonwritable'
+ );
+
+ var nonConfigurable = Object.defineProperty({}, propertyKey, { configurable: false, writable: true });
+
+ var nonConfigurableStatus = ES.CreateDataProperty(nonConfigurable, propertyKey, sentinel);
+ t.equal(nonConfigurableStatus, false, 'create data property failed');
+ t.notEqual(
+ nonConfigurable[propertyKey],
+ sentinel,
+ debug(sentinel) + ' is not installed on "' + debug(propertyKey) + '" on the object when key is nonconfigurable'
+ );
+ }
+ });
+
+ t.end();
+ });
+
+ test('CreateDataPropertyOrThrow', function (t) {
+ forEach(v.primitives, function (primitive) {
+ t['throws'](
+ function () { ES.CreateDataPropertyOrThrow(primitive); },
+ TypeError,
+ debug(primitive) + ' is not an object'
+ );
+ });
+
+ forEach(v.nonPropertyKeys, function (nonPropertyKey) {
+ t['throws'](
+ function () { ES.CreateDataPropertyOrThrow({}, nonPropertyKey); },
+ TypeError,
+ debug(nonPropertyKey) + ' is not a property key'
+ );
+ });
+
+ var sentinel = {};
+ forEach(v.propertyKeys, function (propertyKey) {
+ var obj = {};
+ var status = ES.CreateDataPropertyOrThrow(obj, propertyKey, sentinel);
+ t.equal(status, true, 'status is true');
+ t.equal(
+ obj[propertyKey],
+ sentinel,
+ debug(sentinel) + ' is installed on "' + debug(propertyKey) + '" on the object'
+ );
+
+ if (typeof Object.preventExtensions === 'function') {
+ var notExtensible = {};
+ Object.preventExtensions(notExtensible);
+
+ t['throws'](
+ function () { ES.CreateDataPropertyOrThrow(notExtensible, propertyKey, sentinel); },
+ TypeError,
+ 'can not install ' + debug(propertyKey) + ' on non-extensible object'
+ );
+ t.notEqual(
+ notExtensible[propertyKey],
+ sentinel,
+ debug(sentinel) + ' is not installed on "' + debug(propertyKey) + '" on the object'
+ );
+ }
+ });
+
+ t.end();
+ });
+
+ test('ObjectCreate', function (t) {
+ forEach(v.nonNullPrimitives, function (value) {
+ t['throws'](
+ function () { ES.ObjectCreate(value); },
+ TypeError,
+ debug(value) + ' is not null, or an object'
+ );
+ });
+
+ t.test('proto arg', function (st) {
+ var Parent = function Parent() {};
+ Parent.prototype.foo = {};
+ var child = ES.ObjectCreate(Parent.prototype);
+ st.equal(child instanceof Parent, true, 'child is instanceof Parent');
+ st.equal(child.foo, Parent.prototype.foo, 'child inherits properties from Parent.prototype');
+
+ st.end();
+ });
+
+ t.test('internal slots arg', function (st) {
+ st.doesNotThrow(function () { ES.ObjectCreate(null, []); }, 'an empty slot list is valid');
+
+ st['throws'](
+ function () { ES.ObjectCreate(null, ['a']); },
+ SyntaxError,
+ 'internal slots are not supported'
+ );
+
+ st.end();
+ });
+
+ t.test('null proto', { skip: !Object.create }, function (st) {
+ st.equal('toString' in ({}), true, 'normal objects have toString');
+ st.equal('toString' in ES.ObjectCreate(null), false, 'makes a null object');
+
+ st.end();
+ });
+
+ t.test('null proto when no native Object.create', { skip: Object.create }, function (st) {
+ st['throws'](
+ function () { ES.ObjectCreate(null); },
+ SyntaxError,
+ 'without a native Object.create, can not create null objects'
+ );
+
+ st.end();
+ });
+
+ t.end();
+ });
+
+ test('AdvanceStringIndex', function (t) {
+ forEach(v.nonStrings, function (nonString) {
+ t['throws'](
+ function () { ES.AdvanceStringIndex(nonString); },
+ TypeError,
+ '"S" argument must be a String; ' + debug(nonString) + ' is not'
+ );
+ });
+
+ var notInts = v.nonNumbers.concat(
+ v.nonIntegerNumbers,
+ [Infinity, -Infinity, NaN, [], new Date(), Math.pow(2, 53), -1]
+ );
+ forEach(notInts, function (nonInt) {
+ t['throws'](
+ function () { ES.AdvanceStringIndex('abc', nonInt); },
+ TypeError,
+ '"index" argument must be an integer, ' + debug(nonInt) + ' is not.'
+ );
+ });
+
+ forEach(v.nonBooleans, function (nonBoolean) {
+ t['throws'](
+ function () { ES.AdvanceStringIndex('abc', 0, nonBoolean); },
+ TypeError,
+ debug(nonBoolean) + ' is not a Boolean'
+ );
+ });
+
+ var str = 'a\uD83D\uDCA9c';
+
+ t.test('non-unicode mode', function (st) {
+ for (var i = 0; i < str.length + 2; i += 1) {
+ st.equal(ES.AdvanceStringIndex(str, i, false), i + 1, i + ' advances to ' + (i + 1));
+ }
+
+ st.end();
+ });
+
+ t.test('unicode mode', function (st) {
+ st.equal(ES.AdvanceStringIndex(str, 0, true), 1, '0 advances to 1');
+ st.equal(ES.AdvanceStringIndex(str, 1, true), 3, '1 advances to 3');
+ st.equal(ES.AdvanceStringIndex(str, 2, true), 3, '2 advances to 3');
+ st.equal(ES.AdvanceStringIndex(str, 3, true), 4, '3 advances to 4');
+ st.equal(ES.AdvanceStringIndex(str, 4, true), 5, '4 advances to 5');
+
+ st.end();
+ });
+
+ t.test('lone surrogates', function (st) {
+ var halfPoo = 'a\uD83Dc';
+
+ st.equal(ES.AdvanceStringIndex(halfPoo, 0, true), 1, '0 advances to 1');
+ st.equal(ES.AdvanceStringIndex(halfPoo, 1, true), 2, '1 advances to 2');
+ st.equal(ES.AdvanceStringIndex(halfPoo, 2, true), 3, '2 advances to 3');
+ st.equal(ES.AdvanceStringIndex(halfPoo, 3, true), 4, '3 advances to 4');
+
+ st.end();
+ });
+
+ t.test('surrogate pairs', function (st) {
+ var lowestPair = String.fromCharCode('0xD800') + String.fromCharCode('0xDC00');
+ var highestPair = String.fromCharCode('0xDBFF') + String.fromCharCode('0xDFFF');
+ var poop = String.fromCharCode('0xD83D') + String.fromCharCode('0xDCA9');
+
+ st.equal(ES.AdvanceStringIndex(lowestPair, 0, true), 2, 'lowest surrogate pair, 0 -> 2');
+ st.equal(ES.AdvanceStringIndex(highestPair, 0, true), 2, 'highest surrogate pair, 0 -> 2');
+ st.equal(ES.AdvanceStringIndex(poop, 0, true), 2, 'poop, 0 -> 2');
+
+ st.end();
+ });
+
+ t.end();
+ });
+};
+
+var es2016 = function ES2016(ES, ops, expectedMissing) {
+ es2015(ES, ops, expectedMissing);
+
+ test('SameValueNonNumber', function (t) {
+ var willThrow = [
+ [3, 4],
+ [NaN, 4],
+ [4, ''],
+ ['abc', true],
+ [{}, false]
+ ];
+ forEach(willThrow, function (nums) {
+ t['throws'](function () { return ES.SameValueNonNumber.apply(ES, nums); }, TypeError, 'value must be same type and non-number');
+ });
+
+ forEach(v.objects.concat(v.nonNumberPrimitives), function (val) {
+ t.equal(val === val, ES.SameValueNonNumber(val, val), debug(val) + ' is SameValueNonNumber to itself');
+ });
+
+ t.end();
+ });
+};
+
+var es2017 = function E2017(ES, ops, expectedMissing) {
+ es2016(ES, ops, expectedMissing);
+
+ test('ToIndex', function (t) {
+ t.ok(is(ES.ToIndex(), 0), 'no value gives 0');
+ t.ok(is(ES.ToIndex(undefined), 0), 'undefined value gives 0');
+
+ t['throws'](function () { ES.ToIndex(-1); }, RangeError, 'negative numbers throw');
+
+ t['throws'](function () { ES.ToIndex(MAX_SAFE_INTEGER + 1); }, RangeError, 'too large numbers throw');
+
+ t.equal(ES.ToIndex(3), 3, 'numbers work');
+ t.equal(ES.ToIndex(v.valueOfOnlyObject), 4, 'coercible objects are coerced');
+
+ t.end();
+ });
+};
+
+module.exports = {
+ es2015: es2015,
+ es2016: es2016,
+ es2017: es2017
+};