first commit
This commit is contained in:
294
node_modules/acorn-static-class-features/.eslintrc.json
generated
vendored
Normal file
294
node_modules/acorn-static-class-features/.eslintrc.json
generated
vendored
Normal file
@@ -0,0 +1,294 @@
|
||||
{
|
||||
"env": {
|
||||
"es6": true,
|
||||
"node": true
|
||||
},
|
||||
"extends": ["eslint:recommended", "plugin:node/recommended"],
|
||||
"plugins": ["node"],
|
||||
"rules": {
|
||||
"accessor-pairs": "error",
|
||||
"array-bracket-newline": "off",
|
||||
"array-bracket-spacing": "off",
|
||||
"array-callback-return": "error",
|
||||
"array-element-newline": "off",
|
||||
"arrow-body-style": "error",
|
||||
"arrow-parens": [
|
||||
"error",
|
||||
"as-needed"
|
||||
],
|
||||
"arrow-spacing": [
|
||||
"error",
|
||||
{
|
||||
"after": true,
|
||||
"before": true
|
||||
}
|
||||
],
|
||||
"block-scoped-var": "error",
|
||||
"block-spacing": "off",
|
||||
"brace-style": [
|
||||
"error",
|
||||
"1tbs",
|
||||
{
|
||||
"allowSingleLine": true
|
||||
}
|
||||
],
|
||||
"callback-return": "error",
|
||||
"camelcase": "error",
|
||||
"capitalized-comments": "off",
|
||||
"class-methods-use-this": "error",
|
||||
"comma-dangle": "off",
|
||||
"comma-spacing": [
|
||||
"error",
|
||||
{
|
||||
"after": true,
|
||||
"before": false
|
||||
}
|
||||
],
|
||||
"comma-style": [
|
||||
"error",
|
||||
"last"
|
||||
],
|
||||
"complexity": "off",
|
||||
"computed-property-spacing": [
|
||||
"error",
|
||||
"never"
|
||||
],
|
||||
"consistent-return": "error",
|
||||
"consistent-this": "error",
|
||||
"curly": [ "error", "multi-line" ],
|
||||
"default-case": "error",
|
||||
"dot-location": "error",
|
||||
"dot-notation": [
|
||||
"error",
|
||||
{
|
||||
"allowKeywords": true
|
||||
}
|
||||
],
|
||||
"eol-last": "error",
|
||||
"eqeqeq": "off",
|
||||
"for-direction": "error",
|
||||
"func-call-spacing": "error",
|
||||
"func-name-matching": "error",
|
||||
"func-names": [
|
||||
"error",
|
||||
"never"
|
||||
],
|
||||
"func-style": [
|
||||
"error",
|
||||
"declaration",
|
||||
{ "allowArrowFunctions": true }
|
||||
],
|
||||
"function-paren-newline": "off",
|
||||
"generator-star-spacing": "error",
|
||||
"getter-return": "error",
|
||||
"global-require": "warn",
|
||||
"guard-for-in": "error",
|
||||
"handle-callback-err": "error",
|
||||
"id-blacklist": "error",
|
||||
"id-length": "off",
|
||||
"id-match": "error",
|
||||
"implicit-arrow-linebreak": [
|
||||
"error",
|
||||
"beside"
|
||||
],
|
||||
"indent": ["error", 2],
|
||||
"indent-legacy": "off",
|
||||
"init-declarations": "off",
|
||||
"jsx-quotes": "error",
|
||||
"key-spacing": "error",
|
||||
"keyword-spacing": [
|
||||
"error",
|
||||
{
|
||||
"after": true,
|
||||
"before": true
|
||||
}
|
||||
],
|
||||
"line-comment-position": "off",
|
||||
"linebreak-style": [
|
||||
"error",
|
||||
"unix"
|
||||
],
|
||||
"lines-around-comment": "error",
|
||||
"lines-around-directive": "error",
|
||||
"lines-between-class-members": "error",
|
||||
"max-depth": "error",
|
||||
"max-len": "off",
|
||||
"max-lines": "off",
|
||||
"max-nested-callbacks": "error",
|
||||
"max-params": "off",
|
||||
"max-statements": "off",
|
||||
"max-statements-per-line": "off",
|
||||
"multiline-comment-style": [
|
||||
"error",
|
||||
"separate-lines"
|
||||
],
|
||||
"new-cap": "error",
|
||||
"new-parens": "error",
|
||||
"newline-after-var": "off",
|
||||
"newline-before-return": "off",
|
||||
"newline-per-chained-call": "off",
|
||||
"no-alert": "error",
|
||||
"no-array-constructor": "error",
|
||||
"no-await-in-loop": "error",
|
||||
"no-bitwise": "error",
|
||||
"no-buffer-constructor": "error",
|
||||
"no-caller": "error",
|
||||
"no-catch-shadow": "error",
|
||||
"no-confusing-arrow": "error",
|
||||
"no-continue": "off",
|
||||
"no-div-regex": "error",
|
||||
"no-duplicate-imports": "error",
|
||||
"no-else-return": "error",
|
||||
"no-empty-function": "error",
|
||||
"no-eq-null": "error",
|
||||
"no-eval": "error",
|
||||
"no-extend-native": "error",
|
||||
"no-extra-bind": "error",
|
||||
"no-extra-label": "error",
|
||||
"no-extra-parens": "off",
|
||||
"no-floating-decimal": "error",
|
||||
"no-implicit-coercion": "error",
|
||||
"no-implicit-globals": "error",
|
||||
"no-implied-eval": "error",
|
||||
"no-inline-comments": "off",
|
||||
"no-invalid-this": "off",
|
||||
"no-iterator": "error",
|
||||
"no-label-var": "error",
|
||||
"no-labels": "error",
|
||||
"no-lone-blocks": "error",
|
||||
"no-lonely-if": "off",
|
||||
"no-loop-func": "error",
|
||||
"no-magic-numbers": "off",
|
||||
"no-mixed-operators": "off",
|
||||
"no-mixed-requires": "error",
|
||||
"no-multi-assign": "error",
|
||||
"no-multi-spaces": "error",
|
||||
"no-multi-str": "error",
|
||||
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 0, "maxBOF": 0 }],
|
||||
"no-native-reassign": "error",
|
||||
"no-negated-condition": "off",
|
||||
"no-negated-in-lhs": "error",
|
||||
"no-nested-ternary": "error",
|
||||
"no-new": "error",
|
||||
"no-new-func": "error",
|
||||
"no-new-object": "error",
|
||||
"no-new-require": "error",
|
||||
"no-new-wrappers": "error",
|
||||
"no-octal-escape": "error",
|
||||
"no-param-reassign": "off",
|
||||
"no-path-concat": "error",
|
||||
"no-plusplus": "off",
|
||||
"no-process-env": "error",
|
||||
"no-process-exit": "error",
|
||||
"no-proto": "error",
|
||||
"no-prototype-builtins": "error",
|
||||
"no-restricted-globals": "error",
|
||||
"no-restricted-imports": "error",
|
||||
"no-restricted-modules": "error",
|
||||
"no-restricted-properties": "error",
|
||||
"no-restricted-syntax": "error",
|
||||
"no-return-assign": "error",
|
||||
"no-return-await": "error",
|
||||
"no-script-url": "error",
|
||||
"no-self-compare": "error",
|
||||
"no-sequences": "error",
|
||||
"no-shadow": "error",
|
||||
"no-shadow-restricted-names": "error",
|
||||
"no-spaced-func": "error",
|
||||
"no-sync": [
|
||||
"error",
|
||||
{
|
||||
"allowAtRootLevel": true
|
||||
}
|
||||
],
|
||||
"no-tabs": "error",
|
||||
"no-template-curly-in-string": "error",
|
||||
"no-ternary": "off",
|
||||
"no-throw-literal": "error",
|
||||
"no-trailing-spaces": "error",
|
||||
"no-undef-init": "error",
|
||||
"no-undefined": "error",
|
||||
"no-underscore-dangle": "off",
|
||||
"no-unmodified-loop-condition": "error",
|
||||
"no-unneeded-ternary": "error",
|
||||
"no-unused-expressions": "error",
|
||||
"no-unused-vars": ["error", {"argsIgnorePattern": "^_"}],
|
||||
"no-use-before-define": "error",
|
||||
"no-useless-call": "error",
|
||||
"no-useless-computed-key": "error",
|
||||
"no-useless-concat": "error",
|
||||
"no-useless-constructor": "error",
|
||||
"no-useless-rename": "error",
|
||||
"no-useless-return": "error",
|
||||
"no-var": "error",
|
||||
"no-void": "error",
|
||||
"no-warning-comments": "warn",
|
||||
"no-whitespace-before-property": "error",
|
||||
"no-with": "error",
|
||||
"nonblock-statement-body-position": [
|
||||
"error",
|
||||
"any"
|
||||
],
|
||||
"object-curly-newline": "off",
|
||||
"object-curly-spacing": "off",
|
||||
"object-property-newline": "off",
|
||||
"object-shorthand": "off",
|
||||
"one-var": "off",
|
||||
"one-var-declaration-per-line": "off",
|
||||
"operator-assignment": "error",
|
||||
"operator-linebreak": "error",
|
||||
"padded-blocks": "off",
|
||||
"padding-line-between-statements": "error",
|
||||
"prefer-arrow-callback": "off",
|
||||
"prefer-const": "off",
|
||||
"prefer-destructuring": "off",
|
||||
"prefer-numeric-literals": "error",
|
||||
"prefer-promise-reject-errors": "error",
|
||||
"prefer-reflect": "off",
|
||||
"prefer-rest-params": "off",
|
||||
"prefer-spread": "error",
|
||||
"prefer-template": "error",
|
||||
"quote-props": ["error", "as-needed"],
|
||||
"quotes": ["error", "double"],
|
||||
"radix": "error",
|
||||
"require-await": "error",
|
||||
"require-jsdoc": "off",
|
||||
"rest-spread-spacing": "error",
|
||||
"semi": ["error", "never"],
|
||||
"semi-spacing": "error",
|
||||
"semi-style": [
|
||||
"error",
|
||||
"first"
|
||||
],
|
||||
"sort-imports": "error",
|
||||
"sort-keys": "off",
|
||||
"sort-vars": "off",
|
||||
"space-before-blocks": "error",
|
||||
"space-before-function-paren": "off",
|
||||
"space-in-parens": [
|
||||
"error",
|
||||
"never"
|
||||
],
|
||||
"space-infix-ops": "error",
|
||||
"space-unary-ops": "error",
|
||||
"spaced-comment": "off",
|
||||
"strict": "error",
|
||||
"switch-colon-spacing": "error",
|
||||
"symbol-description": "error",
|
||||
"template-curly-spacing": "error",
|
||||
"template-tag-spacing": "error",
|
||||
"unicode-bom": [
|
||||
"error",
|
||||
"never"
|
||||
],
|
||||
"valid-jsdoc": "error",
|
||||
"vars-on-top": "off",
|
||||
"wrap-regex": "error",
|
||||
"yield-star-spacing": "error",
|
||||
"yoda": [
|
||||
"error",
|
||||
"never"
|
||||
],
|
||||
"node/no-unpublished-require": "off"
|
||||
}
|
||||
}
|
22
node_modules/acorn-static-class-features/CHANGELOG.md
generated
vendored
Normal file
22
node_modules/acorn-static-class-features/CHANGELOG.md
generated
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
## 0.2.2 (2020-05-21)
|
||||
|
||||
* Allow `arguments` usage in nested static methods
|
||||
* Allow numeric class element names
|
||||
|
||||
## 0.2.1 (2020-04-25)
|
||||
|
||||
* Mark as compatible with acorn v7
|
||||
* Use injected acorn instance if available
|
||||
* Uses `Object.getPrototypeOf` if available instead of `__proto__`
|
||||
|
||||
## 0.2.0 (2019-02-09)
|
||||
|
||||
* Require acorn >= 6.1.0
|
||||
|
||||
## 0.1.1 (2018-11-06)
|
||||
|
||||
* Adapt to changes in acorn 6.0.3
|
||||
|
||||
## 0.1.0 (2018-09-14)
|
||||
|
||||
Initial release
|
19
node_modules/acorn-static-class-features/LICENSE
generated
vendored
Normal file
19
node_modules/acorn-static-class-features/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
Copyright (C) 2017-2018 by Adrian Heine
|
||||
|
||||
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.
|
21
node_modules/acorn-static-class-features/README.md
generated
vendored
Normal file
21
node_modules/acorn-static-class-features/README.md
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
# Static class features support for Acorn
|
||||
|
||||
[](https://www.npmjs.org/package/acorn-static-class-features)
|
||||
|
||||
This is a plugin for [Acorn](http://marijnhaverbeke.nl/acorn/) - a tiny, fast JavaScript parser, written completely in JavaScript.
|
||||
|
||||
It implements support for static class features as defined in the stage 3 proposal [Static class features](https://github.com/tc39/proposal-static-class-features). The emitted AST follows [an ESTree proposal](https://github.com/estree/estree/pull/180).
|
||||
|
||||
## Usage
|
||||
|
||||
This module provides a plugin that can be used to extend the Acorn `Parser` class:
|
||||
|
||||
```javascript
|
||||
const {Parser} = require('acorn');
|
||||
const staticClassFeatures = require('acorn-static-class-features');
|
||||
Parser.extend(staticClassFeatures).parse('class X { static x = 0 }');
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
This plugin is released under an [MIT License](./LICENSE).
|
83
node_modules/acorn-static-class-features/index.js
generated
vendored
Normal file
83
node_modules/acorn-static-class-features/index.js
generated
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
"use strict"
|
||||
|
||||
const privateClassElements = require("acorn-private-class-elements")
|
||||
|
||||
module.exports = function(Parser) {
|
||||
const ExtendedParser = privateClassElements(Parser)
|
||||
|
||||
const acorn = Parser.acorn || require("acorn")
|
||||
const tt = acorn.tokTypes
|
||||
|
||||
return class extends ExtendedParser {
|
||||
_maybeParseFieldValue(field) {
|
||||
if (this.eat(tt.eq)) {
|
||||
const oldInFieldValue = this._inStaticFieldScope
|
||||
this._inStaticFieldScope = this.currentThisScope()
|
||||
field.value = this.parseExpression()
|
||||
this._inStaticFieldScope = oldInFieldValue
|
||||
} else field.value = null
|
||||
}
|
||||
|
||||
// Parse fields
|
||||
parseClassElement(_constructorAllowsSuper) {
|
||||
if (this.options.ecmaVersion < 8 || !this.isContextual("static")) {
|
||||
return super.parseClassElement.apply(this, arguments)
|
||||
}
|
||||
|
||||
const branch = this._branch()
|
||||
branch.next()
|
||||
if ([tt.name, tt.bracketL, tt.string, tt.num, this.privateNameToken].indexOf(branch.type) == -1) {
|
||||
return super.parseClassElement.apply(this, arguments)
|
||||
}
|
||||
if (branch.type == tt.bracketL) {
|
||||
let count = 0
|
||||
do {
|
||||
if (branch.eat(tt.bracketL)) ++count
|
||||
else if (branch.eat(tt.bracketR)) --count
|
||||
else branch.next()
|
||||
} while (count > 0)
|
||||
} else branch.next()
|
||||
if (branch.type != tt.eq && !branch.canInsertSemicolon() && branch.type != tt.semi) {
|
||||
return super.parseClassElement.apply(this, arguments)
|
||||
}
|
||||
|
||||
const node = this.startNode()
|
||||
node.static = this.eatContextual("static")
|
||||
if (this.type == this.privateNameToken) {
|
||||
this.parsePrivateClassElementName(node)
|
||||
} else {
|
||||
this.parsePropertyName(node)
|
||||
}
|
||||
if ((node.key.type === "Identifier" && node.key.name === "constructor") ||
|
||||
(node.key.type === "Literal" && !node.computed && node.key.value === "constructor")) {
|
||||
this.raise(node.key.start, "Classes may not have a field called constructor")
|
||||
}
|
||||
if ((node.key.name || node.key.value) === "prototype" && !node.computed) {
|
||||
this.raise(node.key.start, "Classes may not have a static property named prototype")
|
||||
}
|
||||
|
||||
this._maybeParseFieldValue(node)
|
||||
this.finishNode(node, "FieldDefinition")
|
||||
this.semicolon()
|
||||
return node
|
||||
}
|
||||
|
||||
// Parse private static methods
|
||||
parsePropertyName(prop) {
|
||||
if (prop.static && this.type == this.privateNameToken) {
|
||||
this.parsePrivateClassElementName(prop)
|
||||
} else {
|
||||
super.parsePropertyName(prop)
|
||||
}
|
||||
}
|
||||
|
||||
// Prohibit arguments in class field initializers
|
||||
parseIdent(liberal, isBinding) {
|
||||
const ident = super.parseIdent(liberal, isBinding)
|
||||
if (this._inStaticFieldScope && this.currentThisScope() === this._inStaticFieldScope && ident.name == "arguments") {
|
||||
this.raise(ident.start, "A static class field initializer may not contain arguments")
|
||||
}
|
||||
return ident
|
||||
}
|
||||
}
|
||||
}
|
71
node_modules/acorn-static-class-features/package.json
generated
vendored
Normal file
71
node_modules/acorn-static-class-features/package.json
generated
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
"acorn-static-class-features@0.2.2",
|
||||
"D:\\Projects\\siag\\vanillajs-seed"
|
||||
]
|
||||
],
|
||||
"_development": true,
|
||||
"_from": "acorn-static-class-features@0.2.2",
|
||||
"_id": "acorn-static-class-features@0.2.2",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha512-B7aWeS7MXqdgP3RnettN/CFz7HevAlQWfh5zkc3LJzeCQoF1InTzYBCfkkbmit1p0pmCEB8IG05gB62pOm5lvA==",
|
||||
"_location": "/acorn-static-class-features",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"registry": true,
|
||||
"raw": "acorn-static-class-features@0.2.2",
|
||||
"name": "acorn-static-class-features",
|
||||
"escapedName": "acorn-static-class-features",
|
||||
"rawSpec": "0.2.2",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "0.2.2"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/acorn-stage3"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/acorn-static-class-features/-/acorn-static-class-features-0.2.2.tgz",
|
||||
"_spec": "0.2.2",
|
||||
"_where": "D:\\Projects\\siag\\vanillajs-seed",
|
||||
"bugs": {
|
||||
"url": "https://github.com/acornjs/acorn-static-class-features/issues"
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Adrian Heine",
|
||||
"email": "mail@adrianheine.de"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"acorn-private-class-elements": "^0.2.3"
|
||||
},
|
||||
"description": "Support for static class features in acorn",
|
||||
"devDependencies": {
|
||||
"acorn": "^7.0.0",
|
||||
"eslint": "^6",
|
||||
"eslint-plugin-node": "^11",
|
||||
"mocha": "^7",
|
||||
"test262": "git+https://github.com/tc39/test262.git#2f1d28ddcaa82004236619876c31359d8ca81414",
|
||||
"test262-parser-runner": "^0.5.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.8.2"
|
||||
},
|
||||
"homepage": "https://github.com/acornjs/acorn-static-class-features",
|
||||
"license": "MIT",
|
||||
"name": "acorn-static-class-features",
|
||||
"peerDependencies": {
|
||||
"acorn": "^6.1.0 || ^7.0.0"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/acornjs/acorn-static-class-features.git"
|
||||
},
|
||||
"scripts": {
|
||||
"lint": "eslint -c .eslintrc.json .",
|
||||
"test": "mocha",
|
||||
"test:test262": "node run_test262.js"
|
||||
},
|
||||
"version": "0.2.2"
|
||||
}
|
28
node_modules/acorn-static-class-features/run_test262.js
generated
vendored
Normal file
28
node_modules/acorn-static-class-features/run_test262.js
generated
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
"use strict"
|
||||
|
||||
const fs = require("fs")
|
||||
const path = require("path")
|
||||
const run = require("test262-parser-runner")
|
||||
const acorn = require("acorn")
|
||||
const Parser = acorn.Parser.extend(require("."))
|
||||
|
||||
const unsupportedFeatures = [
|
||||
"class-fields-public",
|
||||
"class-fields-private",
|
||||
"class-methods-private"
|
||||
]
|
||||
|
||||
const implementedFeatures = [
|
||||
"class-static-fields-public",
|
||||
"class-static-fields-private",
|
||||
"class-static-methods-private"
|
||||
]
|
||||
|
||||
run(
|
||||
(content, options) => Parser.parse(content, {sourceType: options.sourceType, ecmaVersion: 11}),
|
||||
{
|
||||
testsDirectory: path.dirname(require.resolve("test262/package.json")),
|
||||
skip: test => (!test.attrs.features || !implementedFeatures.some(f => test.attrs.features.includes(f)) || unsupportedFeatures.some(f => test.attrs.features.includes(f))),
|
||||
whitelist: fs.readFileSync("./test262.whitelist", "utf8").split("\n").filter(v => v && v[0] !== "#")
|
||||
}
|
||||
)
|
5
node_modules/acorn-static-class-features/test/.eslintrc.json
generated
vendored
Normal file
5
node_modules/acorn-static-class-features/test/.eslintrc.json
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"env": {
|
||||
"mocha": true
|
||||
}
|
||||
}
|
422
node_modules/acorn-static-class-features/test/test.js
generated
vendored
Normal file
422
node_modules/acorn-static-class-features/test/test.js
generated
vendored
Normal file
@@ -0,0 +1,422 @@
|
||||
"use strict"
|
||||
|
||||
const assert = require("assert")
|
||||
const acorn = require("acorn")
|
||||
const Parser = acorn.Parser.extend(require(".."))
|
||||
|
||||
function test(text, expectedResult, additionalOptions) {
|
||||
it(text, function () {
|
||||
const result = Parser.parse(text, Object.assign({ ecmaVersion: 10 }, additionalOptions))
|
||||
if (expectedResult) {
|
||||
assert.deepStrictEqual(result.body[0], expectedResult)
|
||||
}
|
||||
})
|
||||
}
|
||||
function testFail(text, expectedResult, additionalOptions) {
|
||||
it(text, function () {
|
||||
let failed = false
|
||||
try {
|
||||
Parser.parse(text, Object.assign({ ecmaVersion: 10 }, additionalOptions))
|
||||
} catch (e) {
|
||||
assert.strictEqual(e.message, expectedResult)
|
||||
failed = true
|
||||
}
|
||||
assert(failed)
|
||||
})
|
||||
}
|
||||
const newNode = (start, props) => Object.assign(new acorn.Node({options: {}}, start), props)
|
||||
|
||||
describe("acorn-static-class-features", function () {
|
||||
test(`class CustomDate {
|
||||
// ...
|
||||
static epoch = new CustomDate(0);
|
||||
}`)
|
||||
|
||||
testFail("class A { static #a; f() { delete A.#a } }", "Private elements may not be deleted (1:27)")
|
||||
testFail("class A { static #a; static #a }", "Duplicate private element (1:21)")
|
||||
testFail("class A { static a = A.#a }", "Usage of undeclared private name (1:23)")
|
||||
testFail("class A { static a = () => arguments }", "A static class field initializer may not contain arguments (1:27)")
|
||||
testFail("class A { static a = () => super() }", "'super' keyword outside a method (1:27)")
|
||||
testFail("class A { static # a }", "Unexpected token (1:19)")
|
||||
testFail("class A { static #a; a() { A.# a } }", "Unexpected token (1:31)")
|
||||
test(`class C {
|
||||
static async * #method() {
|
||||
}
|
||||
}`)
|
||||
test(`class C {
|
||||
static a = () => {
|
||||
function p () {
|
||||
console.log(arguments);
|
||||
}
|
||||
}
|
||||
}`)
|
||||
|
||||
const classes = [
|
||||
{ text: "class A { %s }", ast: getBody => {
|
||||
const body = getBody(10)
|
||||
return newNode(0, {
|
||||
type: "ClassDeclaration",
|
||||
end: body.end + 2,
|
||||
id: newNode(6, {
|
||||
type: "Identifier",
|
||||
end: 7,
|
||||
name: "A"
|
||||
}),
|
||||
superClass: null,
|
||||
body: newNode(8, {
|
||||
type: "ClassBody",
|
||||
end: body.end + 2,
|
||||
body: [body]
|
||||
})
|
||||
})
|
||||
} },
|
||||
{ text: "class A { %s; }", ast: getBody => {
|
||||
const body = getBody(10)
|
||||
return newNode(0, {
|
||||
type: "ClassDeclaration",
|
||||
end: body.end + 3,
|
||||
id: newNode(6, {
|
||||
type: "Identifier",
|
||||
end: 7,
|
||||
name: "A"
|
||||
}),
|
||||
superClass: null,
|
||||
body: newNode(8, {
|
||||
type: "ClassBody",
|
||||
end: body.end + 3,
|
||||
body: [body]
|
||||
})
|
||||
})
|
||||
} },
|
||||
{ text: "class A { %s; static #y }", ast: getBody => {
|
||||
const body = getBody(10)
|
||||
return newNode(0, {
|
||||
type: "ClassDeclaration",
|
||||
end: body.end + 13,
|
||||
id: newNode(6, {
|
||||
type: "Identifier",
|
||||
end: 7,
|
||||
name: "A"
|
||||
}),
|
||||
superClass: null,
|
||||
body: newNode(8, {
|
||||
type: "ClassBody",
|
||||
end: body.end + 13,
|
||||
body: [body, newNode(body.end + 2, {
|
||||
type: "FieldDefinition",
|
||||
end: body.end + 11,
|
||||
key: newNode(body.end + 9, {
|
||||
type: "PrivateName",
|
||||
end: body.end + 11,
|
||||
name: "y"
|
||||
}),
|
||||
value: null,
|
||||
computed: false,
|
||||
static: true
|
||||
}) ]
|
||||
})
|
||||
})
|
||||
} },
|
||||
{ text: "class A { %s;a() {} }", ast: getBody => {
|
||||
const body = getBody(10)
|
||||
return newNode(0, {
|
||||
type: "ClassDeclaration",
|
||||
end: body.end + 9,
|
||||
id: newNode(6, {
|
||||
type: "Identifier",
|
||||
end: 7,
|
||||
name: "A"
|
||||
}),
|
||||
superClass: null,
|
||||
body: newNode(8, {
|
||||
type: "ClassBody",
|
||||
end: body.end + 9,
|
||||
body: [ body, newNode(body.end + 1, {
|
||||
type: "MethodDefinition",
|
||||
end: body.end + 7,
|
||||
kind: "method",
|
||||
static: false,
|
||||
computed: false,
|
||||
key: newNode(body.end + 1, {
|
||||
type: "Identifier",
|
||||
end: body.end + 2,
|
||||
name: "a"
|
||||
}),
|
||||
value: newNode(body.end + 2, {
|
||||
type: "FunctionExpression",
|
||||
end: body.end + 7,
|
||||
id: null,
|
||||
generator: false,
|
||||
expression: false,
|
||||
async: false,
|
||||
params: [],
|
||||
body: newNode(body.end + 5, {
|
||||
type: "BlockStatement",
|
||||
end: body.end + 7,
|
||||
body: []
|
||||
})
|
||||
})
|
||||
}) ]
|
||||
})
|
||||
})
|
||||
} },
|
||||
{ text: "class A { %s\na() {} }", ast: getBody => {
|
||||
const body = getBody(10)
|
||||
return newNode(0, {
|
||||
type: "ClassDeclaration",
|
||||
end: body.end + 9,
|
||||
id: newNode(6, {
|
||||
type: "Identifier",
|
||||
end: 7,
|
||||
name: "A"
|
||||
}),
|
||||
superClass: null,
|
||||
body: newNode(8, {
|
||||
type: "ClassBody",
|
||||
end: body.end + 9,
|
||||
body: [
|
||||
body,
|
||||
newNode(body.end + 1, {
|
||||
type: "MethodDefinition",
|
||||
end: body.end + 7,
|
||||
kind: "method",
|
||||
static: false,
|
||||
computed: false,
|
||||
key: newNode(body.end + 1, {
|
||||
type: "Identifier",
|
||||
end: body.end + 2,
|
||||
name: "a"
|
||||
}),
|
||||
value: newNode(body.end + 2, {
|
||||
type: "FunctionExpression",
|
||||
end: body.end + 7,
|
||||
id: null,
|
||||
generator: false,
|
||||
expression: false,
|
||||
async: false,
|
||||
params: [],
|
||||
body: newNode(body.end + 5, {
|
||||
type: "BlockStatement",
|
||||
end: body.end + 7,
|
||||
body: []
|
||||
})
|
||||
})
|
||||
})
|
||||
]
|
||||
})
|
||||
})
|
||||
} },
|
||||
]
|
||||
|
||||
;[
|
||||
{ body: "static x", passes: true, ast: start => newNode(start, {
|
||||
type: "FieldDefinition",
|
||||
end: start + 8,
|
||||
key: newNode(start + 7, {
|
||||
type: "Identifier",
|
||||
end: start + 8,
|
||||
name: "x"
|
||||
}),
|
||||
value: null,
|
||||
computed: false,
|
||||
static: true
|
||||
}) },
|
||||
{ body: "static x = 0", passes: true, ast: start => newNode(start, {
|
||||
type: "FieldDefinition",
|
||||
end: start + 12,
|
||||
key: newNode(start + 7, {
|
||||
type: "Identifier",
|
||||
end: start + 8,
|
||||
name: "x"
|
||||
}),
|
||||
value: newNode(start + 11, {
|
||||
type: "Literal",
|
||||
end: start + 12,
|
||||
value: 0,
|
||||
raw: "0"
|
||||
}),
|
||||
computed: false,
|
||||
static: true
|
||||
}) },
|
||||
{ body: "static [x]", passes: true, ast: start => newNode(start, {
|
||||
type: "FieldDefinition",
|
||||
end: start + 10,
|
||||
computed: true,
|
||||
key: newNode(start + 8, {
|
||||
type: "Identifier",
|
||||
end: start + 9,
|
||||
name: "x"
|
||||
}),
|
||||
value: null,
|
||||
static: true
|
||||
}) },
|
||||
{ body: "static [x] = 0", passes: true, ast: start => newNode(start, {
|
||||
type: "FieldDefinition",
|
||||
end: start + 14,
|
||||
computed: true,
|
||||
key: newNode(start + 8, {
|
||||
type: "Identifier",
|
||||
end: start + 9,
|
||||
name: "x"
|
||||
}),
|
||||
value: newNode(start + 13, {
|
||||
type: "Literal",
|
||||
end: start + 14,
|
||||
value: 0,
|
||||
raw: "0"
|
||||
}),
|
||||
static: true
|
||||
}) },
|
||||
{ body: "static #x", passes: true, ast: start => newNode(start, {
|
||||
type: "FieldDefinition",
|
||||
end: start + 9,
|
||||
computed: false,
|
||||
key: newNode(start + 7, {
|
||||
type: "PrivateName",
|
||||
end: start + 9,
|
||||
name: "x"
|
||||
}),
|
||||
value: null,
|
||||
static: true
|
||||
}) },
|
||||
{ body: "static #x = 0", passes: true, ast: start => newNode(start, {
|
||||
type: "FieldDefinition",
|
||||
end: start + 13,
|
||||
computed: false,
|
||||
key: newNode(start + 7, {
|
||||
type: "PrivateName",
|
||||
end: start + 9,
|
||||
name: "x"
|
||||
}),
|
||||
value: newNode(start + 12, {
|
||||
type: "Literal",
|
||||
end: start + 13,
|
||||
value: 0,
|
||||
raw: "0"
|
||||
}),
|
||||
static: true
|
||||
}) },
|
||||
|
||||
{ body: "static async", passes: true, ast: start => newNode(start, {
|
||||
type: "FieldDefinition",
|
||||
end: start + 12,
|
||||
key: newNode(start + 7, {
|
||||
type: "Identifier",
|
||||
end: start + 12,
|
||||
name: "async"
|
||||
}),
|
||||
value: null,
|
||||
computed: false,
|
||||
static: true
|
||||
}) },
|
||||
|
||||
{ body: "static async = 5", passes: true, ast: start => newNode(start, {
|
||||
type: "FieldDefinition",
|
||||
end: start + 16,
|
||||
key: newNode(start + 7, {
|
||||
type: "Identifier",
|
||||
end: start + 12,
|
||||
name: "async"
|
||||
}),
|
||||
value: newNode(start + 15, {
|
||||
type: "Literal",
|
||||
end: start + 16,
|
||||
raw: "5",
|
||||
value: 5
|
||||
}),
|
||||
computed: false,
|
||||
static: true
|
||||
}) },
|
||||
].forEach(bodyInput => {
|
||||
const body = bodyInput.body, passes = bodyInput.passes, bodyAst = bodyInput.ast
|
||||
classes.forEach(input => {
|
||||
const text = input.text, options = input.options || {}, ast = input.ast
|
||||
;(passes ? test : testFail)(text.replace("%s", body), ast(bodyAst), options)
|
||||
})
|
||||
})
|
||||
|
||||
// Private static methods
|
||||
test("class A { a() { A.#a }; static #a() {} }")
|
||||
|
||||
testFail("class A { static #a() {}; f() { delete A.#a } }", "Private elements may not be deleted (1:32)")
|
||||
testFail("class A { static #a() {}; static #a() {} }", "Duplicate private element (1:26)")
|
||||
test("class A { static get #a() {}; static set #a(newA) {} }")
|
||||
testFail("class A { a() { A.#a } }", "Usage of undeclared private name (1:18)")
|
||||
testFail("class A { a() { A.#a } b() { A.#b } }", "Usage of undeclared private name (1:18)")
|
||||
testFail("class A { static #constructor() {} }", "Classes may not have a private element named constructor (1:17)")
|
||||
testFail("class A { static #[ab]() {} }", "Unexpected token (1:18)")
|
||||
testFail("a = { static #ab() {} }", "Unexpected token (1:13)")
|
||||
testFail("class A { static [{#ab() {}}]() {} }", "Unexpected token (1:19)")
|
||||
testFail("class A{ static # a() {}}", "Unexpected token (1:18)")
|
||||
testFail("class C{ static #method() { super(); } };", "super() call outside constructor of a subclass (1:28)")
|
||||
test("class C{ static #method() { super.y(); } };")
|
||||
|
||||
;[
|
||||
{ body: "static #x() {}", passes: true, ast: start => newNode(start, {
|
||||
type: "MethodDefinition",
|
||||
end: start + 14,
|
||||
computed: false,
|
||||
key: newNode(start + 7, {
|
||||
type: "PrivateName",
|
||||
end: start + 9,
|
||||
name: "x"
|
||||
}),
|
||||
kind: "method",
|
||||
static: true,
|
||||
value: newNode(start + 9, {
|
||||
type: "FunctionExpression",
|
||||
end: start + 14,
|
||||
async: false,
|
||||
body: newNode(start + 12, {
|
||||
type: "BlockStatement",
|
||||
body: [],
|
||||
end: start + 14,
|
||||
}),
|
||||
expression: false,
|
||||
generator: false,
|
||||
id: null,
|
||||
params: [],
|
||||
})
|
||||
}) },
|
||||
{ body: "static get #x() {}", passes: true, ast: start => newNode(start, {
|
||||
type: "MethodDefinition",
|
||||
end: start + 18,
|
||||
computed: false,
|
||||
key: newNode(start + 11, {
|
||||
type: "PrivateName",
|
||||
end: start + 13,
|
||||
name: "x"
|
||||
}),
|
||||
kind: "get",
|
||||
static: true,
|
||||
value: newNode(start + 13, {
|
||||
type: "FunctionExpression",
|
||||
end: start + 18,
|
||||
async: false,
|
||||
body: newNode(start + 16, {
|
||||
body: [],
|
||||
end: start + 18,
|
||||
type: "BlockStatement"
|
||||
}),
|
||||
expression: false,
|
||||
generator: false,
|
||||
id: null,
|
||||
params: [],
|
||||
})
|
||||
}) },
|
||||
|
||||
].forEach(bodyInput => {
|
||||
const body = bodyInput.body, passes = bodyInput.passes, bodyAst = bodyInput.ast
|
||||
classes.forEach(input => {
|
||||
const text = input.text, options = input.options || {}, ast = input.ast
|
||||
;(passes ? test : testFail)(text.replace("%s", body), ast(bodyAst), options)
|
||||
})
|
||||
})
|
||||
test("class A extends B { constructor() { super() } }")
|
||||
test(`class C {
|
||||
static f = 'test262';
|
||||
static 'g';
|
||||
static 0 = 'bar';
|
||||
static [computed];
|
||||
}`)
|
||||
})
|
0
node_modules/acorn-static-class-features/test262.whitelist
generated
vendored
Normal file
0
node_modules/acorn-static-class-features/test262.whitelist
generated
vendored
Normal file
Reference in New Issue
Block a user