...;
- Parser.prototype.parseImportDefaultSpecifier = function () {
- var node = this.createNode();
- var local = this.parseIdentifierName();
- return this.finalize(node, new Node.ImportDefaultSpecifier(local));
- };
- // import <* as foo> ...;
- Parser.prototype.parseImportNamespaceSpecifier = function () {
- var node = this.createNode();
- this.expect('*');
- if (!this.matchContextualKeyword('as')) {
- this.throwError(messages_1.Messages.NoAsAfterImportNamespace);
- }
- this.nextToken();
- var local = this.parseIdentifierName();
- return this.finalize(node, new Node.ImportNamespaceSpecifier(local));
- };
- Parser.prototype.parseImportDeclaration = function () {
- if (this.context.inFunctionBody) {
- this.throwError(messages_1.Messages.IllegalImportDeclaration);
- }
- var node = this.createNode();
- this.expectKeyword('import');
- var src;
- var specifiers = [];
- if (this.lookahead.type === token_1.Token.StringLiteral) {
- // import 'foo';
- src = this.parseModuleSpecifier();
- }
- else {
- if (this.match('{')) {
- // import {bar}
- specifiers = specifiers.concat(this.parseNamedImports());
- }
- else if (this.match('*')) {
- // import * as foo
- specifiers.push(this.parseImportNamespaceSpecifier());
- }
- else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {
- // import foo
- specifiers.push(this.parseImportDefaultSpecifier());
- if (this.match(',')) {
- this.nextToken();
- if (this.match('*')) {
- // import foo, * as foo
- specifiers.push(this.parseImportNamespaceSpecifier());
- }
- else if (this.match('{')) {
- // import foo, {bar}
- specifiers = specifiers.concat(this.parseNamedImports());
- }
- else {
- this.throwUnexpectedToken(this.lookahead);
- }
+ JSXParser.prototype.parseComplexJSXElement = function (el) {
+ var stack = [];
+ while (!this.scanner.eof()) {
+ el.children = el.children.concat(this.parseJSXChildren());
+ var node = this.createJSXChildNode();
+ var element = this.parseJSXBoundaryElement();
+ if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {
+ var opening = element;
+ if (opening.selfClosing) {
+ var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));
+ el.children.push(child);
+ }
+ else {
+ stack.push(el);
+ el = { node: node, opening: opening, closing: null, children: [] };
}
}
- else {
- this.throwUnexpectedToken(this.nextToken());
- }
- if (!this.matchContextualKeyword('from')) {
- var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
- this.throwError(message, this.lookahead.value);
- }
- this.nextToken();
- src = this.parseModuleSpecifier();
- }
- this.consumeSemicolon();
- return this.finalize(node, new Node.ImportDeclaration(specifiers, src));
- };
- // ECMA-262 15.2.3 Exports
- Parser.prototype.parseExportSpecifier = function () {
- var node = this.createNode();
- var local = this.parseIdentifierName();
- var exported = local;
- if (this.matchContextualKeyword('as')) {
- this.nextToken();
- exported = this.parseIdentifierName();
- }
- return this.finalize(node, new Node.ExportSpecifier(local, exported));
- };
- Parser.prototype.parseExportDeclaration = function () {
- if (this.context.inFunctionBody) {
- this.throwError(messages_1.Messages.IllegalExportDeclaration);
- }
- var node = this.createNode();
- this.expectKeyword('export');
- var exportDeclaration;
- if (this.matchKeyword('default')) {
- // export default ...
- this.nextToken();
- if (this.matchKeyword('function')) {
- // export default function foo () {}
- // export default function () {}
- var declaration = this.parseFunctionDeclaration(true);
- exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
- }
- else if (this.matchKeyword('class')) {
- // export default class foo {}
- var declaration = this.parseClassDeclaration(true);
- exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
- }
- else {
- if (this.matchContextualKeyword('from')) {
- this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);
+ if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {
+ el.closing = element;
+ var open_1 = getQualifiedElementName(el.opening.name);
+ var close_1 = getQualifiedElementName(el.closing.name);
+ if (open_1 !== close_1) {
+ this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);
}
- // export default {};
- // export default [];
- // export default (1 + 2);
- var declaration = this.match('{') ? this.parseObjectInitializer() :
- this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();
- this.consumeSemicolon();
- exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));
- }
- }
- else if (this.match('*')) {
- // export * from 'foo';
- this.nextToken();
- if (!this.matchContextualKeyword('from')) {
- var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
- this.throwError(message, this.lookahead.value);
- }
- this.nextToken();
- var src = this.parseModuleSpecifier();
- this.consumeSemicolon();
- exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));
- }
- else if (this.lookahead.type === token_1.Token.Keyword) {
- // export var f = 1;
- var declaration = void 0;
- switch (this.lookahead.value) {
- case 'let':
- case 'const':
- declaration = this.parseLexicalDeclaration({ inFor: false });
+ if (stack.length > 0) {
+ var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));
+ el = stack[stack.length - 1];
+ el.children.push(child);
+ stack.pop();
+ }
+ else {
break;
- case 'var':
- case 'class':
- case 'function':
- declaration = this.parseStatementListItem();
- break;
- default:
- this.throwUnexpectedToken(this.lookahead);
- }
- exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));
- }
- else {
- var specifiers = [];
- var source = null;
- var isExportFromIdentifier = false;
- this.expect('{');
- while (!this.match('}')) {
- isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');
- specifiers.push(this.parseExportSpecifier());
- if (!this.match('}')) {
- this.expect(',');
}
}
- this.expect('}');
- if (this.matchContextualKeyword('from')) {
- // export {default} from 'foo';
- // export {foo} from 'foo';
- this.nextToken();
- source = this.parseModuleSpecifier();
- this.consumeSemicolon();
- }
- else if (isExportFromIdentifier) {
- // export {default}; // missing fromClause
- var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;
- this.throwError(message, this.lookahead.value);
- }
- else {
- // export {foo};
- this.consumeSemicolon();
- }
- exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));
}
- return exportDeclaration;
+ return el;
};
- return Parser;
- }());
- exports.Parser = Parser;
+ JSXParser.prototype.parseJSXElement = function () {
+ var node = this.createJSXNode();
+ var opening = this.parseJSXOpeningElement();
+ var children = [];
+ var closing = null;
+ if (!opening.selfClosing) {
+ var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });
+ children = el.children;
+ closing = el.closing;
+ }
+ return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));
+ };
+ JSXParser.prototype.parseJSXRoot = function () {
+ // Pop the opening '<' added from the lookahead.
+ if (this.config.tokens) {
+ this.tokens.pop();
+ }
+ this.startJSX();
+ var element = this.parseJSXElement();
+ this.finishJSX();
+ return element;
+ };
+ JSXParser.prototype.isStartOfExpression = function () {
+ return _super.prototype.isStartOfExpression.call(this) || this.match('<');
+ };
+ return JSXParser;
+ }(parser_1.Parser));
+ exports.JSXParser = JSXParser;
/***/ },
/* 4 */
-/***/ function(module, exports) {
-
- // Ensure the condition is true, otherwise throw an error.
- // This is only to have a better contract semantic, i.e. another safety net
- // to catch a logic error. The condition shall be fulfilled in normal case.
- // Do NOT use this to enforce a certain condition on any user input.
- "use strict";
- function assert(condition, message) {
- /* istanbul ignore if */
- if (!condition) {
- throw new Error('ASSERT: ' + message);
- }
- }
- exports.assert = assert;
-
-
-/***/ },
-/* 5 */
-/***/ function(module, exports) {
-
- "use strict";
- // Error messages should be identical to V8.
- exports.Messages = {
- UnexpectedToken: 'Unexpected token %0',
- UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',
- UnexpectedNumber: 'Unexpected number',
- UnexpectedString: 'Unexpected string',
- UnexpectedIdentifier: 'Unexpected identifier',
- UnexpectedReserved: 'Unexpected reserved word',
- UnexpectedTemplate: 'Unexpected quasi %0',
- UnexpectedEOS: 'Unexpected end of input',
- NewlineAfterThrow: 'Illegal newline after throw',
- InvalidRegExp: 'Invalid regular expression',
- UnterminatedRegExp: 'Invalid regular expression: missing /',
- InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
- InvalidLHSInForIn: 'Invalid left-hand side in for-in',
- InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',
- MultipleDefaultsInSwitch: 'More than one default clause in switch statement',
- NoCatchOrFinally: 'Missing catch or finally after try',
- UnknownLabel: 'Undefined label \'%0\'',
- Redeclaration: '%0 \'%1\' has already been declared',
- IllegalContinue: 'Illegal continue statement',
- IllegalBreak: 'Illegal break statement',
- IllegalReturn: 'Illegal return statement',
- StrictModeWith: 'Strict mode code may not include a with statement',
- StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
- StrictVarName: 'Variable name may not be eval or arguments in strict mode',
- StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
- StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
- StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
- StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
- StrictDelete: 'Delete of an unqualified identifier in strict mode.',
- StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
- StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
- StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
- StrictReservedWord: 'Use of future reserved word in strict mode',
- TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',
- ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',
- DefaultRestParameter: 'Unexpected token =',
- DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',
- ConstructorSpecialMethod: 'Class constructor may not be an accessor',
- DuplicateConstructor: 'A class may only have one constructor',
- StaticPrototype: 'Classes may not have static property named prototype',
- MissingFromClause: 'Unexpected token',
- NoAsAfterImportNamespace: 'Unexpected token',
- InvalidModuleSpecifier: 'Unexpected token',
- IllegalImportDeclaration: 'Unexpected token',
- IllegalExportDeclaration: 'Unexpected token',
- DuplicateBinding: 'Duplicate binding %0',
- ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer'
- };
-
-
-/***/ },
-/* 6 */
-/***/ function(module, exports) {
-
- "use strict";
- var ErrorHandler = (function () {
- function ErrorHandler() {
- this.errors = [];
- this.tolerant = false;
- }
- ;
- ErrorHandler.prototype.recordError = function (error) {
- this.errors.push(error);
- };
- ;
- ErrorHandler.prototype.tolerate = function (error) {
- if (this.tolerant) {
- this.recordError(error);
- }
- else {
- throw error;
- }
- };
- ;
- ErrorHandler.prototype.constructError = function (msg, column) {
- var error = new Error(msg);
- try {
- throw error;
- }
- catch (base) {
- /* istanbul ignore else */
- if (Object.create && Object.defineProperty) {
- error = Object.create(base);
- Object.defineProperty(error, 'column', { value: column });
- }
- }
- finally {
- return error;
- }
- };
- ;
- ErrorHandler.prototype.createError = function (index, line, col, description) {
- var msg = 'Line ' + line + ': ' + description;
- var error = this.constructError(msg, col);
- error.index = index;
- error.lineNumber = line;
- error.description = description;
- return error;
- };
- ;
- ErrorHandler.prototype.throwError = function (index, line, col, description) {
- throw this.createError(index, line, col, description);
- };
- ;
- ErrorHandler.prototype.tolerateError = function (index, line, col, description) {
- var error = this.createError(index, line, col, description);
- if (this.tolerant) {
- this.recordError(error);
- }
- else {
- throw error;
- }
- };
- ;
- return ErrorHandler;
- }());
- exports.ErrorHandler = ErrorHandler;
-
-
-/***/ },
-/* 7 */
-/***/ function(module, exports) {
-
- "use strict";
- (function (Token) {
- Token[Token["BooleanLiteral"] = 1] = "BooleanLiteral";
- Token[Token["EOF"] = 2] = "EOF";
- Token[Token["Identifier"] = 3] = "Identifier";
- Token[Token["Keyword"] = 4] = "Keyword";
- Token[Token["NullLiteral"] = 5] = "NullLiteral";
- Token[Token["NumericLiteral"] = 6] = "NumericLiteral";
- Token[Token["Punctuator"] = 7] = "Punctuator";
- Token[Token["StringLiteral"] = 8] = "StringLiteral";
- Token[Token["RegularExpression"] = 9] = "RegularExpression";
- Token[Token["Template"] = 10] = "Template";
- })(exports.Token || (exports.Token = {}));
- var Token = exports.Token;
- ;
- exports.TokenName = {};
- exports.TokenName[Token.BooleanLiteral] = 'Boolean';
- exports.TokenName[Token.EOF] = '';
- exports.TokenName[Token.Identifier] = 'Identifier';
- exports.TokenName[Token.Keyword] = 'Keyword';
- exports.TokenName[Token.NullLiteral] = 'Null';
- exports.TokenName[Token.NumericLiteral] = 'Numeric';
- exports.TokenName[Token.Punctuator] = 'Punctuator';
- exports.TokenName[Token.StringLiteral] = 'String';
- exports.TokenName[Token.RegularExpression] = 'RegularExpression';
- exports.TokenName[Token.Template] = 'Template';
-
-
-/***/ },
-/* 8 */
-/***/ function(module, exports, __webpack_require__) {
-
- "use strict";
- var assert_1 = __webpack_require__(4);
- var messages_1 = __webpack_require__(5);
- var character_1 = __webpack_require__(9);
- var token_1 = __webpack_require__(7);
- function hexValue(ch) {
- return '0123456789abcdef'.indexOf(ch.toLowerCase());
- }
- function octalValue(ch) {
- return '01234567'.indexOf(ch);
- }
- var Scanner = (function () {
- function Scanner(code, handler) {
- this.source = code;
- this.errorHandler = handler;
- this.trackComment = false;
- this.length = code.length;
- this.index = 0;
- this.lineNumber = (code.length > 0) ? 1 : 0;
- this.lineStart = 0;
- this.curlyStack = [];
- }
- ;
- Scanner.prototype.eof = function () {
- return this.index >= this.length;
- };
- ;
- Scanner.prototype.throwUnexpectedToken = function (message) {
- if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }
- this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);
- };
- ;
- Scanner.prototype.tolerateUnexpectedToken = function () {
- this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, messages_1.Messages.UnexpectedTokenIllegal);
- };
- ;
- // ECMA-262 11.4 Comments
- Scanner.prototype.skipSingleLineComment = function (offset) {
- var comments;
- var start, loc;
- if (this.trackComment) {
- comments = [];
- start = this.index - offset;
- loc = {
- start: {
- line: this.lineNumber,
- column: this.index - this.lineStart - offset
- },
- end: {}
- };
- }
- while (!this.eof()) {
- var ch = this.source.charCodeAt(this.index);
- ++this.index;
- if (character_1.Character.isLineTerminator(ch)) {
- if (this.trackComment) {
- loc.end = {
- line: this.lineNumber,
- column: this.index - this.lineStart - 1
- };
- var entry = {
- multiLine: false,
- slice: [start + offset, this.index - 1],
- range: [start, this.index - 1],
- loc: loc
- };
- comments.push(entry);
- }
- if (ch === 13 && this.source.charCodeAt(this.index) === 10) {
- ++this.index;
- }
- ++this.lineNumber;
- this.lineStart = this.index;
- return comments;
- }
- }
- if (this.trackComment) {
- loc.end = {
- line: this.lineNumber,
- column: this.index - this.lineStart
- };
- var entry = {
- multiLine: false,
- slice: [start + offset, this.index],
- range: [start, this.index],
- loc: loc
- };
- comments.push(entry);
- }
- return comments;
- };
- ;
- Scanner.prototype.skipMultiLineComment = function () {
- var comments;
- var start, loc;
- if (this.trackComment) {
- comments = [];
- start = this.index - 2;
- loc = {
- start: {
- line: this.lineNumber,
- column: this.index - this.lineStart - 2
- },
- end: {}
- };
- }
- while (!this.eof()) {
- var ch = this.source.charCodeAt(this.index);
- if (character_1.Character.isLineTerminator(ch)) {
- if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {
- ++this.index;
- }
- ++this.lineNumber;
- ++this.index;
- this.lineStart = this.index;
- }
- else if (ch === 0x2A) {
- // Block comment ends with '*/'.
- if (this.source.charCodeAt(this.index + 1) === 0x2F) {
- this.index += 2;
- if (this.trackComment) {
- loc.end = {
- line: this.lineNumber,
- column: this.index - this.lineStart
- };
- var entry = {
- multiLine: true,
- slice: [start + 2, this.index - 2],
- range: [start, this.index],
- loc: loc
- };
- comments.push(entry);
- }
- return comments;
- }
- ++this.index;
- }
- else {
- ++this.index;
- }
- }
- // Ran off the end of the file - the whole thing is a comment
- if (this.trackComment) {
- loc.end = {
- line: this.lineNumber,
- column: this.index - this.lineStart
- };
- var entry = {
- multiLine: true,
- slice: [start + 2, this.index],
- range: [start, this.index],
- loc: loc
- };
- comments.push(entry);
- }
- this.tolerateUnexpectedToken();
- return comments;
- };
- ;
- Scanner.prototype.scanComments = function () {
- var comments;
- if (this.trackComment) {
- comments = [];
- }
- var start = (this.index === 0);
- while (!this.eof()) {
- var ch = this.source.charCodeAt(this.index);
- if (character_1.Character.isWhiteSpace(ch)) {
- ++this.index;
- }
- else if (character_1.Character.isLineTerminator(ch)) {
- ++this.index;
- if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {
- ++this.index;
- }
- ++this.lineNumber;
- this.lineStart = this.index;
- start = true;
- }
- else if (ch === 0x2F) {
- ch = this.source.charCodeAt(this.index + 1);
- if (ch === 0x2F) {
- this.index += 2;
- var comment = this.skipSingleLineComment(2);
- if (this.trackComment) {
- comments = comments.concat(comment);
- }
- start = true;
- }
- else if (ch === 0x2A) {
- this.index += 2;
- var comment = this.skipMultiLineComment();
- if (this.trackComment) {
- comments = comments.concat(comment);
- }
- }
- else {
- break;
- }
- }
- else if (start && ch === 0x2D) {
- // U+003E is '>'
- if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {
- // '-->' is a single-line comment
- this.index += 3;
- var comment = this.skipSingleLineComment(3);
- if (this.trackComment) {
- comments = comments.concat(comment);
- }
- }
- else {
- break;
- }
- }
- else if (ch === 0x3C) {
- if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
- this.index += 4; // `' is a single-line comment
+ this.index += 3;
+ var comment = this.skipSingleLineComment(3);
+ if (this.trackComment) {
+ comments = comments.concat(comment);
+ }
+ }
+ else {
+ break;
+ }
+ }
+ else if (ch === 0x3C && !this.isModule) {
+ if (this.source.slice(this.index + 1, this.index + 4) === '!--') {
+ this.index += 4; // ``.
-
-### Preserving SVG tags
-
-SVG tags are automatically recognized, and when they are minified, both case-sensitivity and closing-slashes are preserved, regardless of the minification settings used for the rest of the file.
-
-### Working with invalid markup
-
-HTMLMinifier **can't work with invalid or partial chunks of markup**. This is because it parses markup into a tree structure, then modifies it (removing anything that was specified for removal, ignoring anything that was specified to be ignored, etc.), then it creates a markup out of that tree and returns it.
-
-Input markup (e.g. `foo`)
-
-↓
-
-Internal representation of markup in a form of tree (e.g. `{ tag: "p", attr: "id", children: ["foo"] }`)
-
-↓
-
-Transformation of internal representation (e.g. removal of `id` attribute)
-
-↓
-
-Output of resulting markup (e.g. `
foo
`)
-
-HTMLMinifier can't know that original markup was only half of the tree; it does its best to try to parse it as a full tree and it loses information about tree being malformed or partial in the beginning. As a result, it can't create a partial/malformed tree at the time of the output.
-
-## Installation Instructions
-
-From NPM for use as a command line app:
-
-```shell
-npm install html-minifier -g
-```
-
-From NPM for programmatic use:
-
-```shell
-npm install html-minifier
-```
-
-From Git:
-
-```shell
-git clone git://github.com/kangax/html-minifier.git
-cd html-minifier
-npm link .
-```
-
-## Usage
-
-Note that almost all options are disabled by default. For command line usage please see `html-minifier --help` for a list of available options. Experiment and find what works best for you and your project.
-
-* **Sample command line:** ``html-minifier --collapse-whitespace --remove-comments --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-tag-whitespace --use-short-doctype --minify-css true --minify-js true``
-
-### Node.js
-
-```js
-var minify = require('html-minifier').minify;
-var result = minify('foo
', {
- removeAttributeQuotes: true
-});
-result; // 'foo
'
-```
-
-## Running benchmarks
-
-Benchmarks for minified HTML:
-
-```shell
-node benchmark.js
-```
diff --git a/node_modules/html-minifier/cli.js b/node_modules/html-minifier/cli.js
deleted file mode 100755
index 2d0a9b3..0000000
--- a/node_modules/html-minifier/cli.js
+++ /dev/null
@@ -1,311 +0,0 @@
-#!/usr/bin/env node
-/**
- * html-minifier CLI tool
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2014-2016 Zoltan Frombach
- *
- * 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.
- *
- */
-
-'use strict';
-
-var camelCase = require('camel-case');
-var fs = require('fs');
-var info = require('./package.json');
-var minify = require('./' + info.main).minify;
-var paramCase = require('param-case');
-var path = require('path');
-var program = require('commander');
-
-program._name = info.name;
-program.version(info.version);
-
-function fatal(message) {
- console.error(message);
- process.exit(1);
-}
-
-/**
- * JSON does not support regexes, so, e.g., JSON.parse() will not create
- * a RegExp from the JSON value `[ "/matchString/" ]`, which is
- * technically just an array containing a string that begins and end with
- * a forward slash. To get a RegExp from a JSON string, it must be
- * constructed explicitly in JavaScript.
- *
- * The likelihood of actually wanting to match text that is enclosed in
- * forward slashes is probably quite rare, so if forward slashes were
- * included in an argument that requires a regex, the user most likely
- * thought they were part of the syntax for specifying a regex.
- *
- * In the unlikely case that forward slashes are indeed desired in the
- * search string, the user would need to enclose the expression in a
- * second set of slashes:
- *
- * --customAttrSrround "[\"//matchString//\"]"
- */
-function parseRegExp(value) {
- if (value) {
- return new RegExp(value.replace(/^\/(.*)\/$/, '$1'));
- }
-}
-
-function parseJSON(value) {
- if (value) {
- try {
- return JSON.parse(value);
- }
- catch (e) {
- if (/^{/.test(value)) {
- fatal('Could not parse JSON value \'' + value + '\'');
- }
- return value;
- }
- }
-}
-
-function parseJSONArray(value) {
- if (value) {
- value = parseJSON(value);
- return Array.isArray(value) ? value : [value];
- }
-}
-
-function parseJSONRegExpArray(value) {
- value = parseJSONArray(value);
- return value && value.map(parseRegExp);
-}
-
-function parseString(value) {
- return value;
-}
-
-var mainOptions = {
- caseSensitive: 'Treat attributes in case sensitive manner (useful for SVG; e.g. viewBox)',
- collapseBooleanAttributes: 'Omit attribute values from boolean attributes',
- collapseInlineTagWhitespace: 'Collapse white space around inline tag',
- collapseWhitespace: 'Collapse white space that contributes to text nodes in a document tree.',
- conservativeCollapse: 'Always collapse to 1 space (never remove it entirely)',
- continueOnParseError: 'Handle parse errors instead of aborting',
- customAttrAssign: ['Arrays of regex\'es that allow to support custom attribute assign expressions (e.g. \'
\')', parseJSONRegExpArray],
- customAttrCollapse: ['Regex that specifies custom attribute to strip newlines from (e.g. /ng-class/)', parseRegExp],
- customAttrSurround: ['Arrays of regex\'es that allow to support custom attribute surround expressions (e.g. )', parseJSONRegExpArray],
- customEventAttributes: ['Arrays of regex\'es that allow to support custom event attributes for minifyJS (e.g. ng-click)', parseJSONRegExpArray],
- decodeEntities: 'Use direct Unicode characters whenever possible',
- html5: 'Parse input according to HTML5 specifications',
- ignoreCustomComments: ['Array of regex\'es that allow to ignore certain comments, when matched', parseJSONRegExpArray],
- ignoreCustomFragments: ['Array of regex\'es that allow to ignore certain fragments, when matched (e.g. , {{ ... }})', parseJSONRegExpArray],
- includeAutoGeneratedTags: 'Insert tags generated by HTML parser',
- keepClosingSlash: 'Keep the trailing slash on singleton elements',
- maxLineLength: ['Max line length', parseInt],
- minifyCSS: ['Minify CSS in style elements and style attributes (uses clean-css)', parseJSON],
- minifyJS: ['Minify Javascript in script elements and on* attributes (uses uglify-js)', parseJSON],
- minifyURLs: ['Minify URLs in various attributes (uses relateurl)', parseJSON],
- preserveLineBreaks: 'Always collapse to 1 line break (never remove it entirely) when whitespace between tags include a line break.',
- preventAttributesEscaping: 'Prevents the escaping of the values of attributes.',
- processConditionalComments: 'Process contents of conditional comments through minifier',
- processScripts: ['Array of strings corresponding to types of script elements to process through minifier (e.g. "text/ng-template", "text/x-handlebars-template", etc.)', parseJSONArray],
- quoteCharacter: ['Type of quote to use for attribute values (\' or ")', parseString],
- removeAttributeQuotes: 'Remove quotes around attributes when possible.',
- removeComments: 'Strip HTML comments',
- removeEmptyAttributes: 'Remove all attributes with whitespace-only values',
- removeEmptyElements: 'Remove all elements with empty contents',
- removeOptionalTags: 'Remove unrequired tags',
- removeRedundantAttributes: 'Remove attributes when value matches default.',
- removeScriptTypeAttributes: 'Remove type="text/javascript" from script tags. Other type attribute values are left intact.',
- removeStyleLinkTypeAttributes: 'Remove type="text/css" from style and link tags. Other type attribute values are left intact.',
- removeTagWhitespace: 'Remove space between attributes whenever possible',
- sortAttributes: 'Sort attributes by frequency',
- sortClassName: 'Sort style classes by frequency',
- trimCustomFragments: 'Trim white space around ignoreCustomFragments.',
- useShortDoctype: 'Replaces the doctype with the short (HTML5) doctype'
-};
-var mainOptionKeys = Object.keys(mainOptions);
-mainOptionKeys.forEach(function(key) {
- var option = mainOptions[key];
- if (Array.isArray(option)) {
- key = key === 'minifyURLs' ? '--minify-urls' : '--' + paramCase(key);
- key += option[1] === parseJSON ? ' [value]' : ' ';
- program.option(key, option[0], option[1]);
- }
- else if (~['html5', 'includeAutoGeneratedTags'].indexOf(key)) {
- program.option('--no-' + paramCase(key), option);
- }
- else {
- program.option('--' + paramCase(key), option);
- }
-});
-program.option('-o --output ', 'Specify output file (if not specified STDOUT will be used for output)');
-
-function readFile(file) {
- try {
- return fs.readFileSync(file, { encoding: 'utf8' });
- }
- catch (e) {
- fatal('Cannot read ' + file + '\n' + e.message);
- }
-}
-
-var config = {};
-program.option('-c --config-file ', 'Use config file', function(configPath) {
- var data = readFile(configPath);
- try {
- config = JSON.parse(data);
- }
- catch (je) {
- try {
- config = require(path.resolve(configPath));
- }
- catch (ne) {
- fatal('Cannot read the specified config file.\nAs JSON: ' + je.message + '\nAs module: ' + ne.message);
- }
- }
- mainOptionKeys.forEach(function(key) {
- if (key in config) {
- var option = mainOptions[key];
- if (Array.isArray(option)) {
- var value = config[key];
- config[key] = option[1](typeof value === 'string' ? value : JSON.stringify(value));
- }
- }
- });
-});
-program.option('--input-dir ', 'Specify an input directory');
-program.option('--output-dir ', 'Specify an output directory');
-program.option('--file-ext ', 'Specify an extension to be read, ex: html');
-var content;
-program.arguments('[files...]').action(function(files) {
- content = files.map(readFile).join('');
-}).parse(process.argv);
-
-function createOptions() {
- var options = {};
- mainOptionKeys.forEach(function(key) {
- var param = program[key === 'minifyURLs' ? 'minifyUrls' : camelCase(key)];
- if (typeof param !== 'undefined') {
- options[key] = param;
- }
- else if (key in config) {
- options[key] = config[key];
- }
- });
- return options;
-}
-
-function mkdir(outputDir, callback) {
- fs.mkdir(outputDir, function(err) {
- if (err) {
- switch (err.code) {
- case 'ENOENT':
- return mkdir(path.join(outputDir, '..'), function() {
- mkdir(outputDir, callback);
- });
- case 'EEXIST':
- break;
- default:
- fatal('Cannot create directory ' + outputDir + '\n' + err.message);
- }
- }
- callback();
- });
-}
-
-function processFile(inputFile, outputFile) {
- fs.readFile(inputFile, { encoding: 'utf8' }, function(err, data) {
- if (err) {
- fatal('Cannot read ' + inputFile + '\n' + err.message);
- }
- var minified;
- try {
- minified = minify(data, createOptions());
- }
- catch (e) {
- fatal('Minification error on ' + inputFile + '\n' + e.message);
- }
- fs.writeFile(outputFile, minified, { encoding: 'utf8' }, function(err) {
- if (err) {
- fatal('Cannot write ' + outputFile + '\n' + err.message);
- }
- });
- });
-}
-
-function processDirectory(inputDir, outputDir, fileExt) {
- fs.readdir(inputDir, function(err, files) {
- if (err) {
- fatal('Cannot read directory ' + inputDir + '\n' + err.message);
- }
- files.forEach(function(file) {
- var inputFile = path.join(inputDir, file);
- var outputFile = path.join(outputDir, file);
- fs.stat(inputFile, function(err, stat) {
- if (err) {
- fatal('Cannot read ' + inputFile + '\n' + err.message);
- }
- else if (stat.isDirectory()) {
- processDirectory(inputFile, outputFile, fileExt);
- }
- else if (!fileExt || path.extname(file) === '.' + fileExt) {
- mkdir(outputDir, function() {
- processFile(inputFile, outputFile);
- });
- }
- });
- });
- });
-}
-
-function writeMinify() {
- var minified;
- try {
- minified = minify(content, createOptions());
- }
- catch (e) {
- fatal('Minification error:\n' + e.message);
- }
- (program.output ? fs.createWriteStream(program.output).on('error', function(e) {
- fatal('Cannot write ' + program.output + '\n' + e.message);
- }) : process.stdout).write(minified);
-}
-
-var inputDir = program.inputDir;
-var outputDir = program.outputDir;
-var fileExt = program.fileExt;
-if (inputDir || outputDir) {
- if (!inputDir) {
- fatal('The option output-dir needs to be used with the option input-dir. If you are working with a single file, use -o.');
- }
- else if (!outputDir) {
- fatal('You need to specify where to write the output files with the option --output-dir');
- }
- processDirectory(inputDir, outputDir, fileExt);
-}
-// Minifying one or more files specified on the CMD line
-else if (content) {
- writeMinify();
-}
-// Minifying input coming from STDIN
-else {
- content = '';
- process.stdin.setEncoding('utf8');
- process.stdin.on('data', function(data) {
- content += data;
- }).on('end', writeMinify);
-}
diff --git a/node_modules/html-minifier/package.json b/node_modules/html-minifier/package.json
deleted file mode 100644
index 2635da8..0000000
--- a/node_modules/html-minifier/package.json
+++ /dev/null
@@ -1,129 +0,0 @@
-{
- "_from": "html-minifier@^4.0.0",
- "_id": "html-minifier@4.0.0",
- "_inBundle": false,
- "_integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==",
- "_location": "/html-minifier",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "html-minifier@^4.0.0",
- "name": "html-minifier",
- "escapedName": "html-minifier",
- "rawSpec": "^4.0.0",
- "saveSpec": null,
- "fetchSpec": "^4.0.0"
- },
- "_requiredBy": [
- "/minify"
- ],
- "_resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz",
- "_shasum": "cca9aad8bce1175e02e17a8c33e46d8988889f56",
- "_spec": "html-minifier@^4.0.0",
- "_where": "/home/s2/Code/minifyfromhtml/node_modules/minify",
- "author": {
- "name": "Juriy \"kangax\" Zaytsev"
- },
- "benchmarkDependencies": {
- "brotli": "^1.3.2",
- "chalk": "^2.4.2",
- "cli-table": "^0.3.1",
- "lzma": "^2.3.2",
- "minimize": "^2.2.0",
- "progress": "^2.0.3"
- },
- "bin": {
- "html-minifier": "cli.js"
- },
- "bugs": {
- "url": "https://github.com/kangax/html-minifier/issues"
- },
- "bundleDependencies": false,
- "contributors": [
- {
- "name": "Gilmore Davidson",
- "url": "https://github.com/gilmoreorless"
- },
- {
- "name": "Hugo Wetterberg",
- "email": "hugo@wetterberg.nu"
- },
- {
- "name": "Zoltan Frombach",
- "email": "tssajo@gmail.com"
- }
- ],
- "dependencies": {
- "camel-case": "^3.0.0",
- "clean-css": "^4.2.1",
- "commander": "^2.19.0",
- "he": "^1.2.0",
- "param-case": "^2.1.1",
- "relateurl": "^0.2.7",
- "uglify-js": "^3.5.1"
- },
- "deprecated": false,
- "description": "Highly configurable, well-tested, JavaScript-based HTML minifier.",
- "devDependencies": {
- "grunt": "^1.0.4",
- "grunt-browserify": "^5.3.0",
- "grunt-contrib-uglify": "^4.0.1",
- "grunt-eslint": "^21.0.0",
- "phantomjs-prebuilt": "^2.1.16",
- "qunit": "^2.9.2"
- },
- "engines": {
- "node": ">=6"
- },
- "files": [
- "src/*.js",
- "cli.js",
- "sample-cli-config-file.conf"
- ],
- "homepage": "https://kangax.github.io/html-minifier/",
- "keywords": [
- "cli",
- "compress",
- "compressor",
- "css",
- "html",
- "htmlmin",
- "javascript",
- "min",
- "minification",
- "minifier",
- "minify",
- "optimize",
- "optimizer",
- "pack",
- "packer",
- "parse",
- "parser",
- "uglifier",
- "uglify"
- ],
- "license": "MIT",
- "main": "src/htmlminifier.js",
- "maintainers": [
- {
- "name": "Alex Lam",
- "email": "alexlamsl@gmail.com"
- },
- {
- "name": "Juriy Zaytsev",
- "email": "kangax@gmail.com",
- "url": "http://perfectionkills.com/"
- }
- ],
- "name": "html-minifier",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/kangax/html-minifier.git"
- },
- "scripts": {
- "dist": "grunt dist",
- "test": "grunt test"
- },
- "version": "4.0.0"
-}
diff --git a/node_modules/html-minifier/sample-cli-config-file.conf b/node_modules/html-minifier/sample-cli-config-file.conf
deleted file mode 100644
index 8b8748c..0000000
--- a/node_modules/html-minifier/sample-cli-config-file.conf
+++ /dev/null
@@ -1,40 +0,0 @@
-{
- "caseSensitive": false,
- "collapseBooleanAttributes": true,
- "collapseInlineTagWhitespace": false,
- "collapseWhitespace": true,
- "conservativeCollapse": false,
- "continueOnParseError": true,
- "customAttrCollapse": ".*",
- "decodeEntities": true,
- "html5": true,
- "ignoreCustomFragments": [
- "<#[\\s\\S]*?#>",
- "<%[\\s\\S]*?%>",
- "<\\?[\\s\\S]*?\\?>"
- ],
- "includeAutoGeneratedTags": false,
- "keepClosingSlash": false,
- "maxLineLength": 0,
- "minifyCSS": true,
- "minifyJS": true,
- "preserveLineBreaks": false,
- "preventAttributesEscaping": false,
- "processConditionalComments": true,
- "processScripts": [
- "text/html"
- ],
- "removeAttributeQuotes": true,
- "removeComments": true,
- "removeEmptyAttributes": true,
- "removeEmptyElements": true,
- "removeOptionalTags": true,
- "removeRedundantAttributes": true,
- "removeScriptTypeAttributes": true,
- "removeStyleLinkTypeAttributes": true,
- "removeTagWhitespace": true,
- "sortAttributes": true,
- "sortClassName": true,
- "trimCustomFragments": true,
- "useShortDoctype": true
-}
diff --git a/node_modules/html-minifier/src/htmlminifier.js b/node_modules/html-minifier/src/htmlminifier.js
deleted file mode 100644
index d7efa99..0000000
--- a/node_modules/html-minifier/src/htmlminifier.js
+++ /dev/null
@@ -1,1344 +0,0 @@
-'use strict';
-
-var CleanCSS = require('clean-css');
-var decode = require('he').decode;
-var HTMLParser = require('./htmlparser').HTMLParser;
-var RelateUrl = require('relateurl');
-var TokenChain = require('./tokenchain');
-var UglifyJS = require('uglify-js');
-var utils = require('./utils');
-
-function trimWhitespace(str) {
- return str && str.replace(/^[ \n\r\t\f]+/, '').replace(/[ \n\r\t\f]+$/, '');
-}
-
-function collapseWhitespaceAll(str) {
- // Non-breaking space is specifically handled inside the replacer function here:
- return str && str.replace(/[ \n\r\t\f\xA0]+/g, function(spaces) {
- return spaces === '\t' ? '\t' : spaces.replace(/(^|\xA0+)[^\xA0]+/g, '$1 ');
- });
-}
-
-function collapseWhitespace(str, options, trimLeft, trimRight, collapseAll) {
- var lineBreakBefore = '', lineBreakAfter = '';
-
- if (options.preserveLineBreaks) {
- str = str.replace(/^[ \n\r\t\f]*?[\n\r][ \n\r\t\f]*/, function() {
- lineBreakBefore = '\n';
- return '';
- }).replace(/[ \n\r\t\f]*?[\n\r][ \n\r\t\f]*$/, function() {
- lineBreakAfter = '\n';
- return '';
- });
- }
-
- if (trimLeft) {
- // Non-breaking space is specifically handled inside the replacer function here:
- str = str.replace(/^[ \n\r\t\f\xA0]+/, function(spaces) {
- var conservative = !lineBreakBefore && options.conservativeCollapse;
- if (conservative && spaces === '\t') {
- return '\t';
- }
- return spaces.replace(/^[^\xA0]+/, '').replace(/(\xA0+)[^\xA0]+/g, '$1 ') || (conservative ? ' ' : '');
- });
- }
-
- if (trimRight) {
- // Non-breaking space is specifically handled inside the replacer function here:
- str = str.replace(/[ \n\r\t\f\xA0]+$/, function(spaces) {
- var conservative = !lineBreakAfter && options.conservativeCollapse;
- if (conservative && spaces === '\t') {
- return '\t';
- }
- return spaces.replace(/[^\xA0]+(\xA0+)/g, ' $1').replace(/[^\xA0]+$/, '') || (conservative ? ' ' : '');
- });
- }
-
- if (collapseAll) {
- // strip non space whitespace then compress spaces to one
- str = collapseWhitespaceAll(str);
- }
-
- return lineBreakBefore + str + lineBreakAfter;
-}
-
-var createMapFromString = utils.createMapFromString;
-// non-empty tags that will maintain whitespace around them
-var inlineTags = createMapFromString('a,abbr,acronym,b,bdi,bdo,big,button,cite,code,del,dfn,em,font,i,ins,kbd,label,mark,math,nobr,object,q,rp,rt,rtc,ruby,s,samp,select,small,span,strike,strong,sub,sup,svg,textarea,time,tt,u,var');
-// non-empty tags that will maintain whitespace within them
-var inlineTextTags = createMapFromString('a,abbr,acronym,b,big,del,em,font,i,ins,kbd,mark,nobr,rp,s,samp,small,span,strike,strong,sub,sup,time,tt,u,var');
-// self-closing tags that will maintain whitespace around them
-var selfClosingInlineTags = createMapFromString('comment,img,input,wbr');
-
-function collapseWhitespaceSmart(str, prevTag, nextTag, options) {
- var trimLeft = prevTag && !selfClosingInlineTags(prevTag);
- if (trimLeft && !options.collapseInlineTagWhitespace) {
- trimLeft = prevTag.charAt(0) === '/' ? !inlineTags(prevTag.slice(1)) : !inlineTextTags(prevTag);
- }
- var trimRight = nextTag && !selfClosingInlineTags(nextTag);
- if (trimRight && !options.collapseInlineTagWhitespace) {
- trimRight = nextTag.charAt(0) === '/' ? !inlineTextTags(nextTag.slice(1)) : !inlineTags(nextTag);
- }
- return collapseWhitespace(str, options, trimLeft, trimRight, prevTag && nextTag);
-}
-
-function isConditionalComment(text) {
- return /^\[if\s[^\]]+]|\[endif]$/.test(text);
-}
-
-function isIgnoredComment(text, options) {
- for (var i = 0, len = options.ignoreCustomComments.length; i < len; i++) {
- if (options.ignoreCustomComments[i].test(text)) {
- return true;
- }
- }
- return false;
-}
-
-function isEventAttribute(attrName, options) {
- var patterns = options.customEventAttributes;
- if (patterns) {
- for (var i = patterns.length; i--;) {
- if (patterns[i].test(attrName)) {
- return true;
- }
- }
- return false;
- }
- return /^on[a-z]{3,}$/.test(attrName);
-}
-
-function canRemoveAttributeQuotes(value) {
- // https://mathiasbynens.be/notes/unquoted-attribute-values
- return /^[^ \t\n\f\r"'`=<>]+$/.test(value);
-}
-
-function attributesInclude(attributes, attribute) {
- for (var i = attributes.length; i--;) {
- if (attributes[i].name.toLowerCase() === attribute) {
- return true;
- }
- }
- return false;
-}
-
-function isAttributeRedundant(tag, attrName, attrValue, attrs) {
- attrValue = attrValue ? trimWhitespace(attrValue.toLowerCase()) : '';
-
- return (
- tag === 'script' &&
- attrName === 'language' &&
- attrValue === 'javascript' ||
-
- tag === 'form' &&
- attrName === 'method' &&
- attrValue === 'get' ||
-
- tag === 'input' &&
- attrName === 'type' &&
- attrValue === 'text' ||
-
- tag === 'script' &&
- attrName === 'charset' &&
- !attributesInclude(attrs, 'src') ||
-
- tag === 'a' &&
- attrName === 'name' &&
- attributesInclude(attrs, 'id') ||
-
- tag === 'area' &&
- attrName === 'shape' &&
- attrValue === 'rect'
- );
-}
-
-// https://mathiasbynens.be/demo/javascript-mime-type
-// https://developer.mozilla.org/en/docs/Web/HTML/Element/script#attr-type
-var executableScriptsMimetypes = utils.createMap([
- 'text/javascript',
- 'text/ecmascript',
- 'text/jscript',
- 'application/javascript',
- 'application/x-javascript',
- 'application/ecmascript'
-]);
-
-function isScriptTypeAttribute(attrValue) {
- attrValue = trimWhitespace(attrValue.split(/;/, 2)[0]).toLowerCase();
- return attrValue === '' || executableScriptsMimetypes(attrValue);
-}
-
-function isExecutableScript(tag, attrs) {
- if (tag !== 'script') {
- return false;
- }
- for (var i = 0, len = attrs.length; i < len; i++) {
- var attrName = attrs[i].name.toLowerCase();
- if (attrName === 'type') {
- return isScriptTypeAttribute(attrs[i].value);
- }
- }
- return true;
-}
-
-function isStyleLinkTypeAttribute(attrValue) {
- attrValue = trimWhitespace(attrValue).toLowerCase();
- return attrValue === '' || attrValue === 'text/css';
-}
-
-function isStyleSheet(tag, attrs) {
- if (tag !== 'style') {
- return false;
- }
- for (var i = 0, len = attrs.length; i < len; i++) {
- var attrName = attrs[i].name.toLowerCase();
- if (attrName === 'type') {
- return isStyleLinkTypeAttribute(attrs[i].value);
- }
- }
- return true;
-}
-
-var isSimpleBoolean = createMapFromString('allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible');
-var isBooleanValue = createMapFromString('true,false');
-
-function isBooleanAttribute(attrName, attrValue) {
- return isSimpleBoolean(attrName) || attrName === 'draggable' && !isBooleanValue(attrValue);
-}
-
-function isUriTypeAttribute(attrName, tag) {
- return (
- /^(?:a|area|link|base)$/.test(tag) && attrName === 'href' ||
- tag === 'img' && /^(?:src|longdesc|usemap)$/.test(attrName) ||
- tag === 'object' && /^(?:classid|codebase|data|usemap)$/.test(attrName) ||
- tag === 'q' && attrName === 'cite' ||
- tag === 'blockquote' && attrName === 'cite' ||
- (tag === 'ins' || tag === 'del') && attrName === 'cite' ||
- tag === 'form' && attrName === 'action' ||
- tag === 'input' && (attrName === 'src' || attrName === 'usemap') ||
- tag === 'head' && attrName === 'profile' ||
- tag === 'script' && (attrName === 'src' || attrName === 'for')
- );
-}
-
-function isNumberTypeAttribute(attrName, tag) {
- return (
- /^(?:a|area|object|button)$/.test(tag) && attrName === 'tabindex' ||
- tag === 'input' && (attrName === 'maxlength' || attrName === 'tabindex') ||
- tag === 'select' && (attrName === 'size' || attrName === 'tabindex') ||
- tag === 'textarea' && /^(?:rows|cols|tabindex)$/.test(attrName) ||
- tag === 'colgroup' && attrName === 'span' ||
- tag === 'col' && attrName === 'span' ||
- (tag === 'th' || tag === 'td') && (attrName === 'rowspan' || attrName === 'colspan')
- );
-}
-
-function isLinkType(tag, attrs, value) {
- if (tag !== 'link') {
- return false;
- }
- for (var i = 0, len = attrs.length; i < len; i++) {
- if (attrs[i].name === 'rel' && attrs[i].value === value) {
- return true;
- }
- }
-}
-
-function isMediaQuery(tag, attrs, attrName) {
- return attrName === 'media' && (isLinkType(tag, attrs, 'stylesheet') || isStyleSheet(tag, attrs));
-}
-
-var srcsetTags = createMapFromString('img,source');
-
-function isSrcset(attrName, tag) {
- return attrName === 'srcset' && srcsetTags(tag);
-}
-
-function cleanAttributeValue(tag, attrName, attrValue, options, attrs) {
- if (isEventAttribute(attrName, options)) {
- attrValue = trimWhitespace(attrValue).replace(/^javascript:\s*/i, '');
- return options.minifyJS(attrValue, true);
- }
- else if (attrName === 'class') {
- attrValue = trimWhitespace(attrValue);
- if (options.sortClassName) {
- attrValue = options.sortClassName(attrValue);
- }
- else {
- attrValue = collapseWhitespaceAll(attrValue);
- }
- return attrValue;
- }
- else if (isUriTypeAttribute(attrName, tag)) {
- attrValue = trimWhitespace(attrValue);
- return isLinkType(tag, attrs, 'canonical') ? attrValue : options.minifyURLs(attrValue);
- }
- else if (isNumberTypeAttribute(attrName, tag)) {
- return trimWhitespace(attrValue);
- }
- else if (attrName === 'style') {
- attrValue = trimWhitespace(attrValue);
- if (attrValue) {
- if (/;$/.test(attrValue) && !/?[0-9a-zA-Z]+;$/.test(attrValue)) {
- attrValue = attrValue.replace(/\s*;$/, ';');
- }
- attrValue = options.minifyCSS(attrValue, 'inline');
- }
- return attrValue;
- }
- else if (isSrcset(attrName, tag)) {
- // https://html.spec.whatwg.org/multipage/embedded-content.html#attr-img-srcset
- attrValue = trimWhitespace(attrValue).split(/\s+,\s*|\s*,\s+/).map(function(candidate) {
- var url = candidate;
- var descriptor = '';
- var match = candidate.match(/\s+([1-9][0-9]*w|[0-9]+(?:\.[0-9]+)?x)$/);
- if (match) {
- url = url.slice(0, -match[0].length);
- var num = +match[1].slice(0, -1);
- var suffix = match[1].slice(-1);
- if (num !== 1 || suffix !== 'x') {
- descriptor = ' ' + num + suffix;
- }
- }
- return options.minifyURLs(url) + descriptor;
- }).join(', ');
- }
- else if (isMetaViewport(tag, attrs) && attrName === 'content') {
- attrValue = attrValue.replace(/\s+/g, '').replace(/[0-9]+\.[0-9]+/g, function(numString) {
- // "0.90000" -> "0.9"
- // "1.0" -> "1"
- // "1.0001" -> "1.0001" (unchanged)
- return (+numString).toString();
- });
- }
- else if (isContentSecurityPolicy(tag, attrs) && attrName.toLowerCase() === 'content') {
- return collapseWhitespaceAll(attrValue);
- }
- else if (options.customAttrCollapse && options.customAttrCollapse.test(attrName)) {
- attrValue = attrValue.replace(/\n+|\r+|\s{2,}/g, '');
- }
- else if (tag === 'script' && attrName === 'type') {
- attrValue = trimWhitespace(attrValue.replace(/\s*;\s*/g, ';'));
- }
- else if (isMediaQuery(tag, attrs, attrName)) {
- attrValue = trimWhitespace(attrValue);
- return options.minifyCSS(attrValue, 'media');
- }
- return attrValue;
-}
-
-function isMetaViewport(tag, attrs) {
- if (tag !== 'meta') {
- return false;
- }
- for (var i = 0, len = attrs.length; i < len; i++) {
- if (attrs[i].name === 'name' && attrs[i].value === 'viewport') {
- return true;
- }
- }
-}
-
-function isContentSecurityPolicy(tag, attrs) {
- if (tag !== 'meta') {
- return false;
- }
- for (var i = 0, len = attrs.length; i < len; i++) {
- if (attrs[i].name.toLowerCase() === 'http-equiv' && attrs[i].value.toLowerCase() === 'content-security-policy') {
- return true;
- }
- }
-}
-
-function ignoreCSS(id) {
- return '/* clean-css ignore:start */' + id + '/* clean-css ignore:end */';
-}
-
-// Wrap CSS declarations for CleanCSS > 3.x
-// See https://github.com/jakubpawlowicz/clean-css/issues/418
-function wrapCSS(text, type) {
- switch (type) {
- case 'inline':
- return '*{' + text + '}';
- case 'media':
- return '@media ' + text + '{a{top:0}}';
- default:
- return text;
- }
-}
-
-function unwrapCSS(text, type) {
- var matches;
- switch (type) {
- case 'inline':
- matches = text.match(/^\*\{([\s\S]*)\}$/);
- break;
- case 'media':
- matches = text.match(/^@media ([\s\S]*?)\s*{[\s\S]*}$/);
- break;
- }
- return matches ? matches[1] : text;
-}
-
-function cleanConditionalComment(comment, options) {
- return options.processConditionalComments ? comment.replace(/^(\[if\s[^\]]+]>)([\s\S]*?)( -1) {
- return minify(text, options);
- }
- }
- return text;
-}
-
-// Tag omission rules from https://html.spec.whatwg.org/multipage/syntax.html#optional-tags
-// with the following deviations:
-// - retain if followed by
-// - , , , & follow https://www.w3.org/TR/html5/syntax.html#optional-tags
-// - retain all tags which are adjacent to non-standard HTML tags
-var optionalStartTags = createMapFromString('html,head,body,colgroup,tbody');
-var optionalEndTags = createMapFromString('html,head,body,li,dt,dd,p,rb,rt,rtc,rp,optgroup,option,colgroup,caption,thead,tbody,tfoot,tr,td,th');
-var headerTags = createMapFromString('meta,link,script,style,template,noscript');
-var descriptionTags = createMapFromString('dt,dd');
-var pBlockTags = createMapFromString('address,article,aside,blockquote,details,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,main,menu,nav,ol,p,pre,section,table,ul');
-var pInlineTags = createMapFromString('a,audio,del,ins,map,noscript,video');
-var rubyTags = createMapFromString('rb,rt,rtc,rp');
-var rtcTag = createMapFromString('rb,rtc,rp');
-var optionTag = createMapFromString('option,optgroup');
-var tableContentTags = createMapFromString('tbody,tfoot');
-var tableSectionTags = createMapFromString('thead,tbody,tfoot');
-var cellTags = createMapFromString('td,th');
-var topLevelTags = createMapFromString('html,head,body');
-var compactTags = createMapFromString('html,body');
-var looseTags = createMapFromString('head,colgroup,caption');
-var trailingTags = createMapFromString('dt,thead');
-var htmlTags = createMapFromString('a,abbr,acronym,address,applet,area,article,aside,audio,b,base,basefont,bdi,bdo,bgsound,big,blink,blockquote,body,br,button,canvas,caption,center,cite,code,col,colgroup,command,content,data,datalist,dd,del,details,dfn,dialog,dir,div,dl,dt,element,em,embed,fieldset,figcaption,figure,font,footer,form,frame,frameset,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,i,iframe,image,img,input,ins,isindex,kbd,keygen,label,legend,li,link,listing,main,map,mark,marquee,menu,menuitem,meta,meter,multicol,nav,nobr,noembed,noframes,noscript,object,ol,optgroup,option,output,p,param,picture,plaintext,pre,progress,q,rb,rp,rt,rtc,ruby,s,samp,script,section,select,shadow,small,source,spacer,span,strike,strong,style,sub,summary,sup,table,tbody,td,template,textarea,tfoot,th,thead,time,title,tr,track,tt,u,ul,var,video,wbr,xmp');
-
-function canRemoveParentTag(optionalStartTag, tag) {
- switch (optionalStartTag) {
- case 'html':
- case 'head':
- return true;
- case 'body':
- return !headerTags(tag);
- case 'colgroup':
- return tag === 'col';
- case 'tbody':
- return tag === 'tr';
- }
- return false;
-}
-
-function isStartTagMandatory(optionalEndTag, tag) {
- switch (tag) {
- case 'colgroup':
- return optionalEndTag === 'colgroup';
- case 'tbody':
- return tableSectionTags(optionalEndTag);
- }
- return false;
-}
-
-function canRemovePrecedingTag(optionalEndTag, tag) {
- switch (optionalEndTag) {
- case 'html':
- case 'head':
- case 'body':
- case 'colgroup':
- case 'caption':
- return true;
- case 'li':
- case 'optgroup':
- case 'tr':
- return tag === optionalEndTag;
- case 'dt':
- case 'dd':
- return descriptionTags(tag);
- case 'p':
- return pBlockTags(tag);
- case 'rb':
- case 'rt':
- case 'rp':
- return rubyTags(tag);
- case 'rtc':
- return rtcTag(tag);
- case 'option':
- return optionTag(tag);
- case 'thead':
- case 'tbody':
- return tableContentTags(tag);
- case 'tfoot':
- return tag === 'tbody';
- case 'td':
- case 'th':
- return cellTags(tag);
- }
- return false;
-}
-
-var reEmptyAttribute = new RegExp(
- '^(?:class|id|style|title|lang|dir|on(?:focus|blur|change|click|dblclick|mouse(' +
- '?:down|up|over|move|out)|key(?:press|down|up)))$');
-
-function canDeleteEmptyAttribute(tag, attrName, attrValue, options) {
- var isValueEmpty = !attrValue || /^\s*$/.test(attrValue);
- if (!isValueEmpty) {
- return false;
- }
- if (typeof options.removeEmptyAttributes === 'function') {
- return options.removeEmptyAttributes(attrName, tag);
- }
- return tag === 'input' && attrName === 'value' || reEmptyAttribute.test(attrName);
-}
-
-function hasAttrName(name, attrs) {
- for (var i = attrs.length - 1; i >= 0; i--) {
- if (attrs[i].name === name) {
- return true;
- }
- }
- return false;
-}
-
-function canRemoveElement(tag, attrs) {
- switch (tag) {
- case 'textarea':
- return false;
- case 'audio':
- case 'script':
- case 'video':
- if (hasAttrName('src', attrs)) {
- return false;
- }
- break;
- case 'iframe':
- if (hasAttrName('src', attrs) || hasAttrName('srcdoc', attrs)) {
- return false;
- }
- break;
- case 'object':
- if (hasAttrName('data', attrs)) {
- return false;
- }
- break;
- case 'applet':
- if (hasAttrName('code', attrs)) {
- return false;
- }
- break;
- }
- return true;
-}
-
-function canCollapseWhitespace(tag) {
- return !/^(?:script|style|pre|textarea)$/.test(tag);
-}
-
-function canTrimWhitespace(tag) {
- return !/^(?:pre|textarea)$/.test(tag);
-}
-
-function normalizeAttr(attr, attrs, tag, options) {
- var attrName = options.name(attr.name),
- attrValue = attr.value;
-
- if (options.decodeEntities && attrValue) {
- attrValue = decode(attrValue, { isAttributeValue: true });
- }
-
- if (options.removeRedundantAttributes &&
- isAttributeRedundant(tag, attrName, attrValue, attrs) ||
- options.removeScriptTypeAttributes && tag === 'script' &&
- attrName === 'type' && isScriptTypeAttribute(attrValue) ||
- options.removeStyleLinkTypeAttributes && (tag === 'style' || tag === 'link') &&
- attrName === 'type' && isStyleLinkTypeAttribute(attrValue)) {
- return;
- }
-
- if (attrValue) {
- attrValue = cleanAttributeValue(tag, attrName, attrValue, options, attrs);
- }
-
- if (options.removeEmptyAttributes &&
- canDeleteEmptyAttribute(tag, attrName, attrValue, options)) {
- return;
- }
-
- if (options.decodeEntities && attrValue) {
- attrValue = attrValue.replace(/&(#?[0-9a-zA-Z]+;)/g, '&$1');
- }
-
- return {
- attr: attr,
- name: attrName,
- value: attrValue
- };
-}
-
-function buildAttr(normalized, hasUnarySlash, options, isLast, uidAttr) {
- var attrName = normalized.name,
- attrValue = normalized.value,
- attr = normalized.attr,
- attrQuote = attr.quote,
- attrFragment,
- emittedAttrValue;
-
- if (typeof attrValue !== 'undefined' && (!options.removeAttributeQuotes ||
- ~attrValue.indexOf(uidAttr) || !canRemoveAttributeQuotes(attrValue))) {
- if (!options.preventAttributesEscaping) {
- if (typeof options.quoteCharacter === 'undefined') {
- var apos = (attrValue.match(/'/g) || []).length;
- var quot = (attrValue.match(/"/g) || []).length;
- attrQuote = apos < quot ? '\'' : '"';
- }
- else {
- attrQuote = options.quoteCharacter === '\'' ? '\'' : '"';
- }
- if (attrQuote === '"') {
- attrValue = attrValue.replace(/"/g, '"');
- }
- else {
- attrValue = attrValue.replace(/'/g, ''');
- }
- }
- emittedAttrValue = attrQuote + attrValue + attrQuote;
- if (!isLast && !options.removeTagWhitespace) {
- emittedAttrValue += ' ';
- }
- }
- // make sure trailing slash is not interpreted as HTML self-closing tag
- else if (isLast && !hasUnarySlash && !/\/$/.test(attrValue)) {
- emittedAttrValue = attrValue;
- }
- else {
- emittedAttrValue = attrValue + ' ';
- }
-
- if (typeof attrValue === 'undefined' || options.collapseBooleanAttributes &&
- isBooleanAttribute(attrName.toLowerCase(), attrValue.toLowerCase())) {
- attrFragment = attrName;
- if (!isLast) {
- attrFragment += ' ';
- }
- }
- else {
- attrFragment = attrName + attr.customAssign + emittedAttrValue;
- }
-
- return attr.customOpen + attrFragment + attr.customClose;
-}
-
-function identity(value) {
- return value;
-}
-
-function processOptions(values) {
- var options = {
- name: function(name) {
- return name.toLowerCase();
- },
- canCollapseWhitespace: canCollapseWhitespace,
- canTrimWhitespace: canTrimWhitespace,
- html5: true,
- ignoreCustomComments: [/^!/],
- ignoreCustomFragments: [
- /<%[\s\S]*?%>/,
- /<\?[\s\S]*?\?>/
- ],
- includeAutoGeneratedTags: true,
- log: identity,
- minifyCSS: identity,
- minifyJS: identity,
- minifyURLs: identity
- };
- Object.keys(values).forEach(function(key) {
- var value = values[key];
- if (key === 'caseSensitive') {
- if (value) {
- options.name = identity;
- }
- }
- else if (key === 'log') {
- if (typeof value === 'function') {
- options.log = value;
- }
- }
- else if (key === 'minifyCSS' && typeof value !== 'function') {
- if (!value) {
- return;
- }
- if (typeof value !== 'object') {
- value = {};
- }
- options.minifyCSS = function(text, type) {
- text = text.replace(/(url\s*\(\s*)("|'|)(.*?)\2(\s*\))/ig, function(match, prefix, quote, url, suffix) {
- return prefix + quote + options.minifyURLs(url) + quote + suffix;
- });
- var cleanCssOutput = new CleanCSS(value).minify(wrapCSS(text, type));
- if (cleanCssOutput.errors.length > 0) {
- cleanCssOutput.errors.forEach(options.log);
- return text;
- }
- return unwrapCSS(cleanCssOutput.styles, type);
- };
- }
- else if (key === 'minifyJS' && typeof value !== 'function') {
- if (!value) {
- return;
- }
- if (typeof value !== 'object') {
- value = {};
- }
- (value.parse || (value.parse = {})).bare_returns = false;
- options.minifyJS = function(text, inline) {
- var start = text.match(/^\s*\s*$/, '') : text;
- value.parse.bare_returns = inline;
- var result = UglifyJS.minify(code, value);
- if (result.error) {
- options.log(result.error);
- return text;
- }
- return result.code.replace(/;$/, '');
- };
- }
- else if (key === 'minifyURLs' && typeof value !== 'function') {
- if (!value) {
- return;
- }
- if (typeof value === 'string') {
- value = { site: value };
- }
- else if (typeof value !== 'object') {
- value = {};
- }
- options.minifyURLs = function(text) {
- try {
- return RelateUrl.relate(text, value);
- }
- catch (err) {
- options.log(err);
- return text;
- }
- };
- }
- else {
- options[key] = value;
- }
- });
- return options;
-}
-
-function uniqueId(value) {
- var id;
- do {
- id = Math.random().toString(36).replace(/^0\.[0-9]*/, '');
- } while (~value.indexOf(id));
- return id;
-}
-
-var specialContentTags = createMapFromString('script,style');
-
-function createSortFns(value, options, uidIgnore, uidAttr) {
- var attrChains = options.sortAttributes && Object.create(null);
- var classChain = options.sortClassName && new TokenChain();
-
- function attrNames(attrs) {
- return attrs.map(function(attr) {
- return options.name(attr.name);
- });
- }
-
- function shouldSkipUID(token, uid) {
- return !uid || token.indexOf(uid) === -1;
- }
-
- function shouldSkipUIDs(token) {
- return shouldSkipUID(token, uidIgnore) && shouldSkipUID(token, uidAttr);
- }
-
- function scan(input) {
- var currentTag, currentType;
- new HTMLParser(input, {
- start: function(tag, attrs) {
- if (attrChains) {
- if (!attrChains[tag]) {
- attrChains[tag] = new TokenChain();
- }
- attrChains[tag].add(attrNames(attrs).filter(shouldSkipUIDs));
- }
- for (var i = 0, len = attrs.length; i < len; i++) {
- var attr = attrs[i];
- if (classChain && attr.value && options.name(attr.name) === 'class') {
- classChain.add(trimWhitespace(attr.value).split(/[ \t\n\f\r]+/).filter(shouldSkipUIDs));
- }
- else if (options.processScripts && attr.name.toLowerCase() === 'type') {
- currentTag = tag;
- currentType = attr.value;
- }
- }
- },
- end: function() {
- currentTag = '';
- },
- chars: function(text) {
- if (options.processScripts && specialContentTags(currentTag) &&
- options.processScripts.indexOf(currentType) > -1) {
- scan(text);
- }
- }
- });
- }
-
- var log = options.log;
- options.log = identity;
- options.sortAttributes = false;
- options.sortClassName = false;
- scan(minify(value, options));
- options.log = log;
- if (attrChains) {
- var attrSorters = Object.create(null);
- for (var tag in attrChains) {
- attrSorters[tag] = attrChains[tag].createSorter();
- }
- options.sortAttributes = function(tag, attrs) {
- var sorter = attrSorters[tag];
- if (sorter) {
- var attrMap = Object.create(null);
- var names = attrNames(attrs);
- names.forEach(function(name, index) {
- (attrMap[name] || (attrMap[name] = [])).push(attrs[index]);
- });
- sorter.sort(names).forEach(function(name, index) {
- attrs[index] = attrMap[name].shift();
- });
- }
- };
- }
- if (classChain) {
- var sorter = classChain.createSorter();
- options.sortClassName = function(value) {
- return sorter.sort(value.split(/[ \n\f\r]+/)).join(' ');
- };
- }
-}
-
-function minify(value, options, partialMarkup) {
- if (options.collapseWhitespace) {
- value = collapseWhitespace(value, options, true, true);
- }
-
- var buffer = [],
- charsPrevTag,
- currentChars = '',
- hasChars,
- currentTag = '',
- currentAttrs = [],
- stackNoTrimWhitespace = [],
- stackNoCollapseWhitespace = [],
- optionalStartTag = '',
- optionalEndTag = '',
- ignoredMarkupChunks = [],
- ignoredCustomMarkupChunks = [],
- uidIgnore,
- uidAttr,
- uidPattern;
-
- // temporarily replace ignored chunks with comments,
- // so that we don't have to worry what's there.
- // for all we care there might be
- // completely-horribly-broken-alien-non-html-emoj-cthulhu-filled content
- value = value.replace(/([\s\S]*?)/g, function(match, group1) {
- if (!uidIgnore) {
- uidIgnore = uniqueId(value);
- var pattern = new RegExp('^' + uidIgnore + '([0-9]+)$');
- if (options.ignoreCustomComments) {
- options.ignoreCustomComments = options.ignoreCustomComments.slice();
- }
- else {
- options.ignoreCustomComments = [];
- }
- options.ignoreCustomComments.push(pattern);
- }
- var token = '';
- ignoredMarkupChunks.push(group1);
- return token;
- });
-
- var customFragments = options.ignoreCustomFragments.map(function(re) {
- return re.source;
- });
- if (customFragments.length) {
- var reCustomIgnore = new RegExp('\\s*(?:' + customFragments.join('|') + ')+\\s*', 'g');
- // temporarily replace custom ignored fragments with unique attributes
- value = value.replace(reCustomIgnore, function(match) {
- if (!uidAttr) {
- uidAttr = uniqueId(value);
- uidPattern = new RegExp('(\\s*)' + uidAttr + '([0-9]+)' + uidAttr + '(\\s*)', 'g');
- if (options.minifyCSS) {
- options.minifyCSS = (function(fn) {
- return function(text, type) {
- text = text.replace(uidPattern, function(match, prefix, index) {
- var chunks = ignoredCustomMarkupChunks[+index];
- return chunks[1] + uidAttr + index + uidAttr + chunks[2];
- });
- var ids = [];
- new CleanCSS().minify(wrapCSS(text, type)).warnings.forEach(function(warning) {
- var match = uidPattern.exec(warning);
- if (match) {
- var id = uidAttr + match[2] + uidAttr;
- text = text.replace(id, ignoreCSS(id));
- ids.push(id);
- }
- });
- text = fn(text, type);
- ids.forEach(function(id) {
- text = text.replace(ignoreCSS(id), id);
- });
- return text;
- };
- })(options.minifyCSS);
- }
- if (options.minifyJS) {
- options.minifyJS = (function(fn) {
- return function(text, type) {
- return fn(text.replace(uidPattern, function(match, prefix, index) {
- var chunks = ignoredCustomMarkupChunks[+index];
- return chunks[1] + uidAttr + index + uidAttr + chunks[2];
- }), type);
- };
- })(options.minifyJS);
- }
- }
- var token = uidAttr + ignoredCustomMarkupChunks.length + uidAttr;
- ignoredCustomMarkupChunks.push(/^(\s*)[\s\S]*?(\s*)$/.exec(match));
- return '\t' + token + '\t';
- });
- }
-
- if (options.sortAttributes && typeof options.sortAttributes !== 'function' ||
- options.sortClassName && typeof options.sortClassName !== 'function') {
- createSortFns(value, options, uidIgnore, uidAttr);
- }
-
- function _canCollapseWhitespace(tag, attrs) {
- return options.canCollapseWhitespace(tag, attrs, canCollapseWhitespace);
- }
-
- function _canTrimWhitespace(tag, attrs) {
- return options.canTrimWhitespace(tag, attrs, canTrimWhitespace);
- }
-
- function removeStartTag() {
- var index = buffer.length - 1;
- while (index > 0 && !/^<[^/!]/.test(buffer[index])) {
- index--;
- }
- buffer.length = Math.max(0, index);
- }
-
- function removeEndTag() {
- var index = buffer.length - 1;
- while (index > 0 && !/^<\//.test(buffer[index])) {
- index--;
- }
- buffer.length = Math.max(0, index);
- }
-
- // look for trailing whitespaces, bypass any inline tags
- function trimTrailingWhitespace(index, nextTag) {
- for (var endTag = null; index >= 0 && _canTrimWhitespace(endTag); index--) {
- var str = buffer[index];
- var match = str.match(/^<\/([\w:-]+)>$/);
- if (match) {
- endTag = match[1];
- }
- else if (/>$/.test(str) || (buffer[index] = collapseWhitespaceSmart(str, null, nextTag, options))) {
- break;
- }
- }
- }
-
- // look for trailing whitespaces from previously processed text
- // which may not be trimmed due to a following comment or an empty
- // element which has now been removed
- function squashTrailingWhitespace(nextTag) {
- var charsIndex = buffer.length - 1;
- if (buffer.length > 1) {
- var item = buffer[buffer.length - 1];
- if (/^(?: may be omitted if first thing inside is not comment
- // may be omitted if first thing inside is an element
- // may be omitted if first thing inside is not space, comment, , ,
-```
-
-In [Node.js](https://nodejs.org/), [io.js](https://iojs.org/), [Narwhal](http://narwhaljs.org/), and [RingoJS](http://ringojs.org/):
-
-```js
-var punycode = require('punycode');
-```
-
-In [Rhino](http://www.mozilla.org/rhino/):
-
-```js
-load('punycode.js');
-```
-
-Using an AMD loader like [RequireJS](http://requirejs.org/):
-
-```js
-require(
- {
- 'paths': {
- 'punycode': 'path/to/punycode'
- }
- },
- ['punycode'],
- function(punycode) {
- console.log(punycode);
- }
-);
-```
-
-## API
-
-### `punycode.decode(string)`
-
-Converts a Punycode string of ASCII symbols to a string of Unicode symbols.
-
-```js
-// decode domain name parts
-punycode.decode('maana-pta'); // 'mañana'
-punycode.decode('--dqo34k'); // '☃-⌘'
-```
-
-### `punycode.encode(string)`
-
-Converts a string of Unicode symbols to a Punycode string of ASCII symbols.
-
-```js
-// encode domain name parts
-punycode.encode('mañana'); // 'maana-pta'
-punycode.encode('☃-⌘'); // '--dqo34k'
-```
-
-### `punycode.toUnicode(input)`
-
-Converts a Punycode string representing a domain name or an email address to Unicode. Only the Punycoded parts of the input will be converted, i.e. it doesn’t matter if you call it on a string that has already been converted to Unicode.
-
-```js
-// decode domain names
-punycode.toUnicode('xn--maana-pta.com');
-// → 'mañana.com'
-punycode.toUnicode('xn----dqo34k.com');
-// → '☃-⌘.com'
-
-// decode email addresses
-punycode.toUnicode('джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq');
-// → 'джумла@джpумлатест.bрфa'
-```
-
-### `punycode.toASCII(input)`
-
-Converts a lowercased Unicode string representing a domain name or an email address to Punycode. Only the non-ASCII parts of the input will be converted, i.e. it doesn’t matter if you call it with a domain that’s already in ASCII.
-
-```js
-// encode domain names
-punycode.toASCII('mañana.com');
-// → 'xn--maana-pta.com'
-punycode.toASCII('☃-⌘.com');
-// → 'xn----dqo34k.com'
-
-// encode email addresses
-punycode.toASCII('джумла@джpумлатест.bрфa');
-// → 'джумла@xn--p-8sbkgc5ag7bhce.xn--ba-lmcq'
-```
-
-### `punycode.ucs2`
-
-#### `punycode.ucs2.decode(string)`
-
-Creates an array containing the numeric code point values of each Unicode symbol in the string. While [JavaScript uses UCS-2 internally](https://mathiasbynens.be/notes/javascript-encoding), this function will convert a pair of surrogate halves (each of which UCS-2 exposes as separate characters) into a single code point, matching UTF-16.
-
-```js
-punycode.ucs2.decode('abc');
-// → [0x61, 0x62, 0x63]
-// surrogate pair for U+1D306 TETRAGRAM FOR CENTRE:
-punycode.ucs2.decode('\uD834\uDF06');
-// → [0x1D306]
-```
-
-#### `punycode.ucs2.encode(codePoints)`
-
-Creates a string based on an array of numeric code point values.
-
-```js
-punycode.ucs2.encode([0x61, 0x62, 0x63]);
-// → 'abc'
-punycode.ucs2.encode([0x1D306]);
-// → '\uD834\uDF06'
-```
-
-### `punycode.version`
-
-A string representing the current Punycode.js version number.
-
-## Unit tests & code coverage
-
-After cloning this repository, run `npm install --dev` to install the dependencies needed for Punycode.js development and testing. You may want to install Istanbul _globally_ using `npm install istanbul -g`.
-
-Once that’s done, you can run the unit tests in Node using `npm test` or `node tests/tests.js`. To run the tests in Rhino, Ringo, Narwhal, PhantomJS, and web browsers as well, use `grunt test`.
-
-To generate the code coverage report, use `grunt cover`.
-
-Feel free to fork if you see possible improvements!
-
-## Author
-
-| [](https://twitter.com/mathias "Follow @mathias on Twitter") |
-|---|
-| [Mathias Bynens](https://mathiasbynens.be/) |
-
-## Contributors
-
-| [](https://twitter.com/jdalton "Follow @jdalton on Twitter") |
-|---|
-| [John-David Dalton](http://allyoucanleet.com/) |
-
-## License
-
-Punycode.js is available under the [MIT](https://mths.be/mit) license.
diff --git a/node_modules/request/node_modules/punycode/package.json b/node_modules/request/node_modules/punycode/package.json
deleted file mode 100644
index f7121a9..0000000
--- a/node_modules/request/node_modules/punycode/package.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "_from": "punycode@^1.4.1",
- "_id": "punycode@1.4.1",
- "_inBundle": false,
- "_integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "_location": "/request/punycode",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "punycode@^1.4.1",
- "name": "punycode",
- "escapedName": "punycode",
- "rawSpec": "^1.4.1",
- "saveSpec": null,
- "fetchSpec": "^1.4.1"
- },
- "_requiredBy": [
- "/request/tough-cookie"
- ],
- "_resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "_shasum": "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e",
- "_spec": "punycode@^1.4.1",
- "_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\request\\node_modules\\tough-cookie",
- "author": {
- "name": "Mathias Bynens",
- "url": "https://mathiasbynens.be/"
- },
- "bugs": {
- "url": "https://github.com/bestiejs/punycode.js/issues"
- },
- "bundleDependencies": false,
- "contributors": [
- {
- "name": "Mathias Bynens",
- "url": "https://mathiasbynens.be/"
- },
- {
- "name": "John-David Dalton",
- "url": "http://allyoucanleet.com/"
- }
- ],
- "deprecated": false,
- "description": "A robust Punycode converter that fully complies to RFC 3492 and RFC 5891, and works on nearly all JavaScript platforms.",
- "devDependencies": {
- "coveralls": "^2.11.4",
- "grunt": "^0.4.5",
- "grunt-contrib-uglify": "^0.11.0",
- "grunt-shell": "^1.1.2",
- "istanbul": "^0.4.1",
- "qunit-extras": "^1.4.4",
- "qunitjs": "~1.11.0",
- "requirejs": "^2.1.22"
- },
- "files": [
- "LICENSE-MIT.txt",
- "punycode.js"
- ],
- "homepage": "https://mths.be/punycode",
- "jspm": {
- "map": {
- "./punycode.js": {
- "node": "@node/punycode"
- }
- }
- },
- "keywords": [
- "punycode",
- "unicode",
- "idn",
- "idna",
- "dns",
- "url",
- "domain"
- ],
- "license": "MIT",
- "main": "punycode.js",
- "name": "punycode",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/bestiejs/punycode.js.git"
- },
- "scripts": {
- "test": "node tests/tests.js"
- },
- "version": "1.4.1"
-}
diff --git a/node_modules/request/node_modules/punycode/punycode.js b/node_modules/request/node_modules/punycode/punycode.js
deleted file mode 100644
index 2c87f6c..0000000
--- a/node_modules/request/node_modules/punycode/punycode.js
+++ /dev/null
@@ -1,533 +0,0 @@
-/*! https://mths.be/punycode v1.4.1 by @mathias */
-;(function(root) {
-
- /** Detect free variables */
- var freeExports = typeof exports == 'object' && exports &&
- !exports.nodeType && exports;
- var freeModule = typeof module == 'object' && module &&
- !module.nodeType && module;
- var freeGlobal = typeof global == 'object' && global;
- if (
- freeGlobal.global === freeGlobal ||
- freeGlobal.window === freeGlobal ||
- freeGlobal.self === freeGlobal
- ) {
- root = freeGlobal;
- }
-
- /**
- * The `punycode` object.
- * @name punycode
- * @type Object
- */
- var punycode,
-
- /** Highest positive signed 32-bit float value */
- maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
-
- /** Bootstring parameters */
- base = 36,
- tMin = 1,
- tMax = 26,
- skew = 38,
- damp = 700,
- initialBias = 72,
- initialN = 128, // 0x80
- delimiter = '-', // '\x2D'
-
- /** Regular expressions */
- regexPunycode = /^xn--/,
- regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
- regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
-
- /** Error messages */
- errors = {
- 'overflow': 'Overflow: input needs wider integers to process',
- 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
- 'invalid-input': 'Invalid input'
- },
-
- /** Convenience shortcuts */
- baseMinusTMin = base - tMin,
- floor = Math.floor,
- stringFromCharCode = String.fromCharCode,
-
- /** Temporary variable */
- key;
-
- /*--------------------------------------------------------------------------*/
-
- /**
- * A generic error utility function.
- * @private
- * @param {String} type The error type.
- * @returns {Error} Throws a `RangeError` with the applicable error message.
- */
- function error(type) {
- throw new RangeError(errors[type]);
- }
-
- /**
- * A generic `Array#map` utility function.
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} callback The function that gets called for every array
- * item.
- * @returns {Array} A new array of values returned by the callback function.
- */
- function map(array, fn) {
- var length = array.length;
- var result = [];
- while (length--) {
- result[length] = fn(array[length]);
- }
- return result;
- }
-
- /**
- * A simple `Array#map`-like wrapper to work with domain name strings or email
- * addresses.
- * @private
- * @param {String} domain The domain name or email address.
- * @param {Function} callback The function that gets called for every
- * character.
- * @returns {Array} A new string of characters returned by the callback
- * function.
- */
- function mapDomain(string, fn) {
- var parts = string.split('@');
- var result = '';
- if (parts.length > 1) {
- // In email addresses, only the domain name should be punycoded. Leave
- // the local part (i.e. everything up to `@`) intact.
- result = parts[0] + '@';
- string = parts[1];
- }
- // Avoid `split(regex)` for IE8 compatibility. See #17.
- string = string.replace(regexSeparators, '\x2E');
- var labels = string.split('.');
- var encoded = map(labels, fn).join('.');
- return result + encoded;
- }
-
- /**
- * Creates an array containing the numeric code points of each Unicode
- * character in the string. While JavaScript uses UCS-2 internally,
- * this function will convert a pair of surrogate halves (each of which
- * UCS-2 exposes as separate characters) into a single code point,
- * matching UTF-16.
- * @see `punycode.ucs2.encode`
- * @see
- * @memberOf punycode.ucs2
- * @name decode
- * @param {String} string The Unicode input string (UCS-2).
- * @returns {Array} The new array of code points.
- */
- function ucs2decode(string) {
- var output = [],
- counter = 0,
- length = string.length,
- value,
- extra;
- while (counter < length) {
- value = string.charCodeAt(counter++);
- if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
- // high surrogate, and there is a next character
- extra = string.charCodeAt(counter++);
- if ((extra & 0xFC00) == 0xDC00) { // low surrogate
- output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
- } else {
- // unmatched surrogate; only append this code unit, in case the next
- // code unit is the high surrogate of a surrogate pair
- output.push(value);
- counter--;
- }
- } else {
- output.push(value);
- }
- }
- return output;
- }
-
- /**
- * Creates a string based on an array of numeric code points.
- * @see `punycode.ucs2.decode`
- * @memberOf punycode.ucs2
- * @name encode
- * @param {Array} codePoints The array of numeric code points.
- * @returns {String} The new Unicode string (UCS-2).
- */
- function ucs2encode(array) {
- return map(array, function(value) {
- var output = '';
- if (value > 0xFFFF) {
- value -= 0x10000;
- output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
- value = 0xDC00 | value & 0x3FF;
- }
- output += stringFromCharCode(value);
- return output;
- }).join('');
- }
-
- /**
- * Converts a basic code point into a digit/integer.
- * @see `digitToBasic()`
- * @private
- * @param {Number} codePoint The basic numeric code point value.
- * @returns {Number} The numeric value of a basic code point (for use in
- * representing integers) in the range `0` to `base - 1`, or `base` if
- * the code point does not represent a value.
- */
- function basicToDigit(codePoint) {
- if (codePoint - 48 < 10) {
- return codePoint - 22;
- }
- if (codePoint - 65 < 26) {
- return codePoint - 65;
- }
- if (codePoint - 97 < 26) {
- return codePoint - 97;
- }
- return base;
- }
-
- /**
- * Converts a digit/integer into a basic code point.
- * @see `basicToDigit()`
- * @private
- * @param {Number} digit The numeric value of a basic code point.
- * @returns {Number} The basic code point whose value (when used for
- * representing integers) is `digit`, which needs to be in the range
- * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
- * used; else, the lowercase form is used. The behavior is undefined
- * if `flag` is non-zero and `digit` has no uppercase form.
- */
- function digitToBasic(digit, flag) {
- // 0..25 map to ASCII a..z or A..Z
- // 26..35 map to ASCII 0..9
- return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
- }
-
- /**
- * Bias adaptation function as per section 3.4 of RFC 3492.
- * https://tools.ietf.org/html/rfc3492#section-3.4
- * @private
- */
- function adapt(delta, numPoints, firstTime) {
- var k = 0;
- delta = firstTime ? floor(delta / damp) : delta >> 1;
- delta += floor(delta / numPoints);
- for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
- delta = floor(delta / baseMinusTMin);
- }
- return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
- }
-
- /**
- * Converts a Punycode string of ASCII-only symbols to a string of Unicode
- * symbols.
- * @memberOf punycode
- * @param {String} input The Punycode string of ASCII-only symbols.
- * @returns {String} The resulting string of Unicode symbols.
- */
- function decode(input) {
- // Don't use UCS-2
- var output = [],
- inputLength = input.length,
- out,
- i = 0,
- n = initialN,
- bias = initialBias,
- basic,
- j,
- index,
- oldi,
- w,
- k,
- digit,
- t,
- /** Cached calculation results */
- baseMinusT;
-
- // Handle the basic code points: let `basic` be the number of input code
- // points before the last delimiter, or `0` if there is none, then copy
- // the first basic code points to the output.
-
- basic = input.lastIndexOf(delimiter);
- if (basic < 0) {
- basic = 0;
- }
-
- for (j = 0; j < basic; ++j) {
- // if it's not a basic code point
- if (input.charCodeAt(j) >= 0x80) {
- error('not-basic');
- }
- output.push(input.charCodeAt(j));
- }
-
- // Main decoding loop: start just after the last delimiter if any basic code
- // points were copied; start at the beginning otherwise.
-
- for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
-
- // `index` is the index of the next character to be consumed.
- // Decode a generalized variable-length integer into `delta`,
- // which gets added to `i`. The overflow checking is easier
- // if we increase `i` as we go, then subtract off its starting
- // value at the end to obtain `delta`.
- for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
-
- if (index >= inputLength) {
- error('invalid-input');
- }
-
- digit = basicToDigit(input.charCodeAt(index++));
-
- if (digit >= base || digit > floor((maxInt - i) / w)) {
- error('overflow');
- }
-
- i += digit * w;
- t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
-
- if (digit < t) {
- break;
- }
-
- baseMinusT = base - t;
- if (w > floor(maxInt / baseMinusT)) {
- error('overflow');
- }
-
- w *= baseMinusT;
-
- }
-
- out = output.length + 1;
- bias = adapt(i - oldi, out, oldi == 0);
-
- // `i` was supposed to wrap around from `out` to `0`,
- // incrementing `n` each time, so we'll fix that now:
- if (floor(i / out) > maxInt - n) {
- error('overflow');
- }
-
- n += floor(i / out);
- i %= out;
-
- // Insert `n` at position `i` of the output
- output.splice(i++, 0, n);
-
- }
-
- return ucs2encode(output);
- }
-
- /**
- * Converts a string of Unicode symbols (e.g. a domain name label) to a
- * Punycode string of ASCII-only symbols.
- * @memberOf punycode
- * @param {String} input The string of Unicode symbols.
- * @returns {String} The resulting Punycode string of ASCII-only symbols.
- */
- function encode(input) {
- var n,
- delta,
- handledCPCount,
- basicLength,
- bias,
- j,
- m,
- q,
- k,
- t,
- currentValue,
- output = [],
- /** `inputLength` will hold the number of code points in `input`. */
- inputLength,
- /** Cached calculation results */
- handledCPCountPlusOne,
- baseMinusT,
- qMinusT;
-
- // Convert the input in UCS-2 to Unicode
- input = ucs2decode(input);
-
- // Cache the length
- inputLength = input.length;
-
- // Initialize the state
- n = initialN;
- delta = 0;
- bias = initialBias;
-
- // Handle the basic code points
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue < 0x80) {
- output.push(stringFromCharCode(currentValue));
- }
- }
-
- handledCPCount = basicLength = output.length;
-
- // `handledCPCount` is the number of code points that have been handled;
- // `basicLength` is the number of basic code points.
-
- // Finish the basic string - if it is not empty - with a delimiter
- if (basicLength) {
- output.push(delimiter);
- }
-
- // Main encoding loop:
- while (handledCPCount < inputLength) {
-
- // All non-basic code points < n have been handled already. Find the next
- // larger one:
- for (m = maxInt, j = 0; j < inputLength; ++j) {
- currentValue = input[j];
- if (currentValue >= n && currentValue < m) {
- m = currentValue;
- }
- }
-
- // Increase `delta` enough to advance the decoder's state to ,
- // but guard against overflow
- handledCPCountPlusOne = handledCPCount + 1;
- if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
- error('overflow');
- }
-
- delta += (m - n) * handledCPCountPlusOne;
- n = m;
-
- for (j = 0; j < inputLength; ++j) {
- currentValue = input[j];
-
- if (currentValue < n && ++delta > maxInt) {
- error('overflow');
- }
-
- if (currentValue == n) {
- // Represent delta as a generalized variable-length integer
- for (q = delta, k = base; /* no condition */; k += base) {
- t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
- if (q < t) {
- break;
- }
- qMinusT = q - t;
- baseMinusT = base - t;
- output.push(
- stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
- );
- q = floor(qMinusT / baseMinusT);
- }
-
- output.push(stringFromCharCode(digitToBasic(q, 0)));
- bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
- delta = 0;
- ++handledCPCount;
- }
- }
-
- ++delta;
- ++n;
-
- }
- return output.join('');
- }
-
- /**
- * Converts a Punycode string representing a domain name or an email address
- * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
- * it doesn't matter if you call it on a string that has already been
- * converted to Unicode.
- * @memberOf punycode
- * @param {String} input The Punycoded domain name or email address to
- * convert to Unicode.
- * @returns {String} The Unicode representation of the given Punycode
- * string.
- */
- function toUnicode(input) {
- return mapDomain(input, function(string) {
- return regexPunycode.test(string)
- ? decode(string.slice(4).toLowerCase())
- : string;
- });
- }
-
- /**
- * Converts a Unicode string representing a domain name or an email address to
- * Punycode. Only the non-ASCII parts of the domain name will be converted,
- * i.e. it doesn't matter if you call it with a domain that's already in
- * ASCII.
- * @memberOf punycode
- * @param {String} input The domain name or email address to convert, as a
- * Unicode string.
- * @returns {String} The Punycode representation of the given domain name or
- * email address.
- */
- function toASCII(input) {
- return mapDomain(input, function(string) {
- return regexNonASCII.test(string)
- ? 'xn--' + encode(string)
- : string;
- });
- }
-
- /*--------------------------------------------------------------------------*/
-
- /** Define the public API */
- punycode = {
- /**
- * A string representing the current Punycode.js version number.
- * @memberOf punycode
- * @type String
- */
- 'version': '1.4.1',
- /**
- * An object of methods to convert from JavaScript's internal character
- * representation (UCS-2) to Unicode code points, and back.
- * @see
- * @memberOf punycode
- * @type Object
- */
- 'ucs2': {
- 'decode': ucs2decode,
- 'encode': ucs2encode
- },
- 'decode': decode,
- 'encode': encode,
- 'toASCII': toASCII,
- 'toUnicode': toUnicode
- };
-
- /** Expose `punycode` */
- // Some AMD build optimizers, like r.js, check for specific condition patterns
- // like the following:
- if (
- typeof define == 'function' &&
- typeof define.amd == 'object' &&
- define.amd
- ) {
- define('punycode', function() {
- return punycode;
- });
- } else if (freeExports && freeModule) {
- if (module.exports == freeExports) {
- // in Node.js, io.js, or RingoJS v0.8.0+
- freeModule.exports = punycode;
- } else {
- // in Narwhal or RingoJS v0.7.0-
- for (key in punycode) {
- punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
- }
- }
- } else {
- // in Rhino or a web browser
- root.punycode = punycode;
- }
-
-}(this));
diff --git a/node_modules/request/node_modules/tough-cookie/LICENSE b/node_modules/request/node_modules/tough-cookie/LICENSE
deleted file mode 100644
index 22204e8..0000000
--- a/node_modules/request/node_modules/tough-cookie/LICENSE
+++ /dev/null
@@ -1,12 +0,0 @@
-Copyright (c) 2015, Salesforce.com, Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-3. Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/request/node_modules/tough-cookie/README.md b/node_modules/request/node_modules/tough-cookie/README.md
deleted file mode 100644
index d28bd46..0000000
--- a/node_modules/request/node_modules/tough-cookie/README.md
+++ /dev/null
@@ -1,507 +0,0 @@
-[RFC6265](https://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js
-
-[](https://nodei.co/npm/tough-cookie/)
-
-[](https://travis-ci.org/salesforce/tough-cookie)
-
-# Synopsis
-
-``` javascript
-var tough = require('tough-cookie');
-var Cookie = tough.Cookie;
-var cookie = Cookie.parse(header);
-cookie.value = 'somethingdifferent';
-header = cookie.toString();
-
-var cookiejar = new tough.CookieJar();
-cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb);
-// ...
-cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) {
- res.headers['cookie'] = cookies.join('; ');
-});
-```
-
-# Installation
-
-It's _so_ easy!
-
-`npm install tough-cookie`
-
-Why the name? NPM modules `cookie`, `cookies` and `cookiejar` were already taken.
-
-## Version Support
-
-Support for versions of node.js will follow that of the [request](https://www.npmjs.com/package/request) module.
-
-# API
-
-## tough
-
-Functions on the module you get from `require('tough-cookie')`. All can be used as pure functions and don't need to be "bound".
-
-**Note**: prior to 1.0.x, several of these functions took a `strict` parameter. This has since been removed from the API as it was no longer necessary.
-
-### `parseDate(string)`
-
-Parse a cookie date string into a `Date`. Parses according to RFC6265 Section 5.1.1, not `Date.parse()`.
-
-### `formatDate(date)`
-
-Format a Date into a RFC1123 string (the RFC6265-recommended format).
-
-### `canonicalDomain(str)`
-
-Transforms a domain-name into a canonical domain-name. The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265). For the most part, this function is idempotent (can be run again on its output without ill effects).
-
-### `domainMatch(str,domStr[,canonicalize=true])`
-
-Answers "does this real domain match the domain in a cookie?". The `str` is the "current" domain-name and the `domStr` is the "cookie" domain-name. Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match".
-
-The `canonicalize` parameter will run the other two parameters through `canonicalDomain` or not.
-
-### `defaultPath(path)`
-
-Given a current request/response path, gives the Path apropriate for storing in a cookie. This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC.
-
-The `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.). This is the `.pathname` property of node's `uri.parse()` output.
-
-### `pathMatch(reqPath,cookiePath)`
-
-Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4. Returns a boolean.
-
-This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`.
-
-### `parse(cookieString[, options])`
-
-alias for `Cookie.parse(cookieString[, options])`
-
-### `fromJSON(string)`
-
-alias for `Cookie.fromJSON(string)`
-
-### `getPublicSuffix(hostname)`
-
-Returns the public suffix of this hostname. The public suffix is the shortest domain-name upon which a cookie can be set. Returns `null` if the hostname cannot have cookies set for it.
-
-For example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`.
-
-For further information, see http://publicsuffix.org/. This module derives its list from that site. This call is currently a wrapper around [`psl`](https://www.npmjs.com/package/psl)'s [get() method](https://www.npmjs.com/package/psl#pslgetdomain).
-
-### `cookieCompare(a,b)`
-
-For use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). The sort algorithm is, in order of precedence:
-
-* Longest `.path`
-* oldest `.creation` (which has a 1ms precision, same as `Date`)
-* lowest `.creationIndex` (to get beyond the 1ms precision)
-
-``` javascript
-var cookies = [ /* unsorted array of Cookie objects */ ];
-cookies = cookies.sort(cookieCompare);
-```
-
-**Note**: Since JavaScript's `Date` is limited to a 1ms precision, cookies within the same milisecond are entirely possible. This is especially true when using the `now` option to `.setCookie()`. The `.creationIndex` property is a per-process global counter, assigned during construction with `new Cookie()`. This preserves the spirit of the RFC sorting: older cookies go first. This works great for `MemoryCookieStore`, since `Set-Cookie` headers are parsed in order, but may not be so great for distributed systems. Sophisticated `Store`s may wish to set this to some other _logical clock_ such that if cookies A and B are created in the same millisecond, but cookie A is created before cookie B, then `A.creationIndex < B.creationIndex`. If you want to alter the global counter, which you probably _shouldn't_ do, it's stored in `Cookie.cookiesCreated`.
-
-### `permuteDomain(domain)`
-
-Generates a list of all possible domains that `domainMatch()` the parameter. May be handy for implementing cookie stores.
-
-### `permutePath(path)`
-
-Generates a list of all possible paths that `pathMatch()` the parameter. May be handy for implementing cookie stores.
-
-
-## Cookie
-
-Exported via `tough.Cookie`.
-
-### `Cookie.parse(cookieString[, options])`
-
-Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object. Returns `undefined` if the string can't be parsed.
-
-The options parameter is not required and currently has only one property:
-
- * _loose_ - boolean - if `true` enable parsing of key-less cookies like `=abc` and `=`, which are not RFC-compliant.
-
-If options is not an object, it is ignored, which means you can use `Array#map` with it.
-
-Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response:
-
-``` javascript
-if (res.headers['set-cookie'] instanceof Array)
- cookies = res.headers['set-cookie'].map(Cookie.parse);
-else
- cookies = [Cookie.parse(res.headers['set-cookie'])];
-```
-
-_Note:_ in version 2.3.3, tough-cookie limited the number of spaces before the `=` to 256 characters. This limitation has since been removed.
-See [Issue 92](https://github.com/salesforce/tough-cookie/issues/92)
-
-### Properties
-
-Cookie object properties:
-
- * _key_ - string - the name or key of the cookie (default "")
- * _value_ - string - the value of the cookie (default "")
- * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `"Infinity"`). See `setExpires()`
- * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie. May also be set to strings `"Infinity"` and `"-Infinity"` for non-expiry and immediate-expiry, respectively. See `setMaxAge()`
- * _domain_ - string - the `Domain=` attribute of the cookie
- * _path_ - string - the `Path=` of the cookie
- * _secure_ - boolean - the `Secure` cookie flag
- * _httpOnly_ - boolean - the `HttpOnly` cookie flag
- * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside)
- * _creation_ - `Date` - when this cookie was constructed
- * _creationIndex_ - number - set at construction, used to provide greater sort precision (please see `cookieCompare(a,b)` for a full explanation)
-
-After a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes:
-
- * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied)
- * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one.
- * _creation_ - `Date` - **modified** from construction to when the cookie was added to the jar
- * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented. Using `cookiejar.getCookies(...)` will update this attribute.
-
-### `Cookie([{properties}])`
-
-Receives an options object that can contain any of the above Cookie properties, uses the default for unspecified properties.
-
-### `.toString()`
-
-encode to a Set-Cookie header value. The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`.
-
-### `.cookieString()`
-
-encode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '=').
-
-### `.setExpires(String)`
-
-sets the expiry based on a date-string passed through `parseDate()`. If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `"Infinity"` (a string) is set.
-
-### `.setMaxAge(number)`
-
-sets the maxAge in seconds. Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it JSON serializes correctly.
-
-### `.expiryTime([now=Date.now()])`
-
-### `.expiryDate([now=Date.now()])`
-
-expiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object. Note that in both cases the `now` parameter should be milliseconds.
-
-Max-Age takes precedence over Expires (as per the RFC). The `.creation` attribute -- or, by default, the `now` parameter -- is used to offset the `.maxAge` attribute.
-
-If Expires (`.expires`) is set, that's returned.
-
-Otherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for "Tue, 19 Jan 2038 03:14:07 GMT" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents).
-
-### `.TTL([now=Date.now()])`
-
-compute the TTL relative to `now` (milliseconds). The same precedence rules as for `expiryTime`/`expiryDate` apply.
-
-The "number" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired. Otherwise a time-to-live in milliseconds is returned.
-
-### `.canonicalizedDoman()`
-
-### `.cdomain()`
-
-return the canonicalized `.domain` field. This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters.
-
-### `.toJSON()`
-
-For convenience in using `JSON.serialize(cookie)`. Returns a plain-old `Object` that can be JSON-serialized.
-
-Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are exported in ISO format (`.toISOString()`).
-
-**NOTE**: Custom `Cookie` properties will be discarded. In tough-cookie 1.x, since there was no `.toJSON` method explicitly defined, all enumerable properties were captured. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array.
-
-### `Cookie.fromJSON(strOrObj)`
-
-Does the reverse of `cookie.toJSON()`. If passed a string, will `JSON.parse()` that first.
-
-Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are parsed via `Date.parse()`, not the tough-cookie `parseDate`, since it's JavaScript/JSON-y timestamps being handled at this layer.
-
-Returns `null` upon JSON parsing error.
-
-### `.clone()`
-
-Does a deep clone of this cookie, exactly implemented as `Cookie.fromJSON(cookie.toJSON())`.
-
-### `.validate()`
-
-Status: *IN PROGRESS*. Works for a few things, but is by no means comprehensive.
-
-validates cookie attributes for semantic correctness. Useful for "lint" checking any Set-Cookie headers you generate. For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct:
-
-``` javascript
-if (cookie.validate() === true) {
- // it's tasty
-} else {
- // yuck!
-}
-```
-
-
-## CookieJar
-
-Exported via `tough.CookieJar`.
-
-### `CookieJar([store],[options])`
-
-Simply use `new CookieJar()`. If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used.
-
-The `options` object can be omitted and can have the following properties:
-
- * _rejectPublicSuffixes_ - boolean - default `true` - reject cookies with domains like "com" and "co.uk"
- * _looseMode_ - boolean - default `false` - accept malformed cookies like `bar` and `=bar`, which have an implied empty name.
- This is not in the standard, but is used sometimes on the web and is accepted by (most) browsers.
-
-Since eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods.
-
-### `.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))`
-
-Attempt to set the cookie in the cookie jar. If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through. The cookie will have updated `.creation`, `.lastAccessed` and `.hostOnly` properties.
-
-The `options` object can be omitted and can have the following properties:
-
- * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies.
- * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.
- * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies
- * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains. `Store` errors aren't ignored by this option.
-
-As per the RFC, the `.hostOnly` property is set if there was no "Domain=" parameter in the cookie string (or `.domain` was null on the Cookie object). The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual).
-
-### `.setCookieSync(cookieOrString, currentUrl, [{options}])`
-
-Synchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
-
-### `.getCookies(currentUrl, [{options},] cb(err,cookies))`
-
-Retrieve the list of cookies that can be sent in a Cookie header for the current url.
-
-If an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed. The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given.
-
-The `options` object can be omitted and can have the following properties:
-
- * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API. Affects HttpOnly cookies.
- * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API. If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.
- * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies
- * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store. Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially).
- * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the underlying store (the default `MemoryCookieStore` supports it).
-
-The `.lastAccessed` property of the returned cookies will have been updated.
-
-### `.getCookiesSync(currentUrl, [{options}])`
-
-Synchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
-
-### `.getCookieString(...)`
-
-Accepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback. Simply maps the `Cookie` array via `.cookieString()`.
-
-### `.getCookieStringSync(...)`
-
-Synchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
-
-### `.getSetCookieStrings(...)`
-
-Returns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`. Simply maps the cookie array via `.toString()`.
-
-### `.getSetCookieStringsSync(...)`
-
-Synchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
-
-### `.serialize(cb(err,serializedObject))`
-
-Serialize the Jar if the underlying store supports `.getAllCookies`.
-
-**NOTE**: Custom `Cookie` properties will be discarded. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array.
-
-See [Serialization Format].
-
-### `.serializeSync()`
-
-Sync version of .serialize
-
-### `.toJSON()`
-
-Alias of .serializeSync() for the convenience of `JSON.stringify(cookiejar)`.
-
-### `CookieJar.deserialize(serialized, [store], cb(err,object))`
-
-A new Jar is created and the serialized Cookies are added to the underlying store. Each `Cookie` is added via `store.putCookie` in the order in which they appear in the serialization.
-
-The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created.
-
-As a convenience, if `serialized` is a string, it is passed through `JSON.parse` first. If that throws an error, this is passed to the callback.
-
-### `CookieJar.deserializeSync(serialized, [store])`
-
-Sync version of `.deserialize`. _Note_ that the `store` must be synchronous for this to work.
-
-### `CookieJar.fromJSON(string)`
-
-Alias of `.deserializeSync` to provide consistency with `Cookie.fromJSON()`.
-
-### `.clone([store,]cb(err,newJar))`
-
-Produces a deep clone of this jar. Modifications to the original won't affect the clone, and vice versa.
-
-The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. Transferring between store types is supported so long as the source implements `.getAllCookies()` and the destination implements `.putCookie()`.
-
-### `.cloneSync([store])`
-
-Synchronous version of `.clone`, returning a new `CookieJar` instance.
-
-The `store` argument is optional, but must be a _synchronous_ `Store` instance if specified. If not passed, a new instance of `MemoryCookieStore` is used.
-
-The _source_ and _destination_ must both be synchronous `Store`s. If one or both stores are asynchronous, use `.clone` instead. Recall that `MemoryCookieStore` supports both synchronous and asynchronous API calls.
-
-## Store
-
-Base class for CookieJar stores. Available as `tough.Store`.
-
-## Store API
-
-The storage model for each `CookieJar` instance can be replaced with a custom implementation. The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file. The API uses continuation-passing-style to allow for asynchronous stores.
-
-Stores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`.
-
-Stores are asynchronous by default, but if `store.synchronous` is set to `true`, then the `*Sync` methods on the of the containing `CookieJar` can be used (however, the continuation-passing style
-
-All `domain` parameters will have been normalized before calling.
-
-The Cookie store must have all of the following methods.
-
-### `store.findCookie(domain, path, key, cb(err,cookie))`
-
-Retrieve a cookie with the given domain, path and key (a.k.a. name). The RFC maintains that exactly one of these cookies should exist in a store. If the store is using versioning, this means that the latest/newest such cookie should be returned.
-
-Callback takes an error and the resulting `Cookie` object. If no cookie is found then `null` MUST be passed instead (i.e. not an error).
-
-### `store.findCookies(domain, path, cb(err,cookies))`
-
-Locates cookies matching the given domain and path. This is most often called in the context of `cookiejar.getCookies()` above.
-
-If no cookies are found, the callback MUST be passed an empty array.
-
-The resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method. However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done.
-
-As of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`. If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only).
-
-### `store.putCookie(cookie, cb(err))`
-
-Adds a new cookie to the store. The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur.
-
-The `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties.
-
-Pass an error if the cookie cannot be stored.
-
-### `store.updateCookie(oldCookie, newCookie, cb(err))`
-
-Update an existing cookie. The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`. The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store.
-
-The `.lastAccessed` property will always be different between the two objects (to the precision possible via JavaScript's clock). Both `.creation` and `.creationIndex` are guaranteed to be the same. Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are selected for automatic deletion (e.g., least-recently-used, which is up to the store to implement).
-
-Stores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie. If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object.
-
-The `newCookie` and `oldCookie` objects MUST NOT be modified.
-
-Pass an error if the newCookie cannot be stored.
-
-### `store.removeCookie(domain, path, key, cb(err))`
-
-Remove a cookie from the store (see notes on `findCookie` about the uniqueness constraint).
-
-The implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie.
-
-### `store.removeCookies(domain, path, cb(err))`
-
-Removes matching cookies from the store. The `path` parameter is optional, and if missing means all paths in a domain should be removed.
-
-Pass an error ONLY if removing any existing cookies failed.
-
-### `store.getAllCookies(cb(err, cookies))`
-
-Produces an `Array` of all cookies during `jar.serialize()`. The items in the array can be true `Cookie` objects or generic `Object`s with the [Serialization Format] data structure.
-
-Cookies SHOULD be returned in creation order to preserve sorting via `compareCookies()`. For reference, `MemoryCookieStore` will sort by `.creationIndex` since it uses true `Cookie` objects internally. If you don't return the cookies in creation order, they'll still be sorted by creation time, but this only has a precision of 1ms. See `compareCookies` for more detail.
-
-Pass an error if retrieval fails.
-
-## MemoryCookieStore
-
-Inherits from `Store`.
-
-A just-in-memory CookieJar synchronous store implementation, used by default. Despite being a synchronous implementation, it's usable with both the synchronous and asynchronous forms of the `CookieJar` API.
-
-## Community Cookie Stores
-
-These are some Store implementations authored and maintained by the community. They aren't official and we don't vouch for them but you may be interested to have a look:
-
-- [`db-cookie-store`](https://github.com/JSBizon/db-cookie-store): SQL including SQLite-based databases
-- [`file-cookie-store`](https://github.com/JSBizon/file-cookie-store): Netscape cookie file format on disk
-- [`redis-cookie-store`](https://github.com/benkroeger/redis-cookie-store): Redis
-- [`tough-cookie-filestore`](https://github.com/mitsuru/tough-cookie-filestore): JSON on disk
-- [`tough-cookie-web-storage-store`](https://github.com/exponentjs/tough-cookie-web-storage-store): DOM localStorage and sessionStorage
-
-
-# Serialization Format
-
-**NOTE**: if you want to have custom `Cookie` properties serialized, add the property name to `Cookie.serializableProperties`.
-
-```js
- {
- // The version of tough-cookie that serialized this jar.
- version: 'tough-cookie@1.x.y',
-
- // add the store type, to make humans happy:
- storeType: 'MemoryCookieStore',
-
- // CookieJar configuration:
- rejectPublicSuffixes: true,
- // ... future items go here
-
- // Gets filled from jar.store.getAllCookies():
- cookies: [
- {
- key: 'string',
- value: 'string',
- // ...
- /* other Cookie.serializableProperties go here */
- }
- ]
- }
-```
-
-# Copyright and License
-
-(tl;dr: BSD-3-Clause with some MPL/2.0)
-
-```text
- Copyright (c) 2015, Salesforce.com, Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- 3. Neither the name of Salesforce.com nor the names of its contributors may
- be used to endorse or promote products derived from this software without
- specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-```
diff --git a/node_modules/request/node_modules/tough-cookie/lib/cookie.js b/node_modules/request/node_modules/tough-cookie/lib/cookie.js
deleted file mode 100644
index 039a0e7..0000000
--- a/node_modules/request/node_modules/tough-cookie/lib/cookie.js
+++ /dev/null
@@ -1,1431 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-'use strict';
-var net = require('net');
-var urlParse = require('url').parse;
-var util = require('util');
-var pubsuffix = require('./pubsuffix-psl');
-var Store = require('./store').Store;
-var MemoryCookieStore = require('./memstore').MemoryCookieStore;
-var pathMatch = require('./pathMatch').pathMatch;
-var VERSION = require('../package.json').version;
-
-var punycode;
-try {
- punycode = require('punycode');
-} catch(e) {
- console.warn("tough-cookie: can't load punycode; won't use punycode for domain normalization");
-}
-
-// From RFC6265 S4.1.1
-// note that it excludes \x3B ";"
-var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/;
-
-var CONTROL_CHARS = /[\x00-\x1F]/;
-
-// From Chromium // '\r', '\n' and '\0' should be treated as a terminator in
-// the "relaxed" mode, see:
-// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60
-var TERMINATORS = ['\n', '\r', '\0'];
-
-// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"'
-// Note ';' is \x3B
-var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/;
-
-// date-time parsing constants (RFC6265 S5.1.1)
-
-var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/;
-
-var MONTH_TO_NUM = {
- jan:0, feb:1, mar:2, apr:3, may:4, jun:5,
- jul:6, aug:7, sep:8, oct:9, nov:10, dec:11
-};
-var NUM_TO_MONTH = [
- 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'
-];
-var NUM_TO_DAY = [
- 'Sun','Mon','Tue','Wed','Thu','Fri','Sat'
-];
-
-var MAX_TIME = 2147483647000; // 31-bit max
-var MIN_TIME = 0; // 31-bit min
-
-/*
- * Parses a Natural number (i.e., non-negative integer) with either the
- * *DIGIT ( non-digit *OCTET )
- * or
- * *DIGIT
- * grammar (RFC6265 S5.1.1).
- *
- * The "trailingOK" boolean controls if the grammar accepts a
- * "( non-digit *OCTET )" trailer.
- */
-function parseDigits(token, minDigits, maxDigits, trailingOK) {
- var count = 0;
- while (count < token.length) {
- var c = token.charCodeAt(count);
- // "non-digit = %x00-2F / %x3A-FF"
- if (c <= 0x2F || c >= 0x3A) {
- break;
- }
- count++;
- }
-
- // constrain to a minimum and maximum number of digits.
- if (count < minDigits || count > maxDigits) {
- return null;
- }
-
- if (!trailingOK && count != token.length) {
- return null;
- }
-
- return parseInt(token.substr(0,count), 10);
-}
-
-function parseTime(token) {
- var parts = token.split(':');
- var result = [0,0,0];
-
- /* RF6256 S5.1.1:
- * time = hms-time ( non-digit *OCTET )
- * hms-time = time-field ":" time-field ":" time-field
- * time-field = 1*2DIGIT
- */
-
- if (parts.length !== 3) {
- return null;
- }
-
- for (var i = 0; i < 3; i++) {
- // "time-field" must be strictly "1*2DIGIT", HOWEVER, "hms-time" can be
- // followed by "( non-digit *OCTET )" so therefore the last time-field can
- // have a trailer
- var trailingOK = (i == 2);
- var num = parseDigits(parts[i], 1, 2, trailingOK);
- if (num === null) {
- return null;
- }
- result[i] = num;
- }
-
- return result;
-}
-
-function parseMonth(token) {
- token = String(token).substr(0,3).toLowerCase();
- var num = MONTH_TO_NUM[token];
- return num >= 0 ? num : null;
-}
-
-/*
- * RFC6265 S5.1.1 date parser (see RFC for full grammar)
- */
-function parseDate(str) {
- if (!str) {
- return;
- }
-
- /* RFC6265 S5.1.1:
- * 2. Process each date-token sequentially in the order the date-tokens
- * appear in the cookie-date
- */
- var tokens = str.split(DATE_DELIM);
- if (!tokens) {
- return;
- }
-
- var hour = null;
- var minute = null;
- var second = null;
- var dayOfMonth = null;
- var month = null;
- var year = null;
-
- for (var i=0; i= 70 && year <= 99) {
- year += 1900;
- } else if (year >= 0 && year <= 69) {
- year += 2000;
- }
- }
- }
- }
-
- /* RFC 6265 S5.1.1
- * "5. Abort these steps and fail to parse the cookie-date if:
- * * at least one of the found-day-of-month, found-month, found-
- * year, or found-time flags is not set,
- * * the day-of-month-value is less than 1 or greater than 31,
- * * the year-value is less than 1601,
- * * the hour-value is greater than 23,
- * * the minute-value is greater than 59, or
- * * the second-value is greater than 59.
- * (Note that leap seconds cannot be represented in this syntax.)"
- *
- * So, in order as above:
- */
- if (
- dayOfMonth === null || month === null || year === null || second === null ||
- dayOfMonth < 1 || dayOfMonth > 31 ||
- year < 1601 ||
- hour > 23 ||
- minute > 59 ||
- second > 59
- ) {
- return;
- }
-
- return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second));
-}
-
-function formatDate(date) {
- var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d;
- var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h;
- var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m;
- var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s;
- return NUM_TO_DAY[date.getUTCDay()] + ', ' +
- d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+
- h+':'+m+':'+s+' GMT';
-}
-
-// S5.1.2 Canonicalized Host Names
-function canonicalDomain(str) {
- if (str == null) {
- return null;
- }
- str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading .
-
- // convert to IDN if any non-ASCII characters
- if (punycode && /[^\u0001-\u007f]/.test(str)) {
- str = punycode.toASCII(str);
- }
-
- return str.toLowerCase();
-}
-
-// S5.1.3 Domain Matching
-function domainMatch(str, domStr, canonicalize) {
- if (str == null || domStr == null) {
- return null;
- }
- if (canonicalize !== false) {
- str = canonicalDomain(str);
- domStr = canonicalDomain(domStr);
- }
-
- /*
- * "The domain string and the string are identical. (Note that both the
- * domain string and the string will have been canonicalized to lower case at
- * this point)"
- */
- if (str == domStr) {
- return true;
- }
-
- /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */
-
- /* "* The string is a host name (i.e., not an IP address)." */
- if (net.isIP(str)) {
- return false;
- }
-
- /* "* The domain string is a suffix of the string" */
- var idx = str.indexOf(domStr);
- if (idx <= 0) {
- return false; // it's a non-match (-1) or prefix (0)
- }
-
- // e.g "a.b.c".indexOf("b.c") === 2
- // 5 === 3+2
- if (str.length !== domStr.length + idx) { // it's not a suffix
- return false;
- }
-
- /* "* The last character of the string that is not included in the domain
- * string is a %x2E (".") character." */
- if (str.substr(idx-1,1) !== '.') {
- return false;
- }
-
- return true;
-}
-
-
-// RFC6265 S5.1.4 Paths and Path-Match
-
-/*
- * "The user agent MUST use an algorithm equivalent to the following algorithm
- * to compute the default-path of a cookie:"
- *
- * Assumption: the path (and not query part or absolute uri) is passed in.
- */
-function defaultPath(path) {
- // "2. If the uri-path is empty or if the first character of the uri-path is not
- // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps.
- if (!path || path.substr(0,1) !== "/") {
- return "/";
- }
-
- // "3. If the uri-path contains no more than one %x2F ("/") character, output
- // %x2F ("/") and skip the remaining step."
- if (path === "/") {
- return path;
- }
-
- var rightSlash = path.lastIndexOf("/");
- if (rightSlash === 0) {
- return "/";
- }
-
- // "4. Output the characters of the uri-path from the first character up to,
- // but not including, the right-most %x2F ("/")."
- return path.slice(0, rightSlash);
-}
-
-function trimTerminator(str) {
- for (var t = 0; t < TERMINATORS.length; t++) {
- var terminatorIdx = str.indexOf(TERMINATORS[t]);
- if (terminatorIdx !== -1) {
- str = str.substr(0,terminatorIdx);
- }
- }
-
- return str;
-}
-
-function parseCookiePair(cookiePair, looseMode) {
- cookiePair = trimTerminator(cookiePair);
-
- var firstEq = cookiePair.indexOf('=');
- if (looseMode) {
- if (firstEq === 0) { // '=' is immediately at start
- cookiePair = cookiePair.substr(1);
- firstEq = cookiePair.indexOf('='); // might still need to split on '='
- }
- } else { // non-loose mode
- if (firstEq <= 0) { // no '=' or is at start
- return; // needs to have non-empty "cookie-name"
- }
- }
-
- var cookieName, cookieValue;
- if (firstEq <= 0) {
- cookieName = "";
- cookieValue = cookiePair.trim();
- } else {
- cookieName = cookiePair.substr(0, firstEq).trim();
- cookieValue = cookiePair.substr(firstEq+1).trim();
- }
-
- if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) {
- return;
- }
-
- var c = new Cookie();
- c.key = cookieName;
- c.value = cookieValue;
- return c;
-}
-
-function parse(str, options) {
- if (!options || typeof options !== 'object') {
- options = {};
- }
- str = str.trim();
-
- // We use a regex to parse the "name-value-pair" part of S5.2
- var firstSemi = str.indexOf(';'); // S5.2 step 1
- var cookiePair = (firstSemi === -1) ? str : str.substr(0, firstSemi);
- var c = parseCookiePair(cookiePair, !!options.loose);
- if (!c) {
- return;
- }
-
- if (firstSemi === -1) {
- return c;
- }
-
- // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string
- // (including the %x3B (";") in question)." plus later on in the same section
- // "discard the first ";" and trim".
- var unparsed = str.slice(firstSemi + 1).trim();
-
- // "If the unparsed-attributes string is empty, skip the rest of these
- // steps."
- if (unparsed.length === 0) {
- return c;
- }
-
- /*
- * S5.2 says that when looping over the items "[p]rocess the attribute-name
- * and attribute-value according to the requirements in the following
- * subsections" for every item. Plus, for many of the individual attributes
- * in S5.3 it says to use the "attribute-value of the last attribute in the
- * cookie-attribute-list". Therefore, in this implementation, we overwrite
- * the previous value.
- */
- var cookie_avs = unparsed.split(';');
- while (cookie_avs.length) {
- var av = cookie_avs.shift().trim();
- if (av.length === 0) { // happens if ";;" appears
- continue;
- }
- var av_sep = av.indexOf('=');
- var av_key, av_value;
-
- if (av_sep === -1) {
- av_key = av;
- av_value = null;
- } else {
- av_key = av.substr(0,av_sep);
- av_value = av.substr(av_sep+1);
- }
-
- av_key = av_key.trim().toLowerCase();
-
- if (av_value) {
- av_value = av_value.trim();
- }
-
- switch(av_key) {
- case 'expires': // S5.2.1
- if (av_value) {
- var exp = parseDate(av_value);
- // "If the attribute-value failed to parse as a cookie date, ignore the
- // cookie-av."
- if (exp) {
- // over and underflow not realistically a concern: V8's getTime() seems to
- // store something larger than a 32-bit time_t (even with 32-bit node)
- c.expires = exp;
- }
- }
- break;
-
- case 'max-age': // S5.2.2
- if (av_value) {
- // "If the first character of the attribute-value is not a DIGIT or a "-"
- // character ...[or]... If the remainder of attribute-value contains a
- // non-DIGIT character, ignore the cookie-av."
- if (/^-?[0-9]+$/.test(av_value)) {
- var delta = parseInt(av_value, 10);
- // "If delta-seconds is less than or equal to zero (0), let expiry-time
- // be the earliest representable date and time."
- c.setMaxAge(delta);
- }
- }
- break;
-
- case 'domain': // S5.2.3
- // "If the attribute-value is empty, the behavior is undefined. However,
- // the user agent SHOULD ignore the cookie-av entirely."
- if (av_value) {
- // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E
- // (".") character."
- var domain = av_value.trim().replace(/^\./, '');
- if (domain) {
- // "Convert the cookie-domain to lower case."
- c.domain = domain.toLowerCase();
- }
- }
- break;
-
- case 'path': // S5.2.4
- /*
- * "If the attribute-value is empty or if the first character of the
- * attribute-value is not %x2F ("/"):
- * Let cookie-path be the default-path.
- * Otherwise:
- * Let cookie-path be the attribute-value."
- *
- * We'll represent the default-path as null since it depends on the
- * context of the parsing.
- */
- c.path = av_value && av_value[0] === "/" ? av_value : null;
- break;
-
- case 'secure': // S5.2.5
- /*
- * "If the attribute-name case-insensitively matches the string "Secure",
- * the user agent MUST append an attribute to the cookie-attribute-list
- * with an attribute-name of Secure and an empty attribute-value."
- */
- c.secure = true;
- break;
-
- case 'httponly': // S5.2.6 -- effectively the same as 'secure'
- c.httpOnly = true;
- break;
-
- default:
- c.extensions = c.extensions || [];
- c.extensions.push(av);
- break;
- }
- }
-
- return c;
-}
-
-// avoid the V8 deoptimization monster!
-function jsonParse(str) {
- var obj;
- try {
- obj = JSON.parse(str);
- } catch (e) {
- return e;
- }
- return obj;
-}
-
-function fromJSON(str) {
- if (!str) {
- return null;
- }
-
- var obj;
- if (typeof str === 'string') {
- obj = jsonParse(str);
- if (obj instanceof Error) {
- return null;
- }
- } else {
- // assume it's an Object
- obj = str;
- }
-
- var c = new Cookie();
- for (var i=0; i 1) {
- var lindex = path.lastIndexOf('/');
- if (lindex === 0) {
- break;
- }
- path = path.substr(0,lindex);
- permutations.push(path);
- }
- permutations.push('/');
- return permutations;
-}
-
-function getCookieContext(url) {
- if (url instanceof Object) {
- return url;
- }
- // NOTE: decodeURI will throw on malformed URIs (see GH-32).
- // Therefore, we will just skip decoding for such URIs.
- try {
- url = decodeURI(url);
- }
- catch(err) {
- // Silently swallow error
- }
-
- return urlParse(url);
-}
-
-function Cookie(options) {
- options = options || {};
-
- Object.keys(options).forEach(function(prop) {
- if (Cookie.prototype.hasOwnProperty(prop) &&
- Cookie.prototype[prop] !== options[prop] &&
- prop.substr(0,1) !== '_')
- {
- this[prop] = options[prop];
- }
- }, this);
-
- this.creation = this.creation || new Date();
-
- // used to break creation ties in cookieCompare():
- Object.defineProperty(this, 'creationIndex', {
- configurable: false,
- enumerable: false, // important for assert.deepEqual checks
- writable: true,
- value: ++Cookie.cookiesCreated
- });
-}
-
-Cookie.cookiesCreated = 0; // incremented each time a cookie is created
-
-Cookie.parse = parse;
-Cookie.fromJSON = fromJSON;
-
-Cookie.prototype.key = "";
-Cookie.prototype.value = "";
-
-// the order in which the RFC has them:
-Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity
-Cookie.prototype.maxAge = null; // takes precedence over expires for TTL
-Cookie.prototype.domain = null;
-Cookie.prototype.path = null;
-Cookie.prototype.secure = false;
-Cookie.prototype.httpOnly = false;
-Cookie.prototype.extensions = null;
-
-// set by the CookieJar:
-Cookie.prototype.hostOnly = null; // boolean when set
-Cookie.prototype.pathIsDefault = null; // boolean when set
-Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse
-Cookie.prototype.lastAccessed = null; // Date when set
-Object.defineProperty(Cookie.prototype, 'creationIndex', {
- configurable: true,
- enumerable: false,
- writable: true,
- value: 0
-});
-
-Cookie.serializableProperties = Object.keys(Cookie.prototype)
- .filter(function(prop) {
- return !(
- Cookie.prototype[prop] instanceof Function ||
- prop === 'creationIndex' ||
- prop.substr(0,1) === '_'
- );
- });
-
-Cookie.prototype.inspect = function inspect() {
- var now = Date.now();
- return 'Cookie="'+this.toString() +
- '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') +
- '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') +
- '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') +
- '"';
-};
-
-// Use the new custom inspection symbol to add the custom inspect function if
-// available.
-if (util.inspect.custom) {
- Cookie.prototype[util.inspect.custom] = Cookie.prototype.inspect;
-}
-
-Cookie.prototype.toJSON = function() {
- var obj = {};
-
- var props = Cookie.serializableProperties;
- for (var i=0; i=0.8"
- },
- "files": [
- "lib"
- ],
- "homepage": "https://github.com/salesforce/tough-cookie",
- "keywords": [
- "HTTP",
- "cookie",
- "cookies",
- "set-cookie",
- "cookiejar",
- "jar",
- "RFC6265",
- "RFC2965"
- ],
- "license": "BSD-3-Clause",
- "main": "./lib/cookie",
- "name": "tough-cookie",
- "repository": {
- "type": "git",
- "url": "git://github.com/salesforce/tough-cookie.git"
- },
- "scripts": {
- "cover": "nyc --reporter=lcov --reporter=html vows test/*_test.js",
- "test": "vows test/*_test.js"
- },
- "version": "2.4.3"
-}
diff --git a/node_modules/request/package.json b/node_modules/request/package.json
index 4714c72..eebe372 100644
--- a/node_modules/request/package.json
+++ b/node_modules/request/package.json
@@ -1,12 +1,10 @@
{
"_from": "request@^2.88.0",
- "_id": "request@2.88.0",
+ "_id": "request@2.88.2",
"_inBundle": false,
- "_integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "_integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"_location": "/request",
- "_phantomChildren": {
- "psl": "1.1.31"
- },
+ "_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
@@ -20,8 +18,8 @@
"_requiredBy": [
"/jsdom"
],
- "_resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
- "_shasum": "9c2fca4f7d35b592efe57c7f0a55e81052124fef",
+ "_resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "_shasum": "d73c918731cb5a87da047e207234146f664d12b3",
"_spec": "request@^2.88.0",
"_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\jsdom",
"author": {
@@ -40,7 +38,7 @@
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
- "har-validator": "~5.1.0",
+ "har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
@@ -50,11 +48,11 @@
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
- "tough-cookie": "~2.4.3",
+ "tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
},
- "deprecated": false,
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
"description": "Simplified HTTP request client.",
"devDependencies": {
"bluebird": "^3.2.1",
@@ -64,13 +62,13 @@
"codecov": "^3.0.4",
"coveralls": "^3.0.2",
"function-bind": "^1.0.2",
- "istanbul": "^0.4.0",
"karma": "^3.0.0",
"karma-browserify": "^5.0.1",
"karma-cli": "^1.0.0",
"karma-coverage": "^1.0.0",
"karma-phantomjs-launcher": "^1.0.0",
"karma-tap": "^3.0.1",
+ "nyc": "^14.1.1",
"phantomjs-prebuilt": "^2.1.3",
"rimraf": "^2.2.8",
"server-destroy": "^1.0.1",
@@ -79,7 +77,7 @@
"taper": "^0.5.0"
},
"engines": {
- "node": ">= 4"
+ "node": ">= 6"
},
"files": [
"lib/",
@@ -111,7 +109,7 @@
"test": "npm run lint && npm run test-ci && npm run test-browser",
"test-browser": "node tests/browser/start.js",
"test-ci": "taper tests/test-*.js",
- "test-cov": "istanbul cover tape tests/test-*.js"
+ "test-cov": "nyc --reporter=lcov tape tests/test-*.js"
},
- "version": "2.88.0"
+ "version": "2.88.2"
}
diff --git a/node_modules/request/request.js b/node_modules/request/request.js
index 90bed4f..198b760 100644
--- a/node_modules/request/request.js
+++ b/node_modules/request/request.js
@@ -828,8 +828,7 @@ Request.prototype.start = function () {
if (isConnecting) {
var onReqSockConnect = function () {
socket.removeListener('connect', onReqSockConnect)
- clearTimeout(self.timeoutTimer)
- self.timeoutTimer = null
+ self.clearTimeout()
setReqTimeout()
}
@@ -874,10 +873,7 @@ Request.prototype.onRequestError = function (error) {
self.req.end()
return
}
- if (self.timeout && self.timeoutTimer) {
- clearTimeout(self.timeoutTimer)
- self.timeoutTimer = null
- }
+ self.clearTimeout()
self.emit('error', error)
}
@@ -964,10 +960,7 @@ Request.prototype.onRequestResponse = function (response) {
if (self.setHost) {
self.removeHeader('host')
}
- if (self.timeout && self.timeoutTimer) {
- clearTimeout(self.timeoutTimer)
- self.timeoutTimer = null
- }
+ self.clearTimeout()
var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar
var addCookie = function (cookie) {
@@ -1172,6 +1165,7 @@ Request.prototype.abort = function () {
self.response.destroy()
}
+ self.clearTimeout()
self.emit('abort')
}
@@ -1448,7 +1442,7 @@ Request.prototype.jar = function (jar) {
cookies = false
self._disableCookies = true
} else {
- var targetCookieJar = (jar && jar.getCookieString) ? jar : globalCookieJar
+ var targetCookieJar = jar.getCookieString ? jar : globalCookieJar
var urihref = self.uri.href
// fetch cookie in the Specified host
if (targetCookieJar) {
@@ -1532,6 +1526,7 @@ Request.prototype.resume = function () {
}
Request.prototype.destroy = function () {
var self = this
+ this.clearTimeout()
if (!self._ended) {
self.end()
} else if (self.response) {
@@ -1539,6 +1534,13 @@ Request.prototype.destroy = function () {
}
}
+Request.prototype.clearTimeout = function () {
+ if (this.timeoutTimer) {
+ clearTimeout(this.timeoutTimer)
+ this.timeoutTimer = null
+ }
+}
+
Request.defaultProxyHeaderWhiteList =
Tunnel.defaultProxyHeaderWhiteList.slice()
diff --git a/node_modules/safe-buffer/README.md b/node_modules/safe-buffer/README.md
index e9a81af..356e351 100644
--- a/node_modules/safe-buffer/README.md
+++ b/node_modules/safe-buffer/README.md
@@ -22,6 +22,8 @@
npm install safe-buffer
```
+[Get supported safe-buffer with the Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-safe-buffer?utm_source=npm-safe-buffer&utm_medium=referral&utm_campaign=readme)
+
## usage
The goal of this package is to provide a safe replacement for the node.js `Buffer`.
diff --git a/node_modules/safe-buffer/index.js b/node_modules/safe-buffer/index.js
index 22438da..054c8d3 100644
--- a/node_modules/safe-buffer/index.js
+++ b/node_modules/safe-buffer/index.js
@@ -20,6 +20,8 @@ function SafeBuffer (arg, encodingOrOffset, length) {
return Buffer(arg, encodingOrOffset, length)
}
+SafeBuffer.prototype = Object.create(Buffer.prototype)
+
// Copy static methods from Buffer
copyProps(Buffer, SafeBuffer)
diff --git a/node_modules/safe-buffer/package.json b/node_modules/safe-buffer/package.json
index 390f8d5..d4d7870 100644
--- a/node_modules/safe-buffer/package.json
+++ b/node_modules/safe-buffer/package.json
@@ -1,8 +1,8 @@
{
"_from": "safe-buffer@^5.1.2",
- "_id": "safe-buffer@5.1.2",
+ "_id": "safe-buffer@5.2.0",
"_inBundle": false,
- "_integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "_integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
"_location": "/safe-buffer",
"_phantomChildren": {},
"_requested": {
@@ -19,8 +19,8 @@
"/request",
"/tunnel-agent"
],
- "_resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "_shasum": "991ec69d296e0313747d59bdfd2b745c35f8828d",
+ "_resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+ "_shasum": "b74daec49b1148f88c64b68d49b1e815c1f2f519",
"_spec": "safe-buffer@^5.1.2",
"_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\request",
"author": {
@@ -59,5 +59,5 @@
"test": "standard && tape test/*.js"
},
"types": "index.d.ts",
- "version": "5.1.2"
+ "version": "5.2.0"
}
diff --git a/node_modules/saxes/CHANGELOG.md b/node_modules/saxes/CHANGELOG.md
index 0ef36fe..ae9e7ab 100644
--- a/node_modules/saxes/CHANGELOG.md
+++ b/node_modules/saxes/CHANGELOG.md
@@ -1,3 +1,32 @@
+
+## [3.1.11](https://github.com/lddubeau/saxes/compare/v3.1.10...v3.1.11) (2019-06-25)
+
+
+### Bug Fixes
+
+* pay attention to comments and processing instructions in DTDs ([52ffd90](https://github.com/lddubeau/saxes/commit/52ffd90)), closes [#19](https://github.com/lddubeau/saxes/issues/19)
+
+
+### Performance Improvements
+
+* check the most common case first ([40a34d5](https://github.com/lddubeau/saxes/commit/40a34d5))
+* improve some more the speed of ]]> detection ([a0216cd](https://github.com/lddubeau/saxes/commit/a0216cd))
+* move more common/valid cases first ([a65586e](https://github.com/lddubeau/saxes/commit/a65586e))
+* split sText into two specialized loops ([732325e](https://github.com/lddubeau/saxes/commit/732325e))
+* use specialized code for sAttribValueQuoted ([6c484f3](https://github.com/lddubeau/saxes/commit/6c484f3))
+
+
+
+
+## [3.1.10](https://github.com/lddubeau/saxes/compare/v3.1.9...v3.1.10) (2019-06-11)
+
+
+### Performance Improvements
+
+* improve the check for ]]> in character data ([21df9b5](https://github.com/lddubeau/saxes/commit/21df9b5))
+
+
+
## [3.1.9](https://github.com/lddubeau/saxes/compare/v3.1.7...v3.1.9) (2019-02-25)
diff --git a/node_modules/saxes/lib/saxes.js b/node_modules/saxes/lib/saxes.js
index 95b23f1..3e26a85 100644
--- a/node_modules/saxes/lib/saxes.js
+++ b/node_modules/saxes/lib/saxes.js
@@ -1,8 +1,8 @@
"use strict";
-const { isS, isChar, isNameStartChar, isNameChar, S_LIST } =
+const { isS, isChar, isNameStartChar, isNameChar, S_LIST, NAME_RE } =
require("xmlchars/xml/1.0/ed5");
-const { isNCNameStartChar, isNCNameChar } = require("xmlchars/xmlns/1.0/ed3");
+const { isNCNameStartChar, isNCNameChar, NC_NAME_RE } = require("xmlchars/xmlns/1.0/ed3");
const XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace";
const XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/";
@@ -22,16 +22,23 @@ const XML_ENTITIES = {
apos: "'",
};
+const S_INITIAL = "sInitial"; // initial state
const S_BEGIN_WHITESPACE = "sBeginWhitespace"; // leading whitespace
+const S_DOCTYPE = "sDoctype"; // . The text before that index has been checked already,
- // and should not be checked twice.
- this.textCheckedBefore = 0;
const xmlnsOpt = this.xmlnsOpt = !!this.opt.xmlns;
if (xmlnsOpt) {
@@ -349,6 +359,7 @@ class SaxesParser {
//
this.nameStartCheck = isNCNameStartChar;
this.nameCheck = isNCNameChar;
+ this.isName = isNCName;
this.processAttribs = this.processAttribsNS;
this.pushAttrib = this.pushAttribNS;
@@ -362,6 +373,7 @@ class SaxesParser {
else {
this.nameStartCheck = isNameStartChar;
this.nameCheck = isNameChar;
+ this.isName = isName;
this.processAttribs = this.processAttribsPlain;
this.pushAttrib = this.pushAttribPlain;
}
@@ -569,7 +581,7 @@ class SaxesParser {
let skip = 1;
switch (code) {
case CR:
- // We may get undefined if we read past the end of the chunk, which is
+ // We may get NaN if we read past the end of the chunk, which is
// fine.
if (chunk.charCodeAt(i + 1) === NL) {
// A \r\n sequence is converted to \n so we have to skip over the next
@@ -627,7 +639,7 @@ class SaxesParser {
*
* @param {string} buffer The name of the buffer to save into.
*
- * @return {string|undefined} The character that made the capture end, or
+ * @return {number|undefined} The character code that made the capture end, or
* ``undefined`` if we hit the end of the chunk.
*/
captureTo(chars, buffer) {
@@ -682,7 +694,7 @@ class SaxesParser {
*
* @private
*
- * @return {string|undefined} The character that made the test fail, or
+ * @return {number|undefined} The character code that made the test fail, or
* ``undefined`` if we hit the end of the chunk.
*/
captureNameChars() {
@@ -710,7 +722,7 @@ class SaxesParser {
*
* @param {string} buffer The name of the buffer to save into.
*
- * @return {string|undefined} The character that made the test fail, or
+ * @return {number|undefined} The character code that made the test fail, or
* ``undefined`` if we hit the end of the chunk.
*/
captureWhileNameCheck(buffer) {
@@ -731,21 +743,18 @@ class SaxesParser {
}
/**
- * Skip characters while a condition is true.
+ * Skip white spaces.
*
* @private
*
- * @param {CharacterTest} test A test to perform on each character. The skip
- * ends when the test returns false.
- *
- * @return {string|undefined} The character that made the test fail, or
+ * @return {string|undefined} The character that ended the skip, or
* ``undefined`` if we hit the end of the chunk.
*/
- skipWhile(test) {
+ skipSpaces() {
const { limit } = this;
while (this.i < limit) {
const c = this.getCode();
- if (!test(c)) {
+ if (!isS(c)) {
return c;
}
}
@@ -756,29 +765,34 @@ class SaxesParser {
// STATE HANDLERS
/** @private */
- sBeginWhitespace() {
- const { limit } = this;
- let c = this.getCode();
- if (this.initial && c === 0xFEFF) {
- this.initial = false;
- if (this.i >= limit) {
- return;
- }
- c = this.getCode();
+ sInitial() {
+ // We are essentially peeking at the first character of the chunk. Since
+ // S_INITIAL can be in effect only when we start working on the first chunk,
+ // the index at which we must look is necessarily 0. Note also that the
+ // following tests do not depend on decoding surrogates.
+ const c = this.chunk.charCodeAt(0);
+ // If the initial character is 0xFEFF, ignore it.
+ if (c === 0xFEFF) {
+ this.i++;
+ this.column++;
}
- else {
- this.initial = false;
- }
- // We cannot use skipWhile here because we have to use the previously
- // read character first.
- while (this.i < limit && isS(c)) {
- c = this.getCode();
+ else if (isS(c)) {
+ this.i++;
+ this.column++;
+ // An XML declaration cannot appear after initial spaces.
this.xmlDeclPossible = false;
}
+
+ this.state = S_BEGIN_WHITESPACE;
+ }
+
+ /** @private */
+ sBeginWhitespace() {
+ const c = this.skipSpaces();
if (c === LESS) {
this.state = S_OPEN_WAKA;
}
- else {
+ else if (c) {
// have to process this as a text node.
// weird, but happens.
if (!this.reportedTextBeforeRoot) {
@@ -786,7 +800,6 @@ class SaxesParser {
this.reportedTextBeforeRoot = true;
}
this.text = String.fromCodePoint(c);
- this.textCheckedBefore = 0;
this.state = S_TEXT;
this.xmlDeclPossible = false;
}
@@ -794,42 +807,148 @@ class SaxesParser {
/** @private */
sText() {
- const c = this.captureTo(TEXT_TERMINATOR, "text");
+ //
+ // We did try a version of saxes where the S_TEXT state was split in two
+ // states: one for text inside the root element, and one for text
+ // outside. This was avoiding having to test this.tags.length to decide what
+ // implementation to actually use.
+ //
+ // Peformance testing on gigabyte-size files did not show any advantage to
+ // using the two states solution instead of the current one. Conversely, it
+ // made the code a bit more complicated elsewhere. For instance, a comment
+ // can appear before the root element so when a comment ended it was
+ // necessary to determine whether to return to the S_TEXT state or to the
+ // new text-outside-root state.
+ //
+ if (this.tags.length !== 0) {
+ this.handleTextInRoot();
+ }
+ else {
+ this.handleTextOutsideRoot();
+ }
+ }
- if ((!this.sawRoot || this.closedRoot) &&
- (/\S/.test(this.text) || c === AMP)) {
- // We use the reportedTextBeforeRoot and reportedTextAfterRoot flags
- // to avoid reporting errors for every single character that is out of
- // place.
- if (!this.sawRoot && !this.reportedTextBeforeRoot) {
- this.fail("text data outside of root node.");
- this.reportedTextBeforeRoot = true;
+ /** @private */
+ handleTextInRoot() {
+ // This is essentially a specialized version of captureTo which is optimized
+ // for performing the ]]> check. A previous version of this code, checked
+ // ``this.text`` for the presence of ]]>. It simplified the code but was
+ // very costly when character data contained a lot of entities to be parsed.
+ //
+ // Since we are using a specialized loop, we also keep track of the presence
+ // of ]]> in text data. The sequence ]]> is forbidden to appear as-is.
+ //
+ const { chunk, limit, i: start } = this;
+ let { forbiddenState } = this;
+ let c;
+ // eslint-disable-next-line no-labels, no-restricted-syntax
+ scanLoop:
+ while (this.i < limit) {
+ const code = this.getCode();
+ switch (code) {
+ case LESS:
+ this.state = S_OPEN_WAKA;
+ c = code;
+ forbiddenState = FORBIDDEN_START;
+ // eslint-disable-next-line no-labels
+ break scanLoop;
+ case AMP:
+ this.state = S_ENTITY;
+ this.entityReturnState = S_TEXT;
+ c = code;
+ forbiddenState = FORBIDDEN_START;
+ // eslint-disable-next-line no-labels
+ break scanLoop;
+ case CLOSE_BRACKET:
+ switch (forbiddenState) {
+ case FORBIDDEN_START:
+ forbiddenState = FORBIDDEN_BRACKET;
+ break;
+ case FORBIDDEN_BRACKET:
+ forbiddenState = FORBIDDEN_BRACKET_BRACKET;
+ break;
+ case FORBIDDEN_BRACKET_BRACKET:
+ break;
+ default:
+ throw new Error("impossible state");
+ }
+ break;
+ case GREATER:
+ if (forbiddenState === FORBIDDEN_BRACKET_BRACKET) {
+ this.fail("the string \"]]>\" is disallowed in char data.");
+ }
+ forbiddenState = FORBIDDEN_START;
+ break;
+ default:
+ forbiddenState = FORBIDDEN_START;
}
+ }
+ this.forbiddenState = forbiddenState;
- if (this.closedRoot && !this.reportedTextAfterRoot) {
- this.fail("text data outside of root node.");
- this.reportedTextAfterRoot = true;
+ // This is faster than adding codepoints one by one.
+ this.text += chunk.substring(start,
+ c === undefined ? undefined :
+ (this.i - (c <= 0xFFFF ? 1 : 2)));
+ }
+
+ /** @private */
+ handleTextOutsideRoot() {
+ // This is essentially a specialized version of captureTo which is optimized
+ // for performing the ]]> check. A previous version of this code, checked
+ // ``this.text`` for the presence of ]]>. It simplified the code but was
+ // very costly when character data contained a lot of entities to be parsed.
+ //
+ // Since we are using a specialized loop, we also keep track of the presence
+ // of non-space characters in the text since these are errors when appearing
+ // outside the document root element.
+ //
+ const { chunk, limit, i: start } = this;
+ let nonSpace = false;
+ let c;
+ // eslint-disable-next-line no-labels, no-restricted-syntax
+ outRootLoop:
+ while (this.i < limit) {
+ const code = this.getCode();
+ switch (code) {
+ case LESS:
+ this.state = S_OPEN_WAKA;
+ c = code;
+ // eslint-disable-next-line no-labels
+ break outRootLoop;
+ case AMP:
+ this.state = S_ENTITY;
+ this.entityReturnState = S_TEXT;
+ c = code;
+ nonSpace = true;
+ // eslint-disable-next-line no-labels
+ break outRootLoop;
+ default:
+ if (!isS(code)) {
+ nonSpace = true;
+ }
}
}
- if (this.text.includes("]]>", this.textCheckedBefore)) {
- this.fail("the string \"]]>\" is disallowed in char data.");
+ // This is faster than adding codepoints one by one.
+ this.text += chunk.substring(start,
+ c === undefined ? undefined :
+ (this.i - (c <= 0xFFFF ? 1 : 2)));
+
+ if (!nonSpace) {
+ return;
}
- // We have to go back two spaces so that we can catch the case where on a
- // previous write call, the text buffer ended on ``]]`` and we started
- // with ``>`` this time around.
- this.textCheckedBefore = this.text.length - 2;
+ // We use the reportedTextBeforeRoot and reportedTextAfterRoot flags
+ // to avoid reporting errors for every single character that is out of
+ // place.
+ if (!this.sawRoot && !this.reportedTextBeforeRoot) {
+ this.fail("text data outside of root node.");
+ this.reportedTextBeforeRoot = true;
+ }
- switch (c) {
- case LESS:
- this.state = S_OPEN_WAKA;
- break;
- case AMP:
- this.state = S_ENTITY_FIRST_CHAR;
- this.entityReturnState = S_TEXT;
- break;
- default:
+ if (this.closedRoot && !this.reportedTextAfterRoot) {
+ this.fail("text data outside of root node.");
+ this.reportedTextAfterRoot = true;
}
}
@@ -866,8 +985,7 @@ class SaxesParser {
/** @private */
sOpenWakaBang() {
- const c = String.fromCodePoint(this.getCode());
- this.openWakaBang += c;
+ this.openWakaBang += String.fromCodePoint(this.getCode());
switch (this.openWakaBang) {
case "[CDATA[":
if (!this.sawRoot && !this.reportedTextBeforeRoot) {
@@ -916,17 +1034,17 @@ class SaxesParser {
else if (c) {
this.doctype += String.fromCodePoint(c);
if (c === OPEN_BRACKET) {
- this.state = S_DOCTYPE_DTD;
+ this.state = S_DTD;
}
else if (isQuote(c)) {
- this.state = S_DOCTYPE_QUOTED;
+ this.state = S_DOCTYPE_QUOTE;
this.q = c;
}
}
}
/** @private */
- sDoctypeQuoted() {
+ sDoctypeQuote() {
const { q } = this;
if (this.captureToChar(q, "doctype")) {
this.doctype += String.fromCodePoint(q);
@@ -936,8 +1054,8 @@ class SaxesParser {
}
/** @private */
- sDoctypeDTD() {
- const c = this.captureTo(DOCTYPE_DTD_TERMINATOR, "doctype");
+ sDTD() {
+ const c = this.captureTo(DTD_TERMINATOR, "doctype");
if (!c) {
return;
}
@@ -946,22 +1064,100 @@ class SaxesParser {
if (c === CLOSE_BRACKET) {
this.state = S_DOCTYPE;
}
+ else if (c === LESS) {
+ this.state = S_DTD_OPEN_WAKA;
+ }
else if (isQuote(c)) {
- this.state = S_DOCTYPE_DTD_QUOTED;
+ this.state = S_DTD_QUOTED;
this.q = c;
}
}
/** @private */
- sDoctypeDTDQuoted() {
+ sDTDQuoted() {
const { q } = this;
if (this.captureToChar(q, "doctype")) {
this.doctype += String.fromCodePoint(q);
- this.state = S_DOCTYPE_DTD;
+ this.state = S_DTD;
this.q = null;
}
}
+ /** @private */
+ sDTDOpenWaka() {
+ const c = this.getCode();
+ this.doctype += String.fromCodePoint(c);
+ switch (c) {
+ case BANG:
+ this.state = S_DTD_OPEN_WAKA_BANG;
+ this.openWakaBang = "";
+ break;
+ case QUESTION:
+ this.state = S_DTD_PI;
+ break;
+ default:
+ this.state = S_DTD;
+ }
+ }
+
+ /** @private */
+ sDTDOpenWakaBang() {
+ const char = String.fromCodePoint(this.getCode());
+ const owb = this.openWakaBang += char;
+ this.doctype += char;
+ if (owb !== "-") {
+ this.state = owb === "--" ? S_DTD_COMMENT : S_DTD;
+ this.openWakaBang = "";
+ }
+ }
+
+ /** @private */
+ sDTDComment() {
+ if (this.captureToChar(MINUS, "doctype")) {
+ this.doctype += "-";
+ this.state = S_DTD_COMMENT_ENDING;
+ }
+ }
+
+ /** @private */
+ sDTDCommentEnding() {
+ const c = this.getCode();
+ this.doctype += String.fromCodePoint(c);
+ this.state = c === MINUS ? S_DTD_COMMENT_ENDED : S_DTD_COMMENT;
+ }
+
+ /** @private */
+ sDTDCommentEnded() {
+ const c = this.getCode();
+ this.doctype += String.fromCodePoint(c);
+ if (c === GREATER) {
+ this.state = S_DTD;
+ }
+ else {
+ this.fail("malformed comment.");
+ // will be recorded as
+ // a comment of " blah -- bloo "
+ this.state = S_DTD_COMMENT;
+ }
+ }
+
+ /** @private */
+ sDTDPI() {
+ if (this.captureToChar(QUESTION, "doctype")) {
+ this.doctype += "?";
+ this.state = S_DTD_PI_ENDING;
+ }
+ }
+
+ /** @private */
+ sDTDPIEnding() {
+ const c = this.getCode();
+ this.doctype += String.fromCodePoint(c);
+ if (c === GREATER) {
+ this.state = S_DTD;
+ }
+ }
+
/** @private */
sComment() {
if (this.captureToChar(MINUS, "comment")) {
@@ -1001,6 +1197,7 @@ class SaxesParser {
}
}
+ /** @private */
sCData() {
if (this.captureToChar(CLOSE_BRACKET, "cdata")) {
this.state = S_CDATA_ENDING;
@@ -1051,7 +1248,7 @@ class SaxesParser {
this.fail("processing instruction without a target.");
this.state = c === QUESTION ? S_PI_ENDING : S_PI_BODY;
}
- else if (c) {
+ else {
this.fail("disallowed character in processing instruction name.");
this.piTarget += String.fromCodePoint(c);
this.state = S_PI_REST;
@@ -1079,22 +1276,15 @@ class SaxesParser {
let c;
if (this.piIsXMLDecl) {
switch (this.xmlDeclState) {
- case S_XML_DECL_NAME_START:
- c = this.skipWhile((cx) => {
- if (isS(cx)) {
- this.requiredSeparator = undefined;
-
- return true;
- }
-
- if (cx !== QUESTION && this.requiredSeparator === SPACE_SEPARATOR) {
- this.fail("whitespace required.");
- }
-
- this.requiredSeparator = undefined;
-
- return false;
- });
+ case S_XML_DECL_NAME_START: {
+ c = this.getCode();
+ if (isS(c)) {
+ c = this.skipSpaces();
+ }
+ else if (this.requiredSeparator && c !== QUESTION) {
+ this.fail("whitespace required.");
+ }
+ this.requiredSeparator = false;
// The question mark character is not valid inside any of the XML
// declaration name/value pairs.
@@ -1108,6 +1298,7 @@ class SaxesParser {
this.xmlDeclName = String.fromCodePoint(c);
}
break;
+ }
case S_XML_DECL_NAME:
c = this.captureTo(XML_DECL_NAME_TERMINATOR, "xmlDeclName");
// The question mark character is not valid inside any of the XML
@@ -1143,7 +1334,7 @@ class SaxesParser {
return;
}
- if (c && !isS(c)) {
+ if (!isS(c)) {
if (c !== EQUAL) {
this.fail("value required.");
}
@@ -1159,7 +1350,7 @@ class SaxesParser {
return;
}
- if (c && !isS(c)) {
+ if (!isS(c)) {
if (!isQuote(c)) {
this.fail("value must be quoted.");
this.q = SPACE;
@@ -1210,7 +1401,7 @@ class SaxesParser {
}
this.xmlDeclName = this.xmlDeclValue = "";
this.xmlDeclState = S_XML_DECL_NAME_START;
- this.requiredSeparator = SPACE_SEPARATOR;
+ this.requiredSeparator = true;
}
break;
default:
@@ -1223,7 +1414,7 @@ class SaxesParser {
if (c === QUESTION) {
this.state = S_PI_ENDING;
}
- else if (c && !isS(c)) {
+ else if (!isS(c)) {
this.piBody = String.fromCodePoint(c);
}
}
@@ -1249,7 +1440,7 @@ class SaxesParser {
this.fail("XML declaration must contain a version.");
}
this.xmlDeclName = this.xmlDeclValue = "";
- this.requiredSeparator = undefined;
+ this.requiredSeparator = false;
this.piTarget = this.piBody = "";
this.state = S_TEXT;
}
@@ -1343,8 +1534,8 @@ class SaxesParser {
/** @private */
sAttrib() {
- const c = this.getCode();
- if (!c || isS(c)) {
+ const c = this.skipSpaces();
+ if (!c) {
return;
}
if (isNameStartChar(c)) {
@@ -1405,15 +1596,15 @@ class SaxesParser {
/** @private */
sAttribNameSawWhite() {
- const c = this.getCode();
- if (isS(c)) {
+ const c = this.skipSpaces();
+ if (!c) {
return;
}
if (c === EQUAL) {
this.state = S_ATTRIB_VALUE;
}
- else if (c) {
+ else {
this.fail("attribute without value.");
this.tag.attributes[this.name] = "";
this.text = "";
@@ -1439,7 +1630,7 @@ class SaxesParser {
this.q = c;
this.state = S_ATTRIB_VALUE_QUOTED;
}
- else if (c && !isS(c)) {
+ else if (!isS(c)) {
this.fail("unquoted attribute value.");
this.state = S_ATTRIB_VALUE_UNQUOTED;
this.text = String.fromCodePoint(c);
@@ -1448,19 +1639,40 @@ class SaxesParser {
/** @private */
sAttribValueQuoted() {
- const c = this.captureTo([this.q, AMP, LESS], "text");
- if (c === AMP) {
- this.state = S_ENTITY_FIRST_CHAR;
- this.entityReturnState = S_ATTRIB_VALUE_QUOTED;
- }
- else if (c === LESS) {
- this.fail("disallowed character.");
- }
- else if (c) {
- this.pushAttrib(this.name, this.text);
- this.name = this.text = "";
- this.q = null;
- this.state = S_ATTRIB_VALUE_CLOSED;
+ // We deliberately do not use captureTo here. The specialized code we use
+ // here is faster than using captureTo.
+ const { q } = this;
+ const { chunk, limit, i: start } = this;
+ // eslint-disable-next-line no-constant-condition
+ while (true) {
+ if (this.i >= limit) {
+ // This is faster than adding codepoints one by one.
+ this.text += chunk.substring(start);
+ return;
+ }
+ const code = this.getCode();
+ if (code === q || code === AMP || code === LESS) {
+ // This is faster than adding codepoints one by one.
+ const slice = chunk.substring(start,
+ this.i - (code <= 0xFFFF ? 1 : 2));
+ switch (code) {
+ case q:
+ this.pushAttrib(this.name, this.text + slice);
+ this.name = this.text = "";
+ this.q = null;
+ this.state = S_ATTRIB_VALUE_CLOSED;
+ return;
+ case AMP:
+ this.text += slice;
+ this.state = S_ENTITY;
+ this.entityReturnState = S_ATTRIB_VALUE_QUOTED;
+ return;
+ default:
+ this.text += slice;
+ this.fail("disallowed character.");
+ return;
+ }
+ }
}
}
@@ -1470,17 +1682,17 @@ class SaxesParser {
if (isS(c)) {
this.state = S_ATTRIB;
}
- else if (isNameStartChar(c)) {
- this.fail("no whitespace between attributes.");
- this.name = String.fromCodePoint(c);
- this.state = S_ATTRIB_NAME;
- }
else if (c === GREATER) {
this.openTag();
}
else if (c === FORWARD_SLASH) {
this.state = S_OPEN_TAG_SLASH;
}
+ else if (isNameStartChar(c)) {
+ this.fail("no whitespace between attributes.");
+ this.name = String.fromCodePoint(c);
+ this.state = S_ATTRIB_NAME;
+ }
else {
this.fail("disallowed character in attribute name.");
}
@@ -1490,7 +1702,7 @@ class SaxesParser {
sAttribValueUnquoted() {
const c = this.captureTo(ATTRIB_VALUE_UNQUOTED_TERMINATOR, "text");
if (c === AMP) {
- this.state = S_ENTITY_FIRST_CHAR;
+ this.state = S_ENTITY;
this.entityReturnState = S_ATTRIB_VALUE_UNQUOTED;
}
else if (c === LESS) {
@@ -1527,59 +1739,26 @@ class SaxesParser {
/** @private */
sCloseTagSawWhite() {
- const c = this.getCode();
+ const c = this.skipSpaces();
if (c === GREATER) {
this.closeTag();
}
- else if (c && !isS(c)) {
+ else if (c) {
this.fail("disallowed character in closing tag.");
}
}
/** @private */
- sEntityFirstChar() {
- const c = this.getCode();
- if (this.nameStartCheck(c) || c === HASH) {
- this.entity = String.fromCodePoint(c);
- this.state = S_ENTITY_REST;
- }
- else if (c === SEMICOLON) {
- this.fail("empty entity name.");
- this.text += "&;";
+ sEntity() {
+ if (this.captureToChar(SEMICOLON, "entity")) {
this.state = this.entityReturnState;
- }
- else {
- this.fail("disallowed first character in entity name.");
- this.entity = String.fromCodePoint(c);
- this.badEntityName = true;
- this.state = S_ENTITY_REST;
- }
- }
-
- /** @private */
- sEntityRest() {
- const c = this.captureWhileNameCheck("entity");
-
- if (c === SEMICOLON) {
- // Don't try to convert if the name was bad.
- if (this.badEntityName) {
- this.text += `&${this.entity}${String.fromCodePoint(c)}`;
+ if (this.entity === "") {
+ this.fail("empty entity name.");
+ this.text += "&;";
+ return;
}
- else {
- this.text += this.parseEntity(this.entity);
- }
- this.textCheckedBefore = this.text.length;
+ this.text += this.parseEntity(this.entity);
this.entity = "";
- this.state = this.entityReturnState;
- this.badEntityName = false;
- }
- else if (c) {
- this.fail("disallowed character in entity name.");
- this.text += `&${this.entity}${String.fromCodePoint(c)}`;
- this.textCheckedBefore = this.text.length;
- this.entity = "";
- this.state = this.entityReturnState;
- this.badEntityName = false;
}
}
@@ -1602,7 +1781,7 @@ class SaxesParser {
const tag = tags.pop();
this.fail(`unclosed tag: ${tag.name}`);
}
- if ((this.state !== S_BEGIN_WHITESPACE) &&
+ if ((this.state !== S_INITIAL) &&
(this.state !== S_TEXT)) {
this.fail("unexpected end.");
}
@@ -1623,7 +1802,6 @@ class SaxesParser {
closeText() {
this.ontext(this.text);
this.text = "";
- this.textCheckedBefore = 0;
}
/**
@@ -1668,7 +1846,7 @@ class SaxesParser {
*/
qname(name) {
const colon = name.indexOf(":");
- if (colon < 0) {
+ if (colon === -1) {
return { prefix: "", local: name };
}
@@ -1705,6 +1883,10 @@ class SaxesParser {
}
}
+ if (attribList.length === 0) {
+ return;
+ }
+
const seen = new Set();
// Note: do not apply default ns to attributes:
// http://www.w3.org/TR/REC-xml-names/#defaulting
@@ -1851,19 +2033,23 @@ class SaxesParser {
* @returns {string} The parsed entity.
*/
parseEntity(entity) {
- const defined = this.ENTITIES[entity];
- if (defined) {
- return defined;
+ if (entity[0] !== "#") {
+ const defined = this.ENTITIES[entity];
+ if (defined) {
+ return defined;
+ }
+
+ this.fail(this.isName(entity) ? "undefined entity." :
+ "disallowed character in entity name.");
+ return `&${entity};`;
}
let num = NaN;
- if (entity[0] === "#") {
- if (entity[1] === "x" && /^#x[0-9a-f]+$/i.test(entity)) {
- num = parseInt(entity.slice(2), 16);
- }
- else if (/^#[0-9]+$/.test(entity)) {
- num = parseInt(entity.slice(1), 10);
- }
+ if (entity[1] === "x" && /^#x[0-9a-f]+$/i.test(entity)) {
+ num = parseInt(entity.slice(2), 16);
+ }
+ else if (/^#[0-9]+$/.test(entity)) {
+ num = parseInt(entity.slice(1), 10);
}
// The character reference is required to match the CHAR production.
diff --git a/node_modules/saxes/package.json b/node_modules/saxes/package.json
index db9004f..541f155 100644
--- a/node_modules/saxes/package.json
+++ b/node_modules/saxes/package.json
@@ -1,26 +1,26 @@
{
- "_from": "saxes@^3.1.5",
- "_id": "saxes@3.1.9",
+ "_from": "saxes@^3.1.9",
+ "_id": "saxes@3.1.11",
"_inBundle": false,
- "_integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==",
+ "_integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
"_location": "/saxes",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
- "raw": "saxes@^3.1.5",
+ "raw": "saxes@^3.1.9",
"name": "saxes",
"escapedName": "saxes",
- "rawSpec": "^3.1.5",
+ "rawSpec": "^3.1.9",
"saveSpec": null,
- "fetchSpec": "^3.1.5"
+ "fetchSpec": "^3.1.9"
},
"_requiredBy": [
"/jsdom"
],
- "_resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz",
- "_shasum": "c1c197cd54956d88c09f960254b999e192d7058b",
- "_spec": "saxes@^3.1.5",
+ "_resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
+ "_shasum": "d59d1fd332ec92ad98a2e0b2ee644702384b1c5b",
+ "_spec": "saxes@^3.1.9",
"_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\jsdom",
"author": {
"name": "Louis-Dominique Dubeau",
@@ -31,21 +31,21 @@
},
"bundleDependencies": false,
"dependencies": {
- "xmlchars": "^1.3.1"
+ "xmlchars": "^2.1.1"
},
"deprecated": false,
"description": "An evented streaming XML parser in JavaScript",
"devDependencies": {
- "@commitlint/cli": "^7.5.2",
- "@commitlint/config-angular": "^7.5.0",
+ "@commitlint/cli": "^8.0.0",
+ "@commitlint/config-angular": "^8.0.0",
"chai": "^4.2.0",
- "conventional-changelog-cli": "^2.0.12",
- "eslint": "^5.14.1",
- "eslint-config-lddubeau-base": "^3.0.1",
- "husky": "^1.3.1",
- "mocha": "^6.0.1",
+ "conventional-changelog-cli": "^2.0.21",
+ "eslint": "^5.16.0",
+ "eslint-config-lddubeau-base": "^3.0.5",
+ "husky": "^2.5.0",
+ "mocha": "^6.1.4",
"renovate-config-lddubeau": "^1.0.0",
- "xml-conformance-suite": "^1.1.0"
+ "xml-conformance-suite": "^1.2.0"
},
"engines": {
"node": ">=8"
@@ -79,5 +79,5 @@
"version": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md"
},
"types": "lib/saxes.d.ts",
- "version": "3.1.9"
+ "version": "3.1.11"
}
diff --git a/node_modules/source-map-support/package.json b/node_modules/source-map-support/package.json
index e394276..ce1614a 100644
--- a/node_modules/source-map-support/package.json
+++ b/node_modules/source-map-support/package.json
@@ -21,7 +21,7 @@
"_resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
"_shasum": "0ae069e7fe3ba7538c64c98515e35339eac5a042",
"_spec": "source-map-support@~0.5.12",
- "_where": "/home/s2/Code/minifyfromhtml/node_modules/terser",
+ "_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\terser",
"bugs": {
"url": "https://github.com/evanw/node-source-map-support/issues"
},
diff --git a/node_modules/source-map/package.json b/node_modules/source-map/package.json
index f775032..ef7c858 100644
--- a/node_modules/source-map/package.json
+++ b/node_modules/source-map/package.json
@@ -1,5 +1,5 @@
{
- "_from": "source-map@~0.6.1",
+ "_from": "source-map@~0.6.0",
"_id": "source-map@0.6.1",
"_inBundle": false,
"_integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
@@ -8,24 +8,23 @@
"_requested": {
"type": "range",
"registry": true,
- "raw": "source-map@~0.6.1",
+ "raw": "source-map@~0.6.0",
"name": "source-map",
"escapedName": "source-map",
- "rawSpec": "~0.6.1",
+ "rawSpec": "~0.6.0",
"saveSpec": null,
- "fetchSpec": "~0.6.1"
+ "fetchSpec": "~0.6.0"
},
"_requiredBy": [
"/clean-css",
"/escodegen",
"/source-map-support",
- "/terser",
- "/uglify-js"
+ "/terser"
],
"_resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"_shasum": "74722af32e9614e9c287a8d0bbde48b5e2f1a263",
- "_spec": "source-map@~0.6.1",
- "_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\escodegen",
+ "_spec": "source-map@~0.6.0",
+ "_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\clean-css",
"author": {
"name": "Nick Fitzgerald",
"email": "nfitzgerald@mozilla.com"
diff --git a/node_modules/symbol-tree/README.md b/node_modules/symbol-tree/README.md
index 9314ce6..972db1a 100644
--- a/node_modules/symbol-tree/README.md
+++ b/node_modules/symbol-tree/README.md
@@ -55,6 +55,8 @@ tree.prependChild(grandparent, parent);
console.log(tree.firstChild(tree.firstChild(grandparent)) === a);
```
+See [api.md](api.md) for more documentation.
+
Testing
-------
Make sure you install the dependencies first:
@@ -72,7 +74,7 @@ API Documentation
## symbol-tree
-**Author:** Joris van der Wel
+**Author**: Joris van der Wel
* [symbol-tree](#module_symbol-tree)
* [SymbolTree](#exp_module_symbol-tree--SymbolTree) ⏏
@@ -107,7 +109,7 @@ API Documentation
### SymbolTree ⏏
-**Kind**: Exported class
+**Kind**: Exported class
#### new SymbolTree([description])
@@ -125,12 +127,12 @@ freeze your object.
`O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- object
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- object
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -139,11 +141,11 @@ Returns `true` if the object has any children. Otherwise it returns `false`.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -152,11 +154,11 @@ Returns the first child of the given object.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -165,11 +167,11 @@ Returns the last child of the given object.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -178,11 +180,11 @@ Returns the previous sibling of the given object.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -191,11 +193,11 @@ Returns the next sibling of the given object.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -204,11 +206,11 @@ Return the parent of the given object.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -217,11 +219,11 @@ Find the inclusive descendant that is last in tree order of the given object.
* `O(n)` (worst case) where `n` is the depth of the subtree of `object`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -233,7 +235,7 @@ and A comes before B in tree order.
* `O(n)` (worst case)
* `O(1)` (amortized when walking the entire tree)
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type | Description |
| --- | --- | --- |
@@ -251,7 +253,7 @@ and A comes after B in tree order.
* `O(n)` (worst case) where `n` is the amount of objects in the entire tree
* `O(1)` (amortized when walking the entire tree)
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type | Default | Description |
| --- | --- | --- | --- |
@@ -267,7 +269,7 @@ Append all children of the given object to an array.
* `O(n)` where `n` is the amount of children of the given `parent`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type | Default | Description |
| --- | --- | --- | --- |
@@ -284,7 +286,7 @@ Append all inclusive ancestors of the given object to an array.
* `O(n)` where `n` is the amount of ancestors of the given `object`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type | Default | Description |
| --- | --- | --- | --- |
@@ -301,7 +303,7 @@ Append all descendants of the given object to an array (in tree order).
* `O(n)` where `n` is the amount of objects in the sub-tree of the given `object`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type | Default | Description |
| --- | --- | --- | --- |
@@ -318,14 +320,14 @@ Iterate over all children of the given object
* `O(1)` for a single iteration
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- An iterable iterator (ES6)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- An iterable iterator (ES6)
| Param | Type | Default |
| --- | --- | --- |
-| parent | Object
| |
-| [options] | Object
| |
-| [options.reverse] | Boolean
| false
|
+| parent | Object
| |
+| [options] | Object
| |
+| [options.reverse] | Boolean
| false
|
@@ -334,12 +336,12 @@ Iterate over all the previous siblings of the given object. (in reverse tree ord
* `O(1)` for a single iteration
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- An iterable iterator (ES6)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- An iterable iterator (ES6)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -348,12 +350,12 @@ Iterate over all the next siblings of the given object. (in tree order)
* `O(1)` for a single iteration
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- An iterable iterator (ES6)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- An iterable iterator (ES6)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -362,12 +364,12 @@ Iterate over all inclusive ancestors of the given object
* `O(1)` for a single iteration
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- An iterable iterator (ES6)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- An iterable iterator (ES6)
| Param | Type |
| --- | --- |
-| object | Object
|
+| object | Object
|
@@ -379,14 +381,14 @@ Where `n` is the amount of objects in the sub-tree of the given `root`:
* `O(n)` (worst case for a single iteration)
* `O(n)` (amortized, when completing the iterator)
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- An iterable iterator (ES6)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- An iterable iterator (ES6)
| Param | Type | Default |
| --- | --- | --- |
-| root | Object
| |
-| options | Object
| |
-| [options.reverse] | Boolean
| false
|
+| root | Object
| |
+| options | Object
| |
+| [options.reverse] | Boolean
| false
|
@@ -396,12 +398,12 @@ Find the index of the given object (the number of preceding siblings).
* `O(n)` where `n` is the amount of preceding siblings
* `O(1)` (amortized, if the tree is not modified)
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Number
- The number of preceding siblings, or -1 if the object has no parent
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Number
- The number of preceding siblings, or -1 if the object has no parent
| Param | Type |
| --- | --- |
-| child | Object
|
+| child | Object
|
@@ -411,11 +413,11 @@ Calculate the number of children.
* `O(n)` where `n` is the amount of children
* `O(1)` (amortized, if the tree is not modified)
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type |
| --- | --- |
-| parent | Object
|
+| parent | Object
|
@@ -439,12 +441,12 @@ where `o` is the amount of children of the lowest common ancestor of `left` and
* `O(n + m + o)` (worst case)
* `O(n + m)` (amortized, if the tree is not modified)
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
| Param | Type |
| --- | --- |
-| left | Object
|
-| right | Object
|
+| left | Object
|
+| right | Object
|
@@ -454,12 +456,12 @@ Has no effect if already removed.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- removeObject
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- removeObject
| Param | Type |
| --- | --- |
-| removeObject | Object
|
+| removeObject | Object
|
@@ -469,8 +471,8 @@ Insert the given object before the reference object.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- newObject
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- newObject
**Throws**:
- Error
If the newObject is already present in this SymbolTree
@@ -478,8 +480,8 @@ Insert the given object before the reference object.
| Param | Type |
| --- | --- |
-| referenceObject | Object
|
-| newObject | Object
|
+| referenceObject | Object
|
+| newObject | Object
|
@@ -489,8 +491,8 @@ Insert the given object after the reference object.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- newObject
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- newObject
**Throws**:
- Error
If the newObject is already present in this SymbolTree
@@ -498,8 +500,8 @@ Insert the given object after the reference object.
| Param | Type |
| --- | --- |
-| referenceObject | Object
|
-| newObject | Object
|
+| referenceObject | Object
|
+| newObject | Object
|
@@ -509,8 +511,8 @@ Insert the given object as the first child of the given reference object.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- newObject
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- newObject
**Throws**:
- Error
If the newObject is already present in this SymbolTree
@@ -518,8 +520,8 @@ Insert the given object as the first child of the given reference object.
| Param | Type |
| --- | --- |
-| referenceObject | Object
|
-| newObject | Object
|
+| referenceObject | Object
|
+| newObject | Object
|
@@ -529,8 +531,8 @@ Insert the given object as the last child of the given reference object.
* `O(1)`
-**Kind**: instance method of [SymbolTree](#exp_module_symbol-tree--SymbolTree)
-**Returns**: Object
- newObject
+**Kind**: instance method of [SymbolTree
](#exp_module_symbol-tree--SymbolTree)
+**Returns**: Object
- newObject
**Throws**:
- Error
If the newObject is already present in this SymbolTree
@@ -538,6 +540,6 @@ Insert the given object as the last child of the given reference object.
| Param | Type |
| --- | --- |
-| referenceObject | Object
|
-| newObject | Object
|
+| referenceObject | Object
|
+| newObject | Object
|
diff --git a/node_modules/symbol-tree/lib/SymbolTree.js b/node_modules/symbol-tree/lib/SymbolTree.js
index a4e596a..b2b8f2e 100644
--- a/node_modules/symbol-tree/lib/SymbolTree.js
+++ b/node_modules/symbol-tree/lib/SymbolTree.js
@@ -669,6 +669,8 @@ class SymbolTree {
removeNode.parent = null;
removeNode.previousSibling = null;
removeNode.nextSibling = null;
+ removeNode.cachedIndex = -1;
+ removeNode.cachedIndexVersion = NaN;
if (parentNode) {
parentNode.childrenChanged();
diff --git a/node_modules/symbol-tree/package.json b/node_modules/symbol-tree/package.json
index b291d50..1028f8c 100644
--- a/node_modules/symbol-tree/package.json
+++ b/node_modules/symbol-tree/package.json
@@ -1,8 +1,8 @@
{
"_from": "symbol-tree@^3.2.2",
- "_id": "symbol-tree@3.2.2",
+ "_id": "symbol-tree@3.2.4",
"_inBundle": false,
- "_integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
+ "_integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
"_location": "/symbol-tree",
"_phantomChildren": {},
"_requested": {
@@ -18,8 +18,8 @@
"_requiredBy": [
"/jsdom"
],
- "_resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
- "_shasum": "ae27db38f660a7ae2e1c3b7d1bc290819b8519e6",
+ "_resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "_shasum": "430637d248ba77e078883951fb9aa0eed7c63fa2",
"_spec": "symbol-tree@^3.2.2",
"_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\jsdom",
"author": {
@@ -33,17 +33,16 @@
"deprecated": false,
"description": "Turn any collection of objects into its own efficient tree or linked list using Symbol",
"devDependencies": {
- "babel-eslint": "^7.1.1",
- "coveralls": "^2.11.15",
- "eslint": "^3.12.0",
+ "babel-eslint": "^10.0.1",
+ "coveralls": "^3.0.0",
+ "eslint": "^5.16.0",
"eslint-plugin-import": "^2.2.0",
"istanbul": "^0.4.5",
- "jsdoc-to-markdown": "^3.0.0",
+ "jsdoc-to-markdown": "^5.0.0",
"tape": "^4.0.0"
},
"files": [
- "lib",
- "api.md"
+ "lib"
],
"homepage": "https://github.com/jsdom/js-symbol-tree#symbol-tree",
"keywords": [
@@ -72,5 +71,5 @@
"predocumentation": "cp readme-header.md README.md",
"test": "istanbul cover test/SymbolTree.js"
},
- "version": "3.2.2"
+ "version": "3.2.4"
}
diff --git a/node_modules/terser/node_modules/commander/CHANGELOG.md b/node_modules/terser/node_modules/commander/CHANGELOG.md
deleted file mode 100644
index 953ef21..0000000
--- a/node_modules/terser/node_modules/commander/CHANGELOG.md
+++ /dev/null
@@ -1,408 +0,0 @@
-
-2.20.0 / 2019-04-02
-==================
-
- * fix: resolve symbolic links completely when hunting for subcommands (#935)
- * Update index.d.ts (#930)
- * Update Readme.md (#924)
- * Remove --save option as it isn't required anymore (#918)
- * Add link to the license file (#900)
- * Added example of receiving args from options (#858)
- * Added missing semicolon (#882)
- * Add extension to .eslintrc (#876)
-
-2.19.0 / 2018-10-02
-==================
-
- * Removed newline after Options and Commands headers (#864)
- * Bugfix - Error output (#862)
- * Fix to change default value to string (#856)
-
-2.18.0 / 2018-09-07
-==================
-
- * Standardize help output (#853)
- * chmod 644 travis.yml (#851)
- * add support for execute typescript subcommand via ts-node (#849)
-
-2.17.1 / 2018-08-07
-==================
-
- * Fix bug in command emit (#844)
-
-2.17.0 / 2018-08-03
-==================
-
- * fixed newline output after help information (#833)
- * Fix to emit the action even without command (#778)
- * npm update (#823)
-
-2.16.0 / 2018-06-29
-==================
-
- * Remove Makefile and `test/run` (#821)
- * Make 'npm test' run on Windows (#820)
- * Add badge to display install size (#807)
- * chore: cache node_modules (#814)
- * chore: remove Node.js 4 (EOL), add Node.js 10 (#813)
- * fixed typo in readme (#812)
- * Fix types (#804)
- * Update eslint to resolve vulnerabilities in lodash (#799)
- * updated readme with custom event listeners. (#791)
- * fix tests (#794)
-
-2.15.0 / 2018-03-07
-==================
-
- * Update downloads badge to point to graph of downloads over time instead of duplicating link to npm
- * Arguments description
-
-2.14.1 / 2018-02-07
-==================
-
- * Fix typing of help function
-
-2.14.0 / 2018-02-05
-==================
-
- * only register the option:version event once
- * Fixes issue #727: Passing empty string for option on command is set to undefined
- * enable eqeqeq rule
- * resolves #754 add linter configuration to project
- * resolves #560 respect custom name for version option
- * document how to override the version flag
- * document using options per command
-
-2.13.0 / 2018-01-09
-==================
-
- * Do not print default for --no-
- * remove trailing spaces in command help
- * Update CI's Node.js to LTS and latest version
- * typedefs: Command and Option types added to commander namespace
-
-2.12.2 / 2017-11-28
-==================
-
- * fix: typings are not shipped
-
-2.12.1 / 2017-11-23
-==================
-
- * Move @types/node to dev dependency
-
-2.12.0 / 2017-11-22
-==================
-
- * add attributeName() method to Option objects
- * Documentation updated for options with --no prefix
- * typings: `outputHelp` takes a string as the first parameter
- * typings: use overloads
- * feat(typings): update to match js api
- * Print default value in option help
- * Fix translation error
- * Fail when using same command and alias (#491)
- * feat(typings): add help callback
- * fix bug when description is add after command with options (#662)
- * Format js code
- * Rename History.md to CHANGELOG.md (#668)
- * feat(typings): add typings to support TypeScript (#646)
- * use current node
-
-2.11.0 / 2017-07-03
-==================
-
- * Fix help section order and padding (#652)
- * feature: support for signals to subcommands (#632)
- * Fixed #37, --help should not display first (#447)
- * Fix translation errors. (#570)
- * Add package-lock.json
- * Remove engines
- * Upgrade package version
- * Prefix events to prevent conflicts between commands and options (#494)
- * Removing dependency on graceful-readlink
- * Support setting name in #name function and make it chainable
- * Add .vscode directory to .gitignore (Visual Studio Code metadata)
- * Updated link to ruby commander in readme files
-
-2.10.0 / 2017-06-19
-==================
-
- * Update .travis.yml. drop support for older node.js versions.
- * Fix require arguments in README.md
- * On SemVer you do not start from 0.0.1
- * Add missing semi colon in readme
- * Add save param to npm install
- * node v6 travis test
- * Update Readme_zh-CN.md
- * Allow literal '--' to be passed-through as an argument
- * Test subcommand alias help
- * link build badge to master branch
- * Support the alias of Git style sub-command
- * added keyword commander for better search result on npm
- * Fix Sub-Subcommands
- * test node.js stable
- * Fixes TypeError when a command has an option called `--description`
- * Update README.md to make it beginner friendly and elaborate on the difference between angled and square brackets.
- * Add chinese Readme file
-
-2.9.0 / 2015-10-13
-==================
-
- * Add option `isDefault` to set default subcommand #415 @Qix-
- * Add callback to allow filtering or post-processing of help text #434 @djulien
- * Fix `undefined` text in help information close #414 #416 @zhiyelee
-
-2.8.1 / 2015-04-22
-==================
-
- * Back out `support multiline description` Close #396 #397
-
-2.8.0 / 2015-04-07
-==================
-
- * Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee
- * Fix bug in Git-style sub-commands #372 @zhiyelee
- * Allow commands to be hidden from help #383 @tonylukasavage
- * When git-style sub-commands are in use, yet none are called, display help #382 @claylo
- * Add ability to specify arguments syntax for top-level command #258 @rrthomas
- * Support multiline descriptions #208 @zxqfox
-
-2.7.1 / 2015-03-11
-==================
-
- * Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367.
-
-2.7.0 / 2015-03-09
-==================
-
- * Fix git-style bug when installed globally. Close #335 #349 @zhiyelee
- * Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage
- * Add support for camelCase on `opts()`. Close #353 @nkzawa
- * Add node.js 0.12 and io.js to travis.yml
- * Allow RegEx options. #337 @palanik
- * Fixes exit code when sub-command failing. Close #260 #332 @pirelenito
- * git-style `bin` files in $PATH make sense. Close #196 #327 @zhiyelee
-
-2.6.0 / 2014-12-30
-==================
-
- * added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee
- * Add application description to the help msg. Close #112 @dalssoft
-
-2.5.1 / 2014-12-15
-==================
-
- * fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee
-
-2.5.0 / 2014-10-24
-==================
-
- * add support for variadic arguments. Closes #277 @whitlockjc
-
-2.4.0 / 2014-10-17
-==================
-
- * fixed a bug on executing the coercion function of subcommands option. Closes #270
- * added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage
- * added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage
- * fixed a bug on subcommand name. Closes #248 @jonathandelgado
- * fixed function normalize doesn’t honor option terminator. Closes #216 @abbr
-
-2.3.0 / 2014-07-16
-==================
-
- * add command alias'. Closes PR #210
- * fix: Typos. Closes #99
- * fix: Unused fs module. Closes #217
-
-2.2.0 / 2014-03-29
-==================
-
- * add passing of previous option value
- * fix: support subcommands on windows. Closes #142
- * Now the defaultValue passed as the second argument of the coercion function.
-
-2.1.0 / 2013-11-21
-==================
-
- * add: allow cflag style option params, unit test, fixes #174
-
-2.0.0 / 2013-07-18
-==================
-
- * remove input methods (.prompt, .confirm, etc)
-
-1.3.2 / 2013-07-18
-==================
-
- * add support for sub-commands to co-exist with the original command
-
-1.3.1 / 2013-07-18
-==================
-
- * add quick .runningCommand hack so you can opt-out of other logic when running a sub command
-
-1.3.0 / 2013-07-09
-==================
-
- * add EACCES error handling
- * fix sub-command --help
-
-1.2.0 / 2013-06-13
-==================
-
- * allow "-" hyphen as an option argument
- * support for RegExp coercion
-
-1.1.1 / 2012-11-20
-==================
-
- * add more sub-command padding
- * fix .usage() when args are present. Closes #106
-
-1.1.0 / 2012-11-16
-==================
-
- * add git-style executable subcommand support. Closes #94
-
-1.0.5 / 2012-10-09
-==================
-
- * fix `--name` clobbering. Closes #92
- * fix examples/help. Closes #89
-
-1.0.4 / 2012-09-03
-==================
-
- * add `outputHelp()` method.
-
-1.0.3 / 2012-08-30
-==================
-
- * remove invalid .version() defaulting
-
-1.0.2 / 2012-08-24
-==================
-
- * add `--foo=bar` support [arv]
- * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]
-
-1.0.1 / 2012-08-03
-==================
-
- * fix issue #56
- * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())
-
-1.0.0 / 2012-07-05
-==================
-
- * add support for optional option descriptions
- * add defaulting of `.version()` to package.json's version
-
-0.6.1 / 2012-06-01
-==================
-
- * Added: append (yes or no) on confirmation
- * Added: allow node.js v0.7.x
-
-0.6.0 / 2012-04-10
-==================
-
- * Added `.prompt(obj, callback)` support. Closes #49
- * Added default support to .choose(). Closes #41
- * Fixed the choice example
-
-0.5.1 / 2011-12-20
-==================
-
- * Fixed `password()` for recent nodes. Closes #36
-
-0.5.0 / 2011-12-04
-==================
-
- * Added sub-command option support [itay]
-
-0.4.3 / 2011-12-04
-==================
-
- * Fixed custom help ordering. Closes #32
-
-0.4.2 / 2011-11-24
-==================
-
- * Added travis support
- * Fixed: line-buffered input automatically trimmed. Closes #31
-
-0.4.1 / 2011-11-18
-==================
-
- * Removed listening for "close" on --help
-
-0.4.0 / 2011-11-15
-==================
-
- * Added support for `--`. Closes #24
-
-0.3.3 / 2011-11-14
-==================
-
- * Fixed: wait for close event when writing help info [Jerry Hamlet]
-
-0.3.2 / 2011-11-01
-==================
-
- * Fixed long flag definitions with values [felixge]
-
-0.3.1 / 2011-10-31
-==================
-
- * Changed `--version` short flag to `-V` from `-v`
- * Changed `.version()` so it's configurable [felixge]
-
-0.3.0 / 2011-10-31
-==================
-
- * Added support for long flags only. Closes #18
-
-0.2.1 / 2011-10-24
-==================
-
- * "node": ">= 0.4.x < 0.7.0". Closes #20
-
-0.2.0 / 2011-09-26
-==================
-
- * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
-
-0.1.0 / 2011-08-24
-==================
-
- * Added support for custom `--help` output
-
-0.0.5 / 2011-08-18
-==================
-
- * Changed: when the user enters nothing prompt for password again
- * Fixed issue with passwords beginning with numbers [NuckChorris]
-
-0.0.4 / 2011-08-15
-==================
-
- * Fixed `Commander#args`
-
-0.0.3 / 2011-08-15
-==================
-
- * Added default option value support
-
-0.0.2 / 2011-08-15
-==================
-
- * Added mask support to `Command#password(str[, mask], fn)`
- * Added `Command#password(str, fn)`
-
-0.0.1 / 2010-01-03
-==================
-
- * Initial release
diff --git a/node_modules/terser/node_modules/commander/LICENSE b/node_modules/terser/node_modules/commander/LICENSE
deleted file mode 100644
index 10f997a..0000000
--- a/node_modules/terser/node_modules/commander/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2011 TJ Holowaychuk
-
-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.
diff --git a/node_modules/terser/node_modules/commander/Readme.md b/node_modules/terser/node_modules/commander/Readme.md
deleted file mode 100644
index c846e7a..0000000
--- a/node_modules/terser/node_modules/commander/Readme.md
+++ /dev/null
@@ -1,428 +0,0 @@
-# Commander.js
-
-
-[](http://travis-ci.org/tj/commander.js)
-[](https://www.npmjs.org/package/commander)
-[](https://npmcharts.com/compare/commander?minimal=true)
-[](https://packagephobia.now.sh/result?p=commander)
-[](https://gitter.im/tj/commander.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
- The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/commander-rb/commander).
- [API documentation](http://tj.github.com/commander.js/)
-
-
-## Installation
-
- $ npm install commander
-
-## Option parsing
-
-Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .version('0.1.0')
- .option('-p, --peppers', 'Add peppers')
- .option('-P, --pineapple', 'Add pineapple')
- .option('-b, --bbq-sauce', 'Add bbq sauce')
- .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
- .parse(process.argv);
-
-console.log('you ordered a pizza with:');
-if (program.peppers) console.log(' - peppers');
-if (program.pineapple) console.log(' - pineapple');
-if (program.bbqSauce) console.log(' - bbq');
-console.log(' - %s cheese', program.cheese);
-```
-
-Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
-
-Note that multi-word options starting with `--no` prefix negate the boolean value of the following word. For example, `--no-sauce` sets the value of `program.sauce` to false.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .option('--no-sauce', 'Remove sauce')
- .parse(process.argv);
-
-console.log('you ordered a pizza');
-if (program.sauce) console.log(' with sauce');
-else console.log(' without sauce');
-```
-
-To get string arguments from options you will need to use angle brackets <> for required inputs or square brackets [] for optional inputs.
-
-e.g. ```.option('-m --myarg [myVar]', 'my super cool description')```
-
-Then to access the input if it was passed in.
-
-e.g. ```var myInput = program.myarg```
-
-**NOTE**: If you pass a argument without using brackets the example above will return true and not the value passed in.
-
-
-## Version option
-
-Calling the `version` implicitly adds the `-V` and `--version` options to the command.
-When either of these options is present, the command prints the version number and exits.
-
- $ ./examples/pizza -V
- 0.0.1
-
-If you want your program to respond to the `-v` option instead of the `-V` option, simply pass custom flags to the `version` method using the same syntax as the `option` method.
-
-```js
-program
- .version('0.0.1', '-v, --version')
-```
-
-The version flags can be named anything, but the long option is required.
-
-## Command-specific options
-
-You can attach options to a command.
-
-```js
-#!/usr/bin/env node
-
-var program = require('commander');
-
-program
- .command('rm ')
- .option('-r, --recursive', 'Remove recursively')
- .action(function (dir, cmd) {
- console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))
- })
-
-program.parse(process.argv)
-```
-
-A command's options are validated when the command is used. Any unknown options will be reported as an error. However, if an action-based command does not define an action, then the options are not validated.
-
-## Coercion
-
-```js
-function range(val) {
- return val.split('..').map(Number);
-}
-
-function list(val) {
- return val.split(',');
-}
-
-function collect(val, memo) {
- memo.push(val);
- return memo;
-}
-
-function increaseVerbosity(v, total) {
- return total + 1;
-}
-
-program
- .version('0.1.0')
- .usage('[options] ')
- .option('-i, --integer ', 'An integer argument', parseInt)
- .option('-f, --float ', 'A float argument', parseFloat)
- .option('-r, --range ..', 'A range', range)
- .option('-l, --list ', 'A list', list)
- .option('-o, --optional [value]', 'An optional value')
- .option('-c, --collect [value]', 'A repeatable value', collect, [])
- .option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)
- .parse(process.argv);
-
-console.log(' int: %j', program.integer);
-console.log(' float: %j', program.float);
-console.log(' optional: %j', program.optional);
-program.range = program.range || [];
-console.log(' range: %j..%j', program.range[0], program.range[1]);
-console.log(' list: %j', program.list);
-console.log(' collect: %j', program.collect);
-console.log(' verbosity: %j', program.verbose);
-console.log(' args: %j', program.args);
-```
-
-## Regular Expression
-```js
-program
- .version('0.1.0')
- .option('-s --size ', 'Pizza size', /^(large|medium|small)$/i, 'medium')
- .option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)
- .parse(process.argv);
-
-console.log(' size: %j', program.size);
-console.log(' drink: %j', program.drink);
-```
-
-## Variadic arguments
-
- The last argument of a command can be variadic, and only the last argument. To make an argument variadic you have to
- append `...` to the argument name. Here is an example:
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .version('0.1.0')
- .command('rmdir [otherDirs...]')
- .action(function (dir, otherDirs) {
- console.log('rmdir %s', dir);
- if (otherDirs) {
- otherDirs.forEach(function (oDir) {
- console.log('rmdir %s', oDir);
- });
- }
- });
-
-program.parse(process.argv);
-```
-
- An `Array` is used for the value of a variadic argument. This applies to `program.args` as well as the argument passed
- to your action as demonstrated above.
-
-## Specify the argument syntax
-
-```js
-#!/usr/bin/env node
-
-var program = require('commander');
-
-program
- .version('0.1.0')
- .arguments(' [env]')
- .action(function (cmd, env) {
- cmdValue = cmd;
- envValue = env;
- });
-
-program.parse(process.argv);
-
-if (typeof cmdValue === 'undefined') {
- console.error('no command given!');
- process.exit(1);
-}
-console.log('command:', cmdValue);
-console.log('environment:', envValue || "no environment given");
-```
-Angled brackets (e.g. ``) indicate required input. Square brackets (e.g. `[env]`) indicate optional input.
-
-## Git-style sub-commands
-
-```js
-// file: ./examples/pm
-var program = require('commander');
-
-program
- .version('0.1.0')
- .command('install [name]', 'install one or more packages')
- .command('search [query]', 'search with optional query')
- .command('list', 'list packages installed', {isDefault: true})
- .parse(process.argv);
-```
-
-When `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools.
-The commander will try to search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-command`, like `pm-install`, `pm-search`.
-
-Options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the subcommand from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified.
-
-If the program is designed to be installed globally, make sure the executables have proper modes, like `755`.
-
-### `--harmony`
-
-You can enable `--harmony` option in two ways:
-* Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. Note some os version don’t support this pattern.
-* Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process.
-
-## Automated --help
-
- The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
-
-```
-$ ./examples/pizza --help
-Usage: pizza [options]
-
-An application for pizzas ordering
-
-Options:
- -h, --help output usage information
- -V, --version output the version number
- -p, --peppers Add peppers
- -P, --pineapple Add pineapple
- -b, --bbq Add bbq sauce
- -c, --cheese Add the specified type of cheese [marble]
- -C, --no-cheese You do not want any cheese
-```
-
-## Custom help
-
- You can display arbitrary `-h, --help` information
- by listening for "--help". Commander will automatically
- exit once you are done so that the remainder of your program
- does not execute causing undesired behaviors, for example
- in the following executable "stuff" will not output when
- `--help` is used.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .version('0.1.0')
- .option('-f, --foo', 'enable some foo')
- .option('-b, --bar', 'enable some bar')
- .option('-B, --baz', 'enable some baz');
-
-// must be before .parse() since
-// node's emit() is immediate
-
-program.on('--help', function(){
- console.log('')
- console.log('Examples:');
- console.log(' $ custom-help --help');
- console.log(' $ custom-help -h');
-});
-
-program.parse(process.argv);
-
-console.log('stuff');
-```
-
-Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run:
-
-```
-Usage: custom-help [options]
-
-Options:
- -h, --help output usage information
- -V, --version output the version number
- -f, --foo enable some foo
- -b, --bar enable some bar
- -B, --baz enable some baz
-
-Examples:
- $ custom-help --help
- $ custom-help -h
-```
-
-## .outputHelp(cb)
-
-Output help information without exiting.
-Optional callback cb allows post-processing of help text before it is displayed.
-
-If you want to display help by default (e.g. if no command was provided), you can use something like:
-
-```js
-var program = require('commander');
-var colors = require('colors');
-
-program
- .version('0.1.0')
- .command('getstream [url]', 'get stream URL')
- .parse(process.argv);
-
-if (!process.argv.slice(2).length) {
- program.outputHelp(make_red);
-}
-
-function make_red(txt) {
- return colors.red(txt); //display the help text in red on the console
-}
-```
-
-## .help(cb)
-
- Output help information and exit immediately.
- Optional callback cb allows post-processing of help text before it is displayed.
-
-
-## Custom event listeners
- You can execute custom actions by listening to command and option events.
-
-```js
-program.on('option:verbose', function () {
- process.env.VERBOSE = this.verbose;
-});
-
-// error on unknown commands
-program.on('command:*', function () {
- console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args.join(' '));
- process.exit(1);
-});
-```
-
-## Examples
-
-```js
-var program = require('commander');
-
-program
- .version('0.1.0')
- .option('-C, --chdir ', 'change the working directory')
- .option('-c, --config ', 'set config path. defaults to ./deploy.conf')
- .option('-T, --no-tests', 'ignore test hook');
-
-program
- .command('setup [env]')
- .description('run setup commands for all envs')
- .option("-s, --setup_mode [mode]", "Which setup mode to use")
- .action(function(env, options){
- var mode = options.setup_mode || "normal";
- env = env || 'all';
- console.log('setup for %s env(s) with %s mode', env, mode);
- });
-
-program
- .command('exec ')
- .alias('ex')
- .description('execute the given remote cmd')
- .option("-e, --exec_mode ", "Which exec mode to use")
- .action(function(cmd, options){
- console.log('exec "%s" using %s mode', cmd, options.exec_mode);
- }).on('--help', function() {
- console.log('');
- console.log('Examples:');
- console.log('');
- console.log(' $ deploy exec sequential');
- console.log(' $ deploy exec async');
- });
-
-program
- .command('*')
- .action(function(env){
- console.log('deploying "%s"', env);
- });
-
-program.parse(process.argv);
-```
-
-More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.
-
-## License
-
-[MIT](https://github.com/tj/commander.js/blob/master/LICENSE)
diff --git a/node_modules/terser/node_modules/commander/index.js b/node_modules/terser/node_modules/commander/index.js
deleted file mode 100644
index 06173c1..0000000
--- a/node_modules/terser/node_modules/commander/index.js
+++ /dev/null
@@ -1,1224 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter;
-var spawn = require('child_process').spawn;
-var path = require('path');
-var dirname = path.dirname;
-var basename = path.basename;
-var fs = require('fs');
-
-/**
- * Inherit `Command` from `EventEmitter.prototype`.
- */
-
-require('util').inherits(Command, EventEmitter);
-
-/**
- * Expose the root command.
- */
-
-exports = module.exports = new Command();
-
-/**
- * Expose `Command`.
- */
-
-exports.Command = Command;
-
-/**
- * Expose `Option`.
- */
-
-exports.Option = Option;
-
-/**
- * Initialize a new `Option` with the given `flags` and `description`.
- *
- * @param {String} flags
- * @param {String} description
- * @api public
- */
-
-function Option(flags, description) {
- this.flags = flags;
- this.required = flags.indexOf('<') >= 0;
- this.optional = flags.indexOf('[') >= 0;
- this.bool = flags.indexOf('-no-') === -1;
- flags = flags.split(/[ ,|]+/);
- if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
- this.long = flags.shift();
- this.description = description || '';
-}
-
-/**
- * Return option name.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.name = function() {
- return this.long
- .replace('--', '')
- .replace('no-', '');
-};
-
-/**
- * Return option name, in a camelcase format that can be used
- * as a object attribute key.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.attributeName = function() {
- return camelcase(this.name());
-};
-
-/**
- * Check if `arg` matches the short or long flag.
- *
- * @param {String} arg
- * @return {Boolean}
- * @api private
- */
-
-Option.prototype.is = function(arg) {
- return this.short === arg || this.long === arg;
-};
-
-/**
- * Initialize a new `Command`.
- *
- * @param {String} name
- * @api public
- */
-
-function Command(name) {
- this.commands = [];
- this.options = [];
- this._execs = {};
- this._allowUnknownOption = false;
- this._args = [];
- this._name = name || '';
-}
-
-/**
- * Add command `name`.
- *
- * The `.action()` callback is invoked when the
- * command `name` is specified via __ARGV__,
- * and the remaining arguments are applied to the
- * function for access.
- *
- * When the `name` is "*" an un-matched command
- * will be passed as the first arg, followed by
- * the rest of __ARGV__ remaining.
- *
- * Examples:
- *
- * program
- * .version('0.0.1')
- * .option('-C, --chdir ', 'change the working directory')
- * .option('-c, --config ', 'set config path. defaults to ./deploy.conf')
- * .option('-T, --no-tests', 'ignore test hook')
- *
- * program
- * .command('setup')
- * .description('run remote setup commands')
- * .action(function() {
- * console.log('setup');
- * });
- *
- * program
- * .command('exec ')
- * .description('run the given remote command')
- * .action(function(cmd) {
- * console.log('exec "%s"', cmd);
- * });
- *
- * program
- * .command('teardown [otherDirs...]')
- * .description('run teardown commands')
- * .action(function(dir, otherDirs) {
- * console.log('dir "%s"', dir);
- * if (otherDirs) {
- * otherDirs.forEach(function (oDir) {
- * console.log('dir "%s"', oDir);
- * });
- * }
- * });
- *
- * program
- * .command('*')
- * .description('deploy the given env')
- * .action(function(env) {
- * console.log('deploying "%s"', env);
- * });
- *
- * program.parse(process.argv);
- *
- * @param {String} name
- * @param {String} [desc] for git-style sub-commands
- * @return {Command} the new command
- * @api public
- */
-
-Command.prototype.command = function(name, desc, opts) {
- if (typeof desc === 'object' && desc !== null) {
- opts = desc;
- desc = null;
- }
- opts = opts || {};
- var args = name.split(/ +/);
- var cmd = new Command(args.shift());
-
- if (desc) {
- cmd.description(desc);
- this.executables = true;
- this._execs[cmd._name] = true;
- if (opts.isDefault) this.defaultExecutable = cmd._name;
- }
- cmd._noHelp = !!opts.noHelp;
- this.commands.push(cmd);
- cmd.parseExpectedArgs(args);
- cmd.parent = this;
-
- if (desc) return this;
- return cmd;
-};
-
-/**
- * Define argument syntax for the top-level command.
- *
- * @api public
- */
-
-Command.prototype.arguments = function(desc) {
- return this.parseExpectedArgs(desc.split(/ +/));
-};
-
-/**
- * Add an implicit `help [cmd]` subcommand
- * which invokes `--help` for the given command.
- *
- * @api private
- */
-
-Command.prototype.addImplicitHelpCommand = function() {
- this.command('help [cmd]', 'display help for [cmd]');
-};
-
-/**
- * Parse expected `args`.
- *
- * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parseExpectedArgs = function(args) {
- if (!args.length) return;
- var self = this;
- args.forEach(function(arg) {
- var argDetails = {
- required: false,
- name: '',
- variadic: false
- };
-
- switch (arg[0]) {
- case '<':
- argDetails.required = true;
- argDetails.name = arg.slice(1, -1);
- break;
- case '[':
- argDetails.name = arg.slice(1, -1);
- break;
- }
-
- if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {
- argDetails.variadic = true;
- argDetails.name = argDetails.name.slice(0, -3);
- }
- if (argDetails.name) {
- self._args.push(argDetails);
- }
- });
- return this;
-};
-
-/**
- * Register callback `fn` for the command.
- *
- * Examples:
- *
- * program
- * .command('help')
- * .description('display verbose help')
- * .action(function() {
- * // output help here
- * });
- *
- * @param {Function} fn
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.action = function(fn) {
- var self = this;
- var listener = function(args, unknown) {
- // Parse any so-far unknown options
- args = args || [];
- unknown = unknown || [];
-
- var parsed = self.parseOptions(unknown);
-
- // Output help if necessary
- outputHelpIfNecessary(self, parsed.unknown);
-
- // If there are still any unknown options, then we simply
- // die, unless someone asked for help, in which case we give it
- // to them, and then we die.
- if (parsed.unknown.length > 0) {
- self.unknownOption(parsed.unknown[0]);
- }
-
- // Leftover arguments need to be pushed back. Fixes issue #56
- if (parsed.args.length) args = parsed.args.concat(args);
-
- self._args.forEach(function(arg, i) {
- if (arg.required && args[i] == null) {
- self.missingArgument(arg.name);
- } else if (arg.variadic) {
- if (i !== self._args.length - 1) {
- self.variadicArgNotLast(arg.name);
- }
-
- args[i] = args.splice(i);
- }
- });
-
- // Always append ourselves to the end of the arguments,
- // to make sure we match the number of arguments the user
- // expects
- if (self._args.length) {
- args[self._args.length] = self;
- } else {
- args.push(self);
- }
-
- fn.apply(self, args);
- };
- var parent = this.parent || this;
- var name = parent === this ? '*' : this._name;
- parent.on('command:' + name, listener);
- if (this._alias) parent.on('command:' + this._alias, listener);
- return this;
-};
-
-/**
- * Define option with `flags`, `description` and optional
- * coercion `fn`.
- *
- * The `flags` string should contain both the short and long flags,
- * separated by comma, a pipe or space. The following are all valid
- * all will output this way when `--help` is used.
- *
- * "-p, --pepper"
- * "-p|--pepper"
- * "-p --pepper"
- *
- * Examples:
- *
- * // simple boolean defaulting to false
- * program.option('-p, --pepper', 'add pepper');
- *
- * --pepper
- * program.pepper
- * // => Boolean
- *
- * // simple boolean defaulting to true
- * program.option('-C, --no-cheese', 'remove cheese');
- *
- * program.cheese
- * // => true
- *
- * --no-cheese
- * program.cheese
- * // => false
- *
- * // required argument
- * program.option('-C, --chdir ', 'change the working directory');
- *
- * --chdir /tmp
- * program.chdir
- * // => "/tmp"
- *
- * // optional argument
- * program.option('-c, --cheese [type]', 'add cheese [marble]');
- *
- * @param {String} flags
- * @param {String} description
- * @param {Function|*} [fn] or default
- * @param {*} [defaultValue]
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.option = function(flags, description, fn, defaultValue) {
- var self = this,
- option = new Option(flags, description),
- oname = option.name(),
- name = option.attributeName();
-
- // default as 3rd arg
- if (typeof fn !== 'function') {
- if (fn instanceof RegExp) {
- var regex = fn;
- fn = function(val, def) {
- var m = regex.exec(val);
- return m ? m[0] : def;
- };
- } else {
- defaultValue = fn;
- fn = null;
- }
- }
-
- // preassign default value only for --no-*, [optional], or
- if (!option.bool || option.optional || option.required) {
- // when --no-* we make sure default is true
- if (!option.bool) defaultValue = true;
- // preassign only if we have a default
- if (defaultValue !== undefined) {
- self[name] = defaultValue;
- option.defaultValue = defaultValue;
- }
- }
-
- // register the option
- this.options.push(option);
-
- // when it's passed assign the value
- // and conditionally invoke the callback
- this.on('option:' + oname, function(val) {
- // coercion
- if (val !== null && fn) {
- val = fn(val, self[name] === undefined ? defaultValue : self[name]);
- }
-
- // unassigned or bool
- if (typeof self[name] === 'boolean' || typeof self[name] === 'undefined') {
- // if no value, bool true, and we have a default, then use it!
- if (val == null) {
- self[name] = option.bool
- ? defaultValue || true
- : false;
- } else {
- self[name] = val;
- }
- } else if (val !== null) {
- // reassign
- self[name] = val;
- }
- });
-
- return this;
-};
-
-/**
- * Allow unknown options on the command line.
- *
- * @param {Boolean} arg if `true` or omitted, no error will be thrown
- * for unknown options.
- * @api public
- */
-Command.prototype.allowUnknownOption = function(arg) {
- this._allowUnknownOption = arguments.length === 0 || arg;
- return this;
-};
-
-/**
- * Parse `argv`, settings options and invoking commands when defined.
- *
- * @param {Array} argv
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parse = function(argv) {
- // implicit help
- if (this.executables) this.addImplicitHelpCommand();
-
- // store raw args
- this.rawArgs = argv;
-
- // guess name
- this._name = this._name || basename(argv[1], '.js');
-
- // github-style sub-commands with no sub-command
- if (this.executables && argv.length < 3 && !this.defaultExecutable) {
- // this user needs help
- argv.push('--help');
- }
-
- // process argv
- var parsed = this.parseOptions(this.normalize(argv.slice(2)));
- var args = this.args = parsed.args;
-
- var result = this.parseArgs(this.args, parsed.unknown);
-
- // executable sub-commands
- var name = result.args[0];
-
- var aliasCommand = null;
- // check alias of sub commands
- if (name) {
- aliasCommand = this.commands.filter(function(command) {
- return command.alias() === name;
- })[0];
- }
-
- if (this._execs[name] && typeof this._execs[name] !== 'function') {
- return this.executeSubCommand(argv, args, parsed.unknown);
- } else if (aliasCommand) {
- // is alias of a subCommand
- args[0] = aliasCommand._name;
- return this.executeSubCommand(argv, args, parsed.unknown);
- } else if (this.defaultExecutable) {
- // use the default subcommand
- args.unshift(this.defaultExecutable);
- return this.executeSubCommand(argv, args, parsed.unknown);
- }
-
- return result;
-};
-
-/**
- * Execute a sub-command executable.
- *
- * @param {Array} argv
- * @param {Array} args
- * @param {Array} unknown
- * @api private
- */
-
-Command.prototype.executeSubCommand = function(argv, args, unknown) {
- args = args.concat(unknown);
-
- if (!args.length) this.help();
- if (args[0] === 'help' && args.length === 1) this.help();
-
- // --help
- if (args[0] === 'help') {
- args[0] = args[1];
- args[1] = '--help';
- }
-
- // executable
- var f = argv[1];
- // name of the subcommand, link `pm-install`
- var bin = basename(f, path.extname(f)) + '-' + args[0];
-
- // In case of globally installed, get the base dir where executable
- // subcommand file should be located at
- var baseDir;
-
- var resolvedLink = fs.realpathSync(f);
-
- baseDir = dirname(resolvedLink);
-
- // prefer local `./` to bin in the $PATH
- var localBin = path.join(baseDir, bin);
-
- // whether bin file is a js script with explicit `.js` or `.ts` extension
- var isExplicitJS = false;
- if (exists(localBin + '.js')) {
- bin = localBin + '.js';
- isExplicitJS = true;
- } else if (exists(localBin + '.ts')) {
- bin = localBin + '.ts';
- isExplicitJS = true;
- } else if (exists(localBin)) {
- bin = localBin;
- }
-
- args = args.slice(1);
-
- var proc;
- if (process.platform !== 'win32') {
- if (isExplicitJS) {
- args.unshift(bin);
- // add executable arguments to spawn
- args = (process.execArgv || []).concat(args);
-
- proc = spawn(process.argv[0], args, { stdio: 'inherit', customFds: [0, 1, 2] });
- } else {
- proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });
- }
- } else {
- args.unshift(bin);
- proc = spawn(process.execPath, args, { stdio: 'inherit' });
- }
-
- var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];
- signals.forEach(function(signal) {
- process.on(signal, function() {
- if (proc.killed === false && proc.exitCode === null) {
- proc.kill(signal);
- }
- });
- });
- proc.on('close', process.exit.bind(process));
- proc.on('error', function(err) {
- if (err.code === 'ENOENT') {
- console.error('error: %s(1) does not exist, try --help', bin);
- } else if (err.code === 'EACCES') {
- console.error('error: %s(1) not executable. try chmod or run with root', bin);
- }
- process.exit(1);
- });
-
- // Store the reference to the child process
- this.runningCommand = proc;
-};
-
-/**
- * Normalize `args`, splitting joined short flags. For example
- * the arg "-abc" is equivalent to "-a -b -c".
- * This also normalizes equal sign and splits "--abc=def" into "--abc def".
- *
- * @param {Array} args
- * @return {Array}
- * @api private
- */
-
-Command.prototype.normalize = function(args) {
- var ret = [],
- arg,
- lastOpt,
- index;
-
- for (var i = 0, len = args.length; i < len; ++i) {
- arg = args[i];
- if (i > 0) {
- lastOpt = this.optionFor(args[i - 1]);
- }
-
- if (arg === '--') {
- // Honor option terminator
- ret = ret.concat(args.slice(i));
- break;
- } else if (lastOpt && lastOpt.required) {
- ret.push(arg);
- } else if (arg.length > 1 && arg[0] === '-' && arg[1] !== '-') {
- arg.slice(1).split('').forEach(function(c) {
- ret.push('-' + c);
- });
- } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
- ret.push(arg.slice(0, index), arg.slice(index + 1));
- } else {
- ret.push(arg);
- }
- }
-
- return ret;
-};
-
-/**
- * Parse command `args`.
- *
- * When listener(s) are available those
- * callbacks are invoked, otherwise the "*"
- * event is emitted and those actions are invoked.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api private
- */
-
-Command.prototype.parseArgs = function(args, unknown) {
- var name;
-
- if (args.length) {
- name = args[0];
- if (this.listeners('command:' + name).length) {
- this.emit('command:' + args.shift(), args, unknown);
- } else {
- this.emit('command:*', args);
- }
- } else {
- outputHelpIfNecessary(this, unknown);
-
- // If there were no args and we have unknown options,
- // then they are extraneous and we need to error.
- if (unknown.length > 0) {
- this.unknownOption(unknown[0]);
- }
- if (this.commands.length === 0 &&
- this._args.filter(function(a) { return a.required; }).length === 0) {
- this.emit('command:*');
- }
- }
-
- return this;
-};
-
-/**
- * Return an option matching `arg` if any.
- *
- * @param {String} arg
- * @return {Option}
- * @api private
- */
-
-Command.prototype.optionFor = function(arg) {
- for (var i = 0, len = this.options.length; i < len; ++i) {
- if (this.options[i].is(arg)) {
- return this.options[i];
- }
- }
-};
-
-/**
- * Parse options from `argv` returning `argv`
- * void of these options.
- *
- * @param {Array} argv
- * @return {Array}
- * @api public
- */
-
-Command.prototype.parseOptions = function(argv) {
- var args = [],
- len = argv.length,
- literal,
- option,
- arg;
-
- var unknownOptions = [];
-
- // parse options
- for (var i = 0; i < len; ++i) {
- arg = argv[i];
-
- // literal args after --
- if (literal) {
- args.push(arg);
- continue;
- }
-
- if (arg === '--') {
- literal = true;
- continue;
- }
-
- // find matching Option
- option = this.optionFor(arg);
-
- // option is defined
- if (option) {
- // requires arg
- if (option.required) {
- arg = argv[++i];
- if (arg == null) return this.optionMissingArgument(option);
- this.emit('option:' + option.name(), arg);
- // optional arg
- } else if (option.optional) {
- arg = argv[i + 1];
- if (arg == null || (arg[0] === '-' && arg !== '-')) {
- arg = null;
- } else {
- ++i;
- }
- this.emit('option:' + option.name(), arg);
- // bool
- } else {
- this.emit('option:' + option.name());
- }
- continue;
- }
-
- // looks like an option
- if (arg.length > 1 && arg[0] === '-') {
- unknownOptions.push(arg);
-
- // If the next argument looks like it might be
- // an argument for this option, we pass it on.
- // If it isn't, then it'll simply be ignored
- if ((i + 1) < argv.length && argv[i + 1][0] !== '-') {
- unknownOptions.push(argv[++i]);
- }
- continue;
- }
-
- // arg
- args.push(arg);
- }
-
- return { args: args, unknown: unknownOptions };
-};
-
-/**
- * Return an object containing options as key-value pairs
- *
- * @return {Object}
- * @api public
- */
-Command.prototype.opts = function() {
- var result = {},
- len = this.options.length;
-
- for (var i = 0; i < len; i++) {
- var key = this.options[i].attributeName();
- result[key] = key === this._versionOptionName ? this._version : this[key];
- }
- return result;
-};
-
-/**
- * Argument `name` is missing.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.missingArgument = function(name) {
- console.error("error: missing required argument `%s'", name);
- process.exit(1);
-};
-
-/**
- * `Option` is missing an argument, but received `flag` or nothing.
- *
- * @param {String} option
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.optionMissingArgument = function(option, flag) {
- if (flag) {
- console.error("error: option `%s' argument missing, got `%s'", option.flags, flag);
- } else {
- console.error("error: option `%s' argument missing", option.flags);
- }
- process.exit(1);
-};
-
-/**
- * Unknown option `flag`.
- *
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.unknownOption = function(flag) {
- if (this._allowUnknownOption) return;
- console.error("error: unknown option `%s'", flag);
- process.exit(1);
-};
-
-/**
- * Variadic argument with `name` is not the last argument as required.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.variadicArgNotLast = function(name) {
- console.error("error: variadic arguments must be last `%s'", name);
- process.exit(1);
-};
-
-/**
- * Set the program version to `str`.
- *
- * This method auto-registers the "-V, --version" flag
- * which will print the version number when passed.
- *
- * @param {String} str
- * @param {String} [flags]
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.version = function(str, flags) {
- if (arguments.length === 0) return this._version;
- this._version = str;
- flags = flags || '-V, --version';
- var versionOption = new Option(flags, 'output the version number');
- this._versionOptionName = versionOption.long.substr(2) || 'version';
- this.options.push(versionOption);
- this.on('option:' + this._versionOptionName, function() {
- process.stdout.write(str + '\n');
- process.exit(0);
- });
- return this;
-};
-
-/**
- * Set the description to `str`.
- *
- * @param {String} str
- * @param {Object} argsDescription
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.description = function(str, argsDescription) {
- if (arguments.length === 0) return this._description;
- this._description = str;
- this._argsDescription = argsDescription;
- return this;
-};
-
-/**
- * Set an alias for the command
- *
- * @param {String} alias
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.alias = function(alias) {
- var command = this;
- if (this.commands.length !== 0) {
- command = this.commands[this.commands.length - 1];
- }
-
- if (arguments.length === 0) return command._alias;
-
- if (alias === command._name) throw new Error('Command alias can\'t be the same as its name');
-
- command._alias = alias;
- return this;
-};
-
-/**
- * Set / get the command usage `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.usage = function(str) {
- var args = this._args.map(function(arg) {
- return humanReadableArgName(arg);
- });
-
- var usage = '[options]' +
- (this.commands.length ? ' [command]' : '') +
- (this._args.length ? ' ' + args.join(' ') : '');
-
- if (arguments.length === 0) return this._usage || usage;
- this._usage = str;
-
- return this;
-};
-
-/**
- * Get or set the name of the command
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.name = function(str) {
- if (arguments.length === 0) return this._name;
- this._name = str;
- return this;
-};
-
-/**
- * Return prepared commands.
- *
- * @return {Array}
- * @api private
- */
-
-Command.prototype.prepareCommands = function() {
- return this.commands.filter(function(cmd) {
- return !cmd._noHelp;
- }).map(function(cmd) {
- var args = cmd._args.map(function(arg) {
- return humanReadableArgName(arg);
- }).join(' ');
-
- return [
- cmd._name +
- (cmd._alias ? '|' + cmd._alias : '') +
- (cmd.options.length ? ' [options]' : '') +
- (args ? ' ' + args : ''),
- cmd._description
- ];
- });
-};
-
-/**
- * Return the largest command length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestCommandLength = function() {
- var commands = this.prepareCommands();
- return commands.reduce(function(max, command) {
- return Math.max(max, command[0].length);
- }, 0);
-};
-
-/**
- * Return the largest option length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestOptionLength = function() {
- var options = [].slice.call(this.options);
- options.push({
- flags: '-h, --help'
- });
- return options.reduce(function(max, option) {
- return Math.max(max, option.flags.length);
- }, 0);
-};
-
-/**
- * Return the largest arg length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestArgLength = function() {
- return this._args.reduce(function(max, arg) {
- return Math.max(max, arg.name.length);
- }, 0);
-};
-
-/**
- * Return the pad width.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.padWidth = function() {
- var width = this.largestOptionLength();
- if (this._argsDescription && this._args.length) {
- if (this.largestArgLength() > width) {
- width = this.largestArgLength();
- }
- }
-
- if (this.commands && this.commands.length) {
- if (this.largestCommandLength() > width) {
- width = this.largestCommandLength();
- }
- }
-
- return width;
-};
-
-/**
- * Return help for options.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.optionHelp = function() {
- var width = this.padWidth();
-
- // Append the help information
- return this.options.map(function(option) {
- return pad(option.flags, width) + ' ' + option.description +
- ((option.bool && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : '');
- }).concat([pad('-h, --help', width) + ' ' + 'output usage information'])
- .join('\n');
-};
-
-/**
- * Return command help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.commandHelp = function() {
- if (!this.commands.length) return '';
-
- var commands = this.prepareCommands();
- var width = this.padWidth();
-
- return [
- 'Commands:',
- commands.map(function(cmd) {
- var desc = cmd[1] ? ' ' + cmd[1] : '';
- return (desc ? pad(cmd[0], width) : cmd[0]) + desc;
- }).join('\n').replace(/^/gm, ' '),
- ''
- ].join('\n');
-};
-
-/**
- * Return program help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.helpInformation = function() {
- var desc = [];
- if (this._description) {
- desc = [
- this._description,
- ''
- ];
-
- var argsDescription = this._argsDescription;
- if (argsDescription && this._args.length) {
- var width = this.padWidth();
- desc.push('Arguments:');
- desc.push('');
- this._args.forEach(function(arg) {
- desc.push(' ' + pad(arg.name, width) + ' ' + argsDescription[arg.name]);
- });
- desc.push('');
- }
- }
-
- var cmdName = this._name;
- if (this._alias) {
- cmdName = cmdName + '|' + this._alias;
- }
- var usage = [
- 'Usage: ' + cmdName + ' ' + this.usage(),
- ''
- ];
-
- var cmds = [];
- var commandHelp = this.commandHelp();
- if (commandHelp) cmds = [commandHelp];
-
- var options = [
- 'Options:',
- '' + this.optionHelp().replace(/^/gm, ' '),
- ''
- ];
-
- return usage
- .concat(desc)
- .concat(options)
- .concat(cmds)
- .join('\n');
-};
-
-/**
- * Output help information for this command
- *
- * @api public
- */
-
-Command.prototype.outputHelp = function(cb) {
- if (!cb) {
- cb = function(passthru) {
- return passthru;
- };
- }
- process.stdout.write(cb(this.helpInformation()));
- this.emit('--help');
-};
-
-/**
- * Output help information and exit.
- *
- * @api public
- */
-
-Command.prototype.help = function(cb) {
- this.outputHelp(cb);
- process.exit();
-};
-
-/**
- * Camel-case the given `flag`
- *
- * @param {String} flag
- * @return {String}
- * @api private
- */
-
-function camelcase(flag) {
- return flag.split('-').reduce(function(str, word) {
- return str + word[0].toUpperCase() + word.slice(1);
- });
-}
-
-/**
- * Pad `str` to `width`.
- *
- * @param {String} str
- * @param {Number} width
- * @return {String}
- * @api private
- */
-
-function pad(str, width) {
- var len = Math.max(0, width - str.length);
- return str + Array(len + 1).join(' ');
-}
-
-/**
- * Output help information if necessary
- *
- * @param {Command} command to output help for
- * @param {Array} array of options to search for -h or --help
- * @api private
- */
-
-function outputHelpIfNecessary(cmd, options) {
- options = options || [];
- for (var i = 0; i < options.length; i++) {
- if (options[i] === '--help' || options[i] === '-h') {
- cmd.outputHelp();
- process.exit(0);
- }
- }
-}
-
-/**
- * Takes an argument an returns its human readable equivalent for help usage.
- *
- * @param {Object} arg
- * @return {String}
- * @api private
- */
-
-function humanReadableArgName(arg) {
- var nameOutput = arg.name + (arg.variadic === true ? '...' : '');
-
- return arg.required
- ? '<' + nameOutput + '>'
- : '[' + nameOutput + ']';
-}
-
-// for versions before node v0.8 when there weren't `fs.existsSync`
-function exists(file) {
- try {
- if (fs.statSync(file).isFile()) {
- return true;
- }
- } catch (e) {
- return false;
- }
-}
diff --git a/node_modules/terser/node_modules/commander/package.json b/node_modules/terser/node_modules/commander/package.json
deleted file mode 100644
index e1a4008..0000000
--- a/node_modules/terser/node_modules/commander/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "_from": "commander@^2.19.0",
- "_id": "commander@2.20.0",
- "_inBundle": false,
- "_integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
- "_location": "/terser/commander",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "commander@^2.19.0",
- "name": "commander",
- "escapedName": "commander",
- "rawSpec": "^2.19.0",
- "saveSpec": null,
- "fetchSpec": "^2.19.0"
- },
- "_requiredBy": [
- "/terser"
- ],
- "_resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
- "_shasum": "d58bb2b5c1ee8f87b0d340027e9e94e222c5a422",
- "_spec": "commander@^2.19.0",
- "_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\terser",
- "author": {
- "name": "TJ Holowaychuk",
- "email": "tj@vision-media.ca"
- },
- "bugs": {
- "url": "https://github.com/tj/commander.js/issues"
- },
- "bundleDependencies": false,
- "dependencies": {},
- "deprecated": false,
- "description": "the complete solution for node.js command-line programs",
- "devDependencies": {
- "@types/node": "^10.11.3",
- "eslint": "^5.6.1",
- "should": "^13.2.3",
- "sinon": "^6.3.4",
- "standard": "^12.0.1",
- "ts-node": "^7.0.1",
- "typescript": "^2.9.2"
- },
- "files": [
- "index.js",
- "typings/index.d.ts"
- ],
- "homepage": "https://github.com/tj/commander.js#readme",
- "keywords": [
- "commander",
- "command",
- "option",
- "parser"
- ],
- "license": "MIT",
- "main": "index",
- "name": "commander",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/tj/commander.js.git"
- },
- "scripts": {
- "lint": "eslint index.js",
- "test": "node test/run.js && npm run test-typings",
- "test-typings": "tsc -p tsconfig.json"
- },
- "typings": "typings/index.d.ts",
- "version": "2.20.0"
-}
diff --git a/node_modules/terser/node_modules/commander/typings/index.d.ts b/node_modules/terser/node_modules/commander/typings/index.d.ts
deleted file mode 100644
index bcda277..0000000
--- a/node_modules/terser/node_modules/commander/typings/index.d.ts
+++ /dev/null
@@ -1,310 +0,0 @@
-// Type definitions for commander 2.11
-// Project: https://github.com/visionmedia/commander.js
-// Definitions by: Alan Agius , Marcelo Dezem , vvakame , Jules Randolph
-// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
-
-declare namespace local {
-
- class Option {
- flags: string;
- required: boolean;
- optional: boolean;
- bool: boolean;
- short?: string;
- long: string;
- description: string;
-
- /**
- * Initialize a new `Option` with the given `flags` and `description`.
- *
- * @param {string} flags
- * @param {string} [description]
- */
- constructor(flags: string, description?: string);
- }
-
- class Command extends NodeJS.EventEmitter {
- [key: string]: any;
-
- args: string[];
-
- /**
- * Initialize a new `Command`.
- *
- * @param {string} [name]
- */
- constructor(name?: string);
-
- /**
- * Set the program version to `str`.
- *
- * This method auto-registers the "-V, --version" flag
- * which will print the version number when passed.
- *
- * @param {string} str
- * @param {string} [flags]
- * @returns {Command} for chaining
- */
- version(str: string, flags?: string): Command;
-
- /**
- * Add command `name`.
- *
- * The `.action()` callback is invoked when the
- * command `name` is specified via __ARGV__,
- * and the remaining arguments are applied to the
- * function for access.
- *
- * When the `name` is "*" an un-matched command
- * will be passed as the first arg, followed by
- * the rest of __ARGV__ remaining.
- *
- * @example
- * program
- * .version('0.0.1')
- * .option('-C, --chdir ', 'change the working directory')
- * .option('-c, --config ', 'set config path. defaults to ./deploy.conf')
- * .option('-T, --no-tests', 'ignore test hook')
- *
- * program
- * .command('setup')
- * .description('run remote setup commands')
- * .action(function() {
- * console.log('setup');
- * });
- *
- * program
- * .command('exec ')
- * .description('run the given remote command')
- * .action(function(cmd) {
- * console.log('exec "%s"', cmd);
- * });
- *
- * program
- * .command('teardown [otherDirs...]')
- * .description('run teardown commands')
- * .action(function(dir, otherDirs) {
- * console.log('dir "%s"', dir);
- * if (otherDirs) {
- * otherDirs.forEach(function (oDir) {
- * console.log('dir "%s"', oDir);
- * });
- * }
- * });
- *
- * program
- * .command('*')
- * .description('deploy the given env')
- * .action(function(env) {
- * console.log('deploying "%s"', env);
- * });
- *
- * program.parse(process.argv);
- *
- * @param {string} name
- * @param {string} [desc] for git-style sub-commands
- * @param {CommandOptions} [opts] command options
- * @returns {Command} the new command
- */
- command(name: string, desc?: string, opts?: commander.CommandOptions): Command;
-
- /**
- * Define argument syntax for the top-level command.
- *
- * @param {string} desc
- * @returns {Command} for chaining
- */
- arguments(desc: string): Command;
-
- /**
- * Parse expected `args`.
- *
- * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
- *
- * @param {string[]} args
- * @returns {Command} for chaining
- */
- parseExpectedArgs(args: string[]): Command;
-
- /**
- * Register callback `fn` for the command.
- *
- * @example
- * program
- * .command('help')
- * .description('display verbose help')
- * .action(function() {
- * // output help here
- * });
- *
- * @param {(...args: any[]) => void} fn
- * @returns {Command} for chaining
- */
- action(fn: (...args: any[]) => void): Command;
-
- /**
- * Define option with `flags`, `description` and optional
- * coercion `fn`.
- *
- * The `flags` string should contain both the short and long flags,
- * separated by comma, a pipe or space. The following are all valid
- * all will output this way when `--help` is used.
- *
- * "-p, --pepper"
- * "-p|--pepper"
- * "-p --pepper"
- *
- * @example
- * // simple boolean defaulting to false
- * program.option('-p, --pepper', 'add pepper');
- *
- * --pepper
- * program.pepper
- * // => Boolean
- *
- * // simple boolean defaulting to true
- * program.option('-C, --no-cheese', 'remove cheese');
- *
- * program.cheese
- * // => true
- *
- * --no-cheese
- * program.cheese
- * // => false
- *
- * // required argument
- * program.option('-C, --chdir ', 'change the working directory');
- *
- * --chdir /tmp
- * program.chdir
- * // => "/tmp"
- *
- * // optional argument
- * program.option('-c, --cheese [type]', 'add cheese [marble]');
- *
- * @param {string} flags
- * @param {string} [description]
- * @param {((arg1: any, arg2: any) => void) | RegExp} [fn] function or default
- * @param {*} [defaultValue]
- * @returns {Command} for chaining
- */
- option(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command;
- option(flags: string, description?: string, defaultValue?: any): Command;
-
- /**
- * Allow unknown options on the command line.
- *
- * @param {boolean} [arg] if `true` or omitted, no error will be thrown for unknown options.
- * @returns {Command} for chaining
- */
- allowUnknownOption(arg?: boolean): Command;
-
- /**
- * Parse `argv`, settings options and invoking commands when defined.
- *
- * @param {string[]} argv
- * @returns {Command} for chaining
- */
- parse(argv: string[]): Command;
-
- /**
- * Parse options from `argv` returning `argv` void of these options.
- *
- * @param {string[]} argv
- * @returns {ParseOptionsResult}
- */
- parseOptions(argv: string[]): commander.ParseOptionsResult;
-
- /**
- * Return an object containing options as key-value pairs
- *
- * @returns {{[key: string]: any}}
- */
- opts(): { [key: string]: any };
-
- /**
- * Set the description to `str`.
- *
- * @param {string} str
- * @param {{[argName: string]: string}} argsDescription
- * @return {(Command | string)}
- */
- description(str: string, argsDescription?: {[argName: string]: string}): Command;
- description(): string;
-
- /**
- * Set an alias for the command.
- *
- * @param {string} alias
- * @return {(Command | string)}
- */
- alias(alias: string): Command;
- alias(): string;
-
- /**
- * Set or get the command usage.
- *
- * @param {string} str
- * @return {(Command | string)}
- */
- usage(str: string): Command;
- usage(): string;
-
- /**
- * Set the name of the command.
- *
- * @param {string} str
- * @return {Command}
- */
- name(str: string): Command;
-
- /**
- * Get the name of the command.
- *
- * @return {string}
- */
- name(): string;
-
- /**
- * Output help information for this command.
- *
- * @param {(str: string) => string} [cb]
- */
- outputHelp(cb?: (str: string) => string): void;
-
- /** Output help information and exit.
- *
- * @param {(str: string) => string} [cb]
- */
- help(cb?: (str: string) => string): never;
- }
-
-}
-
-declare namespace commander {
-
- type Command = local.Command
-
- type Option = local.Option
-
- interface CommandOptions {
- noHelp?: boolean;
- isDefault?: boolean;
- }
-
- interface ParseOptionsResult {
- args: string[];
- unknown: string[];
- }
-
- interface CommanderStatic extends Command {
- Command: typeof local.Command;
- Option: typeof local.Option;
- CommandOptions: CommandOptions;
- ParseOptionsResult: ParseOptionsResult;
- }
-
-}
-
-declare const commander: commander.CommanderStatic;
-export = commander;
diff --git a/node_modules/terser/package.json b/node_modules/terser/package.json
index ac50e34..5ca7038 100644
--- a/node_modules/terser/package.json
+++ b/node_modules/terser/package.json
@@ -1,5 +1,5 @@
{
- "_from": "terser@^4.0.0",
+ "_from": "terser@^4.6.3",
"_id": "terser@4.6.3",
"_inBundle": false,
"_integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==",
@@ -8,20 +8,20 @@
"_requested": {
"type": "range",
"registry": true,
- "raw": "terser@^4.0.0",
+ "raw": "terser@^4.6.3",
"name": "terser",
"escapedName": "terser",
- "rawSpec": "^4.0.0",
+ "rawSpec": "^4.6.3",
"saveSpec": null,
- "fetchSpec": "^4.0.0"
+ "fetchSpec": "^4.6.3"
},
"_requiredBy": [
- "/minify"
+ "/"
],
"_resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz",
"_shasum": "e33aa42461ced5238d352d2df2a67f21921f8d87",
- "_spec": "terser@^4.0.0",
- "_where": "/home/s2/Code/minifyfromhtml/node_modules/minify",
+ "_spec": "terser@^4.6.3",
+ "_where": "F:\\projects\\p\\minifyfromhtml",
"author": {
"name": "Mihai Bazon",
"email": "mihai.bazon@gmail.com",
diff --git a/node_modules/tough-cookie/package.json b/node_modules/tough-cookie/package.json
index 44091a4..ca14b61 100644
--- a/node_modules/tough-cookie/package.json
+++ b/node_modules/tough-cookie/package.json
@@ -17,6 +17,7 @@
},
"_requiredBy": [
"/jsdom",
+ "/request",
"/request-promise-native"
],
"_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
diff --git a/node_modules/try-catch/ChangeLog b/node_modules/try-catch/ChangeLog
deleted file mode 100644
index f93ed79..0000000
--- a/node_modules/try-catch/ChangeLog
+++ /dev/null
@@ -1,34 +0,0 @@
-2019.09.12, v2.0.1
-
-feature:
-- (try-catch) add madrun
-- (package) eslint v6.3.0
-- (package) nyc v14.1.1
-- (package) nyc v12.0.2
-- (try-catch) changed the way result is returned
-
-
-2018.02.08, v2.0.0
-
-feature:
-- (try-catch) changed the way arguments returned
-
-
-2014.11.24, v1.0.2
-
-feature:
-- (trammel) rm util-io
-- (size) rm exec
-
-
-2014.11.20, v1.0.1
-
-feature:
-- (trammel) util-io v1.6.3
-
-
-2014.11.19, v1.0.0
-
-feature:
-- (size) trammel.get -> trammel
-
diff --git a/node_modules/try-catch/LICENSE b/node_modules/try-catch/LICENSE
deleted file mode 100644
index ea7654c..0000000
--- a/node_modules/try-catch/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014-2018 coderaiser
-
-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.
diff --git a/node_modules/try-catch/README.md b/node_modules/try-catch/README.md
deleted file mode 100644
index 24730ff..0000000
--- a/node_modules/try-catch/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# Try Catch [![License][LicenseIMGURL]][LicenseURL] [![NPM version][NPMIMGURL]][NPMURL] [![Dependency Status][DependencyStatusIMGURL]][DependencyStatusURL] [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Coverage Status][CoverageIMGURL]][CoverageURL]
-
-[NPMIMGURL]: https://img.shields.io/npm/v/try-catch.svg?style=flat
-[BuildStatusIMGURL]: https://img.shields.io/travis/coderaiser/try-catch/master.svg?style=flat
-[DependencyStatusIMGURL]: https://img.shields.io/david/coderaiser/try-catch.svg?style=flat
-[LicenseIMGURL]: https://img.shields.io/badge/license-MIT-317BF9.svg?style=flat
-[NPMURL]: https://npmjs.org/package/try-catch "npm"
-[BuildStatusURL]: https://travis-ci.org/coderaiser/try-catch "Build Status"
-[DependencyStatusURL]: https://david-dm.org/coderaiser/try-catch "Dependency Status"
-[LicenseURL]: https://tldrlegal.com/license/mit-license "MIT License"
-
-[CoverageURL]: https://coveralls.io/github/coderaiser/readify?branch=master
-[CoverageIMGURL]: https://coveralls.io/repos/coderaiser/readify/badge.svg?branch=master&service=github
-
-Functional `try-catch` wrapper
-
-## Install
-
-```
-npm i try-catch
-```
-
-## Example
-
-```js
-const tryCatch = require('try-catch');
-const {parse} = JSON;
-const [error, result] = tryCatch(parse, 'hello');
-
-if (error)
- console.error(error.message);
-
-```
-
-## Related
-
-- [try-to-catch](https://github.com/coderaiser/try-to-catch "TryToCatch") - functional try-catch wrapper for promises.
-
-## License
-
-MIT
-
diff --git a/node_modules/try-catch/lib/try-catch.js b/node_modules/try-catch/lib/try-catch.js
deleted file mode 100644
index ebd6832..0000000
--- a/node_modules/try-catch/lib/try-catch.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-
-module.exports = function tryCatch(fn) {
- var args = [].slice.call(arguments, 1);
-
- try {
- return [null, fn.apply(null, args)];
- } catch(e) {
- return [e];
- }
-};
-
diff --git a/node_modules/try-catch/package.json b/node_modules/try-catch/package.json
deleted file mode 100644
index fe28ddf..0000000
--- a/node_modules/try-catch/package.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
- "_from": "try-catch@^2.0.0",
- "_id": "try-catch@2.0.1",
- "_inBundle": false,
- "_integrity": "sha512-LsOrmObN/2WdM+y2xG+t16vhYrQsnV8wftXIcIOWZhQcBJvKGYuamJGwnU98A7Jxs2oZNkJztXlphEOoA0DWqg==",
- "_location": "/try-catch",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "try-catch@^2.0.0",
- "name": "try-catch",
- "escapedName": "try-catch",
- "rawSpec": "^2.0.0",
- "saveSpec": null,
- "fetchSpec": "^2.0.0"
- },
- "_requiredBy": [
- "/minify"
- ],
- "_resolved": "https://registry.npmjs.org/try-catch/-/try-catch-2.0.1.tgz",
- "_shasum": "a35d354187c422f291a0bcfd9eb77e3a4f90c1e5",
- "_spec": "try-catch@^2.0.0",
- "_where": "/home/s2/Code/minifyfromhtml/node_modules/minify",
- "author": {
- "name": "coderaiser",
- "email": "mnemonic.enemy@gmail.com",
- "url": "https://github.com/coderaiser"
- },
- "bugs": {
- "url": "https://github.com/coderaiser/try-catch/issues"
- },
- "bundleDependencies": false,
- "dependencies": {},
- "deprecated": false,
- "description": "functional try-catch wrapper",
- "devDependencies": {
- "coveralls": "^3.0.0",
- "eslint": "^6.3.0",
- "eslint-plugin-node": "^10.0.0",
- "eslint-plugin-putout": "^2.0.0",
- "madrun": "^3.0.3",
- "nyc": "^14.1.1",
- "putout": "^5.27.0",
- "supertape": "^1.2.3"
- },
- "engines": {
- "node": ">=0.4"
- },
- "homepage": "http://github.com/coderaiser/try-catch",
- "license": "MIT",
- "main": "lib/try-catch.js",
- "name": "try-catch",
- "repository": {
- "type": "git",
- "url": "git://github.com/coderaiser/try-catch.git"
- },
- "scripts": {
- "coverage": "madrun coverage",
- "fix:lint": "madrun fix:lint",
- "lint": "madrun lint",
- "report": "madrun report",
- "test": "madrun test"
- },
- "version": "2.0.1"
-}
diff --git a/node_modules/try-to-catch/ChangeLog b/node_modules/try-to-catch/ChangeLog
deleted file mode 100644
index b64ea8a..0000000
--- a/node_modules/try-to-catch/ChangeLog
+++ /dev/null
@@ -1,49 +0,0 @@
-2019.12.30, v2.0.1
-
-fix:
-- (try-to-catch) minimal node: v4 -> v6
-
-feature:
-- (package) putout v7.3.4
-- (package) nyc v15.0.0
-- (package) nodemon v2.0.2
-
-
-2019.10.16, v2.0.0
-
-feature:
-- (package) putout v6.15.1
-- (package) madrun v3.0.6
-- (try-to-catch) drop support of node < 4
-- (package) nyc v14.1.1
-- (package) eslint v6.1.0
-
-
-2018.11.08, v1.1.1
-
-fix:
-- (try-to-catch) wraptile -> noArg
-
-
-2018.11.08, v1.1.0
-
-feature:
-- (try-to-catch) add support of a functions
-- (package) redrun v7.0.2
-- (package) nyc v13.0.1
-- (package) eslint v5.6.0
-- (package) babel v7.0.0
-- (package) redrun v6.0.0
-
-
-2018.02.13, v1.0.2
-
-fix:
-- (package) legacy
-
-
-2018.02.12, v1.0.1
-
-feature:
-- (package) keywords: then
-
diff --git a/node_modules/try-to-catch/LICENSE b/node_modules/try-to-catch/LICENSE
deleted file mode 100644
index eaec9a1..0000000
--- a/node_modules/try-to-catch/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) coderaiser
-
-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.
diff --git a/node_modules/try-to-catch/README.md b/node_modules/try-to-catch/README.md
deleted file mode 100644
index 448451c..0000000
--- a/node_modules/try-to-catch/README.md
+++ /dev/null
@@ -1,78 +0,0 @@
-# Try to Catch [![NPM version][NPMIMGURL]][NPMURL] [![Dependency Status][DependencyStatusIMGURL]][DependencyStatusURL] [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Coverage Status][CoverageIMGURL]][CoverageURL]
-
-[NPMIMGURL]: https://img.shields.io/npm/v/try-to-catch.svg?style=flat&longCache=true
-[BuildStatusIMGURL]: https://img.shields.io/travis/coderaiser/try-to-catch/master.svg?style=flat&longCache=true
-[DependencyStatusIMGURL]: https://img.shields.io/david/coderaiser/try-to-catch.svg?style=flat&longCache=true
-[NPMURL]: https://npmjs.org/package/try-to-catch "npm"
-[BuildStatusURL]: https://travis-ci.org/coderaiser/try-to-catch "Build Status"
-[DependencyStatusURL]: https://david-dm.org/coderaiser/try-to-catch "Dependency Status"
-
-[CoverageURL]: https://coveralls.io/github/coderaiser/try-to-catch?branch=master
-[CoverageIMGURL]: https://coveralls.io/repos/coderaiser/try-to-catch/badge.svg?branch=master&service=github
-
-Functional `try-catch` wrapper for `promises`.
-
-## Install
-
-```
-npm i try-to-catch
-```
-
-## API
-
-### tryToCatch(fn, [...args])
-
-Wrap function to avoid `try-catch` block, resolves `[error, result]`;
-
-### Example
-
-Simplest example with `async-await`:
-
-```js
-const tryToCatch = require('try-to-catch');
-const reject = Promise.reject.bind(Promise);
-await tryToCatch(reject, 'hi');
-// returns
-[ Error: hi]
-```
-
-Can be used with functions:
-
-```js
-const tryToCatch = require('try-to-catch');
-await tryToCatch(() => 5);
-// returns
-[null, 5]
-```
-
-Advanced example:
-
-```js
-const {readFile, readdir} = require('fs').promises;
-const tryToCatch = require('try-to-catch');
-
-read(process.argv[2])
- .then(console.log)
- .catch(console.error);
-
-async function read(path) {
- const [error, data] = await tryToCatch(readFile, path, 'utf8');
-
- if (!error)
- return data;
-
- if (error.code !== 'EISDIR')
- return error;
-
- return await readdir(path);
-}
-```
-
-## Related
-
-- [try-catch](https://github.com/coderaiser/try-catch "try-catch") - functional try-catch wrapper.
-
-## License
-
-MIT
-
diff --git a/node_modules/try-to-catch/lib/try-to-catch.js b/node_modules/try-to-catch/lib/try-to-catch.js
deleted file mode 100644
index 7e8de7f..0000000
--- a/node_modules/try-to-catch/lib/try-to-catch.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict';
-
-const success = (a) => [null, a];
-const fail = (a) => [a];
-
-const noArg = (f, a) => () => f(...a);
-
-module.exports = (fn, ...args) => {
- check(fn);
-
- return Promise.resolve()
- .then(noArg(fn, args))
- .then(success)
- .catch(fail);
-};
-
-function check(fn) {
- if (typeof fn !== 'function')
- throw Error('fn should be a function!');
-}
-
diff --git a/node_modules/try-to-catch/package.json b/node_modules/try-to-catch/package.json
deleted file mode 100644
index 59e0d8f..0000000
--- a/node_modules/try-to-catch/package.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "_from": "try-to-catch@^2.0.0",
- "_id": "try-to-catch@2.0.1",
- "_inBundle": false,
- "_integrity": "sha512-QYH/PR3ogChy82e2l1UgrEgutcf6Jtfu3TAQWC+Vs6MKpoaFs1atDHUPzfaERugZlESb2Xku7J2my6iUQ7+tcQ==",
- "_location": "/try-to-catch",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "try-to-catch@^2.0.0",
- "name": "try-to-catch",
- "escapedName": "try-to-catch",
- "rawSpec": "^2.0.0",
- "saveSpec": null,
- "fetchSpec": "^2.0.0"
- },
- "_requiredBy": [
- "/minify"
- ],
- "_resolved": "https://registry.npmjs.org/try-to-catch/-/try-to-catch-2.0.1.tgz",
- "_shasum": "4a943ba6f2921bd3ba945ea5d4459119ec3ec079",
- "_spec": "try-to-catch@^2.0.0",
- "_where": "/home/s2/Code/minifyfromhtml/node_modules/minify",
- "author": {
- "name": "coderaiser",
- "email": "mnemonic.enemy@gmail.com",
- "url": "https://github.com/coderaiser"
- },
- "bugs": {
- "url": "https://github.com/coderaiser/try-to-catch/issues"
- },
- "bundleDependencies": false,
- "dependencies": {},
- "deprecated": false,
- "description": "function try-catch wrapper for promises",
- "devDependencies": {
- "@babel/cli": "^7.0.0",
- "@babel/core": "^7.0.0",
- "@babel/preset-env": "^7.0.0",
- "coveralls": "^3.0.0",
- "eslint": "^6.1.0",
- "eslint-plugin-node": "^11.0.0",
- "eslint-plugin-putout": "^3.0.0",
- "madrun": "^5.4.0",
- "nodemon": "^2.0.2",
- "nyc": "^15.0.0",
- "putout": "^7.3.4",
- "supertape": "^1.2.4"
- },
- "engines": {
- "node": ">=6"
- },
- "homepage": "http://github.com/coderaiser/try-to-catch",
- "keywords": [
- "try",
- "catch",
- "function",
- "promise",
- "async",
- "await",
- "try-catch",
- "then"
- ],
- "license": "MIT",
- "main": "lib/try-to-catch.js",
- "name": "try-to-catch",
- "repository": {
- "type": "git",
- "url": "git://github.com/coderaiser/try-to-catch.git"
- },
- "scripts": {
- "coverage": "madrun coverage",
- "fix:lint": "madrun fix:lint",
- "lint": "madrun lint",
- "report": "madrun report",
- "test": "madrun test",
- "watch:test": "madrun watch:test"
- },
- "version": "2.0.1"
-}
diff --git a/node_modules/uglify-js/LICENSE b/node_modules/uglify-js/LICENSE
deleted file mode 100644
index 122e8fb..0000000
--- a/node_modules/uglify-js/LICENSE
+++ /dev/null
@@ -1,29 +0,0 @@
-UglifyJS is released under the BSD license:
-
-Copyright 2012-2019 (c) Mihai Bazon
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
-OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
-TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
-THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
diff --git a/node_modules/uglify-js/README.md b/node_modules/uglify-js/README.md
deleted file mode 100644
index 21dfabf..0000000
--- a/node_modules/uglify-js/README.md
+++ /dev/null
@@ -1,1146 +0,0 @@
-UglifyJS 3
-==========
-
-UglifyJS is a JavaScript parser, minifier, compressor and beautifier toolkit.
-
-#### Note:
-- **`uglify-js@3` has a simplified [API](#api-reference) and [CLI](#command-line-usage) that is not backwards compatible with [`uglify-js@2`](https://github.com/mishoo/UglifyJS2/tree/v2.x)**.
-- **Documentation for UglifyJS `2.x` releases can be found [here](https://github.com/mishoo/UglifyJS2/tree/v2.x)**.
-- `uglify-js` only supports JavaScript (ECMAScript 5).
-- To minify ECMAScript 2015 or above, transpile using tools like [Babel](https://babeljs.io/).
-
-Install
--------
-
-First make sure you have installed the latest version of [node.js](http://nodejs.org/)
-(You may need to restart your computer after this step).
-
-From NPM for use as a command line app:
-
- npm install uglify-js -g
-
-From NPM for programmatic use:
-
- npm install uglify-js
-
-# Command line usage
-
- uglifyjs [input files] [options]
-
-UglifyJS can take multiple input files. It's recommended that you pass the
-input files first, then pass the options. UglifyJS will parse input files
-in sequence and apply any compression options. The files are parsed in the
-same global scope, that is, a reference from a file to some
-variable/function declared in another file will be matched properly.
-
-If no input file is specified, UglifyJS will read from STDIN.
-
-If you wish to pass your options before the input files, separate the two with
-a double dash to prevent input files being used as option arguments:
-
- uglifyjs --compress --mangle -- input.js
-
-### Command line options
-
-```
- -h, --help Print usage information.
- `--help options` for details on available options.
- -V, --version Print version number.
- -p, --parse Specify parser options:
- `acorn` Use Acorn for parsing.
- `bare_returns` Allow return outside of functions.
- Useful when minifying CommonJS
- modules and Userscripts that may
- be anonymous function wrapped (IIFE)
- by the .user.js engine `caller`.
- `expression` Parse a single expression, rather than
- a program (for parsing JSON).
- `spidermonkey` Assume input files are SpiderMonkey
- AST format (as JSON).
- -c, --compress [options] Enable compressor/specify compressor options:
- `pure_funcs` List of functions that can be safely
- removed when their return values are
- not used.
- -m, --mangle [options] Mangle names/specify mangler options:
- `reserved` List of names that should not be mangled.
- --mangle-props [options] Mangle properties/specify mangler options:
- `builtins` Mangle property names that overlaps
- with standard JavaScript globals.
- `debug` Add debug prefix and suffix.
- `domprops` Mangle property names that overlaps
- with DOM properties.
- `keep_quoted` Only mangle unquoted properties.
- `regex` Only mangle matched property names.
- `reserved` List of names that should not be mangled.
- -b, --beautify [options] Beautify output/specify output options:
- `beautify` Enabled with `--beautify` by default.
- `preamble` Preamble to prepend to the output. You
- can use this to insert a comment, for
- example for licensing information.
- This will not be parsed, but the source
- map will adjust for its presence.
- `quote_style` Quote style:
- 0 - auto
- 1 - single
- 2 - double
- 3 - original
- `wrap_iife` Wrap IIFEs in parenthesis. Note: you may
- want to disable `negate_iife` under
- compressor options.
- -O, --output-opts [options] Specify output options (`beautify` disabled by default).
- -o, --output Output file path (default STDOUT). Specify `ast` or
- `spidermonkey` to write UglifyJS or SpiderMonkey AST
- as JSON to STDOUT respectively.
- --comments [filter] Preserve copyright comments in the output. By
- default this works like Google Closure, keeping
- JSDoc-style comments that contain "@license" or
- "@preserve". You can optionally pass one of the
- following arguments to this flag:
- - "all" to keep all comments
- - a valid JS RegExp like `/foo/` or `/^!/` to
- keep only matching comments.
- Note that currently not *all* comments can be
- kept when compression is on, because of dead
- code removal or cascading statements into
- sequences.
- --config-file Read `minify()` options from JSON file.
- -d, --define [=value] Global definitions.
- -e, --enclose [arg[:value]] Embed everything in a big function, with configurable
- argument(s) & value(s).
- --ie8 Support non-standard Internet Explorer 8.
- Equivalent to setting `ie8: true` in `minify()`
- for `compress`, `mangle` and `output` options.
- By default UglifyJS will not try to be IE-proof.
- --keep-fnames Do not mangle/drop function names. Useful for
- code relying on Function.prototype.name.
- --name-cache File to hold mangled name mappings.
- --self Build UglifyJS as a library (implies --wrap UglifyJS)
- --source-map [options] Enable source map/specify source map options:
- `base` Path to compute relative paths from input files.
- `content` Input source map, useful if you're compressing
- JS that was generated from some other original
- code. Specify "inline" if the source map is
- included within the sources.
- `filename` Filename and/or location of the output source
- (sets `file` attribute in source map).
- `includeSources` Pass this flag if you want to include
- the content of source files in the
- source map as sourcesContent property.
- `root` Path to the original source to be included in
- the source map.
- `url` If specified, path to the source map to append in
- `//# sourceMappingURL`.
- --timings Display operations run time on STDERR.
- --toplevel Compress and/or mangle variables in top level scope.
- --verbose Print diagnostic messages.
- --warn Print warning messages.
- --wrap Embed everything in a big function, making the
- “exports” and “global” variables available. You
- need to pass an argument to this option to
- specify the name that your module will take
- when included in, say, a browser.
-```
-
-Specify `--output` (`-o`) to declare the output file. Otherwise the output
-goes to STDOUT.
-
-## CLI source map options
-
-UglifyJS can generate a source map file, which is highly useful for
-debugging your compressed JavaScript. To get a source map, pass
-`--source-map --output output.js` (source map will be written out to
-`output.js.map`).
-
-Additional options:
-
-- `--source-map "filename=''"` to specify the name of the source map. The value of
- `filename` is only used to set `file` attribute (see [the spec][sm-spec])
- in source map file.
-
-- `--source-map "root=''"` to pass the URL where the original files can be found.
-
-- `--source-map "url=''"` to specify the URL where the source map can be found.
- Otherwise UglifyJS assumes HTTP `X-SourceMap` is being used and will omit the
- `//# sourceMappingURL=` directive.
-
-For example:
-
- uglifyjs js/file1.js js/file2.js \
- -o foo.min.js -c -m \
- --source-map "root='http://foo.com/src',url='foo.min.js.map'"
-
-The above will compress and mangle `file1.js` and `file2.js`, will drop the
-output in `foo.min.js` and the source map in `foo.min.js.map`. The source
-mapping will refer to `http://foo.com/src/js/file1.js` and
-`http://foo.com/src/js/file2.js` (in fact it will list `http://foo.com/src`
-as the source map root, and the original files as `js/file1.js` and
-`js/file2.js`).
-
-### Composed source map
-
-When you're compressing JS code that was output by a compiler such as
-CoffeeScript, mapping to the JS code won't be too helpful. Instead, you'd
-like to map back to the original code (i.e. CoffeeScript). UglifyJS has an
-option to take an input source map. Assuming you have a mapping from
-CoffeeScript → compiled JS, UglifyJS can generate a map from CoffeeScript →
-compressed JS by mapping every token in the compiled JS to its original
-location.
-
-To use this feature pass `--source-map "content='/path/to/input/source.map'"`
-or `--source-map "content=inline"` if the source map is included inline with
-the sources.
-
-## CLI compress options
-
-You need to pass `--compress` (`-c`) to enable the compressor. Optionally
-you can pass a comma-separated list of [compress options](#compress-options).
-
-Options are in the form `foo=bar`, or just `foo` (the latter implies
-a boolean option that you want to set `true`; it's effectively a
-shortcut for `foo=true`).
-
-Example:
-
- uglifyjs file.js -c toplevel,sequences=false
-
-## CLI mangle options
-
-To enable the mangler you need to pass `--mangle` (`-m`). The following
-(comma-separated) options are supported:
-
-- `toplevel` (default `false`) -- mangle names declared in the top level scope.
-
-- `eval` (default `false`) -- mangle names visible in scopes where `eval` or `with` are used.
-
-When mangling is enabled but you want to prevent certain names from being
-mangled, you can declare those names with `--mangle reserved` — pass a
-comma-separated list of names. For example:
-
- uglifyjs ... -m reserved=['$','require','exports']
-
-to prevent the `require`, `exports` and `$` names from being changed.
-
-### CLI mangling property names (`--mangle-props`)
-
-**Note:** THIS WILL PROBABLY BREAK YOUR CODE. Mangling property names
-is a separate step, different from variable name mangling. Pass
-`--mangle-props` to enable it. It will mangle all properties in the
-input code with the exception of built in DOM properties and properties
-in core JavaScript classes. For example:
-
-```javascript
-// example.js
-var x = {
- baz_: 0,
- foo_: 1,
- calc: function() {
- return this.foo_ + this.baz_;
- }
-};
-x.bar_ = 2;
-x["baz_"] = 3;
-console.log(x.calc());
-```
-Mangle all properties (except for JavaScript `builtins`):
-```bash
-$ uglifyjs example.js -c -m --mangle-props
-```
-```javascript
-var x={o:0,_:1,l:function(){return this._+this.o}};x.t=2,x.o=3,console.log(x.l());
-```
-Mangle all properties except for `reserved` properties:
-```bash
-$ uglifyjs example.js -c -m --mangle-props reserved=[foo_,bar_]
-```
-```javascript
-var x={o:0,foo_:1,_:function(){return this.foo_+this.o}};x.bar_=2,x.o=3,console.log(x._());
-```
-Mangle all properties matching a `regex`:
-```bash
-$ uglifyjs example.js -c -m --mangle-props regex=/_$/
-```
-```javascript
-var x={o:0,_:1,calc:function(){return this._+this.o}};x.l=2,x.o=3,console.log(x.calc());
-```
-
-Combining mangle properties options:
-```bash
-$ uglifyjs example.js -c -m --mangle-props regex=/_$/,reserved=[bar_]
-```
-```javascript
-var x={o:0,_:1,calc:function(){return this._+this.o}};x.bar_=2,x.o=3,console.log(x.calc());
-```
-
-In order for this to be of any use, we avoid mangling standard JS names by
-default (`--mangle-props builtins` to override).
-
-A default exclusion file is provided in `tools/domprops.json` which should
-cover most standard JS and DOM properties defined in various browsers. Pass
-`--mangle-props domprops` to disable this feature.
-
-A regular expression can be used to define which property names should be
-mangled. For example, `--mangle-props regex=/^_/` will only mangle property
-names that start with an underscore.
-
-When you compress multiple files using this option, in order for them to
-work together in the end we need to ensure somehow that one property gets
-mangled to the same name in all of them. For this, pass `--name-cache filename.json`
-and UglifyJS will maintain these mappings in a file which can then be reused.
-It should be initially empty. Example:
-
-```bash
-$ rm -f /tmp/cache.json # start fresh
-$ uglifyjs file1.js file2.js --mangle-props --name-cache /tmp/cache.json -o part1.js
-$ uglifyjs file3.js file4.js --mangle-props --name-cache /tmp/cache.json -o part2.js
-```
-
-Now, `part1.js` and `part2.js` will be consistent with each other in terms
-of mangled property names.
-
-Using the name cache is not necessary if you compress all your files in a
-single call to UglifyJS.
-
-### Mangling unquoted names (`--mangle-props keep_quoted`)
-
-Using quoted property name (`o["foo"]`) reserves the property name (`foo`)
-so that it is not mangled throughout the entire script even when used in an
-unquoted style (`o.foo`). Example:
-
-```javascript
-// stuff.js
-var o = {
- "foo": 1,
- bar: 3
-};
-o.foo += o.bar;
-console.log(o.foo);
-```
-```bash
-$ uglifyjs stuff.js --mangle-props keep_quoted -c -m
-```
-```javascript
-var o={foo:1,o:3};o.foo+=o.o,console.log(o.foo);
-```
-
-### Debugging property name mangling
-
-You can also pass `--mangle-props debug` in order to mangle property names
-without completely obscuring them. For example the property `o.foo`
-would mangle to `o._$foo$_` with this option. This allows property mangling
-of a large codebase while still being able to debug the code and identify
-where mangling is breaking things.
-
-```bash
-$ uglifyjs stuff.js --mangle-props debug -c -m
-```
-```javascript
-var o={_$foo$_:1,_$bar$_:3};o._$foo$_+=o._$bar$_,console.log(o._$foo$_);
-```
-
-You can also pass a custom suffix using `--mangle-props debug=XYZ`. This would then
-mangle `o.foo` to `o._$foo$XYZ_`. You can change this each time you compile a
-script to identify how a property got mangled. One technique is to pass a
-random number on every compile to simulate mangling changing with different
-inputs (e.g. as you update the input script with new properties), and to help
-identify mistakes like writing mangled keys to storage.
-
-
-# API Reference
-
-Assuming installation via NPM, you can load UglifyJS in your application
-like this:
-```javascript
-var UglifyJS = require("uglify-js");
-```
-
-There is a single high level function, **`minify(code, options)`**,
-which will perform all minification [phases](#minify-options) in a configurable
-manner. By default `minify()` will enable the options [`compress`](#compress-options)
-and [`mangle`](#mangle-options). Example:
-```javascript
-var code = "function add(first, second) { return first + second; }";
-var result = UglifyJS.minify(code);
-console.log(result.error); // runtime error, or `undefined` if no error
-console.log(result.code); // minified output: function add(n,d){return n+d}
-```
-
-You can `minify` more than one JavaScript file at a time by using an object
-for the first argument where the keys are file names and the values are source
-code:
-```javascript
-var code = {
- "file1.js": "function add(first, second) { return first + second; }",
- "file2.js": "console.log(add(1 + 2, 3 + 4));"
-};
-var result = UglifyJS.minify(code);
-console.log(result.code);
-// function add(d,n){return d+n}console.log(add(3,7));
-```
-
-The `toplevel` option:
-```javascript
-var code = {
- "file1.js": "function add(first, second) { return first + second; }",
- "file2.js": "console.log(add(1 + 2, 3 + 4));"
-};
-var options = { toplevel: true };
-var result = UglifyJS.minify(code, options);
-console.log(result.code);
-// console.log(3+7);
-```
-
-The `nameCache` option:
-```javascript
-var options = {
- mangle: {
- toplevel: true,
- },
- nameCache: {}
-};
-var result1 = UglifyJS.minify({
- "file1.js": "function add(first, second) { return first + second; }"
-}, options);
-var result2 = UglifyJS.minify({
- "file2.js": "console.log(add(1 + 2, 3 + 4));"
-}, options);
-console.log(result1.code);
-// function n(n,r){return n+r}
-console.log(result2.code);
-// console.log(n(3,7));
-```
-
-You may persist the name cache to the file system in the following way:
-```javascript
-var cacheFileName = "/tmp/cache.json";
-var options = {
- mangle: {
- properties: true,
- },
- nameCache: JSON.parse(fs.readFileSync(cacheFileName, "utf8"))
-};
-fs.writeFileSync("part1.js", UglifyJS.minify({
- "file1.js": fs.readFileSync("file1.js", "utf8"),
- "file2.js": fs.readFileSync("file2.js", "utf8")
-}, options).code, "utf8");
-fs.writeFileSync("part2.js", UglifyJS.minify({
- "file3.js": fs.readFileSync("file3.js", "utf8"),
- "file4.js": fs.readFileSync("file4.js", "utf8")
-}, options).code, "utf8");
-fs.writeFileSync(cacheFileName, JSON.stringify(options.nameCache), "utf8");
-```
-
-An example of a combination of `minify()` options:
-```javascript
-var code = {
- "file1.js": "function add(first, second) { return first + second; }",
- "file2.js": "console.log(add(1 + 2, 3 + 4));"
-};
-var options = {
- toplevel: true,
- compress: {
- global_defs: {
- "@console.log": "alert"
- },
- passes: 2
- },
- output: {
- beautify: false,
- preamble: "/* uglified */"
- }
-};
-var result = UglifyJS.minify(code, options);
-console.log(result.code);
-// /* uglified */
-// alert(10);"
-```
-
-To produce warnings:
-```javascript
-var code = "function f(){ var u; return 2 + 3; }";
-var options = { warnings: true };
-var result = UglifyJS.minify(code, options);
-console.log(result.error); // runtime error, `undefined` in this case
-console.log(result.warnings); // [ 'Dropping unused variable u [0:1,18]' ]
-console.log(result.code); // function f(){return 5}
-```
-
-An error example:
-```javascript
-var result = UglifyJS.minify({"foo.js" : "if (0) else console.log(1);"});
-console.log(JSON.stringify(result.error));
-// {"message":"Unexpected token: keyword (else)","filename":"foo.js","line":1,"col":7,"pos":7}
-```
-Note: unlike `uglify-js@2.x`, the `3.x` API does not throw errors. To
-achieve a similar effect one could do the following:
-```javascript
-var result = UglifyJS.minify(code, options);
-if (result.error) throw result.error;
-```
-
-## Minify options
-
-- `compress` (default `{}`) — pass `false` to skip compressing entirely.
- Pass an object to specify custom [compress options](#compress-options).
-
-- `ie8` (default `false`) -- set to `true` to support IE8.
-
-- `keep_fnames` (default: `false`) -- pass `true` to prevent discarding or mangling
- of function names. Useful for code relying on `Function.prototype.name`.
-
-- `mangle` (default `true`) — pass `false` to skip mangling names, or pass
- an object to specify [mangle options](#mangle-options) (see below).
-
- - `mangle.properties` (default `false`) — a subcategory of the mangle option.
- Pass an object to specify custom [mangle property options](#mangle-properties-options).
-
-- `nameCache` (default `null`) -- pass an empty object `{}` or a previously
- used `nameCache` object if you wish to cache mangled variable and
- property names across multiple invocations of `minify()`. Note: this is
- a read/write property. `minify()` will read the name cache state of this
- object and update it during minification so that it may be
- reused or externally persisted by the user.
-
-- `output` (default `null`) — pass an object if you wish to specify
- additional [output options](#output-options). The defaults are optimized
- for best compression.
-
-- `parse` (default `{}`) — pass an object if you wish to specify some
- additional [parse options](#parse-options).
-
-- `sourceMap` (default `false`) -- pass an object if you wish to specify
- [source map options](#source-map-options).
-
-- `toplevel` (default `false`) -- set to `true` if you wish to enable top level
- variable and function name mangling and to drop unused variables and functions.
-
-- `warnings` (default `false`) — pass `true` to return compressor warnings
- in `result.warnings`. Use the value `"verbose"` for more detailed warnings.
-
-## Minify options structure
-
-```javascript
-{
- parse: {
- // parse options
- },
- compress: {
- // compress options
- },
- mangle: {
- // mangle options
-
- properties: {
- // mangle property options
- }
- },
- output: {
- // output options
- },
- sourceMap: {
- // source map options
- },
- nameCache: null, // or specify a name cache object
- toplevel: false,
- ie8: false,
- warnings: false,
-}
-```
-
-### Source map options
-
-To generate a source map:
-```javascript
-var result = UglifyJS.minify({"file1.js": "var a = function() {};"}, {
- sourceMap: {
- filename: "out.js",
- url: "out.js.map"
- }
-});
-console.log(result.code); // minified output
-console.log(result.map); // source map
-```
-
-Note that the source map is not saved in a file, it's just returned in
-`result.map`. The value passed for `sourceMap.url` is only used to set
-`//# sourceMappingURL=out.js.map` in `result.code`. The value of
-`filename` is only used to set `file` attribute (see [the spec][sm-spec])
-in source map file.
-
-You can set option `sourceMap.url` to be `"inline"` and source map will
-be appended to code.
-
-You can also specify sourceRoot property to be included in source map:
-```javascript
-var result = UglifyJS.minify({"file1.js": "var a = function() {};"}, {
- sourceMap: {
- root: "http://example.com/src",
- url: "out.js.map"
- }
-});
-```
-
-If you're compressing compiled JavaScript and have a source map for it, you
-can use `sourceMap.content`:
-```javascript
-var result = UglifyJS.minify({"compiled.js": "compiled code"}, {
- sourceMap: {
- content: "content from compiled.js.map",
- url: "minified.js.map"
- }
-});
-// same as before, it returns `code` and `map`
-```
-
-If you're using the `X-SourceMap` header instead, you can just omit `sourceMap.url`.
-
-## Parse options
-
-- `bare_returns` (default `false`) -- support top level `return` statements
-
-- `html5_comments` (default `true`)
-
-- `shebang` (default `true`) -- support `#!command` as the first line
-
-## Compress options
-
-- `arguments` (default: `true`) -- replace `arguments[index]` with function
- parameter name whenever possible.
-
-- `assignments` (default: `true`) -- apply optimizations to assignment expressions.
-
-- `booleans` (default: `true`) -- various optimizations for boolean context,
- for example `!!a ? b : c → a ? b : c`
-
-- `collapse_vars` (default: `true`) -- Collapse single-use non-constant variables,
- side effects permitting.
-
-- `comparisons` (default: `true`) -- apply certain optimizations to binary nodes,
- e.g. `!(a <= b) → a > b`, attempts to negate binary nodes, e.g.
- `a = !b && !c && !d && !e → a=!(b||c||d||e)` etc.
-
-- `conditionals` (default: `true`) -- apply optimizations for `if`-s and conditional
- expressions
-
-- `dead_code` (default: `true`) -- remove unreachable code
-
-- `directives` (default: `true`) -- remove redundant or non-standard directives
-
-- `drop_console` (default: `false`) -- Pass `true` to discard calls to
- `console.*` functions. If you wish to drop a specific function call
- such as `console.info` and/or retain side effects from function arguments
- after dropping the function call then use `pure_funcs` instead.
-
-- `drop_debugger` (default: `true`) -- remove `debugger;` statements
-
-- `evaluate` (default: `true`) -- Evaluate expression for shorter constant
- representation. Pass `"eager"` to always replace function calls whenever
- possible, or a positive integer to specify an upper bound for each individual
- evaluation in number of characters.
-
-- `expression` (default: `false`) -- Pass `true` to preserve completion values
- from terminal statements without `return`, e.g. in bookmarklets.
-
-- `functions` (default: `true`) -- convert declarations from `var`to `function`
- whenever possible.
-
-- `global_defs` (default: `{}`) -- see [conditional compilation](#conditional-compilation)
-
-- `hoist_funs` (default: `false`) -- hoist function declarations
-
-- `hoist_props` (default: `true`) -- hoist properties from constant object and
- array literals into regular variables subject to a set of constraints. For example:
- `var o={p:1, q:2}; f(o.p, o.q);` is converted to `f(1, 2);`. Note: `hoist_props`
- works best with `mangle` enabled, the `compress` option `passes` set to `2` or higher,
- and the `compress` option `toplevel` enabled.
-
-- `hoist_vars` (default: `false`) -- hoist `var` declarations (this is `false`
- by default because it seems to increase the size of the output in general)
-
-- `if_return` (default: `true`) -- optimizations for if/return and if/continue
-
-- `inline` (default: `true`) -- inline calls to function with simple/`return` statement:
- - `false` -- same as `0`
- - `0` -- disabled inlining
- - `1` -- inline simple functions
- - `2` -- inline functions with arguments
- - `3` -- inline functions with arguments and variables
- - `true` -- same as `3`
-
-- `join_vars` (default: `true`) -- join consecutive `var` statements
-
-- `keep_fargs` (default: `strict`) -- Discard unused function arguments. Code
- which relies on `Function.length` will break if this is done indiscriminately,
- i.e. when passing `true`. Pass `false` to always retain function arguments.
-
-- `keep_fnames` (default: `false`) -- Pass `true` to prevent the
- compressor from discarding function names. Useful for code relying on
- `Function.prototype.name`. See also: the `keep_fnames` [mangle option](#mangle-options).
-
-- `keep_infinity` (default: `false`) -- Pass `true` to prevent `Infinity` from
- being compressed into `1/0`, which may cause performance issues on Chrome.
-
-- `loops` (default: `true`) -- optimizations for `do`, `while` and `for` loops
- when we can statically determine the condition.
-
-- `negate_iife` (default: `true`) -- negate "Immediately-Called Function Expressions"
- where the return value is discarded, to avoid the parens that the
- code generator would insert.
-
-- `objects` (default: `true`) -- compact duplicate keys in object literals.
-
-- `passes` (default: `1`) -- The maximum number of times to run compress.
- In some cases more than one pass leads to further compressed code. Keep in
- mind more passes will take more time.
-
-- `properties` (default: `true`) -- rewrite property access using the dot notation, for
- example `foo["bar"] → foo.bar`
-
-- `pure_funcs` (default: `null`) -- You can pass an array of names and
- UglifyJS will assume that those functions do not produce side
- effects. DANGER: will not check if the name is redefined in scope.
- An example case here, for instance `var q = Math.floor(a/b)`. If
- variable `q` is not used elsewhere, UglifyJS will drop it, but will
- still keep the `Math.floor(a/b)`, not knowing what it does. You can
- pass `pure_funcs: [ 'Math.floor' ]` to let it know that this
- function won't produce any side effect, in which case the whole
- statement would get discarded. The current implementation adds some
- overhead (compression will be slower). Make sure symbols under `pure_funcs`
- are also under `mangle.reserved` to avoid mangling.
-
-- `pure_getters` (default: `"strict"`) -- If you pass `true` for
- this, UglifyJS will assume that object property access
- (e.g. `foo.bar` or `foo["bar"]`) doesn't have any side effects.
- Specify `"strict"` to treat `foo.bar` as side-effect-free only when
- `foo` is certain to not throw, i.e. not `null` or `undefined`.
-
-- `reduce_funcs` (default: `true`) -- Allows single-use functions to be
- inlined as function expressions when permissible allowing further
- optimization. Enabled by default. Option depends on `reduce_vars`
- being enabled. Some code runs faster in the Chrome V8 engine if this
- option is disabled. Does not negatively impact other major browsers.
-
-- `reduce_vars` (default: `true`) -- Improve optimization on variables assigned with and
- used as constant values.
-
-- `sequences` (default: `true`) -- join consecutive simple statements using the
- comma operator. May be set to a positive integer to specify the maximum number
- of consecutive comma sequences that will be generated. If this option is set to
- `true` then the default `sequences` limit is `200`. Set option to `false` or `0`
- to disable. The smallest `sequences` length is `2`. A `sequences` value of `1`
- is grandfathered to be equivalent to `true` and as such means `200`. On rare
- occasions the default sequences limit leads to very slow compress times in which
- case a value of `20` or less is recommended.
-
-- `side_effects` (default: `true`) -- Pass `false` to disable potentially dropping
- functions marked as "pure". A function call is marked as "pure" if a comment
- annotation `/*@__PURE__*/` or `/*#__PURE__*/` immediately precedes the call. For
- example: `/*@__PURE__*/foo();`
-
-- `strings` (default: `true`) -- compact string concatenations.
-
-- `switches` (default: `true`) -- de-duplicate and remove unreachable `switch` branches
-
-- `toplevel` (default: `false`) -- drop unreferenced functions (`"funcs"`) and/or
- variables (`"vars"`) in the top level scope (`false` by default, `true` to drop
- both unreferenced functions and variables)
-
-- `top_retain` (default: `null`) -- prevent specific toplevel functions and
- variables from `unused` removal (can be array, comma-separated, RegExp or
- function. Implies `toplevel`)
-
-- `typeofs` (default: `true`) -- Transforms `typeof foo == "undefined"` into
- `foo === void 0`. Note: recommend to set this value to `false` for IE10 and
- earlier versions due to known issues.
-
-- `unsafe` (default: `false`) -- apply "unsafe" transformations (discussion below)
-
-- `unsafe_comps` (default: `false`) -- compress expressions like `a <= b` assuming
- none of the operands can be (coerced to) `NaN`.
-
-- `unsafe_Function` (default: `false`) -- compress and mangle `Function(args, code)`
- when both `args` and `code` are string literals.
-
-- `unsafe_math` (default: `false`) -- optimize numerical expressions like
- `2 * x * 3` into `6 * x`, which may give imprecise floating point results.
-
-- `unsafe_proto` (default: `false`) -- optimize expressions like
- `Array.prototype.slice.call(a)` into `[].slice.call(a)`
-
-- `unsafe_regexp` (default: `false`) -- enable substitutions of variables with
- `RegExp` values the same way as if they are constants.
-
-- `unsafe_undefined` (default: `false`) -- substitute `void 0` if there is a
- variable named `undefined` in scope (variable name will be mangled, typically
- reduced to a single character)
-
-- `unused` (default: `true`) -- drop unreferenced functions and variables (simple
- direct variable assignments do not count as references unless set to `"keep_assign"`)
-
-## Mangle options
-
-- `eval` (default `false`) -- Pass `true` to mangle names visible in scopes
- where `eval` or `with` are used.
-
-- `keep_fnames` (default `false`) -- Pass `true` to not mangle function names.
- Useful for code relying on `Function.prototype.name`. See also: the `keep_fnames`
- [compress option](#compress-options).
-
-- `reserved` (default `[]`) -- Pass an array of identifiers that should be
- excluded from mangling. Example: `["foo", "bar"]`.
-
-- `toplevel` (default `false`) -- Pass `true` to mangle names declared in the
- top level scope.
-
-Examples:
-
-```javascript
-// test.js
-var globalVar;
-function funcName(firstLongName, anotherLongName) {
- var myVariable = firstLongName + anotherLongName;
-}
-```
-```javascript
-var code = fs.readFileSync("test.js", "utf8");
-
-UglifyJS.minify(code).code;
-// 'function funcName(a,n){}var globalVar;'
-
-UglifyJS.minify(code, { mangle: { reserved: ['firstLongName'] } }).code;
-// 'function funcName(firstLongName,a){}var globalVar;'
-
-UglifyJS.minify(code, { mangle: { toplevel: true } }).code;
-// 'function n(n,a){}var a;'
-```
-
-### Mangle properties options
-
-- `builtins` (default: `false`) -- Use `true` to allow the mangling of builtin
- DOM properties. Not recommended to override this setting.
-
-- `debug` (default: `false`) -— Mangle names with the original name still present.
- Pass an empty string `""` to enable, or a non-empty string to set the debug suffix.
-
-- `keep_quoted` (default: `false`) -— Only mangle unquoted property names.
-
-- `regex` (default: `null`) -— Pass a RegExp literal to only mangle property
- names matching the regular expression.
-
-- `reserved` (default: `[]`) -- Do not mangle property names listed in the
- `reserved` array.
-
-## Output options
-
-The code generator tries to output shortest code possible by default. In
-case you want beautified output, pass `--beautify` (`-b`). Optionally you
-can pass additional arguments that control the code output:
-
-- `ascii_only` (default `false`) -- escape Unicode characters in strings and
- regexps (affects directives with non-ascii characters becoming invalid)
-
-- `beautify` (default `true`) -- whether to actually beautify the output.
- Passing `-b` will set this to true, but you might need to pass `-b` even
- when you want to generate minified code, in order to specify additional
- arguments, so you can use `-b beautify=false` to override it.
-
-- `braces` (default `false`) -- always insert braces in `if`, `for`,
- `do`, `while` or `with` statements, even if their body is a single
- statement.
-
-- `comments` (default `false`) -- pass `true` or `"all"` to preserve all
- comments, `"some"` to preserve some comments, a regular expression string
- (e.g. `/^!/`) or a function.
-
-- `indent_level` (default `4`)
-
-- `indent_start` (default `0`) -- prefix all lines by that many spaces
-
-- `inline_script` (default `true`) -- escape HTML comments and the slash in
- occurrences of `` in strings
-
-- `keep_quoted_props` (default `false`) -- when turned on, prevents stripping
- quotes from property names in object literals.
-
-- `max_line_len` (default `false`) -- maximum line length (for uglified code)
-
-- `preamble` (default `null`) -- when passed it must be a string and
- it will be prepended to the output literally. The source map will
- adjust for this text. Can be used to insert a comment containing
- licensing information, for example.
-
-- `preserve_line` (default `false`) -- pass `true` to retain line numbering on
- a best effort basis.
-
-- `quote_keys` (default `false`) -- pass `true` to quote all keys in literal
- objects
-
-- `quote_style` (default `0`) -- preferred quote style for strings (affects
- quoted property names and directives as well):
- - `0` -- prefers double quotes, switches to single quotes when there are
- more double quotes in the string itself. `0` is best for gzip size.
- - `1` -- always use single quotes
- - `2` -- always use double quotes
- - `3` -- always use the original quotes
-
-- `semicolons` (default `true`) -- separate statements with semicolons. If
- you pass `false` then whenever possible we will use a newline instead of a
- semicolon, leading to more readable output of uglified code (size before
- gzip could be smaller; size after gzip insignificantly larger).
-
-- `shebang` (default `true`) -- preserve shebang `#!` in preamble (bash scripts)
-
-- `webkit` (default `false`) -- enable workarounds for WebKit bugs.
- PhantomJS users should set this option to `true`.
-
-- `width` (default `80`) -- only takes effect when beautification is on, this
- specifies an (orientative) line width that the beautifier will try to
- obey. It refers to the width of the line text (excluding indentation).
- It doesn't work very well currently, but it does make the code generated
- by UglifyJS more readable.
-
-- `wrap_iife` (default `false`) -- pass `true` to wrap immediately invoked
- function expressions. See
- [#640](https://github.com/mishoo/UglifyJS2/issues/640) for more details.
-
-# Miscellaneous
-
-### Keeping copyright notices or other comments
-
-You can pass `--comments` to retain certain comments in the output. By
-default it will keep JSDoc-style comments that contain "@preserve",
-"@license" or "@cc_on" (conditional compilation for IE). You can pass
-`--comments all` to keep all the comments, or a valid JavaScript regexp to
-keep only comments that match this regexp. For example `--comments /^!/`
-will keep comments like `/*! Copyright Notice */`.
-
-Note, however, that there might be situations where comments are lost. For
-example:
-```javascript
-function f() {
- /** @preserve Foo Bar */
- function g() {
- // this function is never called
- }
- return something();
-}
-```
-
-Even though it has "@preserve", the comment will be lost because the inner
-function `g` (which is the AST node to which the comment is attached to) is
-discarded by the compressor as not referenced.
-
-The safest comments where to place copyright information (or other info that
-needs to be kept in the output) are comments attached to toplevel nodes.
-
-### The `unsafe` `compress` option
-
-It enables some transformations that *might* break code logic in certain
-contrived cases, but should be fine for most code. You might want to try it
-on your own code, it should reduce the minified size. Here's what happens
-when this flag is on:
-
-- `new Array(1, 2, 3)` or `Array(1, 2, 3)` → `[ 1, 2, 3 ]`
-- `new Object()` → `{}`
-- `String(exp)` or `exp.toString()` → `"" + exp`
-- `new Object/RegExp/Function/Error/Array (...)` → we discard the `new`
-
-### Conditional compilation
-
-You can use the `--define` (`-d`) switch in order to declare global
-variables that UglifyJS will assume to be constants (unless defined in
-scope). For example if you pass `--define DEBUG=false` then, coupled with
-dead code removal UglifyJS will discard the following from the output:
-```javascript
-if (DEBUG) {
- console.log("debug stuff");
-}
-```
-
-You can specify nested constants in the form of `--define env.DEBUG=false`.
-
-UglifyJS will warn about the condition being always false and about dropping
-unreachable code; for now there is no option to turn off only this specific
-warning, you can pass `warnings=false` to turn off *all* warnings.
-
-Another way of doing that is to declare your globals as constants in a
-separate file and include it into the build. For example you can have a
-`build/defines.js` file with the following:
-```javascript
-var DEBUG = false;
-var PRODUCTION = true;
-// etc.
-```
-
-and build your code like this:
-
- uglifyjs build/defines.js js/foo.js js/bar.js... -c
-
-UglifyJS will notice the constants and, since they cannot be altered, it
-will evaluate references to them to the value itself and drop unreachable
-code as usual. The build will contain the `const` declarations if you use
-them. If you are targeting < ES6 environments which does not support `const`,
-using `var` with `reduce_vars` (enabled by default) should suffice.
-
-### Conditional compilation API
-
-You can also use conditional compilation via the programmatic API. With the difference that the
-property name is `global_defs` and is a compressor property:
-
-```javascript
-var result = UglifyJS.minify(fs.readFileSync("input.js", "utf8"), {
- compress: {
- dead_code: true,
- global_defs: {
- DEBUG: false
- }
- }
-});
-```
-
-To replace an identifier with an arbitrary non-constant expression it is
-necessary to prefix the `global_defs` key with `"@"` to instruct UglifyJS
-to parse the value as an expression:
-```javascript
-UglifyJS.minify("alert('hello');", {
- compress: {
- global_defs: {
- "@alert": "console.log"
- }
- }
-}).code;
-// returns: 'console.log("hello");'
-```
-
-Otherwise it would be replaced as string literal:
-```javascript
-UglifyJS.minify("alert('hello');", {
- compress: {
- global_defs: {
- "alert": "console.log"
- }
- }
-}).code;
-// returns: '"console.log"("hello");'
-```
-
-### Using native Uglify AST with `minify()`
-```javascript
-// example: parse only, produce native Uglify AST
-
-var result = UglifyJS.minify(code, {
- parse: {},
- compress: false,
- mangle: false,
- output: {
- ast: true,
- code: false // optional - faster if false
- }
-});
-
-// result.ast contains native Uglify AST
-```
-```javascript
-// example: accept native Uglify AST input and then compress and mangle
-// to produce both code and native AST.
-
-var result = UglifyJS.minify(ast, {
- compress: {},
- mangle: {},
- output: {
- ast: true,
- code: true // optional - faster if false
- }
-});
-
-// result.ast contains native Uglify AST
-// result.code contains the minified code in string form.
-```
-
-### Working with Uglify AST
-
-Transversal and transformation of the native AST can be performed through
-[`TreeWalker`](https://github.com/mishoo/UglifyJS2/blob/master/lib/ast.js) and
-[`TreeTransformer`](https://github.com/mishoo/UglifyJS2/blob/master/lib/transform.js)
-respectively.
-
-### ESTree / SpiderMonkey AST
-
-UglifyJS has its own abstract syntax tree format; for
-[practical reasons](http://lisperator.net/blog/uglifyjs-why-not-switching-to-spidermonkey-ast/)
-we can't easily change to using the SpiderMonkey AST internally. However,
-UglifyJS now has a converter which can import a SpiderMonkey AST.
-
-For example [Acorn][acorn] is a super-fast parser that produces a
-SpiderMonkey AST. It has a small CLI utility that parses one file and dumps
-the AST in JSON on the standard output. To use UglifyJS to mangle and
-compress that:
-
- acorn file.js | uglifyjs -p spidermonkey -m -c
-
-The `-p spidermonkey` option tells UglifyJS that all input files are not
-JavaScript, but JS code described in SpiderMonkey AST in JSON. Therefore we
-don't use our own parser in this case, but just transform that AST into our
-internal AST.
-
-### Use Acorn for parsing
-
-More for fun, I added the `-p acorn` option which will use Acorn to do all
-the parsing. If you pass this option, UglifyJS will `require("acorn")`.
-
-Acorn is really fast (e.g. 250ms instead of 380ms on some 650K code), but
-converting the SpiderMonkey tree that Acorn produces takes another 150ms so
-in total it's a bit more than just using UglifyJS's own parser.
-
-[acorn]: https://github.com/ternjs/acorn
-[sm-spec]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k
-
-### Uglify Fast Minify Mode
-
-It's not well known, but whitespace removal and symbol mangling accounts
-for 95% of the size reduction in minified code for most JavaScript - not
-elaborate code transforms. One can simply disable `compress` to speed up
-Uglify builds by 3 to 4 times. In this fast `mangle`-only mode Uglify has
-comparable minify speeds and gzip sizes to
-[`butternut`](https://www.npmjs.com/package/butternut):
-
-| d3.js | minify size | gzip size | minify time (seconds) |
-| --- | ---: | ---: | ---: |
-| original | 451,131 | 108,733 | - |
-| uglify-js@3.0.24 mangle=false, compress=false | 316,600 | 85,245 | 0.70 |
-| uglify-js@3.0.24 mangle=true, compress=false | 220,216 | 72,730 | 1.13 |
-| butternut@0.4.6 | 217,568 | 72,738 | 1.41 |
-| uglify-js@3.0.24 mangle=true, compress=true | 212,511 | 71,560 | 3.36 |
-| babili@0.1.4 | 210,713 | 72,140 | 12.64 |
-
-To enable fast minify mode from the CLI use:
-```
-uglifyjs file.js -m
-```
-To enable fast minify mode with the API use:
-```js
-UglifyJS.minify(code, { compress: false, mangle: true });
-```
-
-#### Source maps and debugging
-
-Various `compress` transforms that simplify, rearrange, inline and remove code
-are known to have an adverse effect on debugging with source maps. This is
-expected as code is optimized and mappings are often simply not possible as
-some code no longer exists. For highest fidelity in source map debugging
-disable the Uglify `compress` option and just use `mangle`.
-
-### Compiler assumptions
-
-To allow for better optimizations, the compiler makes various assumptions:
-
-- `.toString()` and `.valueOf()` don't have side effects, and for built-in
- objects they have not been overridden.
-- `undefined`, `NaN` and `Infinity` have not been externally redefined.
-- `arguments.callee`, `arguments.caller` and `Function.prototype.caller` are not used.
-- The code doesn't expect the contents of `Function.prototype.toString()` or
- `Error.prototype.stack` to be anything in particular.
-- Getting and setting properties on a plain object does not cause other side effects
- (using `.watch()` or `Proxy`).
-- Object properties can be added, removed and modified (not prevented with
- `Object.defineProperty()`, `Object.defineProperties()`, `Object.freeze()`,
- `Object.preventExtensions()` or `Object.seal()`).
diff --git a/node_modules/uglify-js/bin/uglifyjs b/node_modules/uglify-js/bin/uglifyjs
deleted file mode 100755
index 4528b87..0000000
--- a/node_modules/uglify-js/bin/uglifyjs
+++ /dev/null
@@ -1,424 +0,0 @@
-#! /usr/bin/env node
-// -*- js -*-
-
-"use strict";
-
-require("../tools/exit");
-
-var fs = require("fs");
-var info = require("../package.json");
-var path = require("path");
-var program = require("commander");
-var UglifyJS = require("../tools/node");
-
-var skip_keys = [ "cname", "inlined", "parent_scope", "scope", "uses_eval", "uses_with" ];
-var files = {};
-var options = {
- compress: false,
- mangle: false
-};
-program.version(info.name + " " + info.version);
-program.parseArgv = program.parse;
-program.parse = undefined;
-if (process.argv.indexOf("ast") >= 0) program.helpInformation = UglifyJS.describe_ast;
-else if (process.argv.indexOf("options") >= 0) program.helpInformation = function() {
- var text = [];
- var options = UglifyJS.default_options();
- for (var option in options) {
- text.push("--" + (option == "output" ? "beautify" : option == "sourceMap" ? "source-map" : option) + " options:");
- text.push(format_object(options[option]));
- text.push("");
- }
- return text.join("\n");
-};
-program.option("-p, --parse ", "Specify parser options.", parse_js());
-program.option("-c, --compress [options]", "Enable compressor/specify compressor options.", parse_js());
-program.option("-m, --mangle [options]", "Mangle names/specify mangler options.", parse_js());
-program.option("--mangle-props [options]", "Mangle properties/specify mangler options.", parse_js());
-program.option("-b, --beautify [options]", "Beautify output/specify output options.", parse_js());
-program.option("-O, --output-opts [options]", "Output options (beautify disabled).", parse_js());
-program.option("-o, --output ", "Output file (default STDOUT).");
-program.option("--comments [filter]", "Preserve copyright comments in the output.");
-program.option("--config-file ", "Read minify() options from JSON file.");
-program.option("-d, --define [=value]", "Global definitions.", parse_js("define"));
-program.option("-e, --enclose [arg[,...][:value[,...]]]", "Embed everything in a big function, with configurable argument(s) & value(s).");
-program.option("--ie8", "Support non-standard Internet Explorer 8.");
-program.option("--keep-fnames", "Do not mangle/drop function names. Useful for code relying on Function.prototype.name.");
-program.option("--name-cache ", "File to hold mangled name mappings.");
-program.option("--rename", "Force symbol expansion.");
-program.option("--no-rename", "Disable symbol expansion.");
-program.option("--self", "Build UglifyJS as a library (implies --wrap UglifyJS)");
-program.option("--source-map [options]", "Enable source map/specify source map options.", parse_js());
-program.option("--timings", "Display operations run time on STDERR.");
-program.option("--toplevel", "Compress and/or mangle variables in toplevel scope.");
-program.option("--verbose", "Print diagnostic messages.");
-program.option("--warn", "Print warning messages.");
-program.option("--wrap ", "Embed everything as a function with “exports” corresponding to “name” globally.");
-program.arguments("[files...]").parseArgv(process.argv);
-if (program.configFile) {
- options = JSON.parse(read_file(program.configFile));
- if (options.mangle && options.mangle.properties && options.mangle.properties.regex) {
- options.mangle.properties.regex = UglifyJS.parse(options.mangle.properties.regex, {
- expression: true
- }).value;
- }
-}
-if (!program.output && program.sourceMap && program.sourceMap.url != "inline") {
- fatal("cannot write source map to STDOUT");
-}
-[
- "compress",
- "enclose",
- "ie8",
- "mangle",
- "sourceMap",
- "toplevel",
- "wrap"
-].forEach(function(name) {
- if (name in program) {
- options[name] = program[name];
- }
-});
-if (program.verbose) {
- options.warnings = "verbose";
-} else if (program.warn) {
- options.warnings = true;
-}
-if (options.warnings) {
- UglifyJS.AST_Node.log_function(print_error, options.warnings == "verbose");
- delete options.warnings;
-}
-if (program.beautify) {
- options.output = typeof program.beautify == "object" ? program.beautify : {};
- if (!("beautify" in options.output)) {
- options.output.beautify = true;
- }
-}
-if (program.outputOpts) {
- if (program.beautify) fatal("--beautify cannot be used with --output-opts");
- options.output = typeof program.outputOpts == "object" ? program.outputOpts : {};
-}
-if (program.comments) {
- if (typeof options.output != "object") options.output = {};
- options.output.comments = typeof program.comments == "string" ? program.comments : "some";
-}
-if (program.define) {
- if (typeof options.compress != "object") options.compress = {};
- if (typeof options.compress.global_defs != "object") options.compress.global_defs = {};
- for (var expr in program.define) {
- options.compress.global_defs[expr] = program.define[expr];
- }
-}
-if (program.keepFnames) {
- options.keep_fnames = true;
-}
-if (program.mangleProps) {
- if (program.mangleProps.domprops) {
- delete program.mangleProps.domprops;
- } else {
- if (typeof program.mangleProps != "object") program.mangleProps = {};
- if (!Array.isArray(program.mangleProps.reserved)) program.mangleProps.reserved = [];
- require("../tools/domprops").forEach(function(name) {
- UglifyJS.push_uniq(program.mangleProps.reserved, name);
- });
- }
- if (typeof options.mangle != "object") options.mangle = {};
- options.mangle.properties = program.mangleProps;
-}
-if (program.nameCache) {
- options.nameCache = JSON.parse(read_file(program.nameCache, "{}"));
-}
-if (program.output == "ast") {
- options.output = {
- ast: true,
- code: false
- };
-}
-if (program.parse) {
- if (!program.parse.acorn && !program.parse.spidermonkey) {
- options.parse = program.parse;
- } else if (program.sourceMap && program.sourceMap.content == "inline") {
- fatal("inline source map only works with built-in parser");
- }
-}
-if (~program.rawArgs.indexOf("--rename")) {
- options.rename = true;
-} else if (!program.rename) {
- options.rename = false;
-}
-var convert_path = function(name) {
- return name;
-};
-if (typeof program.sourceMap == "object" && "base" in program.sourceMap) {
- convert_path = function() {
- var base = program.sourceMap.base;
- delete options.sourceMap.base;
- return function(name) {
- return path.relative(base, name);
- };
- }();
-}
-if (program.self) {
- if (program.args.length) UglifyJS.AST_Node.warn("Ignoring input files since --self was passed");
- if (!options.wrap) options.wrap = "UglifyJS";
- simple_glob(UglifyJS.FILES).forEach(function(name) {
- files[convert_path(name)] = read_file(name);
- });
- run();
-} else if (program.args.length) {
- simple_glob(program.args).forEach(function(name) {
- files[convert_path(name)] = read_file(name);
- });
- run();
-} else {
- var chunks = [];
- process.stdin.setEncoding("utf8");
- process.stdin.on("data", function(chunk) {
- chunks.push(chunk);
- }).on("end", function() {
- files = [ chunks.join("") ];
- run();
- });
- process.stdin.resume();
-}
-
-function convert_ast(fn) {
- return UglifyJS.AST_Node.from_mozilla_ast(Object.keys(files).reduce(fn, null));
-}
-
-function run() {
- var content = program.sourceMap && program.sourceMap.content;
- if (content && content != "inline") {
- UglifyJS.AST_Node.info("Using input source map: " + content);
- options.sourceMap.content = read_file(content, content);
- }
- if (program.timings) options.timings = true;
- try {
- if (program.parse) {
- if (program.parse.acorn) {
- files = convert_ast(function(toplevel, name) {
- return require("acorn").parse(files[name], {
- locations: true,
- program: toplevel,
- sourceFile: name
- });
- });
- } else if (program.parse.spidermonkey) {
- files = convert_ast(function(toplevel, name) {
- var obj = JSON.parse(files[name]);
- if (!toplevel) return obj;
- toplevel.body = toplevel.body.concat(obj.body);
- return toplevel;
- });
- }
- }
- } catch (ex) {
- fatal(ex);
- }
- var result = UglifyJS.minify(files, options);
- if (result.error) {
- var ex = result.error;
- if (ex.name == "SyntaxError") {
- print_error("Parse error at " + ex.filename + ":" + ex.line + "," + ex.col);
- var file = files[ex.filename];
- if (file) {
- var col = ex.col;
- var lines = file.split(/\r?\n/);
- var line = lines[ex.line - 1];
- if (!line && !col) {
- line = lines[ex.line - 2];
- col = line.length;
- }
- if (line) {
- var limit = 70;
- if (col > limit) {
- line = line.slice(col - limit);
- col = limit;
- }
- print_error(line.slice(0, 80));
- print_error(line.slice(0, col).replace(/\S/g, " ") + "^");
- }
- }
- } else if (ex.defs) {
- print_error("Supported options:");
- print_error(format_object(ex.defs));
- }
- fatal(ex);
- } else if (program.output == "ast") {
- if (!options.compress && !options.mangle) {
- result.ast.figure_out_scope({});
- }
- print(JSON.stringify(result.ast, function(key, value) {
- if (value) switch (key) {
- case "thedef":
- return symdef(value);
- case "enclosed":
- return value.length ? value.map(symdef) : undefined;
- case "variables":
- case "functions":
- case "globals":
- return value.size() ? value.map(symdef) : undefined;
- }
- if (skip_key(key)) return;
- if (value instanceof UglifyJS.AST_Token) return;
- if (value instanceof UglifyJS.Dictionary) return;
- if (value instanceof UglifyJS.AST_Node) {
- var result = {
- _class: "AST_" + value.TYPE
- };
- value.CTOR.PROPS.forEach(function(prop) {
- result[prop] = value[prop];
- });
- return result;
- }
- return value;
- }, 2));
- } else if (program.output == "spidermonkey") {
- print(JSON.stringify(UglifyJS.minify(result.code, {
- compress: false,
- mangle: false,
- output: {
- ast: true,
- code: false
- }
- }).ast.to_mozilla_ast(), null, 2));
- } else if (program.output) {
- fs.writeFileSync(program.output, result.code);
- if (result.map) {
- fs.writeFileSync(program.output + ".map", result.map);
- }
- } else {
- print(result.code);
- }
- if (program.nameCache) {
- fs.writeFileSync(program.nameCache, JSON.stringify(options.nameCache));
- }
- if (result.timings) for (var phase in result.timings) {
- print_error("- " + phase + ": " + result.timings[phase].toFixed(3) + "s");
- }
-}
-
-function fatal(message) {
- if (message instanceof Error) {
- message = message.stack.replace(/^\S*?Error:/, "ERROR:")
- } else {
- message = "ERROR: " + message;
- }
- print_error(message);
- process.exit(1);
-}
-
-// A file glob function that only supports "*" and "?" wildcards in the basename.
-// Example: "foo/bar/*baz??.*.js"
-// Argument `glob` may be a string or an array of strings.
-// Returns an array of strings. Garbage in, garbage out.
-function simple_glob(glob) {
- if (Array.isArray(glob)) {
- return [].concat.apply([], glob.map(simple_glob));
- }
- if (glob.match(/\*|\?/)) {
- var dir = path.dirname(glob);
- try {
- var entries = fs.readdirSync(dir);
- } catch (ex) {}
- if (entries) {
- var pattern = "^" + path.basename(glob)
- .replace(/[.+^$[\]\\(){}]/g, "\\$&")
- .replace(/\*/g, "[^/\\\\]*")
- .replace(/\?/g, "[^/\\\\]") + "$";
- var mod = process.platform === "win32" ? "i" : "";
- var rx = new RegExp(pattern, mod);
- var results = entries.filter(function(name) {
- return rx.test(name);
- }).map(function(name) {
- return path.join(dir, name);
- });
- if (results.length) return results;
- }
- }
- return [ glob ];
-}
-
-function read_file(path, default_value) {
- try {
- return fs.readFileSync(path, "utf8");
- } catch (ex) {
- if (ex.code == "ENOENT" && default_value != null) return default_value;
- fatal(ex);
- }
-}
-
-function parse_js(flag) {
- return function(value, options) {
- options = options || {};
- try {
- UglifyJS.parse(value, {
- expression: true
- }).walk(new UglifyJS.TreeWalker(function(node) {
- if (node instanceof UglifyJS.AST_Assign) {
- var name = node.left.print_to_string();
- var value = node.right;
- if (flag) {
- options[name] = value;
- } else if (value instanceof UglifyJS.AST_Array) {
- options[name] = value.elements.map(to_string);
- } else {
- options[name] = to_string(value);
- }
- return true;
- }
- if (node instanceof UglifyJS.AST_Symbol || node instanceof UglifyJS.AST_PropAccess) {
- var name = node.print_to_string();
- options[name] = true;
- return true;
- }
- if (!(node instanceof UglifyJS.AST_Sequence)) throw node;
-
- function to_string(value) {
- return value instanceof UglifyJS.AST_Constant ? value.value : value.print_to_string({
- quote_keys: true
- });
- }
- }));
- } catch (ex) {
- if (flag) {
- fatal("cannot parse arguments for '" + flag + "': " + value);
- } else {
- options[value] = null;
- }
- }
- return options;
- }
-}
-
-function skip_key(key) {
- return skip_keys.indexOf(key) >= 0;
-}
-
-function symdef(def) {
- var ret = (1e6 + def.id) + " " + def.name;
- if (def.mangled_name) ret += " " + def.mangled_name;
- return ret;
-}
-
-function format_object(obj) {
- var lines = [];
- var padding = "";
- Object.keys(obj).map(function(name) {
- if (padding.length < name.length) padding = Array(name.length + 1).join(" ");
- return [ name, JSON.stringify(obj[name]) ];
- }).forEach(function(tokens) {
- lines.push(" " + tokens[0] + padding.slice(tokens[0].length - 2) + tokens[1]);
- });
- return lines.join("\n");
-}
-
-function print_error(msg) {
- process.stderr.write(msg);
- process.stderr.write("\n");
-}
-
-function print(txt) {
- process.stdout.write(txt);
- process.stdout.write("\n");
-}
diff --git a/node_modules/uglify-js/lib/ast.js b/node_modules/uglify-js/lib/ast.js
deleted file mode 100644
index f205235..0000000
--- a/node_modules/uglify-js/lib/ast.js
+++ /dev/null
@@ -1,995 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-function DEFNODE(type, props, methods, base) {
- if (typeof base === "undefined") base = AST_Node;
- props = props ? props.split(/\s+/) : [];
- var self_props = props;
- if (base && base.PROPS) props = props.concat(base.PROPS);
- var code = [
- "return function AST_", type, "(props){",
- "if(props){",
- ];
- props.forEach(function(prop) {
- code.push("this.", prop, "=props.", prop, ";");
- });
- var proto = base && new base;
- if (proto && proto.initialize || methods && methods.initialize) code.push("this.initialize();");
- code.push("}}");
- var ctor = new Function(code.join(""))();
- if (proto) {
- ctor.prototype = proto;
- ctor.BASE = base;
- }
- if (base) base.SUBCLASSES.push(ctor);
- ctor.prototype.CTOR = ctor;
- ctor.PROPS = props || null;
- ctor.SELF_PROPS = self_props;
- ctor.SUBCLASSES = [];
- if (type) {
- ctor.prototype.TYPE = ctor.TYPE = type;
- }
- if (methods) for (var name in methods) if (HOP(methods, name)) {
- if (/^\$/.test(name)) {
- ctor[name.substr(1)] = methods[name];
- } else {
- ctor.prototype[name] = methods[name];
- }
- }
- ctor.DEFMETHOD = function(name, method) {
- this.prototype[name] = method;
- };
- if (typeof exports !== "undefined") {
- exports["AST_" + type] = ctor;
- }
- return ctor;
-}
-
-var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before comments_after file raw", {
-}, null);
-
-var AST_Node = DEFNODE("Node", "start end", {
- _clone: function(deep) {
- if (deep) {
- var self = this.clone();
- return self.transform(new TreeTransformer(function(node) {
- if (node !== self) {
- return node.clone(true);
- }
- }));
- }
- return new this.CTOR(this);
- },
- clone: function(deep) {
- return this._clone(deep);
- },
- $documentation: "Base class of all AST nodes",
- $propdoc: {
- start: "[AST_Token] The first token of this node",
- end: "[AST_Token] The last token of this node"
- },
- _walk: function(visitor) {
- return visitor._visit(this);
- },
- walk: function(visitor) {
- return this._walk(visitor); // not sure the indirection will be any help
- }
-}, null);
-
-(AST_Node.log_function = function(fn, verbose) {
- var printed = Object.create(null);
- if (fn) {
- AST_Node.info = verbose ? function(text, props) {
- log("INFO: " + string_template(text, props));
- } : noop;
- AST_Node.warn = function(text, props) {
- log("WARN: " + string_template(text, props));
- };
- } else {
- AST_Node.info = AST_Node.warn = noop;
- }
-
- function log(msg) {
- if (printed[msg]) return;
- printed[msg] = true;
- fn(msg);
- }
-})();
-
-/* -----[ statements ]----- */
-
-var AST_Statement = DEFNODE("Statement", null, {
- $documentation: "Base class of all statements",
-});
-
-var AST_Debugger = DEFNODE("Debugger", null, {
- $documentation: "Represents a debugger statement",
-}, AST_Statement);
-
-var AST_Directive = DEFNODE("Directive", "value quote", {
- $documentation: "Represents a directive, like \"use strict\";",
- $propdoc: {
- value: "[string] The value of this directive as a plain string (it's not an AST_String!)",
- quote: "[string] the original quote character"
- },
-}, AST_Statement);
-
-var AST_SimpleStatement = DEFNODE("SimpleStatement", "body", {
- $documentation: "A statement consisting of an expression, i.e. a = 1 + 2",
- $propdoc: {
- body: "[AST_Node] an expression node (should not be instanceof AST_Statement)"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.body._walk(visitor);
- });
- }
-}, AST_Statement);
-
-function walk_body(node, visitor) {
- var body = node.body;
- if (body instanceof AST_Statement) {
- body._walk(visitor);
- } else body.forEach(function(node) {
- node._walk(visitor);
- });
-}
-
-var AST_Block = DEFNODE("Block", "body", {
- $documentation: "A body of statements (usually braced)",
- $propdoc: {
- body: "[AST_Statement*] an array of statements"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- walk_body(this, visitor);
- });
- }
-}, AST_Statement);
-
-var AST_BlockStatement = DEFNODE("BlockStatement", null, {
- $documentation: "A block statement",
-}, AST_Block);
-
-var AST_EmptyStatement = DEFNODE("EmptyStatement", null, {
- $documentation: "The empty statement (empty block or simply a semicolon)"
-}, AST_Statement);
-
-var AST_StatementWithBody = DEFNODE("StatementWithBody", "body", {
- $documentation: "Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",
- $propdoc: {
- body: "[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"
- }
-}, AST_Statement);
-
-var AST_LabeledStatement = DEFNODE("LabeledStatement", "label", {
- $documentation: "Statement with a label",
- $propdoc: {
- label: "[AST_Label] a label definition"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.label._walk(visitor);
- this.body._walk(visitor);
- });
- },
- clone: function(deep) {
- var node = this._clone(deep);
- if (deep) {
- var label = node.label;
- var def = this.label;
- node.walk(new TreeWalker(function(node) {
- if (node instanceof AST_LoopControl && node.label && node.label.thedef === def) {
- node.label.thedef = label;
- label.references.push(node);
- }
- }));
- }
- return node;
- }
-}, AST_StatementWithBody);
-
-var AST_IterationStatement = DEFNODE("IterationStatement", null, {
- $documentation: "Internal class. All loops inherit from it."
-}, AST_StatementWithBody);
-
-var AST_DWLoop = DEFNODE("DWLoop", "condition", {
- $documentation: "Base class for do/while statements",
- $propdoc: {
- condition: "[AST_Node] the loop condition. Should not be instanceof AST_Statement"
- }
-}, AST_IterationStatement);
-
-var AST_Do = DEFNODE("Do", null, {
- $documentation: "A `do` statement",
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.body._walk(visitor);
- this.condition._walk(visitor);
- });
- }
-}, AST_DWLoop);
-
-var AST_While = DEFNODE("While", null, {
- $documentation: "A `while` statement",
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.condition._walk(visitor);
- this.body._walk(visitor);
- });
- }
-}, AST_DWLoop);
-
-var AST_For = DEFNODE("For", "init condition step", {
- $documentation: "A `for` statement",
- $propdoc: {
- init: "[AST_Node?] the `for` initialization code, or null if empty",
- condition: "[AST_Node?] the `for` termination clause, or null if empty",
- step: "[AST_Node?] the `for` update clause, or null if empty"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- if (this.init) this.init._walk(visitor);
- if (this.condition) this.condition._walk(visitor);
- if (this.step) this.step._walk(visitor);
- this.body._walk(visitor);
- });
- }
-}, AST_IterationStatement);
-
-var AST_ForIn = DEFNODE("ForIn", "init object", {
- $documentation: "A `for ... in` statement",
- $propdoc: {
- init: "[AST_Node] the `for/in` initialization code",
- object: "[AST_Node] the object that we're looping through"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.init._walk(visitor);
- this.object._walk(visitor);
- this.body._walk(visitor);
- });
- }
-}, AST_IterationStatement);
-
-var AST_With = DEFNODE("With", "expression", {
- $documentation: "A `with` statement",
- $propdoc: {
- expression: "[AST_Node] the `with` expression"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.expression._walk(visitor);
- this.body._walk(visitor);
- });
- }
-}, AST_StatementWithBody);
-
-/* -----[ scope and functions ]----- */
-
-var AST_Scope = DEFNODE("Scope", "variables functions uses_with uses_eval parent_scope enclosed cname", {
- $documentation: "Base class for all statements introducing a lexical scope",
- $propdoc: {
- variables: "[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope",
- functions: "[Object/S] like `variables`, but only lists function declarations",
- uses_with: "[boolean/S] tells whether this scope uses the `with` statement",
- uses_eval: "[boolean/S] tells whether this scope contains a direct call to the global `eval`",
- parent_scope: "[AST_Scope?/S] link to the parent scope",
- enclosed: "[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",
- cname: "[integer/S] current index for mangling variables (used internally by the mangler)",
- },
- clone: function(deep) {
- var node = this._clone(deep);
- if (this.variables) node.variables = this.variables.clone();
- if (this.functions) node.functions = this.functions.clone();
- if (this.enclosed) node.enclosed = this.enclosed.slice();
- return node;
- },
- pinned: function() {
- return this.uses_eval || this.uses_with;
- }
-}, AST_Block);
-
-var AST_Toplevel = DEFNODE("Toplevel", "globals", {
- $documentation: "The toplevel scope",
- $propdoc: {
- globals: "[Object/S] a map of name -> SymbolDef for all undeclared names",
- },
- wrap: function(name) {
- var body = this.body;
- return parse([
- "(function(exports){'$ORIG';})(typeof ",
- name,
- "=='undefined'?(",
- name,
- "={}):",
- name,
- ");"
- ].join(""), {
- filename: "wrap=" + JSON.stringify(name)
- }).transform(new TreeTransformer(function(node) {
- if (node instanceof AST_Directive && node.value == "$ORIG") {
- return MAP.splice(body);
- }
- }));
- },
- enclose: function(args_values) {
- if (typeof args_values != "string") args_values = "";
- var index = args_values.indexOf(":");
- if (index < 0) index = args_values.length;
- var body = this.body;
- return parse([
- "(function(",
- args_values.slice(0, index),
- '){"$ORIG"})(',
- args_values.slice(index + 1),
- ")"
- ].join(""), {
- filename: "enclose=" + JSON.stringify(args_values)
- }).transform(new TreeTransformer(function(node) {
- if (node instanceof AST_Directive && node.value == "$ORIG") {
- return MAP.splice(body);
- }
- }));
- }
-}, AST_Scope);
-
-var AST_Lambda = DEFNODE("Lambda", "name argnames uses_arguments length_read", {
- $documentation: "Base class for functions",
- $propdoc: {
- name: "[AST_SymbolDeclaration?] the name of this function",
- argnames: "[AST_SymbolFunarg*] array of function arguments",
- uses_arguments: "[boolean/S] tells whether this function accesses the arguments array"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- if (this.name) this.name._walk(visitor);
- this.argnames.forEach(function(argname) {
- argname._walk(visitor);
- });
- walk_body(this, visitor);
- });
- }
-}, AST_Scope);
-
-var AST_Accessor = DEFNODE("Accessor", null, {
- $documentation: "A setter/getter function. The `name` property is always null."
-}, AST_Lambda);
-
-var AST_Function = DEFNODE("Function", "inlined", {
- $documentation: "A function expression"
-}, AST_Lambda);
-
-var AST_Defun = DEFNODE("Defun", "inlined", {
- $documentation: "A function definition"
-}, AST_Lambda);
-
-/* -----[ JUMPS ]----- */
-
-var AST_Jump = DEFNODE("Jump", null, {
- $documentation: "Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)"
-}, AST_Statement);
-
-var AST_Exit = DEFNODE("Exit", "value", {
- $documentation: "Base class for “exits” (`return` and `throw`)",
- $propdoc: {
- value: "[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return"
- },
- _walk: function(visitor) {
- return visitor._visit(this, this.value && function() {
- this.value._walk(visitor);
- });
- }
-}, AST_Jump);
-
-var AST_Return = DEFNODE("Return", null, {
- $documentation: "A `return` statement"
-}, AST_Exit);
-
-var AST_Throw = DEFNODE("Throw", null, {
- $documentation: "A `throw` statement"
-}, AST_Exit);
-
-var AST_LoopControl = DEFNODE("LoopControl", "label", {
- $documentation: "Base class for loop control statements (`break` and `continue`)",
- $propdoc: {
- label: "[AST_LabelRef?] the label, or null if none",
- },
- _walk: function(visitor) {
- return visitor._visit(this, this.label && function() {
- this.label._walk(visitor);
- });
- }
-}, AST_Jump);
-
-var AST_Break = DEFNODE("Break", null, {
- $documentation: "A `break` statement"
-}, AST_LoopControl);
-
-var AST_Continue = DEFNODE("Continue", null, {
- $documentation: "A `continue` statement"
-}, AST_LoopControl);
-
-/* -----[ IF ]----- */
-
-var AST_If = DEFNODE("If", "condition alternative", {
- $documentation: "A `if` statement",
- $propdoc: {
- condition: "[AST_Node] the `if` condition",
- alternative: "[AST_Statement?] the `else` part, or null if not present"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.condition._walk(visitor);
- this.body._walk(visitor);
- if (this.alternative) this.alternative._walk(visitor);
- });
- }
-}, AST_StatementWithBody);
-
-/* -----[ SWITCH ]----- */
-
-var AST_Switch = DEFNODE("Switch", "expression", {
- $documentation: "A `switch` statement",
- $propdoc: {
- expression: "[AST_Node] the `switch` “discriminant”"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.expression._walk(visitor);
- walk_body(this, visitor);
- });
- }
-}, AST_Block);
-
-var AST_SwitchBranch = DEFNODE("SwitchBranch", null, {
- $documentation: "Base class for `switch` branches",
-}, AST_Block);
-
-var AST_Default = DEFNODE("Default", null, {
- $documentation: "A `default` switch branch",
-}, AST_SwitchBranch);
-
-var AST_Case = DEFNODE("Case", "expression", {
- $documentation: "A `case` switch branch",
- $propdoc: {
- expression: "[AST_Node] the `case` expression"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.expression._walk(visitor);
- walk_body(this, visitor);
- });
- }
-}, AST_SwitchBranch);
-
-/* -----[ EXCEPTIONS ]----- */
-
-var AST_Try = DEFNODE("Try", "bcatch bfinally", {
- $documentation: "A `try` statement",
- $propdoc: {
- bcatch: "[AST_Catch?] the catch block, or null if not present",
- bfinally: "[AST_Finally?] the finally block, or null if not present"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- walk_body(this, visitor);
- if (this.bcatch) this.bcatch._walk(visitor);
- if (this.bfinally) this.bfinally._walk(visitor);
- });
- }
-}, AST_Block);
-
-var AST_Catch = DEFNODE("Catch", "argname", {
- $documentation: "A `catch` node; only makes sense as part of a `try` statement",
- $propdoc: {
- argname: "[AST_SymbolCatch] symbol for the exception"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.argname._walk(visitor);
- walk_body(this, visitor);
- });
- }
-}, AST_Block);
-
-var AST_Finally = DEFNODE("Finally", null, {
- $documentation: "A `finally` node; only makes sense as part of a `try` statement"
-}, AST_Block);
-
-/* -----[ VAR ]----- */
-
-var AST_Definitions = DEFNODE("Definitions", "definitions", {
- $documentation: "Base class for `var` nodes (variable declarations/initializations)",
- $propdoc: {
- definitions: "[AST_VarDef*] array of variable definitions"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.definitions.forEach(function(defn) {
- defn._walk(visitor);
- });
- });
- }
-}, AST_Statement);
-
-var AST_Var = DEFNODE("Var", null, {
- $documentation: "A `var` statement"
-}, AST_Definitions);
-
-var AST_VarDef = DEFNODE("VarDef", "name value", {
- $documentation: "A variable declaration; only appears in a AST_Definitions node",
- $propdoc: {
- name: "[AST_SymbolVar] name of the variable",
- value: "[AST_Node?] initializer, or null of there's no initializer"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.name._walk(visitor);
- if (this.value) this.value._walk(visitor);
- });
- }
-});
-
-/* -----[ OTHER ]----- */
-
-var AST_Call = DEFNODE("Call", "expression args", {
- $documentation: "A function call expression",
- $propdoc: {
- expression: "[AST_Node] expression to invoke as function",
- args: "[AST_Node*] array of arguments"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.expression._walk(visitor);
- this.args.forEach(function(node) {
- node._walk(visitor);
- });
- });
- }
-});
-
-var AST_New = DEFNODE("New", null, {
- $documentation: "An object instantiation. Derives from a function call since it has exactly the same properties"
-}, AST_Call);
-
-var AST_Sequence = DEFNODE("Sequence", "expressions", {
- $documentation: "A sequence expression (comma-separated expressions)",
- $propdoc: {
- expressions: "[AST_Node*] array of expressions (at least two)"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.expressions.forEach(function(node) {
- node._walk(visitor);
- });
- });
- }
-});
-
-var AST_PropAccess = DEFNODE("PropAccess", "expression property", {
- $documentation: "Base class for property access expressions, i.e. `a.foo` or `a[\"foo\"]`",
- $propdoc: {
- expression: "[AST_Node] the “container” expression",
- property: "[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node"
- },
- getProperty: function() {
- var p = this.property;
- if (p instanceof AST_Constant) {
- return p.value;
- }
- if (p instanceof AST_UnaryPrefix
- && p.operator == "void"
- && p.expression instanceof AST_Constant) {
- return;
- }
- return p;
- }
-});
-
-var AST_Dot = DEFNODE("Dot", null, {
- $documentation: "A dotted property access expression",
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.expression._walk(visitor);
- });
- }
-}, AST_PropAccess);
-
-var AST_Sub = DEFNODE("Sub", null, {
- $documentation: "Index-style property access, i.e. `a[\"foo\"]`",
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.expression._walk(visitor);
- this.property._walk(visitor);
- });
- }
-}, AST_PropAccess);
-
-var AST_Unary = DEFNODE("Unary", "operator expression", {
- $documentation: "Base class for unary expressions",
- $propdoc: {
- operator: "[string] the operator",
- expression: "[AST_Node] expression that this unary operator applies to"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.expression._walk(visitor);
- });
- }
-});
-
-var AST_UnaryPrefix = DEFNODE("UnaryPrefix", null, {
- $documentation: "Unary prefix expression, i.e. `typeof i` or `++i`"
-}, AST_Unary);
-
-var AST_UnaryPostfix = DEFNODE("UnaryPostfix", null, {
- $documentation: "Unary postfix expression, i.e. `i++`"
-}, AST_Unary);
-
-var AST_Binary = DEFNODE("Binary", "operator left right", {
- $documentation: "Binary expression, i.e. `a + b`",
- $propdoc: {
- left: "[AST_Node] left-hand side expression",
- operator: "[string] the operator",
- right: "[AST_Node] right-hand side expression"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.left._walk(visitor);
- this.right._walk(visitor);
- });
- }
-});
-
-var AST_Conditional = DEFNODE("Conditional", "condition consequent alternative", {
- $documentation: "Conditional expression using the ternary operator, i.e. `a ? b : c`",
- $propdoc: {
- condition: "[AST_Node]",
- consequent: "[AST_Node]",
- alternative: "[AST_Node]"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.condition._walk(visitor);
- this.consequent._walk(visitor);
- this.alternative._walk(visitor);
- });
- }
-});
-
-var AST_Assign = DEFNODE("Assign", null, {
- $documentation: "An assignment expression — `a = b + 5`",
-}, AST_Binary);
-
-/* -----[ LITERALS ]----- */
-
-var AST_Array = DEFNODE("Array", "elements", {
- $documentation: "An array literal",
- $propdoc: {
- elements: "[AST_Node*] array of elements"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.elements.forEach(function(element) {
- element._walk(visitor);
- });
- });
- }
-});
-
-var AST_Object = DEFNODE("Object", "properties", {
- $documentation: "An object literal",
- $propdoc: {
- properties: "[AST_ObjectProperty*] array of properties"
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.properties.forEach(function(prop) {
- prop._walk(visitor);
- });
- });
- }
-});
-
-var AST_ObjectProperty = DEFNODE("ObjectProperty", "key value", {
- $documentation: "Base class for literal object properties",
- $propdoc: {
- key: "[string|AST_SymbolAccessor] property name. For ObjectKeyVal this is a string. For getters and setters this is an AST_SymbolAccessor.",
- value: "[AST_Node] property value. For getters and setters this is an AST_Accessor."
- },
- _walk: function(visitor) {
- return visitor._visit(this, function() {
- this.value._walk(visitor);
- });
- }
-});
-
-var AST_ObjectKeyVal = DEFNODE("ObjectKeyVal", "quote", {
- $documentation: "A key: value object property",
- $propdoc: {
- quote: "[string] the original quote character"
- }
-}, AST_ObjectProperty);
-
-var AST_ObjectSetter = DEFNODE("ObjectSetter", null, {
- $documentation: "An object setter property",
-}, AST_ObjectProperty);
-
-var AST_ObjectGetter = DEFNODE("ObjectGetter", null, {
- $documentation: "An object getter property",
-}, AST_ObjectProperty);
-
-var AST_Symbol = DEFNODE("Symbol", "scope name thedef", {
- $propdoc: {
- name: "[string] name of this symbol",
- scope: "[AST_Scope/S] the current scope (not necessarily the definition scope)",
- thedef: "[SymbolDef/S] the definition of this symbol"
- },
- $documentation: "Base class for all symbols",
-});
-
-var AST_SymbolAccessor = DEFNODE("SymbolAccessor", null, {
- $documentation: "The name of a property accessor (setter/getter function)"
-}, AST_Symbol);
-
-var AST_SymbolDeclaration = DEFNODE("SymbolDeclaration", "init", {
- $documentation: "A declaration symbol (symbol in var, function name or argument, symbol in catch)",
-}, AST_Symbol);
-
-var AST_SymbolVar = DEFNODE("SymbolVar", null, {
- $documentation: "Symbol defining a variable",
-}, AST_SymbolDeclaration);
-
-var AST_SymbolFunarg = DEFNODE("SymbolFunarg", null, {
- $documentation: "Symbol naming a function argument",
-}, AST_SymbolVar);
-
-var AST_SymbolDefun = DEFNODE("SymbolDefun", null, {
- $documentation: "Symbol defining a function",
-}, AST_SymbolDeclaration);
-
-var AST_SymbolLambda = DEFNODE("SymbolLambda", null, {
- $documentation: "Symbol naming a function expression",
-}, AST_SymbolDeclaration);
-
-var AST_SymbolCatch = DEFNODE("SymbolCatch", null, {
- $documentation: "Symbol naming the exception in catch",
-}, AST_SymbolDeclaration);
-
-var AST_Label = DEFNODE("Label", "references", {
- $documentation: "Symbol naming a label (declaration)",
- $propdoc: {
- references: "[AST_LoopControl*] a list of nodes referring to this label"
- },
- initialize: function() {
- this.references = [];
- this.thedef = this;
- }
-}, AST_Symbol);
-
-var AST_SymbolRef = DEFNODE("SymbolRef", "fixed", {
- $documentation: "Reference to some symbol (not definition/declaration)",
-}, AST_Symbol);
-
-var AST_LabelRef = DEFNODE("LabelRef", null, {
- $documentation: "Reference to a label symbol",
-}, AST_Symbol);
-
-var AST_This = DEFNODE("This", null, {
- $documentation: "The `this` symbol",
-}, AST_Symbol);
-
-var AST_Constant = DEFNODE("Constant", null, {
- $documentation: "Base class for all constants",
-});
-
-var AST_String = DEFNODE("String", "value quote", {
- $documentation: "A string literal",
- $propdoc: {
- value: "[string] the contents of this string",
- quote: "[string] the original quote character"
- }
-}, AST_Constant);
-
-var AST_Number = DEFNODE("Number", "value", {
- $documentation: "A number literal",
- $propdoc: {
- value: "[number] the numeric value",
- }
-}, AST_Constant);
-
-var AST_RegExp = DEFNODE("RegExp", "value", {
- $documentation: "A regexp literal",
- $propdoc: {
- value: "[RegExp] the actual regexp"
- }
-}, AST_Constant);
-
-var AST_Atom = DEFNODE("Atom", null, {
- $documentation: "Base class for atoms",
-}, AST_Constant);
-
-var AST_Null = DEFNODE("Null", null, {
- $documentation: "The `null` atom",
- value: null
-}, AST_Atom);
-
-var AST_NaN = DEFNODE("NaN", null, {
- $documentation: "The impossible value",
- value: 0/0
-}, AST_Atom);
-
-var AST_Undefined = DEFNODE("Undefined", null, {
- $documentation: "The `undefined` value",
- value: function(){}()
-}, AST_Atom);
-
-var AST_Hole = DEFNODE("Hole", null, {
- $documentation: "A hole in an array",
- value: function(){}()
-}, AST_Atom);
-
-var AST_Infinity = DEFNODE("Infinity", null, {
- $documentation: "The `Infinity` value",
- value: 1/0
-}, AST_Atom);
-
-var AST_Boolean = DEFNODE("Boolean", null, {
- $documentation: "Base class for booleans",
-}, AST_Atom);
-
-var AST_False = DEFNODE("False", null, {
- $documentation: "The `false` atom",
- value: false
-}, AST_Boolean);
-
-var AST_True = DEFNODE("True", null, {
- $documentation: "The `true` atom",
- value: true
-}, AST_Boolean);
-
-/* -----[ TreeWalker ]----- */
-
-function TreeWalker(callback) {
- this.visit = callback;
- this.stack = [];
- this.directives = Object.create(null);
-}
-TreeWalker.prototype = {
- _visit: function(node, descend) {
- this.push(node);
- var ret = this.visit(node, descend ? function() {
- descend.call(node);
- } : noop);
- if (!ret && descend) {
- descend.call(node);
- }
- this.pop();
- return ret;
- },
- parent: function(n) {
- return this.stack[this.stack.length - 2 - (n || 0)];
- },
- push: function(node) {
- if (node instanceof AST_Lambda) {
- this.directives = Object.create(this.directives);
- } else if (node instanceof AST_Directive && !this.directives[node.value]) {
- this.directives[node.value] = node;
- }
- this.stack.push(node);
- },
- pop: function() {
- if (this.stack.pop() instanceof AST_Lambda) {
- this.directives = Object.getPrototypeOf(this.directives);
- }
- },
- self: function() {
- return this.stack[this.stack.length - 1];
- },
- find_parent: function(type) {
- var stack = this.stack;
- for (var i = stack.length; --i >= 0;) {
- var x = stack[i];
- if (x instanceof type) return x;
- }
- },
- has_directive: function(type) {
- var dir = this.directives[type];
- if (dir) return dir;
- var node = this.stack[this.stack.length - 1];
- if (node instanceof AST_Scope) {
- for (var i = 0; i < node.body.length; ++i) {
- var st = node.body[i];
- if (!(st instanceof AST_Directive)) break;
- if (st.value == type) return st;
- }
- }
- },
- loopcontrol_target: function(node) {
- var stack = this.stack;
- if (node.label) for (var i = stack.length; --i >= 0;) {
- var x = stack[i];
- if (x instanceof AST_LabeledStatement && x.label.name == node.label.name)
- return x.body;
- } else for (var i = stack.length; --i >= 0;) {
- var x = stack[i];
- if (x instanceof AST_IterationStatement
- || node instanceof AST_Break && x instanceof AST_Switch)
- return x;
- }
- },
- in_boolean_context: function() {
- var self = this.self();
- for (var i = 0, p; p = this.parent(i); i++) {
- if (p instanceof AST_Conditional && p.condition === self
- || p instanceof AST_DWLoop && p.condition === self
- || p instanceof AST_For && p.condition === self
- || p instanceof AST_If && p.condition === self
- || p instanceof AST_Return && p.in_bool
- || p instanceof AST_Sequence && p.tail_node() !== self
- || p instanceof AST_SimpleStatement
- || p instanceof AST_UnaryPrefix && p.operator == "!" && p.expression === self) {
- return true;
- }
- if (p instanceof AST_Binary && (p.operator == "&&" || p.operator == "||")
- || p instanceof AST_Conditional
- || p.tail_node() === self) {
- self = p;
- } else if (p instanceof AST_Return) {
- var fn;
- do {
- fn = this.parent(++i);
- if (!fn) return false;
- } while (!(fn instanceof AST_Lambda));
- if (fn.name) return false;
- self = this.parent(++i);
- if (!self || self.TYPE != "Call" || self.expression !== fn) return false;
- } else {
- return false;
- }
- }
- }
-};
diff --git a/node_modules/uglify-js/lib/compress.js b/node_modules/uglify-js/lib/compress.js
deleted file mode 100644
index 5d14963..0000000
--- a/node_modules/uglify-js/lib/compress.js
+++ /dev/null
@@ -1,7863 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-function Compressor(options, false_by_default) {
- if (!(this instanceof Compressor))
- return new Compressor(options, false_by_default);
- TreeTransformer.call(this, this.before, this.after);
- this.options = defaults(options, {
- arguments : !false_by_default,
- assignments : !false_by_default,
- booleans : !false_by_default,
- collapse_vars : !false_by_default,
- comparisons : !false_by_default,
- conditionals : !false_by_default,
- dead_code : !false_by_default,
- directives : !false_by_default,
- drop_console : false,
- drop_debugger : !false_by_default,
- evaluate : !false_by_default,
- expression : false,
- functions : !false_by_default,
- global_defs : false,
- hoist_funs : false,
- hoist_props : !false_by_default,
- hoist_vars : false,
- ie8 : false,
- if_return : !false_by_default,
- inline : !false_by_default,
- join_vars : !false_by_default,
- keep_fargs : false_by_default || "strict",
- keep_fnames : false,
- keep_infinity : false,
- loops : !false_by_default,
- negate_iife : !false_by_default,
- objects : !false_by_default,
- passes : 1,
- properties : !false_by_default,
- pure_getters : !false_by_default && "strict",
- pure_funcs : null,
- reduce_funcs : !false_by_default,
- reduce_vars : !false_by_default,
- sequences : !false_by_default,
- side_effects : !false_by_default,
- strings : !false_by_default,
- switches : !false_by_default,
- top_retain : null,
- toplevel : !!(options && options["top_retain"]),
- typeofs : !false_by_default,
- unsafe : false,
- unsafe_comps : false,
- unsafe_Function : false,
- unsafe_math : false,
- unsafe_proto : false,
- unsafe_regexp : false,
- unsafe_undefined: false,
- unused : !false_by_default,
- }, true);
- var evaluate = this.options["evaluate"];
- this.eval_threshold = /eager/.test(evaluate) ? 1 / 0 : +evaluate;
- var global_defs = this.options["global_defs"];
- if (typeof global_defs == "object") for (var key in global_defs) {
- if (/^@/.test(key) && HOP(global_defs, key)) {
- global_defs[key.slice(1)] = parse(global_defs[key], {
- expression: true
- });
- }
- }
- if (this.options["inline"] === true) this.options["inline"] = 3;
- var keep_fargs = this.options["keep_fargs"];
- this.drop_fargs = keep_fargs == "strict" ? function(lambda, parent) {
- if (lambda.length_read) return false;
- var name = lambda.name;
- if (!name) return parent && parent.TYPE == "Call" && parent.expression === lambda;
- if (name.fixed_value() !== lambda) return false;
- var def = name.definition();
- if (def.direct_access) return false;
- var escaped = def.escaped;
- return escaped && escaped.depth != 1;
- } : keep_fargs ? return_false : return_true;
- var pure_funcs = this.options["pure_funcs"];
- if (typeof pure_funcs == "function") {
- this.pure_funcs = pure_funcs;
- } else if (typeof pure_funcs == "string") {
- this.pure_funcs = function(node) {
- return pure_funcs !== node.expression.print_to_string();
- };
- } else if (Array.isArray(pure_funcs)) {
- this.pure_funcs = function(node) {
- return !member(node.expression.print_to_string(), pure_funcs);
- };
- } else {
- this.pure_funcs = return_true;
- }
- var sequences = this.options["sequences"];
- this.sequences_limit = sequences == 1 ? 800 : sequences | 0;
- var top_retain = this.options["top_retain"];
- if (top_retain instanceof RegExp) {
- this.top_retain = function(def) {
- return top_retain.test(def.name);
- };
- } else if (typeof top_retain == "function") {
- this.top_retain = top_retain;
- } else if (top_retain) {
- if (typeof top_retain == "string") {
- top_retain = top_retain.split(/,/);
- }
- this.top_retain = function(def) {
- return member(def.name, top_retain);
- };
- }
- var toplevel = this.options["toplevel"];
- this.toplevel = typeof toplevel == "string" ? {
- funcs: /funcs/.test(toplevel),
- vars: /vars/.test(toplevel)
- } : {
- funcs: toplevel,
- vars: toplevel
- };
-}
-
-Compressor.prototype = new TreeTransformer;
-merge(Compressor.prototype, {
- option: function(key) { return this.options[key] },
- exposed: function(def) {
- if (def.global) for (var i = 0; i < def.orig.length; i++)
- if (!this.toplevel[def.orig[i] instanceof AST_SymbolDefun ? "funcs" : "vars"])
- return true;
- return false;
- },
- compress: function(node) {
- node = node.resolve_defines(this);
- if (this.option("expression")) {
- node.process_expression(true);
- }
- var passes = +this.options.passes || 1;
- var min_count = 1 / 0;
- var stopping = false;
- var mangle = { ie8: this.option("ie8") };
- for (var pass = 0; pass < passes; pass++) {
- node.figure_out_scope(mangle);
- if (pass > 0 || this.option("reduce_vars"))
- node.reset_opt_flags(this);
- node = node.transform(this);
- if (passes > 1) {
- var count = 0;
- node.walk(new TreeWalker(function() {
- count++;
- }));
- AST_Node.info("pass " + pass + ": last_count: " + min_count + ", count: " + count);
- if (count < min_count) {
- min_count = count;
- stopping = false;
- } else if (stopping) {
- break;
- } else {
- stopping = true;
- }
- }
- }
- if (this.option("expression")) {
- node.process_expression(false);
- }
- return node;
- },
- before: function(node, descend, in_list) {
- if (node._squeezed) return node;
- var is_scope = node instanceof AST_Scope;
- if (is_scope) {
- node.hoist_properties(this);
- node.hoist_declarations(this);
- node.process_boolean_returns(this);
- }
- // Before https://github.com/mishoo/UglifyJS2/pull/1602 AST_Node.optimize()
- // would call AST_Node.transform() if a different instance of AST_Node is
- // produced after OPT().
- // This corrupts TreeWalker.stack, which cause AST look-ups to malfunction.
- // Migrate and defer all children's AST_Node.transform() to below, which
- // will now happen after this parent AST_Node has been properly substituted
- // thus gives a consistent AST snapshot.
- descend(node, this);
- // Existing code relies on how AST_Node.optimize() worked, and omitting the
- // following replacement call would result in degraded efficiency of both
- // output and performance.
- descend(node, this);
- var opt = node.optimize(this);
- if (is_scope) {
- opt.drop_unused(this);
- descend(opt, this);
- }
- if (opt === node) opt._squeezed = true;
- return opt;
- }
-});
-
-(function(OPT) {
- OPT(AST_Node, function(self, compressor) {
- return self;
- });
-
- AST_Node.DEFMETHOD("equivalent_to", function(node) {
- return this.TYPE == node.TYPE && this.print_to_string() == node.print_to_string();
- });
-
- AST_Scope.DEFMETHOD("process_expression", function(insert, transform) {
- var self = this;
- var tt = new TreeTransformer(function(node) {
- if (insert && node instanceof AST_SimpleStatement) {
- return make_node(AST_Return, node, {
- value: node.body
- });
- }
- if (!insert && node instanceof AST_Return) {
- return transform ? transform(node) : make_node(AST_SimpleStatement, node, {
- body: node.value || make_node(AST_UnaryPrefix, node, {
- operator: "void",
- expression: make_node(AST_Number, node, {
- value: 0
- })
- })
- });
- }
- if (node instanceof AST_Lambda && node !== self) {
- return node;
- }
- if (node instanceof AST_Block) {
- var index = node.body.length - 1;
- if (index >= 0) {
- node.body[index] = node.body[index].transform(tt);
- }
- } else if (node instanceof AST_If) {
- node.body = node.body.transform(tt);
- if (node.alternative) {
- node.alternative = node.alternative.transform(tt);
- }
- } else if (node instanceof AST_With) {
- node.body = node.body.transform(tt);
- }
- return node;
- });
- self.transform(tt);
- });
-
- function read_property(obj, node) {
- var key = node.getProperty();
- if (key instanceof AST_Node) return;
- var value;
- if (obj instanceof AST_Array) {
- var elements = obj.elements;
- if (key == "length") return make_node_from_constant(elements.length, obj);
- if (typeof key == "number" && key in elements) value = elements[key];
- } else if (obj instanceof AST_Lambda) {
- if (key == "length") {
- obj.length_read = true;
- return make_node_from_constant(obj.argnames.length, obj);
- }
- } else if (obj instanceof AST_Object) {
- key = "" + key;
- var props = obj.properties;
- for (var i = props.length; --i >= 0;) {
- var prop = props[i];
- if (!(prop instanceof AST_ObjectKeyVal)) return;
- if (!value && props[i].key === key) value = props[i].value;
- }
- }
- return value instanceof AST_SymbolRef && value.fixed_value() || value;
- }
-
- function is_read_only_fn(value, name) {
- if (value instanceof AST_Boolean) return native_fns.Boolean[name];
- if (value instanceof AST_Number) return native_fns.Number[name];
- if (value instanceof AST_String) return native_fns.String[name];
- if (name == "valueOf") return false;
- if (value instanceof AST_Array) return native_fns.Array[name];
- if (value instanceof AST_Function) return native_fns.Function[name];
- if (value instanceof AST_Object) return native_fns.Object[name];
- if (value instanceof AST_RegExp) return native_fns.RegExp[name];
- }
-
- function is_modified(compressor, tw, node, value, level, immutable) {
- var parent = tw.parent(level);
- if (compressor.option("unsafe") && parent instanceof AST_Dot && is_read_only_fn(value, parent.property)) {
- return;
- }
- var lhs = is_lhs(node, parent);
- if (lhs) return lhs;
- if (!immutable
- && parent instanceof AST_Call
- && parent.expression === node
- && !parent.is_expr_pure(compressor)
- && (!(value instanceof AST_Function)
- || !(parent instanceof AST_New) && value.contains_this())) {
- return true;
- }
- if (parent instanceof AST_Array) {
- return is_modified(compressor, tw, parent, parent, level + 1);
- }
- if (parent instanceof AST_ObjectKeyVal && node === parent.value) {
- var obj = tw.parent(level + 1);
- return is_modified(compressor, tw, obj, obj, level + 2);
- }
- if (parent instanceof AST_PropAccess && parent.expression === node) {
- var prop = read_property(value, parent);
- return !immutable && is_modified(compressor, tw, parent, prop, level + 1);
- }
- }
-
- function is_arguments(def) {
- if (def.name != "arguments") return false;
- var orig = def.orig;
- return orig.length == 1 && orig[0] instanceof AST_SymbolFunarg;
- }
-
- (function(def) {
- def(AST_Node, noop);
-
- function reset_def(tw, compressor, def) {
- def.assignments = 0;
- def.bool_fn = 0;
- def.chained = false;
- def.cross_loop = false;
- def.direct_access = false;
- def.escaped = [];
- def.fixed = !def.scope.pinned()
- && !compressor.exposed(def)
- && !(def.init instanceof AST_Function && def.init !== def.scope)
- && def.init;
- if (def.fixed instanceof AST_Defun && !all(def.references, function(ref) {
- var scope = ref.scope;
- do {
- if (def.scope === scope) return true;
- } while (scope instanceof AST_Function && (scope = scope.parent_scope));
- })) {
- tw.defun_ids[def.id] = false;
- }
- def.recursive_refs = 0;
- def.references = [];
- def.should_replace = undefined;
- def.single_use = undefined;
- }
-
- function reset_variables(tw, compressor, scope) {
- scope.variables.each(function(def) {
- reset_def(tw, compressor, def);
- if (def.fixed === null) {
- def.safe_ids = tw.safe_ids;
- mark(tw, def, true);
- } else if (def.fixed) {
- tw.loop_ids[def.id] = tw.in_loop;
- mark(tw, def, true);
- }
- });
- scope.may_call_this = function() {
- scope.may_call_this = noop;
- if (!scope.contains_this()) return;
- scope.functions.each(function(def) {
- if (def.init instanceof AST_Defun && !(def.id in tw.defun_ids)) {
- tw.defun_ids[def.id] = false;
- }
- });
- };
- }
-
- function mark_defun(tw, def) {
- if (def.id in tw.defun_ids) {
- var marker = tw.defun_ids[def.id];
- if (!marker) return;
- var visited = tw.defun_visited[def.id];
- if (marker === tw.safe_ids) {
- if (!visited) return def.fixed;
- } else if (visited) {
- def.init.enclosed.forEach(function(d) {
- if (def.init.variables.get(d.name) === d) return;
- if (!safe_to_read(tw, d)) d.fixed = false;
- });
- } else {
- tw.defun_ids[def.id] = false;
- }
- } else {
- if (!tw.in_loop) {
- tw.defun_ids[def.id] = tw.safe_ids;
- return def.fixed;
- }
- tw.defun_ids[def.id] = false;
- }
- }
-
- function walk_defuns(tw, scope) {
- scope.functions.each(function(def) {
- if (def.init instanceof AST_Defun && !tw.defun_visited[def.id]) {
- tw.defun_ids[def.id] = tw.safe_ids;
- def.init.walk(tw);
- }
- });
- }
-
- function push(tw) {
- tw.safe_ids = Object.create(tw.safe_ids);
- }
-
- function pop(tw) {
- tw.safe_ids = Object.getPrototypeOf(tw.safe_ids);
- }
-
- function mark(tw, def, safe) {
- tw.safe_ids[def.id] = safe;
- }
-
- function safe_to_read(tw, def) {
- if (def.single_use == "m") return false;
- if (tw.safe_ids[def.id]) {
- if (def.fixed == null) {
- if (is_arguments(def)) return false;
- if (def.global && def.name == "arguments") return false;
- def.fixed = make_node(AST_Undefined, def.orig[0]);
- }
- return true;
- }
- return def.fixed instanceof AST_Defun;
- }
-
- function safe_to_assign(tw, def, scope, value) {
- if (def.fixed === undefined) return true;
- if (def.fixed === null && def.safe_ids) {
- def.safe_ids[def.id] = false;
- delete def.safe_ids;
- return true;
- }
- if (!HOP(tw.safe_ids, def.id)) return false;
- if (!safe_to_read(tw, def)) return false;
- if (def.fixed === false) return false;
- if (def.fixed != null && (!value || def.references.length > def.assignments)) return false;
- if (def.fixed instanceof AST_Defun) {
- return value instanceof AST_Node && def.fixed.parent_scope === scope;
- }
- return all(def.orig, function(sym) {
- return !(sym instanceof AST_SymbolDefun || sym instanceof AST_SymbolLambda);
- });
- }
-
- function ref_once(tw, compressor, def) {
- return compressor.option("unused")
- && !def.scope.pinned()
- && def.references.length - def.recursive_refs == 1
- && tw.loop_ids[def.id] === tw.in_loop;
- }
-
- function is_immutable(value) {
- if (!value) return false;
- return value.is_constant()
- || value instanceof AST_Lambda
- || value instanceof AST_This;
- }
-
- function mark_escaped(tw, d, scope, node, value, level, depth) {
- var parent = tw.parent(level);
- if (value && value.is_constant()) return;
- if (parent instanceof AST_Assign && parent.operator == "=" && node === parent.right
- || parent instanceof AST_Call && (node !== parent.expression || parent instanceof AST_New)
- || parent instanceof AST_Exit && node === parent.value && node.scope !== d.scope
- || parent instanceof AST_VarDef && node === parent.value) {
- d.escaped.push(parent);
- if (depth > 1 && !(value && value.is_constant_expression(scope))) depth = 1;
- if (!d.escaped.depth || d.escaped.depth > depth) d.escaped.depth = depth;
- return;
- } else if (parent instanceof AST_Array
- || parent instanceof AST_Binary && lazy_op[parent.operator]
- || parent instanceof AST_Conditional && node !== parent.condition
- || parent instanceof AST_Sequence && node === parent.tail_node()) {
- mark_escaped(tw, d, scope, parent, parent, level + 1, depth);
- } else if (parent instanceof AST_ObjectKeyVal && node === parent.value) {
- var obj = tw.parent(level + 1);
- mark_escaped(tw, d, scope, obj, obj, level + 2, depth);
- } else if (parent instanceof AST_PropAccess && node === parent.expression) {
- value = read_property(value, parent);
- mark_escaped(tw, d, scope, parent, value, level + 1, depth + 1);
- if (value) return;
- }
- if (level > 0) return;
- if (parent instanceof AST_Call && node === parent.expression) return;
- if (parent instanceof AST_Sequence && node !== parent.tail_node()) return;
- if (parent instanceof AST_SimpleStatement) return;
- if (parent instanceof AST_Unary && !unary_side_effects[parent.operator]) return;
- d.direct_access = true;
- }
-
- function mark_assignment_to_arguments(node) {
- if (!(node instanceof AST_Sub)) return;
- var expr = node.expression;
- if (!(expr instanceof AST_SymbolRef)) return;
- var def = expr.definition();
- if (is_arguments(def) && node.property instanceof AST_Number) def.reassigned = true;
- }
-
- var suppressor = new TreeWalker(function(node) {
- if (!(node instanceof AST_Symbol)) return;
- var d = node.definition();
- if (!d) return;
- if (node instanceof AST_SymbolRef) d.references.push(node);
- d.fixed = false;
- });
- def(AST_Accessor, function(tw, descend, compressor) {
- push(tw);
- reset_variables(tw, compressor, this);
- descend();
- pop(tw);
- walk_defuns(tw, this);
- return true;
- });
- def(AST_Assign, function(tw, descend, compressor) {
- var node = this;
- var sym = node.left;
- if (!(sym instanceof AST_SymbolRef)) {
- mark_assignment_to_arguments(sym);
- return;
- }
- if (sym.fixed) delete sym.fixed;
- var d = sym.definition();
- var safe = safe_to_assign(tw, d, sym.scope, node.right);
- d.assignments++;
- var fixed = d.fixed;
- if (!fixed && node.operator != "=") return;
- var eq = node.operator == "=";
- var value = eq ? node.right : node;
- if (is_modified(compressor, tw, node, value, 0)) return;
- if (!eq) d.chained = true;
- sym.fixed = d.fixed = eq ? function() {
- return node.right;
- } : function() {
- return make_node(AST_Binary, node, {
- operator: node.operator.slice(0, -1),
- left: fixed instanceof AST_Node ? fixed : fixed(),
- right: node.right
- });
- };
- if (!safe) return;
- d.references.push(sym);
- mark(tw, d, false);
- node.right.walk(tw);
- mark(tw, d, true);
- if (eq) mark_escaped(tw, d, sym.scope, node, value, 0, 1);
- return true;
- });
- def(AST_Binary, function(tw) {
- if (!lazy_op[this.operator]) return;
- this.left.walk(tw);
- push(tw);
- this.right.walk(tw);
- pop(tw);
- return true;
- });
- def(AST_Call, function(tw, descend) {
- tw.find_parent(AST_Scope).may_call_this();
- var exp = this.expression;
- if (exp instanceof AST_SymbolRef) {
- var def = exp.definition();
- if (this.TYPE == "Call" && tw.in_boolean_context()) def.bool_fn++;
- if (!(def.fixed instanceof AST_Defun)) return;
- var defun = mark_defun(tw, def);
- if (!defun) return;
- descend();
- defun.walk(tw);
- return true;
- } else if (this.TYPE == "Call"
- && exp instanceof AST_Assign
- && exp.operator == "="
- && exp.left instanceof AST_SymbolRef
- && tw.in_boolean_context()) {
- exp.left.definition().bool_fn++;
- }
- });
- def(AST_Case, function(tw) {
- push(tw);
- this.expression.walk(tw);
- pop(tw);
- push(tw);
- walk_body(this, tw);
- pop(tw);
- return true;
- });
- def(AST_Conditional, function(tw) {
- this.condition.walk(tw);
- push(tw);
- this.consequent.walk(tw);
- pop(tw);
- push(tw);
- this.alternative.walk(tw);
- pop(tw);
- return true;
- });
- def(AST_Default, function(tw, descend) {
- push(tw);
- descend();
- pop(tw);
- return true;
- });
- def(AST_Defun, function(tw, descend, compressor) {
- var id = this.name.definition().id;
- if (tw.defun_visited[id]) return true;
- if (tw.defun_ids[id] !== tw.safe_ids) return true;
- tw.defun_visited[id] = true;
- this.inlined = false;
- push(tw);
- reset_variables(tw, compressor, this);
- descend();
- pop(tw);
- walk_defuns(tw, this);
- return true;
- });
- def(AST_Do, function(tw) {
- var saved_loop = tw.in_loop;
- tw.in_loop = this;
- push(tw);
- this.body.walk(tw);
- if (has_break_or_continue(this, tw.parent())) {
- pop(tw);
- push(tw);
- }
- this.condition.walk(tw);
- pop(tw);
- tw.in_loop = saved_loop;
- return true;
- });
- def(AST_For, function(tw) {
- if (this.init) this.init.walk(tw);
- var saved_loop = tw.in_loop;
- tw.in_loop = this;
- push(tw);
- if (this.condition) this.condition.walk(tw);
- this.body.walk(tw);
- if (this.step) {
- if (has_break_or_continue(this, tw.parent())) {
- pop(tw);
- push(tw);
- }
- this.step.walk(tw);
- }
- pop(tw);
- tw.in_loop = saved_loop;
- return true;
- });
- def(AST_ForIn, function(tw) {
- this.init.walk(suppressor);
- this.object.walk(tw);
- var saved_loop = tw.in_loop;
- tw.in_loop = this;
- push(tw);
- this.body.walk(tw);
- pop(tw);
- tw.in_loop = saved_loop;
- return true;
- });
- def(AST_Function, function(tw, descend, compressor) {
- var node = this;
- node.inlined = false;
- push(tw);
- reset_variables(tw, compressor, node);
- var iife;
- if (!node.name
- && (iife = tw.parent()) instanceof AST_Call
- && iife.expression === node) {
- // Virtually turn IIFE parameters into variable definitions:
- // (function(a,b) {...})(c,d) => (function() {var a=c,b=d; ...})()
- // So existing transformation rules can work on them.
- node.argnames.forEach(function(arg, i) {
- var d = arg.definition();
- if (d.fixed === undefined && (!node.uses_arguments || tw.has_directive("use strict"))) {
- var value = iife.args[i];
- d.fixed = function() {
- var j = node.argnames.indexOf(arg);
- if (j < 0) return value;
- return iife.args[j] || make_node(AST_Undefined, iife);
- };
- tw.loop_ids[d.id] = tw.in_loop;
- mark(tw, d, true);
- } else {
- d.fixed = false;
- }
- });
- }
- descend();
- pop(tw);
- walk_defuns(tw, node);
- return true;
- });
- def(AST_If, function(tw) {
- this.condition.walk(tw);
- push(tw);
- this.body.walk(tw);
- pop(tw);
- if (this.alternative) {
- push(tw);
- this.alternative.walk(tw);
- pop(tw);
- }
- return true;
- });
- def(AST_LabeledStatement, function(tw) {
- push(tw);
- this.body.walk(tw);
- pop(tw);
- return true;
- });
- def(AST_SymbolCatch, function() {
- this.definition().fixed = false;
- });
- def(AST_SymbolRef, function(tw, descend, compressor) {
- if (this.fixed) delete this.fixed;
- var d = this.definition();
- d.references.push(this);
- if (d.references.length == 1
- && !d.fixed
- && d.orig[0] instanceof AST_SymbolDefun) {
- tw.loop_ids[d.id] = tw.in_loop;
- }
- var value;
- if (d.fixed === undefined || !safe_to_read(tw, d)) {
- d.fixed = false;
- } else if (d.fixed) {
- value = this.fixed_value();
- if (recursive_ref(tw, d)) {
- d.recursive_refs++;
- } else if (value && ref_once(tw, compressor, d)) {
- d.single_use = value instanceof AST_Lambda && !value.pinned()
- || d.scope === this.scope && value.is_constant_expression();
- } else {
- d.single_use = false;
- }
- if (is_modified(compressor, tw, this, value, 0, is_immutable(value))) {
- if (d.single_use) {
- d.single_use = "m";
- } else {
- d.fixed = false;
- }
- }
- if (d.fixed && tw.loop_ids[d.id] !== tw.in_loop) {
- d.cross_loop = true;
- }
- mark_escaped(tw, d, this.scope, this, value, 0, 1);
- }
- var parent;
- if (d.fixed instanceof AST_Defun
- && !((parent = tw.parent()) instanceof AST_Call && parent.expression === this)) {
- var defun = mark_defun(tw, d);
- if (defun) defun.walk(tw);
- }
- });
- def(AST_Toplevel, function(tw, descend, compressor) {
- this.globals.each(function(def) {
- reset_def(tw, compressor, def);
- });
- push(tw);
- reset_variables(tw, compressor, this);
- descend();
- pop(tw);
- walk_defuns(tw, this);
- return true;
- });
- def(AST_Try, function(tw) {
- push(tw);
- walk_body(this, tw);
- pop(tw);
- if (this.bcatch) {
- push(tw);
- this.bcatch.walk(tw);
- pop(tw);
- }
- if (this.bfinally) this.bfinally.walk(tw);
- return true;
- });
- def(AST_Unary, function(tw, descend) {
- var node = this;
- if (!unary_arithmetic[node.operator]) return;
- var exp = node.expression;
- if (!(exp instanceof AST_SymbolRef)) {
- mark_assignment_to_arguments(exp);
- return;
- }
- if (exp.fixed) delete exp.fixed;
- var d = exp.definition();
- var safe = safe_to_assign(tw, d, exp.scope, true);
- d.assignments++;
- var fixed = d.fixed;
- if (!fixed) return;
- d.chained = true;
- exp.fixed = d.fixed = function() {
- return make_node(AST_Binary, node, {
- operator: node.operator.slice(0, -1),
- left: make_node(AST_UnaryPrefix, node, {
- operator: "+",
- expression: fixed instanceof AST_Node ? fixed : fixed()
- }),
- right: make_node(AST_Number, node, {
- value: 1
- })
- });
- };
- if (!safe) return;
- d.references.push(exp);
- mark(tw, d, true);
- return true;
- });
- def(AST_VarDef, function(tw, descend) {
- var node = this;
- var d = node.name.definition();
- if (node.value) {
- if (safe_to_assign(tw, d, node.name.scope, node.value)) {
- d.fixed = function() {
- return node.value;
- };
- tw.loop_ids[d.id] = tw.in_loop;
- mark(tw, d, false);
- descend();
- mark(tw, d, true);
- return true;
- } else {
- d.fixed = false;
- }
- }
- });
- def(AST_While, function(tw, descend) {
- var saved_loop = tw.in_loop;
- tw.in_loop = this;
- push(tw);
- descend();
- pop(tw);
- tw.in_loop = saved_loop;
- return true;
- });
- })(function(node, func) {
- node.DEFMETHOD("reduce_vars", func);
- });
-
- AST_Toplevel.DEFMETHOD("reset_opt_flags", function(compressor) {
- var tw = new TreeWalker(compressor.option("reduce_vars") ? function(node, descend) {
- reset_flags(node);
- return node.reduce_vars(tw, descend, compressor);
- } : reset_flags);
- // Flow control for visiting `AST_Defun`s
- tw.defun_ids = Object.create(null);
- tw.defun_visited = Object.create(null);
- // Record the loop body in which `AST_SymbolDeclaration` is first encountered
- tw.in_loop = null;
- tw.loop_ids = Object.create(null);
- // Stack of look-up tables to keep track of whether a `SymbolDef` has been
- // properly assigned before use:
- // - `push()` & `pop()` when visiting conditional branches
- // - backup & restore via `save_ids` when visiting out-of-order sections
- tw.safe_ids = Object.create(null);
- this.walk(tw);
-
- function reset_flags(node) {
- node._squeezed = false;
- node._optimized = false;
- if (node instanceof AST_Scope) delete node._var_names;
- }
- });
-
- AST_Symbol.DEFMETHOD("fixed_value", function(final) {
- var fixed = this.definition().fixed;
- if (!fixed) return fixed;
- if (!final && this.fixed) fixed = this.fixed;
- return fixed instanceof AST_Node ? fixed : fixed();
- });
-
- AST_SymbolRef.DEFMETHOD("is_immutable", function() {
- var def = this.definition();
- if (def.orig.length != 1) return false;
- var sym = def.orig[0];
- return sym instanceof AST_SymbolLambda && def.scope.name === sym;
- });
-
- function is_lhs_read_only(lhs, compressor) {
- if (lhs instanceof AST_This) return true;
- if (lhs instanceof AST_SymbolRef) {
- var def = lhs.definition();
- return def.lambda || compressor.exposed(def) && identifier_atom[def.name];
- }
- if (lhs instanceof AST_PropAccess) {
- lhs = lhs.expression;
- if (lhs instanceof AST_SymbolRef) {
- if (lhs.is_immutable()) return false;
- lhs = lhs.fixed_value();
- }
- if (!lhs) return true;
- if (lhs.is_constant()) return true;
- return is_lhs_read_only(lhs, compressor);
- }
- return false;
- }
-
- function find_variable(compressor, name) {
- var scope, i = 0;
- while (scope = compressor.parent(i++)) {
- if (scope instanceof AST_Scope) break;
- if (scope instanceof AST_Catch) {
- scope = scope.argname.definition().scope;
- break;
- }
- }
- return scope.find_variable(name);
- }
-
- function make_node(ctor, orig, props) {
- if (!props) props = {};
- if (orig) {
- if (!props.start) props.start = orig.start;
- if (!props.end) props.end = orig.end;
- }
- return new ctor(props);
- }
-
- function make_sequence(orig, expressions) {
- if (expressions.length == 1) return expressions[0];
- return make_node(AST_Sequence, orig, {
- expressions: expressions.reduce(merge_sequence, [])
- });
- }
-
- function make_node_from_constant(val, orig) {
- switch (typeof val) {
- case "string":
- return make_node(AST_String, orig, {
- value: val
- });
- case "number":
- if (isNaN(val)) return make_node(AST_NaN, orig);
- if (isFinite(val)) {
- return 1 / val < 0 ? make_node(AST_UnaryPrefix, orig, {
- operator: "-",
- expression: make_node(AST_Number, orig, { value: -val })
- }) : make_node(AST_Number, orig, { value: val });
- }
- return val < 0 ? make_node(AST_UnaryPrefix, orig, {
- operator: "-",
- expression: make_node(AST_Infinity, orig)
- }) : make_node(AST_Infinity, orig);
- case "boolean":
- return make_node(val ? AST_True : AST_False, orig);
- case "undefined":
- return make_node(AST_Undefined, orig);
- default:
- if (val === null) {
- return make_node(AST_Null, orig, { value: null });
- }
- if (val instanceof RegExp) {
- return make_node(AST_RegExp, orig, { value: val });
- }
- throw new Error(string_template("Can't handle constant of type: {type}", {
- type: typeof val
- }));
- }
- }
-
- function needs_unbinding(compressor, val) {
- return val instanceof AST_PropAccess
- || compressor.has_directive("use strict")
- && is_undeclared_ref(val)
- && val.name == "eval";
- }
-
- // we shouldn't compress (1,func)(something) to
- // func(something) because that changes the meaning of
- // the func (becomes lexical instead of global).
- function maintain_this_binding(compressor, parent, orig, val) {
- if (parent instanceof AST_UnaryPrefix && parent.operator == "delete"
- || parent.TYPE == "Call" && parent.expression === orig && needs_unbinding(compressor, val)) {
- return make_sequence(orig, [ make_node(AST_Number, orig, { value: 0 }), val ]);
- }
- return val;
- }
-
- function merge_sequence(array, node) {
- if (node instanceof AST_Sequence) {
- array.push.apply(array, node.expressions);
- } else {
- array.push(node);
- }
- return array;
- }
-
- function as_statement_array(thing) {
- if (thing === null) return [];
- if (thing instanceof AST_BlockStatement) return thing.body;
- if (thing instanceof AST_EmptyStatement) return [];
- if (thing instanceof AST_Statement) return [ thing ];
- throw new Error("Can't convert thing to statement array");
- }
-
- function is_empty(thing) {
- if (thing === null) return true;
- if (thing instanceof AST_EmptyStatement) return true;
- if (thing instanceof AST_BlockStatement) return thing.body.length == 0;
- return false;
- }
-
- function loop_body(x) {
- if (x instanceof AST_IterationStatement) {
- return x.body instanceof AST_BlockStatement ? x.body : x;
- }
- return x;
- }
-
- function root_expr(prop) {
- while (prop instanceof AST_PropAccess) prop = prop.expression;
- return prop;
- }
-
- function is_iife_call(node) {
- if (node.TYPE != "Call") return false;
- return node.expression instanceof AST_Function || is_iife_call(node.expression);
- }
-
- function is_undeclared_ref(node) {
- return node instanceof AST_SymbolRef && node.definition().undeclared;
- }
-
- var global_names = makePredicate("Array Boolean clearInterval clearTimeout console Date decodeURI decodeURIComponent encodeURI encodeURIComponent Error escape eval EvalError Function isFinite isNaN JSON Math Number parseFloat parseInt RangeError ReferenceError RegExp Object setInterval setTimeout String SyntaxError TypeError unescape URIError");
- AST_SymbolRef.DEFMETHOD("is_declared", function(compressor) {
- return this.defined
- || !this.definition().undeclared
- || compressor.option("unsafe") && global_names[this.name];
- });
-
- var identifier_atom = makePredicate("Infinity NaN undefined");
- function is_identifier_atom(node) {
- return node instanceof AST_Infinity
- || node instanceof AST_NaN
- || node instanceof AST_Undefined;
- }
-
- function tighten_body(statements, compressor) {
- var in_loop, in_try, scope;
- find_loop_scope_try();
- var CHANGED, max_iter = 10;
- do {
- CHANGED = false;
- eliminate_spurious_blocks(statements);
- if (compressor.option("dead_code")) {
- eliminate_dead_code(statements, compressor);
- }
- if (compressor.option("if_return")) {
- handle_if_return(statements, compressor);
- }
- if (compressor.sequences_limit > 0) {
- sequencesize(statements, compressor);
- sequencesize_2(statements, compressor);
- }
- if (compressor.option("join_vars")) {
- join_consecutive_vars(statements);
- }
- if (compressor.option("collapse_vars")) {
- collapse(statements, compressor);
- }
- } while (CHANGED && max_iter-- > 0);
- return statements;
-
- function find_loop_scope_try() {
- var node = compressor.self(), level = 0;
- do {
- if (node instanceof AST_Catch || node instanceof AST_Finally) {
- level++;
- } else if (node instanceof AST_IterationStatement) {
- in_loop = true;
- } else if (node instanceof AST_Scope) {
- scope = node;
- break;
- } else if (node instanceof AST_Try) {
- in_try = node;
- }
- } while (node = compressor.parent(level++));
- }
-
- // Search from right to left for assignment-like expressions:
- // - `var a = x;`
- // - `a = x;`
- // - `++a`
- // For each candidate, scan from left to right for first usage, then try
- // to fold assignment into the site for compression.
- // Will not attempt to collapse assignments into or past code blocks
- // which are not sequentially executed, e.g. loops and conditionals.
- function collapse(statements, compressor) {
- if (scope.pinned()) return statements;
- var args;
- var candidates = [];
- var stat_index = statements.length;
- var scanner = new TreeTransformer(function(node, descend) {
- if (abort) return node;
- // Skip nodes before `candidate` as quickly as possible
- if (!hit) {
- if (node !== hit_stack[hit_index]) return node;
- hit_index++;
- if (hit_index < hit_stack.length) return handle_custom_scan_order(node);
- hit = true;
- stop_after = (value_def ? find_stop_value : find_stop)(node, 0);
- if (stop_after === node) abort = true;
- return node;
- }
- // Stop immediately if these node types are encountered
- var parent = scanner.parent();
- if (should_stop(node, parent)) {
- abort = true;
- return node;
- }
- // Stop only if candidate is found within conditional branches
- if (!stop_if_hit && in_conditional(node, parent)) {
- stop_if_hit = parent;
- }
- // Skip transient nodes caused by single-use variable replacement
- if (node.single_use && parent instanceof AST_VarDef && parent.value === node) return node;
- // Replace variable with assignment when found
- var hit_rhs;
- if (!(node instanceof AST_SymbolDeclaration)
- && (scan_lhs && lhs.equivalent_to(node)
- || scan_rhs && (hit_rhs = scan_rhs(node, this)))) {
- if (!can_replace || stop_if_hit && (hit_rhs || !lhs_local || !replace_all)) {
- if (!hit_rhs || !value_def) abort = true;
- return node;
- }
- if (is_lhs(node, parent)) {
- if (value_def && !hit_rhs) {
- assign_used = true;
- replaced++;
- }
- return node;
- } else if (value_def) {
- if (!hit_rhs) replaced++;
- return node;
- } else {
- replaced++;
- }
- CHANGED = abort = true;
- AST_Node.info("Collapsing {name} [{file}:{line},{col}]", {
- name: node.print_to_string(),
- file: node.start.file,
- line: node.start.line,
- col: node.start.col
- });
- if (candidate instanceof AST_UnaryPostfix) {
- return make_node(AST_UnaryPrefix, candidate, candidate);
- }
- if (candidate instanceof AST_VarDef) {
- var def = candidate.name.definition();
- if (def.references.length - def.replaced == 1 && !compressor.exposed(def)) {
- def.replaced++;
- return maintain_this_binding(compressor, parent, node, candidate.value);
- }
- return make_node(AST_Assign, candidate, {
- operator: "=",
- left: make_node(AST_SymbolRef, candidate.name, candidate.name),
- right: candidate.value
- });
- }
- candidate.write_only = false;
- return candidate;
- }
- // These node types have child nodes that execute sequentially,
- // but are otherwise not safe to scan into or beyond them.
- if (is_last_node(node, parent) || may_throw(node)) {
- stop_after = node;
- if (node instanceof AST_Scope) abort = true;
- }
- // Scan but don't replace inside getter/setter
- if (node instanceof AST_Accessor) {
- var replace = can_replace;
- can_replace = false;
- descend(node, scanner);
- can_replace = replace;
- return node;
- }
- return handle_custom_scan_order(node);
- }, function(node) {
- if (abort) return;
- if (stop_after === node) abort = true;
- if (stop_if_hit === node) stop_if_hit = null;
- });
- var multi_replacer = new TreeTransformer(function(node) {
- if (abort) return node;
- // Skip nodes before `candidate` as quickly as possible
- if (!hit) {
- if (node !== hit_stack[hit_index]) return node;
- hit_index++;
- switch (hit_stack.length - hit_index) {
- case 0:
- hit = true;
- if (assign_used) return node;
- if (node instanceof AST_VarDef) return node;
- def.replaced++;
- var parent = multi_replacer.parent();
- if (parent instanceof AST_Sequence && parent.tail_node() !== node) {
- value_def.replaced++;
- return MAP.skip;
- }
- return get_rvalue(candidate);
- case 1:
- if (!assign_used && node.body === candidate) {
- hit = true;
- def.replaced++;
- value_def.replaced++;
- return null;
- }
- default:
- return;
- }
- }
- // Replace variable when found
- if (node instanceof AST_SymbolRef
- && node.name == def.name) {
- if (!--replaced) abort = true;
- if (is_lhs(node, multi_replacer.parent())) return node;
- def.replaced++;
- value_def.replaced--;
- return get_rvalue(candidate).clone();
- }
- // Skip (non-executed) functions and (leading) default case in switch statements
- if (node instanceof AST_Default || node instanceof AST_Scope) return node;
- }, patch_sequence);
- var force_single;
- while (--stat_index >= 0) {
- // Treat parameters as collapsible in IIFE, i.e.
- // function(a, b){ ... }(x());
- // would be translated into equivalent assignments:
- // var a = x(), b = undefined;
- if (stat_index == 0 && compressor.option("unused")) extract_args();
- // Find collapsible assignments
- var hit_stack = [];
- extract_candidates(statements[stat_index]);
- while (candidates.length > 0) {
- hit_stack = candidates.pop();
- var hit_index = 0;
- var candidate = hit_stack[hit_stack.length - 1];
- var value_def = null;
- var stop_after = null;
- var stop_if_hit = null;
- var lhs = get_lhs(candidate);
- var side_effects = lhs && lhs.has_side_effects(compressor);
- var scan_lhs = lhs && !side_effects && !is_lhs_read_only(lhs, compressor);
- var scan_rhs = foldable(get_rhs(candidate));
- if (!scan_lhs && !scan_rhs) continue;
- var modify_toplevel = false;
- // Locate symbols which may execute code outside of scanning range
- var lvalues = get_lvalues(candidate);
- var lhs_local = is_lhs_local(lhs);
- if (!side_effects) side_effects = value_has_side_effects(candidate);
- var replace_all = replace_all_symbols(candidate);
- var may_throw = candidate.may_throw(compressor) ? in_try ? function(node) {
- return node.has_side_effects(compressor);
- } : side_effects_external : return_false;
- var funarg = candidate.name instanceof AST_SymbolFunarg;
- var hit = funarg;
- var abort = false;
- var replaced = 0;
- var assign_used = false;
- var can_replace = !args || !hit;
- if (!can_replace) {
- for (var j = compressor.self().argnames.lastIndexOf(candidate.name) + 1; !abort && j < args.length; j++) {
- args[j].transform(scanner);
- }
- can_replace = true;
- }
- for (var i = stat_index; !abort && i < statements.length; i++) {
- statements[i].transform(scanner);
- }
- if (value_def) {
- var def = lhs.definition();
- var referenced = def.references.length - def.replaced;
- if (candidate instanceof AST_Assign) referenced--;
- if (replaced && referenced == replaced) {
- abort = false;
- } else if (candidate instanceof AST_Assign) {
- candidates.push(hit_stack);
- force_single = true;
- continue;
- } else {
- replaced = false;
- }
- if (replaced) {
- hit_index = 0;
- hit = funarg;
- for (var i = stat_index; !abort && i < statements.length; i++) {
- if (!statements[i].transform(multi_replacer)) statements.splice(i--, 1);
- }
- value_def.single_use = false;
- }
- }
- if (replaced && !remove_candidate(candidate)) statements.splice(stat_index, 1);
- }
- }
-
- function handle_custom_scan_order(node) {
- // Skip (non-executed) functions
- if (node instanceof AST_Scope) return node;
- // Scan case expressions first in a switch statement
- if (node instanceof AST_Switch) {
- node.expression = node.expression.transform(scanner);
- for (var i = 0; !abort && i < node.body.length; i++) {
- var branch = node.body[i];
- if (branch instanceof AST_Case) {
- if (!hit) {
- if (branch !== hit_stack[hit_index]) continue;
- hit_index++;
- }
- branch.expression = branch.expression.transform(scanner);
- if (!replace_all) break;
- scan_rhs = false;
- }
- }
- abort = true;
- return node;
- }
- }
-
- function should_stop(node, parent) {
- if (parent instanceof AST_For) return node !== parent.init;
- if (node instanceof AST_Assign) {
- return node.operator != "=" && lhs.equivalent_to(node.left);
- }
- if (node instanceof AST_Call) {
- if (!(lhs instanceof AST_PropAccess)) return false;
- if (!lhs.equivalent_to(node.expression)) return false;
- var rhs = get_rvalue(candidate);
- return !(rhs instanceof AST_Function && !rhs.contains_this());
- }
- if (node instanceof AST_Debugger) return true;
- if (node instanceof AST_Defun) return funarg && lhs.name === node.name.name;
- if (node instanceof AST_IterationStatement) return !(node instanceof AST_For);
- if (node instanceof AST_LoopControl) return true;
- if (node instanceof AST_Try) return true;
- if (node instanceof AST_With) return true;
- if (replace_all) return false;
- return node instanceof AST_SymbolRef
- && !node.is_declared(compressor)
- && !(parent instanceof AST_Assign && parent.operator == "=" && parent.left === node);
- }
-
- function in_conditional(node, parent) {
- if (parent instanceof AST_Binary) return lazy_op[parent.operator] && parent.left !== node;
- if (parent instanceof AST_Case) return parent.expression !== node;
- if (parent instanceof AST_Conditional) return parent.condition !== node;
- return parent instanceof AST_If && parent.condition !== node;
- }
-
- function is_last_node(node, parent) {
- if (node instanceof AST_Call) {
- var fn = node.expression;
- if (fn instanceof AST_SymbolRef) fn = fn.fixed_value();
- if (!(fn instanceof AST_Lambda)) return true;
- if (fn.collapse_scanning) return false;
- fn.collapse_scanning = true;
- var replace = can_replace;
- can_replace = false;
- var after = stop_after;
- var if_hit = stop_if_hit;
- var rhs_fn = scan_rhs;
- for (var i = 0; !abort && i < fn.body.length; i++) {
- var stat = fn.body[i];
- if (stat instanceof AST_Return) {
- if (stat.value) stat.value.transform(scanner);
- break;
- }
- stat.transform(scanner);
- }
- scan_rhs = rhs_fn;
- stop_if_hit = if_hit;
- stop_after = after;
- can_replace = replace;
- delete fn.collapse_scanning;
- if (!abort) return false;
- abort = false;
- return true;
- }
- if (node instanceof AST_Exit) {
- if (in_try) {
- if (in_try.bfinally) return true;
- if (in_try.bcatch && node instanceof AST_Throw) return true;
- }
- return side_effects || lhs instanceof AST_PropAccess || may_modify(lhs);
- }
- if (node instanceof AST_Function) {
- return compressor.option("ie8") && node.name && lvalues.has(node.name.name);
- }
- if (node instanceof AST_PropAccess) {
- return side_effects || !value_def && node.expression.may_throw_on_access(compressor);
- }
- if (node instanceof AST_SymbolRef) {
- if (symbol_in_lvalues(node, parent)) {
- return !parent || parent.operator != "=" || parent.left !== node;
- }
- return side_effects && may_modify(node);
- }
- if (node instanceof AST_This) return symbol_in_lvalues(node, parent);
- if (node instanceof AST_VarDef) {
- if (!node.value) return false;
- return lvalues.has(node.name.name) || side_effects && may_modify(node.name);
- }
- var sym = is_lhs(node.left, node);
- if (sym && lvalues.has(sym.name)) return true;
- if (sym instanceof AST_PropAccess) return true;
- }
-
- function extract_args() {
- var iife, fn = compressor.self();
- if (fn instanceof AST_Function
- && !fn.name
- && !fn.uses_arguments
- && !fn.pinned()
- && (iife = compressor.parent()) instanceof AST_Call
- && iife.expression === fn) {
- var fn_strict = compressor.has_directive("use strict");
- if (fn_strict && !member(fn_strict, fn.body)) fn_strict = false;
- var len = fn.argnames.length;
- args = iife.args.slice(len);
- var names = Object.create(null);
- for (var i = len; --i >= 0;) {
- var sym = fn.argnames[i];
- var arg = iife.args[i];
- args.unshift(make_node(AST_VarDef, sym, {
- name: sym,
- value: arg
- }));
- if (sym.name in names) continue;
- names[sym.name] = true;
- if (!arg) {
- arg = make_node(AST_Undefined, sym).transform(compressor);
- } else if (arg instanceof AST_Lambda && arg.pinned()) {
- arg = null;
- } else {
- arg.walk(new TreeWalker(function(node) {
- if (!arg) return true;
- if (node instanceof AST_SymbolRef && fn.variables.has(node.name)) {
- var s = node.definition().scope;
- if (s !== scope) while (s = s.parent_scope) {
- if (s === scope) return true;
- }
- arg = null;
- }
- if (node instanceof AST_This && (fn_strict || !this.find_parent(AST_Scope))) {
- arg = null;
- return true;
- }
- }));
- }
- if (arg) candidates.unshift([ make_node(AST_VarDef, sym, {
- name: sym,
- value: arg
- }) ]);
- }
- }
- }
-
- function extract_candidates(expr) {
- hit_stack.push(expr);
- if (expr instanceof AST_Array) {
- expr.elements.forEach(extract_candidates);
- } else if (expr instanceof AST_Assign) {
- candidates.push(hit_stack.slice());
- extract_candidates(expr.left);
- extract_candidates(expr.right);
- } else if (expr instanceof AST_Binary) {
- extract_candidates(expr.left);
- extract_candidates(expr.right);
- } else if (expr instanceof AST_Call) {
- extract_candidates(expr.expression);
- expr.args.forEach(extract_candidates);
- } else if (expr instanceof AST_Case) {
- extract_candidates(expr.expression);
- } else if (expr instanceof AST_Conditional) {
- extract_candidates(expr.condition);
- extract_candidates(expr.consequent);
- extract_candidates(expr.alternative);
- } else if (expr instanceof AST_Definitions) {
- expr.definitions.forEach(extract_candidates);
- } else if (expr instanceof AST_Dot) {
- extract_candidates(expr.expression);
- } else if (expr instanceof AST_DWLoop) {
- extract_candidates(expr.condition);
- if (!(expr.body instanceof AST_Block)) {
- extract_candidates(expr.body);
- }
- } else if (expr instanceof AST_Exit) {
- if (expr.value) extract_candidates(expr.value);
- } else if (expr instanceof AST_For) {
- if (expr.init) extract_candidates(expr.init);
- if (expr.condition) extract_candidates(expr.condition);
- if (expr.step) extract_candidates(expr.step);
- if (!(expr.body instanceof AST_Block)) {
- extract_candidates(expr.body);
- }
- } else if (expr instanceof AST_ForIn) {
- extract_candidates(expr.object);
- if (!(expr.body instanceof AST_Block)) {
- extract_candidates(expr.body);
- }
- } else if (expr instanceof AST_If) {
- extract_candidates(expr.condition);
- if (!(expr.body instanceof AST_Block)) {
- extract_candidates(expr.body);
- }
- if (expr.alternative && !(expr.alternative instanceof AST_Block)) {
- extract_candidates(expr.alternative);
- }
- } else if (expr instanceof AST_Object) {
- expr.properties.forEach(function(prop) {
- if (prop instanceof AST_ObjectKeyVal) {
- hit_stack.push(prop);
- extract_candidates(prop.value);
- hit_stack.pop();
- }
- });
- } else if (expr instanceof AST_Sequence) {
- expr.expressions.forEach(extract_candidates);
- } else if (expr instanceof AST_SimpleStatement) {
- extract_candidates(expr.body);
- } else if (expr instanceof AST_Sub) {
- extract_candidates(expr.expression);
- extract_candidates(expr.property);
- } else if (expr instanceof AST_Switch) {
- extract_candidates(expr.expression);
- expr.body.forEach(extract_candidates);
- } else if (expr instanceof AST_Unary) {
- if (unary_arithmetic[expr.operator]) {
- candidates.push(hit_stack.slice());
- } else {
- extract_candidates(expr.expression);
- }
- } else if (expr instanceof AST_VarDef) {
- if (expr.value) {
- var def = expr.name.definition();
- if (def.references.length > def.replaced) {
- candidates.push(hit_stack.slice());
- }
- extract_candidates(expr.value);
- }
- }
- hit_stack.pop();
- }
-
- function find_stop(node, level) {
- var parent = scanner.parent(level);
- if (parent instanceof AST_Array) return node;
- if (parent instanceof AST_Assign) return node;
- if (parent instanceof AST_Binary) return node;
- if (parent instanceof AST_Call) return node;
- if (parent instanceof AST_Case) return node;
- if (parent instanceof AST_Conditional) return node;
- if (parent instanceof AST_Definitions) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Exit) return node;
- if (parent instanceof AST_If) return node;
- if (parent instanceof AST_IterationStatement) return node;
- if (parent instanceof AST_ObjectKeyVal) return node;
- if (parent instanceof AST_PropAccess) return node;
- if (parent instanceof AST_Sequence) {
- return (parent.tail_node() === node ? find_stop : find_stop_unused)(parent, level + 1);
- }
- if (parent instanceof AST_SimpleStatement) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Switch) return node;
- if (parent instanceof AST_Unary) return node;
- if (parent instanceof AST_VarDef) return node;
- return null;
- }
-
- function find_stop_value(node, level) {
- var parent = scanner.parent(level);
- if (parent instanceof AST_Array) return find_stop_value(parent, level + 1);
- if (parent instanceof AST_Assign) {
- if (may_throw(parent)) return node;
- if (parent.left instanceof AST_SymbolRef) {
- var name = parent.left.name;
- if (lhs.name == name) return node;
- if (value_def.name == name) return node;
- }
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_Binary) {
- if (lazy_op[parent.operator] && parent.left !== node) {
- do {
- node = parent;
- parent = scanner.parent(++level);
- } while (parent instanceof AST_Binary && parent.operator == node.operator);
- return node;
- }
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_Call) return parent;
- if (parent instanceof AST_Case) {
- if (parent.expression !== node) return node;
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_Conditional) {
- if (parent.condition !== node) return node;
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_Definitions) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Do) return node;
- if (parent instanceof AST_Exit) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_For) {
- if (parent.init !== node && parent.condition !== node) return node;
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_ForIn) {
- if (parent.init !== node) return node;
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_If) {
- if (parent.condition !== node) return node;
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_ObjectKeyVal) {
- var obj = scanner.parent(level + 1);
- return all(obj.properties, function(prop) {
- return prop instanceof AST_ObjectKeyVal;
- }) ? find_stop_value(obj, level + 2) : obj;
- }
- if (parent instanceof AST_PropAccess) return find_stop_value(parent, level + 1);
- if (parent instanceof AST_Sequence) {
- return (parent.tail_node() === node ? find_stop_value : find_stop_unused)(parent, level + 1);
- }
- if (parent instanceof AST_SimpleStatement) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Switch) {
- if (parent.expression !== node) return node;
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_Unary) {
- if (parent.operator == "delete") return node;
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_VarDef) {
- var name = parent.name.name;
- if (lhs.name == name) return node;
- if (value_def.name == name) return node;
- return find_stop_value(parent, level + 1);
- }
- if (parent instanceof AST_While) {
- if (parent.condition !== node) return node;
- return find_stop_value(parent, level + 1);
- }
- return null;
- }
-
- function find_stop_unused(node, level) {
- var parent = scanner.parent(level);
- if (is_last_node(node, parent)) return node;
- if (in_conditional(node, parent)) return node;
- if (parent instanceof AST_Array) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Assign) {
- return may_throw(parent) ? node : find_stop_unused(parent, level + 1);
- }
- if (parent instanceof AST_Binary) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Call) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Case) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Conditional) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Definitions) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Exit) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_If) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_IterationStatement) return node;
- if (parent instanceof AST_ObjectKeyVal) {
- var obj = scanner.parent(level + 1);
- return all(obj.properties, function(prop) {
- return prop instanceof AST_ObjectKeyVal;
- }) ? find_stop_unused(obj, level + 2) : obj;
- }
- if (parent instanceof AST_PropAccess) {
- var exp = parent.expression;
- if (exp === node) return find_stop_unused(parent, level + 1);
- var sym = root_expr(exp);
- if (!(sym instanceof AST_SymbolRef)) return find_stop_unused(parent, level + 1);
- var lvalue = lvalues.get(sym.name);
- return !lvalue || all(lvalue, function(lhs) {
- return !(lhs instanceof AST_PropAccess);
- }) ? find_stop_unused(parent, level + 1) : node;
- }
- if (parent instanceof AST_Sequence) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_SimpleStatement) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Switch) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_Unary) return find_stop_unused(parent, level + 1);
- if (parent instanceof AST_VarDef) return find_stop_unused(parent, level + 1);
- return null;
- }
-
- function mangleable_var(value) {
- if (force_single) {
- force_single = false;
- return;
- }
- if (!(value instanceof AST_SymbolRef)) return;
- var def = value.definition();
- if (def.undeclared) return;
- if (is_arguments(def)) return;
- return value_def = def;
- }
-
- function get_lhs(expr) {
- if (expr instanceof AST_VarDef) {
- var def = expr.name.definition();
- if (!member(expr.name, def.orig)) return;
- var referenced = def.references.length - def.replaced;
- var declared = def.orig.length - def.eliminated;
- if (declared > 1 && !(expr.name instanceof AST_SymbolFunarg)
- || (referenced > 1 ? mangleable_var(expr.value) : !compressor.exposed(def))) {
- return make_node(AST_SymbolRef, expr.name, expr.name);
- }
- } else if (expr instanceof AST_Assign) {
- var lhs = expr.left;
- if (expr.operator == "=" && lhs instanceof AST_SymbolRef) {
- var def = lhs.definition();
- if (def.references[0] === lhs) {
- var referenced = def.references.length - def.replaced;
- if (referenced > 1) mangleable_var(expr.right);
- }
- }
- return lhs;
- } else {
- return expr.expression;
- }
- }
-
- function get_rhs(expr) {
- return candidate instanceof AST_Assign && candidate.operator == "=" && candidate.right;
- }
-
- function get_rvalue(expr) {
- return expr[expr instanceof AST_Assign ? "right" : "value"];
- }
-
- function invariant(expr) {
- if (expr instanceof AST_Array) return false;
- if (expr instanceof AST_Binary && lazy_op[expr.operator]) {
- return invariant(expr.left) && invariant(expr.right);
- }
- if (expr instanceof AST_Call) return false;
- if (expr instanceof AST_Conditional) {
- return invariant(expr.consequent) && invariant(expr.alternative);
- }
- if (expr instanceof AST_Object) return false;
- return !expr.has_side_effects(compressor);
- }
-
- function foldable(expr) {
- if (!expr) return false;
- if (expr instanceof AST_SymbolRef) {
- var value = expr.evaluate(compressor);
- if (value === expr) return rhs_exact_match;
- return rhs_fuzzy_match(value, rhs_exact_match);
- }
- if (expr instanceof AST_This) return rhs_exact_match;
- if (expr.is_truthy()) return rhs_fuzzy_match(true, return_false);
- if (expr.is_constant()) {
- return rhs_fuzzy_match(expr.evaluate(compressor), rhs_exact_match);
- }
- if (!(lhs instanceof AST_SymbolRef)) return false;
- if (!invariant(expr)) return false;
- var circular;
- var def = lhs.definition();
- expr.walk(new TreeWalker(function(node) {
- if (circular) return true;
- if (node instanceof AST_SymbolRef && node.definition() === def) {
- circular = true;
- }
- }));
- return !circular && rhs_exact_match;
-
- function rhs_exact_match(node) {
- return expr.equivalent_to(node);
- }
- }
-
- function rhs_fuzzy_match(value, fallback) {
- return function(node, tw) {
- if (tw.in_boolean_context()) {
- if (value && node.is_truthy() && !node.has_side_effects(compressor)) {
- return true;
- }
- if (node.is_constant()) {
- return !node.evaluate(compressor) == !value;
- }
- }
- return fallback(node);
- };
- }
-
- function get_lvalues(expr) {
- var lvalues = new Dictionary();
- if (candidate instanceof AST_VarDef) lvalues.add(candidate.name.name, lhs);
- var scan_iife = scope instanceof AST_Toplevel;
- var tw = new TreeWalker(function(node) {
- if (scan_iife && node.TYPE == "Call") {
- var exp = node.expression;
- if (exp instanceof AST_PropAccess) return;
- if (exp instanceof AST_Function && !exp.contains_this()) return;
- modify_toplevel = true;
- scan_iife = false;
- return;
- }
- var value;
- if (node instanceof AST_SymbolRef) {
- value = node.fixed_value() || node;
- } else if (node instanceof AST_This) {
- value = node;
- }
- if (value) lvalues.add(node.name, is_modified(compressor, tw, node, value, 0));
- });
- expr.walk(tw);
- return lvalues;
- }
-
- function remove_candidate(expr) {
- if (expr.name instanceof AST_SymbolFunarg) {
- var index = compressor.self().argnames.indexOf(expr.name);
- var args = compressor.parent().args;
- if (args[index]) args[index] = make_node(AST_Number, args[index], {
- value: 0
- });
- return true;
- }
- var found = false;
- return statements[stat_index].transform(new TreeTransformer(function(node, descend, in_list) {
- if (found) return node;
- if (node instanceof AST_Scope) return node;
- if (node !== expr && node.body !== expr) return;
- found = true;
- if (node instanceof AST_VarDef) {
- node.value = null;
- return node;
- }
- return in_list ? MAP.skip : null;
- }, patch_sequence));
- }
-
- function patch_sequence(node) {
- if (node instanceof AST_Sequence) switch (node.expressions.length) {
- case 0: return null;
- case 1: return node.expressions[0];
- }
- }
-
- function is_lhs_local(lhs) {
- var sym = root_expr(lhs);
- return sym instanceof AST_SymbolRef
- && sym.definition().scope === scope
- && !(in_loop
- && (lvalues.has(sym.name) && lvalues.get(sym.name)[0] !== lhs
- || candidate instanceof AST_Unary
- || candidate instanceof AST_Assign && candidate.operator != "="));
- }
-
- function value_has_side_effects(expr) {
- if (expr instanceof AST_Unary) return false;
- return get_rvalue(expr).has_side_effects(compressor);
- }
-
- function replace_all_symbols(expr) {
- if (expr instanceof AST_Unary) return false;
- if (side_effects) return false;
- if (value_def) return true;
- if (!(lhs instanceof AST_SymbolRef)) return false;
- var referenced;
- if (expr instanceof AST_VarDef) {
- referenced = 1;
- } else if (expr.operator == "=") {
- referenced = 2;
- } else {
- return false;
- }
- var def = lhs.definition();
- return def.references.length - def.replaced == referenced;
- }
-
- function symbol_in_lvalues(sym, parent) {
- var lvalue = lvalues.get(sym.name);
- if (!lvalue || all(lvalue, function(lhs) {
- return !lhs;
- })) return;
- if (lvalue[0] !== lhs) return true;
- scan_rhs = false;
- }
-
- function may_modify(sym) {
- var def = sym.definition();
- if (def.orig.length == 1 && def.orig[0] instanceof AST_SymbolDefun) return false;
- if (def.scope !== scope) return true;
- if (modify_toplevel && compressor.exposed(def)) return true;
- return !all(def.references, function(ref) {
- return ref.scope.resolve() === scope;
- });
- }
-
- function side_effects_external(node, lhs) {
- if (node instanceof AST_Assign) return side_effects_external(node.left, true);
- if (node instanceof AST_Unary) return side_effects_external(node.expression, true);
- if (node instanceof AST_VarDef) return node.value && side_effects_external(node.value);
- if (lhs) {
- if (node instanceof AST_Dot) return side_effects_external(node.expression, true);
- if (node instanceof AST_Sub) return side_effects_external(node.expression, true);
- if (node instanceof AST_SymbolRef) return node.definition().scope !== scope;
- }
- return false;
- }
- }
-
- function eliminate_spurious_blocks(statements) {
- var seen_dirs = [];
- for (var i = 0; i < statements.length;) {
- var stat = statements[i];
- if (stat instanceof AST_BlockStatement) {
- CHANGED = true;
- eliminate_spurious_blocks(stat.body);
- [].splice.apply(statements, [i, 1].concat(stat.body));
- i += stat.body.length;
- } else if (stat instanceof AST_EmptyStatement) {
- CHANGED = true;
- statements.splice(i, 1);
- } else if (stat instanceof AST_Directive) {
- if (!member(stat.value, seen_dirs)) {
- i++;
- seen_dirs.push(stat.value);
- } else {
- CHANGED = true;
- statements.splice(i, 1);
- }
- } else i++;
- }
- }
-
- function handle_if_return(statements, compressor) {
- var self = compressor.self();
- var multiple_if_returns = has_multiple_if_returns(statements);
- var in_lambda = self instanceof AST_Lambda;
- for (var i = statements.length; --i >= 0;) {
- var stat = statements[i];
- var j = next_index(i);
- var next = statements[j];
-
- if (in_lambda && !next && stat instanceof AST_Return) {
- if (!stat.value) {
- CHANGED = true;
- statements.splice(i, 1);
- continue;
- }
- if (stat.value instanceof AST_UnaryPrefix && stat.value.operator == "void") {
- CHANGED = true;
- statements[i] = make_node(AST_SimpleStatement, stat, {
- body: stat.value.expression
- });
- continue;
- }
- }
-
- if (stat instanceof AST_If) {
- var ab = aborts(stat.body);
- if (can_merge_flow(ab)) {
- if (ab.label) remove(ab.label.thedef.references, ab);
- CHANGED = true;
- stat = stat.clone();
- stat.condition = stat.condition.negate(compressor);
- var body = as_statement_array_with_return(stat.body, ab);
- stat.body = make_node(AST_BlockStatement, stat, {
- body: as_statement_array(stat.alternative).concat(extract_functions())
- });
- stat.alternative = make_node(AST_BlockStatement, stat, {
- body: body
- });
- statements[i] = stat;
- statements[i] = stat.transform(compressor);
- continue;
- }
-
- if (ab && !stat.alternative && stat.body instanceof AST_BlockStatement && next instanceof AST_Jump) {
- var negated = stat.condition.negate(compressor);
- if (negated.print_to_string().length <= stat.condition.print_to_string().length) {
- CHANGED = true;
- stat = stat.clone();
- stat.condition = negated;
- statements[j] = stat.body;
- stat.body = next;
- statements[i] = stat;
- statements[i] = stat.transform(compressor);
- continue;
- }
- }
-
- var alt = aborts(stat.alternative);
- if (can_merge_flow(alt)) {
- if (alt.label) remove(alt.label.thedef.references, alt);
- CHANGED = true;
- stat = stat.clone();
- stat.body = make_node(AST_BlockStatement, stat.body, {
- body: as_statement_array(stat.body).concat(extract_functions())
- });
- var body = as_statement_array_with_return(stat.alternative, alt);
- stat.alternative = make_node(AST_BlockStatement, stat.alternative, {
- body: body
- });
- statements[i] = stat;
- statements[i] = stat.transform(compressor);
- continue;
- }
-
- if (compressor.option("typeofs")) {
- if (ab && !alt) {
- mark_locally_defined(stat.condition, null, make_node(AST_BlockStatement, self, {
- body: statements.slice(i + 1)
- }));
- }
- if (!ab && alt) {
- mark_locally_defined(stat.condition, make_node(AST_BlockStatement, self, {
- body: statements.slice(i + 1)
- }));
- }
- }
- }
-
- if (stat instanceof AST_If && stat.body instanceof AST_Return) {
- var value = stat.body.value;
- var in_bool = stat.body.in_bool || next instanceof AST_Return && next.in_bool;
- //---
- // pretty silly case, but:
- // if (foo()) return; return; => foo(); return;
- if (!value && !stat.alternative
- && (in_lambda && !next || next instanceof AST_Return && !next.value)) {
- CHANGED = true;
- statements[i] = make_node(AST_SimpleStatement, stat.condition, {
- body: stat.condition
- });
- continue;
- }
- //---
- // if (foo()) return x; return y; => return foo() ? x : y;
- if ((in_bool || value) && !stat.alternative && next instanceof AST_Return) {
- CHANGED = true;
- stat = stat.clone();
- stat.alternative = next;
- statements.splice(i, 1, stat.transform(compressor));
- statements.splice(j, 1);
- continue;
- }
- //---
- // if (foo()) return x; [ return ; ] => return foo() ? x : undefined;
- if (!stat.alternative && !next && in_lambda && (in_bool || value && multiple_if_returns)) {
- CHANGED = true;
- stat = stat.clone();
- stat.alternative = make_node(AST_Return, stat, {
- value: null
- });
- statements.splice(i, 1, stat.transform(compressor));
- continue;
- }
- //---
- // if (a) return b; if (c) return d; e; => return a ? b : c ? d : void e;
- //
- // if sequences is not enabled, this can lead to an endless loop (issue #866).
- // however, with sequences on this helps producing slightly better output for
- // the example code.
- var prev = statements[prev_index(i)];
- if (compressor.option("sequences") && in_lambda && !stat.alternative
- && prev instanceof AST_If && prev.body instanceof AST_Return
- && next_index(j) == statements.length && next instanceof AST_SimpleStatement) {
- CHANGED = true;
- stat = stat.clone();
- stat.alternative = make_node(AST_BlockStatement, next, {
- body: [
- next,
- make_node(AST_Return, next, {
- value: null
- })
- ]
- });
- statements.splice(i, 1, stat.transform(compressor));
- statements.splice(j, 1);
- continue;
- }
- }
- }
-
- function has_multiple_if_returns(statements) {
- var n = 0;
- for (var i = statements.length; --i >= 0;) {
- var stat = statements[i];
- if (stat instanceof AST_If && stat.body instanceof AST_Return) {
- if (++n > 1) return true;
- }
- }
- return false;
- }
-
- function is_return_void(value) {
- return !value || value instanceof AST_UnaryPrefix && value.operator == "void";
- }
-
- function can_merge_flow(ab) {
- if (!ab) return false;
- var lct = ab instanceof AST_LoopControl ? compressor.loopcontrol_target(ab) : null;
- return ab instanceof AST_Return && in_lambda && is_return_void(ab.value)
- || ab instanceof AST_Continue && self === loop_body(lct)
- || ab instanceof AST_Break && lct instanceof AST_BlockStatement && self === lct;
- }
-
- function extract_functions() {
- var tail = statements.slice(i + 1);
- statements.length = i + 1;
- return tail.filter(function(stat) {
- if (stat instanceof AST_Defun) {
- statements.push(stat);
- return false;
- }
- return true;
- });
- }
-
- function as_statement_array_with_return(node, ab) {
- var body = as_statement_array(node).slice(0, -1);
- if (ab.value) {
- body.push(make_node(AST_SimpleStatement, ab.value, {
- body: ab.value.expression
- }));
- }
- return body;
- }
-
- function next_index(i) {
- for (var j = i + 1; j < statements.length; j++) {
- var stat = statements[j];
- if (!(stat instanceof AST_Var && declarations_only(stat))) {
- break;
- }
- }
- return j;
- }
-
- function prev_index(i) {
- for (var j = i; --j >= 0;) {
- var stat = statements[j];
- if (!(stat instanceof AST_Var && declarations_only(stat))) {
- break;
- }
- }
- return j;
- }
- }
-
- function eliminate_dead_code(statements, compressor) {
- var has_quit;
- var self = compressor.self();
- for (var i = 0, n = 0, len = statements.length; i < len; i++) {
- var stat = statements[i];
- if (stat instanceof AST_LoopControl) {
- var lct = compressor.loopcontrol_target(stat);
- if (stat instanceof AST_Break
- && !(lct instanceof AST_IterationStatement)
- && loop_body(lct) === self
- || stat instanceof AST_Continue
- && loop_body(lct) === self) {
- if (stat.label) remove(stat.label.thedef.references, stat);
- } else {
- statements[n++] = stat;
- }
- } else {
- statements[n++] = stat;
- }
- if (aborts(stat)) {
- has_quit = statements.slice(i + 1);
- break;
- }
- }
- statements.length = n;
- CHANGED = n != len;
- if (has_quit) has_quit.forEach(function(stat) {
- extract_declarations_from_unreachable_code(stat, statements);
- });
- }
-
- function declarations_only(node) {
- return all(node.definitions, function(var_def) {
- return !var_def.value;
- });
- }
-
- function sequencesize(statements, compressor) {
- if (statements.length < 2) return;
- var seq = [], n = 0;
- function push_seq() {
- if (!seq.length) return;
- var body = make_sequence(seq[0], seq);
- statements[n++] = make_node(AST_SimpleStatement, body, { body: body });
- seq = [];
- }
- for (var i = 0, len = statements.length; i < len; i++) {
- var stat = statements[i];
- if (stat instanceof AST_SimpleStatement) {
- if (seq.length >= compressor.sequences_limit) push_seq();
- var body = stat.body;
- if (seq.length > 0) body = body.drop_side_effect_free(compressor);
- if (body) merge_sequence(seq, body);
- } else if (stat instanceof AST_Definitions && declarations_only(stat)
- || stat instanceof AST_Defun) {
- statements[n++] = stat;
- } else {
- push_seq();
- statements[n++] = stat;
- }
- }
- push_seq();
- statements.length = n;
- if (n != len) CHANGED = true;
- }
-
- function to_simple_statement(block, decls) {
- if (!(block instanceof AST_BlockStatement)) return block;
- var stat = null;
- for (var i = 0; i < block.body.length; i++) {
- var line = block.body[i];
- if (line instanceof AST_Var && declarations_only(line)) {
- decls.push(line);
- } else if (stat) {
- return false;
- } else {
- stat = line;
- }
- }
- return stat;
- }
-
- function sequencesize_2(statements, compressor) {
- function cons_seq(right) {
- n--;
- CHANGED = true;
- var left = prev.body;
- return make_sequence(left, [ left, right ]);
- }
- var n = 0, prev;
- for (var i = 0; i < statements.length; i++) {
- var stat = statements[i];
- if (prev) {
- if (stat instanceof AST_Exit) {
- stat.value = cons_seq(stat.value || make_node(AST_Undefined, stat)).transform(compressor);
- } else if (stat instanceof AST_For) {
- if (!(stat.init instanceof AST_Definitions)) {
- var abort = false;
- prev.body.walk(new TreeWalker(function(node) {
- if (abort || node instanceof AST_Scope) return true;
- if (node instanceof AST_Binary && node.operator == "in") {
- abort = true;
- return true;
- }
- }));
- if (!abort) {
- if (stat.init) stat.init = cons_seq(stat.init);
- else {
- stat.init = prev.body;
- n--;
- CHANGED = true;
- }
- }
- }
- } else if (stat instanceof AST_ForIn) {
- stat.object = cons_seq(stat.object);
- } else if (stat instanceof AST_If) {
- stat.condition = cons_seq(stat.condition);
- } else if (stat instanceof AST_Switch) {
- stat.expression = cons_seq(stat.expression);
- } else if (stat instanceof AST_With) {
- stat.expression = cons_seq(stat.expression);
- }
- }
- if (compressor.option("conditionals") && stat instanceof AST_If) {
- var decls = [];
- var body = to_simple_statement(stat.body, decls);
- var alt = to_simple_statement(stat.alternative, decls);
- if (body !== false && alt !== false && decls.length > 0) {
- var len = decls.length;
- decls.push(make_node(AST_If, stat, {
- condition: stat.condition,
- body: body || make_node(AST_EmptyStatement, stat.body),
- alternative: alt
- }));
- decls.unshift(n, 1);
- [].splice.apply(statements, decls);
- i += len;
- n += len + 1;
- prev = null;
- CHANGED = true;
- continue;
- }
- }
- statements[n++] = stat;
- prev = stat instanceof AST_SimpleStatement ? stat : null;
- }
- statements.length = n;
- }
-
- function join_assigns(defn, body) {
- var exprs;
- if (body instanceof AST_Assign) {
- exprs = [ body ];
- } else if (body instanceof AST_Sequence) {
- exprs = body.expressions.slice();
- }
- if (!exprs) return;
- if (defn instanceof AST_Definitions) {
- var def = defn.definitions[defn.definitions.length - 1];
- if (trim_assigns(def.name, def.value, exprs)) return exprs;
- }
- for (var i = exprs.length - 1; --i >= 0;) {
- var expr = exprs[i];
- if (!(expr instanceof AST_Assign)) continue;
- if (expr.operator != "=") continue;
- if (!(expr.left instanceof AST_SymbolRef)) continue;
- var tail = exprs.slice(i + 1);
- if (!trim_assigns(expr.left, expr.right, tail)) continue;
- return exprs.slice(0, i + 1).concat(tail);
- }
- }
-
- function trim_assigns(name, value, exprs) {
- if (!(value instanceof AST_Object)) return;
- var trimmed = false;
- do {
- var node = exprs[0];
- if (!(node instanceof AST_Assign)) break;
- if (node.operator != "=") break;
- if (!(node.left instanceof AST_PropAccess)) break;
- var sym = node.left.expression;
- if (!(sym instanceof AST_SymbolRef)) break;
- if (name.name != sym.name) break;
- if (!node.right.is_constant_expression(scope)) break;
- var prop = node.left.property;
- if (prop instanceof AST_Node) {
- prop = prop.evaluate(compressor);
- }
- if (prop instanceof AST_Node) break;
- prop = "" + prop;
- var diff = compressor.has_directive("use strict") ? function(node) {
- return node.key != prop && node.key.name != prop;
- } : function(node) {
- return node.key.name != prop;
- };
- if (!all(value.properties, diff)) break;
- value.properties.push(make_node(AST_ObjectKeyVal, node, {
- key: prop,
- value: node.right
- }));
- exprs.shift();
- trimmed = true;
- } while (exprs.length);
- return trimmed;
- }
-
- function join_consecutive_vars(statements) {
- var defs;
- for (var i = 0, j = -1; i < statements.length; i++) {
- var stat = statements[i];
- var prev = statements[j];
- if (stat instanceof AST_Definitions) {
- if (prev && prev.TYPE == stat.TYPE) {
- prev.definitions = prev.definitions.concat(stat.definitions);
- CHANGED = true;
- } else if (defs && defs.TYPE == stat.TYPE && declarations_only(stat)) {
- defs.definitions = defs.definitions.concat(stat.definitions);
- CHANGED = true;
- } else {
- statements[++j] = stat;
- defs = stat;
- }
- } else if (stat instanceof AST_Exit) {
- stat.value = join_assigns_expr(stat.value);
- } else if (stat instanceof AST_For) {
- var exprs = join_assigns(prev, stat.init);
- if (exprs) {
- CHANGED = true;
- stat.init = exprs.length ? make_sequence(stat.init, exprs) : null;
- statements[++j] = stat;
- } else if (prev instanceof AST_Var && (!stat.init || stat.init.TYPE == prev.TYPE)) {
- if (stat.init) {
- prev.definitions = prev.definitions.concat(stat.init.definitions);
- }
- stat.init = prev;
- statements[j] = stat;
- CHANGED = true;
- } else if (defs && stat.init && defs.TYPE == stat.init.TYPE && declarations_only(stat.init)) {
- defs.definitions = defs.definitions.concat(stat.init.definitions);
- stat.init = null;
- statements[++j] = stat;
- CHANGED = true;
- } else {
- statements[++j] = stat;
- }
- } else if (stat instanceof AST_ForIn) {
- stat.object = join_assigns_expr(stat.object);
- } else if (stat instanceof AST_If) {
- stat.condition = join_assigns_expr(stat.condition);
- } else if (stat instanceof AST_SimpleStatement) {
- var exprs = join_assigns(prev, stat.body);
- if (exprs) {
- CHANGED = true;
- if (!exprs.length) continue;
- stat.body = make_sequence(stat.body, exprs);
- }
- statements[++j] = stat;
- } else if (stat instanceof AST_Switch) {
- stat.expression = join_assigns_expr(stat.expression);
- } else if (stat instanceof AST_With) {
- stat.expression = join_assigns_expr(stat.expression);
- } else {
- statements[++j] = stat;
- }
- }
- statements.length = j + 1;
-
- function join_assigns_expr(value) {
- statements[++j] = stat;
- var exprs = join_assigns(prev, value);
- if (!exprs) return value;
- CHANGED = true;
- var tail = value.tail_node();
- if (exprs[exprs.length - 1] !== tail) exprs.push(tail.left);
- return make_sequence(value, exprs);
- }
- }
- }
-
- function extract_declarations_from_unreachable_code(stat, target) {
- if (!(stat instanceof AST_Defun)) {
- AST_Node.warn("Dropping unreachable code [{file}:{line},{col}]", stat.start);
- }
- stat.walk(new TreeWalker(function(node) {
- if (node instanceof AST_Definitions) {
- AST_Node.warn("Declarations in unreachable code! [{file}:{line},{col}]", node.start);
- node.remove_initializers();
- target.push(node);
- return true;
- }
- if (node instanceof AST_Defun) {
- target.push(node);
- return true;
- }
- if (node instanceof AST_Scope) {
- return true;
- }
- }));
- }
-
- function is_undefined(node, compressor) {
- return node.is_undefined
- || node instanceof AST_Undefined
- || node instanceof AST_UnaryPrefix
- && node.operator == "void"
- && !node.expression.has_side_effects(compressor);
- }
-
- // is_truthy()
- // return true if `!!node === true`
- (function(def) {
- def(AST_Node, return_false);
- def(AST_Array, return_true);
- def(AST_Assign, function() {
- return this.operator == "=" && this.right.is_truthy();
- });
- def(AST_Lambda, return_true);
- def(AST_Object, return_true);
- def(AST_RegExp, return_true);
- def(AST_Sequence, function() {
- return this.tail_node().is_truthy();
- });
- def(AST_SymbolRef, function() {
- var fixed = this.fixed_value();
- if (!fixed) return false;
- this.is_truthy = return_false;
- var result = fixed.is_truthy();
- delete this.is_truthy;
- return result;
- });
- })(function(node, func) {
- node.DEFMETHOD("is_truthy", func);
- });
-
- // is_negative_zero()
- // return true if the node may represent -0
- (function(def) {
- def(AST_Node, return_true);
- def(AST_Array, return_false);
- function binary(op, left, right) {
- switch (op) {
- case "-":
- return left.is_negative_zero()
- && (!(right instanceof AST_Constant) || right.value == 0);
- case "&&":
- case "||":
- return left.is_negative_zero() || right.is_negative_zero();
- case "*":
- case "/":
- return true;
- case "%":
- return left.is_negative_zero();
- default:
- return false;
- }
- }
- def(AST_Assign, function() {
- var op = this.operator;
- if (op == "=") return this.right.is_negative_zero();
- return binary(op.slice(0, -1), this.left, this.right);
- });
- def(AST_Binary, function() {
- return binary(this.operator, this.left, this.right);
- });
- def(AST_Constant, function() {
- return this.value == 0 && 1 / this.value < 0;
- });
- def(AST_Lambda, return_false);
- def(AST_Object, return_false);
- def(AST_RegExp, return_false);
- def(AST_Sequence, function() {
- return this.tail_node().is_negative_zero();
- });
- def(AST_SymbolRef, function() {
- var fixed = this.fixed_value();
- if (!fixed) return true;
- this.is_negative_zero = return_true;
- var result = fixed.is_negative_zero();
- delete this.is_negative_zero;
- return result;
- });
- def(AST_UnaryPrefix, function() {
- return this.operator == "+" && this.expression.is_negative_zero()
- || this.operator == "-";
- });
- })(function(node, func) {
- node.DEFMETHOD("is_negative_zero", func);
- });
-
- // may_throw_on_access()
- // returns true if this node may be null, undefined or contain `AST_Accessor`
- (function(def) {
- AST_Node.DEFMETHOD("may_throw_on_access", function(compressor) {
- return !compressor.option("pure_getters") || this._dot_throw(compressor);
- });
- function is_strict(compressor) {
- return /strict/.test(compressor.option("pure_getters"));
- }
- def(AST_Node, is_strict);
- def(AST_Array, return_false);
- def(AST_Assign, function(compressor) {
- if (this.operator != "=") return false;
- var rhs = this.right;
- if (!rhs._dot_throw(compressor)) return false;
- var sym = this.left;
- if (!(sym instanceof AST_SymbolRef)) return true;
- if (rhs instanceof AST_Binary && rhs.operator == "||" && sym.name == rhs.left.name) {
- return rhs.right._dot_throw(compressor);
- }
- return true;
- });
- def(AST_Binary, function(compressor) {
- switch (this.operator) {
- case "&&":
- return this.left._dot_throw(compressor) || this.right._dot_throw(compressor);
- case "||":
- return this.right._dot_throw(compressor);
- default:
- return false;
- }
- });
- def(AST_Conditional, function(compressor) {
- return this.consequent._dot_throw(compressor) || this.alternative._dot_throw(compressor);
- });
- def(AST_Constant, return_false);
- def(AST_Dot, function(compressor) {
- if (!is_strict(compressor)) return false;
- var exp = this.expression;
- if (exp instanceof AST_SymbolRef) exp = exp.fixed_value();
- return !(exp instanceof AST_Lambda && this.property == "prototype");
- });
- def(AST_Lambda, return_false);
- def(AST_Null, return_true);
- def(AST_Object, function(compressor) {
- if (!is_strict(compressor)) return false;
- for (var i = this.properties.length; --i >=0;)
- if (this.properties[i].value instanceof AST_Accessor) return true;
- return false;
- });
- def(AST_Sequence, function(compressor) {
- return this.tail_node()._dot_throw(compressor);
- });
- def(AST_SymbolRef, function(compressor) {
- if (this.is_undefined) return true;
- if (!is_strict(compressor)) return false;
- if (is_undeclared_ref(this) && this.is_declared(compressor)) return false;
- if (this.is_immutable()) return false;
- if (is_arguments(this.definition())) return false;
- var fixed = this.fixed_value();
- if (!fixed) return true;
- this._dot_throw = return_true;
- var result = fixed._dot_throw(compressor);
- delete this._dot_throw;
- return result;
- });
- def(AST_UnaryPrefix, function() {
- return this.operator == "void";
- });
- def(AST_UnaryPostfix, return_false);
- def(AST_Undefined, return_true);
- })(function(node, func) {
- node.DEFMETHOD("_dot_throw", func);
- });
-
- (function(def) {
- def(AST_Node, return_false);
- def(AST_Array, return_true);
- def(AST_Assign, function(compressor) {
- return this.operator != "=" || this.right.is_defined(compressor);
- });
- def(AST_Binary, function(compressor) {
- switch (this.operator) {
- case "&&":
- return this.left.is_defined(compressor) && this.right.is_defined(compressor);
- case "||":
- return this.left.is_truthy() || this.right.is_defined(compressor);
- default:
- return true;
- }
- });
- def(AST_Conditional, function(compressor) {
- return this.consequent.is_defined(compressor) && this.alternative.is_defined(compressor);
- });
- def(AST_Constant, return_true);
- def(AST_Lambda, return_true);
- def(AST_Object, return_true);
- def(AST_Sequence, function(compressor) {
- return this.tail_node().is_defined(compressor);
- });
- def(AST_SymbolRef, function(compressor) {
- if (this.is_undefined) return false;
- if (is_undeclared_ref(this) && this.is_declared(compressor)) return true;
- if (this.is_immutable()) return true;
- var fixed = this.fixed_value();
- if (!fixed) return false;
- this.is_defined = return_false;
- var result = fixed.is_defined(compressor);
- delete this.is_defined;
- return result;
- });
- def(AST_UnaryPrefix, function() {
- return this.operator != "void";
- });
- def(AST_UnaryPostfix, return_true);
- def(AST_Undefined, return_false);
- })(function(node, func) {
- node.DEFMETHOD("is_defined", func);
- });
-
- /* -----[ boolean/negation helpers ]----- */
-
- // methods to determine whether an expression has a boolean result type
- (function(def) {
- def(AST_Node, return_false);
- def(AST_Assign, function(compressor) {
- return this.operator == "=" && this.right.is_boolean(compressor);
- });
- var binary = makePredicate("in instanceof == != === !== < <= >= >");
- def(AST_Binary, function(compressor) {
- return binary[this.operator] || lazy_op[this.operator]
- && this.left.is_boolean(compressor)
- && this.right.is_boolean(compressor);
- });
- def(AST_Boolean, return_true);
- var fn = makePredicate("every hasOwnProperty isPrototypeOf propertyIsEnumerable some");
- def(AST_Call, function(compressor) {
- if (!compressor.option("unsafe")) return false;
- var exp = this.expression;
- return exp instanceof AST_Dot && (fn[exp.property]
- || exp.property == "test" && exp.expression instanceof AST_RegExp);
- });
- def(AST_Conditional, function(compressor) {
- return this.consequent.is_boolean(compressor) && this.alternative.is_boolean(compressor);
- });
- def(AST_New, return_false);
- def(AST_Sequence, function(compressor) {
- return this.tail_node().is_boolean(compressor);
- });
- def(AST_SymbolRef, function(compressor) {
- var fixed = this.fixed_value();
- if (!fixed) return false;
- this.is_boolean = return_false;
- var result = fixed.is_boolean(compressor);
- delete this.is_boolean;
- return result;
- });
- var unary = makePredicate("! delete");
- def(AST_UnaryPrefix, function() {
- return unary[this.operator];
- });
- })(function(node, func) {
- node.DEFMETHOD("is_boolean", func);
- });
-
- // methods to determine if an expression has a numeric result type
- (function(def) {
- def(AST_Node, return_false);
- var binary = makePredicate("- * / % & | ^ << >> >>>");
- def(AST_Assign, function(compressor) {
- return binary[this.operator.slice(0, -1)]
- || this.operator == "=" && this.right.is_number(compressor);
- });
- def(AST_Binary, function(compressor) {
- if (binary[this.operator]) return true;
- if (this.operator != "+") return false;
- return (this.left.is_boolean(compressor) || this.left.is_number(compressor))
- && (this.right.is_boolean(compressor) || this.right.is_number(compressor));
- });
- var fn = makePredicate([
- "charCodeAt",
- "getDate",
- "getDay",
- "getFullYear",
- "getHours",
- "getMilliseconds",
- "getMinutes",
- "getMonth",
- "getSeconds",
- "getTime",
- "getTimezoneOffset",
- "getUTCDate",
- "getUTCDay",
- "getUTCFullYear",
- "getUTCHours",
- "getUTCMilliseconds",
- "getUTCMinutes",
- "getUTCMonth",
- "getUTCSeconds",
- "getYear",
- "indexOf",
- "lastIndexOf",
- "localeCompare",
- "push",
- "search",
- "setDate",
- "setFullYear",
- "setHours",
- "setMilliseconds",
- "setMinutes",
- "setMonth",
- "setSeconds",
- "setTime",
- "setUTCDate",
- "setUTCFullYear",
- "setUTCHours",
- "setUTCMilliseconds",
- "setUTCMinutes",
- "setUTCMonth",
- "setUTCSeconds",
- "setYear",
- "toExponential",
- "toFixed",
- "toPrecision",
- ]);
- def(AST_Call, function(compressor) {
- if (!compressor.option("unsafe")) return false;
- var exp = this.expression;
- return exp instanceof AST_Dot && (fn[exp.property]
- || is_undeclared_ref(exp.expression) && exp.expression.name == "Math");
- });
- def(AST_Conditional, function(compressor) {
- return this.consequent.is_number(compressor) && this.alternative.is_number(compressor);
- });
- def(AST_New, return_false);
- def(AST_Number, return_true);
- def(AST_Sequence, function(compressor) {
- return this.tail_node().is_number(compressor);
- });
- def(AST_SymbolRef, function(compressor) {
- var fixed = this.fixed_value();
- if (!fixed) return false;
- this.is_number = return_false;
- var result = fixed.is_number(compressor);
- delete this.is_number;
- return result;
- });
- var unary = makePredicate("+ - ~ ++ --");
- def(AST_Unary, function() {
- return unary[this.operator];
- });
- })(function(node, func) {
- node.DEFMETHOD("is_number", func);
- });
-
- // methods to determine if an expression has a string result type
- (function(def) {
- def(AST_Node, return_false);
- def(AST_Assign, function(compressor) {
- return (this.operator == "=" || this.operator == "+=") && this.right.is_string(compressor);
- });
- def(AST_Binary, function(compressor) {
- return this.operator == "+" &&
- (this.left.is_string(compressor) || this.right.is_string(compressor));
- });
- var fn = makePredicate([
- "charAt",
- "substr",
- "substring",
- "toLowerCase",
- "toString",
- "toUpperCase",
- "trim",
- ]);
- def(AST_Call, function(compressor) {
- if (!compressor.option("unsafe")) return false;
- var exp = this.expression;
- return exp instanceof AST_Dot && fn[exp.property];
- });
- def(AST_Conditional, function(compressor) {
- return this.consequent.is_string(compressor) && this.alternative.is_string(compressor);
- });
- def(AST_Sequence, function(compressor) {
- return this.tail_node().is_string(compressor);
- });
- def(AST_String, return_true);
- def(AST_SymbolRef, function(compressor) {
- var fixed = this.fixed_value();
- if (!fixed) return false;
- this.is_string = return_false;
- var result = fixed.is_string(compressor);
- delete this.is_string;
- return result;
- });
- def(AST_UnaryPrefix, function() {
- return this.operator == "typeof";
- });
- })(function(node, func) {
- node.DEFMETHOD("is_string", func);
- });
-
- var lazy_op = makePredicate("&& ||");
- var unary_arithmetic = makePredicate("++ --");
- var unary_side_effects = makePredicate("delete ++ --");
-
- function is_lhs(node, parent) {
- if (parent instanceof AST_Unary && unary_side_effects[parent.operator]) return parent.expression;
- if (parent instanceof AST_Assign && parent.left === node) return node;
- }
-
- (function(def) {
- function to_node(value, orig) {
- if (value instanceof AST_Node) return make_node(value.CTOR, orig, value);
- if (Array.isArray(value)) return make_node(AST_Array, orig, {
- elements: value.map(function(value) {
- return to_node(value, orig);
- })
- });
- if (value && typeof value == "object") {
- var props = [];
- for (var key in value) if (HOP(value, key)) {
- props.push(make_node(AST_ObjectKeyVal, orig, {
- key: key,
- value: to_node(value[key], orig)
- }));
- }
- return make_node(AST_Object, orig, {
- properties: props
- });
- }
- return make_node_from_constant(value, orig);
- }
-
- function warn(node) {
- AST_Node.warn("global_defs " + node.print_to_string() + " redefined [{file}:{line},{col}]", node.start);
- }
-
- AST_Toplevel.DEFMETHOD("resolve_defines", function(compressor) {
- if (!compressor.option("global_defs")) return this;
- this.figure_out_scope({ ie8: compressor.option("ie8") });
- return this.transform(new TreeTransformer(function(node) {
- var def = node._find_defs(compressor, "");
- if (!def) return;
- var level = 0, child = node, parent;
- while (parent = this.parent(level++)) {
- if (!(parent instanceof AST_PropAccess)) break;
- if (parent.expression !== child) break;
- child = parent;
- }
- if (is_lhs(child, parent)) {
- warn(node);
- return;
- }
- return def;
- }));
- });
- def(AST_Node, noop);
- def(AST_Dot, function(compressor, suffix) {
- return this.expression._find_defs(compressor, "." + this.property + suffix);
- });
- def(AST_SymbolDeclaration, function(compressor) {
- if (!this.global()) return;
- if (HOP(compressor.option("global_defs"), this.name)) warn(this);
- });
- def(AST_SymbolRef, function(compressor, suffix) {
- if (!this.global()) return;
- var defines = compressor.option("global_defs");
- var name = this.name + suffix;
- if (HOP(defines, name)) return to_node(defines[name], this);
- });
- })(function(node, func) {
- node.DEFMETHOD("_find_defs", func);
- });
-
- function best_of_expression(ast1, ast2, threshold) {
- var delta = ast2.print_to_string().length - ast1.print_to_string().length;
- return delta < (threshold || 0) ? ast2 : ast1;
- }
-
- function best_of_statement(ast1, ast2, threshold) {
- return best_of_expression(make_node(AST_SimpleStatement, ast1, {
- body: ast1
- }), make_node(AST_SimpleStatement, ast2, {
- body: ast2
- }), threshold).body;
- }
-
- function best_of(compressor, ast1, ast2, threshold) {
- return (first_in_statement(compressor) ? best_of_statement : best_of_expression)(ast1, ast2, threshold);
- }
-
- function convert_to_predicate(obj) {
- var map = Object.create(null);
- Object.keys(obj).forEach(function(key) {
- map[key] = makePredicate(obj[key]);
- });
- return map;
- }
-
- AST_Lambda.DEFMETHOD("first_statement", function() {
- var body = this.body;
- for (var i = 0; i < body.length; i++) {
- var stat = body[i];
- if (!(stat instanceof AST_Directive)) return stat;
- }
- });
-
- function try_evaluate(compressor, node) {
- var ev = node.evaluate(compressor);
- if (ev === node) return node;
- ev = make_node_from_constant(ev, node).optimize(compressor);
- return best_of(compressor, node, ev, compressor.eval_threshold);
- }
-
- var object_fns = [
- "constructor",
- "toString",
- "valueOf",
- ];
- var native_fns = convert_to_predicate({
- Array: [
- "indexOf",
- "join",
- "lastIndexOf",
- "slice",
- ].concat(object_fns),
- Boolean: object_fns,
- Function: object_fns,
- Number: [
- "toExponential",
- "toFixed",
- "toPrecision",
- ].concat(object_fns),
- Object: object_fns,
- RegExp: [
- "test",
- ].concat(object_fns),
- String: [
- "charAt",
- "charCodeAt",
- "concat",
- "indexOf",
- "italics",
- "lastIndexOf",
- "match",
- "replace",
- "search",
- "slice",
- "split",
- "substr",
- "substring",
- "toLowerCase",
- "toUpperCase",
- "trim",
- ].concat(object_fns),
- });
- var static_fns = convert_to_predicate({
- Array: [
- "isArray",
- ],
- Math: [
- "abs",
- "acos",
- "asin",
- "atan",
- "ceil",
- "cos",
- "exp",
- "floor",
- "log",
- "round",
- "sin",
- "sqrt",
- "tan",
- "atan2",
- "pow",
- "max",
- "min",
- ],
- Number: [
- "isFinite",
- "isNaN",
- ],
- Object: [
- "create",
- "getOwnPropertyDescriptor",
- "getOwnPropertyNames",
- "getPrototypeOf",
- "isExtensible",
- "isFrozen",
- "isSealed",
- "keys",
- ],
- String: [
- "fromCharCode",
- ],
- });
-
- // methods to evaluate a constant expression
- (function(def) {
- // If the node has been successfully reduced to a constant,
- // then its value is returned; otherwise the element itself
- // is returned.
- // They can be distinguished as constant value is never a
- // descendant of AST_Node.
- AST_Node.DEFMETHOD("evaluate", function(compressor) {
- if (!compressor.option("evaluate")) return this;
- var cached = [];
- var val = this._eval(compressor, cached, 1);
- cached.forEach(function(node) {
- delete node._eval;
- });
- if (!val || val instanceof RegExp) return val;
- if (typeof val == "function" || typeof val == "object") return this;
- return val;
- });
- var unaryPrefix = makePredicate("! ~ - + void");
- AST_Node.DEFMETHOD("is_constant", function() {
- // Accomodate when compress option evaluate=false
- // as well as the common constant expressions !0 and -1
- if (this instanceof AST_Constant) {
- return !(this instanceof AST_RegExp);
- } else {
- return this instanceof AST_UnaryPrefix
- && this.expression instanceof AST_Constant
- && unaryPrefix[this.operator];
- }
- });
- def(AST_Statement, function() {
- throw new Error(string_template("Cannot evaluate a statement [{file}:{line},{col}]", this.start));
- });
- def(AST_Lambda, return_this);
- def(AST_Node, return_this);
- def(AST_Constant, function() {
- return this.value;
- });
- def(AST_Function, function(compressor) {
- if (compressor.option("unsafe")) {
- var fn = function() {};
- fn.node = this;
- fn.toString = function() {
- return "function(){}";
- };
- return fn;
- }
- return this;
- });
- def(AST_Array, function(compressor, cached, depth) {
- if (compressor.option("unsafe")) {
- var elements = [];
- for (var i = 0; i < this.elements.length; i++) {
- var element = this.elements[i];
- var value = element._eval(compressor, cached, depth);
- if (element === value) return this;
- elements.push(value);
- }
- return elements;
- }
- return this;
- });
- def(AST_Object, function(compressor, cached, depth) {
- if (compressor.option("unsafe")) {
- var val = {};
- for (var i = 0; i < this.properties.length; i++) {
- var prop = this.properties[i];
- var key = prop.key;
- if (key instanceof AST_Symbol) {
- key = key.name;
- } else if (key instanceof AST_Node) {
- key = key._eval(compressor, cached, depth);
- if (key === prop.key) return this;
- }
- if (typeof Object.prototype[key] === 'function') {
- return this;
- }
- if (prop.value instanceof AST_Function) continue;
- val[key] = prop.value._eval(compressor, cached, depth);
- if (val[key] === prop.value) return this;
- }
- return val;
- }
- return this;
- });
- var non_converting_unary = makePredicate("! typeof void");
- def(AST_UnaryPrefix, function(compressor, cached, depth) {
- var e = this.expression;
- // Function would be evaluated to an array and so typeof would
- // incorrectly return 'object'. Hence making is a special case.
- if (compressor.option("typeofs")
- && this.operator == "typeof"
- && (e instanceof AST_Lambda
- || e instanceof AST_SymbolRef
- && e.fixed_value() instanceof AST_Lambda)) {
- return typeof function(){};
- }
- if (!non_converting_unary[this.operator]) depth++;
- var v = e._eval(compressor, cached, depth);
- if (v === this.expression) return this;
- switch (this.operator) {
- case "!": return !v;
- case "typeof":
- // typeof returns "object" or "function" on different platforms
- // so cannot evaluate reliably
- if (v instanceof RegExp) return this;
- return typeof v;
- case "void": return void v;
- case "~": return ~v;
- case "-": return -v;
- case "+": return +v;
- case "++":
- case "--":
- if (!(e instanceof AST_SymbolRef)) return this;
- var refs = e.definition().references;
- if (refs[refs.length - 1] !== e) return this;
- return HOP(e, "_eval") ? +(this.operator[0] + 1) + +v : v;
- }
- return this;
- });
- var non_converting_binary = makePredicate("&& || === !==");
- def(AST_Binary, function(compressor, cached, depth) {
- if (!non_converting_binary[this.operator]) depth++;
- var left = this.left._eval(compressor, cached, depth);
- if (left === this.left) return this;
- if (this.operator == (left ? "||" : "&&")) return left;
- var right = this.right._eval(compressor, cached, depth);
- if (right === this.right) return this;
- var result;
- switch (this.operator) {
- case "&&" : result = left && right; break;
- case "||" : result = left || right; break;
- case "|" : result = left | right; break;
- case "&" : result = left & right; break;
- case "^" : result = left ^ right; break;
- case "+" : result = left + right; break;
- case "*" : result = left * right; break;
- case "/" : result = left / right; break;
- case "%" : result = left % right; break;
- case "-" : result = left - right; break;
- case "<<" : result = left << right; break;
- case ">>" : result = left >> right; break;
- case ">>>": result = left >>> right; break;
- case "==" : result = left == right; break;
- case "===": result = left === right; break;
- case "!=" : result = left != right; break;
- case "!==": result = left !== right; break;
- case "<" : result = left < right; break;
- case "<=" : result = left <= right; break;
- case ">" : result = left > right; break;
- case ">=" : result = left >= right; break;
- default : return this;
- }
- if (isNaN(result)) return compressor.find_parent(AST_With) ? this : result;
- if (compressor.option("unsafe_math")
- && result
- && typeof result == "number"
- && (this.operator == "+" || this.operator == "-")) {
- var digits = Math.max(0, decimals(left), decimals(right));
- // 53-bit significand => 15.95 decimal places
- if (digits < 16) return +result.toFixed(digits);
- }
- return result;
-
- function decimals(operand) {
- var match = /(\.[0-9]*)?(e.+)?$/.exec(+operand);
- return (match[1] || ".").length - 1 - (match[2] || "").slice(1);
- }
- });
- def(AST_Conditional, function(compressor, cached, depth) {
- var condition = this.condition._eval(compressor, cached, depth);
- if (condition === this.condition) return this;
- var node = condition ? this.consequent : this.alternative;
- var value = node._eval(compressor, cached, depth);
- return value === node ? this : value;
- });
- def(AST_SymbolRef, function(compressor, cached, depth) {
- var fixed = this.fixed_value();
- if (!fixed) return this;
- var value;
- if (member(fixed, cached)) {
- value = fixed._eval();
- } else {
- this._eval = return_this;
- value = fixed._eval(compressor, cached, depth);
- delete this._eval;
- if (value === fixed) return this;
- fixed._eval = function() {
- return value;
- };
- cached.push(fixed);
- }
- if (value && typeof value == "object") {
- var escaped = this.definition().escaped;
- switch (escaped.length) {
- case 0:
- break;
- case 1:
- if (contains_ref(escaped[0], this)) break;
- default:
- if (depth > escaped.depth) return this;
- }
- }
- return value;
-
- function contains_ref(expr, ref) {
- var found = false;
- expr.walk(new TreeWalker(function(node) {
- if (found) return true;
- if (node === ref) return found = true;
- }));
- return found;
- }
- });
- var global_objs = {
- Array: Array,
- Math: Math,
- Number: Number,
- Object: Object,
- String: String,
- };
- var static_values = convert_to_predicate({
- Math: [
- "E",
- "LN10",
- "LN2",
- "LOG2E",
- "LOG10E",
- "PI",
- "SQRT1_2",
- "SQRT2",
- ],
- Number: [
- "MAX_VALUE",
- "MIN_VALUE",
- "NaN",
- "NEGATIVE_INFINITY",
- "POSITIVE_INFINITY",
- ],
- });
- var regexp_props = makePredicate("global ignoreCase multiline source");
- def(AST_PropAccess, function(compressor, cached, depth) {
- if (compressor.option("unsafe")) {
- var key = this.property;
- if (key instanceof AST_Node) {
- key = key._eval(compressor, cached, depth);
- if (key === this.property) return this;
- }
- var exp = this.expression;
- var val;
- if (is_undeclared_ref(exp)) {
- var static_value = static_values[exp.name];
- if (!static_value || !static_value[key]) return this;
- val = global_objs[exp.name];
- } else {
- val = exp._eval(compressor, cached, depth + 1);
- if (val == null || val === exp) return this;
- if (val instanceof RegExp) {
- if (!regexp_props[key]) return this;
- } else if (typeof val == "object") {
- if (!HOP(val, key)) return this;
- } else if (typeof val == "function") switch (key) {
- case "name":
- return val.node.name ? val.node.name.name : "";
- case "length":
- return val.node.argnames.length;
- default:
- return this;
- }
- }
- return val[key];
- }
- return this;
- });
- def(AST_Call, function(compressor, cached, depth) {
- var exp = this.expression;
- var fn = exp instanceof AST_SymbolRef ? exp.fixed_value() : exp;
- if (fn instanceof AST_Lambda) {
- if (fn.evaluating) return this;
- if (fn.name && fn.name.definition().recursive_refs > 0) return this;
- var stat = fn.first_statement();
- if (!(stat instanceof AST_Return)) return this;
- var args = eval_args(this.args);
- if (!args) return this;
- if (!stat.value) return undefined;
- fn.argnames.forEach(function(sym, i) {
- var value = args[i];
- sym.definition().references.forEach(function(node) {
- node._eval = function() {
- return value;
- };
- cached.push(node);
- });
- });
- fn.evaluating = true;
- var val = stat.value._eval(compressor, cached, depth);
- delete fn.evaluating;
- if (val === stat.value) return this;
- return val;
- } else if (compressor.option("unsafe") && exp instanceof AST_PropAccess) {
- var key = exp.property;
- if (key instanceof AST_Node) {
- key = key._eval(compressor, cached, depth);
- if (key === exp.property) return this;
- }
- var val;
- var e = exp.expression;
- if (is_undeclared_ref(e)) {
- var static_fn = static_fns[e.name];
- if (!static_fn || !static_fn[key]) return this;
- val = global_objs[e.name];
- } else {
- val = e._eval(compressor, cached, depth + 1);
- if (val == null || val === e) return this;
- var native_fn = native_fns[val.constructor.name];
- if (!native_fn || !native_fn[key]) return this;
- }
- var args = eval_args(this.args);
- if (!args) return this;
- if (key == "replace" && typeof args[1] == "function") return this;
- try {
- return val[key].apply(val, args);
- } catch (ex) {
- AST_Node.warn("Error evaluating {code} [{file}:{line},{col}]", {
- code: this.print_to_string(),
- file: this.start.file,
- line: this.start.line,
- col: this.start.col
- });
- }
- }
- return this;
-
- function eval_args(args) {
- var values = [];
- for (var i = 0; i < args.length; i++) {
- var arg = args[i];
- var value = arg._eval(compressor, cached, depth);
- if (arg === value) return;
- values.push(value);
- }
- return values;
- }
- });
- def(AST_New, return_this);
- })(function(node, func) {
- node.DEFMETHOD("_eval", func);
- });
-
- // method to negate an expression
- (function(def) {
- function basic_negation(exp) {
- return make_node(AST_UnaryPrefix, exp, {
- operator: "!",
- expression: exp
- });
- }
- function best(orig, alt, first_in_statement) {
- var negated = basic_negation(orig);
- if (first_in_statement) {
- var stat = make_node(AST_SimpleStatement, alt, {
- body: alt
- });
- return best_of_expression(negated, stat) === stat ? alt : negated;
- }
- return best_of_expression(negated, alt);
- }
- def(AST_Node, function() {
- return basic_negation(this);
- });
- def(AST_Statement, function() {
- throw new Error("Cannot negate a statement");
- });
- def(AST_Function, function() {
- return basic_negation(this);
- });
- def(AST_UnaryPrefix, function() {
- if (this.operator == "!")
- return this.expression;
- return basic_negation(this);
- });
- def(AST_Sequence, function(compressor) {
- var expressions = this.expressions.slice();
- expressions.push(expressions.pop().negate(compressor));
- return make_sequence(this, expressions);
- });
- def(AST_Conditional, function(compressor, first_in_statement) {
- var self = this.clone();
- self.consequent = self.consequent.negate(compressor);
- self.alternative = self.alternative.negate(compressor);
- return best(this, self, first_in_statement);
- });
- def(AST_Binary, function(compressor, first_in_statement) {
- var self = this.clone(), op = this.operator;
- if (compressor.option("unsafe_comps")) {
- switch (op) {
- case "<=" : self.operator = ">" ; return self;
- case "<" : self.operator = ">=" ; return self;
- case ">=" : self.operator = "<" ; return self;
- case ">" : self.operator = "<=" ; return self;
- }
- }
- switch (op) {
- case "==" : self.operator = "!="; return self;
- case "!=" : self.operator = "=="; return self;
- case "===": self.operator = "!=="; return self;
- case "!==": self.operator = "==="; return self;
- case "&&":
- self.operator = "||";
- self.left = self.left.negate(compressor, first_in_statement);
- self.right = self.right.negate(compressor);
- return best(this, self, first_in_statement);
- case "||":
- self.operator = "&&";
- self.left = self.left.negate(compressor, first_in_statement);
- self.right = self.right.negate(compressor);
- return best(this, self, first_in_statement);
- }
- return basic_negation(this);
- });
- })(function(node, func) {
- node.DEFMETHOD("negate", function(compressor, first_in_statement) {
- return func.call(this, compressor, first_in_statement);
- });
- });
-
- var global_pure_fns = makePredicate("Boolean decodeURI decodeURIComponent Date encodeURI encodeURIComponent Error escape EvalError isFinite isNaN Number Object parseFloat parseInt RangeError ReferenceError String SyntaxError TypeError unescape URIError");
- AST_Call.DEFMETHOD("is_expr_pure", function(compressor) {
- if (compressor.option("unsafe")) {
- var expr = this.expression;
- if (is_undeclared_ref(expr) && global_pure_fns[expr.name]) return true;
- if (expr instanceof AST_Dot && is_undeclared_ref(expr.expression)) {
- var static_fn = static_fns[expr.expression.name];
- return static_fn && static_fn[expr.property];
- }
- }
- return this.pure || !compressor.pure_funcs(this);
- });
- AST_Node.DEFMETHOD("is_call_pure", return_false);
- AST_Call.DEFMETHOD("is_call_pure", function(compressor) {
- if (!compressor.option("unsafe")) return false;
- var dot = this.expression;
- if (!(dot instanceof AST_Dot)) return false;
- var exp = dot.expression;
- var map;
- var prop = dot.property;
- if (exp instanceof AST_Array) {
- map = native_fns.Array;
- } else if (exp.is_boolean(compressor)) {
- map = native_fns.Boolean;
- } else if (exp.is_number(compressor)) {
- map = native_fns.Number;
- } else if (exp instanceof AST_RegExp) {
- map = native_fns.RegExp;
- } else if (exp.is_string(compressor)) {
- map = native_fns.String;
- if (prop == "replace") {
- var arg = this.args[1];
- if (arg && !arg.is_string(compressor)) return false;
- }
- } else if (!dot.may_throw_on_access(compressor)) {
- map = native_fns.Object;
- }
- return map && map[prop];
- });
-
- // determine if expression has side effects
- (function(def) {
- function any(list, compressor) {
- for (var i = list.length; --i >= 0;)
- if (list[i].has_side_effects(compressor))
- return true;
- return false;
- }
- def(AST_Node, return_true);
- def(AST_Array, function(compressor) {
- return any(this.elements, compressor);
- });
- def(AST_Assign, return_true);
- def(AST_Binary, function(compressor) {
- return this.left.has_side_effects(compressor)
- || this.right.has_side_effects(compressor);
- });
- def(AST_Block, function(compressor) {
- return any(this.body, compressor);
- });
- def(AST_Call, function(compressor) {
- if (!this.is_expr_pure(compressor)
- && (!this.is_call_pure(compressor) || this.expression.has_side_effects(compressor))) {
- return true;
- }
- return any(this.args, compressor);
- });
- def(AST_Case, function(compressor) {
- return this.expression.has_side_effects(compressor)
- || any(this.body, compressor);
- });
- def(AST_Conditional, function(compressor) {
- return this.condition.has_side_effects(compressor)
- || this.consequent.has_side_effects(compressor)
- || this.alternative.has_side_effects(compressor);
- });
- def(AST_Constant, return_false);
- def(AST_Definitions, function(compressor) {
- return any(this.definitions, compressor);
- });
- def(AST_Dot, function(compressor) {
- return this.expression.may_throw_on_access(compressor)
- || this.expression.has_side_effects(compressor);
- });
- def(AST_EmptyStatement, return_false);
- def(AST_If, function(compressor) {
- return this.condition.has_side_effects(compressor)
- || this.body && this.body.has_side_effects(compressor)
- || this.alternative && this.alternative.has_side_effects(compressor);
- });
- def(AST_LabeledStatement, function(compressor) {
- return this.body.has_side_effects(compressor);
- });
- def(AST_Lambda, return_false);
- def(AST_Object, function(compressor) {
- return any(this.properties, compressor);
- });
- def(AST_ObjectProperty, function(compressor) {
- return this.value.has_side_effects(compressor);
- });
- def(AST_Sub, function(compressor) {
- return this.expression.may_throw_on_access(compressor)
- || this.expression.has_side_effects(compressor)
- || this.property.has_side_effects(compressor);
- });
- def(AST_Sequence, function(compressor) {
- return any(this.expressions, compressor);
- });
- def(AST_SimpleStatement, function(compressor) {
- return this.body.has_side_effects(compressor);
- });
- def(AST_Switch, function(compressor) {
- return this.expression.has_side_effects(compressor)
- || any(this.body, compressor);
- });
- def(AST_SymbolDeclaration, return_false);
- def(AST_SymbolRef, function(compressor) {
- return !this.is_declared(compressor);
- });
- def(AST_This, return_false);
- def(AST_Try, function(compressor) {
- return any(this.body, compressor)
- || this.bcatch && this.bcatch.has_side_effects(compressor)
- || this.bfinally && this.bfinally.has_side_effects(compressor);
- });
- def(AST_Unary, function(compressor) {
- return unary_side_effects[this.operator]
- || this.expression.has_side_effects(compressor);
- });
- def(AST_VarDef, function(compressor) {
- return this.value;
- });
- })(function(node, func) {
- node.DEFMETHOD("has_side_effects", func);
- });
-
- // determine if expression may throw
- (function(def) {
- def(AST_Node, return_true);
-
- def(AST_Constant, return_false);
- def(AST_EmptyStatement, return_false);
- def(AST_Lambda, return_false);
- def(AST_SymbolDeclaration, return_false);
- def(AST_This, return_false);
-
- function any(list, compressor) {
- for (var i = list.length; --i >= 0;)
- if (list[i].may_throw(compressor))
- return true;
- return false;
- }
-
- def(AST_Array, function(compressor) {
- return any(this.elements, compressor);
- });
- def(AST_Assign, function(compressor) {
- if (this.right.may_throw(compressor)) return true;
- if (!compressor.has_directive("use strict")
- && this.operator == "="
- && this.left instanceof AST_SymbolRef) {
- return false;
- }
- return this.left.may_throw(compressor);
- });
- def(AST_Binary, function(compressor) {
- return this.left.may_throw(compressor)
- || this.right.may_throw(compressor);
- });
- def(AST_Block, function(compressor) {
- return any(this.body, compressor);
- });
- def(AST_Call, function(compressor) {
- if (any(this.args, compressor)) return true;
- if (this.is_expr_pure(compressor)) return false;
- if (this.expression.may_throw(compressor)) return true;
- return !(this.expression instanceof AST_Lambda)
- || any(this.expression.body, compressor);
- });
- def(AST_Case, function(compressor) {
- return this.expression.may_throw(compressor)
- || any(this.body, compressor);
- });
- def(AST_Conditional, function(compressor) {
- return this.condition.may_throw(compressor)
- || this.consequent.may_throw(compressor)
- || this.alternative.may_throw(compressor);
- });
- def(AST_Definitions, function(compressor) {
- return any(this.definitions, compressor);
- });
- def(AST_Dot, function(compressor) {
- return this.expression.may_throw_on_access(compressor)
- || this.expression.may_throw(compressor);
- });
- def(AST_If, function(compressor) {
- return this.condition.may_throw(compressor)
- || this.body && this.body.may_throw(compressor)
- || this.alternative && this.alternative.may_throw(compressor);
- });
- def(AST_LabeledStatement, function(compressor) {
- return this.body.may_throw(compressor);
- });
- def(AST_Object, function(compressor) {
- return any(this.properties, compressor);
- });
- def(AST_ObjectProperty, function(compressor) {
- return this.value.may_throw(compressor);
- });
- def(AST_Return, function(compressor) {
- return this.value && this.value.may_throw(compressor);
- });
- def(AST_Sequence, function(compressor) {
- return any(this.expressions, compressor);
- });
- def(AST_SimpleStatement, function(compressor) {
- return this.body.may_throw(compressor);
- });
- def(AST_Sub, function(compressor) {
- return this.expression.may_throw_on_access(compressor)
- || this.expression.may_throw(compressor)
- || this.property.may_throw(compressor);
- });
- def(AST_Switch, function(compressor) {
- return this.expression.may_throw(compressor)
- || any(this.body, compressor);
- });
- def(AST_SymbolRef, function(compressor) {
- return !this.is_declared(compressor);
- });
- def(AST_Try, function(compressor) {
- return (this.bcatch ? this.bcatch.may_throw(compressor) : any(this.body, compressor))
- || this.bfinally && this.bfinally.may_throw(compressor);
- });
- def(AST_Unary, function(compressor) {
- if (this.operator == "typeof" && this.expression instanceof AST_SymbolRef)
- return false;
- return this.expression.may_throw(compressor);
- });
- def(AST_VarDef, function(compressor) {
- if (!this.value) return false;
- return this.value.may_throw(compressor);
- });
- })(function(node, func) {
- node.DEFMETHOD("may_throw", func);
- });
-
- // determine if expression is constant
- (function(def) {
- function all(list) {
- for (var i = list.length; --i >= 0;)
- if (!list[i].is_constant_expression())
- return false;
- return true;
- }
- def(AST_Node, return_false);
- def(AST_Array, function() {
- return all(this.elements);
- });
- def(AST_Binary, function() {
- return this.left.is_constant_expression() && this.right.is_constant_expression();
- });
- def(AST_Constant, return_true);
- def(AST_Lambda, function(scope) {
- var self = this;
- var result = true;
- var scopes = [];
- self.walk(new TreeWalker(function(node, descend) {
- if (!result) return true;
- if (node instanceof AST_Catch) {
- scopes.push(node.argname.scope);
- descend();
- scopes.pop();
- return true;
- }
- if (node instanceof AST_Scope) {
- if (node === self) return;
- scopes.push(node);
- descend();
- scopes.pop();
- return true;
- }
- if (node instanceof AST_SymbolRef) {
- if (self.inlined) {
- result = false;
- return true;
- }
- if (self.variables.has(node.name)) return true;
- var def = node.definition();
- if (member(def.scope, scopes)) return true;
- if (scope) {
- var scope_def = scope.find_variable(node);
- if (def.undeclared ? !scope_def : scope_def === def) {
- result = "f";
- return true;
- }
- }
- result = false;
- return true;
- }
- }));
- return result;
- });
- def(AST_Object, function() {
- return all(this.properties);
- });
- def(AST_ObjectProperty, function() {
- return this.value.is_constant_expression();
- });
- def(AST_Unary, function() {
- return this.expression.is_constant_expression();
- });
- })(function(node, func) {
- node.DEFMETHOD("is_constant_expression", func);
- });
-
- // tell me if a statement aborts
- function aborts(thing) {
- return thing && thing.aborts();
- }
- (function(def) {
- def(AST_Statement, return_null);
- def(AST_Jump, return_this);
- function block_aborts() {
- var n = this.body.length;
- return n > 0 && aborts(this.body[n - 1]);
- }
- def(AST_BlockStatement, block_aborts);
- def(AST_SwitchBranch, block_aborts);
- def(AST_If, function() {
- return this.alternative && aborts(this.body) && aborts(this.alternative) && this;
- });
- })(function(node, func) {
- node.DEFMETHOD("aborts", func);
- });
-
- /* -----[ optimizers ]----- */
-
- var directives = makePredicate(["use asm", "use strict"]);
- OPT(AST_Directive, function(self, compressor) {
- if (compressor.option("directives")
- && (!directives[self.value] || compressor.has_directive(self.value) !== self)) {
- return make_node(AST_EmptyStatement, self);
- }
- return self;
- });
-
- OPT(AST_Debugger, function(self, compressor) {
- if (compressor.option("drop_debugger"))
- return make_node(AST_EmptyStatement, self);
- return self;
- });
-
- OPT(AST_LabeledStatement, function(self, compressor) {
- if (self.body instanceof AST_Break
- && compressor.loopcontrol_target(self.body) === self.body) {
- return make_node(AST_EmptyStatement, self);
- }
- return self.label.references.length == 0 ? self.body : self;
- });
-
- OPT(AST_Block, function(self, compressor) {
- self.body = tighten_body(self.body, compressor);
- return self;
- });
-
- OPT(AST_BlockStatement, function(self, compressor) {
- self.body = tighten_body(self.body, compressor);
- switch (self.body.length) {
- case 1: return self.body[0];
- case 0: return make_node(AST_EmptyStatement, self);
- }
- return self;
- });
-
- OPT(AST_Lambda, function(self, compressor) {
- self.body = tighten_body(self.body, compressor);
- if (compressor.option("side_effects")
- && self.body.length == 1
- && self.body[0] === compressor.has_directive("use strict")) {
- self.body.length = 0;
- }
- return self;
- });
-
- AST_Scope.DEFMETHOD("drop_unused", function(compressor) {
- if (!compressor.option("unused")) return;
- if (compressor.has_directive("use asm")) return;
- var self = this;
- if (self.pinned()) return;
- var drop_funcs = !(self instanceof AST_Toplevel) || compressor.toplevel.funcs;
- var drop_vars = !(self instanceof AST_Toplevel) || compressor.toplevel.vars;
- var assign_as_unused = /keep_assign/.test(compressor.option("unused")) ? return_false : function(node, props) {
- var sym;
- if (node instanceof AST_Assign) {
- if (node.write_only || node.operator == "=") sym = node.left;
- } else if (node instanceof AST_Unary) {
- if (node.write_only) sym = node.expression;
- }
- if (!/strict/.test(compressor.option("pure_getters"))) return sym instanceof AST_SymbolRef && sym;
- while (sym instanceof AST_PropAccess && !sym.expression.may_throw_on_access(compressor)) {
- if (sym instanceof AST_Sub) props.unshift(sym.property);
- sym = sym.expression;
- }
- return sym instanceof AST_SymbolRef && all(sym.definition().orig, function(sym) {
- return !(sym instanceof AST_SymbolLambda);
- }) && sym;
- };
- var in_use = [];
- var in_use_ids = Object.create(null); // avoid expensive linear scans of in_use
- var fixed_ids = Object.create(null);
- var value_read = Object.create(null);
- var value_modified = Object.create(null);
- if (self instanceof AST_Toplevel && compressor.top_retain) {
- self.variables.each(function(def) {
- if (compressor.top_retain(def) && !(def.id in in_use_ids)) {
- in_use_ids[def.id] = true;
- in_use.push(def);
- }
- });
- }
- var var_defs_by_id = new Dictionary();
- var initializations = new Dictionary();
- // pass 1: find out which symbols are directly used in
- // this scope (not in nested scopes).
- var scope = this;
- var tw = new TreeWalker(function(node, descend) {
- if (node instanceof AST_Lambda && node.uses_arguments && !tw.has_directive("use strict")) {
- node.argnames.forEach(function(argname) {
- var def = argname.definition();
- if (!(def.id in in_use_ids)) {
- in_use_ids[def.id] = true;
- in_use.push(def);
- }
- });
- }
- if (node === self) return;
- if (node instanceof AST_Defun) {
- var node_def = node.name.definition();
- if (!drop_funcs && scope === self) {
- if (!(node_def.id in in_use_ids)) {
- in_use_ids[node_def.id] = true;
- in_use.push(node_def);
- }
- }
- initializations.add(node_def.id, node);
- return true; // don't go in nested scopes
- }
- if (node instanceof AST_SymbolFunarg && scope === self) {
- var_defs_by_id.add(node.definition().id, node);
- }
- if (node instanceof AST_Definitions && scope === self) {
- node.definitions.forEach(function(def) {
- var node_def = def.name.definition();
- var_defs_by_id.add(node_def.id, def);
- if (!drop_vars) {
- if (!(node_def.id in in_use_ids)) {
- in_use_ids[node_def.id] = true;
- in_use.push(node_def);
- }
- }
- if (def.value) {
- initializations.add(node_def.id, def.value);
- if (def.value.has_side_effects(compressor)) {
- def.value.walk(tw);
- }
- if (!node_def.chained && def.name.fixed_value(true) === def.value) {
- fixed_ids[node_def.id] = def;
- }
- }
- });
- return true;
- }
- return scan_ref_scoped(node, descend, true);
- });
- self.walk(tw);
- // pass 2: for every used symbol we need to walk its
- // initialization code to figure out if it uses other
- // symbols (that may not be in_use).
- tw = new TreeWalker(scan_ref_scoped);
- for (var i = 0; i < in_use.length; i++) {
- var init = initializations.get(in_use[i].id);
- if (init) init.forEach(function(init) {
- init.walk(tw);
- });
- }
- var drop_fn_name = compressor.option("keep_fnames") ? return_false : compressor.option("ie8") ? function(def) {
- return !compressor.exposed(def) && !def.references.length;
- } : function(def) {
- // any declarations with same name will overshadow
- // name of this anonymous function and can therefore
- // never be used anywhere
- return !(def.id in in_use_ids) || def.orig.length > 1;
- };
- // pass 3: we should drop declarations not in_use
- var unused_fn_names = [];
- var tt = new TreeTransformer(function(node, descend, in_list) {
- var parent = tt.parent();
- if (drop_vars) {
- var props = [], sym = assign_as_unused(node, props);
- if (sym) {
- var def = sym.definition();
- var in_use = def.id in in_use_ids;
- var value;
- if (node instanceof AST_Assign) {
- if (!in_use || node.left === sym && def.id in fixed_ids && fixed_ids[def.id] !== node) {
- value = get_rhs(node);
- if (node.write_only === true) {
- value = value.drop_side_effect_free(compressor) || make_node(AST_Number, node, {
- value: 0
- });
- }
- }
- } else if (!in_use) {
- value = make_node(AST_Number, node, {
- value: 0
- });
- }
- if (value) {
- if (parent instanceof AST_Sequence && parent.tail_node() !== node) {
- value = value.drop_side_effect_free(compressor);
- }
- if (value) props.push(value);
- switch (props.length) {
- case 0:
- return MAP.skip;
- case 1:
- return maintain_this_binding(compressor, parent, node, props[0].transform(tt));
- default:
- return make_sequence(node, props.map(function(prop) {
- return prop.transform(tt);
- }));
- }
- }
- }
- }
- if (scope !== self) return;
- if (node instanceof AST_Function && node.name && drop_fn_name(node.name.definition())) {
- unused_fn_names.push(node);
- }
- if (node instanceof AST_Lambda && !(node instanceof AST_Accessor)) {
- var trim = compressor.drop_fargs(node, parent);
- for (var a = node.argnames, i = a.length; --i >= 0;) {
- var sym = a[i];
- if (!(sym.definition().id in in_use_ids)) {
- sym.__unused = true;
- if (trim) {
- log(sym, "Dropping unused function argument {name} [{file}:{line},{col}]", template(sym));
- a.pop();
- }
- } else {
- trim = false;
- }
- }
- }
- if (drop_funcs && node instanceof AST_Defun && node !== self) {
- var def = node.name.definition();
- if (!(def.id in in_use_ids)) {
- log(node.name, "Dropping unused function {name} [{file}:{line},{col}]", template(node.name));
- def.eliminated++;
- return make_node(AST_EmptyStatement, node);
- }
- }
- if (node instanceof AST_Definitions && !(parent instanceof AST_ForIn && parent.init === node)) {
- // place uninitialized names at the start
- var body = [], head = [], tail = [];
- // for unused names whose initialization has
- // side effects, we can cascade the init. code
- // into the next one, or next statement.
- var side_effects = [];
- node.definitions.forEach(function(def) {
- if (def.value) def.value = def.value.transform(tt);
- var sym = def.name.definition();
- if (!drop_vars || sym.id in in_use_ids) {
- if (def.value && sym.id in fixed_ids && fixed_ids[sym.id] !== def) {
- def.value = def.value.drop_side_effect_free(compressor);
- }
- var var_defs = var_defs_by_id.get(sym.id);
- if (var_defs.length > 1 && (!def.value || sym.orig.indexOf(def.name) > sym.eliminated)) {
- AST_Node.warn("Dropping duplicated definition of variable {name} [{file}:{line},{col}]", template(def.name));
- if (def.value) {
- var ref = make_node(AST_SymbolRef, def.name, def.name);
- sym.references.push(ref);
- var assign = make_node(AST_Assign, def, {
- operator: "=",
- left: ref,
- right: def.value
- });
- if (fixed_ids[sym.id] === def) {
- fixed_ids[sym.id] = assign;
- }
- side_effects.push(assign.transform(tt));
- }
- remove(var_defs, def);
- sym.eliminated++;
- return;
- }
- if (!def.value) {
- head.push(def);
- } else if (compressor.option("functions")
- && !compressor.option("ie8")
- && def.value === def.name.fixed_value()
- && def.value instanceof AST_Function
- && !(def.value.name && def.value.name.definition().assignments)
- && can_rename(def.value, def.name.name)
- && (!compressor.has_directive("use strict") || parent instanceof AST_Scope)) {
- AST_Node.warn("Declaring {name} as function [{file}:{line},{col}]", template(def.name));
- var defun = make_node(AST_Defun, def, def.value);
- defun.name = make_node(AST_SymbolDefun, def.name, def.name);
- var name_def = def.name.scope.resolve().def_function(defun.name);
- if (def.value.name) {
- var old_def = def.value.name.definition();
- def.value.walk(new TreeWalker(function(node) {
- if (node instanceof AST_SymbolRef && node.definition() === old_def) {
- node.name = name_def.name;
- node.thedef = name_def;
- node.reference({});
- }
- }));
- }
- body.push(defun);
- } else {
- if (side_effects.length > 0) {
- if (tail.length > 0) {
- side_effects.push(def.value);
- def.value = make_sequence(def.value, side_effects);
- } else {
- body.push(make_node(AST_SimpleStatement, node, {
- body: make_sequence(node, side_effects)
- }));
- }
- side_effects = [];
- }
- tail.push(def);
- }
- } else if (sym.orig[0] instanceof AST_SymbolCatch) {
- var value = def.value && def.value.drop_side_effect_free(compressor);
- if (value) side_effects.push(value);
- def.value = null;
- head.push(def);
- } else {
- var value = def.value && !def.value.single_use && def.value.drop_side_effect_free(compressor);
- if (value) {
- AST_Node.warn("Side effects in initialization of unused variable {name} [{file}:{line},{col}]", template(def.name));
- side_effects.push(value);
- } else {
- log(def.name, "Dropping unused variable {name} [{file}:{line},{col}]", template(def.name));
- }
- sym.eliminated++;
- }
-
- function can_rename(fn, name) {
- var def = fn.variables.get(name);
- return !def || fn.name && def === fn.name.definition();
- }
- });
- if (head.length > 0 || tail.length > 0) {
- node.definitions = head.concat(tail);
- body.push(node);
- }
- if (side_effects.length > 0) {
- body.push(make_node(AST_SimpleStatement, node, {
- body: make_sequence(node, side_effects)
- }));
- }
- switch (body.length) {
- case 0:
- return in_list ? MAP.skip : make_node(AST_EmptyStatement, node);
- case 1:
- return body[0];
- default:
- return in_list ? MAP.splice(body) : make_node(AST_BlockStatement, node, {
- body: body
- });
- }
- }
- if (node instanceof AST_LabeledStatement && node.body instanceof AST_For) {
- // Certain combination of unused name + side effect leads to invalid AST:
- // https://github.com/mishoo/UglifyJS2/issues/1830
- // We fix it at this stage by moving the label inwards, back to the `for`.
- descend(node, this);
- if (node.body instanceof AST_BlockStatement) {
- var block = node.body;
- node.body = block.body.pop();
- block.body.push(node);
- return in_list ? MAP.splice(block.body) : block;
- }
- return node;
- }
- if (node instanceof AST_Scope) {
- var save_scope = scope;
- scope = node;
- descend(node, this);
- scope = save_scope;
- return node;
- }
- }, function(node, in_list) {
- if (node instanceof AST_For) {
- // Certain combination of unused name + side effect leads to invalid AST:
- // https://github.com/mishoo/UglifyJS2/issues/44
- // https://github.com/mishoo/UglifyJS2/issues/1838
- // https://github.com/mishoo/UglifyJS2/issues/3371
- // We fix it at this stage by moving the `var` outside the `for`.
- var block;
- if (node.init instanceof AST_BlockStatement) {
- block = node.init;
- node.init = block.body.pop();
- block.body.push(node);
- }
- if (node.init instanceof AST_Defun) {
- if (!block) {
- block = make_node(AST_BlockStatement, node, {
- body: [ node ]
- });
- }
- block.body.splice(-1, 0, node.init);
- node.init = null;
- } else if (node.init instanceof AST_SimpleStatement) {
- node.init = node.init.body;
- } else if (is_empty(node.init)) {
- node.init = null;
- }
- return !block ? node : in_list ? MAP.splice(block.body) : block;
- } else if (node instanceof AST_ForIn) {
- if (!drop_vars || !compressor.option("loops")) return;
- if (!(node.init instanceof AST_Definitions)) return;
- var sym = node.init.definitions[0].name;
- if (sym.definition().id in in_use_ids) return;
- if (!is_empty(node.body)) return;
- log(sym, "Dropping unused loop variable {name} [{file}:{line},{col}]", template(sym));
- var value = node.object.drop_side_effect_free(compressor);
- if (value) {
- AST_Node.warn("Side effects in object of for-in loop [{file}:{line},{col}]", template(sym));
- return make_node(AST_SimpleStatement, node, {
- body: value
- });
- }
- return in_list ? MAP.skip : make_node(AST_EmptyStatement, node);
- } else if (node instanceof AST_Sequence) {
- if (node.expressions.length == 1) return node.expressions[0];
- }
- });
- tt.push(compressor.parent());
- self.transform(tt);
- unused_fn_names.forEach(function(fn) {
- fn.name = null;
- });
-
- function log(sym, text, props) {
- AST_Node[sym.unreferenced() ? "warn" : "info"](text, props);
- }
-
- function template(sym) {
- return {
- name: sym.name,
- file: sym.start.file,
- line: sym.start.line,
- col : sym.start.col
- };
- }
-
- function verify_safe_usage(def, read, modified) {
- if (def.id in in_use_ids) return;
- if (read && modified) {
- in_use_ids[def.id] = true;
- in_use.push(def);
- } else {
- value_read[def.id] = read;
- value_modified[def.id] = modified;
- }
- }
-
- function get_rhs(assign) {
- var rhs = assign.right;
- if (!assign.write_only) return rhs;
- if (!(rhs instanceof AST_Binary && lazy_op[rhs.operator])) return rhs;
- var sym = assign.left;
- if (!(sym instanceof AST_SymbolRef) || sym.name != rhs.left.name) return rhs;
- return rhs.right.has_side_effects(compressor) ? rhs : rhs.right;
- }
-
- function scan_ref_scoped(node, descend, init) {
- var node_def, props = [], sym = assign_as_unused(node, props);
- if (sym && self.variables.get(sym.name) === (node_def = sym.definition())) {
- props.forEach(function(prop) {
- prop.walk(tw);
- });
- if (node instanceof AST_Assign) {
- if (node.write_only === "p" && node.right.may_throw_on_access(compressor)) return;
- var right = get_rhs(node);
- if (init && node.write_only === true && node_def.scope === self && !right.has_side_effects(compressor)) {
- initializations.add(node_def.id, right);
- } else {
- right.walk(tw);
- }
- if (node.left === sym) {
- if (!node_def.chained && sym.fixed_value(true) === right) {
- fixed_ids[node_def.id] = node;
- }
- if (!node.write_only) {
- verify_safe_usage(node_def, true, value_modified[node_def.id]);
- }
- } else {
- var fixed = sym.fixed_value();
- if (!fixed || !fixed.is_constant()) {
- verify_safe_usage(node_def, value_read[node_def.id], true);
- }
- }
- }
- return true;
- }
- if (node instanceof AST_SymbolRef) {
- node_def = node.definition();
- if (!(node_def.id in in_use_ids)) {
- in_use_ids[node_def.id] = true;
- in_use.push(node_def);
- }
- return true;
- }
- if (node instanceof AST_Scope) {
- var save_scope = scope;
- scope = node;
- descend();
- scope = save_scope;
- return true;
- }
- }
- });
-
- AST_Scope.DEFMETHOD("hoist_declarations", function(compressor) {
- if (compressor.has_directive("use asm")) return;
- var hoist_funs = compressor.option("hoist_funs");
- var hoist_vars = compressor.option("hoist_vars");
- var self = this;
- if (hoist_vars) {
- // let's count var_decl first, we seem to waste a lot of
- // space if we hoist `var` when there's only one.
- var var_decl = 0;
- self.walk(new TreeWalker(function(node) {
- if (var_decl > 1) return true;
- if (node instanceof AST_Scope && node !== self) return true;
- if (node instanceof AST_Var) {
- var_decl++;
- return true;
- }
- }));
- if (var_decl <= 1) hoist_vars = false;
- }
- if (!hoist_funs && !hoist_vars) return;
- var dirs = [];
- var hoisted = [];
- var vars = new Dictionary(), vars_found = 0;
- var tt = new TreeTransformer(function(node) {
- if (node === self) return;
- if (node instanceof AST_Directive) {
- dirs.push(node);
- return make_node(AST_EmptyStatement, node);
- }
- if (hoist_funs && node instanceof AST_Defun
- && (tt.parent() === self || !compressor.has_directive("use strict"))) {
- hoisted.push(node);
- return make_node(AST_EmptyStatement, node);
- }
- if (hoist_vars && node instanceof AST_Var) {
- node.definitions.forEach(function(def) {
- vars.set(def.name.name, def);
- ++vars_found;
- });
- var seq = node.to_assignments(compressor);
- var p = tt.parent();
- if (p instanceof AST_ForIn && p.init === node) {
- if (seq) return seq;
- var def = node.definitions[0].name;
- return make_node(AST_SymbolRef, def, def);
- }
- if (p instanceof AST_For && p.init === node) return seq;
- if (!seq) return make_node(AST_EmptyStatement, node);
- return make_node(AST_SimpleStatement, node, {
- body: seq
- });
- }
- if (node instanceof AST_Scope) return node;
- });
- self.transform(tt);
- if (vars_found > 0) {
- // collect only vars which don't show up in self's arguments list
- var defs = [];
- vars.each(function(def, name) {
- if (self instanceof AST_Lambda
- && !all(self.argnames, function(argname) {
- return argname.name != name;
- })) {
- vars.del(name);
- } else {
- def = def.clone();
- def.value = null;
- defs.push(def);
- vars.set(name, def);
- }
- });
- if (defs.length > 0) {
- // try to merge in assignments
- for (var i = 0; i < self.body.length;) {
- if (self.body[i] instanceof AST_SimpleStatement) {
- var expr = self.body[i].body, sym, assign;
- if (expr instanceof AST_Assign
- && expr.operator == "="
- && (sym = expr.left) instanceof AST_Symbol
- && vars.has(sym.name))
- {
- var def = vars.get(sym.name);
- if (def.value) break;
- def.value = expr.right;
- remove(defs, def);
- defs.push(def);
- self.body.splice(i, 1);
- continue;
- }
- if (expr instanceof AST_Sequence
- && (assign = expr.expressions[0]) instanceof AST_Assign
- && assign.operator == "="
- && (sym = assign.left) instanceof AST_Symbol
- && vars.has(sym.name))
- {
- var def = vars.get(sym.name);
- if (def.value) break;
- def.value = assign.right;
- remove(defs, def);
- defs.push(def);
- self.body[i].body = make_sequence(expr, expr.expressions.slice(1));
- continue;
- }
- }
- if (self.body[i] instanceof AST_EmptyStatement) {
- self.body.splice(i, 1);
- continue;
- }
- if (self.body[i] instanceof AST_BlockStatement) {
- var tmp = [ i, 1 ].concat(self.body[i].body);
- self.body.splice.apply(self.body, tmp);
- continue;
- }
- break;
- }
- defs = make_node(AST_Var, self, {
- definitions: defs
- });
- hoisted.push(defs);
- }
- }
- self.body = dirs.concat(hoisted, self.body);
- });
-
- function scan_local_returns(fn, transform) {
- fn.walk(new TreeWalker(function(node) {
- if (node instanceof AST_Return) {
- transform(node);
- return true;
- }
- if (node instanceof AST_Scope && node !== fn) return true;
- }));
- }
-
- function map_bool_returns(fn) {
- var map = Object.create(null);
- scan_local_returns(fn, function(node) {
- var value = node.value;
- if (value) value = value.tail_node();
- if (value instanceof AST_SymbolRef) {
- var id = value.definition().id;
- map[id] = (map[id] || 0) + 1;
- }
- });
- return map;
- }
-
- function all_bool(def, bool_returns, compressor) {
- return def.bool_fn + (bool_returns[def.id] || 0) === def.references.length
- && !compressor.exposed(def);
- }
-
- function process_boolean_returns(fn, compressor) {
- scan_local_returns(fn, function(node) {
- node.in_bool = true;
- var value = node.value;
- if (value) {
- var ev = value.is_truthy() || value.tail_node().evaluate(compressor);
- if (!ev) {
- value = value.drop_side_effect_free(compressor);
- node.value = value ? make_sequence(node.value, [
- value,
- make_node(AST_Number, node.value, {
- value: 0
- })
- ]) : null;
- } else if (ev && !(ev instanceof AST_Node)) {
- value = value.drop_side_effect_free(compressor);
- node.value = value ? make_sequence(node.value, [
- value,
- make_node(AST_Number, node.value, {
- value: 1
- })
- ]) : make_node(AST_Number, node.value, {
- value: 1
- });
- }
- }
- });
- }
-
- AST_Scope.DEFMETHOD("process_boolean_returns", noop);
- AST_Defun.DEFMETHOD("process_boolean_returns", function(compressor) {
- if (!compressor.option("booleans")) return;
- var bool_returns = map_bool_returns(this);
- if (!all_bool(this.name.definition(), bool_returns, compressor)) return;
- process_boolean_returns(this, compressor);
- });
- AST_Function.DEFMETHOD("process_boolean_returns", function(compressor) {
- if (!compressor.option("booleans")) return;
- var bool_returns = map_bool_returns(this);
- if (this.name && !all_bool(this.name.definition(), bool_returns, compressor)) return;
- var parent = compressor.parent();
- if (parent instanceof AST_Assign) {
- if (parent.operator != "=") return;
- var sym = parent.left;
- if (!(sym instanceof AST_SymbolRef)) return;
- if (!all_bool(sym.definition(), bool_returns, compressor)) return;
- } else if (parent instanceof AST_Call && parent.expression !== this) {
- var exp = parent.expression;
- if (exp instanceof AST_SymbolRef) exp = exp.fixed_value();
- if (!(exp instanceof AST_Lambda)) return;
- if (exp.uses_arguments || exp.pinned()) return;
- var sym = exp.argnames[parent.args.indexOf(this)];
- if (sym && !all_bool(sym.definition(), bool_returns, compressor)) return;
- } else if (parent.TYPE == "Call") {
- compressor.pop();
- var in_bool = compressor.in_boolean_context();
- compressor.push(this);
- if (!in_bool) return;
- } else return;
- process_boolean_returns(this, compressor);
- });
-
- AST_Scope.DEFMETHOD("var_names", function() {
- var var_names = this._var_names;
- if (!var_names) {
- this._var_names = var_names = Object.create(null);
- this.enclosed.forEach(function(def) {
- var_names[def.name] = true;
- });
- this.variables.each(function(def, name) {
- var_names[name] = true;
- });
- }
- return var_names;
- });
-
- AST_Scope.DEFMETHOD("make_var_name", function(prefix) {
- var var_names = this.var_names();
- prefix = prefix.replace(/(?:^[^a-z_$]|[^a-z0-9_$])/ig, "_");
- var name = prefix;
- for (var i = 0; var_names[name]; i++) name = prefix + "$" + i;
- var_names[name] = true;
- return name;
- });
-
- AST_Scope.DEFMETHOD("hoist_properties", function(compressor) {
- if (!compressor.option("hoist_props") || compressor.has_directive("use asm")) return;
- var self = this;
- var top_retain = self instanceof AST_Toplevel && compressor.top_retain || return_false;
- var defs_by_id = Object.create(null);
- self.transform(new TreeTransformer(function(node, descend) {
- if (node instanceof AST_Assign) {
- if (node.operator != "=") return;
- if (!node.write_only) return;
- if (node.left.scope !== self) return;
- if (!can_hoist(node.left, node.right, 1)) return;
- descend(node, this);
- var defs = new Dictionary();
- var assignments = [];
- var decls = [];
- node.right.properties.forEach(function(prop) {
- var decl = make_sym(node.left, prop.key);
- decls.push(make_node(AST_VarDef, node, {
- name: decl,
- value: null
- }));
- var sym = make_node(AST_SymbolRef, node, {
- name: decl.name,
- scope: self,
- thedef: decl.definition()
- });
- sym.reference({});
- assignments.push(make_node(AST_Assign, node, {
- operator: "=",
- left: sym,
- right: prop.value
- }));
- });
- defs_by_id[node.left.definition().id] = defs;
- self.body.splice(self.body.indexOf(this.stack[1]) + 1, 0, make_node(AST_Var, node, {
- definitions: decls
- }));
- return make_sequence(node, assignments);
- }
- if (node instanceof AST_Scope) return node === self ? undefined : node;
- if (node instanceof AST_VarDef) {
- if (!can_hoist(node.name, node.value, 0)) return;
- descend(node, this);
- var defs = new Dictionary();
- var var_defs = [];
- node.value.properties.forEach(function(prop) {
- var_defs.push(make_node(AST_VarDef, node, {
- name: make_sym(node.name, prop.key),
- value: prop.value
- }));
- });
- defs_by_id[node.name.definition().id] = defs;
- return MAP.splice(var_defs);
- }
-
- function make_sym(sym, key) {
- var new_var = make_node(AST_SymbolVar, sym, {
- name: self.make_var_name(sym.name + "_" + key),
- scope: self
- });
- var def = self.def_variable(new_var);
- defs.set(key, def);
- self.enclosed.push(def);
- return new_var;
- }
- }));
- self.transform(new TreeTransformer(function(node, descend) {
- if (node instanceof AST_PropAccess) {
- if (!(node.expression instanceof AST_SymbolRef)) return;
- var defs = defs_by_id[node.expression.definition().id];
- if (!defs) return;
- var def = defs.get(node.getProperty());
- var sym = make_node(AST_SymbolRef, node, {
- name: def.name,
- scope: node.expression.scope,
- thedef: def
- });
- sym.reference({});
- return sym;
- }
- if (node instanceof AST_Unary) {
- if (unary_side_effects[node.operator]) return;
- if (!(node.expression instanceof AST_SymbolRef)) return;
- if (!(node.expression.definition().id in defs_by_id)) return;
- var opt = node.clone();
- opt.expression = make_node(AST_Object, node, {
- properties: []
- });
- return opt;
- }
- }));
-
- function can_hoist(sym, right, count) {
- var def = sym.definition();
- if (def.assignments != count) return;
- if (def.direct_access) return;
- if (def.escaped.depth == 1) return;
- if (def.references.length == count) return;
- if (def.single_use) return;
- if (top_retain(def)) return;
- if (sym.fixed_value() !== right) return;
- return right instanceof AST_Object;
- }
- });
-
- function safe_to_drop(fn, compressor) {
- if (!fn.name || !compressor.option("ie8")) return true;
- var def = fn.name.definition();
- if (compressor.exposed(def)) return false;
- return all(def.references, function(sym) {
- return !(sym instanceof AST_SymbolRef);
- });
- }
-
- // drop_side_effect_free()
- // remove side-effect-free parts which only affects return value
- (function(def) {
- // Drop side-effect-free elements from an array of expressions.
- // Returns an array of expressions with side-effects or null
- // if all elements were dropped. Note: original array may be
- // returned if nothing changed.
- function trim(nodes, compressor, first_in_statement) {
- var len = nodes.length;
- if (!len) return null;
- var ret = [], changed = false;
- for (var i = 0; i < len; i++) {
- var node = nodes[i].drop_side_effect_free(compressor, first_in_statement);
- changed |= node !== nodes[i];
- if (node) {
- ret.push(node);
- first_in_statement = false;
- }
- }
- return changed ? ret.length ? ret : null : nodes;
- }
-
- def(AST_Node, return_this);
- def(AST_Accessor, return_null);
- def(AST_Array, function(compressor, first_in_statement) {
- var values = trim(this.elements, compressor, first_in_statement);
- return values && make_sequence(this, values);
- });
- def(AST_Assign, function(compressor) {
- var left = this.left;
- if (left instanceof AST_PropAccess) {
- var expr = left.expression;
- if (expr instanceof AST_Assign && expr.operator == "=" && !expr.may_throw_on_access(compressor)) {
- expr.write_only = "p";
- }
- if (compressor.has_directive("use strict") && expr.is_constant()) return this;
- }
- if (left.has_side_effects(compressor)) return this;
- this.write_only = true;
- if (root_expr(left).is_constant_expression(compressor.find_parent(AST_Scope))) {
- return this.right.drop_side_effect_free(compressor);
- }
- return this;
- });
- def(AST_Binary, function(compressor, first_in_statement) {
- var right = this.right.drop_side_effect_free(compressor, first_in_statement);
- if (!right) return this.left.drop_side_effect_free(compressor, first_in_statement);
- if (lazy_op[this.operator] && !(right instanceof AST_Function)) {
- var node = this;
- if (right !== node.right) {
- node = this.clone();
- node.right = right.drop_side_effect_free(compressor);
- }
- return (first_in_statement ? best_of_statement : best_of_expression)(node, make_node(AST_Binary, this, {
- operator: node.operator == "&&" ? "||" : "&&",
- left: node.left.negate(compressor, first_in_statement),
- right: node.right
- }));
- } else {
- var left = this.left.drop_side_effect_free(compressor, first_in_statement);
- if (!left) return right;
- return make_sequence(this, [ left, right.drop_side_effect_free(compressor) ]);
- }
- });
- def(AST_Call, function(compressor, first_in_statement) {
- if (!this.is_expr_pure(compressor)) {
- var exp = this.expression;
- if (this.is_call_pure(compressor)) {
- var exprs = this.args.slice();
- exprs.unshift(exp.expression);
- exprs = trim(exprs, compressor, first_in_statement);
- return exprs && make_sequence(this, exprs);
- }
- if (exp instanceof AST_Function && (!exp.name || !exp.name.definition().references.length)) {
- var node = this.clone();
- exp.process_expression(false, function(node) {
- var value = node.value && node.value.drop_side_effect_free(compressor, true);
- return value ? make_node(AST_SimpleStatement, node, {
- body: value
- }) : make_node(AST_EmptyStatement, node);
- });
- exp.walk(new TreeWalker(function(node) {
- if (node instanceof AST_Return && node.value) {
- node.value = node.value.drop_side_effect_free(compressor);
- return true;
- }
- if (node instanceof AST_Scope && node !== exp) return true;
- }));
- return node;
- }
- return this;
- }
- if (this.pure) AST_Node.warn("Dropping __PURE__ call [{file}:{line},{col}]", this.start);
- var args = trim(this.args, compressor, first_in_statement);
- return args && make_sequence(this, args);
- });
- def(AST_Conditional, function(compressor) {
- var consequent = this.consequent.drop_side_effect_free(compressor);
- var alternative = this.alternative.drop_side_effect_free(compressor);
- if (consequent === this.consequent && alternative === this.alternative) return this;
- if (!consequent) return alternative ? make_node(AST_Binary, this, {
- operator: "||",
- left: this.condition,
- right: alternative
- }) : this.condition.drop_side_effect_free(compressor);
- if (!alternative) return make_node(AST_Binary, this, {
- operator: "&&",
- left: this.condition,
- right: consequent
- });
- var node = this.clone();
- node.consequent = consequent;
- node.alternative = alternative;
- return node;
- });
- def(AST_Constant, return_null);
- def(AST_Dot, function(compressor, first_in_statement) {
- var expr = this.expression;
- if (expr.may_throw_on_access(compressor)) return this;
- return expr.drop_side_effect_free(compressor, first_in_statement);
- });
- def(AST_Function, function(compressor) {
- return safe_to_drop(this, compressor) ? null : this;
- });
- def(AST_Object, function(compressor, first_in_statement) {
- var values = trim(this.properties, compressor, first_in_statement);
- return values && make_sequence(this, values);
- });
- def(AST_ObjectProperty, function(compressor, first_in_statement) {
- return this.value.drop_side_effect_free(compressor, first_in_statement);
- });
- def(AST_Sequence, function(compressor, first_in_statement) {
- var expressions = trim(this.expressions, compressor, first_in_statement);
- if (expressions === this.expressions) return this;
- if (!expressions) return null;
- return make_sequence(this, expressions);
- });
- def(AST_Sub, function(compressor, first_in_statement) {
- if (this.expression.may_throw_on_access(compressor)) return this;
- var expression = this.expression.drop_side_effect_free(compressor, first_in_statement);
- if (!expression) return this.property.drop_side_effect_free(compressor, first_in_statement);
- var property = this.property.drop_side_effect_free(compressor);
- if (!property) return expression;
- return make_sequence(this, [ expression, property ]);
- });
- def(AST_SymbolRef, function(compressor) {
- if (!this.is_declared(compressor)) return this;
- this.definition().replaced++;
- return null;
- });
- def(AST_This, return_null);
- def(AST_Unary, function(compressor, first_in_statement) {
- if (unary_side_effects[this.operator]) {
- this.write_only = !this.expression.has_side_effects(compressor);
- return this;
- }
- if (this.operator == "typeof" && this.expression instanceof AST_SymbolRef) {
- this.expression.definition().replaced++;
- return null;
- }
- var expression = this.expression.drop_side_effect_free(compressor, first_in_statement);
- if (first_in_statement && expression && is_iife_call(expression)) {
- if (expression === this.expression && this.operator == "!") return this;
- return expression.negate(compressor, first_in_statement);
- }
- return expression;
- });
- })(function(node, func) {
- node.DEFMETHOD("drop_side_effect_free", func);
- });
-
- OPT(AST_SimpleStatement, function(self, compressor) {
- if (compressor.option("side_effects")) {
- var body = self.body;
- var node = body.drop_side_effect_free(compressor, true);
- if (!node) {
- AST_Node.warn("Dropping side-effect-free statement [{file}:{line},{col}]", self.start);
- return make_node(AST_EmptyStatement, self);
- }
- if (node !== body) {
- return make_node(AST_SimpleStatement, self, { body: node });
- }
- }
- return self;
- });
-
- OPT(AST_While, function(self, compressor) {
- return compressor.option("loops") ? make_node(AST_For, self, self).optimize(compressor) : self;
- });
-
- function has_break_or_continue(loop, parent) {
- var found = false;
- var tw = new TreeWalker(function(node) {
- if (found || node instanceof AST_Scope) return true;
- if (node instanceof AST_LoopControl && tw.loopcontrol_target(node) === loop) {
- return found = true;
- }
- });
- if (parent instanceof AST_LabeledStatement) tw.push(parent);
- tw.push(loop);
- loop.body.walk(tw);
- return found;
- }
-
- OPT(AST_Do, function(self, compressor) {
- if (!compressor.option("loops")) return self;
- var cond = self.condition.is_truthy() || self.condition.tail_node().evaluate(compressor);
- if (!(cond instanceof AST_Node)) {
- if (cond) return make_node(AST_For, self, {
- body: make_node(AST_BlockStatement, self.body, {
- body: [
- self.body,
- make_node(AST_SimpleStatement, self.condition, {
- body: self.condition
- })
- ]
- })
- }).optimize(compressor);
- if (!has_break_or_continue(self, compressor.parent())) {
- return make_node(AST_BlockStatement, self.body, {
- body: [
- self.body,
- make_node(AST_SimpleStatement, self.condition, {
- body: self.condition
- })
- ]
- }).optimize(compressor);
- }
- }
- if (self.body instanceof AST_SimpleStatement) return make_node(AST_For, self, {
- condition: make_sequence(self.condition, [
- self.body.body,
- self.condition
- ]),
- body: make_node(AST_EmptyStatement, self)
- }).optimize(compressor);
- return self;
- });
-
- function if_break_in_loop(self, compressor) {
- var first = first_statement(self.body);
- if (compressor.option("dead_code")
- && (first instanceof AST_Break
- || first instanceof AST_Continue && external_target(first)
- || first instanceof AST_Exit)) {
- var body = [];
- if (self.init instanceof AST_Statement) {
- body.push(self.init);
- } else if (self.init) {
- body.push(make_node(AST_SimpleStatement, self.init, {
- body: self.init
- }));
- }
- var retain = external_target(first) || first instanceof AST_Exit;
- if (self.condition && retain) {
- body.push(make_node(AST_If, self, {
- condition: self.condition,
- body: first,
- alternative: null
- }));
- } else if (self.condition) {
- body.push(make_node(AST_SimpleStatement, self.condition, {
- body: self.condition
- }));
- } else if (retain) {
- body.push(first);
- }
- extract_declarations_from_unreachable_code(self.body, body);
- return make_node(AST_BlockStatement, self, {
- body: body
- });
- }
- if (first instanceof AST_If) {
- var ab = first_statement(first.body);
- if (ab instanceof AST_Break && !external_target(ab)) {
- if (self.condition) {
- self.condition = make_node(AST_Binary, self.condition, {
- left: self.condition,
- operator: "&&",
- right: first.condition.negate(compressor),
- });
- } else {
- self.condition = first.condition.negate(compressor);
- }
- var body = as_statement_array(first.alternative);
- extract_declarations_from_unreachable_code(first.body, body);
- return drop_it(body);
- }
- ab = first_statement(first.alternative);
- if (ab instanceof AST_Break && !external_target(ab)) {
- if (self.condition) {
- self.condition = make_node(AST_Binary, self.condition, {
- left: self.condition,
- operator: "&&",
- right: first.condition,
- });
- } else {
- self.condition = first.condition;
- }
- var body = as_statement_array(first.body);
- extract_declarations_from_unreachable_code(first.alternative, body);
- return drop_it(body);
- }
- }
- return self;
-
- function first_statement(body) {
- return body instanceof AST_BlockStatement ? body.body[0] : body;
- }
-
- function external_target(node) {
- return compressor.loopcontrol_target(node) !== compressor.self();
- }
-
- function drop_it(rest) {
- if (self.body instanceof AST_BlockStatement) {
- self.body = self.body.clone();
- self.body.body = rest.concat(self.body.body.slice(1));
- self.body = self.body.transform(compressor);
- } else {
- self.body = make_node(AST_BlockStatement, self.body, {
- body: rest
- }).transform(compressor);
- }
- return if_break_in_loop(self, compressor);
- }
- }
-
- OPT(AST_For, function(self, compressor) {
- if (!compressor.option("loops")) return self;
- if (compressor.option("side_effects")) {
- if (self.init) self.init = self.init.drop_side_effect_free(compressor);
- if (self.step) self.step = self.step.drop_side_effect_free(compressor);
- }
- if (self.condition) {
- var cond = self.condition.evaluate(compressor);
- if (!(cond instanceof AST_Node)) {
- if (cond) self.condition = null;
- else if (!compressor.option("dead_code")) {
- var orig = self.condition;
- self.condition = make_node_from_constant(cond, self.condition);
- self.condition = best_of_expression(self.condition.transform(compressor), orig);
- }
- }
- if (cond instanceof AST_Node) {
- cond = self.condition.is_truthy() || self.condition.tail_node().evaluate(compressor);
- }
- if (!cond) {
- if (compressor.option("dead_code")) {
- var body = [];
- extract_declarations_from_unreachable_code(self.body, body);
- if (self.init instanceof AST_Statement) {
- body.push(self.init);
- } else if (self.init) {
- body.push(make_node(AST_SimpleStatement, self.init, {
- body: self.init
- }));
- }
- body.push(make_node(AST_SimpleStatement, self.condition, {
- body: self.condition
- }));
- return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor);
- }
- } else if (self.condition && !(cond instanceof AST_Node)) {
- self.body = make_node(AST_BlockStatement, self.body, {
- body: [
- make_node(AST_SimpleStatement, self.condition, {
- body: self.condition
- }),
- self.body
- ]
- });
- self.condition = null;
- }
- }
- return if_break_in_loop(self, compressor);
- });
-
- function mark_locally_defined(condition, consequent, alternative, operator) {
- if (!(condition instanceof AST_Binary)) return;
- if (!(condition.left instanceof AST_String)) {
- if (!operator) operator = condition.operator;
- if (condition.operator != operator) return;
- switch (operator) {
- case "&&":
- case "||":
- mark_locally_defined(condition.left, consequent, alternative, operator);
- mark_locally_defined(condition.right, consequent, alternative, operator);
- break;
- }
- return;
- }
- if (!(condition.right instanceof AST_UnaryPrefix)) return;
- if (condition.right.operator != "typeof") return;
- var sym = condition.right.expression;
- if (!is_undeclared_ref(sym)) return;
- var body;
- var undef = condition.left.value == "undefined";
- switch (condition.operator) {
- case "==":
- body = undef ? alternative : consequent;
- break;
- case "!=":
- body = undef ? consequent : alternative;
- break;
- default:
- return;
- }
- if (!body) return;
- var def = sym.definition();
- var tw = new TreeWalker(function(node) {
- if (node instanceof AST_Scope) {
- var parent = tw.parent();
- if (parent instanceof AST_Call && parent.expression === node) return;
- return true;
- }
- if (node instanceof AST_SymbolRef && node.definition() === def) node.defined = true;
- });
- body.walk(tw);
- }
-
- OPT(AST_If, function(self, compressor) {
- if (is_empty(self.alternative)) self.alternative = null;
-
- if (!compressor.option("conditionals")) return self;
- // if condition can be statically determined, warn and drop
- // one of the blocks. note, statically determined implies
- // “has no side effects”; also it doesn't work for cases like
- // `x && true`, though it probably should.
- var cond = self.condition.evaluate(compressor);
- if (!compressor.option("dead_code") && !(cond instanceof AST_Node)) {
- var orig = self.condition;
- self.condition = make_node_from_constant(cond, orig);
- self.condition = best_of_expression(self.condition.transform(compressor), orig);
- }
- if (compressor.option("dead_code")) {
- if (cond instanceof AST_Node) {
- cond = self.condition.is_truthy() || self.condition.tail_node().evaluate(compressor);
- }
- if (!cond) {
- AST_Node.warn("Condition always false [{file}:{line},{col}]", self.condition.start);
- var body = [];
- extract_declarations_from_unreachable_code(self.body, body);
- body.push(make_node(AST_SimpleStatement, self.condition, {
- body: self.condition
- }));
- if (self.alternative) body.push(self.alternative);
- return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor);
- } else if (!(cond instanceof AST_Node)) {
- AST_Node.warn("Condition always true [{file}:{line},{col}]", self.condition.start);
- var body = [];
- if (self.alternative) extract_declarations_from_unreachable_code(self.alternative, body);
- body.push(make_node(AST_SimpleStatement, self.condition, {
- body: self.condition
- }));
- body.push(self.body);
- return make_node(AST_BlockStatement, self, { body: body }).optimize(compressor);
- }
- }
- var negated = self.condition.negate(compressor);
- var self_condition_length = self.condition.print_to_string().length;
- var negated_length = negated.print_to_string().length;
- var negated_is_best = negated_length < self_condition_length;
- if (self.alternative && negated_is_best) {
- negated_is_best = false; // because we already do the switch here.
- // no need to swap values of self_condition_length and negated_length
- // here because they are only used in an equality comparison later on.
- self.condition = negated;
- var tmp = self.body;
- self.body = self.alternative || make_node(AST_EmptyStatement, self);
- self.alternative = tmp;
- }
- if (self.body instanceof AST_SimpleStatement
- && self.alternative instanceof AST_SimpleStatement) {
- return make_node(AST_SimpleStatement, self, {
- body: make_node(AST_Conditional, self, {
- condition : self.condition,
- consequent : self.body.body,
- alternative : self.alternative.body
- })
- }).optimize(compressor);
- }
- if (is_empty(self.alternative) && self.body instanceof AST_SimpleStatement) {
- if (self_condition_length === negated_length && !negated_is_best
- && self.condition instanceof AST_Binary && self.condition.operator == "||") {
- // although the code length of self.condition and negated are the same,
- // negated does not require additional surrounding parentheses.
- // see https://github.com/mishoo/UglifyJS2/issues/979
- negated_is_best = true;
- }
- if (negated_is_best) return make_node(AST_SimpleStatement, self, {
- body: make_node(AST_Binary, self, {
- operator : "||",
- left : negated,
- right : self.body.body
- }).transform(compressor)
- }).optimize(compressor);
- return make_node(AST_SimpleStatement, self, {
- body: make_node(AST_Binary, self, {
- operator : "&&",
- left : self.condition,
- right : self.body.body
- }).transform(compressor)
- }).optimize(compressor);
- }
- if (is_empty(self.body)) {
- if (is_empty(self.alternative)) return make_node(AST_SimpleStatement, self.condition, {
- body: self.condition.clone()
- }).optimize(compressor);
- if (self.alternative instanceof AST_SimpleStatement) return make_node(AST_SimpleStatement, self, {
- body: make_node(AST_Binary, self, {
- operator : "||",
- left : self.condition,
- right : self.alternative.body
- }).transform(compressor)
- }).optimize(compressor);
- self = make_node(AST_If, self, {
- condition: negated,
- body: self.alternative,
- alternative: null
- });
- }
- if (self.body instanceof AST_Exit
- && self.alternative instanceof AST_Exit
- && self.body.TYPE == self.alternative.TYPE) {
- var exit = make_node(self.body.CTOR, self, {
- value: make_node(AST_Conditional, self, {
- condition : self.condition,
- consequent : self.body.value || make_node(AST_Undefined, self.body).transform(compressor),
- alternative : self.alternative.value || make_node(AST_Undefined, self.alternative).transform(compressor)
- })
- });
- if (exit instanceof AST_Return) {
- exit.in_bool = self.body.in_bool || self.alternative.in_bool;
- }
- return exit;
- }
- if (self.body instanceof AST_If
- && !self.body.alternative
- && !self.alternative) {
- self = make_node(AST_If, self, {
- condition: make_node(AST_Binary, self.condition, {
- operator: "&&",
- left: self.condition,
- right: self.body.condition
- }),
- body: self.body.body,
- alternative: null
- });
- }
- if (aborts(self.body)) {
- if (self.alternative) {
- var alt = self.alternative;
- self.alternative = null;
- return make_node(AST_BlockStatement, self, {
- body: [ self, alt ]
- }).optimize(compressor);
- }
- }
- if (aborts(self.alternative)) {
- var body = self.body;
- self.body = self.alternative;
- self.condition = negated_is_best ? negated : self.condition.negate(compressor);
- self.alternative = null;
- return make_node(AST_BlockStatement, self, {
- body: [ self, body ]
- }).optimize(compressor);
- }
- if (compressor.option("typeofs")) mark_locally_defined(self.condition, self.body, self.alternative);
- return self;
- });
-
- OPT(AST_Switch, function(self, compressor) {
- if (!compressor.option("switches")) return self;
- var branch;
- var value = self.expression.evaluate(compressor);
- if (!(value instanceof AST_Node)) {
- var orig = self.expression;
- self.expression = make_node_from_constant(value, orig);
- self.expression = best_of_expression(self.expression.transform(compressor), orig);
- }
- if (!compressor.option("dead_code")) return self;
- if (value instanceof AST_Node) {
- value = self.expression.tail_node().evaluate(compressor);
- }
- var decl = [];
- var body = [];
- var default_branch;
- var exact_match;
- for (var i = 0, len = self.body.length; i < len && !exact_match; i++) {
- branch = self.body[i];
- if (branch instanceof AST_Default) {
- var prev = body[body.length - 1];
- if (default_branch || is_break(branch.body[0], compressor) && (!prev || aborts(prev))) {
- eliminate_branch(branch, prev);
- continue;
- } else {
- default_branch = branch;
- }
- } else if (!(value instanceof AST_Node)) {
- var exp = branch.expression.evaluate(compressor);
- if (!(exp instanceof AST_Node) && exp !== value) {
- eliminate_branch(branch, body[body.length - 1]);
- continue;
- }
- if (exp instanceof AST_Node) exp = branch.expression.tail_node().evaluate(compressor);
- if (exp === value) {
- exact_match = branch;
- if (default_branch) {
- var default_index = body.indexOf(default_branch);
- body.splice(default_index, 1);
- eliminate_branch(default_branch, body[default_index - 1]);
- default_branch = null;
- }
- }
- }
- if (aborts(branch)) {
- var prev = body[body.length - 1];
- if (aborts(prev) && prev.body.length == branch.body.length
- && make_node(AST_BlockStatement, prev, prev).equivalent_to(make_node(AST_BlockStatement, branch, branch))) {
- prev.body = [];
- }
- }
- body.push(branch);
- }
- while (i < len) eliminate_branch(self.body[i++], body[body.length - 1]);
- while (branch = body[body.length - 1]) {
- var stat = branch.body[branch.body.length - 1];
- if (is_break(stat, compressor)) branch.body.pop();
- if (branch === default_branch) {
- if (!is_body_empty(branch)) break;
- } else if (branch.expression.has_side_effects(compressor)) {
- break;
- } else if (default_branch) {
- if (!is_body_empty(default_branch)) break;
- if (body[body.length - 2] !== default_branch) break;
- default_branch.body = default_branch.body.concat(branch.body);
- branch.body = [];
- } else if (!is_body_empty(branch)) break;
- eliminate_branch(branch);
- if (body.pop() === default_branch) default_branch = null;
- }
- if (body.length == 0) {
- return make_node(AST_BlockStatement, self, {
- body: decl.concat(make_node(AST_SimpleStatement, self.expression, {
- body: self.expression
- }))
- }).optimize(compressor);
- }
- body[0].body = decl.concat(body[0].body);
- self.body = body;
- if (body.length == 1 && (body[0] === exact_match || body[0] === default_branch)) {
- var has_break = false;
- var tw = new TreeWalker(function(node) {
- if (has_break
- || node instanceof AST_Lambda
- || node instanceof AST_SimpleStatement) return true;
- if (is_break(node, tw)) has_break = true;
- });
- self.walk(tw);
- if (!has_break) {
- var statements = body[0].body.slice();
- var exp = body[0].expression;
- if (exp) statements.unshift(make_node(AST_SimpleStatement, exp, {
- body: exp
- }));
- statements.unshift(make_node(AST_SimpleStatement, self.expression, {
- body:self.expression
- }));
- return make_node(AST_BlockStatement, self, {
- body: statements
- }).optimize(compressor);
- }
- }
- return self;
-
- function is_break(node, tw) {
- return node instanceof AST_Break && tw.loopcontrol_target(node) === self;
- }
-
- function is_body_empty(branch) {
- return all(branch.body, function(stat) {
- return is_empty(stat)
- || stat instanceof AST_Defun
- || stat instanceof AST_Var && all(stat.definitions, function(var_def) {
- return !var_def.value;
- });
- });
- }
-
- function eliminate_branch(branch, prev) {
- if (prev && !aborts(prev)) {
- prev.body = prev.body.concat(branch.body);
- } else {
- extract_declarations_from_unreachable_code(branch, decl);
- }
- }
- });
-
- OPT(AST_Try, function(self, compressor) {
- self.body = tighten_body(self.body, compressor);
- if (self.bcatch && self.bfinally && all(self.bfinally.body, is_empty)) self.bfinally = null;
- if (compressor.option("dead_code") && all(self.body, is_empty)) {
- var body = [];
- if (self.bcatch) {
- extract_declarations_from_unreachable_code(self.bcatch, body);
- body.forEach(function(stat) {
- if (!(stat instanceof AST_Definitions)) return;
- stat.definitions.forEach(function(var_def) {
- var def = var_def.name.definition().redefined();
- if (!def) return;
- var_def.name = var_def.name.clone();
- var_def.name.thedef = def;
- });
- });
- }
- if (self.bfinally) body = body.concat(self.bfinally.body);
- return make_node(AST_BlockStatement, self, {
- body: body
- }).optimize(compressor);
- }
- return self;
- });
-
- AST_Definitions.DEFMETHOD("remove_initializers", function() {
- this.definitions.forEach(function(def) {
- def.value = null;
- });
- });
-
- AST_Definitions.DEFMETHOD("to_assignments", function(compressor) {
- var reduce_vars = compressor.option("reduce_vars");
- var assignments = this.definitions.reduce(function(a, def) {
- if (def.value) {
- var name = make_node(AST_SymbolRef, def.name, def.name);
- a.push(make_node(AST_Assign, def, {
- operator : "=",
- left : name,
- right : def.value
- }));
- if (reduce_vars) name.definition().fixed = false;
- }
- def = def.name.definition();
- def.eliminated++;
- def.replaced--;
- return a;
- }, []);
- if (assignments.length == 0) return null;
- return make_sequence(this, assignments);
- });
-
- OPT(AST_Definitions, function(self, compressor) {
- return self.definitions.length ? self : make_node(AST_EmptyStatement, self);
- });
-
- function lift_sequence_in_expression(node, compressor) {
- var exp = node.expression;
- if (!(exp instanceof AST_Sequence)) return node;
- var x = exp.expressions.slice();
- var e = node.clone();
- e.expression = x.pop();
- x.push(e);
- return make_sequence(node, x);
- }
-
- OPT(AST_Call, function(self, compressor) {
- var exp = self.expression;
- if (compressor.option("sequences")) {
- if (exp instanceof AST_PropAccess) {
- var seq = lift_sequence_in_expression(exp, compressor);
- if (seq !== exp) {
- var call = self.clone();
- call.expression = seq.expressions.pop();
- seq.expressions.push(call);
- return seq.optimize(compressor);
- }
- } else if (!needs_unbinding(compressor, exp.tail_node())) {
- var seq = lift_sequence_in_expression(self, compressor);
- if (seq !== self) return seq.optimize(compressor);
- }
- }
- var fn = exp;
- if (compressor.option("reduce_vars") && fn instanceof AST_SymbolRef) {
- fn = fn.fixed_value();
- }
- var is_func = fn instanceof AST_Lambda;
- if (compressor.option("unused")
- && is_func
- && !fn.uses_arguments
- && !fn.pinned()) {
- var pos = 0, last = 0;
- var drop_fargs = exp === fn && !fn.name && compressor.drop_fargs(fn, self);
- var side_effects = [];
- for (var i = 0; i < self.args.length; i++) {
- var trim = i >= fn.argnames.length;
- if (trim || fn.argnames[i].__unused) {
- var node = self.args[i].drop_side_effect_free(compressor);
- if (drop_fargs) {
- fn.argnames.splice(i, 1);
- self.args.splice(i, 1);
- if (node) side_effects.push(node);
- i--;
- continue;
- } else if (node) {
- side_effects.push(node);
- self.args[pos++] = make_sequence(self, side_effects);
- side_effects = [];
- } else if (!trim) {
- if (side_effects.length) {
- node = make_sequence(self, side_effects);
- side_effects = [];
- } else {
- node = make_node(AST_Number, self.args[i], {
- value: 0
- });
- }
- self.args[pos++] = node;
- continue;
- }
- } else {
- side_effects.push(self.args[i]);
- self.args[pos++] = make_sequence(self, side_effects);
- side_effects = [];
- }
- last = pos;
- }
- if (drop_fargs) for (; i < fn.argnames.length; i++) {
- if (fn.argnames[i].__unused) fn.argnames.splice(i--, 1);
- }
- self.args.length = last;
- if (side_effects.length) {
- var arg = make_sequence(self, side_effects);
- self.args.push(self.args.length < fn.argnames.length ? make_node(AST_UnaryPrefix, self, {
- operator: "void",
- expression: arg
- }) : arg);
- }
- }
- if (compressor.option("unsafe")) {
- if (is_undeclared_ref(exp)) switch (exp.name) {
- case "Array":
- if (self.args.length == 1) {
- var first = self.args[0];
- if (first instanceof AST_Number) try {
- var length = first.value;
- if (length > 6) break;
- var elements = Array(length);
- for (var i = 0; i < length; i++) elements[i] = make_node(AST_Hole, self);
- return make_node(AST_Array, self, {
- elements: elements
- });
- } catch (ex) {
- AST_Node.warn("Invalid array length: {length} [{file}:{line},{col}]", {
- length: length,
- file: self.start.file,
- line: self.start.line,
- col: self.start.col
- });
- break;
- }
- if (!first.is_boolean(compressor) && !first.is_string(compressor)) break;
- }
- return make_node(AST_Array, self, {
- elements: self.args
- });
- case "Object":
- if (self.args.length == 0) {
- return make_node(AST_Object, self, {
- properties: []
- });
- }
- break;
- case "String":
- if (self.args.length == 0) return make_node(AST_String, self, {
- value: ""
- });
- if (self.args.length <= 1) return make_node(AST_Binary, self, {
- left: self.args[0],
- operator: "+",
- right: make_node(AST_String, self, { value: "" })
- }).optimize(compressor);
- break;
- case "Number":
- if (self.args.length == 0) return make_node(AST_Number, self, {
- value: 0
- });
- if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, {
- expression: self.args[0],
- operator: "+"
- }).optimize(compressor);
- case "Boolean":
- if (self.args.length == 0) return make_node(AST_False, self);
- if (self.args.length == 1) return make_node(AST_UnaryPrefix, self, {
- expression: make_node(AST_UnaryPrefix, self, {
- expression: self.args[0],
- operator: "!"
- }),
- operator: "!"
- }).optimize(compressor);
- break;
- case "RegExp":
- var params = [];
- if (all(self.args, function(arg) {
- var value = arg.evaluate(compressor);
- params.unshift(value);
- return arg !== value;
- })) {
- try {
- return best_of(compressor, self, make_node(AST_RegExp, self, {
- value: RegExp.apply(RegExp, params),
- }));
- } catch (ex) {
- AST_Node.warn("Error converting {expr} [{file}:{line},{col}]", {
- expr: self.print_to_string(),
- file: self.start.file,
- line: self.start.line,
- col: self.start.col
- });
- }
- }
- break;
- } else if (exp instanceof AST_Dot) switch(exp.property) {
- case "toString":
- if (self.args.length == 0 && !exp.expression.may_throw_on_access(compressor)) {
- return make_node(AST_Binary, self, {
- left: make_node(AST_String, self, { value: "" }),
- operator: "+",
- right: exp.expression
- }).optimize(compressor);
- }
- break;
- case "join":
- if (exp.expression instanceof AST_Array) EXIT: {
- var separator;
- if (self.args.length > 0) {
- separator = self.args[0].evaluate(compressor);
- if (separator === self.args[0]) break EXIT; // not a constant
- }
- var elements = [];
- var consts = [];
- exp.expression.elements.forEach(function(el) {
- var value = el.evaluate(compressor);
- if (value !== el) {
- consts.push(value);
- } else {
- if (consts.length > 0) {
- elements.push(make_node(AST_String, self, {
- value: consts.join(separator)
- }));
- consts.length = 0;
- }
- elements.push(el);
- }
- });
- if (consts.length > 0) {
- elements.push(make_node(AST_String, self, {
- value: consts.join(separator)
- }));
- }
- if (elements.length == 0) return make_node(AST_String, self, { value: "" });
- if (elements.length == 1) {
- if (elements[0].is_string(compressor)) {
- return elements[0];
- }
- return make_node(AST_Binary, elements[0], {
- operator : "+",
- left : make_node(AST_String, self, { value: "" }),
- right : elements[0]
- });
- }
- if (separator == "") {
- var first;
- if (elements[0].is_string(compressor)
- || elements[1].is_string(compressor)) {
- first = elements.shift();
- } else {
- first = make_node(AST_String, self, { value: "" });
- }
- return elements.reduce(function(prev, el) {
- return make_node(AST_Binary, el, {
- operator : "+",
- left : prev,
- right : el
- });
- }, first).optimize(compressor);
- }
- // need this awkward cloning to not affect original element
- // best_of will decide which one to get through.
- var node = self.clone();
- node.expression = node.expression.clone();
- node.expression.expression = node.expression.expression.clone();
- node.expression.expression.elements = elements;
- return best_of(compressor, self, node);
- }
- break;
- case "charAt":
- if (self.args.length < 2) {
- var node = make_node(AST_Sub, self, {
- expression: exp.expression,
- property: self.args.length ? make_node(AST_Binary, self.args[0], {
- operator: "|",
- left: make_node(AST_Number, self, {
- value: 0
- }),
- right: self.args[0]
- }) : make_node(AST_Number, self, {
- value: 0
- })
- });
- node.is_string = return_true;
- return node.optimize(compressor);
- }
- break;
- case "apply":
- if (self.args.length == 2 && self.args[1] instanceof AST_Array) {
- var args = self.args[1].elements.slice();
- args.unshift(self.args[0]);
- return make_node(AST_Call, self, {
- expression: make_node(AST_Dot, exp, {
- expression: exp.expression,
- property: "call"
- }),
- args: args
- }).optimize(compressor);
- }
- break;
- case "call":
- var func = exp.expression;
- if (func instanceof AST_SymbolRef) {
- func = func.fixed_value();
- }
- if (func instanceof AST_Lambda && !func.contains_this()) {
- return (self.args.length ? make_sequence(this, [
- self.args[0],
- make_node(AST_Call, self, {
- expression: exp.expression,
- args: self.args.slice(1)
- })
- ]) : make_node(AST_Call, self, {
- expression: exp.expression,
- args: []
- })).optimize(compressor);
- }
- break;
- }
- }
- if (compressor.option("unsafe_Function")
- && is_undeclared_ref(exp)
- && exp.name == "Function") {
- // new Function() => function(){}
- if (self.args.length == 0) return make_node(AST_Function, self, {
- argnames: [],
- body: []
- });
- if (all(self.args, function(x) {
- return x instanceof AST_String;
- })) {
- // quite a corner-case, but we can handle it:
- // https://github.com/mishoo/UglifyJS2/issues/203
- // if the code argument is a constant, then we can minify it.
- try {
- var code = "n(function(" + self.args.slice(0, -1).map(function(arg) {
- return arg.value;
- }).join(",") + "){" + self.args[self.args.length - 1].value + "})";
- var ast = parse(code);
- var mangle = { ie8: compressor.option("ie8") };
- ast.figure_out_scope(mangle);
- var comp = new Compressor(compressor.options);
- ast = ast.transform(comp);
- ast.figure_out_scope(mangle);
- ast.compute_char_frequency(mangle);
- ast.mangle_names(mangle);
- var fun;
- ast.walk(new TreeWalker(function(node) {
- if (fun) return true;
- if (node instanceof AST_Lambda) {
- fun = node;
- return true;
- }
- }));
- var code = OutputStream();
- AST_BlockStatement.prototype._codegen.call(fun, fun, code);
- self.args = [
- make_node(AST_String, self, {
- value: fun.argnames.map(function(arg) {
- return arg.print_to_string();
- }).join(",")
- }),
- make_node(AST_String, self.args[self.args.length - 1], {
- value: code.get().replace(/^\{|\}$/g, "")
- })
- ];
- return self;
- } catch (ex) {
- if (ex instanceof JS_Parse_Error) {
- AST_Node.warn("Error parsing code passed to new Function [{file}:{line},{col}]", self.args[self.args.length - 1].start);
- AST_Node.warn(ex.toString());
- } else {
- throw ex;
- }
- }
- }
- }
- var stat = is_func && fn.first_statement();
- var can_inline = compressor.option("inline") && !self.is_expr_pure(compressor);
- if (exp === fn && can_inline && stat instanceof AST_Return) {
- var value = stat.value;
- if (!value || value.is_constant_expression()) {
- var args = self.args.concat(value || make_node(AST_Undefined, self));
- return make_sequence(self, args).optimize(compressor);
- }
- }
- if (is_func) {
- var def, value, scope, in_loop, level = -1;
- if (can_inline
- && !fn.uses_arguments
- && !fn.pinned()
- && !(fn.name && fn instanceof AST_Function)
- && (value = can_flatten_body(stat))
- && (exp === fn
- || compressor.option("unused")
- && (def = exp.definition()).references.length == 1
- && !recursive_ref(compressor, def)
- && fn.is_constant_expression(exp.scope))
- && !self.pure
- && !fn.contains_this()
- && can_inject_symbols()) {
- fn._squeezed = true;
- if (exp !== fn) fn.parent_scope = exp.scope;
- return make_sequence(self, flatten_fn()).optimize(compressor);
- }
- if (compressor.option("side_effects")
- && all(fn.body, is_empty)
- && (fn !== exp || safe_to_drop(fn, compressor))) {
- var args = self.args.concat(make_node(AST_Undefined, self));
- return make_sequence(self, args).optimize(compressor);
- }
- }
- if (compressor.option("drop_console")) {
- if (exp instanceof AST_PropAccess) {
- var name = exp.expression;
- while (name.expression) {
- name = name.expression;
- }
- if (is_undeclared_ref(name) && name.name == "console") {
- return make_node(AST_Undefined, self).optimize(compressor);
- }
- }
- }
- if (compressor.option("negate_iife")
- && compressor.parent() instanceof AST_SimpleStatement
- && is_iife_call(self)) {
- return self.negate(compressor, true);
- }
- return try_evaluate(compressor, self);
-
- function return_value(stat) {
- if (!stat) return make_node(AST_Undefined, self);
- if (stat instanceof AST_Return) {
- if (!stat.value) return make_node(AST_Undefined, self);
- return stat.value.clone(true);
- }
- if (stat instanceof AST_SimpleStatement) {
- return make_node(AST_UnaryPrefix, stat, {
- operator: "void",
- expression: stat.body
- });
- }
- }
-
- function can_flatten_body(stat) {
- var len = fn.body.length;
- if (compressor.option("inline") < 3) {
- return len == 1 && return_value(stat);
- }
- stat = null;
- for (var i = 0; i < len; i++) {
- var line = fn.body[i];
- if (line instanceof AST_Var) {
- if (stat && !all(line.definitions, function(var_def) {
- return !var_def.value;
- })) {
- return false;
- }
- } else if (line instanceof AST_Defun || line instanceof AST_EmptyStatement) {
- continue;
- } else if (stat) {
- return false;
- } else {
- stat = line;
- }
- }
- return return_value(stat);
- }
-
- function var_exists(defined, name) {
- return defined[name] || identifier_atom[name] || scope.var_names()[name];
- }
-
- function can_inject_args(catches, used, safe_to_inject) {
- for (var i = 0; i < fn.argnames.length; i++) {
- var arg = fn.argnames[i];
- if (arg.__unused) continue;
- if (!safe_to_inject || var_exists(catches, arg.name)) return false;
- used[arg.name] = true;
- if (in_loop) in_loop.push(arg.definition());
- }
- return true;
- }
-
- function can_inject_vars(catches, used, safe_to_inject) {
- for (var i = 0; i < fn.body.length; i++) {
- var stat = fn.body[i];
- if (stat instanceof AST_Defun) {
- if (!safe_to_inject || var_exists(used, stat.name.name)) return false;
- continue;
- }
- if (!(stat instanceof AST_Var)) continue;
- if (!safe_to_inject) return false;
- for (var j = stat.definitions.length; --j >= 0;) {
- var name = stat.definitions[j].name;
- if (var_exists(catches, name.name)) return false;
- if (in_loop) in_loop.push(name.definition());
- }
- }
- return true;
- }
-
- function can_inject_symbols() {
- var catches = Object.create(null);
- do {
- scope = compressor.parent(++level);
- if (scope instanceof AST_Catch) {
- catches[scope.argname.name] = true;
- } else if (scope instanceof AST_IterationStatement) {
- in_loop = [];
- } else if (scope instanceof AST_SymbolRef) {
- if (scope.fixed_value() instanceof AST_Scope) return false;
- }
- } while (!(scope instanceof AST_Scope));
- var safe_to_inject = (!(scope instanceof AST_Toplevel) || compressor.toplevel.vars)
- && (exp !== fn || fn.parent_scope === compressor.find_parent(AST_Scope));
- var inline = compressor.option("inline");
- var used = Object.create(catches);
- if (!can_inject_args(catches, used, inline >= 2 && safe_to_inject)) return false;
- if (!can_inject_vars(catches, used, inline >= 3 && safe_to_inject)) return false;
- return !in_loop || in_loop.length == 0 || !is_reachable(fn, in_loop);
- }
-
- function append_var(decls, expressions, name, value) {
- var def = name.definition();
- scope.variables.set(name.name, def);
- scope.enclosed.push(def);
- if (!scope.var_names()[name.name]) {
- scope.var_names()[name.name] = true;
- decls.push(make_node(AST_VarDef, name, {
- name: name,
- value: null
- }));
- }
- var sym = make_node(AST_SymbolRef, name, name);
- def.references.push(sym);
- if (value) expressions.push(make_node(AST_Assign, self, {
- operator: "=",
- left: sym,
- right: value
- }));
- }
-
- function flatten_args(decls, expressions) {
- var len = fn.argnames.length;
- for (var i = self.args.length; --i >= len;) {
- expressions.push(self.args[i]);
- }
- for (i = len; --i >= 0;) {
- var name = fn.argnames[i];
- var value = self.args[i];
- if (name.__unused || scope.var_names()[name.name]) {
- if (value) expressions.push(value);
- } else {
- var symbol = make_node(AST_SymbolVar, name, name);
- name.definition().orig.push(symbol);
- if (!value && in_loop) value = make_node(AST_Undefined, self);
- append_var(decls, expressions, symbol, value);
- }
- }
- decls.reverse();
- expressions.reverse();
- }
-
- function flatten_vars(decls, expressions) {
- var pos = expressions.length;
- for (var i = 0; i < fn.body.length; i++) {
- var stat = fn.body[i];
- if (!(stat instanceof AST_Var)) continue;
- for (var j = 0; j < stat.definitions.length; j++) {
- var var_def = stat.definitions[j];
- var name = var_def.name;
- var redef = name.definition().redefined();
- if (redef) {
- name = name.clone();
- name.thedef = redef;
- }
- append_var(decls, expressions, name, var_def.value);
- if (in_loop && all(fn.argnames, function(argname) {
- return argname.name != name.name;
- })) {
- var def = fn.variables.get(name.name);
- var sym = make_node(AST_SymbolRef, name, name);
- def.references.push(sym);
- expressions.splice(pos++, 0, make_node(AST_Assign, var_def, {
- operator: "=",
- left: sym,
- right: make_node(AST_Undefined, name)
- }));
- }
- }
- }
- }
-
- function flatten_fn() {
- var decls = [];
- var expressions = [];
- flatten_args(decls, expressions);
- flatten_vars(decls, expressions);
- expressions.push(value);
- var args = fn.body.filter(function(stat) {
- if (stat instanceof AST_Defun) {
- var def = stat.name.definition();
- scope.functions.set(def.name, def);
- scope.variables.set(def.name, def);
- scope.enclosed.push(def);
- scope.var_names()[def.name] = true;
- return true;
- }
- });
- args.unshift(scope.body.indexOf(compressor.parent(level - 1)) + 1, 0);
- if (decls.length) args.push(make_node(AST_Var, fn, {
- definitions: decls
- }));
- [].splice.apply(scope.body, args);
- fn.enclosed.forEach(function(def) {
- if (scope.var_names()[def.name]) return;
- scope.enclosed.push(def);
- scope.var_names()[def.name] = true;
- });
- return expressions;
- }
- });
-
- OPT(AST_New, function(self, compressor) {
- if (compressor.option("sequences")) {
- var seq = lift_sequence_in_expression(self, compressor);
- if (seq !== self) return seq.optimize(compressor);
- }
- if (compressor.option("unsafe")) {
- var exp = self.expression;
- if (is_undeclared_ref(exp)) {
- switch (exp.name) {
- case "Object":
- case "RegExp":
- case "Function":
- case "Error":
- case "Array":
- return make_node(AST_Call, self, self).transform(compressor);
- }
- }
- }
- return self;
- });
-
- OPT(AST_Sequence, function(self, compressor) {
- if (!compressor.option("side_effects")) return self;
- var expressions = [];
- filter_for_side_effects();
- var end = expressions.length - 1;
- trim_right_for_undefined();
- if (end == 0) {
- self = maintain_this_binding(compressor, compressor.parent(), compressor.self(), expressions[0]);
- if (!(self instanceof AST_Sequence)) self = self.optimize(compressor);
- return self;
- }
- self.expressions = expressions;
- return self;
-
- function filter_for_side_effects() {
- var first = first_in_statement(compressor);
- var last = self.expressions.length - 1;
- self.expressions.forEach(function(expr, index) {
- if (index < last) expr = expr.drop_side_effect_free(compressor, first);
- if (expr) {
- merge_sequence(expressions, expr);
- first = false;
- }
- });
- }
-
- function trim_right_for_undefined() {
- while (end > 0 && is_undefined(expressions[end], compressor)) end--;
- if (end < expressions.length - 1) {
- expressions[end] = make_node(AST_UnaryPrefix, self, {
- operator : "void",
- expression : expressions[end]
- });
- expressions.length = end + 1;
- }
- }
- });
-
- OPT(AST_UnaryPostfix, function(self, compressor) {
- if (compressor.option("sequences")) {
- var seq = lift_sequence_in_expression(self, compressor);
- if (seq !== self) return seq.optimize(compressor);
- }
- return self;
- });
-
- var SIGN_OPS = makePredicate("+ -");
- var MULTIPLICATIVE_OPS = makePredicate("* / %");
- OPT(AST_UnaryPrefix, function(self, compressor) {
- var e = self.expression;
- if (compressor.option("evaluate")
- && self.operator == "delete"
- && !(e instanceof AST_SymbolRef
- || e instanceof AST_PropAccess
- || is_identifier_atom(e))) {
- if (e instanceof AST_Sequence) {
- e = e.expressions.slice();
- e.push(make_node(AST_True, self));
- return make_sequence(self, e).optimize(compressor);
- }
- return make_sequence(self, [ e, make_node(AST_True, self) ]).optimize(compressor);
- }
- if (compressor.option("sequences")) {
- var seq = lift_sequence_in_expression(self, compressor);
- if (seq !== self) return seq.optimize(compressor);
- }
- if (compressor.option("side_effects") && self.operator == "void") {
- e = e.drop_side_effect_free(compressor);
- if (e) {
- self.expression = e;
- return self;
- } else {
- return make_node(AST_Undefined, self).optimize(compressor);
- }
- }
- if (compressor.option("booleans")) {
- if (self.operator == "!" && e.is_truthy()) {
- return make_sequence(self, [ e, make_node(AST_False, self) ]).optimize(compressor);
- } else if (compressor.in_boolean_context()) switch (self.operator) {
- case "!":
- if (e instanceof AST_UnaryPrefix && e.operator == "!") {
- // !!foo => foo, if we're in boolean context
- return e.expression;
- }
- if (e instanceof AST_Binary) {
- self = best_of(compressor, self, e.negate(compressor, first_in_statement(compressor)));
- }
- break;
- case "typeof":
- // typeof always returns a non-empty string, thus it's
- // always true in booleans
- AST_Node.warn("Boolean expression always true [{file}:{line},{col}]", self.start);
- return (e instanceof AST_SymbolRef ? make_node(AST_True, self) : make_sequence(self, [
- e,
- make_node(AST_True, self)
- ])).optimize(compressor);
- }
- }
- if (self.operator == "-" && e instanceof AST_Infinity) e = e.transform(compressor);
- if (compressor.option("evaluate")
- && e instanceof AST_Binary
- && SIGN_OPS[self.operator]
- && MULTIPLICATIVE_OPS[e.operator]
- && (e.left.is_constant() || !e.right.has_side_effects(compressor))) {
- return make_node(AST_Binary, self, {
- operator: e.operator,
- left: make_node(AST_UnaryPrefix, e.left, {
- operator: self.operator,
- expression: e.left
- }),
- right: e.right
- });
- }
- // avoids infinite recursion of numerals
- return self.operator == "-" && (e instanceof AST_Number || e instanceof AST_Infinity)
- ? self : try_evaluate(compressor, self);
- });
-
- AST_Binary.DEFMETHOD("lift_sequences", function(compressor) {
- if (compressor.option("sequences")) {
- if (this.left instanceof AST_Sequence) {
- var x = this.left.expressions.slice();
- var e = this.clone();
- e.left = x.pop();
- x.push(e);
- return make_sequence(this, x).optimize(compressor);
- }
- if (this.right instanceof AST_Sequence && !this.left.has_side_effects(compressor)) {
- var assign = this.operator == "=" && this.left instanceof AST_SymbolRef;
- var x = this.right.expressions;
- var last = x.length - 1;
- for (var i = 0; i < last; i++) {
- if (!assign && x[i].has_side_effects(compressor)) break;
- }
- if (i == last) {
- x = x.slice();
- var e = this.clone();
- e.right = x.pop();
- x.push(e);
- return make_sequence(this, x).optimize(compressor);
- } else if (i > 0) {
- var e = this.clone();
- e.right = make_sequence(this.right, x.slice(i));
- x = x.slice(0, i);
- x.push(e);
- return make_sequence(this, x).optimize(compressor);
- }
- }
- }
- return this;
- });
-
- var indexFns = makePredicate("indexOf lastIndexOf");
- var commutativeOperators = makePredicate("== === != !== * & | ^");
- function is_object(node) {
- return node instanceof AST_Array
- || node instanceof AST_Lambda
- || node instanceof AST_Object;
- }
-
- OPT(AST_Binary, function(self, compressor) {
- function reversible() {
- return self.left.is_constant()
- || self.right.is_constant()
- || !self.left.has_side_effects(compressor)
- && !self.right.has_side_effects(compressor);
- }
- function reverse(op) {
- if (reversible()) {
- if (op) self.operator = op;
- var tmp = self.left;
- self.left = self.right;
- self.right = tmp;
- }
- }
- function swap_chain() {
- var rhs = self.right;
- self.left = make_node(AST_Binary, self, {
- operator: self.operator,
- left: self.left,
- right: rhs.left,
- start: self.left.start,
- end: rhs.left.end
- });
- self.right = rhs.right;
- self.left = self.left.transform(compressor);
- }
- if (commutativeOperators[self.operator]
- && self.right.is_constant()
- && !self.left.is_constant()
- && !(self.left instanceof AST_Binary
- && PRECEDENCE[self.left.operator] >= PRECEDENCE[self.operator])) {
- // if right is a constant, whatever side effects the
- // left side might have could not influence the
- // result. hence, force switch.
- reverse();
- }
- var seq = self.lift_sequences(compressor);
- if (seq !== self) return seq;
- if (compressor.option("assignments") && lazy_op[self.operator]) {
- var assign = self.right;
- // a || (a = x) => a = a || x
- // a && (a = x) => a = a && x
- if (self.left instanceof AST_SymbolRef
- && assign instanceof AST_Assign
- && assign.operator == "="
- && self.left.equivalent_to(assign.left)) {
- self.right = assign.right;
- assign.right = self;
- return assign;
- }
- }
- if (compressor.option("comparisons")) switch (self.operator) {
- case "===":
- case "!==":
- if (is_undefined(self.left, compressor) && self.right.is_defined(compressor)) {
- AST_Node.warn("Expression always defined [{file}:{line},{col}]", self.start);
- return make_sequence(self, [
- self.right,
- make_node(self.operator == "===" ? AST_False : AST_True, self)
- ]).optimize(compressor);
- }
- var is_strict_comparison = true;
- if ((self.left.is_string(compressor) && self.right.is_string(compressor)) ||
- (self.left.is_number(compressor) && self.right.is_number(compressor)) ||
- (self.left.is_boolean(compressor) && self.right.is_boolean(compressor)) ||
- self.left.equivalent_to(self.right)) {
- self.operator = self.operator.substr(0, 2);
- }
- // XXX: intentionally falling down to the next case
- case "==":
- case "!=":
- // void 0 == x => null == x
- if (!is_strict_comparison && is_undefined(self.left, compressor)) {
- self.left = make_node(AST_Null, self.left);
- }
- // "undefined" == typeof x => undefined === x
- else if (compressor.option("typeofs")
- && self.left instanceof AST_String
- && self.left.value == "undefined"
- && self.right instanceof AST_UnaryPrefix
- && self.right.operator == "typeof") {
- var expr = self.right.expression;
- if (expr instanceof AST_SymbolRef ? expr.is_declared(compressor)
- : !(expr instanceof AST_PropAccess && compressor.option("ie8"))) {
- self.right = expr;
- self.left = make_node(AST_Undefined, self.left).optimize(compressor);
- if (self.operator.length == 2) self.operator += "=";
- }
- }
- // obj !== obj => false
- else if (self.left instanceof AST_SymbolRef
- && self.right instanceof AST_SymbolRef
- && self.left.definition() === self.right.definition()
- && is_object(self.left.fixed_value())) {
- return make_node(self.operator[0] == "=" ? AST_True : AST_False, self);
- }
- break;
- case "&&":
- case "||":
- // void 0 !== x && null !== x => null != x
- // void 0 === x || null === x => null == x
- var lhs = self.left;
- if (lhs.operator == self.operator) {
- lhs = lhs.right;
- }
- if (lhs instanceof AST_Binary
- && lhs.operator == (self.operator == "&&" ? "!==" : "===")
- && self.right instanceof AST_Binary
- && lhs.operator == self.right.operator
- && (is_undefined(lhs.left, compressor) && self.right.left instanceof AST_Null
- || lhs.left instanceof AST_Null && is_undefined(self.right.left, compressor))
- && !lhs.right.has_side_effects(compressor)
- && lhs.right.equivalent_to(self.right.right)) {
- var combined = make_node(AST_Binary, self, {
- operator: lhs.operator.slice(0, -1),
- left: make_node(AST_Null, self),
- right: lhs.right
- });
- if (lhs !== self.left) {
- combined = make_node(AST_Binary, self, {
- operator: self.operator,
- left: self.left.left,
- right: combined
- });
- }
- return combined;
- }
- break;
- }
- var in_bool = compressor.option("booleans") && compressor.in_boolean_context();
- if (in_bool) switch (self.operator) {
- case "+":
- var ll = self.left.evaluate(compressor);
- var rr = self.right.evaluate(compressor);
- if (ll && typeof ll == "string") {
- AST_Node.warn("+ in boolean context always true [{file}:{line},{col}]", self.start);
- return make_sequence(self, [
- self.right,
- make_node(AST_True, self)
- ]).optimize(compressor);
- }
- if (rr && typeof rr == "string") {
- AST_Node.warn("+ in boolean context always true [{file}:{line},{col}]", self.start);
- return make_sequence(self, [
- self.left,
- make_node(AST_True, self)
- ]).optimize(compressor);
- }
- break;
- case "==":
- if (self.left instanceof AST_String && self.left.value == "" && self.right.is_string(compressor)) {
- return make_node(AST_UnaryPrefix, self, {
- operator: "!",
- expression: self.right
- }).optimize(compressor);
- }
- break;
- case "!=":
- if (self.left instanceof AST_String && self.left.value == "" && self.right.is_string(compressor)) {
- return self.right.optimize(compressor);
- }
- break;
- }
- var parent = compressor.parent();
- if (compressor.option("comparisons") && self.is_boolean(compressor)) {
- if (!(parent instanceof AST_Binary) || parent instanceof AST_Assign) {
- var negated = make_node(AST_UnaryPrefix, self, {
- operator: "!",
- expression: self.negate(compressor, first_in_statement(compressor))
- });
- self = best_of(compressor, self, negated);
- }
- switch (self.operator) {
- case ">": reverse("<"); break;
- case ">=": reverse("<="); break;
- }
- }
- // x && (y && z) => x && y && z
- // x || (y || z) => x || y || z
- if (compressor.option("conditionals")
- && lazy_op[self.operator]
- && self.right instanceof AST_Binary
- && self.operator == self.right.operator) {
- swap_chain();
- }
- if (compressor.option("strings") && self.operator == "+") {
- // "foo" + 42 + "" => "foo" + 42
- if (self.right instanceof AST_String
- && self.right.value == ""
- && self.left.is_string(compressor)) {
- return self.left.optimize(compressor);
- }
- // "" + ("foo" + 42) => "foo" + 42
- if (self.left instanceof AST_String
- && self.left.value == ""
- && self.right.is_string(compressor)) {
- return self.right.optimize(compressor);
- }
- // "" + 42 + "foo" => 42 + "foo"
- if (self.left instanceof AST_Binary
- && self.left.operator == "+"
- && self.left.left instanceof AST_String
- && self.left.left.value == ""
- && self.right.is_string(compressor)) {
- self.left = self.left.right;
- return self.optimize(compressor);
- }
- // "x" + (y + "z") => "x" + y + "z"
- // x + ("y" + z) => x + "y" + z
- if (self.right instanceof AST_Binary
- && self.operator == self.right.operator
- && (self.left.is_string(compressor) && self.right.is_string(compressor)
- || self.right.left.is_string(compressor)
- && (self.left.is_constant() || !self.right.right.has_side_effects(compressor)))) {
- swap_chain();
- }
- }
- if (compressor.option("evaluate")) {
- var associative = true;
- switch (self.operator) {
- case "&&":
- var ll = fuzzy_eval(self.left);
- if (!ll) {
- AST_Node.warn("Condition left of && always false [{file}:{line},{col}]", self.start);
- return maintain_this_binding(compressor, parent, compressor.self(), self.left).optimize(compressor);
- } else if (!(ll instanceof AST_Node)) {
- AST_Node.warn("Condition left of && always true [{file}:{line},{col}]", self.start);
- return make_sequence(self, [ self.left, self.right ]).optimize(compressor);
- }
- var rr = self.right.evaluate(compressor);
- if (!rr) {
- if (in_bool) {
- AST_Node.warn("Boolean && always false [{file}:{line},{col}]", self.start);
- return make_sequence(self, [
- self.left,
- make_node(AST_False, self)
- ]).optimize(compressor);
- } else self.falsy = true;
- } else if (!(rr instanceof AST_Node)) {
- if (in_bool || parent.operator == "&&" && parent.left === compressor.self()) {
- AST_Node.warn("Dropping side-effect-free && [{file}:{line},{col}]", self.start);
- return self.left.optimize(compressor);
- }
- }
- // (x || false) && y => x ? y : false
- if (self.left.operator == "||") {
- var lr = self.left.right.tail_node().evaluate(compressor);
- if (!lr) return make_node(AST_Conditional, self, {
- condition: self.left.left,
- consequent: self.right,
- alternative: self.left.right
- }).optimize(compressor);
- }
- break;
- case "||":
- var ll = fuzzy_eval(self.left);
- if (!ll) {
- AST_Node.warn("Condition left of || always false [{file}:{line},{col}]", self.start);
- return make_sequence(self, [ self.left, self.right ]).optimize(compressor);
- } else if (!(ll instanceof AST_Node)) {
- AST_Node.warn("Condition left of || always true [{file}:{line},{col}]", self.start);
- return maintain_this_binding(compressor, parent, compressor.self(), self.left).optimize(compressor);
- }
- var rr = self.right.evaluate(compressor);
- if (!rr) {
- if (in_bool || parent.operator == "||" && parent.left === compressor.self()) {
- AST_Node.warn("Dropping side-effect-free || [{file}:{line},{col}]", self.start);
- return self.left.optimize(compressor);
- }
- } else if (!(rr instanceof AST_Node)) {
- if (in_bool) {
- AST_Node.warn("Boolean || always true [{file}:{line},{col}]", self.start);
- return make_sequence(self, [
- self.left,
- make_node(AST_True, self)
- ]).optimize(compressor);
- } else self.truthy = true;
- }
- // x && true || y => x ? true : y
- if (self.left.operator == "&&") {
- var lr = self.left.right.is_truthy() || self.left.right.tail_node().evaluate(compressor);
- if (lr && !(lr instanceof AST_Node)) return make_node(AST_Conditional, self, {
- condition: self.left.left,
- consequent: self.left.right,
- alternative: self.right
- }).optimize(compressor);
- }
- break;
- case "+":
- // "foo" + ("bar" + x) => "foobar" + x
- if (self.left instanceof AST_Constant
- && self.right instanceof AST_Binary
- && self.right.operator == "+"
- && self.right.left instanceof AST_Constant
- && self.right.is_string(compressor)) {
- self = make_node(AST_Binary, self, {
- operator: "+",
- left: make_node(AST_String, self.left, {
- value: "" + self.left.value + self.right.left.value,
- start: self.left.start,
- end: self.right.left.end
- }),
- right: self.right.right
- });
- }
- // (x + "foo") + "bar" => x + "foobar"
- if (self.right instanceof AST_Constant
- && self.left instanceof AST_Binary
- && self.left.operator == "+"
- && self.left.right instanceof AST_Constant
- && self.left.is_string(compressor)) {
- self = make_node(AST_Binary, self, {
- operator: "+",
- left: self.left.left,
- right: make_node(AST_String, self.right, {
- value: "" + self.left.right.value + self.right.value,
- start: self.left.right.start,
- end: self.right.end
- })
- });
- }
- // (x + "foo") + ("bar" + y) => (x + "foobar") + y
- if (self.left instanceof AST_Binary
- && self.left.operator == "+"
- && self.left.is_string(compressor)
- && self.left.right instanceof AST_Constant
- && self.right instanceof AST_Binary
- && self.right.operator == "+"
- && self.right.left instanceof AST_Constant
- && self.right.is_string(compressor)) {
- self = make_node(AST_Binary, self, {
- operator: "+",
- left: make_node(AST_Binary, self.left, {
- operator: "+",
- left: self.left.left,
- right: make_node(AST_String, self.left.right, {
- value: "" + self.left.right.value + self.right.left.value,
- start: self.left.right.start,
- end: self.right.left.end
- })
- }),
- right: self.right.right
- });
- }
- // a + -b => a - b
- if (self.right instanceof AST_UnaryPrefix
- && self.right.operator == "-"
- && self.left.is_number(compressor)) {
- self = make_node(AST_Binary, self, {
- operator: "-",
- left: self.left,
- right: self.right.expression
- });
- break;
- }
- // -a + b => b - a
- if (self.left instanceof AST_UnaryPrefix
- && self.left.operator == "-"
- && reversible()
- && self.right.is_number(compressor)) {
- self = make_node(AST_Binary, self, {
- operator: "-",
- left: self.right,
- right: self.left.expression
- });
- break;
- }
- // (a + b) + 3 => 3 + (a + b)
- if (compressor.option("unsafe_math")
- && self.left instanceof AST_Binary
- && PRECEDENCE[self.left.operator] == PRECEDENCE[self.operator]
- && self.right.is_constant()
- && (self.right.is_boolean(compressor) || self.right.is_number(compressor))
- && self.left.is_number(compressor)
- && !self.left.right.is_constant()
- && (self.left.left.is_boolean(compressor) || self.left.left.is_number(compressor))) {
- self = make_node(AST_Binary, self, {
- operator: self.left.operator,
- left: make_node(AST_Binary, self, {
- operator: self.operator,
- left: self.right,
- right: self.left.left
- }),
- right: self.left.right
- });
- break;
- }
- case "-":
- // a - -b => a + b
- if (self.right instanceof AST_UnaryPrefix
- && self.right.operator == "-"
- && self.left.is_number(compressor)
- && self.right.expression.is_number(compressor)) {
- self = make_node(AST_Binary, self, {
- operator: "+",
- left: self.left,
- right: self.right.expression
- });
- break;
- }
- case "*":
- case "/":
- associative = compressor.option("unsafe_math");
- // +a - b => a - b
- // a - +b => a - b
- if (self.operator != "+") {
- if (self.left instanceof AST_UnaryPrefix && self.left.operator == "+") {
- self.left = self.left.expression;
- }
- if (self.right instanceof AST_UnaryPrefix && self.right.operator == "+") {
- self.right = self.right.expression;
- }
- }
- case "&":
- case "|":
- case "^":
- // a + +b => +b + a
- if (self.operator != "-"
- && self.operator != "/"
- && (self.left.is_boolean(compressor) || self.left.is_number(compressor))
- && (self.right.is_boolean(compressor) || self.right.is_number(compressor))
- && reversible()
- && !(self.left instanceof AST_Binary
- && self.left.operator != self.operator
- && PRECEDENCE[self.left.operator] >= PRECEDENCE[self.operator])) {
- var reversed = make_node(AST_Binary, self, {
- operator: self.operator,
- left: self.right,
- right: self.left
- });
- if (self.right instanceof AST_Constant
- && !(self.left instanceof AST_Constant)) {
- self = best_of(compressor, reversed, self);
- } else {
- self = best_of(compressor, self, reversed);
- }
- }
- if (!associative || !self.is_number(compressor)) break;
- // a + (b + c) => (a + b) + c
- if (self.right instanceof AST_Binary
- && self.right.operator != "%"
- && PRECEDENCE[self.right.operator] == PRECEDENCE[self.operator]
- && self.right.is_number(compressor)
- && (self.operator != "+"
- || self.right.left.is_boolean(compressor)
- || self.right.left.is_number(compressor))
- && (self.operator != "-" || !self.left.is_negative_zero())
- && (self.right.left.is_constant_expression()
- || !self.right.right.has_side_effects(compressor))) {
- self = make_node(AST_Binary, self, {
- operator: align(self.operator, self.right.operator),
- left: make_node(AST_Binary, self.left, {
- operator: self.operator,
- left: self.left,
- right: self.right.left,
- start: self.left.start,
- end: self.right.left.end
- }),
- right: self.right.right
- });
- if (self.operator == "+"
- && !self.right.is_boolean(compressor)
- && !self.right.is_number(compressor)) {
- self.right = make_node(AST_UnaryPrefix, self.right, {
- operator: "+",
- expression: self.right
- });
- }
- }
- // (2 * n) * 3 => 6 * n
- // (n + 2) + 3 => n + 5
- if (self.right instanceof AST_Constant
- && self.left instanceof AST_Binary
- && self.left.operator != "%"
- && PRECEDENCE[self.left.operator] == PRECEDENCE[self.operator]
- && self.left.is_number(compressor)) {
- if (self.left.left instanceof AST_Constant) {
- var lhs = make_binary(self.left, self.operator, self.left.left, self.right, self.left.left.start, self.right.end);
- self = make_binary(self, self.left.operator, lhs, self.left.right);
- } else if (self.left.right instanceof AST_Constant) {
- var rhs = make_binary(self.left, align(self.left.operator, self.operator), self.left.right, self.right, self.left.right.start, self.right.end);
- if (self.left.operator != "-"
- || !self.right.value
- || rhs.evaluate(compressor)
- || !self.left.left.is_negative_zero()) {
- self = make_binary(self, self.left.operator, self.left.left, rhs);
- }
- }
- }
- break;
- }
- if (self.left instanceof AST_Number && !self.right.is_constant()) switch (self.operator) {
- // 0 + n => n
- case "+":
- if (self.left.value == 0) {
- if (self.right.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
- operator: "+",
- expression: self.right
- }).optimize(compressor);
- if (self.right.is_number(compressor) && !self.right.is_negative_zero()) return self.right;
- }
- break;
- // 1 * n => n
- case "*":
- if (self.left.value == 1) {
- return self.right.is_number(compressor) ? self.right : make_node(AST_UnaryPrefix, self, {
- operator: "+",
- expression: self.right
- }).optimize(compressor);
- }
- break;
- }
- if (self.right instanceof AST_Number && !self.left.is_constant()) switch (self.operator) {
- // n + 0 => n
- case "+":
- if (self.right.value == 0) {
- if (self.left.is_boolean(compressor)) return make_node(AST_UnaryPrefix, self, {
- operator: "+",
- expression: self.left
- }).optimize(compressor);
- if (self.left.is_number(compressor) && !self.left.is_negative_zero()) return self.left;
- }
- break;
- // n - 0 => n
- case "-":
- if (self.right.value == 0) {
- return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
- operator: "+",
- expression: self.left
- }).optimize(compressor);
- }
- break;
- // n / 1 => n
- case "/":
- if (self.right.value == 1) {
- return self.left.is_number(compressor) ? self.left : make_node(AST_UnaryPrefix, self, {
- operator: "+",
- expression: self.left
- }).optimize(compressor);
- }
- break;
- }
- }
- if (compressor.option("typeofs")) switch (self.operator) {
- case "&&":
- mark_locally_defined(self.left, self.right, null, "&&");
- break;
- case "||":
- mark_locally_defined(self.left, null, self.right, "||");
- break;
- }
- if (compressor.option("unsafe")) {
- var indexRight = is_indexFn(self.right);
- if (in_bool
- && indexRight
- && (self.operator == "==" || self.operator == "!=")
- && self.left instanceof AST_Number
- && self.left.value == 0) {
- return (self.operator == "==" ? make_node(AST_UnaryPrefix, self, {
- operator: "!",
- expression: self.right
- }) : self.right).optimize(compressor);
- }
- var indexLeft = is_indexFn(self.left);
- if (compressor.option("comparisons") && is_indexOf_match_pattern()) {
- var node = make_node(AST_UnaryPrefix, self, {
- operator: "!",
- expression: make_node(AST_UnaryPrefix, self, {
- operator: "~",
- expression: indexLeft ? self.left : self.right
- })
- });
- switch (self.operator) {
- case "<":
- if (indexLeft) break;
- case "<=":
- case "!=":
- node = make_node(AST_UnaryPrefix, self, {
- operator: "!",
- expression: node
- });
- break;
- }
- return node.optimize(compressor);
- }
- }
- return try_evaluate(compressor, self);
-
- function align(ref, op) {
- switch (ref) {
- case "-":
- return op == "+" ? "-" : "+";
- case "/":
- return op == "*" ? "/" : "*";
- default:
- return op;
- }
- }
-
- function make_binary(orig, op, left, right, start, end) {
- if (op == "+") {
- if (!left.is_boolean(compressor) && !left.is_number(compressor)) {
- left = make_node(AST_UnaryPrefix, left, {
- operator: "+",
- expression: left
- });
- }
- if (!right.is_boolean(compressor) && !right.is_number(compressor)) {
- right = make_node(AST_UnaryPrefix, right, {
- operator: "+",
- expression: right
- });
- }
- }
- return make_node(AST_Binary, orig, {
- operator: op,
- left: left,
- right: right,
- start: start,
- end: end
- });
- }
-
- function fuzzy_eval(node) {
- if (node.truthy) return true;
- if (node.falsy) return false;
- if (node.is_truthy()) return true;
- return node.evaluate(compressor);
- }
-
- function is_indexFn(node) {
- return node instanceof AST_Call
- && node.expression instanceof AST_Dot
- && indexFns[node.expression.property];
- }
-
- function is_indexOf_match_pattern() {
- switch (self.operator) {
- case "<=":
- // 0 <= array.indexOf(string) => !!~array.indexOf(string)
- return indexRight && self.left instanceof AST_Number && self.left.value == 0;
- case "<":
- // array.indexOf(string) < 0 => !~array.indexOf(string)
- if (indexLeft && self.right instanceof AST_Number && self.right.value == 0) return true;
- // -1 < array.indexOf(string) => !!~array.indexOf(string)
- case "==":
- case "!=":
- // -1 == array.indexOf(string) => !~array.indexOf(string)
- // -1 != array.indexOf(string) => !!~array.indexOf(string)
- if (!indexRight) return false;
- return self.left instanceof AST_Number && self.left.value == -1
- || self.left instanceof AST_UnaryPrefix && self.left.operator == "-"
- && self.left.expression instanceof AST_Number && self.left.expression.value == 1;
- }
- }
- });
-
- function recursive_ref(compressor, def) {
- var node;
- for (var i = 0; node = compressor.parent(i); i++) {
- if (node instanceof AST_Lambda) {
- var name = node.name;
- if (name && name.definition() === def) break;
- }
- }
- return node;
- }
-
- OPT(AST_SymbolRef, function(self, compressor) {
- if (!compressor.option("ie8")
- && is_undeclared_ref(self)
- // testing against `self.scope.uses_with` is an optimization
- && !(self.scope.uses_with && compressor.find_parent(AST_With))) {
- switch (self.name) {
- case "undefined":
- return make_node(AST_Undefined, self).optimize(compressor);
- case "NaN":
- return make_node(AST_NaN, self).optimize(compressor);
- case "Infinity":
- return make_node(AST_Infinity, self).optimize(compressor);
- }
- }
- var parent = compressor.parent();
- if (compressor.option("reduce_vars") && is_lhs(compressor.self(), parent) !== compressor.self()) {
- var def = self.definition();
- var fixed = self.fixed_value();
- var single_use = def.single_use && !(parent instanceof AST_Call && parent.is_expr_pure(compressor));
- if (single_use) {
- if (fixed instanceof AST_Lambda) {
- if (def.scope !== self.scope
- && (!compressor.option("reduce_funcs") || def.escaped.depth == 1 || fixed.inlined)) {
- single_use = false;
- } else if (recursive_ref(compressor, def)) {
- single_use = false;
- } else if (def.scope !== self.scope || def.orig[0] instanceof AST_SymbolFunarg) {
- single_use = fixed.is_constant_expression(self.scope);
- if (single_use == "f") {
- var scope = self.scope;
- do if (scope instanceof AST_Defun || scope instanceof AST_Function) {
- scope.inlined = true;
- } while (scope = scope.parent_scope);
- }
- }
- if (single_use) fixed.parent_scope = self.scope;
- } else if (!fixed || !fixed.is_constant_expression()) {
- single_use = false;
- }
- }
- if (single_use) {
- def.single_use = false;
- fixed._squeezed = true;
- fixed.single_use = true;
- if (fixed instanceof AST_Defun) {
- fixed = make_node(AST_Function, fixed, fixed);
- fixed.name = make_node(AST_SymbolLambda, fixed.name, fixed.name);
- }
- if (fixed instanceof AST_Lambda) {
- var scope = self.scope;
- fixed.enclosed.forEach(function(def) {
- if (fixed.variables.has(def.name)) return;
- if (scope.var_names()[def.name]) return;
- scope.enclosed.push(def);
- scope.var_names()[def.name] = true;
- });
- }
- var value;
- if (def.recursive_refs > 0) {
- value = fixed.clone(true);
- var defun_def = value.name.definition();
- var lambda_def = value.variables.get(value.name.name);
- var name = lambda_def && lambda_def.orig[0];
- if (!(name instanceof AST_SymbolLambda)) {
- name = make_node(AST_SymbolLambda, value.name, value.name);
- name.scope = value;
- value.name = name;
- lambda_def = value.def_function(name);
- lambda_def.recursive_refs = def.recursive_refs;
- }
- value.walk(new TreeWalker(function(node) {
- if (!(node instanceof AST_SymbolRef)) return;
- var def = node.definition();
- if (def === defun_def) {
- node.thedef = lambda_def;
- lambda_def.references.push(node);
- } else {
- def.single_use = false;
- var fn = node.fixed_value();
- if (!(fn instanceof AST_Lambda)) return;
- if (!fn.name) return;
- var fn_def = fn.name.definition();
- if (fn_def.scope !== fn.name.scope) return;
- if (fixed.variables.get(fn.name.name) !== fn_def) return;
- fn.name = fn.name.clone();
- var value_def = value.variables.get(fn.name.name) || value.def_function(fn.name);
- node.thedef = value_def;
- value_def.references.push(node);
- }
- }));
- } else {
- value = fixed.optimize(compressor);
- }
- def.replaced++;
- return value;
- }
- if (fixed && def.should_replace === undefined) {
- var init;
- if (fixed instanceof AST_This) {
- if (!(def.orig[0] instanceof AST_SymbolFunarg) && same_scope(def)) {
- init = fixed;
- }
- } else {
- var ev = fixed.evaluate(compressor);
- if (ev !== fixed && (!(ev instanceof RegExp)
- || compressor.option("unsafe_regexp") && !def.cross_loop && same_scope(def))) {
- init = make_node_from_constant(ev, fixed);
- }
- }
- if (init) {
- var value_length = init.optimize(compressor).print_to_string().length;
- var fn;
- if (has_symbol_ref(fixed)) {
- fn = function() {
- var result = init.optimize(compressor);
- return result === init ? result.clone(true) : result;
- };
- } else {
- value_length = Math.min(value_length, fixed.print_to_string().length);
- fn = function() {
- var result = best_of_expression(init.optimize(compressor), fixed);
- return result === init || result === fixed ? result.clone(true) : result;
- };
- }
- var name_length = def.name.length;
- if (compressor.option("unused") && !compressor.exposed(def)) {
- name_length += (name_length + 2 + value_length) / (def.references.length - def.assignments);
- }
- var delta = value_length - Math.floor(name_length);
- def.should_replace = delta < compressor.eval_threshold ? fn : false;
- } else {
- def.should_replace = false;
- }
- }
- if (def.should_replace) {
- var value = def.should_replace();
- def.replaced++;
- return value;
- }
- }
- return self;
-
- function same_scope(def) {
- var scope = def.scope.resolve();
- return all(def.references, function(ref) {
- return scope === ref.scope.resolve();
- });
- }
-
- function has_symbol_ref(value) {
- var found;
- value.walk(new TreeWalker(function(node) {
- if (node instanceof AST_SymbolRef) found = true;
- if (found) return true;
- }));
- return found;
- }
- });
-
- function is_atomic(lhs, self) {
- return lhs instanceof AST_SymbolRef || lhs.TYPE === self.TYPE;
- }
-
- OPT(AST_Undefined, function(self, compressor) {
- if (compressor.option("unsafe_undefined")) {
- var undef = find_variable(compressor, "undefined");
- if (undef) {
- var ref = make_node(AST_SymbolRef, self, {
- name : "undefined",
- scope : undef.scope,
- thedef : undef
- });
- ref.is_undefined = true;
- return ref;
- }
- }
- var lhs = is_lhs(compressor.self(), compressor.parent());
- if (lhs && is_atomic(lhs, self)) return self;
- return make_node(AST_UnaryPrefix, self, {
- operator: "void",
- expression: make_node(AST_Number, self, {
- value: 0
- })
- });
- });
-
- OPT(AST_Infinity, function(self, compressor) {
- var lhs = is_lhs(compressor.self(), compressor.parent());
- if (lhs && is_atomic(lhs, self)) return self;
- if (compressor.option("keep_infinity")
- && !(lhs && !is_atomic(lhs, self))
- && !find_variable(compressor, "Infinity"))
- return self;
- return make_node(AST_Binary, self, {
- operator: "/",
- left: make_node(AST_Number, self, {
- value: 1
- }),
- right: make_node(AST_Number, self, {
- value: 0
- })
- });
- });
-
- OPT(AST_NaN, function(self, compressor) {
- var lhs = is_lhs(compressor.self(), compressor.parent());
- if (lhs && !is_atomic(lhs, self)
- || find_variable(compressor, "NaN")) {
- return make_node(AST_Binary, self, {
- operator: "/",
- left: make_node(AST_Number, self, {
- value: 0
- }),
- right: make_node(AST_Number, self, {
- value: 0
- })
- });
- }
- return self;
- });
-
- function is_reachable(self, defs) {
- var reachable = false;
- var find_ref = new TreeWalker(function(node) {
- if (reachable) return true;
- if (node instanceof AST_SymbolRef && member(node.definition(), defs)) {
- return reachable = true;
- }
- });
- var scan_scope = new TreeWalker(function(node) {
- if (reachable) return true;
- if (node instanceof AST_Scope && node !== self) {
- var parent = scan_scope.parent();
- if (parent instanceof AST_Call && parent.expression === node) return;
- node.walk(find_ref);
- return true;
- }
- });
- self.walk(scan_scope);
- return reachable;
- }
-
- var ASSIGN_OPS = makePredicate("+ - * / % >> << >>> | ^ &");
- var ASSIGN_OPS_COMMUTATIVE = makePredicate("* | ^ &");
- OPT(AST_Assign, function(self, compressor) {
- if (compressor.option("dead_code")) {
- if (self.left instanceof AST_PropAccess) {
- if (self.operator == "=") {
- var exp = self.left.expression;
- if (exp instanceof AST_Lambda
- || !compressor.has_directive("use strict")
- && exp instanceof AST_Constant
- && !exp.may_throw_on_access(compressor)) {
- return self.left instanceof AST_Dot ? self.right : make_sequence(self, [
- self.left.property,
- self.right
- ]).optimize(compressor);
- }
- }
- } else if (self.left instanceof AST_SymbolRef) {
- if (self.left.is_immutable()) return strip_assignment();
- var def = self.left.definition();
- var scope = def.scope.resolve();
- var local = scope === compressor.find_parent(AST_Lambda);
- var level = 0, node, parent = self;
- do {
- node = parent;
- parent = compressor.parent(level++);
- if (parent instanceof AST_Assign) {
- if (!(parent.left instanceof AST_SymbolRef)) continue;
- if (parent.left.definition() !== def) continue;
- if (in_try(level, parent)) break;
- def.fixed = false;
- return strip_assignment();
- } else if (parent instanceof AST_Exit) {
- if (!local) break;
- if (in_try(level, parent)) break;
- if (is_reachable(scope, [ def ])) break;
- def.fixed = false;
- return strip_assignment();
- }
- } while (parent instanceof AST_Binary && parent.right === node
- || parent instanceof AST_Sequence && parent.tail_node() === node
- || parent instanceof AST_UnaryPrefix);
- }
- }
- var seq = self.lift_sequences(compressor);
- if (seq !== self) return seq;
- if (!compressor.option("assignments")) return self;
- if (self.operator == "=" && self.left instanceof AST_SymbolRef && self.right instanceof AST_Binary) {
- // x = expr1 OP expr2
- if (self.right.left instanceof AST_SymbolRef
- && self.right.left.name == self.left.name
- && ASSIGN_OPS[self.right.operator]) {
- // x = x - 2 => x -= 2
- self.operator = self.right.operator + "=";
- self.right = self.right.right;
- }
- else if (self.right.right instanceof AST_SymbolRef
- && self.right.right.name == self.left.name
- && ASSIGN_OPS_COMMUTATIVE[self.right.operator]
- && !self.right.left.has_side_effects(compressor)) {
- // x = 2 & x => x &= 2
- self.operator = self.right.operator + "=";
- self.right = self.right.left;
- }
- }
- if ((self.operator == "-=" || self.operator == "+="
- && (self.left.is_boolean(compressor) || self.left.is_number(compressor)))
- && self.right instanceof AST_Number
- && self.right.value == 1) {
- var op = self.operator.slice(0, -1);
- return make_node(AST_UnaryPrefix, self, {
- operator: op + op,
- expression: self.left
- });
- }
- return self;
-
- function in_try(level, node) {
- var right = self.right;
- self.right = make_node(AST_Null, right);
- var may_throw = node.may_throw(compressor);
- self.right = right;
- var parent;
- while (parent = compressor.parent(level++)) {
- if (parent === scope) return false;
- if (parent instanceof AST_Try) {
- if (parent.bfinally) return true;
- if (may_throw && parent.bcatch) return true;
- }
- }
- }
-
- function strip_assignment() {
- return (self.operator != "=" ? make_node(AST_Binary, self, {
- operator: self.operator.slice(0, -1),
- left: self.left,
- right: self.right
- }) : maintain_this_binding(compressor, compressor.parent(), self, self.right)).optimize(compressor);
- }
- });
-
- OPT(AST_Conditional, function(self, compressor) {
- if (!compressor.option("conditionals")) return self;
- // This looks like lift_sequences(), should probably be under "sequences"
- if (self.condition instanceof AST_Sequence) {
- var expressions = self.condition.expressions.slice();
- self.condition = expressions.pop();
- expressions.push(self);
- return make_sequence(self, expressions);
- }
- var condition = self.condition.is_truthy() || self.condition.evaluate(compressor);
- if (!condition) {
- AST_Node.warn("Condition always false [{file}:{line},{col}]", self.start);
- return make_sequence(self, [ self.condition, self.alternative ]).optimize(compressor);
- } else if (!(condition instanceof AST_Node)) {
- AST_Node.warn("Condition always true [{file}:{line},{col}]", self.start);
- return make_sequence(self, [ self.condition, self.consequent ]).optimize(compressor);
- }
- var negated = condition.negate(compressor, first_in_statement(compressor));
- if (best_of(compressor, condition, negated) === negated) {
- self = make_node(AST_Conditional, self, {
- condition: negated,
- consequent: self.alternative,
- alternative: self.consequent
- });
- negated = condition;
- condition = self.condition;
- }
- var consequent = self.consequent;
- var alternative = self.alternative;
- // x ? x : y => x || y
- if (condition instanceof AST_SymbolRef
- && consequent instanceof AST_SymbolRef
- && condition.definition() === consequent.definition()) {
- return make_node(AST_Binary, self, {
- operator: "||",
- left: condition,
- right: alternative
- });
- }
- // if (foo) exp = something; else exp = something_else;
- // |
- // v
- // exp = foo ? something : something_else;
- var seq_tail = consequent.tail_node();
- if (seq_tail instanceof AST_Assign) {
- var is_eq = seq_tail.operator == "=";
- var alt_tail = is_eq ? alternative.tail_node() : alternative;
- if ((is_eq || consequent === seq_tail)
- && alt_tail instanceof AST_Assign
- && seq_tail.operator == alt_tail.operator
- && seq_tail.left.equivalent_to(alt_tail.left)
- && (is_eq && seq_tail.left instanceof AST_SymbolRef
- || !condition.has_side_effects(compressor)
- && can_shift_lhs_of_tail(consequent)
- && can_shift_lhs_of_tail(alternative))) {
- return make_node(AST_Assign, self, {
- operator: seq_tail.operator,
- left: seq_tail.left,
- right: make_node(AST_Conditional, self, {
- condition: condition,
- consequent: pop_lhs(consequent),
- alternative: pop_lhs(alternative)
- })
- });
- }
- }
- // x ? y : y => x, y
- if (consequent.equivalent_to(alternative)) return make_sequence(self, [
- condition,
- consequent
- ]).optimize(compressor);
- if (consequent instanceof AST_Call
- && alternative.TYPE === consequent.TYPE
- && consequent.args.length == alternative.args.length) {
- var arg_index = arg_diff();
- // x ? y(a) : z(a) => (x ? y : z)(a)
- if (arg_index == -1
- && !(consequent.expression instanceof AST_PropAccess)
- && !(alternative.expression instanceof AST_PropAccess)) {
- var node = consequent.clone();
- node.expression = make_node(AST_Conditional, self, {
- condition: condition,
- consequent: consequent.expression,
- alternative: alternative.expression
- });
- return node;
- }
- // x ? y(a) : y(b) => y(x ? a : b)
- if (arg_index >= 0
- && consequent.expression.equivalent_to(alternative.expression)
- && !condition.has_side_effects(compressor)
- && !consequent.expression.has_side_effects(compressor)) {
- var node = consequent.clone();
- node.args[arg_index] = make_node(AST_Conditional, self, {
- condition: condition,
- consequent: consequent.args[arg_index],
- alternative: alternative.args[arg_index]
- });
- return node;
- }
- }
- // x ? (y ? a : b) : b => x && y ? a : b
- if (consequent instanceof AST_Conditional
- && consequent.alternative.equivalent_to(alternative)) {
- return make_node(AST_Conditional, self, {
- condition: make_node(AST_Binary, self, {
- left: condition,
- operator: "&&",
- right: consequent.condition
- }),
- consequent: consequent.consequent,
- alternative: alternative
- });
- }
- // x ? (y ? a : b) : a => !x || y ? a : b
- if (consequent instanceof AST_Conditional
- && consequent.consequent.equivalent_to(alternative)) {
- return make_node(AST_Conditional, self, {
- condition: make_node(AST_Binary, self, {
- left: negated,
- operator: "||",
- right: consequent.condition
- }),
- consequent: alternative,
- alternative: consequent.alternative
- });
- }
- // x ? a : (y ? a : b) => x || y ? a : b
- if (alternative instanceof AST_Conditional
- && consequent.equivalent_to(alternative.consequent)) {
- return make_node(AST_Conditional, self, {
- condition: make_node(AST_Binary, self, {
- left: condition,
- operator: "||",
- right: alternative.condition
- }),
- consequent: consequent,
- alternative: alternative.alternative
- });
- }
- // x ? b : (y ? a : b) => !x && y ? a : b
- if (alternative instanceof AST_Conditional
- && consequent.equivalent_to(alternative.alternative)) {
- return make_node(AST_Conditional, self, {
- condition: make_node(AST_Binary, self, {
- left: negated,
- operator: "&&",
- right: alternative.condition
- }),
- consequent: alternative.consequent,
- alternative: consequent
- });
- }
- // x ? (a, c) : (b, c) => x ? a : b, c
- if ((consequent instanceof AST_Sequence || alternative instanceof AST_Sequence)
- && consequent.tail_node().equivalent_to(alternative.tail_node())) {
- return make_sequence(self, [
- make_node(AST_Conditional, self, {
- condition: condition,
- consequent: pop_seq(consequent),
- alternative: pop_seq(alternative)
- }),
- consequent.tail_node()
- ]).optimize(compressor);
- }
- // x ? y && a : a => (!x || y) && a
- if (consequent instanceof AST_Binary
- && consequent.operator == "&&"
- && consequent.right.equivalent_to(alternative)) {
- return make_node(AST_Binary, self, {
- operator: "&&",
- left: make_node(AST_Binary, self, {
- operator: "||",
- left: negated,
- right: consequent.left
- }),
- right: alternative
- }).optimize(compressor);
- }
- // x ? y || a : a => x && y || a
- if (consequent instanceof AST_Binary
- && consequent.operator == "||"
- && consequent.right.equivalent_to(alternative)) {
- return make_node(AST_Binary, self, {
- operator: "||",
- left: make_node(AST_Binary, self, {
- operator: "&&",
- left: condition,
- right: consequent.left
- }),
- right: alternative
- }).optimize(compressor);
- }
- // x ? a : y && a => (x || y) && a
- if (alternative instanceof AST_Binary
- && alternative.operator == "&&"
- && alternative.right.equivalent_to(consequent)) {
- return make_node(AST_Binary, self, {
- operator: "&&",
- left: make_node(AST_Binary, self, {
- operator: "||",
- left: condition,
- right: alternative.left
- }),
- right: consequent
- }).optimize(compressor);
- }
- // x ? a : y || a => !x && y || a
- if (alternative instanceof AST_Binary
- && alternative.operator == "||"
- && alternative.right.equivalent_to(consequent)) {
- return make_node(AST_Binary, self, {
- operator: "||",
- left: make_node(AST_Binary, self, {
- operator: "&&",
- left: negated,
- right: alternative.left
- }),
- right: consequent
- }).optimize(compressor);
- }
- var in_bool = compressor.option("booleans") && compressor.in_boolean_context();
- if (is_true(consequent)) {
- if (is_false(alternative)) {
- // c ? true : false => !!c
- return booleanize(condition);
- }
- // c ? true : x => !!c || x
- return make_node(AST_Binary, self, {
- operator: "||",
- left: booleanize(condition),
- right: alternative
- });
- }
- if (is_false(consequent)) {
- if (is_true(alternative)) {
- // c ? false : true => !c
- return booleanize(condition.negate(compressor));
- }
- // c ? false : x => !c && x
- return make_node(AST_Binary, self, {
- operator: "&&",
- left: booleanize(condition.negate(compressor)),
- right: alternative
- });
- }
- if (is_true(alternative)) {
- // c ? x : true => !c || x
- return make_node(AST_Binary, self, {
- operator: "||",
- left: booleanize(condition.negate(compressor)),
- right: consequent
- });
- }
- if (is_false(alternative)) {
- // c ? x : false => !!c && x
- return make_node(AST_Binary, self, {
- operator: "&&",
- left: booleanize(condition),
- right: consequent
- });
- }
- if (compressor.option("typeofs")) mark_locally_defined(condition, consequent, alternative);
- return self;
-
- function booleanize(node) {
- if (node.is_boolean(compressor)) return node;
- // !!expression
- return make_node(AST_UnaryPrefix, node, {
- operator: "!",
- expression: node.negate(compressor)
- });
- }
-
- // AST_True or !0
- function is_true(node) {
- return node instanceof AST_True
- || in_bool
- && node instanceof AST_Constant
- && node.value
- || (node instanceof AST_UnaryPrefix
- && node.operator == "!"
- && node.expression instanceof AST_Constant
- && !node.expression.value);
- }
- // AST_False or !1 or void 0
- function is_false(node) {
- return node instanceof AST_False
- || in_bool
- && (node instanceof AST_Constant
- && !node.value
- || node instanceof AST_UnaryPrefix
- && node.operator == "void"
- && !node.expression.has_side_effects(compressor))
- || (node instanceof AST_UnaryPrefix
- && node.operator == "!"
- && node.expression instanceof AST_Constant
- && node.expression.value);
- }
-
- function arg_diff() {
- var a = consequent.args;
- var b = alternative.args;
- for (var i = 0, len = a.length; i < len; i++) {
- if (!a[i].equivalent_to(b[i])) {
- for (var j = i + 1; j < len; j++) {
- if (!a[j].equivalent_to(b[j])) return -2;
- }
- return i;
- }
- }
- return -1;
- }
-
- function can_shift_lhs_of_tail(node) {
- return node === node.tail_node() || all(node.expressions.slice(0, -1), function(expr) {
- return !expr.has_side_effects(compressor);
- });
- }
-
- function pop_lhs(node) {
- if (!(node instanceof AST_Sequence)) return node.right;
- var exprs = node.expressions.slice();
- exprs.push(exprs.pop().right);
- return make_sequence(node, exprs);
- }
-
- function pop_seq(node) {
- if (!(node instanceof AST_Sequence)) return make_node(AST_Number, node, {
- value: 0
- });
- return make_sequence(node, node.expressions.slice(0, -1));
- }
- });
-
- OPT(AST_Boolean, function(self, compressor) {
- if (!compressor.option("booleans")) return self;
- if (compressor.in_boolean_context()) return make_node(AST_Number, self, {
- value: +self.value
- });
- var p = compressor.parent();
- if (p instanceof AST_Binary && (p.operator == "==" || p.operator == "!=")) {
- AST_Node.warn("Non-strict equality against boolean: {operator} {value} [{file}:{line},{col}]", {
- operator : p.operator,
- value : self.value,
- file : p.start.file,
- line : p.start.line,
- col : p.start.col,
- });
- return make_node(AST_Number, self, {
- value: +self.value
- });
- }
- return make_node(AST_UnaryPrefix, self, {
- operator: "!",
- expression: make_node(AST_Number, self, {
- value: 1 - self.value
- })
- });
- });
-
- function safe_to_flatten(value, compressor) {
- if (value instanceof AST_SymbolRef) {
- value = value.fixed_value();
- }
- if (!value) return false;
- return !(value instanceof AST_Lambda)
- || compressor.parent() instanceof AST_New
- || !value.contains_this();
- }
-
- OPT(AST_Sub, function(self, compressor) {
- if (compressor.option("sequences") && compressor.parent().TYPE != "Call") {
- var seq = lift_sequence_in_expression(self, compressor);
- if (seq !== self) return seq.optimize(compressor);
- }
- var expr = self.expression;
- var prop = self.property;
- if (compressor.option("properties")) {
- var key = prop.evaluate(compressor);
- if (key !== prop) {
- if (typeof key == "string") {
- if (key == "undefined") {
- key = undefined;
- } else {
- var value = parseFloat(key);
- if (value.toString() == key) {
- key = value;
- }
- }
- }
- prop = self.property = best_of_expression(prop, make_node_from_constant(key, prop).transform(compressor));
- var property = "" + key;
- if (is_identifier_string(property)
- && property.length <= prop.print_to_string().length + 1) {
- return make_node(AST_Dot, self, {
- expression: expr,
- property: property
- }).optimize(compressor);
- }
- }
- }
- var parent = compressor.parent();
- var def, fn, fn_parent;
- if (compressor.option("arguments")
- && expr instanceof AST_SymbolRef
- && is_arguments(def = expr.definition())
- && prop instanceof AST_Number
- && (fn = expr.scope) === find_lambda()) {
- var index = prop.value;
- if (parent instanceof AST_UnaryPrefix && parent.operator == "delete") {
- if (!def.deleted) def.deleted = [];
- def.deleted[index] = true;
- }
- var argname = fn.argnames[index];
- if (def.deleted && def.deleted[index]) {
- argname = null;
- } else if (argname && compressor.has_directive("use strict")) {
- var arg_def = argname.definition();
- if (!compressor.option("reduce_vars")
- || def.reassigned
- || arg_def.assignments
- || arg_def.orig.length > 1) {
- argname = null;
- }
- } else if (!argname && index < fn.argnames.length + 5 && compressor.drop_fargs(fn, fn_parent)) {
- while (index >= fn.argnames.length) {
- argname = make_node(AST_SymbolFunarg, fn, {
- name: fn.make_var_name("argument_" + fn.argnames.length),
- scope: fn
- });
- fn.argnames.push(argname);
- fn.enclosed.push(fn.def_variable(argname));
- }
- }
- if (argname && find_if(function(node) {
- return node.name === argname.name;
- }, fn.argnames) === argname) {
- def.reassigned = false;
- var sym = make_node(AST_SymbolRef, self, argname);
- sym.reference({});
- delete argname.__unused;
- return sym;
- }
- }
- if (is_lhs(compressor.self(), parent)) return self;
- if (key !== prop) {
- var sub = self.flatten_object(property, compressor);
- if (sub) {
- expr = self.expression = sub.expression;
- prop = self.property = sub.property;
- }
- }
- if (compressor.option("properties") && compressor.option("side_effects")
- && prop instanceof AST_Number && expr instanceof AST_Array) {
- var index = prop.value;
- var elements = expr.elements;
- var retValue = elements[index];
- if (safe_to_flatten(retValue, compressor)) {
- var flatten = true;
- var values = [];
- for (var i = elements.length; --i > index;) {
- var value = elements[i].drop_side_effect_free(compressor);
- if (value) {
- values.unshift(value);
- if (flatten && value.has_side_effects(compressor)) flatten = false;
- }
- }
- retValue = retValue instanceof AST_Hole ? make_node(AST_Undefined, retValue) : retValue;
- if (!flatten) values.unshift(retValue);
- while (--i >= 0) {
- var value = elements[i].drop_side_effect_free(compressor);
- if (value) values.unshift(value);
- else index--;
- }
- if (flatten) {
- values.push(retValue);
- return make_sequence(self, values).optimize(compressor);
- } else return make_node(AST_Sub, self, {
- expression: make_node(AST_Array, expr, {
- elements: values
- }),
- property: make_node(AST_Number, prop, {
- value: index
- })
- });
- }
- }
- return try_evaluate(compressor, self);
-
- function find_lambda() {
- var i = 0, p;
- while (p = compressor.parent(i++)) {
- if (p instanceof AST_Lambda) {
- fn_parent = compressor.parent(i);
- return p;
- }
- }
- }
- });
-
- AST_Scope.DEFMETHOD("contains_this", function() {
- var result;
- var self = this;
- self.walk(new TreeWalker(function(node) {
- if (result) return true;
- if (node instanceof AST_This) return result = true;
- if (node !== self && node instanceof AST_Scope) return true;
- }));
- return result;
- });
-
- AST_PropAccess.DEFMETHOD("flatten_object", function(key, compressor) {
- if (!compressor.option("properties")) return;
- var expr = this.expression;
- if (expr instanceof AST_Object) {
- var props = expr.properties;
- for (var i = props.length; --i >= 0;) {
- var prop = props[i];
- if ("" + prop.key == key) {
- if (!all(props, function(prop) {
- return prop instanceof AST_ObjectKeyVal;
- })) break;
- if (!safe_to_flatten(prop.value, compressor)) break;
- return make_node(AST_Sub, this, {
- expression: make_node(AST_Array, expr, {
- elements: props.map(function(prop) {
- return prop.value;
- })
- }),
- property: make_node(AST_Number, this, {
- value: i
- })
- });
- }
- }
- }
- });
-
- OPT(AST_Dot, function(self, compressor) {
- if (compressor.option("sequences") && compressor.parent().TYPE != "Call") {
- var seq = lift_sequence_in_expression(self, compressor);
- if (seq !== self) return seq.optimize(compressor);
- }
- if (self.property == "arguments" || self.property == "caller") {
- AST_Node.warn("Function.prototype.{prop} not supported [{file}:{line},{col}]", {
- prop: self.property,
- file: self.start.file,
- line: self.start.line,
- col: self.start.col
- });
- }
- if (is_lhs(compressor.self(), compressor.parent())) return self;
- if (compressor.option("unsafe_proto")
- && self.expression instanceof AST_Dot
- && self.expression.property == "prototype") {
- var exp = self.expression.expression;
- if (is_undeclared_ref(exp)) switch (exp.name) {
- case "Array":
- self.expression = make_node(AST_Array, self.expression, {
- elements: []
- });
- break;
- case "Function":
- self.expression = make_node(AST_Function, self.expression, {
- argnames: [],
- body: []
- });
- break;
- case "Number":
- self.expression = make_node(AST_Number, self.expression, {
- value: 0
- });
- break;
- case "Object":
- self.expression = make_node(AST_Object, self.expression, {
- properties: []
- });
- break;
- case "RegExp":
- self.expression = make_node(AST_RegExp, self.expression, {
- value: /t/
- });
- break;
- case "String":
- self.expression = make_node(AST_String, self.expression, {
- value: ""
- });
- break;
- }
- }
- var sub = self.flatten_object(self.property, compressor);
- if (sub) return sub.optimize(compressor);
- return try_evaluate(compressor, self);
- });
-
- OPT(AST_Object, function(self, compressor) {
- if (!compressor.option("objects") || compressor.has_directive("use strict")) return self;
- var keys = new Dictionary();
- var values = [];
- self.properties.forEach(function(prop) {
- if (typeof prop.key != "string") {
- flush();
- values.push(prop);
- return;
- }
- if (prop.value.has_side_effects(compressor)) {
- flush();
- }
- keys.add(prop.key, prop.value);
- });
- flush();
- if (self.properties.length != values.length) {
- return make_node(AST_Object, self, {
- properties: values
- });
- }
- return self;
-
- function flush() {
- keys.each(function(expressions, key) {
- values.push(make_node(AST_ObjectKeyVal, self, {
- key: key,
- value: make_sequence(self, expressions)
- }));
- });
- keys = new Dictionary();
- }
- });
-
- OPT(AST_Return, function(self, compressor) {
- if (self.value && is_undefined(self.value, compressor)) {
- self.value = null;
- }
- return self;
- });
-})(function(node, optimizer) {
- node.DEFMETHOD("optimize", function(compressor) {
- var self = this;
- if (self._optimized) return self;
- if (compressor.has_directive("use asm")) return self;
- var opt = optimizer(self, compressor);
- opt._optimized = true;
- return opt;
- });
-});
diff --git a/node_modules/uglify-js/lib/minify.js b/node_modules/uglify-js/lib/minify.js
deleted file mode 100644
index 72d9957..0000000
--- a/node_modules/uglify-js/lib/minify.js
+++ /dev/null
@@ -1,264 +0,0 @@
-"use strict";
-
-var to_ascii, to_base64;
-if (typeof Buffer == "undefined") {
- to_ascii = atob;
- to_base64 = btoa;
-} else if (typeof Buffer.alloc == "undefined") {
- to_ascii = function(b64) {
- return new Buffer(b64, "base64").toString();
- };
- to_base64 = function(str) {
- return new Buffer(str).toString("base64");
- };
-} else {
- to_ascii = function(b64) {
- return Buffer.from(b64, "base64").toString();
- };
- to_base64 = function(str) {
- return Buffer.from(str).toString("base64");
- };
-}
-
-function read_source_map(name, toplevel) {
- var comments = toplevel.end.comments_after;
- for (var i = comments.length; --i >= 0;) {
- var comment = comments[i];
- if (comment.type != "comment1") break;
- var match = /^# ([^\s=]+)=(\S+)\s*$/.exec(comment.value);
- if (!match) break;
- if (match[1] == "sourceMappingURL") {
- match = /^data:application\/json(;.*?)?;base64,(\S+)$/.exec(match[2]);
- if (!match) break;
- return to_ascii(match[2]);
- }
- }
- AST_Node.warn("inline source map not found: " + name);
-}
-
-function parse_source_map(content) {
- try {
- return JSON.parse(content);
- } catch (ex) {
- throw new Error("invalid input source map: " + content);
- }
-}
-
-function set_shorthand(name, options, keys) {
- if (options[name]) {
- keys.forEach(function(key) {
- if (options[key]) {
- if (typeof options[key] != "object") options[key] = {};
- if (!(name in options[key])) options[key][name] = options[name];
- }
- });
- }
-}
-
-function init_cache(cache) {
- if (!cache) return;
- if (!("props" in cache)) {
- cache.props = new Dictionary();
- } else if (!(cache.props instanceof Dictionary)) {
- cache.props = Dictionary.fromObject(cache.props);
- }
-}
-
-function to_json(cache) {
- return {
- props: cache.props.toObject()
- };
-}
-
-function minify(files, options) {
- try {
- options = defaults(options, {
- compress: {},
- enclose: false,
- ie8: false,
- keep_fnames: false,
- mangle: {},
- nameCache: null,
- output: {},
- parse: {},
- rename: undefined,
- sourceMap: false,
- timings: false,
- toplevel: false,
- warnings: false,
- wrap: false,
- }, true);
- var timings = options.timings && {
- start: Date.now()
- };
- if (options.rename === undefined) {
- options.rename = options.compress && options.mangle;
- }
- set_shorthand("ie8", options, [ "compress", "mangle", "output" ]);
- set_shorthand("keep_fnames", options, [ "compress", "mangle" ]);
- set_shorthand("toplevel", options, [ "compress", "mangle" ]);
- var quoted_props;
- if (options.mangle) {
- options.mangle = defaults(options.mangle, {
- cache: options.nameCache && (options.nameCache.vars || {}),
- eval: false,
- ie8: false,
- keep_fnames: false,
- properties: false,
- reserved: [],
- toplevel: false,
- }, true);
- if (options.mangle.properties) {
- if (typeof options.mangle.properties != "object") {
- options.mangle.properties = {};
- }
- if (options.mangle.properties.keep_quoted) {
- quoted_props = options.mangle.properties.reserved;
- if (!Array.isArray(quoted_props)) quoted_props = [];
- options.mangle.properties.reserved = quoted_props;
- }
- if (options.nameCache && !("cache" in options.mangle.properties)) {
- options.mangle.properties.cache = options.nameCache.props || {};
- }
- }
- init_cache(options.mangle.cache);
- init_cache(options.mangle.properties.cache);
- }
- if (options.sourceMap) {
- options.sourceMap = defaults(options.sourceMap, {
- content: null,
- filename: null,
- includeSources: false,
- root: null,
- url: null,
- }, true);
- }
- var warnings = [];
- if (options.warnings) AST_Node.log_function(function(warning) {
- warnings.push(warning);
- }, options.warnings == "verbose");
- if (timings) timings.parse = Date.now();
- var source_maps, toplevel;
- if (files instanceof AST_Toplevel) {
- toplevel = files;
- } else {
- if (typeof files == "string") {
- files = [ files ];
- }
- options.parse = options.parse || {};
- options.parse.toplevel = null;
- var source_map_content = options.sourceMap && options.sourceMap.content;
- if (typeof source_map_content == "string" && source_map_content != "inline") {
- source_map_content = parse_source_map(source_map_content);
- }
- source_maps = source_map_content && Object.create(null);
- for (var name in files) if (HOP(files, name)) {
- options.parse.filename = name;
- options.parse.toplevel = toplevel = parse(files[name], options.parse);
- if (source_maps) {
- if (source_map_content == "inline") {
- var inlined_content = read_source_map(name, toplevel);
- if (inlined_content) {
- source_maps[name] = parse_source_map(inlined_content);
- }
- } else {
- source_maps[name] = source_map_content;
- }
- }
- }
- }
- if (quoted_props) {
- reserve_quoted_keys(toplevel, quoted_props);
- }
- [ "enclose", "wrap" ].forEach(function(action) {
- var option = options[action];
- if (!option) return;
- var orig = toplevel.print_to_string().slice(0, -1);
- toplevel = toplevel[action](option);
- files[toplevel.start.file] = toplevel.print_to_string().replace(orig, "");
- });
- if (timings) timings.rename = Date.now();
- if (options.rename) {
- toplevel.figure_out_scope(options.mangle);
- toplevel.expand_names(options.mangle);
- }
- if (timings) timings.compress = Date.now();
- if (options.compress) toplevel = new Compressor(options.compress).compress(toplevel);
- if (timings) timings.scope = Date.now();
- if (options.mangle) toplevel.figure_out_scope(options.mangle);
- if (timings) timings.mangle = Date.now();
- if (options.mangle) {
- toplevel.compute_char_frequency(options.mangle);
- toplevel.mangle_names(options.mangle);
- }
- if (timings) timings.properties = Date.now();
- if (options.mangle && options.mangle.properties) {
- toplevel = mangle_properties(toplevel, options.mangle.properties);
- }
- if (timings) timings.output = Date.now();
- var result = {};
- if (options.output.ast) {
- result.ast = toplevel;
- }
- if (!HOP(options.output, "code") || options.output.code) {
- if (options.sourceMap) {
- options.output.source_map = SourceMap({
- file: options.sourceMap.filename,
- orig: source_maps,
- root: options.sourceMap.root
- });
- if (options.sourceMap.includeSources) {
- if (files instanceof AST_Toplevel) {
- throw new Error("original source content unavailable");
- } else for (var name in files) if (HOP(files, name)) {
- options.output.source_map.get().setSourceContent(name, files[name]);
- }
- } else {
- options.output.source_map.get()._sourcesContents = null;
- }
- }
- delete options.output.ast;
- delete options.output.code;
- var stream = OutputStream(options.output);
- toplevel.print(stream);
- result.code = stream.get();
- if (options.sourceMap) {
- result.map = options.output.source_map.toString();
- var url = options.sourceMap.url;
- if (url) {
- result.code = result.code.replace(/\n\/\/# sourceMappingURL=\S+\s*$/, "");
- if (url == "inline") {
- result.code += "\n//# sourceMappingURL=data:application/json;charset=utf-8;base64," + to_base64(result.map);
- } else {
- result.code += "\n//# sourceMappingURL=" + url;
- }
- }
- }
- }
- if (options.nameCache && options.mangle) {
- if (options.mangle.cache) options.nameCache.vars = to_json(options.mangle.cache);
- if (options.mangle.properties && options.mangle.properties.cache) {
- options.nameCache.props = to_json(options.mangle.properties.cache);
- }
- }
- if (timings) {
- timings.end = Date.now();
- result.timings = {
- parse: 1e-3 * (timings.rename - timings.parse),
- rename: 1e-3 * (timings.compress - timings.rename),
- compress: 1e-3 * (timings.scope - timings.compress),
- scope: 1e-3 * (timings.mangle - timings.scope),
- mangle: 1e-3 * (timings.properties - timings.mangle),
- properties: 1e-3 * (timings.output - timings.properties),
- output: 1e-3 * (timings.end - timings.output),
- total: 1e-3 * (timings.end - timings.start)
- };
- }
- if (warnings.length) {
- result.warnings = warnings;
- }
- return result;
- } catch (ex) {
- return { error: ex };
- }
-}
diff --git a/node_modules/uglify-js/lib/mozilla-ast.js b/node_modules/uglify-js/lib/mozilla-ast.js
deleted file mode 100644
index b6fb29b..0000000
--- a/node_modules/uglify-js/lib/mozilla-ast.js
+++ /dev/null
@@ -1,629 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-(function() {
- function normalize_directives(body) {
- var in_directive = true;
- for (var i = 0; i < body.length; i++) {
- if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) {
- body[i] = new AST_Directive({
- start: body[i].start,
- end: body[i].end,
- value: body[i].body.value
- });
- } else if (in_directive && !(body[i] instanceof AST_Statement && body[i].body instanceof AST_String)) {
- in_directive = false;
- }
- }
- return body;
- }
-
- var MOZ_TO_ME = {
- Program: function(M) {
- return new AST_Toplevel({
- start: my_start_token(M),
- end: my_end_token(M),
- body: normalize_directives(M.body.map(from_moz))
- });
- },
- FunctionDeclaration: function(M) {
- return new AST_Defun({
- start: my_start_token(M),
- end: my_end_token(M),
- name: from_moz(M.id),
- argnames: M.params.map(from_moz),
- body: normalize_directives(from_moz(M.body).body)
- });
- },
- FunctionExpression: function(M) {
- return new AST_Function({
- start: my_start_token(M),
- end: my_end_token(M),
- name: from_moz(M.id),
- argnames: M.params.map(from_moz),
- body: normalize_directives(from_moz(M.body).body)
- });
- },
- ExpressionStatement: function(M) {
- return new AST_SimpleStatement({
- start: my_start_token(M),
- end: my_end_token(M),
- body: from_moz(M.expression)
- });
- },
- TryStatement: function(M) {
- var handlers = M.handlers || [M.handler];
- if (handlers.length > 1 || M.guardedHandlers && M.guardedHandlers.length) {
- throw new Error("Multiple catch clauses are not supported.");
- }
- return new AST_Try({
- start : my_start_token(M),
- end : my_end_token(M),
- body : from_moz(M.block).body,
- bcatch : from_moz(handlers[0]),
- bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null
- });
- },
- Property: function(M) {
- var key = M.key;
- var args = {
- start : my_start_token(key),
- end : my_end_token(M.value),
- key : key.type == "Identifier" ? key.name : key.value,
- value : from_moz(M.value)
- };
- if (M.kind == "init") return new AST_ObjectKeyVal(args);
- args.key = new AST_SymbolAccessor({
- name: args.key
- });
- args.value = new AST_Accessor(args.value);
- if (M.kind == "get") return new AST_ObjectGetter(args);
- if (M.kind == "set") return new AST_ObjectSetter(args);
- },
- ArrayExpression: function(M) {
- return new AST_Array({
- start : my_start_token(M),
- end : my_end_token(M),
- elements : M.elements.map(function(elem) {
- return elem === null ? new AST_Hole() : from_moz(elem);
- })
- });
- },
- ObjectExpression: function(M) {
- return new AST_Object({
- start : my_start_token(M),
- end : my_end_token(M),
- properties : M.properties.map(function(prop) {
- prop.type = "Property";
- return from_moz(prop)
- })
- });
- },
- SequenceExpression: function(M) {
- return new AST_Sequence({
- start : my_start_token(M),
- end : my_end_token(M),
- expressions: M.expressions.map(from_moz)
- });
- },
- MemberExpression: function(M) {
- return new (M.computed ? AST_Sub : AST_Dot)({
- start : my_start_token(M),
- end : my_end_token(M),
- property : M.computed ? from_moz(M.property) : M.property.name,
- expression : from_moz(M.object)
- });
- },
- SwitchCase: function(M) {
- return new (M.test ? AST_Case : AST_Default)({
- start : my_start_token(M),
- end : my_end_token(M),
- expression : from_moz(M.test),
- body : M.consequent.map(from_moz)
- });
- },
- VariableDeclaration: function(M) {
- return new AST_Var({
- start : my_start_token(M),
- end : my_end_token(M),
- definitions : M.declarations.map(from_moz)
- });
- },
- Literal: function(M) {
- var val = M.value, args = {
- start : my_start_token(M),
- end : my_end_token(M)
- };
- if (val === null) return new AST_Null(args);
- var rx = M.regex;
- if (rx && rx.pattern) {
- // RegExpLiteral as per ESTree AST spec
- args.value = new RegExp(rx.pattern, rx.flags);
- args.value.raw_source = rx.pattern;
- return new AST_RegExp(args);
- } else if (rx) {
- // support legacy RegExp
- args.value = M.regex && M.raw ? M.raw : val;
- return new AST_RegExp(args);
- }
- switch (typeof val) {
- case "string":
- args.value = val;
- return new AST_String(args);
- case "number":
- args.value = val;
- return new AST_Number(args);
- case "boolean":
- return new (val ? AST_True : AST_False)(args);
- }
- },
- Identifier: function(M) {
- var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];
- return new ( p.type == "LabeledStatement" ? AST_Label
- : p.type == "VariableDeclarator" && p.id === M ? AST_SymbolVar
- : p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg)
- : p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg)
- : p.type == "CatchClause" ? AST_SymbolCatch
- : p.type == "BreakStatement" || p.type == "ContinueStatement" ? AST_LabelRef
- : AST_SymbolRef)({
- start : my_start_token(M),
- end : my_end_token(M),
- name : M.name
- });
- }
- };
-
- MOZ_TO_ME.UpdateExpression =
- MOZ_TO_ME.UnaryExpression = function To_Moz_Unary(M) {
- var prefix = "prefix" in M ? M.prefix
- : M.type == "UnaryExpression" ? true : false;
- return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({
- start : my_start_token(M),
- end : my_end_token(M),
- operator : M.operator,
- expression : from_moz(M.argument)
- });
- };
-
- map("EmptyStatement", AST_EmptyStatement);
- map("BlockStatement", AST_BlockStatement, "body@body");
- map("IfStatement", AST_If, "test>condition, consequent>body, alternate>alternative");
- map("LabeledStatement", AST_LabeledStatement, "label>label, body>body");
- map("BreakStatement", AST_Break, "label>label");
- map("ContinueStatement", AST_Continue, "label>label");
- map("WithStatement", AST_With, "object>expression, body>body");
- map("SwitchStatement", AST_Switch, "discriminant>expression, cases@body");
- map("ReturnStatement", AST_Return, "argument>value");
- map("ThrowStatement", AST_Throw, "argument>value");
- map("WhileStatement", AST_While, "test>condition, body>body");
- map("DoWhileStatement", AST_Do, "test>condition, body>body");
- map("ForStatement", AST_For, "init>init, test>condition, update>step, body>body");
- map("ForInStatement", AST_ForIn, "left>init, right>object, body>body");
- map("DebuggerStatement", AST_Debugger);
- map("VariableDeclarator", AST_VarDef, "id>name, init>value");
- map("CatchClause", AST_Catch, "param>argname, body%body");
-
- map("ThisExpression", AST_This);
- map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right");
- map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right");
- map("AssignmentExpression", AST_Assign, "operator=operator, left>left, right>right");
- map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative");
- map("NewExpression", AST_New, "callee>expression, arguments@args");
- map("CallExpression", AST_Call, "callee>expression, arguments@args");
-
- def_to_moz(AST_Toplevel, function To_Moz_Program(M) {
- return to_moz_scope("Program", M);
- });
-
- def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {
- return {
- type: "FunctionDeclaration",
- id: to_moz(M.name),
- params: M.argnames.map(to_moz),
- body: to_moz_scope("BlockStatement", M)
- }
- });
-
- def_to_moz(AST_Function, function To_Moz_FunctionExpression(M) {
- return {
- type: "FunctionExpression",
- id: to_moz(M.name),
- params: M.argnames.map(to_moz),
- body: to_moz_scope("BlockStatement", M)
- }
- });
-
- def_to_moz(AST_Directive, function To_Moz_Directive(M) {
- return {
- type: "ExpressionStatement",
- expression: {
- type: "Literal",
- value: M.value
- }
- };
- });
-
- def_to_moz(AST_SimpleStatement, function To_Moz_ExpressionStatement(M) {
- return {
- type: "ExpressionStatement",
- expression: to_moz(M.body)
- };
- });
-
- def_to_moz(AST_SwitchBranch, function To_Moz_SwitchCase(M) {
- return {
- type: "SwitchCase",
- test: to_moz(M.expression),
- consequent: M.body.map(to_moz)
- };
- });
-
- def_to_moz(AST_Try, function To_Moz_TryStatement(M) {
- return {
- type: "TryStatement",
- block: to_moz_block(M),
- handler: to_moz(M.bcatch),
- guardedHandlers: [],
- finalizer: to_moz(M.bfinally)
- };
- });
-
- def_to_moz(AST_Catch, function To_Moz_CatchClause(M) {
- return {
- type: "CatchClause",
- param: to_moz(M.argname),
- guard: null,
- body: to_moz_block(M)
- };
- });
-
- def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) {
- return {
- type: "VariableDeclaration",
- kind: "var",
- declarations: M.definitions.map(to_moz)
- };
- });
-
- def_to_moz(AST_Sequence, function To_Moz_SequenceExpression(M) {
- return {
- type: "SequenceExpression",
- expressions: M.expressions.map(to_moz)
- };
- });
-
- def_to_moz(AST_PropAccess, function To_Moz_MemberExpression(M) {
- var isComputed = M instanceof AST_Sub;
- return {
- type: "MemberExpression",
- object: to_moz(M.expression),
- computed: isComputed,
- property: isComputed ? to_moz(M.property) : {type: "Identifier", name: M.property}
- };
- });
-
- def_to_moz(AST_Unary, function To_Moz_Unary(M) {
- return {
- type: M.operator == "++" || M.operator == "--" ? "UpdateExpression" : "UnaryExpression",
- operator: M.operator,
- prefix: M instanceof AST_UnaryPrefix,
- argument: to_moz(M.expression)
- };
- });
-
- def_to_moz(AST_Binary, function To_Moz_BinaryExpression(M) {
- return {
- type: M.operator == "&&" || M.operator == "||" ? "LogicalExpression" : "BinaryExpression",
- left: to_moz(M.left),
- operator: M.operator,
- right: to_moz(M.right)
- };
- });
-
- def_to_moz(AST_Array, function To_Moz_ArrayExpression(M) {
- return {
- type: "ArrayExpression",
- elements: M.elements.map(to_moz)
- };
- });
-
- def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) {
- return {
- type: "ObjectExpression",
- properties: M.properties.map(to_moz)
- };
- });
-
- def_to_moz(AST_ObjectProperty, function To_Moz_Property(M) {
- var key = {
- type: "Literal",
- value: M.key instanceof AST_SymbolAccessor ? M.key.name : M.key
- };
- var kind;
- if (M instanceof AST_ObjectKeyVal) {
- kind = "init";
- } else
- if (M instanceof AST_ObjectGetter) {
- kind = "get";
- } else
- if (M instanceof AST_ObjectSetter) {
- kind = "set";
- }
- return {
- type: "Property",
- kind: kind,
- key: key,
- value: to_moz(M.value)
- };
- });
-
- def_to_moz(AST_Symbol, function To_Moz_Identifier(M) {
- var def = M.definition();
- return {
- type: "Identifier",
- name: def && def.mangled_name || M.name
- };
- });
-
- def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) {
- var flags = M.value.toString().match(/[gimuy]*$/)[0];
- var value = "/" + M.value.raw_source + "/" + flags;
- return {
- type: "Literal",
- value: value,
- raw: value,
- regex: {
- pattern: M.value.raw_source,
- flags: flags
- }
- };
- });
-
- def_to_moz(AST_Constant, function To_Moz_Literal(M) {
- var value = M.value;
- if (typeof value === 'number' && (value < 0 || (value === 0 && 1 / value < 0))) {
- return {
- type: "UnaryExpression",
- operator: "-",
- prefix: true,
- argument: {
- type: "Literal",
- value: -value,
- raw: M.start.raw
- }
- };
- }
- return {
- type: "Literal",
- value: value,
- raw: M.start.raw
- };
- });
-
- def_to_moz(AST_Atom, function To_Moz_Atom(M) {
- return {
- type: "Identifier",
- name: String(M.value)
- };
- });
-
- AST_Boolean.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast);
- AST_Null.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast);
- AST_Hole.DEFMETHOD("to_mozilla_ast", function To_Moz_ArrayHole() { return null });
-
- AST_Block.DEFMETHOD("to_mozilla_ast", AST_BlockStatement.prototype.to_mozilla_ast);
- AST_Lambda.DEFMETHOD("to_mozilla_ast", AST_Function.prototype.to_mozilla_ast);
-
- /* -----[ tools ]----- */
-
- function raw_token(moznode) {
- if (moznode.type == "Literal") {
- return moznode.raw != null ? moznode.raw : moznode.value + "";
- }
- }
-
- function my_start_token(moznode) {
- var loc = moznode.loc, start = loc && loc.start;
- var range = moznode.range;
- return new AST_Token({
- file : loc && loc.source,
- line : start && start.line,
- col : start && start.column,
- pos : range ? range[0] : moznode.start,
- endline : start && start.line,
- endcol : start && start.column,
- endpos : range ? range[0] : moznode.start,
- raw : raw_token(moznode),
- });
- }
-
- function my_end_token(moznode) {
- var loc = moznode.loc, end = loc && loc.end;
- var range = moznode.range;
- return new AST_Token({
- file : loc && loc.source,
- line : end && end.line,
- col : end && end.column,
- pos : range ? range[1] : moznode.end,
- endline : end && end.line,
- endcol : end && end.column,
- endpos : range ? range[1] : moznode.end,
- raw : raw_token(moznode),
- });
- }
-
- function map(moztype, mytype, propmap) {
- var moz_to_me = "function From_Moz_" + moztype + "(M){\n";
- moz_to_me += "return new U2." + mytype.name + "({\n" +
- "start: my_start_token(M),\n" +
- "end: my_end_token(M)";
-
- var me_to_moz = "function To_Moz_" + moztype + "(M){\n";
- me_to_moz += "return {\n" +
- "type: " + JSON.stringify(moztype);
-
- if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop) {
- var m = /([a-z0-9$_]+)(=|@|>|%)([a-z0-9$_]+)/i.exec(prop);
- if (!m) throw new Error("Can't understand property map: " + prop);
- var moz = m[1], how = m[2], my = m[3];
- moz_to_me += ",\n" + my + ": ";
- me_to_moz += ",\n" + moz + ": ";
- switch (how) {
- case "@":
- moz_to_me += "M." + moz + ".map(from_moz)";
- me_to_moz += "M." + my + ".map(to_moz)";
- break;
- case ">":
- moz_to_me += "from_moz(M." + moz + ")";
- me_to_moz += "to_moz(M." + my + ")";
- break;
- case "=":
- moz_to_me += "M." + moz;
- me_to_moz += "M." + my;
- break;
- case "%":
- moz_to_me += "from_moz(M." + moz + ").body";
- me_to_moz += "to_moz_block(M)";
- break;
- default:
- throw new Error("Can't understand operator in propmap: " + prop);
- }
- });
-
- moz_to_me += "\n})\n}";
- me_to_moz += "\n}\n}";
-
- //moz_to_me = parse(moz_to_me).print_to_string({ beautify: true });
- //me_to_moz = parse(me_to_moz).print_to_string({ beautify: true });
- //console.log(moz_to_me);
-
- moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")(
- exports, my_start_token, my_end_token, from_moz
- );
- me_to_moz = new Function("to_moz", "to_moz_block", "to_moz_scope", "return(" + me_to_moz + ")")(
- to_moz, to_moz_block, to_moz_scope
- );
- MOZ_TO_ME[moztype] = moz_to_me;
- def_to_moz(mytype, me_to_moz);
- }
-
- var FROM_MOZ_STACK = null;
-
- function from_moz(node) {
- FROM_MOZ_STACK.push(node);
- var ret = node != null ? MOZ_TO_ME[node.type](node) : null;
- FROM_MOZ_STACK.pop();
- return ret;
- }
-
- AST_Node.from_mozilla_ast = function(node) {
- var save_stack = FROM_MOZ_STACK;
- FROM_MOZ_STACK = [];
- var ast = from_moz(node);
- FROM_MOZ_STACK = save_stack;
- ast.walk(new TreeWalker(function(node) {
- if (node instanceof AST_LabelRef) {
- for (var level = 0, parent; parent = this.parent(level); level++) {
- if (parent instanceof AST_Scope) break;
- if (parent instanceof AST_LabeledStatement && parent.label.name == node.name) {
- node.thedef = parent.label;
- break;
- }
- }
- if (!node.thedef) {
- var s = node.start;
- js_error("Undefined label " + node.name, s.file, s.line, s.col, s.pos);
- }
- }
- }));
- return ast;
- };
-
- function set_moz_loc(mynode, moznode, myparent) {
- var start = mynode.start;
- var end = mynode.end;
- if (start.pos != null && end.endpos != null) {
- moznode.range = [start.pos, end.endpos];
- }
- if (start.line) {
- moznode.loc = {
- start: {line: start.line, column: start.col},
- end: end.endline ? {line: end.endline, column: end.endcol} : null
- };
- if (start.file) {
- moznode.loc.source = start.file;
- }
- }
- return moznode;
- }
-
- function def_to_moz(mytype, handler) {
- mytype.DEFMETHOD("to_mozilla_ast", function() {
- return set_moz_loc(this, handler(this));
- });
- }
-
- function to_moz(node) {
- return node != null ? node.to_mozilla_ast() : null;
- }
-
- function to_moz_block(node) {
- return {
- type: "BlockStatement",
- body: node.body.map(to_moz)
- };
- }
-
- function to_moz_scope(type, node) {
- var body = node.body.map(to_moz);
- if (node.body[0] instanceof AST_SimpleStatement && node.body[0].body instanceof AST_String) {
- body.unshift(to_moz(new AST_EmptyStatement(node.body[0])));
- }
- return {
- type: type,
- body: body
- };
- }
-})();
diff --git a/node_modules/uglify-js/lib/output.js b/node_modules/uglify-js/lib/output.js
deleted file mode 100644
index a63671c..0000000
--- a/node_modules/uglify-js/lib/output.js
+++ /dev/null
@@ -1,1501 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-function is_some_comments(comment) {
- // multiline comment
- return comment.type == "comment2" && /@preserve|@license|@cc_on/i.test(comment.value);
-}
-
-function OutputStream(options) {
-
- var readonly = !options;
- options = defaults(options, {
- ascii_only : false,
- beautify : false,
- braces : false,
- comments : false,
- ie8 : false,
- indent_level : 4,
- indent_start : 0,
- inline_script : true,
- keep_quoted_props: false,
- max_line_len : false,
- preamble : null,
- preserve_line : false,
- quote_keys : false,
- quote_style : 0,
- semicolons : true,
- shebang : true,
- source_map : null,
- webkit : false,
- width : 80,
- wrap_iife : false,
- }, true);
-
- // Convert comment option to RegExp if neccessary and set up comments filter
- var comment_filter = return_false; // Default case, throw all comments away
- if (options.comments) {
- var comments = options.comments;
- if (typeof options.comments === "string" && /^\/.*\/[a-zA-Z]*$/.test(options.comments)) {
- var regex_pos = options.comments.lastIndexOf("/");
- comments = new RegExp(
- options.comments.substr(1, regex_pos - 1),
- options.comments.substr(regex_pos + 1)
- );
- }
- if (comments instanceof RegExp) {
- comment_filter = function(comment) {
- return comment.type != "comment5" && comments.test(comment.value);
- };
- } else if (typeof comments === "function") {
- comment_filter = function(comment) {
- return comment.type != "comment5" && comments(this, comment);
- };
- } else if (comments === "some") {
- comment_filter = is_some_comments;
- } else { // NOTE includes "all" option
- comment_filter = return_true;
- }
- }
-
- var indentation = 0;
- var current_col = 0;
- var current_line = 1;
- var current_pos = 0;
- var OUTPUT = "";
-
- var to_utf8 = options.ascii_only ? function(str, identifier) {
- return str.replace(/[\u0000-\u001f\u007f-\uffff]/g, function(ch) {
- var code = ch.charCodeAt(0).toString(16);
- if (code.length <= 2 && !identifier) {
- while (code.length < 2) code = "0" + code;
- return "\\x" + code;
- } else {
- while (code.length < 4) code = "0" + code;
- return "\\u" + code;
- }
- });
- } : function(str) {
- var s = "";
- for (var i = 0, j = 0; i < str.length; i++) {
- var code = str.charCodeAt(i);
- if (is_surrogate_pair_head(code)) {
- if (is_surrogate_pair_tail(str.charCodeAt(i + 1))) {
- i++;
- continue;
- }
- } else if (!is_surrogate_pair_tail(code)) {
- continue;
- }
- s += str.slice(j, i) + "\\u" + code.toString(16);
- j = i + 1;
- }
- return j == 0 ? str : s + str.slice(j);
- };
-
- function make_string(str, quote) {
- var dq = 0, sq = 0;
- str = str.replace(/[\\\b\f\n\r\v\t\x22\x27\u2028\u2029\0\ufeff]/g, function(s, i) {
- switch (s) {
- case '"': ++dq; return '"';
- case "'": ++sq; return "'";
- case "\\": return "\\\\";
- case "\n": return "\\n";
- case "\r": return "\\r";
- case "\t": return "\\t";
- case "\b": return "\\b";
- case "\f": return "\\f";
- case "\x0B": return options.ie8 ? "\\x0B" : "\\v";
- case "\u2028": return "\\u2028";
- case "\u2029": return "\\u2029";
- case "\ufeff": return "\\ufeff";
- case "\0":
- return /[0-9]/.test(str.charAt(i+1)) ? "\\x00" : "\\0";
- }
- return s;
- });
- function quote_single() {
- return "'" + str.replace(/\x27/g, "\\'") + "'";
- }
- function quote_double() {
- return '"' + str.replace(/\x22/g, '\\"') + '"';
- }
- str = to_utf8(str);
- switch (options.quote_style) {
- case 1:
- return quote_single();
- case 2:
- return quote_double();
- case 3:
- return quote == "'" ? quote_single() : quote_double();
- default:
- return dq > sq ? quote_single() : quote_double();
- }
- }
-
- function encode_string(str, quote) {
- var ret = make_string(str, quote);
- if (options.inline_script) {
- ret = ret.replace(/<\x2f(script)([>\/\t\n\f\r ])/gi, "<\\/$1$2");
- ret = ret.replace(/\x3c!--/g, "\\x3c!--");
- ret = ret.replace(/--\x3e/g, "--\\x3e");
- }
- return ret;
- }
-
- function make_name(name) {
- name = name.toString();
- name = to_utf8(name, true);
- return name;
- }
-
- function make_indent(back) {
- return repeat_string(" ", options.indent_start + indentation - back * options.indent_level);
- }
-
- /* -----[ beautification/minification ]----- */
-
- var has_parens = false;
- var line_end = 0;
- var line_fixed = true;
- var might_need_space = false;
- var might_need_semicolon = false;
- var need_newline_indented = false;
- var need_space = false;
- var newline_insert = -1;
- var last = "";
- var mapping_token, mapping_name, mappings = options.source_map && [];
-
- var adjust_mappings = mappings ? function(line, col) {
- mappings.forEach(function(mapping) {
- mapping.line += line;
- mapping.col += col;
- });
- } : noop;
-
- var flush_mappings = mappings ? function() {
- mappings.forEach(function(mapping) {
- options.source_map.add(
- mapping.token.file,
- mapping.line, mapping.col,
- mapping.token.line, mapping.token.col,
- !mapping.name && mapping.token.type == "name" ? mapping.token.value : mapping.name
- );
- });
- mappings = [];
- } : noop;
-
- function insert_newlines(count) {
- var index = OUTPUT.lastIndexOf("\n");
- if (line_end < index) line_end = index;
- var left = OUTPUT.slice(0, line_end);
- var right = OUTPUT.slice(line_end);
- adjust_mappings(count, right.length - current_col);
- current_line += count;
- current_pos += count;
- current_col = right.length;
- OUTPUT = left;
- while (count--) OUTPUT += "\n";
- OUTPUT += right;
- }
-
- var fix_line = options.max_line_len ? function() {
- if (line_fixed) {
- if (current_col > options.max_line_len) {
- AST_Node.warn("Output exceeds {max_line_len} characters", options);
- }
- return;
- }
- if (current_col > options.max_line_len) insert_newlines(1);
- line_fixed = true;
- flush_mappings();
- } : noop;
-
- var requireSemicolonChars = makePredicate("( [ + * / - , .");
-
- function print(str) {
- str = String(str);
- var ch = str.charAt(0);
- if (need_newline_indented && ch) {
- need_newline_indented = false;
- if (ch != "\n") {
- print("\n");
- indent();
- }
- }
- if (need_space && ch) {
- need_space = false;
- if (!/[\s;})]/.test(ch)) {
- space();
- }
- }
- newline_insert = -1;
- var prev = last.slice(-1);
- if (might_need_semicolon) {
- might_need_semicolon = false;
-
- if (prev == ":" && ch == "}" || (!ch || ";}".indexOf(ch) < 0) && prev != ";") {
- if (options.semicolons || requireSemicolonChars[ch]) {
- OUTPUT += ";";
- current_col++;
- current_pos++;
- } else {
- fix_line();
- OUTPUT += "\n";
- current_pos++;
- current_line++;
- current_col = 0;
-
- if (/^\s+$/.test(str)) {
- // reset the semicolon flag, since we didn't print one
- // now and might still have to later
- might_need_semicolon = true;
- }
- }
-
- if (!options.beautify)
- might_need_space = false;
- }
- }
-
- if (might_need_space) {
- if (is_identifier_char(prev) && (is_identifier_char(ch) || ch == "\\")
- || (ch == "/" && ch == prev)
- || ((ch == "+" || ch == "-") && ch == last)
- || str == "--" && last == "!"
- || last == "--" && ch == ">") {
- OUTPUT += " ";
- current_col++;
- current_pos++;
- }
- if (prev != "<" || str != "!") might_need_space = false;
- }
-
- if (mapping_token) {
- mappings.push({
- token: mapping_token,
- name: mapping_name,
- line: current_line,
- col: current_col
- });
- mapping_token = false;
- if (line_fixed) flush_mappings();
- }
-
- OUTPUT += str;
- has_parens = str.slice(-1) == "(";
- current_pos += str.length;
- var a = str.split(/\r?\n/), n = a.length - 1;
- current_line += n;
- current_col += a[0].length;
- if (n > 0) {
- fix_line();
- current_col = a[n].length;
- }
- last = str;
- }
-
- var space = options.beautify ? function() {
- print(" ");
- } : function() {
- might_need_space = true;
- };
-
- var indent = options.beautify ? function(half) {
- if (options.beautify) {
- print(make_indent(half ? 0.5 : 0));
- }
- } : noop;
-
- var with_indent = options.beautify ? function(col, cont) {
- if (col === true) col = next_indent();
- var save_indentation = indentation;
- indentation = col;
- var ret = cont();
- indentation = save_indentation;
- return ret;
- } : function(col, cont) { return cont() };
-
- var may_add_newline = options.max_line_len || options.preserve_line ? function() {
- fix_line();
- line_end = OUTPUT.length;
- line_fixed = false;
- } : noop;
-
- var newline = options.beautify ? function() {
- if (newline_insert < 0) return print("\n");
- if (OUTPUT[newline_insert] != "\n") {
- OUTPUT = OUTPUT.slice(0, newline_insert) + "\n" + OUTPUT.slice(newline_insert);
- current_pos++;
- current_line++;
- }
- newline_insert++;
- } : may_add_newline;
-
- var semicolon = options.beautify ? function() {
- print(";");
- } : function() {
- might_need_semicolon = true;
- };
-
- function force_semicolon() {
- if (might_need_semicolon) print(";");
- print(";");
- }
-
- function next_indent() {
- return indentation + options.indent_level;
- }
-
- function with_block(cont) {
- var ret;
- print("{");
- newline();
- with_indent(next_indent(), function() {
- ret = cont();
- });
- indent();
- print("}");
- return ret;
- }
-
- function with_parens(cont) {
- print("(");
- may_add_newline();
- //XXX: still nice to have that for argument lists
- //var ret = with_indent(current_col, cont);
- var ret = cont();
- may_add_newline();
- print(")");
- return ret;
- }
-
- function with_square(cont) {
- print("[");
- may_add_newline();
- //var ret = with_indent(current_col, cont);
- var ret = cont();
- may_add_newline();
- print("]");
- return ret;
- }
-
- function comma() {
- may_add_newline();
- print(",");
- may_add_newline();
- space();
- }
-
- function colon() {
- print(":");
- space();
- }
-
- var add_mapping = mappings ? function(token, name) {
- mapping_token = token;
- mapping_name = name;
- } : noop;
-
- function get() {
- if (!line_fixed) fix_line();
- return OUTPUT;
- }
-
- function has_nlb() {
- var index = OUTPUT.lastIndexOf("\n");
- return /^ *$/.test(OUTPUT.slice(index + 1));
- }
-
- function prepend_comments(node) {
- var self = this;
- var scan = node instanceof AST_Exit && node.value;
- var comments = dump(node);
- if (!comments) comments = [];
-
- if (scan) {
- var tw = new TreeWalker(function(node) {
- var parent = tw.parent();
- if (parent instanceof AST_Exit
- || parent instanceof AST_Binary && parent.left === node
- || parent.TYPE == "Call" && parent.expression === node
- || parent instanceof AST_Conditional && parent.condition === node
- || parent instanceof AST_Dot && parent.expression === node
- || parent instanceof AST_Sequence && parent.expressions[0] === node
- || parent instanceof AST_Sub && parent.expression === node
- || parent instanceof AST_UnaryPostfix) {
- var before = dump(node);
- if (before) comments = comments.concat(before);
- } else {
- return true;
- }
- });
- tw.push(node);
- node.value.walk(tw);
- }
-
- if (current_pos == 0) {
- if (comments.length > 0 && options.shebang && comments[0].type == "comment5") {
- print("#!" + comments.shift().value + "\n");
- indent();
- }
- var preamble = options.preamble;
- if (preamble) {
- print(preamble.replace(/\r\n?|[\n\u2028\u2029]|\s*$/g, "\n"));
- }
- }
-
- comments = comments.filter(comment_filter, node);
- if (comments.length == 0) return;
- var last_nlb = has_nlb();
- comments.forEach(function(c, i) {
- if (!last_nlb) {
- if (c.nlb) {
- print("\n");
- indent();
- last_nlb = true;
- } else if (i > 0) {
- space();
- }
- }
- if (/comment[134]/.test(c.type)) {
- print("//" + c.value.replace(/[@#]__PURE__/g, ' ') + "\n");
- indent();
- last_nlb = true;
- } else if (c.type == "comment2") {
- print("/*" + c.value.replace(/[@#]__PURE__/g, ' ') + "*/");
- last_nlb = false;
- }
- });
- if (!last_nlb) {
- if (node.start.nlb) {
- print("\n");
- indent();
- } else {
- space();
- }
- }
-
- function dump(node) {
- var token = node.start;
- if (!token) {
- if (!scan) return;
- node.start = token = new AST_Token();
- }
- var comments = token.comments_before;
- if (!comments) {
- if (!scan) return;
- token.comments_before = comments = [];
- }
- if (comments._dumped === self) return;
- comments._dumped = self;
- return comments;
- }
- }
-
- function append_comments(node, tail) {
- var self = this;
- var token = node.end;
- if (!token) return;
- var comments = token[tail ? "comments_before" : "comments_after"];
- if (!comments || comments._dumped === self) return;
- if (!(node instanceof AST_Statement || all(comments, function(c) {
- return !/comment[134]/.test(c.type);
- }))) return;
- comments._dumped = self;
- var insert = OUTPUT.length;
- comments.filter(comment_filter, node).forEach(function(c, i) {
- need_space = false;
- if (need_newline_indented) {
- print("\n");
- indent();
- need_newline_indented = false;
- } else if (c.nlb && (i > 0 || !has_nlb())) {
- print("\n");
- indent();
- } else if (i > 0 || !tail) {
- space();
- }
- if (/comment[134]/.test(c.type)) {
- print("//" + c.value.replace(/[@#]__PURE__/g, ' '));
- need_newline_indented = true;
- } else if (c.type == "comment2") {
- print("/*" + c.value.replace(/[@#]__PURE__/g, ' ') + "*/");
- need_space = true;
- }
- });
- if (OUTPUT.length > insert) newline_insert = insert;
- }
-
- var stack = [];
- return {
- get : get,
- toString : get,
- indent : indent,
- indentation : function() { return indentation },
- current_width : function() { return current_col - indentation },
- should_break : function() { return options.width && this.current_width() >= options.width },
- has_parens : function() { return has_parens },
- newline : newline,
- print : print,
- space : space,
- comma : comma,
- colon : colon,
- last : function() { return last },
- semicolon : semicolon,
- force_semicolon : force_semicolon,
- to_utf8 : to_utf8,
- print_name : function(name) { print(make_name(name)) },
- print_string : function(str, quote) { print(encode_string(str, quote)) },
- next_indent : next_indent,
- with_indent : with_indent,
- with_block : with_block,
- with_parens : with_parens,
- with_square : with_square,
- add_mapping : add_mapping,
- option : function(opt) { return options[opt] },
- prepend_comments: readonly ? noop : prepend_comments,
- append_comments : readonly || comment_filter === return_false ? noop : append_comments,
- line : function() { return current_line },
- col : function() { return current_col },
- pos : function() { return current_pos },
- push_node : function(node) { stack.push(node) },
- pop_node : options.preserve_line ? function() {
- var node = stack.pop();
- if (node.start && node.start.line > current_line) {
- insert_newlines(node.start.line - current_line);
- }
- } : function() {
- stack.pop();
- },
- parent : function(n) {
- return stack[stack.length - 2 - (n || 0)];
- }
- };
-}
-
-/* -----[ code generators ]----- */
-
-(function() {
-
- /* -----[ utils ]----- */
-
- function DEFPRINT(nodetype, generator) {
- nodetype.DEFMETHOD("_codegen", generator);
- }
-
- var use_asm = false;
-
- AST_Node.DEFMETHOD("print", function(stream, force_parens) {
- var self = this, generator = self._codegen;
- function doit() {
- stream.prepend_comments(self);
- self.add_source_map(stream);
- generator(self, stream);
- stream.append_comments(self);
- }
- stream.push_node(self);
- if (force_parens || self.needs_parens(stream)) {
- stream.with_parens(doit);
- } else {
- doit();
- }
- stream.pop_node();
- });
- AST_Node.DEFMETHOD("_print", AST_Node.prototype.print);
-
- AST_Node.DEFMETHOD("print_to_string", function(options) {
- var s = OutputStream(options);
- this.print(s);
- return s.get();
- });
-
- /* -----[ PARENTHESES ]----- */
-
- function PARENS(nodetype, func) {
- if (Array.isArray(nodetype)) {
- nodetype.forEach(function(nodetype) {
- PARENS(nodetype, func);
- });
- } else {
- nodetype.DEFMETHOD("needs_parens", func);
- }
- }
-
- PARENS(AST_Node, return_false);
-
- // a function expression needs parens around it when it's provably
- // the first token to appear in a statement.
- PARENS(AST_Function, function(output) {
- if (!output.has_parens() && first_in_statement(output)) return true;
- if (output.option('webkit')) {
- var p = output.parent();
- if (p instanceof AST_PropAccess && p.expression === this) return true;
- }
- if (output.option('wrap_iife')) {
- var p = output.parent();
- if (p instanceof AST_Call && p.expression === this) return true;
- }
- });
-
- // same goes for an object literal, because otherwise it would be
- // interpreted as a block of code.
- PARENS(AST_Object, function(output) {
- return !output.has_parens() && first_in_statement(output);
- });
-
- PARENS(AST_Unary, function(output) {
- var p = output.parent();
- return p instanceof AST_PropAccess && p.expression === this
- || p instanceof AST_Call && p.expression === this;
- });
-
- PARENS(AST_Sequence, function(output) {
- var p = output.parent();
- // (foo, bar)() or foo(1, (2, 3), 4)
- return p instanceof AST_Call
- // !(foo, bar, baz)
- || p instanceof AST_Unary
- // 1 + (2, 3) + 4 ==> 8
- || p instanceof AST_Binary
- // var a = (1, 2), b = a + a; ==> b == 4
- || p instanceof AST_VarDef
- // (1, {foo:2}).foo or (1, {foo:2})["foo"] ==> 2
- || p instanceof AST_PropAccess && p.expression === this
- // [ 1, (2, 3), 4 ] ==> [ 1, 3, 4 ]
- || p instanceof AST_Array
- // { foo: (1, 2) }.foo ==> 2
- || p instanceof AST_ObjectProperty
- // (false, true) ? (a = 10, b = 20) : (c = 30)
- // ==> 20 (side effect, set a := 10 and b := 20)
- || p instanceof AST_Conditional;
- });
-
- PARENS(AST_Binary, function(output) {
- var p = output.parent();
- // (foo && bar)()
- if (p instanceof AST_Call && p.expression === this)
- return true;
- // typeof (foo && bar)
- if (p instanceof AST_Unary)
- return true;
- // (foo && bar)["prop"], (foo && bar).prop
- if (p instanceof AST_PropAccess && p.expression === this)
- return true;
- // this deals with precedence: 3 * (2 + 1)
- if (p instanceof AST_Binary) {
- var po = p.operator, pp = PRECEDENCE[po];
- var so = this.operator, sp = PRECEDENCE[so];
- if (pp > sp
- || (pp == sp
- && this === p.right)) {
- return true;
- }
- }
- });
-
- PARENS(AST_PropAccess, function(output) {
- var p = output.parent();
- if (p instanceof AST_New && p.expression === this) {
- // i.e. new (foo.bar().baz)
- //
- // if there's one call into this subtree, then we need
- // parens around it too, otherwise the call will be
- // interpreted as passing the arguments to the upper New
- // expression.
- var parens = false;
- this.walk(new TreeWalker(function(node) {
- if (parens || node instanceof AST_Scope) return true;
- if (node instanceof AST_Call) {
- parens = true;
- return true;
- }
- }));
- return parens;
- }
- });
-
- PARENS(AST_Call, function(output) {
- var p = output.parent();
- if (p instanceof AST_New && p.expression === this) return true;
- // https://bugs.webkit.org/show_bug.cgi?id=123506
- if (output.option('webkit')) {
- var g = output.parent(1);
- return this.expression instanceof AST_Function
- && p instanceof AST_PropAccess
- && p.expression === this
- && g instanceof AST_Assign
- && g.left === p;
- }
- });
-
- PARENS(AST_New, function(output) {
- var p = output.parent();
- if (!need_constructor_parens(this, output)
- && (p instanceof AST_PropAccess // (new Date).getTime(), (new Date)["getTime"]()
- || p instanceof AST_Call && p.expression === this)) // (new foo)(bar)
- return true;
- });
-
- PARENS(AST_Number, function(output) {
- var p = output.parent();
- if (p instanceof AST_PropAccess && p.expression === this) {
- var value = this.value;
- if (value < 0 || /^0/.test(make_num(value))) {
- return true;
- }
- }
- });
-
- PARENS([ AST_Assign, AST_Conditional ], function(output) {
- var p = output.parent();
- // !(a = false) → true
- if (p instanceof AST_Unary)
- return true;
- // 1 + (a = 2) + 3 → 6, side effect setting a = 2
- if (p instanceof AST_Binary && !(p instanceof AST_Assign))
- return true;
- // (a = func)() —or— new (a = Object)()
- if (p instanceof AST_Call && p.expression === this)
- return true;
- // (a = foo) ? bar : baz
- if (p instanceof AST_Conditional && p.condition === this)
- return true;
- // (a = foo)["prop"] —or— (a = foo).prop
- if (p instanceof AST_PropAccess && p.expression === this)
- return true;
- });
-
- /* -----[ PRINTERS ]----- */
-
- DEFPRINT(AST_Directive, function(self, output) {
- var quote = self.quote;
- var value = self.value;
- switch (output.option("quote_style")) {
- case 0:
- case 2:
- if (value.indexOf('"') == -1) quote = '"';
- break;
- case 1:
- if (value.indexOf("'") == -1) quote = "'";
- break;
- }
- output.print(quote + value + quote);
- output.semicolon();
- });
- DEFPRINT(AST_Debugger, function(self, output) {
- output.print("debugger");
- output.semicolon();
- });
-
- /* -----[ statements ]----- */
-
- function display_body(body, is_toplevel, output, allow_directives) {
- var last = body.length - 1;
- var in_directive = allow_directives;
- var was_asm = use_asm;
- body.forEach(function(stmt, i) {
- if (in_directive) {
- if (stmt instanceof AST_Directive) {
- if (stmt.value == "use asm") use_asm = true;
- } else if (!(stmt instanceof AST_EmptyStatement)) {
- if (stmt instanceof AST_SimpleStatement && stmt.body instanceof AST_String) {
- output.force_semicolon();
- }
- in_directive = false;
- }
- }
- if (stmt instanceof AST_EmptyStatement) return;
- output.indent();
- stmt.print(output);
- if (i == last && is_toplevel) return;
- output.newline();
- if (is_toplevel) output.newline();
- });
- use_asm = was_asm;
- }
-
- AST_StatementWithBody.DEFMETHOD("_do_print_body", function(output) {
- force_statement(this.body, output);
- });
-
- DEFPRINT(AST_Statement, function(self, output) {
- self.body.print(output);
- output.semicolon();
- });
- DEFPRINT(AST_Toplevel, function(self, output) {
- display_body(self.body, true, output, true);
- output.print("");
- });
- DEFPRINT(AST_LabeledStatement, function(self, output) {
- self.label.print(output);
- output.colon();
- self.body.print(output);
- });
- DEFPRINT(AST_SimpleStatement, function(self, output) {
- self.body.print(output);
- output.semicolon();
- });
- function print_braced_empty(self, output) {
- output.print("{");
- output.with_indent(output.next_indent(), function() {
- output.append_comments(self, true);
- });
- output.print("}");
- }
- function print_braced(self, output, allow_directives) {
- if (self.body.length > 0) {
- output.with_block(function() {
- display_body(self.body, false, output, allow_directives);
- });
- } else print_braced_empty(self, output);
- }
- DEFPRINT(AST_BlockStatement, function(self, output) {
- print_braced(self, output);
- });
- DEFPRINT(AST_EmptyStatement, function(self, output) {
- output.semicolon();
- });
- DEFPRINT(AST_Do, function(self, output) {
- output.print("do");
- output.space();
- make_block(self.body, output);
- output.space();
- output.print("while");
- output.space();
- output.with_parens(function() {
- self.condition.print(output);
- });
- output.semicolon();
- });
- DEFPRINT(AST_While, function(self, output) {
- output.print("while");
- output.space();
- output.with_parens(function() {
- self.condition.print(output);
- });
- output.space();
- self._do_print_body(output);
- });
- DEFPRINT(AST_For, function(self, output) {
- output.print("for");
- output.space();
- output.with_parens(function() {
- if (self.init) {
- if (self.init instanceof AST_Definitions) {
- self.init.print(output);
- } else {
- parenthesize_for_noin(self.init, output, true);
- }
- output.print(";");
- output.space();
- } else {
- output.print(";");
- }
- if (self.condition) {
- self.condition.print(output);
- output.print(";");
- output.space();
- } else {
- output.print(";");
- }
- if (self.step) {
- self.step.print(output);
- }
- });
- output.space();
- self._do_print_body(output);
- });
- DEFPRINT(AST_ForIn, function(self, output) {
- output.print("for");
- output.space();
- output.with_parens(function() {
- self.init.print(output);
- output.space();
- output.print("in");
- output.space();
- self.object.print(output);
- });
- output.space();
- self._do_print_body(output);
- });
- DEFPRINT(AST_With, function(self, output) {
- output.print("with");
- output.space();
- output.with_parens(function() {
- self.expression.print(output);
- });
- output.space();
- self._do_print_body(output);
- });
-
- /* -----[ functions ]----- */
- AST_Lambda.DEFMETHOD("_do_print", function(output, nokeyword) {
- var self = this;
- if (!nokeyword) {
- output.print("function");
- }
- if (self.name) {
- output.space();
- self.name.print(output);
- }
- output.with_parens(function() {
- self.argnames.forEach(function(arg, i) {
- if (i) output.comma();
- arg.print(output);
- });
- });
- output.space();
- print_braced(self, output, true);
- });
- DEFPRINT(AST_Lambda, function(self, output) {
- self._do_print(output);
- });
-
- /* -----[ jumps ]----- */
- function print_jump(output, kind, target) {
- output.print(kind);
- if (target) {
- output.space();
- target.print(output);
- }
- output.semicolon();
- }
-
- DEFPRINT(AST_Return, function(self, output) {
- print_jump(output, "return", self.value);
- });
- DEFPRINT(AST_Throw, function(self, output) {
- print_jump(output, "throw", self.value);
- });
- DEFPRINT(AST_Break, function(self, output) {
- print_jump(output, "break", self.label);
- });
- DEFPRINT(AST_Continue, function(self, output) {
- print_jump(output, "continue", self.label);
- });
-
- /* -----[ if ]----- */
- function make_then(self, output) {
- var b = self.body;
- if (output.option("braces")
- || output.option("ie8") && b instanceof AST_Do)
- return make_block(b, output);
- // The squeezer replaces "block"-s that contain only a single
- // statement with the statement itself; technically, the AST
- // is correct, but this can create problems when we output an
- // IF having an ELSE clause where the THEN clause ends in an
- // IF *without* an ELSE block (then the outer ELSE would refer
- // to the inner IF). This function checks for this case and
- // adds the block braces if needed.
- if (!b) return output.force_semicolon();
- while (true) {
- if (b instanceof AST_If) {
- if (!b.alternative) {
- make_block(self.body, output);
- return;
- }
- b = b.alternative;
- } else if (b instanceof AST_StatementWithBody) {
- b = b.body;
- } else break;
- }
- force_statement(self.body, output);
- }
- DEFPRINT(AST_If, function(self, output) {
- output.print("if");
- output.space();
- output.with_parens(function() {
- self.condition.print(output);
- });
- output.space();
- if (self.alternative) {
- make_then(self, output);
- output.space();
- output.print("else");
- output.space();
- if (self.alternative instanceof AST_If)
- self.alternative.print(output);
- else
- force_statement(self.alternative, output);
- } else {
- self._do_print_body(output);
- }
- });
-
- /* -----[ switch ]----- */
- DEFPRINT(AST_Switch, function(self, output) {
- output.print("switch");
- output.space();
- output.with_parens(function() {
- self.expression.print(output);
- });
- output.space();
- var last = self.body.length - 1;
- if (last < 0) print_braced_empty(self, output);
- else output.with_block(function() {
- self.body.forEach(function(branch, i) {
- output.indent(true);
- branch.print(output);
- if (i < last && branch.body.length > 0)
- output.newline();
- });
- });
- });
- AST_SwitchBranch.DEFMETHOD("_do_print_body", function(output) {
- output.newline();
- this.body.forEach(function(stmt) {
- output.indent();
- stmt.print(output);
- output.newline();
- });
- });
- DEFPRINT(AST_Default, function(self, output) {
- output.print("default:");
- self._do_print_body(output);
- });
- DEFPRINT(AST_Case, function(self, output) {
- output.print("case");
- output.space();
- self.expression.print(output);
- output.print(":");
- self._do_print_body(output);
- });
-
- /* -----[ exceptions ]----- */
- DEFPRINT(AST_Try, function(self, output) {
- output.print("try");
- output.space();
- print_braced(self, output);
- if (self.bcatch) {
- output.space();
- self.bcatch.print(output);
- }
- if (self.bfinally) {
- output.space();
- self.bfinally.print(output);
- }
- });
- DEFPRINT(AST_Catch, function(self, output) {
- output.print("catch");
- output.space();
- output.with_parens(function() {
- self.argname.print(output);
- });
- output.space();
- print_braced(self, output);
- });
- DEFPRINT(AST_Finally, function(self, output) {
- output.print("finally");
- output.space();
- print_braced(self, output);
- });
-
- DEFPRINT(AST_Var, function(self, output) {
- output.print("var");
- output.space();
- self.definitions.forEach(function(def, i) {
- if (i) output.comma();
- def.print(output);
- });
- var p = output.parent();
- if (p && p.init !== self || !(p instanceof AST_For || p instanceof AST_ForIn)) output.semicolon();
- });
-
- function parenthesize_for_noin(node, output, noin) {
- var parens = false;
- // need to take some precautions here:
- // https://github.com/mishoo/UglifyJS2/issues/60
- if (noin) node.walk(new TreeWalker(function(node) {
- if (parens || node instanceof AST_Scope) return true;
- if (node instanceof AST_Binary && node.operator == "in") {
- parens = true;
- return true;
- }
- }));
- node.print(output, parens);
- }
-
- DEFPRINT(AST_VarDef, function(self, output) {
- self.name.print(output);
- if (self.value) {
- output.space();
- output.print("=");
- output.space();
- var p = output.parent(1);
- var noin = p instanceof AST_For || p instanceof AST_ForIn;
- parenthesize_for_noin(self.value, output, noin);
- }
- });
-
- /* -----[ other expressions ]----- */
- DEFPRINT(AST_Call, function(self, output) {
- self.expression.print(output);
- if (self instanceof AST_New && !need_constructor_parens(self, output))
- return;
- if (self.expression instanceof AST_Call || self.expression instanceof AST_Lambda) {
- output.add_mapping(self.start);
- }
- output.with_parens(function() {
- self.args.forEach(function(expr, i) {
- if (i) output.comma();
- expr.print(output);
- });
- });
- });
- DEFPRINT(AST_New, function(self, output) {
- output.print("new");
- output.space();
- AST_Call.prototype._codegen(self, output);
- });
- DEFPRINT(AST_Sequence, function(self, output) {
- self.expressions.forEach(function(node, index) {
- if (index > 0) {
- output.comma();
- if (output.should_break()) {
- output.newline();
- output.indent();
- }
- }
- node.print(output);
- });
- });
- DEFPRINT(AST_Dot, function(self, output) {
- var expr = self.expression;
- expr.print(output);
- var prop = self.property;
- if (output.option("ie8") && RESERVED_WORDS[prop]) {
- output.print("[");
- output.add_mapping(self.end);
- output.print_string(prop);
- output.print("]");
- } else {
- if (expr instanceof AST_Number && expr.value >= 0) {
- if (!/[xa-f.)]/i.test(output.last())) {
- output.print(".");
- }
- }
- output.print(".");
- // the name after dot would be mapped about here.
- output.add_mapping(self.end);
- output.print_name(prop);
- }
- });
- DEFPRINT(AST_Sub, function(self, output) {
- self.expression.print(output);
- output.print("[");
- self.property.print(output);
- output.print("]");
- });
- DEFPRINT(AST_UnaryPrefix, function(self, output) {
- var op = self.operator;
- output.print(op);
- if (/^[a-z]/i.test(op)
- || (/[+-]$/.test(op)
- && self.expression instanceof AST_UnaryPrefix
- && /^[+-]/.test(self.expression.operator))) {
- output.space();
- }
- self.expression.print(output);
- });
- DEFPRINT(AST_UnaryPostfix, function(self, output) {
- self.expression.print(output);
- output.print(self.operator);
- });
- DEFPRINT(AST_Binary, function(self, output) {
- self.left.print(output);
- output.space();
- output.print(self.operator);
- output.space();
- self.right.print(output);
- });
- DEFPRINT(AST_Conditional, function(self, output) {
- self.condition.print(output);
- output.space();
- output.print("?");
- output.space();
- self.consequent.print(output);
- output.space();
- output.colon();
- self.alternative.print(output);
- });
-
- /* -----[ literals ]----- */
- DEFPRINT(AST_Array, function(self, output) {
- output.with_square(function() {
- var a = self.elements, len = a.length;
- if (len > 0) output.space();
- a.forEach(function(exp, i) {
- if (i) output.comma();
- exp.print(output);
- // If the final element is a hole, we need to make sure it
- // doesn't look like a trailing comma, by inserting an actual
- // trailing comma.
- if (i === len - 1 && exp instanceof AST_Hole)
- output.comma();
- });
- if (len > 0) output.space();
- });
- });
- DEFPRINT(AST_Object, function(self, output) {
- if (self.properties.length > 0) output.with_block(function() {
- self.properties.forEach(function(prop, i) {
- if (i) {
- output.print(",");
- output.newline();
- }
- output.indent();
- prop.print(output);
- });
- output.newline();
- });
- else print_braced_empty(self, output);
- });
-
- function print_property_name(key, quote, output) {
- if (output.option("quote_keys")) {
- output.print_string(key);
- } else if ("" + +key == key && key >= 0) {
- output.print(make_num(key));
- } else if (RESERVED_WORDS[key] ? !output.option("ie8") : is_identifier_string(key)) {
- if (quote && output.option("keep_quoted_props")) {
- output.print_string(key, quote);
- } else {
- output.print_name(key);
- }
- } else {
- output.print_string(key, quote);
- }
- }
-
- DEFPRINT(AST_ObjectKeyVal, function(self, output) {
- print_property_name(self.key, self.quote, output);
- output.colon();
- self.value.print(output);
- });
- AST_ObjectProperty.DEFMETHOD("_print_getter_setter", function(type, output) {
- output.print(type);
- output.space();
- print_property_name(this.key.name, this.quote, output);
- this.value._do_print(output, true);
- });
- DEFPRINT(AST_ObjectSetter, function(self, output) {
- self._print_getter_setter("set", output);
- });
- DEFPRINT(AST_ObjectGetter, function(self, output) {
- self._print_getter_setter("get", output);
- });
- DEFPRINT(AST_Symbol, function(self, output) {
- var def = self.definition();
- output.print_name(def && def.mangled_name || self.name);
- });
- DEFPRINT(AST_Hole, noop);
- DEFPRINT(AST_This, function(self, output) {
- output.print("this");
- });
- DEFPRINT(AST_Constant, function(self, output) {
- output.print(self.value);
- });
- DEFPRINT(AST_String, function(self, output) {
- output.print_string(self.value, self.quote);
- });
- DEFPRINT(AST_Number, function(self, output) {
- if (use_asm && self.start && self.start.raw != null) {
- output.print(self.start.raw);
- } else {
- output.print(make_num(self.value));
- }
- });
-
- DEFPRINT(AST_RegExp, function(self, output) {
- var regexp = self.value;
- var str = regexp.toString();
- if (regexp.raw_source) {
- str = "/" + regexp.raw_source + str.slice(str.lastIndexOf("/"));
- }
- output.print(output.to_utf8(str).replace(/\\(?:\0(?![0-9])|[^\0])/g, function(seq) {
- switch (seq[1]) {
- case "\n": return "\\n";
- case "\r": return "\\r";
- case "\t": return "\t";
- case "\b": return "\b";
- case "\f": return "\f";
- case "\0": return "\0";
- case "\x0B": return "\v";
- case "\u2028": return "\\u2028";
- case "\u2029": return "\\u2029";
- default: return seq;
- }
- }).replace(/[\n\r\u2028\u2029]/g, function(c) {
- switch (c) {
- case "\n": return "\\n";
- case "\r": return "\\r";
- case "\u2028": return "\\u2028";
- case "\u2029": return "\\u2029";
- }
- }));
- var p = output.parent();
- if (p instanceof AST_Binary && /^in/.test(p.operator) && p.left === self)
- output.print(" ");
- });
-
- function force_statement(stat, output) {
- if (output.option("braces")) {
- make_block(stat, output);
- } else {
- if (!stat || stat instanceof AST_EmptyStatement)
- output.force_semicolon();
- else
- stat.print(output);
- }
- }
-
- // self should be AST_New. decide if we want to show parens or not.
- function need_constructor_parens(self, output) {
- // Always print parentheses with arguments
- if (self.args.length > 0) return true;
-
- return output.option("beautify");
- }
-
- function best_of(a) {
- var best = a[0], len = best.length;
- for (var i = 1; i < a.length; ++i) {
- if (a[i].length < len) {
- best = a[i];
- len = best.length;
- }
- }
- return best;
- }
-
- function make_num(num) {
- var str = num.toString(10).replace(/^0\./, ".").replace("e+", "e");
- var candidates = [ str ];
- if (Math.floor(num) === num) {
- if (num < 0) {
- candidates.push("-0x" + (-num).toString(16).toLowerCase());
- } else {
- candidates.push("0x" + num.toString(16).toLowerCase());
- }
- }
- var match, len, digits;
- if (match = /^\.0+/.exec(str)) {
- len = match[0].length;
- digits = str.slice(len);
- candidates.push(digits + "e-" + (digits.length + len - 1));
- } else if (match = /0+$/.exec(str)) {
- len = match[0].length;
- candidates.push(str.slice(0, -len) + "e" + len);
- } else if (match = /^(\d)\.(\d+)e(-?\d+)$/.exec(str)) {
- candidates.push(match[1] + match[2] + "e" + (match[3] - match[2].length));
- }
- return best_of(candidates);
- }
-
- function make_block(stmt, output) {
- if (!stmt || stmt instanceof AST_EmptyStatement)
- output.print("{}");
- else if (stmt instanceof AST_BlockStatement)
- stmt.print(output);
- else output.with_block(function() {
- output.indent();
- stmt.print(output);
- output.newline();
- });
- }
-
- /* -----[ source map generators ]----- */
-
- function DEFMAP(nodetype, generator) {
- nodetype.forEach(function(nodetype) {
- nodetype.DEFMETHOD("add_source_map", generator);
- });
- }
-
- DEFMAP([
- // We could easily add info for ALL nodes, but it seems to me that
- // would be quite wasteful, hence this noop in the base class.
- AST_Node,
- // since the label symbol will mark it
- AST_LabeledStatement,
- AST_Toplevel,
- ], noop);
-
- // XXX: I'm not exactly sure if we need it for all of these nodes,
- // or if we should add even more.
- DEFMAP([
- AST_Array,
- AST_BlockStatement,
- AST_Catch,
- AST_Constant,
- AST_Debugger,
- AST_Definitions,
- AST_Directive,
- AST_Finally,
- AST_Jump,
- AST_Lambda,
- AST_New,
- AST_Object,
- AST_StatementWithBody,
- AST_Symbol,
- AST_Switch,
- AST_SwitchBranch,
- AST_Try,
- ], function(output) {
- output.add_mapping(this.start);
- });
-
- DEFMAP([
- AST_ObjectGetter,
- AST_ObjectSetter,
- ], function(output) {
- output.add_mapping(this.start, this.key.name);
- });
-
- DEFMAP([ AST_ObjectProperty ], function(output) {
- output.add_mapping(this.start, this.key);
- });
-})();
diff --git a/node_modules/uglify-js/lib/parse.js b/node_modules/uglify-js/lib/parse.js
deleted file mode 100644
index 270af9b..0000000
--- a/node_modules/uglify-js/lib/parse.js
+++ /dev/null
@@ -1,1613 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
- Parser based on parse-js (http://marijn.haverbeke.nl/parse-js/).
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-var KEYWORDS = 'break case catch const continue debugger default delete do else finally for function if in instanceof new return switch throw try typeof var void while with';
-var KEYWORDS_ATOM = 'false null true';
-var RESERVED_WORDS = 'abstract boolean byte char class double enum export extends final float goto implements import int interface let long native package private protected public short static super synchronized this throws transient volatile yield'
- + " " + KEYWORDS_ATOM + " " + KEYWORDS;
-var KEYWORDS_BEFORE_EXPRESSION = 'return new delete throw else case';
-
-KEYWORDS = makePredicate(KEYWORDS);
-RESERVED_WORDS = makePredicate(RESERVED_WORDS);
-KEYWORDS_BEFORE_EXPRESSION = makePredicate(KEYWORDS_BEFORE_EXPRESSION);
-KEYWORDS_ATOM = makePredicate(KEYWORDS_ATOM);
-
-var OPERATOR_CHARS = makePredicate(characters("+-*&%=<>!?|~^"));
-
-var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;
-var RE_OCT_NUMBER = /^0[0-7]+$/;
-
-var OPERATORS = makePredicate([
- "in",
- "instanceof",
- "typeof",
- "new",
- "void",
- "delete",
- "++",
- "--",
- "+",
- "-",
- "!",
- "~",
- "&",
- "|",
- "^",
- "*",
- "/",
- "%",
- ">>",
- "<<",
- ">>>",
- "<",
- ">",
- "<=",
- ">=",
- "==",
- "===",
- "!=",
- "!==",
- "?",
- "=",
- "+=",
- "-=",
- "/=",
- "*=",
- "%=",
- ">>=",
- "<<=",
- ">>>=",
- "|=",
- "^=",
- "&=",
- "&&",
- "||"
-]);
-
-var WHITESPACE_CHARS = makePredicate(characters(" \u00a0\n\r\t\f\u000b\u200b\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000\uFEFF"));
-
-var NEWLINE_CHARS = makePredicate(characters("\n\r\u2028\u2029"));
-
-var PUNC_BEFORE_EXPRESSION = makePredicate(characters("[{(,;:"));
-
-var PUNC_CHARS = makePredicate(characters("[]{}(),;:"));
-
-/* -----[ Tokenizer ]----- */
-
-// regexps adapted from http://xregexp.com/plugins/#unicode
-var UNICODE = {
- letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"),
- digit: new RegExp("[\\u0030-\\u0039\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0BE6-\\u0BEF\\u0C66-\\u0C6F\\u0CE6-\\u0CEF\\u0D66-\\u0D6F\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F29\\u1040-\\u1049\\u1090-\\u1099\\u17E0-\\u17E9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19D9\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\uA620-\\uA629\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19]"),
- non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),
- space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"),
- connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")
-};
-
-function is_letter(code) {
- return (code >= 97 && code <= 122)
- || (code >= 65 && code <= 90)
- || (code >= 0xaa && UNICODE.letter.test(String.fromCharCode(code)));
-}
-
-function is_surrogate_pair_head(code) {
- return code >= 0xd800 && code <= 0xdbff;
-}
-
-function is_surrogate_pair_tail(code) {
- return code >= 0xdc00 && code <= 0xdfff;
-}
-
-function is_digit(code) {
- return code >= 48 && code <= 57;
-}
-
-function is_alphanumeric_char(code) {
- return is_digit(code) || is_letter(code);
-}
-
-function is_unicode_digit(code) {
- return UNICODE.digit.test(String.fromCharCode(code));
-}
-
-function is_unicode_combining_mark(ch) {
- return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
-}
-
-function is_unicode_connector_punctuation(ch) {
- return UNICODE.connector_punctuation.test(ch);
-}
-
-function is_identifier_start(code) {
- return code == 36 || code == 95 || is_letter(code);
-}
-
-function is_identifier_char(ch) {
- var code = ch.charCodeAt(0);
- return is_identifier_start(code)
- || is_digit(code)
- || code == 8204 // \u200c: zero-width non-joiner
- || code == 8205 // \u200d: zero-width joiner (in my ECMA-262 PDF, this is also 200c)
- || is_unicode_combining_mark(ch)
- || is_unicode_connector_punctuation(ch)
- || is_unicode_digit(code)
- ;
-}
-
-function is_identifier_string(str) {
- return /^[a-z_$][a-z0-9_$]*$/i.test(str);
-}
-
-function parse_js_number(num) {
- if (RE_HEX_NUMBER.test(num)) {
- return parseInt(num.substr(2), 16);
- } else if (RE_OCT_NUMBER.test(num)) {
- return parseInt(num.substr(1), 8);
- } else {
- var val = parseFloat(num);
- if (val == num) return val;
- }
-}
-
-function JS_Parse_Error(message, filename, line, col, pos) {
- this.message = message;
- this.filename = filename;
- this.line = line;
- this.col = col;
- this.pos = pos;
-}
-JS_Parse_Error.prototype = Object.create(Error.prototype);
-JS_Parse_Error.prototype.constructor = JS_Parse_Error;
-JS_Parse_Error.prototype.name = "SyntaxError";
-configure_error_stack(JS_Parse_Error);
-
-function js_error(message, filename, line, col, pos) {
- throw new JS_Parse_Error(message, filename, line, col, pos);
-}
-
-function is_token(token, type, val) {
- return token.type == type && (val == null || token.value == val);
-}
-
-var EX_EOF = {};
-
-function tokenizer($TEXT, filename, html5_comments, shebang) {
-
- var S = {
- text : $TEXT,
- filename : filename,
- pos : 0,
- tokpos : 0,
- line : 1,
- tokline : 0,
- col : 0,
- tokcol : 0,
- newline_before : false,
- regex_allowed : false,
- comments_before : [],
- directives : {},
- directive_stack : []
- };
- var prev_was_dot = false;
-
- function peek() {
- return S.text.charAt(S.pos);
- }
-
- function next(signal_eof, in_string) {
- var ch = S.text.charAt(S.pos++);
- if (signal_eof && !ch)
- throw EX_EOF;
- if (NEWLINE_CHARS[ch]) {
- S.newline_before = S.newline_before || !in_string;
- ++S.line;
- S.col = 0;
- if (!in_string && ch == "\r" && peek() == "\n") {
- // treat a \r\n sequence as a single \n
- ++S.pos;
- ch = "\n";
- }
- } else {
- ++S.col;
- }
- return ch;
- }
-
- function forward(i) {
- while (i-- > 0) next();
- }
-
- function looking_at(str) {
- return S.text.substr(S.pos, str.length) == str;
- }
-
- function find_eol() {
- var text = S.text;
- for (var i = S.pos; i < S.text.length; ++i) {
- if (NEWLINE_CHARS[text[i]]) return i;
- }
- return -1;
- }
-
- function find(what, signal_eof) {
- var pos = S.text.indexOf(what, S.pos);
- if (signal_eof && pos == -1) throw EX_EOF;
- return pos;
- }
-
- function start_token() {
- S.tokline = S.line;
- S.tokcol = S.col;
- S.tokpos = S.pos;
- }
-
- function token(type, value, is_comment) {
- S.regex_allowed = type == "operator" && !UNARY_POSTFIX[value]
- || type == "keyword" && KEYWORDS_BEFORE_EXPRESSION[value]
- || type == "punc" && PUNC_BEFORE_EXPRESSION[value];
- if (type == "punc" && value == ".") prev_was_dot = true;
- else if (!is_comment) prev_was_dot = false;
- var ret = {
- type : type,
- value : value,
- line : S.tokline,
- col : S.tokcol,
- pos : S.tokpos,
- endline : S.line,
- endcol : S.col,
- endpos : S.pos,
- nlb : S.newline_before,
- file : filename
- };
- if (/^(?:num|string|regexp)$/i.test(type)) {
- ret.raw = $TEXT.substring(ret.pos, ret.endpos);
- }
- if (!is_comment) {
- ret.comments_before = S.comments_before;
- ret.comments_after = S.comments_before = [];
- }
- S.newline_before = false;
- return new AST_Token(ret);
- }
-
- function skip_whitespace() {
- while (WHITESPACE_CHARS[peek()])
- next();
- }
-
- function read_while(pred) {
- var ret = "", ch, i = 0;
- while ((ch = peek()) && pred(ch, i++))
- ret += next();
- return ret;
- }
-
- function parse_error(err) {
- js_error(err, filename, S.tokline, S.tokcol, S.tokpos);
- }
-
- function read_num(prefix) {
- var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
- var num = read_while(function(ch, i) {
- var code = ch.charCodeAt(0);
- switch (code) {
- case 120: case 88: // xX
- return has_x ? false : (has_x = true);
- case 101: case 69: // eE
- return has_x ? true : has_e ? false : (has_e = after_e = true);
- case 45: // -
- return after_e || (i == 0 && !prefix);
- case 43: // +
- return after_e;
- case (after_e = false, 46): // .
- return (!has_dot && !has_x && !has_e) ? (has_dot = true) : false;
- }
- return is_alphanumeric_char(code);
- });
- if (prefix) num = prefix + num;
- if (RE_OCT_NUMBER.test(num) && next_token.has_directive("use strict")) {
- parse_error("Legacy octal literals are not allowed in strict mode");
- }
- var valid = parse_js_number(num);
- if (!isNaN(valid)) return token("num", valid);
- parse_error("Invalid syntax: " + num);
- }
-
- function read_escaped_char(in_string) {
- var ch = next(true, in_string);
- switch (ch.charCodeAt(0)) {
- case 110 : return "\n";
- case 114 : return "\r";
- case 116 : return "\t";
- case 98 : return "\b";
- case 118 : return "\u000b"; // \v
- case 102 : return "\f";
- case 120 : return String.fromCharCode(hex_bytes(2)); // \x
- case 117 : return String.fromCharCode(hex_bytes(4)); // \u
- case 10 : return ""; // newline
- case 13 : // \r
- if (peek() == "\n") { // DOS newline
- next(true, in_string);
- return "";
- }
- }
- if (ch >= "0" && ch <= "7")
- return read_octal_escape_sequence(ch);
- return ch;
- }
-
- function read_octal_escape_sequence(ch) {
- // Read
- var p = peek();
- if (p >= "0" && p <= "7") {
- ch += next(true);
- if (ch[0] <= "3" && (p = peek()) >= "0" && p <= "7")
- ch += next(true);
- }
-
- // Parse
- if (ch === "0") return "\0";
- if (ch.length > 0 && next_token.has_directive("use strict"))
- parse_error("Legacy octal escape sequences are not allowed in strict mode");
- return String.fromCharCode(parseInt(ch, 8));
- }
-
- function hex_bytes(n) {
- var num = 0;
- for (; n > 0; --n) {
- var digit = parseInt(next(true), 16);
- if (isNaN(digit))
- parse_error("Invalid hex-character pattern in string");
- num = (num << 4) | digit;
- }
- return num;
- }
-
- var read_string = with_eof_error("Unterminated string constant", function(quote_char) {
- var quote = next(), ret = "";
- for (;;) {
- var ch = next(true, true);
- if (ch == "\\") ch = read_escaped_char(true);
- else if (NEWLINE_CHARS[ch]) parse_error("Unterminated string constant");
- else if (ch == quote) break;
- ret += ch;
- }
- var tok = token("string", ret);
- tok.quote = quote_char;
- return tok;
- });
-
- function skip_line_comment(type) {
- var regex_allowed = S.regex_allowed;
- var i = find_eol(), ret;
- if (i == -1) {
- ret = S.text.substr(S.pos);
- S.pos = S.text.length;
- } else {
- ret = S.text.substring(S.pos, i);
- S.pos = i;
- }
- S.col = S.tokcol + (S.pos - S.tokpos);
- S.comments_before.push(token(type, ret, true));
- S.regex_allowed = regex_allowed;
- return next_token;
- }
-
- var skip_multiline_comment = with_eof_error("Unterminated multiline comment", function() {
- var regex_allowed = S.regex_allowed;
- var i = find("*/", true);
- var text = S.text.substring(S.pos, i).replace(/\r\n|\r|\u2028|\u2029/g, '\n');
- // update stream position
- forward(text.length /* doesn't count \r\n as 2 char while S.pos - i does */ + 2);
- S.comments_before.push(token("comment2", text, true));
- S.regex_allowed = regex_allowed;
- return next_token;
- });
-
- function read_name() {
- var backslash = false, name = "", ch, escaped = false, hex;
- while ((ch = peek()) != null) {
- if (!backslash) {
- if (ch == "\\") escaped = backslash = true, next();
- else if (is_identifier_char(ch)) name += next();
- else break;
- } else {
- if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX");
- ch = read_escaped_char();
- if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier");
- name += ch;
- backslash = false;
- }
- }
- if (KEYWORDS[name] && escaped) {
- hex = name.charCodeAt(0).toString(16).toUpperCase();
- name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
- }
- return name;
- }
-
- var read_regexp = with_eof_error("Unterminated regular expression", function(source) {
- var prev_backslash = false, ch, in_class = false;
- while ((ch = next(true))) if (NEWLINE_CHARS[ch]) {
- parse_error("Unexpected line terminator");
- } else if (prev_backslash) {
- source += "\\" + ch;
- prev_backslash = false;
- } else if (ch == "[") {
- in_class = true;
- source += ch;
- } else if (ch == "]" && in_class) {
- in_class = false;
- source += ch;
- } else if (ch == "/" && !in_class) {
- break;
- } else if (ch == "\\") {
- prev_backslash = true;
- } else {
- source += ch;
- }
- var mods = read_name();
- try {
- var regexp = new RegExp(source, mods);
- regexp.raw_source = source;
- return token("regexp", regexp);
- } catch (e) {
- parse_error(e.message);
- }
- });
-
- function read_operator(prefix) {
- function grow(op) {
- if (!peek()) return op;
- var bigger = op + peek();
- if (OPERATORS[bigger]) {
- next();
- return grow(bigger);
- } else {
- return op;
- }
- }
- return token("operator", grow(prefix || next()));
- }
-
- function handle_slash() {
- next();
- switch (peek()) {
- case "/":
- next();
- return skip_line_comment("comment1");
- case "*":
- next();
- return skip_multiline_comment();
- }
- return S.regex_allowed ? read_regexp("") : read_operator("/");
- }
-
- function handle_dot() {
- next();
- return is_digit(peek().charCodeAt(0)) ? read_num(".") : token("punc", ".");
- }
-
- function read_word() {
- var word = read_name();
- if (prev_was_dot) return token("name", word);
- return KEYWORDS_ATOM[word] ? token("atom", word)
- : !KEYWORDS[word] ? token("name", word)
- : OPERATORS[word] ? token("operator", word)
- : token("keyword", word);
- }
-
- function with_eof_error(eof_error, cont) {
- return function(x) {
- try {
- return cont(x);
- } catch (ex) {
- if (ex === EX_EOF) parse_error(eof_error);
- else throw ex;
- }
- };
- }
-
- function next_token(force_regexp) {
- if (force_regexp != null)
- return read_regexp(force_regexp);
- if (shebang && S.pos == 0 && looking_at("#!")) {
- start_token();
- forward(2);
- skip_line_comment("comment5");
- }
- for (;;) {
- skip_whitespace();
- start_token();
- if (html5_comments) {
- if (looking_at("") && S.newline_before) {
- forward(3);
- skip_line_comment("comment4");
- continue;
- }
- }
- var ch = peek();
- if (!ch) return token("eof");
- var code = ch.charCodeAt(0);
- switch (code) {
- case 34: case 39: return read_string(ch);
- case 46: return handle_dot();
- case 47:
- var tok = handle_slash();
- if (tok === next_token) continue;
- return tok;
- }
- if (is_digit(code)) return read_num();
- if (PUNC_CHARS[ch]) return token("punc", next());
- if (OPERATOR_CHARS[ch]) return read_operator();
- if (code == 92 || is_identifier_start(code)) return read_word();
- break;
- }
- parse_error("Unexpected character '" + ch + "'");
- }
-
- next_token.context = function(nc) {
- if (nc) S = nc;
- return S;
- };
-
- next_token.add_directive = function(directive) {
- S.directive_stack[S.directive_stack.length - 1].push(directive);
- if (S.directives[directive]) S.directives[directive]++;
- else S.directives[directive] = 1;
- }
-
- next_token.push_directives_stack = function() {
- S.directive_stack.push([]);
- }
-
- next_token.pop_directives_stack = function() {
- var directives = S.directive_stack.pop();
- for (var i = directives.length; --i >= 0;) {
- S.directives[directives[i]]--;
- }
- }
-
- next_token.has_directive = function(directive) {
- return S.directives[directive] > 0;
- }
-
- return next_token;
-}
-
-/* -----[ Parser (constants) ]----- */
-
-var UNARY_PREFIX = makePredicate("typeof void delete -- ++ ! ~ - +");
-
-var UNARY_POSTFIX = makePredicate("-- ++");
-
-var ASSIGNMENT = makePredicate("= += -= /= *= %= >>= <<= >>>= |= ^= &=");
-
-var PRECEDENCE = function(a, ret) {
- for (var i = 0; i < a.length;) {
- var b = a[i++];
- for (var j = 0; j < b.length; j++) {
- ret[b[j]] = i;
- }
- }
- return ret;
-}([
- ["||"],
- ["&&"],
- ["|"],
- ["^"],
- ["&"],
- ["==", "===", "!=", "!=="],
- ["<", ">", "<=", ">=", "in", "instanceof"],
- [">>", "<<", ">>>"],
- ["+", "-"],
- ["*", "/", "%"]
-], {});
-
-var ATOMIC_START_TOKEN = makePredicate("atom num string regexp name");
-
-/* -----[ Parser ]----- */
-
-function parse($TEXT, options) {
- options = defaults(options, {
- bare_returns : false,
- expression : false,
- filename : null,
- html5_comments : true,
- shebang : true,
- strict : false,
- toplevel : null,
- }, true);
-
- var S = {
- input : typeof $TEXT == "string"
- ? tokenizer($TEXT, options.filename, options.html5_comments, options.shebang)
- : $TEXT,
- token : null,
- prev : null,
- peeked : null,
- in_function : 0,
- in_directives : true,
- in_loop : 0,
- labels : []
- };
-
- S.token = next();
-
- function is(type, value) {
- return is_token(S.token, type, value);
- }
-
- function peek() {
- return S.peeked || (S.peeked = S.input());
- }
-
- function next() {
- S.prev = S.token;
- if (S.peeked) {
- S.token = S.peeked;
- S.peeked = null;
- } else {
- S.token = S.input();
- }
- S.in_directives = S.in_directives && (
- S.token.type == "string" || is("punc", ";")
- );
- return S.token;
- }
-
- function prev() {
- return S.prev;
- }
-
- function croak(msg, line, col, pos) {
- var ctx = S.input.context();
- js_error(msg,
- ctx.filename,
- line != null ? line : ctx.tokline,
- col != null ? col : ctx.tokcol,
- pos != null ? pos : ctx.tokpos);
- }
-
- function token_error(token, msg) {
- croak(msg, token.line, token.col);
- }
-
- function token_to_string(type, value) {
- return type + (value === undefined ? "" : " «" + value + "»");
- }
-
- function unexpected(token) {
- if (token == null) token = S.token;
- token_error(token, "Unexpected token: " + token_to_string(token.type, token.value));
- }
-
- function expect_token(type, val) {
- if (is(type, val)) return next();
- token_error(S.token, "Unexpected token: " + token_to_string(S.token.type, S.token.value) + ", expected: " + token_to_string(type, val));
- }
-
- function expect(punc) {
- return expect_token("punc", punc);
- }
-
- function has_newline_before(token) {
- return token.nlb || !all(token.comments_before, function(comment) {
- return !comment.nlb;
- });
- }
-
- function can_insert_semicolon() {
- return !options.strict
- && (is("eof") || is("punc", "}") || has_newline_before(S.token));
- }
-
- function semicolon(optional) {
- if (is("punc", ";")) next();
- else if (!optional && !can_insert_semicolon()) expect_token("punc", ";");
- }
-
- function parenthesised() {
- expect("(");
- var exp = expression(true);
- expect(")");
- return exp;
- }
-
- function embed_tokens(parser) {
- return function() {
- var start = S.token;
- var expr = parser.apply(null, arguments);
- var end = prev();
- expr.start = start;
- expr.end = end;
- return expr;
- };
- }
-
- function handle_regexp() {
- if (is("operator", "/") || is("operator", "/=")) {
- S.peeked = null;
- S.token = S.input(S.token.value.substr(1)); // force regexp
- }
- }
-
- var statement = embed_tokens(function(strict_defun) {
- handle_regexp();
- switch (S.token.type) {
- case "string":
- var dir = S.in_directives;
- var body = expression(true);
- if (dir) {
- if (body instanceof AST_String) {
- var value = body.start.raw.slice(1, -1);
- S.input.add_directive(value);
- body.value = value;
- } else {
- S.in_directives = dir = false;
- }
- }
- semicolon();
- return dir ? new AST_Directive(body) : new AST_SimpleStatement({ body: body });
- case "num":
- case "regexp":
- case "operator":
- case "atom":
- return simple_statement();
-
- case "name":
- return is_token(peek(), "punc", ":")
- ? labeled_statement()
- : simple_statement();
-
- case "punc":
- switch (S.token.value) {
- case "{":
- return new AST_BlockStatement({
- start : S.token,
- body : block_(),
- end : prev()
- });
- case "[":
- case "(":
- return simple_statement();
- case ";":
- S.in_directives = false;
- next();
- return new AST_EmptyStatement();
- default:
- unexpected();
- }
-
- case "keyword":
- switch (S.token.value) {
- case "break":
- next();
- return break_cont(AST_Break);
-
- case "continue":
- next();
- return break_cont(AST_Continue);
-
- case "debugger":
- next();
- semicolon();
- return new AST_Debugger();
-
- case "do":
- next();
- var body = in_loop(statement);
- expect_token("keyword", "while");
- var condition = parenthesised();
- semicolon(true);
- return new AST_Do({
- body : body,
- condition : condition
- });
-
- case "while":
- next();
- return new AST_While({
- condition : parenthesised(),
- body : in_loop(statement)
- });
-
- case "for":
- next();
- return for_();
-
- case "function":
- if (!strict_defun && S.input.has_directive("use strict")) {
- croak("In strict mode code, functions can only be declared at top level or immediately within another function.");
- }
- next();
- return function_(AST_Defun);
-
- case "if":
- next();
- return if_();
-
- case "return":
- if (S.in_function == 0 && !options.bare_returns)
- croak("'return' outside of function");
- next();
- var value = null;
- if (is("punc", ";")) {
- next();
- } else if (!can_insert_semicolon()) {
- value = expression(true);
- semicolon();
- }
- return new AST_Return({
- value: value
- });
-
- case "switch":
- next();
- return new AST_Switch({
- expression : parenthesised(),
- body : in_loop(switch_body_)
- });
-
- case "throw":
- next();
- if (has_newline_before(S.token))
- croak("Illegal newline after 'throw'");
- var value = expression(true);
- semicolon();
- return new AST_Throw({
- value: value
- });
-
- case "try":
- next();
- return try_();
-
- case "var":
- next();
- var node = var_();
- semicolon();
- return node;
-
- case "with":
- if (S.input.has_directive("use strict")) {
- croak("Strict mode may not include a with statement");
- }
- next();
- return new AST_With({
- expression : parenthesised(),
- body : statement()
- });
- }
- }
- unexpected();
- });
-
- function labeled_statement() {
- var label = as_symbol(AST_Label);
- if (!all(S.labels, function(l) {
- return l.name != label.name;
- })) {
- // ECMA-262, 12.12: An ECMAScript program is considered
- // syntactically incorrect if it contains a
- // LabelledStatement that is enclosed by a
- // LabelledStatement with the same Identifier as label.
- croak("Label " + label.name + " defined twice");
- }
- expect(":");
- S.labels.push(label);
- var stat = statement();
- S.labels.pop();
- if (!(stat instanceof AST_IterationStatement)) {
- // check for `continue` that refers to this label.
- // those should be reported as syntax errors.
- // https://github.com/mishoo/UglifyJS2/issues/287
- label.references.forEach(function(ref) {
- if (ref instanceof AST_Continue) {
- ref = ref.label.start;
- croak("Continue label `" + label.name + "` refers to non-IterationStatement.",
- ref.line, ref.col, ref.pos);
- }
- });
- }
- return new AST_LabeledStatement({ body: stat, label: label });
- }
-
- function simple_statement() {
- var body = expression(true);
- semicolon();
- return new AST_SimpleStatement({ body: body });
- }
-
- function break_cont(type) {
- var label = null, ldef;
- if (!can_insert_semicolon()) {
- label = as_symbol(AST_LabelRef, true);
- }
- if (label != null) {
- ldef = find_if(function(l) {
- return l.name == label.name;
- }, S.labels);
- if (!ldef) croak("Undefined label " + label.name);
- label.thedef = ldef;
- } else if (S.in_loop == 0) croak(type.TYPE + " not inside a loop or switch");
- semicolon();
- var stat = new type({ label: label });
- if (ldef) ldef.references.push(stat);
- return stat;
- }
-
- function for_() {
- expect("(");
- var init = null;
- if (!is("punc", ";")) {
- init = is("keyword", "var")
- ? (next(), var_(true))
- : expression(true, true);
- if (is("operator", "in")) {
- if (init instanceof AST_Var) {
- if (init.definitions.length > 1)
- croak("Only one variable declaration allowed in for..in loop", init.start.line, init.start.col, init.start.pos);
- } else if (!is_assignable(init)) {
- croak("Invalid left-hand side in for..in loop", init.start.line, init.start.col, init.start.pos);
- }
- next();
- return for_in(init);
- }
- }
- return regular_for(init);
- }
-
- function regular_for(init) {
- expect(";");
- var test = is("punc", ";") ? null : expression(true);
- expect(";");
- var step = is("punc", ")") ? null : expression(true);
- expect(")");
- return new AST_For({
- init : init,
- condition : test,
- step : step,
- body : in_loop(statement)
- });
- }
-
- function for_in(init) {
- var obj = expression(true);
- expect(")");
- return new AST_ForIn({
- init : init,
- object : obj,
- body : in_loop(statement)
- });
- }
-
- var function_ = function(ctor) {
- var in_statement = ctor === AST_Defun;
- var name = is("name") ? as_symbol(in_statement ? AST_SymbolDefun : AST_SymbolLambda) : null;
- if (in_statement && !name)
- expect_token("name");
- if (name && ctor !== AST_Accessor && !(name instanceof AST_SymbolDeclaration))
- unexpected(prev());
- expect("(");
- var argnames = [];
- for (var first = true; !is("punc", ")");) {
- if (first) first = false; else expect(",");
- argnames.push(as_symbol(AST_SymbolFunarg));
- }
- next();
- var loop = S.in_loop;
- var labels = S.labels;
- ++S.in_function;
- S.in_directives = true;
- S.input.push_directives_stack();
- S.in_loop = 0;
- S.labels = [];
- var body = block_(true);
- if (S.input.has_directive("use strict")) {
- if (name) strict_verify_symbol(name);
- argnames.forEach(strict_verify_symbol);
- }
- S.input.pop_directives_stack();
- --S.in_function;
- S.in_loop = loop;
- S.labels = labels;
- return new ctor({
- name: name,
- argnames: argnames,
- body: body
- });
- };
-
- function if_() {
- var cond = parenthesised(), body = statement(), belse = null;
- if (is("keyword", "else")) {
- next();
- belse = statement();
- }
- return new AST_If({
- condition : cond,
- body : body,
- alternative : belse
- });
- }
-
- function block_(strict_defun) {
- expect("{");
- var a = [];
- while (!is("punc", "}")) {
- if (is("eof")) expect_token("punc", "}");
- a.push(statement(strict_defun));
- }
- next();
- return a;
- }
-
- function switch_body_() {
- expect("{");
- var a = [], cur = null, branch = null, tmp;
- while (!is("punc", "}")) {
- if (is("eof")) expect_token("punc", "}");
- if (is("keyword", "case")) {
- if (branch) branch.end = prev();
- cur = [];
- branch = new AST_Case({
- start : (tmp = S.token, next(), tmp),
- expression : expression(true),
- body : cur
- });
- a.push(branch);
- expect(":");
- } else if (is("keyword", "default")) {
- if (branch) branch.end = prev();
- cur = [];
- branch = new AST_Default({
- start : (tmp = S.token, next(), expect(":"), tmp),
- body : cur
- });
- a.push(branch);
- } else {
- if (!cur) unexpected();
- cur.push(statement());
- }
- }
- if (branch) branch.end = prev();
- next();
- return a;
- }
-
- function try_() {
- var body = block_(), bcatch = null, bfinally = null;
- if (is("keyword", "catch")) {
- var start = S.token;
- next();
- expect("(");
- var name = as_symbol(AST_SymbolCatch);
- expect(")");
- bcatch = new AST_Catch({
- start : start,
- argname : name,
- body : block_(),
- end : prev()
- });
- }
- if (is("keyword", "finally")) {
- var start = S.token;
- next();
- bfinally = new AST_Finally({
- start : start,
- body : block_(),
- end : prev()
- });
- }
- if (!bcatch && !bfinally)
- croak("Missing catch/finally blocks");
- return new AST_Try({
- body : body,
- bcatch : bcatch,
- bfinally : bfinally
- });
- }
-
- function vardefs(no_in) {
- var a = [];
- for (;;) {
- a.push(new AST_VarDef({
- start : S.token,
- name : as_symbol(AST_SymbolVar),
- value : is("operator", "=") ? (next(), expression(false, no_in)) : null,
- end : prev()
- }));
- if (!is("punc", ","))
- break;
- next();
- }
- return a;
- }
-
- var var_ = function(no_in) {
- return new AST_Var({
- start : prev(),
- definitions : vardefs(no_in),
- end : prev()
- });
- };
-
- var new_ = function(allow_calls) {
- var start = S.token;
- expect_token("operator", "new");
- var newexp = expr_atom(false), args;
- if (is("punc", "(")) {
- next();
- args = expr_list(")");
- } else {
- args = [];
- }
- var call = new AST_New({
- start : start,
- expression : newexp,
- args : args,
- end : prev()
- });
- mark_pure(call);
- return subscripts(call, allow_calls);
- };
-
- function as_atom_node() {
- var tok = S.token, ret;
- switch (tok.type) {
- case "name":
- ret = _make_symbol(AST_SymbolRef);
- break;
- case "num":
- ret = new AST_Number({ start: tok, end: tok, value: tok.value });
- break;
- case "string":
- ret = new AST_String({
- start : tok,
- end : tok,
- value : tok.value,
- quote : tok.quote
- });
- break;
- case "regexp":
- ret = new AST_RegExp({ start: tok, end: tok, value: tok.value });
- break;
- case "atom":
- switch (tok.value) {
- case "false":
- ret = new AST_False({ start: tok, end: tok });
- break;
- case "true":
- ret = new AST_True({ start: tok, end: tok });
- break;
- case "null":
- ret = new AST_Null({ start: tok, end: tok });
- break;
- }
- break;
- }
- next();
- return ret;
- }
-
- var expr_atom = function(allow_calls) {
- if (is("operator", "new")) {
- return new_(allow_calls);
- }
- var start = S.token;
- if (is("punc")) {
- switch (start.value) {
- case "(":
- next();
- var ex = expression(true);
- var len = start.comments_before.length;
- [].unshift.apply(ex.start.comments_before, start.comments_before);
- start.comments_before.length = 0;
- start.comments_before = ex.start.comments_before;
- start.comments_before_length = len;
- if (len == 0 && start.comments_before.length > 0) {
- var comment = start.comments_before[0];
- if (!comment.nlb) {
- comment.nlb = start.nlb;
- start.nlb = false;
- }
- }
- start.comments_after = ex.start.comments_after;
- ex.start = start;
- expect(")");
- var end = prev();
- end.comments_before = ex.end.comments_before;
- [].push.apply(ex.end.comments_after, end.comments_after);
- end.comments_after.length = 0;
- end.comments_after = ex.end.comments_after;
- ex.end = end;
- if (ex instanceof AST_Call) mark_pure(ex);
- return subscripts(ex, allow_calls);
- case "[":
- return subscripts(array_(), allow_calls);
- case "{":
- return subscripts(object_(), allow_calls);
- }
- unexpected();
- }
- if (is("keyword", "function")) {
- next();
- var func = function_(AST_Function);
- func.start = start;
- func.end = prev();
- return subscripts(func, allow_calls);
- }
- if (ATOMIC_START_TOKEN[S.token.type]) {
- return subscripts(as_atom_node(), allow_calls);
- }
- unexpected();
- };
-
- function expr_list(closing, allow_trailing_comma, allow_empty) {
- var first = true, a = [];
- while (!is("punc", closing)) {
- if (first) first = false; else expect(",");
- if (allow_trailing_comma && is("punc", closing)) break;
- if (is("punc", ",") && allow_empty) {
- a.push(new AST_Hole({ start: S.token, end: S.token }));
- } else {
- a.push(expression(false));
- }
- }
- next();
- return a;
- }
-
- var array_ = embed_tokens(function() {
- expect("[");
- return new AST_Array({
- elements: expr_list("]", !options.strict, true)
- });
- });
-
- var create_accessor = embed_tokens(function() {
- return function_(AST_Accessor);
- });
-
- var object_ = embed_tokens(function() {
- expect("{");
- var first = true, a = [];
- while (!is("punc", "}")) {
- if (first) first = false; else expect(",");
- if (!options.strict && is("punc", "}"))
- // allow trailing comma
- break;
- var start = S.token;
- var type = start.type;
- var name = as_property_name();
- if (type == "name" && !is("punc", ":")) {
- var key = new AST_SymbolAccessor({
- start: S.token,
- name: "" + as_property_name(),
- end: prev()
- });
- if (name == "get") {
- a.push(new AST_ObjectGetter({
- start : start,
- key : key,
- value : create_accessor(),
- end : prev()
- }));
- continue;
- }
- if (name == "set") {
- a.push(new AST_ObjectSetter({
- start : start,
- key : key,
- value : create_accessor(),
- end : prev()
- }));
- continue;
- }
- }
- expect(":");
- a.push(new AST_ObjectKeyVal({
- start : start,
- quote : start.quote,
- key : "" + name,
- value : expression(false),
- end : prev()
- }));
- }
- next();
- return new AST_Object({ properties: a });
- });
-
- function as_property_name() {
- var tmp = S.token;
- switch (tmp.type) {
- case "operator":
- if (!KEYWORDS[tmp.value]) unexpected();
- case "num":
- case "string":
- case "name":
- case "keyword":
- case "atom":
- next();
- return tmp.value;
- default:
- unexpected();
- }
- }
-
- function as_name() {
- if (!is("name")) expect_token("name");
- var name = S.token.value;
- next();
- return name;
- }
-
- function _make_symbol(type) {
- var name = S.token.value;
- return new (name == "this" ? AST_This : type)({
- name : String(name),
- start : S.token,
- end : S.token
- });
- }
-
- function strict_verify_symbol(sym) {
- if (sym.name == "arguments" || sym.name == "eval")
- croak("Unexpected " + sym.name + " in strict mode", sym.start.line, sym.start.col, sym.start.pos);
- }
-
- function as_symbol(type, noerror) {
- if (!is("name")) {
- if (!noerror) croak("Name expected");
- return null;
- }
- var sym = _make_symbol(type);
- if (S.input.has_directive("use strict") && sym instanceof AST_SymbolDeclaration) {
- strict_verify_symbol(sym);
- }
- next();
- return sym;
- }
-
- function mark_pure(call) {
- var start = call.start;
- var comments = start.comments_before;
- var i = HOP(start, "comments_before_length") ? start.comments_before_length : comments.length;
- while (--i >= 0) {
- var comment = comments[i];
- if (/[@#]__PURE__/.test(comment.value)) {
- call.pure = comment;
- break;
- }
- }
- }
-
- var subscripts = function(expr, allow_calls) {
- var start = expr.start;
- if (is("punc", ".")) {
- next();
- return subscripts(new AST_Dot({
- start : start,
- expression : expr,
- property : as_name(),
- end : prev()
- }), allow_calls);
- }
- if (is("punc", "[")) {
- next();
- var prop = expression(true);
- expect("]");
- return subscripts(new AST_Sub({
- start : start,
- expression : expr,
- property : prop,
- end : prev()
- }), allow_calls);
- }
- if (allow_calls && is("punc", "(")) {
- next();
- var call = new AST_Call({
- start : start,
- expression : expr,
- args : expr_list(")"),
- end : prev()
- });
- mark_pure(call);
- return subscripts(call, true);
- }
- return expr;
- };
-
- var maybe_unary = function(allow_calls) {
- var start = S.token;
- if (is("operator") && UNARY_PREFIX[start.value]) {
- next();
- handle_regexp();
- var ex = make_unary(AST_UnaryPrefix, start, maybe_unary(allow_calls));
- ex.start = start;
- ex.end = prev();
- return ex;
- }
- var val = expr_atom(allow_calls);
- while (is("operator") && UNARY_POSTFIX[S.token.value] && !has_newline_before(S.token)) {
- val = make_unary(AST_UnaryPostfix, S.token, val);
- val.start = start;
- val.end = S.token;
- next();
- }
- return val;
- };
-
- function make_unary(ctor, token, expr) {
- var op = token.value;
- switch (op) {
- case "++":
- case "--":
- if (!is_assignable(expr))
- croak("Invalid use of " + op + " operator", token.line, token.col, token.pos);
- break;
- case "delete":
- if (expr instanceof AST_SymbolRef && S.input.has_directive("use strict"))
- croak("Calling delete on expression not allowed in strict mode", expr.start.line, expr.start.col, expr.start.pos);
- break;
- }
- return new ctor({ operator: op, expression: expr });
- }
-
- var expr_op = function(left, min_prec, no_in) {
- var op = is("operator") ? S.token.value : null;
- if (op == "in" && no_in) op = null;
- var prec = op != null ? PRECEDENCE[op] : null;
- if (prec != null && prec > min_prec) {
- next();
- var right = expr_op(maybe_unary(true), prec, no_in);
- return expr_op(new AST_Binary({
- start : left.start,
- left : left,
- operator : op,
- right : right,
- end : right.end
- }), min_prec, no_in);
- }
- return left;
- };
-
- function expr_ops(no_in) {
- return expr_op(maybe_unary(true), 0, no_in);
- }
-
- var maybe_conditional = function(no_in) {
- var start = S.token;
- var expr = expr_ops(no_in);
- if (is("operator", "?")) {
- next();
- var yes = expression(false);
- expect(":");
- return new AST_Conditional({
- start : start,
- condition : expr,
- consequent : yes,
- alternative : expression(false, no_in),
- end : prev()
- });
- }
- return expr;
- };
-
- function is_assignable(expr) {
- return expr instanceof AST_PropAccess || expr instanceof AST_SymbolRef;
- }
-
- var maybe_assign = function(no_in) {
- var start = S.token;
- var left = maybe_conditional(no_in), val = S.token.value;
- if (is("operator") && ASSIGNMENT[val]) {
- if (is_assignable(left)) {
- next();
- return new AST_Assign({
- start : start,
- left : left,
- operator : val,
- right : maybe_assign(no_in),
- end : prev()
- });
- }
- croak("Invalid assignment");
- }
- return left;
- };
-
- var expression = function(commas, no_in) {
- var start = S.token;
- var exprs = [];
- while (true) {
- exprs.push(maybe_assign(no_in));
- if (!commas || !is("punc", ",")) break;
- next();
- commas = true;
- }
- return exprs.length == 1 ? exprs[0] : new AST_Sequence({
- start : start,
- expressions : exprs,
- end : peek()
- });
- };
-
- function in_loop(cont) {
- ++S.in_loop;
- var ret = cont();
- --S.in_loop;
- return ret;
- }
-
- if (options.expression) {
- handle_regexp();
- return expression(true);
- }
-
- return function() {
- var start = S.token;
- var body = [];
- S.input.push_directives_stack();
- while (!is("eof"))
- body.push(statement(true));
- S.input.pop_directives_stack();
- var end = prev();
- var toplevel = options.toplevel;
- if (toplevel) {
- toplevel.body = toplevel.body.concat(body);
- toplevel.end = end;
- } else {
- toplevel = new AST_Toplevel({ start: start, body: body, end: end });
- }
- return toplevel;
- }();
-}
diff --git a/node_modules/uglify-js/lib/propmangle.js b/node_modules/uglify-js/lib/propmangle.js
deleted file mode 100644
index 9f8bc7f..0000000
--- a/node_modules/uglify-js/lib/propmangle.js
+++ /dev/null
@@ -1,234 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-function find_builtins(reserved) {
- // NaN will be included due to Number.NaN
- [
- "null",
- "true",
- "false",
- "Infinity",
- "-Infinity",
- "undefined",
- ].forEach(add);
- [
- Array,
- Boolean,
- Date,
- Error,
- Function,
- Math,
- Number,
- Object,
- RegExp,
- String,
- ].forEach(function(ctor) {
- Object.getOwnPropertyNames(ctor).map(add);
- if (ctor.prototype) {
- Object.getOwnPropertyNames(ctor.prototype).map(add);
- }
- });
-
- function add(name) {
- push_uniq(reserved, name);
- }
-}
-
-function reserve_quoted_keys(ast, reserved) {
- ast.walk(new TreeWalker(function(node) {
- if (node instanceof AST_ObjectKeyVal && node.quote) {
- add(node.key);
- } else if (node instanceof AST_Sub) {
- addStrings(node.property, add);
- }
- }));
-
- function add(name) {
- push_uniq(reserved, name);
- }
-}
-
-function addStrings(node, add) {
- node.walk(new TreeWalker(function(node) {
- if (node instanceof AST_Sequence) {
- addStrings(node.tail_node(), add);
- } else if (node instanceof AST_String) {
- add(node.value);
- } else if (node instanceof AST_Conditional) {
- addStrings(node.consequent, add);
- addStrings(node.alternative, add);
- }
- return true;
- }));
-}
-
-function mangle_properties(ast, options) {
- options = defaults(options, {
- builtins: false,
- cache: null,
- debug: false,
- keep_quoted: false,
- only_cache: false,
- regex: null,
- reserved: null,
- }, true);
-
- var reserved = options.reserved;
- if (!Array.isArray(reserved)) reserved = [];
- if (!options.builtins) find_builtins(reserved);
-
- var cname = -1;
- var cache;
- if (options.cache) {
- cache = options.cache.props;
- cache.each(function(mangled_name) {
- push_uniq(reserved, mangled_name);
- });
- } else {
- cache = new Dictionary();
- }
-
- var regex = options.regex;
-
- // note debug is either false (disabled), or a string of the debug suffix to use (enabled).
- // note debug may be enabled as an empty string, which is falsey. Also treat passing 'true'
- // the same as passing an empty string.
- var debug = options.debug !== false;
- var debug_suffix;
- if (debug) debug_suffix = options.debug === true ? "" : options.debug;
-
- var names_to_mangle = [];
- var unmangleable = [];
-
- // step 1: find candidates to mangle
- ast.walk(new TreeWalker(function(node) {
- if (node instanceof AST_ObjectKeyVal) {
- add(node.key);
- } else if (node instanceof AST_ObjectProperty) {
- // setter or getter, since KeyVal is handled above
- add(node.key.name);
- } else if (node instanceof AST_Dot) {
- add(node.property);
- } else if (node instanceof AST_Sub) {
- addStrings(node.property, add);
- } else if (node instanceof AST_Call
- && node.expression.print_to_string() == "Object.defineProperty") {
- addStrings(node.args[1], add);
- }
- }));
-
- // step 2: transform the tree, renaming properties
- return ast.transform(new TreeTransformer(function(node) {
- if (node instanceof AST_ObjectKeyVal) {
- node.key = mangle(node.key);
- } else if (node instanceof AST_ObjectProperty) {
- // setter or getter
- node.key.name = mangle(node.key.name);
- } else if (node instanceof AST_Dot) {
- node.property = mangle(node.property);
- } else if (!options.keep_quoted && node instanceof AST_Sub) {
- node.property = mangleStrings(node.property);
- } else if (node instanceof AST_Call
- && node.expression.print_to_string() == "Object.defineProperty") {
- node.args[1] = mangleStrings(node.args[1]);
- }
- }));
-
- // only function declarations after this line
-
- function can_mangle(name) {
- if (unmangleable.indexOf(name) >= 0) return false;
- if (reserved.indexOf(name) >= 0) return false;
- if (options.only_cache) return cache.has(name);
- if (/^-?[0-9]+(\.[0-9]+)?(e[+-][0-9]+)?$/.test(name)) return false;
- return true;
- }
-
- function should_mangle(name) {
- if (regex && !regex.test(name)) return false;
- if (reserved.indexOf(name) >= 0) return false;
- return cache.has(name) || names_to_mangle.indexOf(name) >= 0;
- }
-
- function add(name) {
- if (can_mangle(name)) push_uniq(names_to_mangle, name);
- if (!should_mangle(name)) push_uniq(unmangleable, name);
- }
-
- function mangle(name) {
- if (!should_mangle(name)) {
- return name;
- }
- var mangled = cache.get(name);
- if (!mangled) {
- if (debug) {
- // debug mode: use a prefix and suffix to preserve readability, e.g. o.foo -> o._$foo$NNN_.
- var debug_mangled = "_$" + name + "$" + debug_suffix + "_";
- if (can_mangle(debug_mangled)) mangled = debug_mangled;
- }
- // either debug mode is off, or it is on and we could not use the mangled name
- if (!mangled) do {
- mangled = base54(++cname);
- } while (!can_mangle(mangled));
- cache.set(name, mangled);
- }
- return mangled;
- }
-
- function mangleStrings(node) {
- return node.transform(new TreeTransformer(function(node) {
- if (node instanceof AST_Sequence) {
- var last = node.expressions.length - 1;
- node.expressions[last] = mangleStrings(node.expressions[last]);
- } else if (node instanceof AST_String) {
- node.value = mangle(node.value);
- } else if (node instanceof AST_Conditional) {
- node.consequent = mangleStrings(node.consequent);
- node.alternative = mangleStrings(node.alternative);
- }
- return node;
- }));
- }
-}
diff --git a/node_modules/uglify-js/lib/scope.js b/node_modules/uglify-js/lib/scope.js
deleted file mode 100644
index 896efac..0000000
--- a/node_modules/uglify-js/lib/scope.js
+++ /dev/null
@@ -1,621 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-function SymbolDef(scope, orig, init) {
- this.name = orig.name;
- this.orig = [ orig ];
- this.init = init;
- this.eliminated = 0;
- this.scope = scope;
- this.references = [];
- this.replaced = 0;
- this.global = false;
- this.mangled_name = null;
- this.undeclared = false;
- this.id = SymbolDef.next_id++;
- this.lambda = orig instanceof AST_SymbolLambda;
-}
-
-SymbolDef.next_id = 1;
-
-SymbolDef.prototype = {
- unmangleable: function(options) {
- return this.global && !options.toplevel
- || this.undeclared
- || !options.eval && this.scope.pinned()
- || options.keep_fnames
- && (this.orig[0] instanceof AST_SymbolLambda
- || this.orig[0] instanceof AST_SymbolDefun);
- },
- mangle: function(options) {
- var cache = options.cache && options.cache.props;
- if (this.global && cache && cache.has(this.name)) {
- this.mangled_name = cache.get(this.name);
- } else if (!this.mangled_name && !this.unmangleable(options)) {
- var def;
- if (def = this.redefined()) {
- this.mangled_name = def.mangled_name || def.name;
- } else {
- this.mangled_name = next_mangled_name(this.scope, options, this);
- }
- if (this.global && cache) {
- cache.set(this.name, this.mangled_name);
- }
- }
- },
- redefined: function() {
- return this.defun && this.defun.variables.get(this.name);
- }
-};
-
-AST_Toplevel.DEFMETHOD("figure_out_scope", function(options) {
- options = defaults(options, {
- cache: null,
- ie8: false,
- });
-
- // pass 1: setup scope chaining and handle definitions
- var self = this;
- var scope = self.parent_scope = null;
- var defun = null;
- var tw = new TreeWalker(function(node, descend) {
- if (node instanceof AST_Catch) {
- var save_scope = scope;
- scope = new AST_Scope(node);
- scope.init_scope_vars(save_scope);
- descend();
- scope = save_scope;
- return true;
- }
- if (node instanceof AST_Scope) {
- node.init_scope_vars(scope);
- var save_scope = scope;
- var save_defun = defun;
- defun = scope = node;
- descend();
- scope = save_scope;
- defun = save_defun;
- return true;
- }
- if (node instanceof AST_With) {
- for (var s = scope; s; s = s.parent_scope) s.uses_with = true;
- return;
- }
- if (node instanceof AST_Symbol) {
- node.scope = scope;
- }
- if (node instanceof AST_Label) {
- node.thedef = node;
- node.references = [];
- }
- if (node instanceof AST_SymbolDefun) {
- // This should be defined in the parent scope, as we encounter the
- // AST_Defun node before getting to its AST_Symbol.
- (node.scope = defun.parent_scope.resolve()).def_function(node, defun);
- } else if (node instanceof AST_SymbolLambda) {
- var def = defun.def_function(node, node.name == "arguments" ? undefined : defun);
- if (options.ie8) def.defun = defun.parent_scope.resolve();
- } else if (node instanceof AST_SymbolVar) {
- defun.def_variable(node, node.TYPE == "SymbolVar" ? null : undefined);
- if (defun !== scope) {
- node.mark_enclosed(options);
- var def = scope.find_variable(node);
- if (node.thedef !== def) {
- node.thedef = def;
- }
- node.reference(options);
- }
- } else if (node instanceof AST_SymbolCatch) {
- scope.def_variable(node).defun = defun;
- }
- });
- self.walk(tw);
-
- // pass 2: find back references and eval
- self.globals = new Dictionary();
- var tw = new TreeWalker(function(node) {
- if (node instanceof AST_LoopControl) {
- if (node.label) node.label.thedef.references.push(node);
- return true;
- }
- if (node instanceof AST_SymbolRef) {
- var name = node.name;
- if (name == "eval" && tw.parent() instanceof AST_Call) {
- for (var s = node.scope; s && !s.uses_eval; s = s.parent_scope) {
- s.uses_eval = true;
- }
- }
- var sym = node.scope.find_variable(name);
- if (!sym) {
- sym = self.def_global(node);
- } else if (sym.scope instanceof AST_Lambda && name == "arguments") {
- sym.scope.uses_arguments = true;
- }
- node.thedef = sym;
- node.reference(options);
- return true;
- }
- // ensure mangling works if catch reuses a scope variable
- if (node instanceof AST_SymbolCatch) {
- var def = node.definition().redefined();
- if (def) for (var s = node.scope; s; s = s.parent_scope) {
- push_uniq(s.enclosed, def);
- if (s === def.scope) break;
- }
- return true;
- }
- });
- self.walk(tw);
-
- // pass 3: fix up any scoping issue with IE8
- if (options.ie8) self.walk(new TreeWalker(function(node) {
- if (node instanceof AST_SymbolCatch) {
- var scope = node.thedef.defun;
- if (scope.name instanceof AST_SymbolLambda && scope.name.name == node.name) {
- scope = scope.parent_scope.resolve();
- }
- redefine(node, scope);
- return true;
- }
- if (node instanceof AST_SymbolLambda) {
- var def = node.thedef;
- redefine(node, node.scope.parent_scope.resolve());
- if (typeof node.thedef.init !== "undefined") {
- node.thedef.init = false;
- } else if (def.init) {
- node.thedef.init = def.init;
- }
- return true;
- }
- }));
-
- function redefine(node, scope) {
- var name = node.name;
- var old_def = node.thedef;
- var new_def = scope.find_variable(name);
- if (new_def) {
- var redef;
- while (redef = new_def.redefined()) new_def = redef;
- } else {
- new_def = self.globals.get(name) || scope.def_variable(node);
- }
- old_def.orig.concat(old_def.references).forEach(function(node) {
- node.thedef = new_def;
- node.reference(options);
- });
- if (old_def.lambda) new_def.lambda = true;
- if (new_def.undeclared) self.variables.set(name, new_def);
- }
-});
-
-AST_Toplevel.DEFMETHOD("def_global", function(node) {
- var globals = this.globals, name = node.name;
- if (globals.has(name)) {
- return globals.get(name);
- } else {
- var g = new SymbolDef(this, node);
- g.undeclared = true;
- g.global = true;
- globals.set(name, g);
- return g;
- }
-});
-
-AST_Scope.DEFMETHOD("init_scope_vars", function(parent_scope) {
- this.variables = new Dictionary(); // map name to AST_SymbolVar (variables defined in this scope; includes functions)
- this.functions = new Dictionary(); // map name to AST_SymbolDefun (functions defined in this scope)
- this.uses_with = false; // will be set to true if this or some nested scope uses the `with` statement
- this.uses_eval = false; // will be set to true if this or nested scope uses the global `eval`
- this.parent_scope = parent_scope; // the parent scope
- this.enclosed = []; // a list of variables from this or outer scope(s) that are referenced from this or inner scopes
- this.cname = -1; // the current index for mangling functions/variables
-});
-
-AST_Lambda.DEFMETHOD("init_scope_vars", function() {
- AST_Scope.prototype.init_scope_vars.apply(this, arguments);
- this.uses_arguments = false;
- this.def_variable(new AST_SymbolFunarg({
- name: "arguments",
- start: this.start,
- end: this.end
- }));
-});
-
-AST_Symbol.DEFMETHOD("mark_enclosed", function(options) {
- var def = this.definition();
- for (var s = this.scope; s; s = s.parent_scope) {
- push_uniq(s.enclosed, def);
- if (options.keep_fnames) {
- s.functions.each(function(d) {
- push_uniq(def.scope.enclosed, d);
- });
- }
- if (s === def.scope) break;
- }
-});
-
-AST_Symbol.DEFMETHOD("reference", function(options) {
- this.definition().references.push(this);
- this.mark_enclosed(options);
-});
-
-AST_Scope.DEFMETHOD("find_variable", function(name) {
- if (name instanceof AST_Symbol) name = name.name;
- return this.variables.get(name)
- || (this.parent_scope && this.parent_scope.find_variable(name));
-});
-
-AST_Scope.DEFMETHOD("def_function", function(symbol, init) {
- var def = this.def_variable(symbol, init);
- if (!def.init || def.init instanceof AST_Defun) def.init = init;
- this.functions.set(symbol.name, def);
- return def;
-});
-
-AST_Scope.DEFMETHOD("def_variable", function(symbol, init) {
- var def = this.variables.get(symbol.name);
- if (def) {
- def.orig.push(symbol);
- if (def.init instanceof AST_Function) def.init = init;
- } else {
- def = new SymbolDef(this, symbol, init);
- this.variables.set(symbol.name, def);
- def.global = !this.parent_scope;
- }
- return symbol.thedef = def;
-});
-
-AST_Lambda.DEFMETHOD("resolve", return_this);
-AST_Scope.DEFMETHOD("resolve", function() {
- return this.parent_scope.resolve();
-});
-AST_Toplevel.DEFMETHOD("resolve", return_this);
-
-function names_in_use(scope, options) {
- var names = scope.names_in_use;
- if (!names) {
- scope.names_in_use = names = Object.create(scope.mangled_names || null);
- scope.cname_holes = [];
- var cache = options.cache && options.cache.props;
- scope.enclosed.forEach(function(def) {
- if (def.unmangleable(options)) names[def.name] = true;
- if (def.global && cache && cache.has(def.name)) {
- names[cache.get(def.name)] = true;
- }
- });
- }
- return names;
-}
-
-function next_mangled_name(scope, options, def) {
- var in_use = names_in_use(scope, options);
- var holes = scope.cname_holes;
- var names = Object.create(null);
- var scopes = [ scope ];
- def.references.forEach(function(sym) {
- var scope = sym.scope;
- do {
- if (scopes.indexOf(scope) < 0) {
- for (var name in names_in_use(scope, options)) {
- names[name] = true;
- }
- scopes.push(scope);
- } else break;
- } while (scope = scope.parent_scope);
- });
- var name;
- for (var i = 0; i < holes.length; i++) {
- name = base54(holes[i]);
- if (names[name]) continue;
- holes.splice(i, 1);
- scope.names_in_use[name] = true;
- return name;
- }
- while (true) {
- name = base54(++scope.cname);
- if (in_use[name] || RESERVED_WORDS[name] || options.reserved.has[name]) continue;
- if (!names[name]) break;
- holes.push(scope.cname);
- }
- scope.names_in_use[name] = true;
- return name;
-}
-
-AST_Symbol.DEFMETHOD("unmangleable", function(options) {
- var def = this.definition();
- return !def || def.unmangleable(options);
-});
-
-// labels are always mangleable
-AST_Label.DEFMETHOD("unmangleable", return_false);
-
-AST_Symbol.DEFMETHOD("unreferenced", function() {
- return !this.definition().references.length && !this.scope.pinned();
-});
-
-AST_Symbol.DEFMETHOD("definition", function() {
- return this.thedef;
-});
-
-AST_Symbol.DEFMETHOD("global", function() {
- return this.definition().global;
-});
-
-function _default_mangler_options(options) {
- options = defaults(options, {
- eval : false,
- ie8 : false,
- keep_fnames : false,
- reserved : [],
- toplevel : false,
- });
- if (!Array.isArray(options.reserved)) options.reserved = [];
- // Never mangle arguments
- push_uniq(options.reserved, "arguments");
- options.reserved.has = makePredicate(options.reserved);
- return options;
-}
-
-AST_Toplevel.DEFMETHOD("mangle_names", function(options) {
- options = _default_mangler_options(options);
-
- // We only need to mangle declaration nodes. Special logic wired
- // into the code generator will display the mangled name if it's
- // present (and for AST_SymbolRef-s it'll use the mangled name of
- // the AST_SymbolDeclaration that it points to).
- var lname = -1;
-
- if (options.cache && options.cache.props) {
- var mangled_names = this.mangled_names = Object.create(null);
- options.cache.props.each(function(mangled_name) {
- mangled_names[mangled_name] = true;
- });
- }
-
- var redefined = [];
- var tw = new TreeWalker(function(node, descend) {
- if (node instanceof AST_LabeledStatement) {
- // lname is incremented when we get to the AST_Label
- var save_nesting = lname;
- descend();
- lname = save_nesting;
- return true;
- }
- if (node instanceof AST_Scope) {
- descend();
- if (options.cache && node instanceof AST_Toplevel) {
- node.globals.each(mangle);
- }
- if (node instanceof AST_Defun && tw.has_directive("use asm")) {
- var sym = new AST_SymbolRef(node.name);
- sym.scope = node;
- sym.reference(options);
- }
- node.variables.each(function(def) {
- if (!defer_redef(def)) mangle(def);
- });
- return true;
- }
- if (node instanceof AST_Label) {
- var name;
- do {
- name = base54(++lname);
- } while (RESERVED_WORDS[name]);
- node.mangled_name = name;
- return true;
- }
- if (!options.ie8 && node instanceof AST_Catch) {
- var def = node.argname.definition();
- var redef = defer_redef(def, node.argname);
- descend();
- if (!redef) mangle(def);
- return true;
- }
- });
- this.walk(tw);
- redefined.forEach(mangle);
-
- function mangle(def) {
- if (options.reserved.has[def.name]) return;
- def.mangle(options);
- }
-
- function defer_redef(def, node) {
- var redef = def.redefined();
- if (!redef) return false;
- redefined.push(def);
- def.references.forEach(reference);
- if (node) reference(node);
- return true;
-
- function reference(sym) {
- sym.thedef = redef;
- sym.reference(options);
- sym.thedef = def;
- }
- }
-});
-
-AST_Toplevel.DEFMETHOD("find_colliding_names", function(options) {
- var cache = options.cache && options.cache.props;
- var avoid = Object.create(null);
- options.reserved.forEach(to_avoid);
- this.globals.each(add_def);
- this.walk(new TreeWalker(function(node) {
- if (node instanceof AST_Scope) node.variables.each(add_def);
- if (node instanceof AST_SymbolCatch) add_def(node.definition());
- }));
- return avoid;
-
- function to_avoid(name) {
- avoid[name] = true;
- }
-
- function add_def(def) {
- var name = def.name;
- if (def.global && cache && cache.has(name)) name = cache.get(name);
- else if (!def.unmangleable(options)) return;
- to_avoid(name);
- }
-});
-
-AST_Toplevel.DEFMETHOD("expand_names", function(options) {
- base54.reset();
- base54.sort();
- options = _default_mangler_options(options);
- var avoid = this.find_colliding_names(options);
- var cname = 0;
- this.globals.each(rename);
- this.walk(new TreeWalker(function(node) {
- if (node instanceof AST_Scope) node.variables.each(rename);
- if (node instanceof AST_SymbolCatch) rename(node.definition());
- }));
-
- function next_name() {
- var name;
- do {
- name = base54(cname++);
- } while (avoid[name] || RESERVED_WORDS[name]);
- return name;
- }
-
- function rename(def) {
- if (def.global && options.cache) return;
- if (def.unmangleable(options)) return;
- if (options.reserved.has[def.name]) return;
- var redef = def.redefined();
- var name = redef ? redef.rename || redef.name : next_name();
- def.rename = name;
- def.orig.forEach(function(sym) {
- sym.name = name;
- });
- def.references.forEach(function(sym) {
- sym.name = name;
- });
- }
-});
-
-AST_Node.DEFMETHOD("tail_node", return_this);
-AST_Sequence.DEFMETHOD("tail_node", function() {
- return this.expressions[this.expressions.length - 1];
-});
-
-AST_Toplevel.DEFMETHOD("compute_char_frequency", function(options) {
- options = _default_mangler_options(options);
- base54.reset();
- try {
- AST_Node.prototype.print = function(stream, force_parens) {
- this._print(stream, force_parens);
- if (this instanceof AST_Symbol && !this.unmangleable(options)) {
- base54.consider(this.name, -1);
- } else if (options.properties) {
- if (this instanceof AST_Dot) {
- base54.consider(this.property, -1);
- } else if (this instanceof AST_Sub) {
- skip_string(this.property);
- }
- }
- };
- base54.consider(this.print_to_string(), 1);
- } finally {
- AST_Node.prototype.print = AST_Node.prototype._print;
- }
- base54.sort();
-
- function skip_string(node) {
- if (node instanceof AST_String) {
- base54.consider(node.value, -1);
- } else if (node instanceof AST_Conditional) {
- skip_string(node.consequent);
- skip_string(node.alternative);
- } else if (node instanceof AST_Sequence) {
- skip_string(node.tail_node());
- }
- }
-});
-
-var base54 = (function() {
- var freq = Object.create(null);
- function init(chars) {
- var array = [];
- for (var i = 0; i < chars.length; i++) {
- var ch = chars[i];
- array.push(ch);
- freq[ch] = -1e-2 * i;
- }
- return array;
- }
- var digits = init("0123456789");
- var leading = init("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_");
- var chars, frequency;
- function reset() {
- frequency = Object.create(freq);
- }
- base54.consider = function(str, delta) {
- for (var i = str.length; --i >= 0;) {
- frequency[str[i]] += delta;
- }
- };
- function compare(a, b) {
- return frequency[b] - frequency[a];
- }
- base54.sort = function() {
- chars = leading.sort(compare).concat(digits.sort(compare));
- };
- base54.reset = reset;
- reset();
- function base54(num) {
- var ret = "", base = 54;
- num++;
- do {
- num--;
- ret += chars[num % base];
- num = Math.floor(num / base);
- base = 64;
- } while (num > 0);
- return ret;
- }
- return base54;
-})();
diff --git a/node_modules/uglify-js/lib/sourcemap.js b/node_modules/uglify-js/lib/sourcemap.js
deleted file mode 100644
index 2feec45..0000000
--- a/node_modules/uglify-js/lib/sourcemap.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-// a small wrapper around fitzgen's source-map library
-function SourceMap(options) {
- options = defaults(options, {
- file: null,
- root: null,
- orig: null,
- orig_line_diff: 0,
- dest_line_diff: 0,
- }, true);
- var generator = new MOZ_SourceMap.SourceMapGenerator({
- file: options.file,
- sourceRoot: options.root
- });
- var maps = options.orig && Object.create(null);
- if (maps) for (var source in options.orig) {
- var map = new MOZ_SourceMap.SourceMapConsumer(options.orig[source]);
- if (Array.isArray(options.orig[source].sources)) {
- map._sources.toArray().forEach(function(source) {
- var sourceContent = map.sourceContentFor(source, true);
- if (sourceContent) generator.setSourceContent(source, sourceContent);
- });
- }
- maps[source] = map;
- }
- return {
- add: function(source, gen_line, gen_col, orig_line, orig_col, name) {
- var map = maps && maps[source];
- if (map) {
- var info = map.originalPositionFor({
- line: orig_line,
- column: orig_col
- });
- if (info.source === null) return;
- source = info.source;
- orig_line = info.line;
- orig_col = info.column;
- name = info.name || name;
- }
- generator.addMapping({
- name: name,
- source: source,
- generated: {
- line: gen_line + options.dest_line_diff,
- column: gen_col
- },
- original: {
- line: orig_line + options.orig_line_diff,
- column: orig_col
- }
- });
- },
- get: function() {
- return generator;
- },
- toString: function() {
- return JSON.stringify(generator.toJSON());
- }
- };
-}
diff --git a/node_modules/uglify-js/lib/transform.js b/node_modules/uglify-js/lib/transform.js
deleted file mode 100644
index 5897aa7..0000000
--- a/node_modules/uglify-js/lib/transform.js
+++ /dev/null
@@ -1,185 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-function TreeTransformer(before, after) {
- TreeWalker.call(this);
- this.before = before;
- this.after = after;
-}
-TreeTransformer.prototype = new TreeWalker;
-
-(function(DEF) {
- function do_list(list, tw) {
- return MAP(list, function(node) {
- return node.transform(tw, true);
- });
- }
-
- DEF(AST_Node, noop);
- DEF(AST_LabeledStatement, function(self, tw) {
- self.label = self.label.transform(tw);
- self.body = self.body.transform(tw);
- });
- DEF(AST_SimpleStatement, function(self, tw) {
- self.body = self.body.transform(tw);
- });
- DEF(AST_Block, function(self, tw) {
- self.body = do_list(self.body, tw);
- });
- DEF(AST_Do, function(self, tw) {
- self.body = self.body.transform(tw);
- self.condition = self.condition.transform(tw);
- });
- DEF(AST_While, function(self, tw) {
- self.condition = self.condition.transform(tw);
- self.body = self.body.transform(tw);
- });
- DEF(AST_For, function(self, tw) {
- if (self.init) self.init = self.init.transform(tw);
- if (self.condition) self.condition = self.condition.transform(tw);
- if (self.step) self.step = self.step.transform(tw);
- self.body = self.body.transform(tw);
- });
- DEF(AST_ForIn, function(self, tw) {
- self.init = self.init.transform(tw);
- self.object = self.object.transform(tw);
- self.body = self.body.transform(tw);
- });
- DEF(AST_With, function(self, tw) {
- self.expression = self.expression.transform(tw);
- self.body = self.body.transform(tw);
- });
- DEF(AST_Exit, function(self, tw) {
- if (self.value) self.value = self.value.transform(tw);
- });
- DEF(AST_LoopControl, function(self, tw) {
- if (self.label) self.label = self.label.transform(tw);
- });
- DEF(AST_If, function(self, tw) {
- self.condition = self.condition.transform(tw);
- self.body = self.body.transform(tw);
- if (self.alternative) self.alternative = self.alternative.transform(tw);
- });
- DEF(AST_Switch, function(self, tw) {
- self.expression = self.expression.transform(tw);
- self.body = do_list(self.body, tw);
- });
- DEF(AST_Case, function(self, tw) {
- self.expression = self.expression.transform(tw);
- self.body = do_list(self.body, tw);
- });
- DEF(AST_Try, function(self, tw) {
- self.body = do_list(self.body, tw);
- if (self.bcatch) self.bcatch = self.bcatch.transform(tw);
- if (self.bfinally) self.bfinally = self.bfinally.transform(tw);
- });
- DEF(AST_Catch, function(self, tw) {
- self.argname = self.argname.transform(tw);
- self.body = do_list(self.body, tw);
- });
- DEF(AST_Definitions, function(self, tw) {
- self.definitions = do_list(self.definitions, tw);
- });
- DEF(AST_VarDef, function(self, tw) {
- self.name = self.name.transform(tw);
- if (self.value) self.value = self.value.transform(tw);
- });
- DEF(AST_Lambda, function(self, tw) {
- if (self.name) self.name = self.name.transform(tw);
- self.argnames = do_list(self.argnames, tw);
- self.body = do_list(self.body, tw);
- });
- DEF(AST_Call, function(self, tw) {
- self.expression = self.expression.transform(tw);
- self.args = do_list(self.args, tw);
- });
- DEF(AST_Sequence, function(self, tw) {
- self.expressions = do_list(self.expressions, tw);
- });
- DEF(AST_Dot, function(self, tw) {
- self.expression = self.expression.transform(tw);
- });
- DEF(AST_Sub, function(self, tw) {
- self.expression = self.expression.transform(tw);
- self.property = self.property.transform(tw);
- });
- DEF(AST_Unary, function(self, tw) {
- self.expression = self.expression.transform(tw);
- });
- DEF(AST_Binary, function(self, tw) {
- self.left = self.left.transform(tw);
- self.right = self.right.transform(tw);
- });
- DEF(AST_Conditional, function(self, tw) {
- self.condition = self.condition.transform(tw);
- self.consequent = self.consequent.transform(tw);
- self.alternative = self.alternative.transform(tw);
- });
- DEF(AST_Array, function(self, tw) {
- self.elements = do_list(self.elements, tw);
- });
- DEF(AST_Object, function(self, tw) {
- self.properties = do_list(self.properties, tw);
- });
- DEF(AST_ObjectProperty, function(self, tw) {
- self.value = self.value.transform(tw);
- });
-})(function(node, descend) {
- node.DEFMETHOD("transform", function(tw, in_list) {
- var x, y;
- tw.push(this);
- if (tw.before) x = tw.before(this, descend, in_list);
- if (typeof x === "undefined") {
- x = this;
- descend(x, tw);
- if (tw.after) {
- y = tw.after(x, in_list);
- if (typeof y !== "undefined") x = y;
- }
- }
- tw.pop();
- return x;
- });
-});
diff --git a/node_modules/uglify-js/lib/utils.js b/node_modules/uglify-js/lib/utils.js
deleted file mode 100644
index 6ac68bb..0000000
--- a/node_modules/uglify-js/lib/utils.js
+++ /dev/null
@@ -1,275 +0,0 @@
-/***********************************************************************
-
- A JavaScript tokenizer / parser / beautifier / compressor.
- https://github.com/mishoo/UglifyJS2
-
- -------------------------------- (C) ---------------------------------
-
- Author: Mihai Bazon
-
- http://mihai.bazon.net/blog
-
- Distributed under the BSD license:
-
- Copyright 2012 (c) Mihai Bazon
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- * Redistributions of source code must retain the above
- copyright notice, this list of conditions and the following
- disclaimer.
-
- * Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the following
- disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
- OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- ***********************************************************************/
-
-"use strict";
-
-function characters(str) {
- return str.split("");
-}
-
-function member(name, array) {
- return array.indexOf(name) >= 0;
-}
-
-function find_if(func, array) {
- for (var i = array.length; --i >= 0;) if (func(array[i])) return array[i];
-}
-
-function repeat_string(str, i) {
- if (i <= 0) return "";
- if (i == 1) return str;
- var d = repeat_string(str, i >> 1);
- d += d;
- return i & 1 ? d + str : d;
-}
-
-function configure_error_stack(fn) {
- Object.defineProperty(fn.prototype, "stack", {
- get: function() {
- var err = new Error(this.message);
- err.name = this.name;
- try {
- throw err;
- } catch (e) {
- return e.stack;
- }
- }
- });
-}
-
-function DefaultsError(msg, defs) {
- this.message = msg;
- this.defs = defs;
-}
-DefaultsError.prototype = Object.create(Error.prototype);
-DefaultsError.prototype.constructor = DefaultsError;
-DefaultsError.prototype.name = "DefaultsError";
-configure_error_stack(DefaultsError);
-
-function defaults(args, defs, croak) {
- if (args === true) args = {};
- var ret = args || {};
- if (croak) for (var i in ret) if (HOP(ret, i) && !HOP(defs, i)) {
- throw new DefaultsError("`" + i + "` is not a supported option", defs);
- }
- for (var i in defs) if (HOP(defs, i)) {
- ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
- }
- return ret;
-}
-
-function merge(obj, ext) {
- var count = 0;
- for (var i in ext) if (HOP(ext, i)) {
- obj[i] = ext[i];
- count++;
- }
- return count;
-}
-
-function noop() {}
-function return_false() { return false; }
-function return_true() { return true; }
-function return_this() { return this; }
-function return_null() { return null; }
-
-var MAP = (function() {
- function MAP(a, f, backwards) {
- var ret = [], top = [], i;
- function doit() {
- var val = f(a[i], i);
- var is_last = val instanceof Last;
- if (is_last) val = val.v;
- if (val instanceof AtTop) {
- val = val.v;
- if (val instanceof Splice) {
- top.push.apply(top, backwards ? val.v.slice().reverse() : val.v);
- } else {
- top.push(val);
- }
- } else if (val !== skip) {
- if (val instanceof Splice) {
- ret.push.apply(ret, backwards ? val.v.slice().reverse() : val.v);
- } else {
- ret.push(val);
- }
- }
- return is_last;
- }
- if (Array.isArray(a)) {
- if (backwards) {
- for (i = a.length; --i >= 0;) if (doit()) break;
- ret.reverse();
- top.reverse();
- } else {
- for (i = 0; i < a.length; ++i) if (doit()) break;
- }
- } else {
- for (i in a) if (HOP(a, i)) if (doit()) break;
- }
- return top.concat(ret);
- }
- MAP.at_top = function(val) { return new AtTop(val) };
- MAP.splice = function(val) { return new Splice(val) };
- MAP.last = function(val) { return new Last(val) };
- var skip = MAP.skip = {};
- function AtTop(val) { this.v = val }
- function Splice(val) { this.v = val }
- function Last(val) { this.v = val }
- return MAP;
-})();
-
-function push_uniq(array, el) {
- if (array.indexOf(el) < 0) return array.push(el);
-}
-
-function string_template(text, props) {
- return text.replace(/\{(.+?)\}/g, function(str, p) {
- return props && props[p];
- });
-}
-
-function remove(array, el) {
- var index = array.indexOf(el);
- if (index >= 0) array.splice(index, 1);
-}
-
-function makePredicate(words) {
- if (!Array.isArray(words)) words = words.split(" ");
- var map = Object.create(null);
- words.forEach(function(word) {
- map[word] = true;
- });
- return map;
-}
-
-function all(array, predicate) {
- for (var i = array.length; --i >= 0;)
- if (!predicate(array[i]))
- return false;
- return true;
-}
-
-function Dictionary() {
- this._values = Object.create(null);
- this._size = 0;
-}
-Dictionary.prototype = {
- set: function(key, val) {
- if (!this.has(key)) ++this._size;
- this._values["$" + key] = val;
- return this;
- },
- add: function(key, val) {
- if (this.has(key)) {
- this.get(key).push(val);
- } else {
- this.set(key, [ val ]);
- }
- return this;
- },
- get: function(key) { return this._values["$" + key] },
- del: function(key) {
- if (this.has(key)) {
- --this._size;
- delete this._values["$" + key];
- }
- return this;
- },
- has: function(key) { return ("$" + key) in this._values },
- each: function(f) {
- for (var i in this._values)
- f(this._values[i], i.substr(1));
- },
- size: function() {
- return this._size;
- },
- map: function(f) {
- var ret = [];
- for (var i in this._values)
- ret.push(f(this._values[i], i.substr(1)));
- return ret;
- },
- clone: function() {
- var ret = new Dictionary();
- for (var i in this._values)
- ret._values[i] = this._values[i];
- ret._size = this._size;
- return ret;
- },
- toObject: function() { return this._values }
-};
-Dictionary.fromObject = function(obj) {
- var dict = new Dictionary();
- dict._size = merge(dict._values, obj);
- return dict;
-};
-
-function HOP(obj, prop) {
- return Object.prototype.hasOwnProperty.call(obj, prop);
-}
-
-// return true if the node at the top of the stack (that means the
-// innermost node in the current output) is lexically the first in
-// a statement.
-function first_in_statement(stack) {
- var node = stack.parent(-1);
- for (var i = 0, p; p = stack.parent(i++); node = p) {
- if (p.TYPE == "Call") {
- if (p.expression === node) continue;
- } else if (p instanceof AST_Binary) {
- if (p.left === node) continue;
- } else if (p instanceof AST_Conditional) {
- if (p.condition === node) continue;
- } else if (p instanceof AST_PropAccess) {
- if (p.expression === node) continue;
- } else if (p instanceof AST_Sequence) {
- if (p.expressions[0] === node) continue;
- } else if (p instanceof AST_Statement) {
- return p.body === node;
- } else if (p instanceof AST_UnaryPostfix) {
- if (p.expression === node) continue;
- }
- return false;
- }
-}
diff --git a/node_modules/uglify-js/node_modules/commander/CHANGELOG.md b/node_modules/uglify-js/node_modules/commander/CHANGELOG.md
deleted file mode 100644
index fd4f69c..0000000
--- a/node_modules/uglify-js/node_modules/commander/CHANGELOG.md
+++ /dev/null
@@ -1,396 +0,0 @@
-
-2.19.0 / 2018-10-02
-==================
-
- * Removed newline after Options and Commands headers (#864)
- * Bugfix - Error output (#862)
- * Fix to change default value to string (#856)
-
-2.18.0 / 2018-09-07
-==================
-
- * Standardize help output (#853)
- * chmod 644 travis.yml (#851)
- * add support for execute typescript subcommand via ts-node (#849)
-
-2.17.1 / 2018-08-07
-==================
-
- * Fix bug in command emit (#844)
-
-2.17.0 / 2018-08-03
-==================
-
- * fixed newline output after help information (#833)
- * Fix to emit the action even without command (#778)
- * npm update (#823)
-
-2.16.0 / 2018-06-29
-==================
-
- * Remove Makefile and `test/run` (#821)
- * Make 'npm test' run on Windows (#820)
- * Add badge to display install size (#807)
- * chore: cache node_modules (#814)
- * chore: remove Node.js 4 (EOL), add Node.js 10 (#813)
- * fixed typo in readme (#812)
- * Fix types (#804)
- * Update eslint to resolve vulnerabilities in lodash (#799)
- * updated readme with custom event listeners. (#791)
- * fix tests (#794)
-
-2.15.0 / 2018-03-07
-==================
-
- * Update downloads badge to point to graph of downloads over time instead of duplicating link to npm
- * Arguments description
-
-2.14.1 / 2018-02-07
-==================
-
- * Fix typing of help function
-
-2.14.0 / 2018-02-05
-==================
-
- * only register the option:version event once
- * Fixes issue #727: Passing empty string for option on command is set to undefined
- * enable eqeqeq rule
- * resolves #754 add linter configuration to project
- * resolves #560 respect custom name for version option
- * document how to override the version flag
- * document using options per command
-
-2.13.0 / 2018-01-09
-==================
-
- * Do not print default for --no-
- * remove trailing spaces in command help
- * Update CI's Node.js to LTS and latest version
- * typedefs: Command and Option types added to commander namespace
-
-2.12.2 / 2017-11-28
-==================
-
- * fix: typings are not shipped
-
-2.12.1 / 2017-11-23
-==================
-
- * Move @types/node to dev dependency
-
-2.12.0 / 2017-11-22
-==================
-
- * add attributeName() method to Option objects
- * Documentation updated for options with --no prefix
- * typings: `outputHelp` takes a string as the first parameter
- * typings: use overloads
- * feat(typings): update to match js api
- * Print default value in option help
- * Fix translation error
- * Fail when using same command and alias (#491)
- * feat(typings): add help callback
- * fix bug when description is add after command with options (#662)
- * Format js code
- * Rename History.md to CHANGELOG.md (#668)
- * feat(typings): add typings to support TypeScript (#646)
- * use current node
-
-2.11.0 / 2017-07-03
-==================
-
- * Fix help section order and padding (#652)
- * feature: support for signals to subcommands (#632)
- * Fixed #37, --help should not display first (#447)
- * Fix translation errors. (#570)
- * Add package-lock.json
- * Remove engines
- * Upgrade package version
- * Prefix events to prevent conflicts between commands and options (#494)
- * Removing dependency on graceful-readlink
- * Support setting name in #name function and make it chainable
- * Add .vscode directory to .gitignore (Visual Studio Code metadata)
- * Updated link to ruby commander in readme files
-
-2.10.0 / 2017-06-19
-==================
-
- * Update .travis.yml. drop support for older node.js versions.
- * Fix require arguments in README.md
- * On SemVer you do not start from 0.0.1
- * Add missing semi colon in readme
- * Add save param to npm install
- * node v6 travis test
- * Update Readme_zh-CN.md
- * Allow literal '--' to be passed-through as an argument
- * Test subcommand alias help
- * link build badge to master branch
- * Support the alias of Git style sub-command
- * added keyword commander for better search result on npm
- * Fix Sub-Subcommands
- * test node.js stable
- * Fixes TypeError when a command has an option called `--description`
- * Update README.md to make it beginner friendly and elaborate on the difference between angled and square brackets.
- * Add chinese Readme file
-
-2.9.0 / 2015-10-13
-==================
-
- * Add option `isDefault` to set default subcommand #415 @Qix-
- * Add callback to allow filtering or post-processing of help text #434 @djulien
- * Fix `undefined` text in help information close #414 #416 @zhiyelee
-
-2.8.1 / 2015-04-22
-==================
-
- * Back out `support multiline description` Close #396 #397
-
-2.8.0 / 2015-04-07
-==================
-
- * Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee
- * Fix bug in Git-style sub-commands #372 @zhiyelee
- * Allow commands to be hidden from help #383 @tonylukasavage
- * When git-style sub-commands are in use, yet none are called, display help #382 @claylo
- * Add ability to specify arguments syntax for top-level command #258 @rrthomas
- * Support multiline descriptions #208 @zxqfox
-
-2.7.1 / 2015-03-11
-==================
-
- * Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367.
-
-2.7.0 / 2015-03-09
-==================
-
- * Fix git-style bug when installed globally. Close #335 #349 @zhiyelee
- * Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage
- * Add support for camelCase on `opts()`. Close #353 @nkzawa
- * Add node.js 0.12 and io.js to travis.yml
- * Allow RegEx options. #337 @palanik
- * Fixes exit code when sub-command failing. Close #260 #332 @pirelenito
- * git-style `bin` files in $PATH make sense. Close #196 #327 @zhiyelee
-
-2.6.0 / 2014-12-30
-==================
-
- * added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee
- * Add application description to the help msg. Close #112 @dalssoft
-
-2.5.1 / 2014-12-15
-==================
-
- * fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee
-
-2.5.0 / 2014-10-24
-==================
-
- * add support for variadic arguments. Closes #277 @whitlockjc
-
-2.4.0 / 2014-10-17
-==================
-
- * fixed a bug on executing the coercion function of subcommands option. Closes #270
- * added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage
- * added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage
- * fixed a bug on subcommand name. Closes #248 @jonathandelgado
- * fixed function normalize doesn’t honor option terminator. Closes #216 @abbr
-
-2.3.0 / 2014-07-16
-==================
-
- * add command alias'. Closes PR #210
- * fix: Typos. Closes #99
- * fix: Unused fs module. Closes #217
-
-2.2.0 / 2014-03-29
-==================
-
- * add passing of previous option value
- * fix: support subcommands on windows. Closes #142
- * Now the defaultValue passed as the second argument of the coercion function.
-
-2.1.0 / 2013-11-21
-==================
-
- * add: allow cflag style option params, unit test, fixes #174
-
-2.0.0 / 2013-07-18
-==================
-
- * remove input methods (.prompt, .confirm, etc)
-
-1.3.2 / 2013-07-18
-==================
-
- * add support for sub-commands to co-exist with the original command
-
-1.3.1 / 2013-07-18
-==================
-
- * add quick .runningCommand hack so you can opt-out of other logic when running a sub command
-
-1.3.0 / 2013-07-09
-==================
-
- * add EACCES error handling
- * fix sub-command --help
-
-1.2.0 / 2013-06-13
-==================
-
- * allow "-" hyphen as an option argument
- * support for RegExp coercion
-
-1.1.1 / 2012-11-20
-==================
-
- * add more sub-command padding
- * fix .usage() when args are present. Closes #106
-
-1.1.0 / 2012-11-16
-==================
-
- * add git-style executable subcommand support. Closes #94
-
-1.0.5 / 2012-10-09
-==================
-
- * fix `--name` clobbering. Closes #92
- * fix examples/help. Closes #89
-
-1.0.4 / 2012-09-03
-==================
-
- * add `outputHelp()` method.
-
-1.0.3 / 2012-08-30
-==================
-
- * remove invalid .version() defaulting
-
-1.0.2 / 2012-08-24
-==================
-
- * add `--foo=bar` support [arv]
- * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]
-
-1.0.1 / 2012-08-03
-==================
-
- * fix issue #56
- * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())
-
-1.0.0 / 2012-07-05
-==================
-
- * add support for optional option descriptions
- * add defaulting of `.version()` to package.json's version
-
-0.6.1 / 2012-06-01
-==================
-
- * Added: append (yes or no) on confirmation
- * Added: allow node.js v0.7.x
-
-0.6.0 / 2012-04-10
-==================
-
- * Added `.prompt(obj, callback)` support. Closes #49
- * Added default support to .choose(). Closes #41
- * Fixed the choice example
-
-0.5.1 / 2011-12-20
-==================
-
- * Fixed `password()` for recent nodes. Closes #36
-
-0.5.0 / 2011-12-04
-==================
-
- * Added sub-command option support [itay]
-
-0.4.3 / 2011-12-04
-==================
-
- * Fixed custom help ordering. Closes #32
-
-0.4.2 / 2011-11-24
-==================
-
- * Added travis support
- * Fixed: line-buffered input automatically trimmed. Closes #31
-
-0.4.1 / 2011-11-18
-==================
-
- * Removed listening for "close" on --help
-
-0.4.0 / 2011-11-15
-==================
-
- * Added support for `--`. Closes #24
-
-0.3.3 / 2011-11-14
-==================
-
- * Fixed: wait for close event when writing help info [Jerry Hamlet]
-
-0.3.2 / 2011-11-01
-==================
-
- * Fixed long flag definitions with values [felixge]
-
-0.3.1 / 2011-10-31
-==================
-
- * Changed `--version` short flag to `-V` from `-v`
- * Changed `.version()` so it's configurable [felixge]
-
-0.3.0 / 2011-10-31
-==================
-
- * Added support for long flags only. Closes #18
-
-0.2.1 / 2011-10-24
-==================
-
- * "node": ">= 0.4.x < 0.7.0". Closes #20
-
-0.2.0 / 2011-09-26
-==================
-
- * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
-
-0.1.0 / 2011-08-24
-==================
-
- * Added support for custom `--help` output
-
-0.0.5 / 2011-08-18
-==================
-
- * Changed: when the user enters nothing prompt for password again
- * Fixed issue with passwords beginning with numbers [NuckChorris]
-
-0.0.4 / 2011-08-15
-==================
-
- * Fixed `Commander#args`
-
-0.0.3 / 2011-08-15
-==================
-
- * Added default option value support
-
-0.0.2 / 2011-08-15
-==================
-
- * Added mask support to `Command#password(str[, mask], fn)`
- * Added `Command#password(str, fn)`
-
-0.0.1 / 2010-01-03
-==================
-
- * Initial release
diff --git a/node_modules/uglify-js/node_modules/commander/LICENSE b/node_modules/uglify-js/node_modules/commander/LICENSE
deleted file mode 100644
index 10f997a..0000000
--- a/node_modules/uglify-js/node_modules/commander/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2011 TJ Holowaychuk
-
-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.
diff --git a/node_modules/uglify-js/node_modules/commander/Readme.md b/node_modules/uglify-js/node_modules/commander/Readme.md
deleted file mode 100644
index a2a1547..0000000
--- a/node_modules/uglify-js/node_modules/commander/Readme.md
+++ /dev/null
@@ -1,417 +0,0 @@
-# Commander.js
-
-
-[](http://travis-ci.org/tj/commander.js)
-[](https://www.npmjs.org/package/commander)
-[](https://npmcharts.com/compare/commander?minimal=true)
-[](https://packagephobia.now.sh/result?p=commander)
-[](https://gitter.im/tj/commander.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
- The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/commander-rb/commander).
- [API documentation](http://tj.github.com/commander.js/)
-
-
-## Installation
-
- $ npm install commander --save
-
-## Option parsing
-
-Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .version('0.1.0')
- .option('-p, --peppers', 'Add peppers')
- .option('-P, --pineapple', 'Add pineapple')
- .option('-b, --bbq-sauce', 'Add bbq sauce')
- .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
- .parse(process.argv);
-
-console.log('you ordered a pizza with:');
-if (program.peppers) console.log(' - peppers');
-if (program.pineapple) console.log(' - pineapple');
-if (program.bbqSauce) console.log(' - bbq');
-console.log(' - %s cheese', program.cheese);
-```
-
-Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
-
-Note that multi-word options starting with `--no` prefix negate the boolean value of the following word. For example, `--no-sauce` sets the value of `program.sauce` to false.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .option('--no-sauce', 'Remove sauce')
- .parse(process.argv);
-
-console.log('you ordered a pizza');
-if (program.sauce) console.log(' with sauce');
-else console.log(' without sauce');
-```
-
-## Version option
-
-Calling the `version` implicitly adds the `-V` and `--version` options to the command.
-When either of these options is present, the command prints the version number and exits.
-
- $ ./examples/pizza -V
- 0.0.1
-
-If you want your program to respond to the `-v` option instead of the `-V` option, simply pass custom flags to the `version` method using the same syntax as the `option` method.
-
-```js
-program
- .version('0.0.1', '-v, --version')
-```
-
-The version flags can be named anything, but the long option is required.
-
-## Command-specific options
-
-You can attach options to a command.
-
-```js
-#!/usr/bin/env node
-
-var program = require('commander');
-
-program
- .command('rm ')
- .option('-r, --recursive', 'Remove recursively')
- .action(function (dir, cmd) {
- console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))
- })
-
-program.parse(process.argv)
-```
-
-A command's options are validated when the command is used. Any unknown options will be reported as an error. However, if an action-based command does not define an action, then the options are not validated.
-
-## Coercion
-
-```js
-function range(val) {
- return val.split('..').map(Number);
-}
-
-function list(val) {
- return val.split(',');
-}
-
-function collect(val, memo) {
- memo.push(val);
- return memo;
-}
-
-function increaseVerbosity(v, total) {
- return total + 1;
-}
-
-program
- .version('0.1.0')
- .usage('[options] ')
- .option('-i, --integer ', 'An integer argument', parseInt)
- .option('-f, --float ', 'A float argument', parseFloat)
- .option('-r, --range ..', 'A range', range)
- .option('-l, --list ', 'A list', list)
- .option('-o, --optional [value]', 'An optional value')
- .option('-c, --collect [value]', 'A repeatable value', collect, [])
- .option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)
- .parse(process.argv);
-
-console.log(' int: %j', program.integer);
-console.log(' float: %j', program.float);
-console.log(' optional: %j', program.optional);
-program.range = program.range || [];
-console.log(' range: %j..%j', program.range[0], program.range[1]);
-console.log(' list: %j', program.list);
-console.log(' collect: %j', program.collect);
-console.log(' verbosity: %j', program.verbose);
-console.log(' args: %j', program.args);
-```
-
-## Regular Expression
-```js
-program
- .version('0.1.0')
- .option('-s --size ', 'Pizza size', /^(large|medium|small)$/i, 'medium')
- .option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)
- .parse(process.argv);
-
-console.log(' size: %j', program.size);
-console.log(' drink: %j', program.drink);
-```
-
-## Variadic arguments
-
- The last argument of a command can be variadic, and only the last argument. To make an argument variadic you have to
- append `...` to the argument name. Here is an example:
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .version('0.1.0')
- .command('rmdir [otherDirs...]')
- .action(function (dir, otherDirs) {
- console.log('rmdir %s', dir);
- if (otherDirs) {
- otherDirs.forEach(function (oDir) {
- console.log('rmdir %s', oDir);
- });
- }
- });
-
-program.parse(process.argv);
-```
-
- An `Array` is used for the value of a variadic argument. This applies to `program.args` as well as the argument passed
- to your action as demonstrated above.
-
-## Specify the argument syntax
-
-```js
-#!/usr/bin/env node
-
-var program = require('commander');
-
-program
- .version('0.1.0')
- .arguments(' [env]')
- .action(function (cmd, env) {
- cmdValue = cmd;
- envValue = env;
- });
-
-program.parse(process.argv);
-
-if (typeof cmdValue === 'undefined') {
- console.error('no command given!');
- process.exit(1);
-}
-console.log('command:', cmdValue);
-console.log('environment:', envValue || "no environment given");
-```
-Angled brackets (e.g. ``) indicate required input. Square brackets (e.g. `[env]`) indicate optional input.
-
-## Git-style sub-commands
-
-```js
-// file: ./examples/pm
-var program = require('commander');
-
-program
- .version('0.1.0')
- .command('install [name]', 'install one or more packages')
- .command('search [query]', 'search with optional query')
- .command('list', 'list packages installed', {isDefault: true})
- .parse(process.argv);
-```
-
-When `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools.
-The commander will try to search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-command`, like `pm-install`, `pm-search`.
-
-Options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the subcommand from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified.
-
-If the program is designed to be installed globally, make sure the executables have proper modes, like `755`.
-
-### `--harmony`
-
-You can enable `--harmony` option in two ways:
-* Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. Note some os version don’t support this pattern.
-* Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process.
-
-## Automated --help
-
- The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
-
-```
-$ ./examples/pizza --help
-Usage: pizza [options]
-
-An application for pizzas ordering
-
-Options:
- -h, --help output usage information
- -V, --version output the version number
- -p, --peppers Add peppers
- -P, --pineapple Add pineapple
- -b, --bbq Add bbq sauce
- -c, --cheese Add the specified type of cheese [marble]
- -C, --no-cheese You do not want any cheese
-```
-
-## Custom help
-
- You can display arbitrary `-h, --help` information
- by listening for "--help". Commander will automatically
- exit once you are done so that the remainder of your program
- does not execute causing undesired behaviors, for example
- in the following executable "stuff" will not output when
- `--help` is used.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
- .version('0.1.0')
- .option('-f, --foo', 'enable some foo')
- .option('-b, --bar', 'enable some bar')
- .option('-B, --baz', 'enable some baz');
-
-// must be before .parse() since
-// node's emit() is immediate
-
-program.on('--help', function(){
- console.log('')
- console.log('Examples:');
- console.log(' $ custom-help --help');
- console.log(' $ custom-help -h');
-});
-
-program.parse(process.argv);
-
-console.log('stuff');
-```
-
-Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run:
-
-```
-Usage: custom-help [options]
-
-Options:
- -h, --help output usage information
- -V, --version output the version number
- -f, --foo enable some foo
- -b, --bar enable some bar
- -B, --baz enable some baz
-
-Examples:
- $ custom-help --help
- $ custom-help -h
-```
-
-## .outputHelp(cb)
-
-Output help information without exiting.
-Optional callback cb allows post-processing of help text before it is displayed.
-
-If you want to display help by default (e.g. if no command was provided), you can use something like:
-
-```js
-var program = require('commander');
-var colors = require('colors');
-
-program
- .version('0.1.0')
- .command('getstream [url]', 'get stream URL')
- .parse(process.argv);
-
-if (!process.argv.slice(2).length) {
- program.outputHelp(make_red);
-}
-
-function make_red(txt) {
- return colors.red(txt); //display the help text in red on the console
-}
-```
-
-## .help(cb)
-
- Output help information and exit immediately.
- Optional callback cb allows post-processing of help text before it is displayed.
-
-
-## Custom event listeners
- You can execute custom actions by listening to command and option events.
-
-```js
-program.on('option:verbose', function () {
- process.env.VERBOSE = this.verbose;
-});
-
-// error on unknown commands
-program.on('command:*', function () {
- console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args.join(' '));
- process.exit(1);
-});
-```
-
-## Examples
-
-```js
-var program = require('commander');
-
-program
- .version('0.1.0')
- .option('-C, --chdir ', 'change the working directory')
- .option('-c, --config ', 'set config path. defaults to ./deploy.conf')
- .option('-T, --no-tests', 'ignore test hook');
-
-program
- .command('setup [env]')
- .description('run setup commands for all envs')
- .option("-s, --setup_mode [mode]", "Which setup mode to use")
- .action(function(env, options){
- var mode = options.setup_mode || "normal";
- env = env || 'all';
- console.log('setup for %s env(s) with %s mode', env, mode);
- });
-
-program
- .command('exec ')
- .alias('ex')
- .description('execute the given remote cmd')
- .option("-e, --exec_mode ", "Which exec mode to use")
- .action(function(cmd, options){
- console.log('exec "%s" using %s mode', cmd, options.exec_mode);
- }).on('--help', function() {
- console.log('');
- console.log('Examples:');
- console.log('');
- console.log(' $ deploy exec sequential');
- console.log(' $ deploy exec async');
- });
-
-program
- .command('*')
- .action(function(env){
- console.log('deploying "%s"', env);
- });
-
-program.parse(process.argv);
-```
-
-More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.
-
-## License
-
-MIT
diff --git a/node_modules/uglify-js/node_modules/commander/index.js b/node_modules/uglify-js/node_modules/commander/index.js
deleted file mode 100644
index bf039c9..0000000
--- a/node_modules/uglify-js/node_modules/commander/index.js
+++ /dev/null
@@ -1,1227 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter;
-var spawn = require('child_process').spawn;
-var path = require('path');
-var dirname = path.dirname;
-var basename = path.basename;
-var fs = require('fs');
-
-/**
- * Inherit `Command` from `EventEmitter.prototype`.
- */
-
-require('util').inherits(Command, EventEmitter);
-
-/**
- * Expose the root command.
- */
-
-exports = module.exports = new Command();
-
-/**
- * Expose `Command`.
- */
-
-exports.Command = Command;
-
-/**
- * Expose `Option`.
- */
-
-exports.Option = Option;
-
-/**
- * Initialize a new `Option` with the given `flags` and `description`.
- *
- * @param {String} flags
- * @param {String} description
- * @api public
- */
-
-function Option(flags, description) {
- this.flags = flags;
- this.required = flags.indexOf('<') >= 0;
- this.optional = flags.indexOf('[') >= 0;
- this.bool = flags.indexOf('-no-') === -1;
- flags = flags.split(/[ ,|]+/);
- if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
- this.long = flags.shift();
- this.description = description || '';
-}
-
-/**
- * Return option name.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.name = function() {
- return this.long
- .replace('--', '')
- .replace('no-', '');
-};
-
-/**
- * Return option name, in a camelcase format that can be used
- * as a object attribute key.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.attributeName = function() {
- return camelcase(this.name());
-};
-
-/**
- * Check if `arg` matches the short or long flag.
- *
- * @param {String} arg
- * @return {Boolean}
- * @api private
- */
-
-Option.prototype.is = function(arg) {
- return this.short === arg || this.long === arg;
-};
-
-/**
- * Initialize a new `Command`.
- *
- * @param {String} name
- * @api public
- */
-
-function Command(name) {
- this.commands = [];
- this.options = [];
- this._execs = {};
- this._allowUnknownOption = false;
- this._args = [];
- this._name = name || '';
-}
-
-/**
- * Add command `name`.
- *
- * The `.action()` callback is invoked when the
- * command `name` is specified via __ARGV__,
- * and the remaining arguments are applied to the
- * function for access.
- *
- * When the `name` is "*" an un-matched command
- * will be passed as the first arg, followed by
- * the rest of __ARGV__ remaining.
- *
- * Examples:
- *
- * program
- * .version('0.0.1')
- * .option('-C, --chdir ', 'change the working directory')
- * .option('-c, --config ', 'set config path. defaults to ./deploy.conf')
- * .option('-T, --no-tests', 'ignore test hook')
- *
- * program
- * .command('setup')
- * .description('run remote setup commands')
- * .action(function() {
- * console.log('setup');
- * });
- *
- * program
- * .command('exec ')
- * .description('run the given remote command')
- * .action(function(cmd) {
- * console.log('exec "%s"', cmd);
- * });
- *
- * program
- * .command('teardown [otherDirs...]')
- * .description('run teardown commands')
- * .action(function(dir, otherDirs) {
- * console.log('dir "%s"', dir);
- * if (otherDirs) {
- * otherDirs.forEach(function (oDir) {
- * console.log('dir "%s"', oDir);
- * });
- * }
- * });
- *
- * program
- * .command('*')
- * .description('deploy the given env')
- * .action(function(env) {
- * console.log('deploying "%s"', env);
- * });
- *
- * program.parse(process.argv);
- *
- * @param {String} name
- * @param {String} [desc] for git-style sub-commands
- * @return {Command} the new command
- * @api public
- */
-
-Command.prototype.command = function(name, desc, opts) {
- if (typeof desc === 'object' && desc !== null) {
- opts = desc;
- desc = null;
- }
- opts = opts || {};
- var args = name.split(/ +/);
- var cmd = new Command(args.shift());
-
- if (desc) {
- cmd.description(desc);
- this.executables = true;
- this._execs[cmd._name] = true;
- if (opts.isDefault) this.defaultExecutable = cmd._name;
- }
- cmd._noHelp = !!opts.noHelp;
- this.commands.push(cmd);
- cmd.parseExpectedArgs(args);
- cmd.parent = this;
-
- if (desc) return this;
- return cmd;
-};
-
-/**
- * Define argument syntax for the top-level command.
- *
- * @api public
- */
-
-Command.prototype.arguments = function(desc) {
- return this.parseExpectedArgs(desc.split(/ +/));
-};
-
-/**
- * Add an implicit `help [cmd]` subcommand
- * which invokes `--help` for the given command.
- *
- * @api private
- */
-
-Command.prototype.addImplicitHelpCommand = function() {
- this.command('help [cmd]', 'display help for [cmd]');
-};
-
-/**
- * Parse expected `args`.
- *
- * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parseExpectedArgs = function(args) {
- if (!args.length) return;
- var self = this;
- args.forEach(function(arg) {
- var argDetails = {
- required: false,
- name: '',
- variadic: false
- };
-
- switch (arg[0]) {
- case '<':
- argDetails.required = true;
- argDetails.name = arg.slice(1, -1);
- break;
- case '[':
- argDetails.name = arg.slice(1, -1);
- break;
- }
-
- if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {
- argDetails.variadic = true;
- argDetails.name = argDetails.name.slice(0, -3);
- }
- if (argDetails.name) {
- self._args.push(argDetails);
- }
- });
- return this;
-};
-
-/**
- * Register callback `fn` for the command.
- *
- * Examples:
- *
- * program
- * .command('help')
- * .description('display verbose help')
- * .action(function() {
- * // output help here
- * });
- *
- * @param {Function} fn
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.action = function(fn) {
- var self = this;
- var listener = function(args, unknown) {
- // Parse any so-far unknown options
- args = args || [];
- unknown = unknown || [];
-
- var parsed = self.parseOptions(unknown);
-
- // Output help if necessary
- outputHelpIfNecessary(self, parsed.unknown);
-
- // If there are still any unknown options, then we simply
- // die, unless someone asked for help, in which case we give it
- // to them, and then we die.
- if (parsed.unknown.length > 0) {
- self.unknownOption(parsed.unknown[0]);
- }
-
- // Leftover arguments need to be pushed back. Fixes issue #56
- if (parsed.args.length) args = parsed.args.concat(args);
-
- self._args.forEach(function(arg, i) {
- if (arg.required && args[i] == null) {
- self.missingArgument(arg.name);
- } else if (arg.variadic) {
- if (i !== self._args.length - 1) {
- self.variadicArgNotLast(arg.name);
- }
-
- args[i] = args.splice(i);
- }
- });
-
- // Always append ourselves to the end of the arguments,
- // to make sure we match the number of arguments the user
- // expects
- if (self._args.length) {
- args[self._args.length] = self;
- } else {
- args.push(self);
- }
-
- fn.apply(self, args);
- };
- var parent = this.parent || this;
- var name = parent === this ? '*' : this._name;
- parent.on('command:' + name, listener);
- if (this._alias) parent.on('command:' + this._alias, listener);
- return this;
-};
-
-/**
- * Define option with `flags`, `description` and optional
- * coercion `fn`.
- *
- * The `flags` string should contain both the short and long flags,
- * separated by comma, a pipe or space. The following are all valid
- * all will output this way when `--help` is used.
- *
- * "-p, --pepper"
- * "-p|--pepper"
- * "-p --pepper"
- *
- * Examples:
- *
- * // simple boolean defaulting to false
- * program.option('-p, --pepper', 'add pepper');
- *
- * --pepper
- * program.pepper
- * // => Boolean
- *
- * // simple boolean defaulting to true
- * program.option('-C, --no-cheese', 'remove cheese');
- *
- * program.cheese
- * // => true
- *
- * --no-cheese
- * program.cheese
- * // => false
- *
- * // required argument
- * program.option('-C, --chdir ', 'change the working directory');
- *
- * --chdir /tmp
- * program.chdir
- * // => "/tmp"
- *
- * // optional argument
- * program.option('-c, --cheese [type]', 'add cheese [marble]');
- *
- * @param {String} flags
- * @param {String} description
- * @param {Function|*} [fn] or default
- * @param {*} [defaultValue]
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.option = function(flags, description, fn, defaultValue) {
- var self = this,
- option = new Option(flags, description),
- oname = option.name(),
- name = option.attributeName();
-
- // default as 3rd arg
- if (typeof fn !== 'function') {
- if (fn instanceof RegExp) {
- var regex = fn;
- fn = function(val, def) {
- var m = regex.exec(val);
- return m ? m[0] : def;
- };
- } else {
- defaultValue = fn;
- fn = null;
- }
- }
-
- // preassign default value only for --no-*, [optional], or
- if (!option.bool || option.optional || option.required) {
- // when --no-* we make sure default is true
- if (!option.bool) defaultValue = true;
- // preassign only if we have a default
- if (defaultValue !== undefined) {
- self[name] = defaultValue;
- option.defaultValue = defaultValue;
- }
- }
-
- // register the option
- this.options.push(option);
-
- // when it's passed assign the value
- // and conditionally invoke the callback
- this.on('option:' + oname, function(val) {
- // coercion
- if (val !== null && fn) {
- val = fn(val, self[name] === undefined ? defaultValue : self[name]);
- }
-
- // unassigned or bool
- if (typeof self[name] === 'boolean' || typeof self[name] === 'undefined') {
- // if no value, bool true, and we have a default, then use it!
- if (val == null) {
- self[name] = option.bool
- ? defaultValue || true
- : false;
- } else {
- self[name] = val;
- }
- } else if (val !== null) {
- // reassign
- self[name] = val;
- }
- });
-
- return this;
-};
-
-/**
- * Allow unknown options on the command line.
- *
- * @param {Boolean} arg if `true` or omitted, no error will be thrown
- * for unknown options.
- * @api public
- */
-Command.prototype.allowUnknownOption = function(arg) {
- this._allowUnknownOption = arguments.length === 0 || arg;
- return this;
-};
-
-/**
- * Parse `argv`, settings options and invoking commands when defined.
- *
- * @param {Array} argv
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parse = function(argv) {
- // implicit help
- if (this.executables) this.addImplicitHelpCommand();
-
- // store raw args
- this.rawArgs = argv;
-
- // guess name
- this._name = this._name || basename(argv[1], '.js');
-
- // github-style sub-commands with no sub-command
- if (this.executables && argv.length < 3 && !this.defaultExecutable) {
- // this user needs help
- argv.push('--help');
- }
-
- // process argv
- var parsed = this.parseOptions(this.normalize(argv.slice(2)));
- var args = this.args = parsed.args;
-
- var result = this.parseArgs(this.args, parsed.unknown);
-
- // executable sub-commands
- var name = result.args[0];
-
- var aliasCommand = null;
- // check alias of sub commands
- if (name) {
- aliasCommand = this.commands.filter(function(command) {
- return command.alias() === name;
- })[0];
- }
-
- if (this._execs[name] && typeof this._execs[name] !== 'function') {
- return this.executeSubCommand(argv, args, parsed.unknown);
- } else if (aliasCommand) {
- // is alias of a subCommand
- args[0] = aliasCommand._name;
- return this.executeSubCommand(argv, args, parsed.unknown);
- } else if (this.defaultExecutable) {
- // use the default subcommand
- args.unshift(this.defaultExecutable);
- return this.executeSubCommand(argv, args, parsed.unknown);
- }
-
- return result;
-};
-
-/**
- * Execute a sub-command executable.
- *
- * @param {Array} argv
- * @param {Array} args
- * @param {Array} unknown
- * @api private
- */
-
-Command.prototype.executeSubCommand = function(argv, args, unknown) {
- args = args.concat(unknown);
-
- if (!args.length) this.help();
- if (args[0] === 'help' && args.length === 1) this.help();
-
- // --help
- if (args[0] === 'help') {
- args[0] = args[1];
- args[1] = '--help';
- }
-
- // executable
- var f = argv[1];
- // name of the subcommand, link `pm-install`
- var bin = basename(f, path.extname(f)) + '-' + args[0];
-
- // In case of globally installed, get the base dir where executable
- // subcommand file should be located at
- var baseDir,
- link = fs.lstatSync(f).isSymbolicLink() ? fs.readlinkSync(f) : f;
-
- // when symbolink is relative path
- if (link !== f && link.charAt(0) !== '/') {
- link = path.join(dirname(f), link);
- }
- baseDir = dirname(link);
-
- // prefer local `./` to bin in the $PATH
- var localBin = path.join(baseDir, bin);
-
- // whether bin file is a js script with explicit `.js` or `.ts` extension
- var isExplicitJS = false;
- if (exists(localBin + '.js')) {
- bin = localBin + '.js';
- isExplicitJS = true;
- } else if (exists(localBin + '.ts')) {
- bin = localBin + '.ts';
- isExplicitJS = true;
- } else if (exists(localBin)) {
- bin = localBin;
- }
-
- args = args.slice(1);
-
- var proc;
- if (process.platform !== 'win32') {
- if (isExplicitJS) {
- args.unshift(bin);
- // add executable arguments to spawn
- args = (process.execArgv || []).concat(args);
-
- proc = spawn(process.argv[0], args, { stdio: 'inherit', customFds: [0, 1, 2] });
- } else {
- proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });
- }
- } else {
- args.unshift(bin);
- proc = spawn(process.execPath, args, { stdio: 'inherit' });
- }
-
- var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];
- signals.forEach(function(signal) {
- process.on(signal, function() {
- if (proc.killed === false && proc.exitCode === null) {
- proc.kill(signal);
- }
- });
- });
- proc.on('close', process.exit.bind(process));
- proc.on('error', function(err) {
- if (err.code === 'ENOENT') {
- console.error('error: %s(1) does not exist, try --help', bin);
- } else if (err.code === 'EACCES') {
- console.error('error: %s(1) not executable. try chmod or run with root', bin);
- }
- process.exit(1);
- });
-
- // Store the reference to the child process
- this.runningCommand = proc;
-};
-
-/**
- * Normalize `args`, splitting joined short flags. For example
- * the arg "-abc" is equivalent to "-a -b -c".
- * This also normalizes equal sign and splits "--abc=def" into "--abc def".
- *
- * @param {Array} args
- * @return {Array}
- * @api private
- */
-
-Command.prototype.normalize = function(args) {
- var ret = [],
- arg,
- lastOpt,
- index;
-
- for (var i = 0, len = args.length; i < len; ++i) {
- arg = args[i];
- if (i > 0) {
- lastOpt = this.optionFor(args[i - 1]);
- }
-
- if (arg === '--') {
- // Honor option terminator
- ret = ret.concat(args.slice(i));
- break;
- } else if (lastOpt && lastOpt.required) {
- ret.push(arg);
- } else if (arg.length > 1 && arg[0] === '-' && arg[1] !== '-') {
- arg.slice(1).split('').forEach(function(c) {
- ret.push('-' + c);
- });
- } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
- ret.push(arg.slice(0, index), arg.slice(index + 1));
- } else {
- ret.push(arg);
- }
- }
-
- return ret;
-};
-
-/**
- * Parse command `args`.
- *
- * When listener(s) are available those
- * callbacks are invoked, otherwise the "*"
- * event is emitted and those actions are invoked.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api private
- */
-
-Command.prototype.parseArgs = function(args, unknown) {
- var name;
-
- if (args.length) {
- name = args[0];
- if (this.listeners('command:' + name).length) {
- this.emit('command:' + args.shift(), args, unknown);
- } else {
- this.emit('command:*', args);
- }
- } else {
- outputHelpIfNecessary(this, unknown);
-
- // If there were no args and we have unknown options,
- // then they are extraneous and we need to error.
- if (unknown.length > 0) {
- this.unknownOption(unknown[0]);
- }
- if (this.commands.length === 0 &&
- this._args.filter(function(a) { return a.required }).length === 0) {
- this.emit('command:*');
- }
- }
-
- return this;
-};
-
-/**
- * Return an option matching `arg` if any.
- *
- * @param {String} arg
- * @return {Option}
- * @api private
- */
-
-Command.prototype.optionFor = function(arg) {
- for (var i = 0, len = this.options.length; i < len; ++i) {
- if (this.options[i].is(arg)) {
- return this.options[i];
- }
- }
-};
-
-/**
- * Parse options from `argv` returning `argv`
- * void of these options.
- *
- * @param {Array} argv
- * @return {Array}
- * @api public
- */
-
-Command.prototype.parseOptions = function(argv) {
- var args = [],
- len = argv.length,
- literal,
- option,
- arg;
-
- var unknownOptions = [];
-
- // parse options
- for (var i = 0; i < len; ++i) {
- arg = argv[i];
-
- // literal args after --
- if (literal) {
- args.push(arg);
- continue;
- }
-
- if (arg === '--') {
- literal = true;
- continue;
- }
-
- // find matching Option
- option = this.optionFor(arg);
-
- // option is defined
- if (option) {
- // requires arg
- if (option.required) {
- arg = argv[++i];
- if (arg == null) return this.optionMissingArgument(option);
- this.emit('option:' + option.name(), arg);
- // optional arg
- } else if (option.optional) {
- arg = argv[i + 1];
- if (arg == null || (arg[0] === '-' && arg !== '-')) {
- arg = null;
- } else {
- ++i;
- }
- this.emit('option:' + option.name(), arg);
- // bool
- } else {
- this.emit('option:' + option.name());
- }
- continue;
- }
-
- // looks like an option
- if (arg.length > 1 && arg[0] === '-') {
- unknownOptions.push(arg);
-
- // If the next argument looks like it might be
- // an argument for this option, we pass it on.
- // If it isn't, then it'll simply be ignored
- if ((i + 1) < argv.length && argv[i + 1][0] !== '-') {
- unknownOptions.push(argv[++i]);
- }
- continue;
- }
-
- // arg
- args.push(arg);
- }
-
- return { args: args, unknown: unknownOptions };
-};
-
-/**
- * Return an object containing options as key-value pairs
- *
- * @return {Object}
- * @api public
- */
-Command.prototype.opts = function() {
- var result = {},
- len = this.options.length;
-
- for (var i = 0; i < len; i++) {
- var key = this.options[i].attributeName();
- result[key] = key === this._versionOptionName ? this._version : this[key];
- }
- return result;
-};
-
-/**
- * Argument `name` is missing.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.missingArgument = function(name) {
- console.error("error: missing required argument `%s'", name);
- process.exit(1);
-};
-
-/**
- * `Option` is missing an argument, but received `flag` or nothing.
- *
- * @param {String} option
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.optionMissingArgument = function(option, flag) {
- if (flag) {
- console.error("error: option `%s' argument missing, got `%s'", option.flags, flag);
- } else {
- console.error("error: option `%s' argument missing", option.flags);
- }
- process.exit(1);
-};
-
-/**
- * Unknown option `flag`.
- *
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.unknownOption = function(flag) {
- if (this._allowUnknownOption) return;
- console.error("error: unknown option `%s'", flag);
- process.exit(1);
-};
-
-/**
- * Variadic argument with `name` is not the last argument as required.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.variadicArgNotLast = function(name) {
- console.error("error: variadic arguments must be last `%s'", name);
- process.exit(1);
-};
-
-/**
- * Set the program version to `str`.
- *
- * This method auto-registers the "-V, --version" flag
- * which will print the version number when passed.
- *
- * @param {String} str
- * @param {String} [flags]
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.version = function(str, flags) {
- if (arguments.length === 0) return this._version;
- this._version = str;
- flags = flags || '-V, --version';
- var versionOption = new Option(flags, 'output the version number');
- this._versionOptionName = versionOption.long.substr(2) || 'version';
- this.options.push(versionOption);
- this.on('option:' + this._versionOptionName, function() {
- process.stdout.write(str + '\n');
- process.exit(0);
- });
- return this;
-};
-
-/**
- * Set the description to `str`.
- *
- * @param {String} str
- * @param {Object} argsDescription
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.description = function(str, argsDescription) {
- if (arguments.length === 0) return this._description;
- this._description = str;
- this._argsDescription = argsDescription;
- return this;
-};
-
-/**
- * Set an alias for the command
- *
- * @param {String} alias
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.alias = function(alias) {
- var command = this;
- if (this.commands.length !== 0) {
- command = this.commands[this.commands.length - 1];
- }
-
- if (arguments.length === 0) return command._alias;
-
- if (alias === command._name) throw new Error('Command alias can\'t be the same as its name');
-
- command._alias = alias;
- return this;
-};
-
-/**
- * Set / get the command usage `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.usage = function(str) {
- var args = this._args.map(function(arg) {
- return humanReadableArgName(arg);
- });
-
- var usage = '[options]' +
- (this.commands.length ? ' [command]' : '') +
- (this._args.length ? ' ' + args.join(' ') : '');
-
- if (arguments.length === 0) return this._usage || usage;
- this._usage = str;
-
- return this;
-};
-
-/**
- * Get or set the name of the command
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.name = function(str) {
- if (arguments.length === 0) return this._name;
- this._name = str;
- return this;
-};
-
-/**
- * Return prepared commands.
- *
- * @return {Array}
- * @api private
- */
-
-Command.prototype.prepareCommands = function() {
- return this.commands.filter(function(cmd) {
- return !cmd._noHelp;
- }).map(function(cmd) {
- var args = cmd._args.map(function(arg) {
- return humanReadableArgName(arg);
- }).join(' ');
-
- return [
- cmd._name +
- (cmd._alias ? '|' + cmd._alias : '') +
- (cmd.options.length ? ' [options]' : '') +
- (args ? ' ' + args : ''),
- cmd._description
- ];
- });
-};
-
-/**
- * Return the largest command length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestCommandLength = function() {
- var commands = this.prepareCommands();
- return commands.reduce(function(max, command) {
- return Math.max(max, command[0].length);
- }, 0);
-};
-
-/**
- * Return the largest option length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestOptionLength = function() {
- var options = [].slice.call(this.options);
- options.push({
- flags: '-h, --help'
- });
- return options.reduce(function(max, option) {
- return Math.max(max, option.flags.length);
- }, 0);
-};
-
-/**
- * Return the largest arg length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestArgLength = function() {
- return this._args.reduce(function(max, arg) {
- return Math.max(max, arg.name.length);
- }, 0);
-};
-
-/**
- * Return the pad width.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.padWidth = function() {
- var width = this.largestOptionLength();
- if (this._argsDescription && this._args.length) {
- if (this.largestArgLength() > width) {
- width = this.largestArgLength();
- }
- }
-
- if (this.commands && this.commands.length) {
- if (this.largestCommandLength() > width) {
- width = this.largestCommandLength();
- }
- }
-
- return width;
-};
-
-/**
- * Return help for options.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.optionHelp = function() {
- var width = this.padWidth();
-
- // Append the help information
- return this.options.map(function(option) {
- return pad(option.flags, width) + ' ' + option.description +
- ((option.bool && option.defaultValue !== undefined) ? ' (default: ' + JSON.stringify(option.defaultValue) + ')' : '');
- }).concat([pad('-h, --help', width) + ' ' + 'output usage information'])
- .join('\n');
-};
-
-/**
- * Return command help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.commandHelp = function() {
- if (!this.commands.length) return '';
-
- var commands = this.prepareCommands();
- var width = this.padWidth();
-
- return [
- 'Commands:',
- commands.map(function(cmd) {
- var desc = cmd[1] ? ' ' + cmd[1] : '';
- return (desc ? pad(cmd[0], width) : cmd[0]) + desc;
- }).join('\n').replace(/^/gm, ' '),
- ''
- ].join('\n');
-};
-
-/**
- * Return program help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.helpInformation = function() {
- var desc = [];
- if (this._description) {
- desc = [
- this._description,
- ''
- ];
-
- var argsDescription = this._argsDescription;
- if (argsDescription && this._args.length) {
- var width = this.padWidth();
- desc.push('Arguments:');
- desc.push('');
- this._args.forEach(function(arg) {
- desc.push(' ' + pad(arg.name, width) + ' ' + argsDescription[arg.name]);
- });
- desc.push('');
- }
- }
-
- var cmdName = this._name;
- if (this._alias) {
- cmdName = cmdName + '|' + this._alias;
- }
- var usage = [
- 'Usage: ' + cmdName + ' ' + this.usage(),
- ''
- ];
-
- var cmds = [];
- var commandHelp = this.commandHelp();
- if (commandHelp) cmds = [commandHelp];
-
- var options = [
- 'Options:',
- '' + this.optionHelp().replace(/^/gm, ' '),
- ''
- ];
-
- return usage
- .concat(desc)
- .concat(options)
- .concat(cmds)
- .join('\n');
-};
-
-/**
- * Output help information for this command
- *
- * @api public
- */
-
-Command.prototype.outputHelp = function(cb) {
- if (!cb) {
- cb = function(passthru) {
- return passthru;
- };
- }
- process.stdout.write(cb(this.helpInformation()));
- this.emit('--help');
-};
-
-/**
- * Output help information and exit.
- *
- * @api public
- */
-
-Command.prototype.help = function(cb) {
- this.outputHelp(cb);
- process.exit();
-};
-
-/**
- * Camel-case the given `flag`
- *
- * @param {String} flag
- * @return {String}
- * @api private
- */
-
-function camelcase(flag) {
- return flag.split('-').reduce(function(str, word) {
- return str + word[0].toUpperCase() + word.slice(1);
- });
-}
-
-/**
- * Pad `str` to `width`.
- *
- * @param {String} str
- * @param {Number} width
- * @return {String}
- * @api private
- */
-
-function pad(str, width) {
- var len = Math.max(0, width - str.length);
- return str + Array(len + 1).join(' ');
-}
-
-/**
- * Output help information if necessary
- *
- * @param {Command} command to output help for
- * @param {Array} array of options to search for -h or --help
- * @api private
- */
-
-function outputHelpIfNecessary(cmd, options) {
- options = options || [];
- for (var i = 0; i < options.length; i++) {
- if (options[i] === '--help' || options[i] === '-h') {
- cmd.outputHelp();
- process.exit(0);
- }
- }
-}
-
-/**
- * Takes an argument an returns its human readable equivalent for help usage.
- *
- * @param {Object} arg
- * @return {String}
- * @api private
- */
-
-function humanReadableArgName(arg) {
- var nameOutput = arg.name + (arg.variadic === true ? '...' : '');
-
- return arg.required
- ? '<' + nameOutput + '>'
- : '[' + nameOutput + ']';
-}
-
-// for versions before node v0.8 when there weren't `fs.existsSync`
-function exists(file) {
- try {
- if (fs.statSync(file).isFile()) {
- return true;
- }
- } catch (e) {
- return false;
- }
-}
diff --git a/node_modules/uglify-js/node_modules/commander/package.json b/node_modules/uglify-js/node_modules/commander/package.json
deleted file mode 100644
index 2aea51e..0000000
--- a/node_modules/uglify-js/node_modules/commander/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "_from": "commander@~2.19.0",
- "_id": "commander@2.19.0",
- "_inBundle": false,
- "_integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
- "_location": "/uglify-js/commander",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "commander@~2.19.0",
- "name": "commander",
- "escapedName": "commander",
- "rawSpec": "~2.19.0",
- "saveSpec": null,
- "fetchSpec": "~2.19.0"
- },
- "_requiredBy": [
- "/uglify-js"
- ],
- "_resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
- "_shasum": "f6198aa84e5b83c46054b94ddedbfed5ee9ff12a",
- "_spec": "commander@~2.19.0",
- "_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\uglify-js",
- "author": {
- "name": "TJ Holowaychuk",
- "email": "tj@vision-media.ca"
- },
- "bugs": {
- "url": "https://github.com/tj/commander.js/issues"
- },
- "bundleDependencies": false,
- "dependencies": {},
- "deprecated": false,
- "description": "the complete solution for node.js command-line programs",
- "devDependencies": {
- "@types/node": "^10.11.3",
- "eslint": "^5.6.1",
- "should": "^13.2.3",
- "sinon": "^6.3.4",
- "standard": "^12.0.1",
- "ts-node": "^7.0.1",
- "typescript": "^2.9.2"
- },
- "files": [
- "index.js",
- "typings/index.d.ts"
- ],
- "homepage": "https://github.com/tj/commander.js#readme",
- "keywords": [
- "commander",
- "command",
- "option",
- "parser"
- ],
- "license": "MIT",
- "main": "index",
- "name": "commander",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/tj/commander.js.git"
- },
- "scripts": {
- "lint": "eslint index.js",
- "test": "node test/run.js && npm run test-typings",
- "test-typings": "tsc -p tsconfig.json"
- },
- "typings": "typings/index.d.ts",
- "version": "2.19.0"
-}
diff --git a/node_modules/uglify-js/node_modules/commander/typings/index.d.ts b/node_modules/uglify-js/node_modules/commander/typings/index.d.ts
deleted file mode 100644
index 312b056..0000000
--- a/node_modules/uglify-js/node_modules/commander/typings/index.d.ts
+++ /dev/null
@@ -1,309 +0,0 @@
-// Type definitions for commander 2.11
-// Project: https://github.com/visionmedia/commander.js
-// Definitions by: Alan Agius , Marcelo Dezem , vvakame , Jules Randolph
-// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
-
-declare namespace local {
-
- class Option {
- flags: string;
- required: boolean;
- optional: boolean;
- bool: boolean;
- short?: string;
- long: string;
- description: string;
-
- /**
- * Initialize a new `Option` with the given `flags` and `description`.
- *
- * @param {string} flags
- * @param {string} [description]
- */
- constructor(flags: string, description?: string);
- }
-
- class Command extends NodeJS.EventEmitter {
- [key: string]: any;
-
- args: string[];
-
- /**
- * Initialize a new `Command`.
- *
- * @param {string} [name]
- */
- constructor(name?: string);
-
- /**
- * Set the program version to `str`.
- *
- * This method auto-registers the "-V, --version" flag
- * which will print the version number when passed.
- *
- * @param {string} str
- * @param {string} [flags]
- * @returns {Command} for chaining
- */
- version(str: string, flags?: string): Command;
-
- /**
- * Add command `name`.
- *
- * The `.action()` callback is invoked when the
- * command `name` is specified via __ARGV__,
- * and the remaining arguments are applied to the
- * function for access.
- *
- * When the `name` is "*" an un-matched command
- * will be passed as the first arg, followed by
- * the rest of __ARGV__ remaining.
- *
- * @example
- * program
- * .version('0.0.1')
- * .option('-C, --chdir ', 'change the working directory')
- * .option('-c, --config ', 'set config path. defaults to ./deploy.conf')
- * .option('-T, --no-tests', 'ignore test hook')
- *
- * program
- * .command('setup')
- * .description('run remote setup commands')
- * .action(function() {
- * console.log('setup');
- * });
- *
- * program
- * .command('exec ')
- * .description('run the given remote command')
- * .action(function(cmd) {
- * console.log('exec "%s"', cmd);
- * });
- *
- * program
- * .command('teardown [otherDirs...]')
- * .description('run teardown commands')
- * .action(function(dir, otherDirs) {
- * console.log('dir "%s"', dir);
- * if (otherDirs) {
- * otherDirs.forEach(function (oDir) {
- * console.log('dir "%s"', oDir);
- * });
- * }
- * });
- *
- * program
- * .command('*')
- * .description('deploy the given env')
- * .action(function(env) {
- * console.log('deploying "%s"', env);
- * });
- *
- * program.parse(process.argv);
- *
- * @param {string} name
- * @param {string} [desc] for git-style sub-commands
- * @param {CommandOptions} [opts] command options
- * @returns {Command} the new command
- */
- command(name: string, desc?: string, opts?: commander.CommandOptions): Command;
-
- /**
- * Define argument syntax for the top-level command.
- *
- * @param {string} desc
- * @returns {Command} for chaining
- */
- arguments(desc: string): Command;
-
- /**
- * Parse expected `args`.
- *
- * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
- *
- * @param {string[]} args
- * @returns {Command} for chaining
- */
- parseExpectedArgs(args: string[]): Command;
-
- /**
- * Register callback `fn` for the command.
- *
- * @example
- * program
- * .command('help')
- * .description('display verbose help')
- * .action(function() {
- * // output help here
- * });
- *
- * @param {(...args: any[]) => void} fn
- * @returns {Command} for chaining
- */
- action(fn: (...args: any[]) => void): Command;
-
- /**
- * Define option with `flags`, `description` and optional
- * coercion `fn`.
- *
- * The `flags` string should contain both the short and long flags,
- * separated by comma, a pipe or space. The following are all valid
- * all will output this way when `--help` is used.
- *
- * "-p, --pepper"
- * "-p|--pepper"
- * "-p --pepper"
- *
- * @example
- * // simple boolean defaulting to false
- * program.option('-p, --pepper', 'add pepper');
- *
- * --pepper
- * program.pepper
- * // => Boolean
- *
- * // simple boolean defaulting to true
- * program.option('-C, --no-cheese', 'remove cheese');
- *
- * program.cheese
- * // => true
- *
- * --no-cheese
- * program.cheese
- * // => false
- *
- * // required argument
- * program.option('-C, --chdir ', 'change the working directory');
- *
- * --chdir /tmp
- * program.chdir
- * // => "/tmp"
- *
- * // optional argument
- * program.option('-c, --cheese [type]', 'add cheese [marble]');
- *
- * @param {string} flags
- * @param {string} [description]
- * @param {((arg1: any, arg2: any) => void) | RegExp} [fn] function or default
- * @param {*} [defaultValue]
- * @returns {Command} for chaining
- */
- option(flags: string, description?: string, fn?: ((arg1: any, arg2: any) => void) | RegExp, defaultValue?: any): Command;
- option(flags: string, description?: string, defaultValue?: any): Command;
-
- /**
- * Allow unknown options on the command line.
- *
- * @param {boolean} [arg] if `true` or omitted, no error will be thrown for unknown options.
- * @returns {Command} for chaining
- */
- allowUnknownOption(arg?: boolean): Command;
-
- /**
- * Parse `argv`, settings options and invoking commands when defined.
- *
- * @param {string[]} argv
- * @returns {Command} for chaining
- */
- parse(argv: string[]): Command;
-
- /**
- * Parse options from `argv` returning `argv` void of these options.
- *
- * @param {string[]} argv
- * @returns {ParseOptionsResult}
- */
- parseOptions(argv: string[]): commander.ParseOptionsResult;
-
- /**
- * Return an object containing options as key-value pairs
- *
- * @returns {{[key: string]: any}}
- */
- opts(): { [key: string]: any };
-
- /**
- * Set the description to `str`.
- *
- * @param {string} str
- * @return {(Command | string)}
- */
- description(str: string): Command;
- description(): string;
-
- /**
- * Set an alias for the command.
- *
- * @param {string} alias
- * @return {(Command | string)}
- */
- alias(alias: string): Command;
- alias(): string;
-
- /**
- * Set or get the command usage.
- *
- * @param {string} str
- * @return {(Command | string)}
- */
- usage(str: string): Command;
- usage(): string;
-
- /**
- * Set the name of the command.
- *
- * @param {string} str
- * @return {Command}
- */
- name(str: string): Command;
-
- /**
- * Get the name of the command.
- *
- * @return {string}
- */
- name(): string;
-
- /**
- * Output help information for this command.
- *
- * @param {(str: string) => string} [cb]
- */
- outputHelp(cb?: (str: string) => string): void;
-
- /** Output help information and exit.
- *
- * @param {(str: string) => string} [cb]
- */
- help(cb?: (str: string) => string): never;
- }
-
-}
-
-declare namespace commander {
-
- type Command = local.Command
-
- type Option = local.Option
-
- interface CommandOptions {
- noHelp?: boolean;
- isDefault?: boolean;
- }
-
- interface ParseOptionsResult {
- args: string[];
- unknown: string[];
- }
-
- interface CommanderStatic extends Command {
- Command: typeof local.Command;
- Option: typeof local.Option;
- CommandOptions: CommandOptions;
- ParseOptionsResult: ParseOptionsResult;
- }
-
-}
-
-declare const commander: commander.CommanderStatic;
-export = commander;
diff --git a/node_modules/uglify-js/package.json b/node_modules/uglify-js/package.json
deleted file mode 100644
index b98bfae..0000000
--- a/node_modules/uglify-js/package.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
- "_from": "uglify-js@^3.5.1",
- "_id": "uglify-js@3.7.7",
- "_inBundle": false,
- "_integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==",
- "_location": "/uglify-js",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "uglify-js@^3.5.1",
- "name": "uglify-js",
- "escapedName": "uglify-js",
- "rawSpec": "^3.5.1",
- "saveSpec": null,
- "fetchSpec": "^3.5.1"
- },
- "_requiredBy": [
- "/html-minifier"
- ],
- "_resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz",
- "_shasum": "21e52c7dccda80a53bf7cde69628a7e511aec9c9",
- "_spec": "uglify-js@^3.5.1",
- "_where": "/home/s2/Code/minifyfromhtml/node_modules/html-minifier",
- "author": {
- "name": "Mihai Bazon",
- "email": "mihai.bazon@gmail.com",
- "url": "http://lisperator.net/"
- },
- "bin": {
- "uglifyjs": "bin/uglifyjs"
- },
- "bugs": {
- "url": "https://github.com/mishoo/UglifyJS2/issues"
- },
- "bundleDependencies": false,
- "dependencies": {
- "commander": "~2.20.3",
- "source-map": "~0.6.1"
- },
- "deprecated": false,
- "description": "JavaScript parser, mangler/compressor and beautifier toolkit",
- "devDependencies": {
- "acorn": "~7.1.0",
- "semver": "~6.3.0"
- },
- "engines": {
- "node": ">=0.8.0"
- },
- "files": [
- "bin",
- "lib",
- "tools",
- "LICENSE"
- ],
- "homepage": "https://github.com/mishoo/UglifyJS2#readme",
- "keywords": [
- "cli",
- "compress",
- "compressor",
- "ecma",
- "ecmascript",
- "es",
- "es5",
- "javascript",
- "js",
- "jsmin",
- "min",
- "minification",
- "minifier",
- "minify",
- "optimize",
- "optimizer",
- "pack",
- "packer",
- "parse",
- "parser",
- "uglifier",
- "uglify"
- ],
- "license": "BSD-2-Clause",
- "main": "tools/node.js",
- "maintainers": [
- {
- "name": "Alex Lam",
- "email": "alexlamsl@gmail.com"
- },
- {
- "name": "Mihai Bazon",
- "email": "mihai.bazon@gmail.com",
- "url": "http://lisperator.net/"
- }
- ],
- "name": "uglify-js",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/mishoo/UglifyJS2.git"
- },
- "scripts": {
- "test": "node test/compress.js && node test/mocha.js"
- },
- "version": "3.7.7"
-}
diff --git a/node_modules/uglify-js/tools/domprops.json b/node_modules/uglify-js/tools/domprops.json
deleted file mode 100644
index 15bb208..0000000
--- a/node_modules/uglify-js/tools/domprops.json
+++ /dev/null
@@ -1,6850 +0,0 @@
-[
- "$&",
- "$'",
- "$*",
- "$+",
- "$1",
- "$2",
- "$3",
- "$4",
- "$5",
- "$6",
- "$7",
- "$8",
- "$9",
- "$_",
- "$`",
- "$input",
- "-moz-animation",
- "-moz-animation-delay",
- "-moz-animation-direction",
- "-moz-animation-duration",
- "-moz-animation-fill-mode",
- "-moz-animation-iteration-count",
- "-moz-animation-name",
- "-moz-animation-play-state",
- "-moz-animation-timing-function",
- "-moz-appearance",
- "-moz-backface-visibility",
- "-moz-binding",
- "-moz-border-end",
- "-moz-border-end-color",
- "-moz-border-end-style",
- "-moz-border-end-width",
- "-moz-border-image",
- "-moz-border-start",
- "-moz-border-start-color",
- "-moz-border-start-style",
- "-moz-border-start-width",
- "-moz-box-align",
- "-moz-box-direction",
- "-moz-box-flex",
- "-moz-box-ordinal-group",
- "-moz-box-orient",
- "-moz-box-pack",
- "-moz-box-sizing",
- "-moz-column-count",
- "-moz-column-fill",
- "-moz-column-gap",
- "-moz-column-rule",
- "-moz-column-rule-color",
- "-moz-column-rule-style",
- "-moz-column-rule-width",
- "-moz-column-width",
- "-moz-columns",
- "-moz-float-edge",
- "-moz-font-feature-settings",
- "-moz-font-language-override",
- "-moz-force-broken-image-icon",
- "-moz-hyphens",
- "-moz-image-region",
- "-moz-margin-end",
- "-moz-margin-start",
- "-moz-orient",
- "-moz-outline-radius",
- "-moz-outline-radius-bottomleft",
- "-moz-outline-radius-bottomright",
- "-moz-outline-radius-topleft",
- "-moz-outline-radius-topright",
- "-moz-padding-end",
- "-moz-padding-start",
- "-moz-perspective",
- "-moz-perspective-origin",
- "-moz-stack-sizing",
- "-moz-tab-size",
- "-moz-text-size-adjust",
- "-moz-transform",
- "-moz-transform-origin",
- "-moz-transform-style",
- "-moz-transition",
- "-moz-transition-delay",
- "-moz-transition-duration",
- "-moz-transition-property",
- "-moz-transition-timing-function",
- "-moz-user-focus",
- "-moz-user-input",
- "-moz-user-modify",
- "-moz-user-select",
- "-moz-window-dragging",
- "-webkit-align-content",
- "-webkit-align-items",
- "-webkit-align-self",
- "-webkit-animation",
- "-webkit-animation-delay",
- "-webkit-animation-direction",
- "-webkit-animation-duration",
- "-webkit-animation-fill-mode",
- "-webkit-animation-iteration-count",
- "-webkit-animation-name",
- "-webkit-animation-play-state",
- "-webkit-animation-timing-function",
- "-webkit-appearance",
- "-webkit-backface-visibility",
- "-webkit-background-clip",
- "-webkit-background-origin",
- "-webkit-background-size",
- "-webkit-border-bottom-left-radius",
- "-webkit-border-bottom-right-radius",
- "-webkit-border-image",
- "-webkit-border-radius",
- "-webkit-border-top-left-radius",
- "-webkit-border-top-right-radius",
- "-webkit-box-align",
- "-webkit-box-direction",
- "-webkit-box-flex",
- "-webkit-box-ordinal-group",
- "-webkit-box-orient",
- "-webkit-box-pack",
- "-webkit-box-shadow",
- "-webkit-box-sizing",
- "-webkit-filter",
- "-webkit-flex",
- "-webkit-flex-basis",
- "-webkit-flex-direction",
- "-webkit-flex-flow",
- "-webkit-flex-grow",
- "-webkit-flex-shrink",
- "-webkit-flex-wrap",
- "-webkit-justify-content",
- "-webkit-mask",
- "-webkit-mask-clip",
- "-webkit-mask-composite",
- "-webkit-mask-image",
- "-webkit-mask-origin",
- "-webkit-mask-position",
- "-webkit-mask-position-x",
- "-webkit-mask-position-y",
- "-webkit-mask-repeat",
- "-webkit-mask-size",
- "-webkit-order",
- "-webkit-perspective",
- "-webkit-perspective-origin",
- "-webkit-text-fill-color",
- "-webkit-text-size-adjust",
- "-webkit-text-stroke",
- "-webkit-text-stroke-color",
- "-webkit-text-stroke-width",
- "-webkit-transform",
- "-webkit-transform-origin",
- "-webkit-transform-style",
- "-webkit-transition",
- "-webkit-transition-delay",
- "-webkit-transition-duration",
- "-webkit-transition-property",
- "-webkit-transition-timing-function",
- "-webkit-user-select",
- "@@iterator",
- "ABORT_ERR",
- "ACTIVE",
- "ACTIVE_ATTRIBUTES",
- "ACTIVE_TEXTURE",
- "ACTIVE_UNIFORMS",
- "ADDITION",
- "ALIASED_LINE_WIDTH_RANGE",
- "ALIASED_POINT_SIZE_RANGE",
- "ALLOW_KEYBOARD_INPUT",
- "ALLPASS",
- "ALPHA",
- "ALPHA_BITS",
- "ALT_MASK",
- "ALWAYS",
- "ANGLE_instanced_arrays",
- "ANY_TYPE",
- "ANY_UNORDERED_NODE_TYPE",
- "ARRAY_BUFFER",
- "ARRAY_BUFFER_BINDING",
- "ATTACHED_SHADERS",
- "ATTRIBUTE_NODE",
- "AT_TARGET",
- "AbortController",
- "AbortSignal",
- "AbsoluteOrientationSensor",
- "Accelerometer",
- "ActiveXObject",
- "AddSearchProvider",
- "AesGcmEncryptResult",
- "AnalyserNode",
- "Animation",
- "AnimationEffect",
- "AnimationEvent",
- "AnimationPlaybackEvent",
- "AnonXMLHttpRequest",
- "ApplicationCache",
- "ApplicationCacheErrorEvent",
- "Array",
- "ArrayBuffer",
- "Atomics",
- "Attr",
- "Audio",
- "AudioBuffer",
- "AudioBufferSourceNode",
- "AudioContext",
- "AudioDestinationNode",
- "AudioListener",
- "AudioNode",
- "AudioParam",
- "AudioParamMap",
- "AudioProcessingEvent",
- "AudioScheduledSourceNode",
- "AudioStreamTrack",
- "AudioTrack",
- "AudioTrackList",
- "AudioWorklet",
- "AudioWorkletNode",
- "AuthenticatorAssertionResponse",
- "AuthenticatorAttestationResponse",
- "AuthenticatorResponse",
- "AutocompleteErrorEvent",
- "BACK",
- "BAD_BOUNDARYPOINTS_ERR",
- "BANDPASS",
- "BLEND",
- "BLEND_COLOR",
- "BLEND_DST_ALPHA",
- "BLEND_DST_RGB",
- "BLEND_EQUATION",
- "BLEND_EQUATION_ALPHA",
- "BLEND_EQUATION_RGB",
- "BLEND_SRC_ALPHA",
- "BLEND_SRC_RGB",
- "BLUE_BITS",
- "BLUR",
- "BOOL",
- "BOOLEAN_TYPE",
- "BOOL_VEC2",
- "BOOL_VEC3",
- "BOOL_VEC4",
- "BOTH",
- "BROWSER_DEFAULT_WEBGL",
- "BUBBLING_PHASE",
- "BUFFER_SIZE",
- "BUFFER_USAGE",
- "BYTE",
- "BYTES_PER_ELEMENT",
- "BarProp",
- "BaseAudioContext",
- "BaseHref",
- "BatteryManager",
- "BeforeInstallPromptEvent",
- "BeforeLoadEvent",
- "BeforeUnloadEvent",
- "BigInt",
- "BigInt64Array",
- "BigUint64Array",
- "BiquadFilterNode",
- "Blob",
- "BlobEvent",
- "Bluetooth",
- "BluetoothCharacteristicProperties",
- "BluetoothDevice",
- "BluetoothRemoteGATTCharacteristic",
- "BluetoothRemoteGATTDescriptor",
- "BluetoothRemoteGATTServer",
- "BluetoothRemoteGATTService",
- "BluetoothUUID",
- "BookmarkCollection",
- "Boolean",
- "BroadcastChannel",
- "ByteLengthQueuingStrategy",
- "CANNOT_RUN",
- "CAPTURING_PHASE",
- "CCW",
- "CDATASection",
- "CDATA_SECTION_NODE",
- "CHANGE",
- "CHARSET_RULE",
- "CHECKING",
- "CLAMP_TO_EDGE",
- "CLICK",
- "CLOSED",
- "CLOSING",
- "COLOR_ATTACHMENT0",
- "COLOR_BUFFER_BIT",
- "COLOR_CLEAR_VALUE",
- "COLOR_WRITEMASK",
- "COMMENT_NODE",
- "COMPILE_STATUS",
- "COMPRESSED_RGBA_S3TC_DXT1_EXT",
- "COMPRESSED_RGBA_S3TC_DXT3_EXT",
- "COMPRESSED_RGBA_S3TC_DXT5_EXT",
- "COMPRESSED_RGB_S3TC_DXT1_EXT",
- "COMPRESSED_TEXTURE_FORMATS",
- "CONNECTING",
- "CONSTANT_ALPHA",
- "CONSTANT_COLOR",
- "CONSTRAINT_ERR",
- "CONTENT",
- "CONTEXT_LOST_WEBGL",
- "CONTROL_MASK",
- "COUNTER_STYLE_RULE",
- "CSS",
- "CSS2Properties",
- "CSSCharsetRule",
- "CSSConditionRule",
- "CSSCounterStyleRule",
- "CSSFontFaceRule",
- "CSSFontFeatureValuesRule",
- "CSSGroupingRule",
- "CSSImageValue",
- "CSSImportRule",
- "CSSKeyframeRule",
- "CSSKeyframesRule",
- "CSSKeywordValue",
- "CSSMathInvert",
- "CSSMathMax",
- "CSSMathMin",
- "CSSMathNegate",
- "CSSMathProduct",
- "CSSMathSum",
- "CSSMathValue",
- "CSSMatrixComponent",
- "CSSMediaRule",
- "CSSMozDocumentRule",
- "CSSNameSpaceRule",
- "CSSNamespaceRule",
- "CSSNumericArray",
- "CSSNumericValue",
- "CSSPageRule",
- "CSSPerspective",
- "CSSPositionValue",
- "CSSPrimitiveValue",
- "CSSRotate",
- "CSSRule",
- "CSSRuleList",
- "CSSScale",
- "CSSSkew",
- "CSSSkewX",
- "CSSSkewY",
- "CSSStyleDeclaration",
- "CSSStyleRule",
- "CSSStyleSheet",
- "CSSStyleValue",
- "CSSSupportsRule",
- "CSSTransformComponent",
- "CSSTransformValue",
- "CSSTranslate",
- "CSSUnitValue",
- "CSSUnknownRule",
- "CSSUnparsedValue",
- "CSSValue",
- "CSSValueList",
- "CSSVariableReferenceValue",
- "CSSVariablesDeclaration",
- "CSSVariablesRule",
- "CSSViewportRule",
- "CSS_ATTR",
- "CSS_CM",
- "CSS_COUNTER",
- "CSS_CUSTOM",
- "CSS_DEG",
- "CSS_DIMENSION",
- "CSS_EMS",
- "CSS_EXS",
- "CSS_FILTER_BLUR",
- "CSS_FILTER_BRIGHTNESS",
- "CSS_FILTER_CONTRAST",
- "CSS_FILTER_CUSTOM",
- "CSS_FILTER_DROP_SHADOW",
- "CSS_FILTER_GRAYSCALE",
- "CSS_FILTER_HUE_ROTATE",
- "CSS_FILTER_INVERT",
- "CSS_FILTER_OPACITY",
- "CSS_FILTER_REFERENCE",
- "CSS_FILTER_SATURATE",
- "CSS_FILTER_SEPIA",
- "CSS_GRAD",
- "CSS_HZ",
- "CSS_IDENT",
- "CSS_IN",
- "CSS_INHERIT",
- "CSS_KHZ",
- "CSS_MATRIX",
- "CSS_MATRIX3D",
- "CSS_MM",
- "CSS_MS",
- "CSS_NUMBER",
- "CSS_PC",
- "CSS_PERCENTAGE",
- "CSS_PERSPECTIVE",
- "CSS_PRIMITIVE_VALUE",
- "CSS_PT",
- "CSS_PX",
- "CSS_RAD",
- "CSS_RECT",
- "CSS_RGBCOLOR",
- "CSS_ROTATE",
- "CSS_ROTATE3D",
- "CSS_ROTATEX",
- "CSS_ROTATEY",
- "CSS_ROTATEZ",
- "CSS_S",
- "CSS_SCALE",
- "CSS_SCALE3D",
- "CSS_SCALEX",
- "CSS_SCALEY",
- "CSS_SCALEZ",
- "CSS_SKEW",
- "CSS_SKEWX",
- "CSS_SKEWY",
- "CSS_STRING",
- "CSS_TRANSLATE",
- "CSS_TRANSLATE3D",
- "CSS_TRANSLATEX",
- "CSS_TRANSLATEY",
- "CSS_TRANSLATEZ",
- "CSS_UNKNOWN",
- "CSS_URI",
- "CSS_VALUE_LIST",
- "CSS_VH",
- "CSS_VMAX",
- "CSS_VMIN",
- "CSS_VW",
- "CULL_FACE",
- "CULL_FACE_MODE",
- "CURRENT_PROGRAM",
- "CURRENT_VERTEX_ATTRIB",
- "CUSTOM",
- "CW",
- "Cache",
- "CacheStorage",
- "CanvasCaptureMediaStream",
- "CanvasCaptureMediaStreamTrack",
- "CanvasGradient",
- "CanvasPattern",
- "CanvasPixelArray",
- "CanvasRenderingContext2D",
- "CaretPosition",
- "ChannelMergerNode",
- "ChannelSplitterNode",
- "CharacterData",
- "Chrome PDF Plugin",
- "Chrome PDF Viewer",
- "ClientRect",
- "ClientRectList",
- "Clipboard",
- "ClipboardEvent",
- "CloseEvent",
- "Collator",
- "CollectGarbage",
- "CommandEvent",
- "Comment",
- "CompileError",
- "CompositionEvent",
- "Console",
- "ConstantSourceNode",
- "ControlRangeCollection",
- "Controllers",
- "ConvolverNode",
- "Coordinates",
- "CountQueuingStrategy",
- "Counter",
- "Credential",
- "CredentialsContainer",
- "Crypto",
- "CryptoKey",
- "CryptoOperation",
- "CustomElementRegistry",
- "CustomEvent",
- "DATABASE_ERR",
- "DATA_CLONE_ERR",
- "DATA_ERR",
- "DBLCLICK",
- "DECR",
- "DECR_WRAP",
- "DELETE_STATUS",
- "DEPTH_ATTACHMENT",
- "DEPTH_BITS",
- "DEPTH_BUFFER_BIT",
- "DEPTH_CLEAR_VALUE",
- "DEPTH_COMPONENT",
- "DEPTH_COMPONENT16",
- "DEPTH_FUNC",
- "DEPTH_RANGE",
- "DEPTH_STENCIL",
- "DEPTH_STENCIL_ATTACHMENT",
- "DEPTH_TEST",
- "DEPTH_WRITEMASK",
- "DIRECTION_DOWN",
- "DIRECTION_LEFT",
- "DIRECTION_RIGHT",
- "DIRECTION_UP",
- "DISABLED",
- "DISPATCH_REQUEST_ERR",
- "DITHER",
- "DOCUMENT_FRAGMENT_NODE",
- "DOCUMENT_NODE",
- "DOCUMENT_POSITION_CONTAINED_BY",
- "DOCUMENT_POSITION_CONTAINS",
- "DOCUMENT_POSITION_DISCONNECTED",
- "DOCUMENT_POSITION_FOLLOWING",
- "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC",
- "DOCUMENT_POSITION_PRECEDING",
- "DOCUMENT_TYPE_NODE",
- "DOMCursor",
- "DOMError",
- "DOMException",
- "DOMImplementation",
- "DOMImplementationLS",
- "DOMMatrix",
- "DOMMatrixReadOnly",
- "DOMParser",
- "DOMPoint",
- "DOMPointReadOnly",
- "DOMQuad",
- "DOMRect",
- "DOMRectList",
- "DOMRectReadOnly",
- "DOMRequest",
- "DOMSTRING_SIZE_ERR",
- "DOMSettableTokenList",
- "DOMStringList",
- "DOMStringMap",
- "DOMTokenList",
- "DOMTransactionEvent",
- "DOM_DELTA_LINE",
- "DOM_DELTA_PAGE",
- "DOM_DELTA_PIXEL",
- "DOM_INPUT_METHOD_DROP",
- "DOM_INPUT_METHOD_HANDWRITING",
- "DOM_INPUT_METHOD_IME",
- "DOM_INPUT_METHOD_KEYBOARD",
- "DOM_INPUT_METHOD_MULTIMODAL",
- "DOM_INPUT_METHOD_OPTION",
- "DOM_INPUT_METHOD_PASTE",
- "DOM_INPUT_METHOD_SCRIPT",
- "DOM_INPUT_METHOD_UNKNOWN",
- "DOM_INPUT_METHOD_VOICE",
- "DOM_KEY_LOCATION_JOYSTICK",
- "DOM_KEY_LOCATION_LEFT",
- "DOM_KEY_LOCATION_MOBILE",
- "DOM_KEY_LOCATION_NUMPAD",
- "DOM_KEY_LOCATION_RIGHT",
- "DOM_KEY_LOCATION_STANDARD",
- "DOM_VK_0",
- "DOM_VK_1",
- "DOM_VK_2",
- "DOM_VK_3",
- "DOM_VK_4",
- "DOM_VK_5",
- "DOM_VK_6",
- "DOM_VK_7",
- "DOM_VK_8",
- "DOM_VK_9",
- "DOM_VK_A",
- "DOM_VK_ACCEPT",
- "DOM_VK_ADD",
- "DOM_VK_ALT",
- "DOM_VK_ALTGR",
- "DOM_VK_AMPERSAND",
- "DOM_VK_ASTERISK",
- "DOM_VK_AT",
- "DOM_VK_ATTN",
- "DOM_VK_B",
- "DOM_VK_BACKSPACE",
- "DOM_VK_BACK_QUOTE",
- "DOM_VK_BACK_SLASH",
- "DOM_VK_BACK_SPACE",
- "DOM_VK_C",
- "DOM_VK_CANCEL",
- "DOM_VK_CAPS_LOCK",
- "DOM_VK_CIRCUMFLEX",
- "DOM_VK_CLEAR",
- "DOM_VK_CLOSE_BRACKET",
- "DOM_VK_CLOSE_CURLY_BRACKET",
- "DOM_VK_CLOSE_PAREN",
- "DOM_VK_COLON",
- "DOM_VK_COMMA",
- "DOM_VK_CONTEXT_MENU",
- "DOM_VK_CONTROL",
- "DOM_VK_CONVERT",
- "DOM_VK_CRSEL",
- "DOM_VK_CTRL",
- "DOM_VK_D",
- "DOM_VK_DECIMAL",
- "DOM_VK_DELETE",
- "DOM_VK_DIVIDE",
- "DOM_VK_DOLLAR",
- "DOM_VK_DOUBLE_QUOTE",
- "DOM_VK_DOWN",
- "DOM_VK_E",
- "DOM_VK_EISU",
- "DOM_VK_END",
- "DOM_VK_ENTER",
- "DOM_VK_EQUALS",
- "DOM_VK_EREOF",
- "DOM_VK_ESCAPE",
- "DOM_VK_EXCLAMATION",
- "DOM_VK_EXECUTE",
- "DOM_VK_EXSEL",
- "DOM_VK_F",
- "DOM_VK_F1",
- "DOM_VK_F10",
- "DOM_VK_F11",
- "DOM_VK_F12",
- "DOM_VK_F13",
- "DOM_VK_F14",
- "DOM_VK_F15",
- "DOM_VK_F16",
- "DOM_VK_F17",
- "DOM_VK_F18",
- "DOM_VK_F19",
- "DOM_VK_F2",
- "DOM_VK_F20",
- "DOM_VK_F21",
- "DOM_VK_F22",
- "DOM_VK_F23",
- "DOM_VK_F24",
- "DOM_VK_F25",
- "DOM_VK_F26",
- "DOM_VK_F27",
- "DOM_VK_F28",
- "DOM_VK_F29",
- "DOM_VK_F3",
- "DOM_VK_F30",
- "DOM_VK_F31",
- "DOM_VK_F32",
- "DOM_VK_F33",
- "DOM_VK_F34",
- "DOM_VK_F35",
- "DOM_VK_F36",
- "DOM_VK_F4",
- "DOM_VK_F5",
- "DOM_VK_F6",
- "DOM_VK_F7",
- "DOM_VK_F8",
- "DOM_VK_F9",
- "DOM_VK_FINAL",
- "DOM_VK_FRONT",
- "DOM_VK_G",
- "DOM_VK_GREATER_THAN",
- "DOM_VK_H",
- "DOM_VK_HANGUL",
- "DOM_VK_HANJA",
- "DOM_VK_HASH",
- "DOM_VK_HELP",
- "DOM_VK_HK_TOGGLE",
- "DOM_VK_HOME",
- "DOM_VK_HYPHEN_MINUS",
- "DOM_VK_I",
- "DOM_VK_INSERT",
- "DOM_VK_J",
- "DOM_VK_JUNJA",
- "DOM_VK_K",
- "DOM_VK_KANA",
- "DOM_VK_KANJI",
- "DOM_VK_L",
- "DOM_VK_LEFT",
- "DOM_VK_LEFT_TAB",
- "DOM_VK_LESS_THAN",
- "DOM_VK_M",
- "DOM_VK_META",
- "DOM_VK_MODECHANGE",
- "DOM_VK_MULTIPLY",
- "DOM_VK_N",
- "DOM_VK_NONCONVERT",
- "DOM_VK_NUMPAD0",
- "DOM_VK_NUMPAD1",
- "DOM_VK_NUMPAD2",
- "DOM_VK_NUMPAD3",
- "DOM_VK_NUMPAD4",
- "DOM_VK_NUMPAD5",
- "DOM_VK_NUMPAD6",
- "DOM_VK_NUMPAD7",
- "DOM_VK_NUMPAD8",
- "DOM_VK_NUMPAD9",
- "DOM_VK_NUM_LOCK",
- "DOM_VK_O",
- "DOM_VK_OEM_1",
- "DOM_VK_OEM_102",
- "DOM_VK_OEM_2",
- "DOM_VK_OEM_3",
- "DOM_VK_OEM_4",
- "DOM_VK_OEM_5",
- "DOM_VK_OEM_6",
- "DOM_VK_OEM_7",
- "DOM_VK_OEM_8",
- "DOM_VK_OEM_COMMA",
- "DOM_VK_OEM_MINUS",
- "DOM_VK_OEM_PERIOD",
- "DOM_VK_OEM_PLUS",
- "DOM_VK_OPEN_BRACKET",
- "DOM_VK_OPEN_CURLY_BRACKET",
- "DOM_VK_OPEN_PAREN",
- "DOM_VK_P",
- "DOM_VK_PA1",
- "DOM_VK_PAGEDOWN",
- "DOM_VK_PAGEUP",
- "DOM_VK_PAGE_DOWN",
- "DOM_VK_PAGE_UP",
- "DOM_VK_PAUSE",
- "DOM_VK_PERCENT",
- "DOM_VK_PERIOD",
- "DOM_VK_PIPE",
- "DOM_VK_PLAY",
- "DOM_VK_PLUS",
- "DOM_VK_PRINT",
- "DOM_VK_PRINTSCREEN",
- "DOM_VK_PROCESSKEY",
- "DOM_VK_PROPERITES",
- "DOM_VK_Q",
- "DOM_VK_QUESTION_MARK",
- "DOM_VK_QUOTE",
- "DOM_VK_R",
- "DOM_VK_REDO",
- "DOM_VK_RETURN",
- "DOM_VK_RIGHT",
- "DOM_VK_S",
- "DOM_VK_SCROLL_LOCK",
- "DOM_VK_SELECT",
- "DOM_VK_SEMICOLON",
- "DOM_VK_SEPARATOR",
- "DOM_VK_SHIFT",
- "DOM_VK_SLASH",
- "DOM_VK_SLEEP",
- "DOM_VK_SPACE",
- "DOM_VK_SUBTRACT",
- "DOM_VK_T",
- "DOM_VK_TAB",
- "DOM_VK_TILDE",
- "DOM_VK_U",
- "DOM_VK_UNDERSCORE",
- "DOM_VK_UNDO",
- "DOM_VK_UNICODE",
- "DOM_VK_UP",
- "DOM_VK_V",
- "DOM_VK_VOLUME_DOWN",
- "DOM_VK_VOLUME_MUTE",
- "DOM_VK_VOLUME_UP",
- "DOM_VK_W",
- "DOM_VK_WIN",
- "DOM_VK_WINDOW",
- "DOM_VK_WIN_ICO_00",
- "DOM_VK_WIN_ICO_CLEAR",
- "DOM_VK_WIN_ICO_HELP",
- "DOM_VK_WIN_OEM_ATTN",
- "DOM_VK_WIN_OEM_AUTO",
- "DOM_VK_WIN_OEM_BACKTAB",
- "DOM_VK_WIN_OEM_CLEAR",
- "DOM_VK_WIN_OEM_COPY",
- "DOM_VK_WIN_OEM_CUSEL",
- "DOM_VK_WIN_OEM_ENLW",
- "DOM_VK_WIN_OEM_FINISH",
- "DOM_VK_WIN_OEM_FJ_JISHO",
- "DOM_VK_WIN_OEM_FJ_LOYA",
- "DOM_VK_WIN_OEM_FJ_MASSHOU",
- "DOM_VK_WIN_OEM_FJ_ROYA",
- "DOM_VK_WIN_OEM_FJ_TOUROKU",
- "DOM_VK_WIN_OEM_JUMP",
- "DOM_VK_WIN_OEM_PA1",
- "DOM_VK_WIN_OEM_PA2",
- "DOM_VK_WIN_OEM_PA3",
- "DOM_VK_WIN_OEM_RESET",
- "DOM_VK_WIN_OEM_WSCTRL",
- "DOM_VK_X",
- "DOM_VK_XF86XK_ADD_FAVORITE",
- "DOM_VK_XF86XK_APPLICATION_LEFT",
- "DOM_VK_XF86XK_APPLICATION_RIGHT",
- "DOM_VK_XF86XK_AUDIO_CYCLE_TRACK",
- "DOM_VK_XF86XK_AUDIO_FORWARD",
- "DOM_VK_XF86XK_AUDIO_LOWER_VOLUME",
- "DOM_VK_XF86XK_AUDIO_MEDIA",
- "DOM_VK_XF86XK_AUDIO_MUTE",
- "DOM_VK_XF86XK_AUDIO_NEXT",
- "DOM_VK_XF86XK_AUDIO_PAUSE",
- "DOM_VK_XF86XK_AUDIO_PLAY",
- "DOM_VK_XF86XK_AUDIO_PREV",
- "DOM_VK_XF86XK_AUDIO_RAISE_VOLUME",
- "DOM_VK_XF86XK_AUDIO_RANDOM_PLAY",
- "DOM_VK_XF86XK_AUDIO_RECORD",
- "DOM_VK_XF86XK_AUDIO_REPEAT",
- "DOM_VK_XF86XK_AUDIO_REWIND",
- "DOM_VK_XF86XK_AUDIO_STOP",
- "DOM_VK_XF86XK_AWAY",
- "DOM_VK_XF86XK_BACK",
- "DOM_VK_XF86XK_BACK_FORWARD",
- "DOM_VK_XF86XK_BATTERY",
- "DOM_VK_XF86XK_BLUE",
- "DOM_VK_XF86XK_BLUETOOTH",
- "DOM_VK_XF86XK_BOOK",
- "DOM_VK_XF86XK_BRIGHTNESS_ADJUST",
- "DOM_VK_XF86XK_CALCULATOR",
- "DOM_VK_XF86XK_CALENDAR",
- "DOM_VK_XF86XK_CD",
- "DOM_VK_XF86XK_CLOSE",
- "DOM_VK_XF86XK_COMMUNITY",
- "DOM_VK_XF86XK_CONTRAST_ADJUST",
- "DOM_VK_XF86XK_COPY",
- "DOM_VK_XF86XK_CUT",
- "DOM_VK_XF86XK_CYCLE_ANGLE",
- "DOM_VK_XF86XK_DISPLAY",
- "DOM_VK_XF86XK_DOCUMENTS",
- "DOM_VK_XF86XK_DOS",
- "DOM_VK_XF86XK_EJECT",
- "DOM_VK_XF86XK_EXCEL",
- "DOM_VK_XF86XK_EXPLORER",
- "DOM_VK_XF86XK_FAVORITES",
- "DOM_VK_XF86XK_FINANCE",
- "DOM_VK_XF86XK_FORWARD",
- "DOM_VK_XF86XK_FRAME_BACK",
- "DOM_VK_XF86XK_FRAME_FORWARD",
- "DOM_VK_XF86XK_GAME",
- "DOM_VK_XF86XK_GO",
- "DOM_VK_XF86XK_GREEN",
- "DOM_VK_XF86XK_HIBERNATE",
- "DOM_VK_XF86XK_HISTORY",
- "DOM_VK_XF86XK_HOME_PAGE",
- "DOM_VK_XF86XK_HOT_LINKS",
- "DOM_VK_XF86XK_I_TOUCH",
- "DOM_VK_XF86XK_KBD_BRIGHTNESS_DOWN",
- "DOM_VK_XF86XK_KBD_BRIGHTNESS_UP",
- "DOM_VK_XF86XK_KBD_LIGHT_ON_OFF",
- "DOM_VK_XF86XK_LAUNCH0",
- "DOM_VK_XF86XK_LAUNCH1",
- "DOM_VK_XF86XK_LAUNCH2",
- "DOM_VK_XF86XK_LAUNCH3",
- "DOM_VK_XF86XK_LAUNCH4",
- "DOM_VK_XF86XK_LAUNCH5",
- "DOM_VK_XF86XK_LAUNCH6",
- "DOM_VK_XF86XK_LAUNCH7",
- "DOM_VK_XF86XK_LAUNCH8",
- "DOM_VK_XF86XK_LAUNCH9",
- "DOM_VK_XF86XK_LAUNCH_A",
- "DOM_VK_XF86XK_LAUNCH_B",
- "DOM_VK_XF86XK_LAUNCH_C",
- "DOM_VK_XF86XK_LAUNCH_D",
- "DOM_VK_XF86XK_LAUNCH_E",
- "DOM_VK_XF86XK_LAUNCH_F",
- "DOM_VK_XF86XK_LIGHT_BULB",
- "DOM_VK_XF86XK_LOG_OFF",
- "DOM_VK_XF86XK_MAIL",
- "DOM_VK_XF86XK_MAIL_FORWARD",
- "DOM_VK_XF86XK_MARKET",
- "DOM_VK_XF86XK_MEETING",
- "DOM_VK_XF86XK_MEMO",
- "DOM_VK_XF86XK_MENU_KB",
- "DOM_VK_XF86XK_MENU_PB",
- "DOM_VK_XF86XK_MESSENGER",
- "DOM_VK_XF86XK_MON_BRIGHTNESS_DOWN",
- "DOM_VK_XF86XK_MON_BRIGHTNESS_UP",
- "DOM_VK_XF86XK_MUSIC",
- "DOM_VK_XF86XK_MY_COMPUTER",
- "DOM_VK_XF86XK_MY_SITES",
- "DOM_VK_XF86XK_NEW",
- "DOM_VK_XF86XK_NEWS",
- "DOM_VK_XF86XK_OFFICE_HOME",
- "DOM_VK_XF86XK_OPEN",
- "DOM_VK_XF86XK_OPEN_URL",
- "DOM_VK_XF86XK_OPTION",
- "DOM_VK_XF86XK_PASTE",
- "DOM_VK_XF86XK_PHONE",
- "DOM_VK_XF86XK_PICTURES",
- "DOM_VK_XF86XK_POWER_DOWN",
- "DOM_VK_XF86XK_POWER_OFF",
- "DOM_VK_XF86XK_RED",
- "DOM_VK_XF86XK_REFRESH",
- "DOM_VK_XF86XK_RELOAD",
- "DOM_VK_XF86XK_REPLY",
- "DOM_VK_XF86XK_ROCKER_DOWN",
- "DOM_VK_XF86XK_ROCKER_ENTER",
- "DOM_VK_XF86XK_ROCKER_UP",
- "DOM_VK_XF86XK_ROTATE_WINDOWS",
- "DOM_VK_XF86XK_ROTATION_KB",
- "DOM_VK_XF86XK_ROTATION_PB",
- "DOM_VK_XF86XK_SAVE",
- "DOM_VK_XF86XK_SCREEN_SAVER",
- "DOM_VK_XF86XK_SCROLL_CLICK",
- "DOM_VK_XF86XK_SCROLL_DOWN",
- "DOM_VK_XF86XK_SCROLL_UP",
- "DOM_VK_XF86XK_SEARCH",
- "DOM_VK_XF86XK_SEND",
- "DOM_VK_XF86XK_SHOP",
- "DOM_VK_XF86XK_SPELL",
- "DOM_VK_XF86XK_SPLIT_SCREEN",
- "DOM_VK_XF86XK_STANDBY",
- "DOM_VK_XF86XK_START",
- "DOM_VK_XF86XK_STOP",
- "DOM_VK_XF86XK_SUBTITLE",
- "DOM_VK_XF86XK_SUPPORT",
- "DOM_VK_XF86XK_SUSPEND",
- "DOM_VK_XF86XK_TASK_PANE",
- "DOM_VK_XF86XK_TERMINAL",
- "DOM_VK_XF86XK_TIME",
- "DOM_VK_XF86XK_TOOLS",
- "DOM_VK_XF86XK_TOP_MENU",
- "DOM_VK_XF86XK_TO_DO_LIST",
- "DOM_VK_XF86XK_TRAVEL",
- "DOM_VK_XF86XK_USER1KB",
- "DOM_VK_XF86XK_USER2KB",
- "DOM_VK_XF86XK_USER_PB",
- "DOM_VK_XF86XK_UWB",
- "DOM_VK_XF86XK_VENDOR_HOME",
- "DOM_VK_XF86XK_VIDEO",
- "DOM_VK_XF86XK_VIEW",
- "DOM_VK_XF86XK_WAKE_UP",
- "DOM_VK_XF86XK_WEB_CAM",
- "DOM_VK_XF86XK_WHEEL_BUTTON",
- "DOM_VK_XF86XK_WLAN",
- "DOM_VK_XF86XK_WORD",
- "DOM_VK_XF86XK_WWW",
- "DOM_VK_XF86XK_XFER",
- "DOM_VK_XF86XK_YELLOW",
- "DOM_VK_XF86XK_ZOOM_IN",
- "DOM_VK_XF86XK_ZOOM_OUT",
- "DOM_VK_Y",
- "DOM_VK_Z",
- "DOM_VK_ZOOM",
- "DONE",
- "DONT_CARE",
- "DOWNLOADING",
- "DRAGDROP",
- "DST_ALPHA",
- "DST_COLOR",
- "DYNAMIC_DRAW",
- "DataChannel",
- "DataTransfer",
- "DataTransferItem",
- "DataTransferItemList",
- "DataView",
- "Date",
- "DateTimeFormat",
- "Debug",
- "DelayNode",
- "DesktopNotification",
- "DesktopNotificationCenter",
- "DeviceAcceleration",
- "DeviceLightEvent",
- "DeviceMotionEvent",
- "DeviceOrientationEvent",
- "DeviceProximityEvent",
- "DeviceRotationRate",
- "DeviceStorage",
- "DeviceStorageChangeEvent",
- "Directory",
- "Document",
- "DocumentFragment",
- "DocumentType",
- "DragEvent",
- "DynamicsCompressorNode",
- "E",
- "ELEMENT_ARRAY_BUFFER",
- "ELEMENT_ARRAY_BUFFER_BINDING",
- "ELEMENT_NODE",
- "EMPTY",
- "ENCODING_ERR",
- "ENDED",
- "END_TO_END",
- "END_TO_START",
- "ENTITY_NODE",
- "ENTITY_REFERENCE_NODE",
- "EPSILON",
- "EQUAL",
- "EQUALPOWER",
- "ERROR",
- "EXPONENTIAL_DISTANCE",
- "EXT_texture_filter_anisotropic",
- "Element",
- "ElementQuery",
- "EnterPictureInPictureEvent",
- "Entity",
- "EntityReference",
- "Enumerator",
- "Error",
- "ErrorEvent",
- "EvalError",
- "Event",
- "EventException",
- "EventSource",
- "EventTarget",
- "External",
- "FASTEST",
- "FIDOSDK",
- "FILTER_ACCEPT",
- "FILTER_INTERRUPT",
- "FILTER_REJECT",
- "FILTER_SKIP",
- "FINISHED_STATE",
- "FIRST_ORDERED_NODE_TYPE",
- "FLOAT",
- "FLOAT_MAT2",
- "FLOAT_MAT3",
- "FLOAT_MAT4",
- "FLOAT_VEC2",
- "FLOAT_VEC3",
- "FLOAT_VEC4",
- "FOCUS",
- "FONT_FACE_RULE",
- "FONT_FEATURE_VALUES_RULE",
- "FRAGMENT_SHADER",
- "FRAGMENT_SHADER_DERIVATIVE_HINT_OES",
- "FRAMEBUFFER",
- "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",
- "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",
- "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",
- "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL",
- "FRAMEBUFFER_BINDING",
- "FRAMEBUFFER_COMPLETE",
- "FRAMEBUFFER_INCOMPLETE_ATTACHMENT",
- "FRAMEBUFFER_INCOMPLETE_DIMENSIONS",
- "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",
- "FRAMEBUFFER_UNSUPPORTED",
- "FRONT",
- "FRONT_AND_BACK",
- "FRONT_FACE",
- "FUNC_ADD",
- "FUNC_REVERSE_SUBTRACT",
- "FUNC_SUBTRACT",
- "FederatedCredential",
- "Feed",
- "FeedEntry",
- "File",
- "FileError",
- "FileList",
- "FileReader",
- "FileSystem",
- "FileSystemDirectoryEntry",
- "FileSystemDirectoryReader",
- "FileSystemEntry",
- "FileSystemFileEntry",
- "FindInPage",
- "Float32Array",
- "Float64Array",
- "FocusEvent",
- "FontFace",
- "FontFaceSet",
- "FontFaceSetLoadEvent",
- "FormData",
- "Function",
- "GENERATE_MIPMAP_HINT",
- "GEQUAL",
- "GREATER",
- "GREEN_BITS",
- "GainNode",
- "Gamepad",
- "GamepadButton",
- "GamepadEvent",
- "GamepadHapticActuator",
- "GamepadPose",
- "Geolocation",
- "GestureEvent",
- "Global",
- "Gyroscope",
- "HAVE_CURRENT_DATA",
- "HAVE_ENOUGH_DATA",
- "HAVE_FUTURE_DATA",
- "HAVE_METADATA",
- "HAVE_NOTHING",
- "HEADERS_RECEIVED",
- "HIDDEN",
- "HIERARCHY_REQUEST_ERR",
- "HIGHPASS",
- "HIGHSHELF",
- "HIGH_FLOAT",
- "HIGH_INT",
- "HORIZONTAL",
- "HORIZONTAL_AXIS",
- "HRTF",
- "HTMLAllCollection",
- "HTMLAnchorElement",
- "HTMLAppletElement",
- "HTMLAreaElement",
- "HTMLAreasCollection",
- "HTMLAudioElement",
- "HTMLBGSoundElement",
- "HTMLBRElement",
- "HTMLBaseElement",
- "HTMLBaseFontElement",
- "HTMLBlockElement",
- "HTMLBlockquoteElement",
- "HTMLBodyElement",
- "HTMLButtonElement",
- "HTMLCanvasElement",
- "HTMLCollection",
- "HTMLCommandElement",
- "HTMLContentElement",
- "HTMLDDElement",
- "HTMLDListElement",
- "HTMLDTElement",
- "HTMLDataElement",
- "HTMLDataListElement",
- "HTMLDetailsElement",
- "HTMLDialogElement",
- "HTMLDirectoryElement",
- "HTMLDivElement",
- "HTMLDocument",
- "HTMLElement",
- "HTMLEmbedElement",
- "HTMLFieldSetElement",
- "HTMLFontElement",
- "HTMLFormControlsCollection",
- "HTMLFormElement",
- "HTMLFrameElement",
- "HTMLFrameSetElement",
- "HTMLHRElement",
- "HTMLHeadElement",
- "HTMLHeadingElement",
- "HTMLHtmlElement",
- "HTMLIFrameElement",
- "HTMLImageElement",
- "HTMLInputElement",
- "HTMLIsIndexElement",
- "HTMLKeygenElement",
- "HTMLLIElement",
- "HTMLLabelElement",
- "HTMLLegendElement",
- "HTMLLinkElement",
- "HTMLMapElement",
- "HTMLMarqueeElement",
- "HTMLMediaElement",
- "HTMLMenuElement",
- "HTMLMenuItemElement",
- "HTMLMetaElement",
- "HTMLMeterElement",
- "HTMLModElement",
- "HTMLNextIdElement",
- "HTMLOListElement",
- "HTMLObjectElement",
- "HTMLOptGroupElement",
- "HTMLOptionElement",
- "HTMLOptionsCollection",
- "HTMLOutputElement",
- "HTMLParagraphElement",
- "HTMLParamElement",
- "HTMLPhraseElement",
- "HTMLPictureElement",
- "HTMLPreElement",
- "HTMLProgressElement",
- "HTMLPropertiesCollection",
- "HTMLQuoteElement",
- "HTMLScriptElement",
- "HTMLSelectElement",
- "HTMLShadowElement",
- "HTMLSlotElement",
- "HTMLSourceElement",
- "HTMLSpanElement",
- "HTMLStyleElement",
- "HTMLTableCaptionElement",
- "HTMLTableCellElement",
- "HTMLTableColElement",
- "HTMLTableDataCellElement",
- "HTMLTableElement",
- "HTMLTableHeaderCellElement",
- "HTMLTableRowElement",
- "HTMLTableSectionElement",
- "HTMLTemplateElement",
- "HTMLTextAreaElement",
- "HTMLTimeElement",
- "HTMLTitleElement",
- "HTMLTrackElement",
- "HTMLUListElement",
- "HTMLUnknownElement",
- "HTMLVideoElement",
- "HashChangeEvent",
- "Headers",
- "History",
- "ICE_CHECKING",
- "ICE_CLOSED",
- "ICE_COMPLETED",
- "ICE_CONNECTED",
- "ICE_FAILED",
- "ICE_GATHERING",
- "ICE_WAITING",
- "IDBCursor",
- "IDBCursorWithValue",
- "IDBDatabase",
- "IDBDatabaseException",
- "IDBFactory",
- "IDBFileHandle",
- "IDBFileRequest",
- "IDBIndex",
- "IDBKeyRange",
- "IDBMutableFile",
- "IDBObjectStore",
- "IDBOpenDBRequest",
- "IDBRequest",
- "IDBTransaction",
- "IDBVersionChangeEvent",
- "IDLE",
- "IIRFilterNode",
- "IMPLEMENTATION_COLOR_READ_FORMAT",
- "IMPLEMENTATION_COLOR_READ_TYPE",
- "IMPORT_RULE",
- "INCR",
- "INCR_WRAP",
- "INDEX_SIZE_ERR",
- "INSTALLED",
- "INT",
- "INT_VEC2",
- "INT_VEC3",
- "INT_VEC4",
- "INUSE_ATTRIBUTE_ERR",
- "INVALID_ACCESS_ERR",
- "INVALID_CHARACTER_ERR",
- "INVALID_ENUM",
- "INVALID_EXPRESSION_ERR",
- "INVALID_FRAMEBUFFER_OPERATION",
- "INVALID_MODIFICATION_ERR",
- "INVALID_NODE_TYPE_ERR",
- "INVALID_OPERATION",
- "INVALID_STATE_ERR",
- "INVALID_VALUE",
- "INVERSE_DISTANCE",
- "INVERT",
- "IceCandidate",
- "IdleDeadline",
- "Image",
- "ImageBitmap",
- "ImageBitmapRenderingContext",
- "ImageCapture",
- "ImageData",
- "Infinity",
- "InputDeviceCapabilities",
- "InputDeviceInfo",
- "InputEvent",
- "InputMethodContext",
- "InstallState",
- "InstallTrigger",
- "Instance",
- "Int16Array",
- "Int32Array",
- "Int8Array",
- "Intent",
- "InternalError",
- "IntersectionObserver",
- "IntersectionObserverEntry",
- "Intl",
- "IsSearchProviderInstalled",
- "Iterator",
- "JSON",
- "KEEP",
- "KEYDOWN",
- "KEYFRAMES_RULE",
- "KEYFRAME_RULE",
- "KEYPRESS",
- "KEYUP",
- "Key",
- "KeyEvent",
- "KeyOperation",
- "KeyPair",
- "Keyboard",
- "KeyboardEvent",
- "KeyboardLayoutMap",
- "KeyframeEffect",
- "LENGTHADJUST_SPACING",
- "LENGTHADJUST_SPACINGANDGLYPHS",
- "LENGTHADJUST_UNKNOWN",
- "LEQUAL",
- "LESS",
- "LINEAR",
- "LINEAR_DISTANCE",
- "LINEAR_MIPMAP_LINEAR",
- "LINEAR_MIPMAP_NEAREST",
- "LINES",
- "LINE_LOOP",
- "LINE_STRIP",
- "LINE_WIDTH",
- "LINK_STATUS",
- "LIVE",
- "LN10",
- "LN2",
- "LOADED",
- "LOADING",
- "LOCALE",
- "LOG10E",
- "LOG2E",
- "LOWPASS",
- "LOWSHELF",
- "LOW_FLOAT",
- "LOW_INT",
- "LSException",
- "LSParserFilter",
- "LUMINANCE",
- "LUMINANCE_ALPHA",
- "LinearAccelerationSensor",
- "LinkError",
- "ListFormat",
- "LocalMediaStream",
- "Location",
- "Lock",
- "LockManager",
- "MAX_COMBINED_TEXTURE_IMAGE_UNITS",
- "MAX_CUBE_MAP_TEXTURE_SIZE",
- "MAX_FRAGMENT_UNIFORM_VECTORS",
- "MAX_RENDERBUFFER_SIZE",
- "MAX_SAFE_INTEGER",
- "MAX_TEXTURE_IMAGE_UNITS",
- "MAX_TEXTURE_MAX_ANISOTROPY_EXT",
- "MAX_TEXTURE_SIZE",
- "MAX_VALUE",
- "MAX_VARYING_VECTORS",
- "MAX_VERTEX_ATTRIBS",
- "MAX_VERTEX_TEXTURE_IMAGE_UNITS",
- "MAX_VERTEX_UNIFORM_VECTORS",
- "MAX_VIEWPORT_DIMS",
- "MEDIA_ERR_ABORTED",
- "MEDIA_ERR_DECODE",
- "MEDIA_ERR_ENCRYPTED",
- "MEDIA_ERR_NETWORK",
- "MEDIA_ERR_SRC_NOT_SUPPORTED",
- "MEDIA_KEYERR_CLIENT",
- "MEDIA_KEYERR_DOMAIN",
- "MEDIA_KEYERR_HARDWARECHANGE",
- "MEDIA_KEYERR_OUTPUT",
- "MEDIA_KEYERR_SERVICE",
- "MEDIA_KEYERR_UNKNOWN",
- "MEDIA_RULE",
- "MEDIUM_FLOAT",
- "MEDIUM_INT",
- "META_MASK",
- "MIDIAccess",
- "MIDIConnectionEvent",
- "MIDIInput",
- "MIDIInputMap",
- "MIDIMessageEvent",
- "MIDIOutput",
- "MIDIOutputMap",
- "MIDIPort",
- "MIN_SAFE_INTEGER",
- "MIN_VALUE",
- "MIRRORED_REPEAT",
- "MODE_ASYNCHRONOUS",
- "MODE_SYNCHRONOUS",
- "MODIFICATION",
- "MOUSEDOWN",
- "MOUSEDRAG",
- "MOUSEMOVE",
- "MOUSEOUT",
- "MOUSEOVER",
- "MOUSEUP",
- "MOZ_KEYFRAMES_RULE",
- "MOZ_KEYFRAME_RULE",
- "MOZ_SOURCE_CURSOR",
- "MOZ_SOURCE_ERASER",
- "MOZ_SOURCE_KEYBOARD",
- "MOZ_SOURCE_MOUSE",
- "MOZ_SOURCE_PEN",
- "MOZ_SOURCE_TOUCH",
- "MOZ_SOURCE_UNKNOWN",
- "MSBehaviorUrnsCollection",
- "MSBlobBuilder",
- "MSCSSMatrix",
- "MSCSSProperties",
- "MSCSSRuleList",
- "MSCompatibleInfo",
- "MSCompatibleInfoCollection",
- "MSCurrentStyleCSSProperties",
- "MSEventObj",
- "MSGESTURE_FLAG_BEGIN",
- "MSGESTURE_FLAG_CANCEL",
- "MSGESTURE_FLAG_END",
- "MSGESTURE_FLAG_INERTIA",
- "MSGESTURE_FLAG_NONE",
- "MSGesture",
- "MSGestureEvent",
- "MSGraphicsTrust",
- "MSInputMethodContext",
- "MSManipulationEvent",
- "MSMediaKeyError",
- "MSMediaKeyMessageEvent",
- "MSMediaKeyNeededEvent",
- "MSMediaKeySession",
- "MSMediaKeys",
- "MSMimeTypesCollection",
- "MSPOINTER_TYPE_MOUSE",
- "MSPOINTER_TYPE_PEN",
- "MSPOINTER_TYPE_TOUCH",
- "MSPluginsCollection",
- "MSPointerEvent",
- "MSRangeCollection",
- "MSSiteModeEvent",
- "MSStream",
- "MSStreamReader",
- "MSStyleCSSProperties",
- "MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE",
- "MS_ASYNC_CALLBACK_STATUS_CANCEL",
- "MS_ASYNC_CALLBACK_STATUS_CHOOSEANY",
- "MS_ASYNC_CALLBACK_STATUS_ERROR",
- "MS_ASYNC_CALLBACK_STATUS_JOIN",
- "MS_ASYNC_OP_STATUS_CANCELED",
- "MS_ASYNC_OP_STATUS_ERROR",
- "MS_ASYNC_OP_STATUS_SUCCESS",
- "MS_MANIPULATION_STATE_ACTIVE",
- "MS_MANIPULATION_STATE_CANCELLED",
- "MS_MANIPULATION_STATE_COMMITTED",
- "MS_MANIPULATION_STATE_DRAGGING",
- "MS_MANIPULATION_STATE_INERTIA",
- "MS_MANIPULATION_STATE_PRESELECT",
- "MS_MANIPULATION_STATE_SELECTING",
- "MS_MANIPULATION_STATE_STOPPED",
- "MS_MEDIA_ERR_ENCRYPTED",
- "MS_MEDIA_KEYERR_CLIENT",
- "MS_MEDIA_KEYERR_DOMAIN",
- "MS_MEDIA_KEYERR_HARDWARECHANGE",
- "MS_MEDIA_KEYERR_OUTPUT",
- "MS_MEDIA_KEYERR_SERVICE",
- "MS_MEDIA_KEYERR_UNKNOWN",
- "Map",
- "Math",
- "MediaCapabilities",
- "MediaCapabilitiesInfo",
- "MediaController",
- "MediaDeviceInfo",
- "MediaDevices",
- "MediaElementAudioSourceNode",
- "MediaEncryptedEvent",
- "MediaError",
- "MediaKeyError",
- "MediaKeyEvent",
- "MediaKeyMessageEvent",
- "MediaKeyNeededEvent",
- "MediaKeySession",
- "MediaKeyStatusMap",
- "MediaKeySystemAccess",
- "MediaKeys",
- "MediaList",
- "MediaMetadata",
- "MediaQueryList",
- "MediaQueryListEvent",
- "MediaRecorder",
- "MediaRecorderErrorEvent",
- "MediaSession",
- "MediaSettingsRange",
- "MediaSource",
- "MediaStream",
- "MediaStreamAudioDestinationNode",
- "MediaStreamAudioSourceNode",
- "MediaStreamEvent",
- "MediaStreamTrack",
- "MediaStreamTrackEvent",
- "Memory",
- "MessageChannel",
- "MessageEvent",
- "MessagePort",
- "Methods",
- "MimeType",
- "MimeTypeArray",
- "Module",
- "MouseEvent",
- "MouseScrollEvent",
- "MouseWheelEvent",
- "MozAnimation",
- "MozAnimationDelay",
- "MozAnimationDirection",
- "MozAnimationDuration",
- "MozAnimationFillMode",
- "MozAnimationIterationCount",
- "MozAnimationName",
- "MozAnimationPlayState",
- "MozAnimationTimingFunction",
- "MozAppearance",
- "MozBackfaceVisibility",
- "MozBinding",
- "MozBorderBottomColors",
- "MozBorderEnd",
- "MozBorderEndColor",
- "MozBorderEndStyle",
- "MozBorderEndWidth",
- "MozBorderImage",
- "MozBorderLeftColors",
- "MozBorderRightColors",
- "MozBorderStart",
- "MozBorderStartColor",
- "MozBorderStartStyle",
- "MozBorderStartWidth",
- "MozBorderTopColors",
- "MozBoxAlign",
- "MozBoxDirection",
- "MozBoxFlex",
- "MozBoxOrdinalGroup",
- "MozBoxOrient",
- "MozBoxPack",
- "MozBoxSizing",
- "MozCSSKeyframeRule",
- "MozCSSKeyframesRule",
- "MozColumnCount",
- "MozColumnFill",
- "MozColumnGap",
- "MozColumnRule",
- "MozColumnRuleColor",
- "MozColumnRuleStyle",
- "MozColumnRuleWidth",
- "MozColumnWidth",
- "MozColumns",
- "MozContactChangeEvent",
- "MozFloatEdge",
- "MozFontFeatureSettings",
- "MozFontLanguageOverride",
- "MozForceBrokenImageIcon",
- "MozHyphens",
- "MozImageRegion",
- "MozMarginEnd",
- "MozMarginStart",
- "MozMmsEvent",
- "MozMmsMessage",
- "MozMobileMessageThread",
- "MozOSXFontSmoothing",
- "MozOrient",
- "MozOutlineRadius",
- "MozOutlineRadiusBottomleft",
- "MozOutlineRadiusBottomright",
- "MozOutlineRadiusTopleft",
- "MozOutlineRadiusTopright",
- "MozPaddingEnd",
- "MozPaddingStart",
- "MozPerspective",
- "MozPerspectiveOrigin",
- "MozPowerManager",
- "MozSettingsEvent",
- "MozSmsEvent",
- "MozSmsMessage",
- "MozStackSizing",
- "MozTabSize",
- "MozTextAlignLast",
- "MozTextDecorationColor",
- "MozTextDecorationLine",
- "MozTextDecorationStyle",
- "MozTextSizeAdjust",
- "MozTransform",
- "MozTransformOrigin",
- "MozTransformStyle",
- "MozTransition",
- "MozTransitionDelay",
- "MozTransitionDuration",
- "MozTransitionProperty",
- "MozTransitionTimingFunction",
- "MozUserFocus",
- "MozUserInput",
- "MozUserModify",
- "MozUserSelect",
- "MozWindowDragging",
- "MozWindowShadow",
- "MutationEvent",
- "MutationObserver",
- "MutationRecord",
- "NAMESPACE_ERR",
- "NAMESPACE_RULE",
- "NEAREST",
- "NEAREST_MIPMAP_LINEAR",
- "NEAREST_MIPMAP_NEAREST",
- "NEGATIVE_INFINITY",
- "NETWORK_EMPTY",
- "NETWORK_ERR",
- "NETWORK_IDLE",
- "NETWORK_LOADED",
- "NETWORK_LOADING",
- "NETWORK_NO_SOURCE",
- "NEVER",
- "NEW",
- "NEXT",
- "NEXT_NO_DUPLICATE",
- "NICEST",
- "NODE_AFTER",
- "NODE_BEFORE",
- "NODE_BEFORE_AND_AFTER",
- "NODE_INSIDE",
- "NONE",
- "NON_TRANSIENT_ERR",
- "NOTATION_NODE",
- "NOTCH",
- "NOTEQUAL",
- "NOT_ALLOWED_ERR",
- "NOT_FOUND_ERR",
- "NOT_INSTALLED",
- "NOT_READABLE_ERR",
- "NOT_SUPPORTED_ERR",
- "NO_DATA_ALLOWED_ERR",
- "NO_ERR",
- "NO_ERROR",
- "NO_MODIFICATION_ALLOWED_ERR",
- "NUMBER_TYPE",
- "NUM_COMPRESSED_TEXTURE_FORMATS",
- "NaN",
- "NamedNodeMap",
- "Native Client",
- "NavigationPreloadManager",
- "Navigator",
- "NearbyLinks",
- "NetworkInformation",
- "Node",
- "NodeFilter",
- "NodeIterator",
- "NodeList",
- "Notation",
- "Notification",
- "NotifyPaintEvent",
- "Number",
- "NumberFormat",
- "OBSOLETE",
- "OES_element_index_uint",
- "OES_standard_derivatives",
- "OES_texture_float",
- "OES_texture_float_linear",
- "ONE",
- "ONE_MINUS_CONSTANT_ALPHA",
- "ONE_MINUS_CONSTANT_COLOR",
- "ONE_MINUS_DST_ALPHA",
- "ONE_MINUS_DST_COLOR",
- "ONE_MINUS_SRC_ALPHA",
- "ONE_MINUS_SRC_COLOR",
- "OPEN",
- "OPENED",
- "OPENING",
- "ORDERED_NODE_ITERATOR_TYPE",
- "ORDERED_NODE_SNAPSHOT_TYPE",
- "OUT_OF_MEMORY",
- "Object",
- "OfflineAudioCompletionEvent",
- "OfflineAudioContext",
- "OfflineResourceList",
- "OffscreenCanvas",
- "OffscreenCanvasRenderingContext2D",
- "Option",
- "OrientationSensor",
- "OscillatorNode",
- "OverconstrainedError",
- "OverflowEvent",
- "PACKAGE",
- "PACK_ALIGNMENT",
- "PAGE_RULE",
- "PARSE_ERR",
- "PATHSEG_ARC_ABS",
- "PATHSEG_ARC_REL",
- "PATHSEG_CLOSEPATH",
- "PATHSEG_CURVETO_CUBIC_ABS",
- "PATHSEG_CURVETO_CUBIC_REL",
- "PATHSEG_CURVETO_CUBIC_SMOOTH_ABS",
- "PATHSEG_CURVETO_CUBIC_SMOOTH_REL",
- "PATHSEG_CURVETO_QUADRATIC_ABS",
- "PATHSEG_CURVETO_QUADRATIC_REL",
- "PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS",
- "PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL",
- "PATHSEG_LINETO_ABS",
- "PATHSEG_LINETO_HORIZONTAL_ABS",
- "PATHSEG_LINETO_HORIZONTAL_REL",
- "PATHSEG_LINETO_REL",
- "PATHSEG_LINETO_VERTICAL_ABS",
- "PATHSEG_LINETO_VERTICAL_REL",
- "PATHSEG_MOVETO_ABS",
- "PATHSEG_MOVETO_REL",
- "PATHSEG_UNKNOWN",
- "PATH_EXISTS_ERR",
- "PEAKING",
- "PERMISSION_DENIED",
- "PERSISTENT",
- "PI",
- "PLAYING_STATE",
- "POINTS",
- "POLYGON_OFFSET_FACTOR",
- "POLYGON_OFFSET_FILL",
- "POLYGON_OFFSET_UNITS",
- "POSITION_UNAVAILABLE",
- "POSITIVE_INFINITY",
- "PREV",
- "PREV_NO_DUPLICATE",
- "PROCESSING_INSTRUCTION_NODE",
- "PageChangeEvent",
- "PageTransitionEvent",
- "PaintRequest",
- "PaintRequestList",
- "PannerNode",
- "PasswordCredential",
- "Path2D",
- "PaymentAddress",
- "PaymentInstruments",
- "PaymentManager",
- "PaymentRequest",
- "PaymentRequestUpdateEvent",
- "PaymentResponse",
- "Performance",
- "PerformanceEntry",
- "PerformanceLongTaskTiming",
- "PerformanceMark",
- "PerformanceMeasure",
- "PerformanceNavigation",
- "PerformanceNavigationTiming",
- "PerformanceObserver",
- "PerformanceObserverEntryList",
- "PerformancePaintTiming",
- "PerformanceResourceTiming",
- "PerformanceServerTiming",
- "PerformanceTiming",
- "PeriodicWave",
- "PermissionStatus",
- "Permissions",
- "PhotoCapabilities",
- "PictureInPictureWindow",
- "Plugin",
- "PluginArray",
- "PluralRules",
- "PointerEvent",
- "PopStateEvent",
- "PopupBlockedEvent",
- "Position",
- "PositionError",
- "Presentation",
- "PresentationAvailability",
- "PresentationConnection",
- "PresentationConnectionAvailableEvent",
- "PresentationConnectionCloseEvent",
- "PresentationConnectionList",
- "PresentationReceiver",
- "PresentationRequest",
- "ProcessingInstruction",
- "ProgressEvent",
- "Promise",
- "PromiseRejectionEvent",
- "PropertyNodeList",
- "Proxy",
- "PublicKeyCredential",
- "PushManager",
- "PushSubscription",
- "PushSubscriptionOptions",
- "Q",
- "QUOTA_ERR",
- "QUOTA_EXCEEDED_ERR",
- "QueryInterface",
- "READY_TO_RUN",
- "READ_ONLY",
- "READ_ONLY_ERR",
- "READ_WRITE",
- "RED_BITS",
- "REMOVAL",
- "RENDERBUFFER",
- "RENDERBUFFER_ALPHA_SIZE",
- "RENDERBUFFER_BINDING",
- "RENDERBUFFER_BLUE_SIZE",
- "RENDERBUFFER_DEPTH_SIZE",
- "RENDERBUFFER_GREEN_SIZE",
- "RENDERBUFFER_HEIGHT",
- "RENDERBUFFER_INTERNAL_FORMAT",
- "RENDERBUFFER_RED_SIZE",
- "RENDERBUFFER_STENCIL_SIZE",
- "RENDERBUFFER_WIDTH",
- "RENDERER",
- "RENDERING_INTENT_ABSOLUTE_COLORIMETRIC",
- "RENDERING_INTENT_AUTO",
- "RENDERING_INTENT_PERCEPTUAL",
- "RENDERING_INTENT_RELATIVE_COLORIMETRIC",
- "RENDERING_INTENT_SATURATION",
- "RENDERING_INTENT_UNKNOWN",
- "REPEAT",
- "REPLACE",
- "RGB",
- "RGB565",
- "RGB5_A1",
- "RGBA",
- "RGBA4",
- "RGBColor",
- "ROTATION_CLOCKWISE",
- "ROTATION_COUNTERCLOCKWISE",
- "RTCCertificate",
- "RTCDTMFSender",
- "RTCDTMFToneChangeEvent",
- "RTCDataChannel",
- "RTCDataChannelEvent",
- "RTCIceCandidate",
- "RTCPeerConnection",
- "RTCPeerConnectionIceEvent",
- "RTCRtpReceiver",
- "RTCRtpSender",
- "RTCRtpTransceiver",
- "RTCSessionDescription",
- "RTCStatsReport",
- "RTCTrackEvent",
- "RUNNING",
- "RadioNodeList",
- "Range",
- "RangeError",
- "RangeException",
- "ReadableStream",
- "RecordErrorEvent",
- "Rect",
- "ReferenceError",
- "Reflect",
- "RegExp",
- "RelativeOrientationSensor",
- "RelativeTimeFormat",
- "RemotePlayback",
- "ReportingObserver",
- "Request",
- "ResizeObserver",
- "ResizeObserverEntry",
- "Response",
- "RunningState",
- "RuntimeError",
- "SAMPLER_2D",
- "SAMPLER_CUBE",
- "SAMPLES",
- "SAMPLE_ALPHA_TO_COVERAGE",
- "SAMPLE_BUFFERS",
- "SAMPLE_COVERAGE",
- "SAMPLE_COVERAGE_INVERT",
- "SAMPLE_COVERAGE_VALUE",
- "SAWTOOTH",
- "SCHEDULED_STATE",
- "SCISSOR_BOX",
- "SCISSOR_TEST",
- "SCROLL_PAGE_DOWN",
- "SCROLL_PAGE_UP",
- "SDP_ANSWER",
- "SDP_OFFER",
- "SDP_PRANSWER",
- "SECURITY_ERR",
- "SELECT",
- "SERIALIZE_ERR",
- "SEVERITY_ERROR",
- "SEVERITY_FATAL_ERROR",
- "SEVERITY_WARNING",
- "SHADER_COMPILER",
- "SHADER_TYPE",
- "SHADING_LANGUAGE_VERSION",
- "SHIFT_MASK",
- "SHORT",
- "SHOWING",
- "SHOW_ALL",
- "SHOW_ATTRIBUTE",
- "SHOW_CDATA_SECTION",
- "SHOW_COMMENT",
- "SHOW_DOCUMENT",
- "SHOW_DOCUMENT_FRAGMENT",
- "SHOW_DOCUMENT_TYPE",
- "SHOW_ELEMENT",
- "SHOW_ENTITY",
- "SHOW_ENTITY_REFERENCE",
- "SHOW_NOTATION",
- "SHOW_PROCESSING_INSTRUCTION",
- "SHOW_TEXT",
- "SINE",
- "SKIN",
- "SOUNDFIELD",
- "SQLException",
- "SQRT1_2",
- "SQRT2",
- "SQUARE",
- "SRC_ALPHA",
- "SRC_ALPHA_SATURATE",
- "SRC_COLOR",
- "START_TO_END",
- "START_TO_START",
- "STATIC_DRAW",
- "STENCIL_ATTACHMENT",
- "STENCIL_BACK_FAIL",
- "STENCIL_BACK_FUNC",
- "STENCIL_BACK_PASS_DEPTH_FAIL",
- "STENCIL_BACK_PASS_DEPTH_PASS",
- "STENCIL_BACK_REF",
- "STENCIL_BACK_VALUE_MASK",
- "STENCIL_BACK_WRITEMASK",
- "STENCIL_BITS",
- "STENCIL_BUFFER_BIT",
- "STENCIL_CLEAR_VALUE",
- "STENCIL_FAIL",
- "STENCIL_FUNC",
- "STENCIL_INDEX",
- "STENCIL_INDEX8",
- "STENCIL_PASS_DEPTH_FAIL",
- "STENCIL_PASS_DEPTH_PASS",
- "STENCIL_REF",
- "STENCIL_TEST",
- "STENCIL_VALUE_MASK",
- "STENCIL_WRITEMASK",
- "STREAM_DRAW",
- "STRING_TYPE",
- "STYLE_RULE",
- "SUBPIXEL_BITS",
- "SUPPORTS_RULE",
- "SVGAElement",
- "SVGAltGlyphDefElement",
- "SVGAltGlyphElement",
- "SVGAltGlyphItemElement",
- "SVGAngle",
- "SVGAnimateColorElement",
- "SVGAnimateElement",
- "SVGAnimateMotionElement",
- "SVGAnimateTransformElement",
- "SVGAnimatedAngle",
- "SVGAnimatedBoolean",
- "SVGAnimatedEnumeration",
- "SVGAnimatedInteger",
- "SVGAnimatedLength",
- "SVGAnimatedLengthList",
- "SVGAnimatedNumber",
- "SVGAnimatedNumberList",
- "SVGAnimatedPreserveAspectRatio",
- "SVGAnimatedRect",
- "SVGAnimatedString",
- "SVGAnimatedTransformList",
- "SVGAnimationElement",
- "SVGCircleElement",
- "SVGClipPathElement",
- "SVGColor",
- "SVGComponentTransferFunctionElement",
- "SVGCursorElement",
- "SVGDefsElement",
- "SVGDescElement",
- "SVGDiscardElement",
- "SVGDocument",
- "SVGElement",
- "SVGElementInstance",
- "SVGElementInstanceList",
- "SVGEllipseElement",
- "SVGException",
- "SVGFEBlendElement",
- "SVGFEColorMatrixElement",
- "SVGFEComponentTransferElement",
- "SVGFECompositeElement",
- "SVGFEConvolveMatrixElement",
- "SVGFEDiffuseLightingElement",
- "SVGFEDisplacementMapElement",
- "SVGFEDistantLightElement",
- "SVGFEDropShadowElement",
- "SVGFEFloodElement",
- "SVGFEFuncAElement",
- "SVGFEFuncBElement",
- "SVGFEFuncGElement",
- "SVGFEFuncRElement",
- "SVGFEGaussianBlurElement",
- "SVGFEImageElement",
- "SVGFEMergeElement",
- "SVGFEMergeNodeElement",
- "SVGFEMorphologyElement",
- "SVGFEOffsetElement",
- "SVGFEPointLightElement",
- "SVGFESpecularLightingElement",
- "SVGFESpotLightElement",
- "SVGFETileElement",
- "SVGFETurbulenceElement",
- "SVGFilterElement",
- "SVGFontElement",
- "SVGFontFaceElement",
- "SVGFontFaceFormatElement",
- "SVGFontFaceNameElement",
- "SVGFontFaceSrcElement",
- "SVGFontFaceUriElement",
- "SVGForeignObjectElement",
- "SVGGElement",
- "SVGGeometryElement",
- "SVGGlyphElement",
- "SVGGlyphRefElement",
- "SVGGradientElement",
- "SVGGraphicsElement",
- "SVGHKernElement",
- "SVGImageElement",
- "SVGLength",
- "SVGLengthList",
- "SVGLineElement",
- "SVGLinearGradientElement",
- "SVGMPathElement",
- "SVGMarkerElement",
- "SVGMaskElement",
- "SVGMatrix",
- "SVGMetadataElement",
- "SVGMissingGlyphElement",
- "SVGNumber",
- "SVGNumberList",
- "SVGPaint",
- "SVGPathElement",
- "SVGPathSeg",
- "SVGPathSegArcAbs",
- "SVGPathSegArcRel",
- "SVGPathSegClosePath",
- "SVGPathSegCurvetoCubicAbs",
- "SVGPathSegCurvetoCubicRel",
- "SVGPathSegCurvetoCubicSmoothAbs",
- "SVGPathSegCurvetoCubicSmoothRel",
- "SVGPathSegCurvetoQuadraticAbs",
- "SVGPathSegCurvetoQuadraticRel",
- "SVGPathSegCurvetoQuadraticSmoothAbs",
- "SVGPathSegCurvetoQuadraticSmoothRel",
- "SVGPathSegLinetoAbs",
- "SVGPathSegLinetoHorizontalAbs",
- "SVGPathSegLinetoHorizontalRel",
- "SVGPathSegLinetoRel",
- "SVGPathSegLinetoVerticalAbs",
- "SVGPathSegLinetoVerticalRel",
- "SVGPathSegList",
- "SVGPathSegMovetoAbs",
- "SVGPathSegMovetoRel",
- "SVGPatternElement",
- "SVGPoint",
- "SVGPointList",
- "SVGPolygonElement",
- "SVGPolylineElement",
- "SVGPreserveAspectRatio",
- "SVGRadialGradientElement",
- "SVGRect",
- "SVGRectElement",
- "SVGRenderingIntent",
- "SVGSVGElement",
- "SVGScriptElement",
- "SVGSetElement",
- "SVGStopElement",
- "SVGStringList",
- "SVGStyleElement",
- "SVGSwitchElement",
- "SVGSymbolElement",
- "SVGTRefElement",
- "SVGTSpanElement",
- "SVGTextContentElement",
- "SVGTextElement",
- "SVGTextPathElement",
- "SVGTextPositioningElement",
- "SVGTitleElement",
- "SVGTransform",
- "SVGTransformList",
- "SVGUnitTypes",
- "SVGUseElement",
- "SVGVKernElement",
- "SVGViewElement",
- "SVGViewSpec",
- "SVGZoomAndPan",
- "SVGZoomEvent",
- "SVG_ANGLETYPE_DEG",
- "SVG_ANGLETYPE_GRAD",
- "SVG_ANGLETYPE_RAD",
- "SVG_ANGLETYPE_UNKNOWN",
- "SVG_ANGLETYPE_UNSPECIFIED",
- "SVG_CHANNEL_A",
- "SVG_CHANNEL_B",
- "SVG_CHANNEL_G",
- "SVG_CHANNEL_R",
- "SVG_CHANNEL_UNKNOWN",
- "SVG_COLORTYPE_CURRENTCOLOR",
- "SVG_COLORTYPE_RGBCOLOR",
- "SVG_COLORTYPE_RGBCOLOR_ICCCOLOR",
- "SVG_COLORTYPE_UNKNOWN",
- "SVG_EDGEMODE_DUPLICATE",
- "SVG_EDGEMODE_NONE",
- "SVG_EDGEMODE_UNKNOWN",
- "SVG_EDGEMODE_WRAP",
- "SVG_FEBLEND_MODE_COLOR",
- "SVG_FEBLEND_MODE_COLOR_BURN",
- "SVG_FEBLEND_MODE_COLOR_DODGE",
- "SVG_FEBLEND_MODE_DARKEN",
- "SVG_FEBLEND_MODE_DIFFERENCE",
- "SVG_FEBLEND_MODE_EXCLUSION",
- "SVG_FEBLEND_MODE_HARD_LIGHT",
- "SVG_FEBLEND_MODE_HUE",
- "SVG_FEBLEND_MODE_LIGHTEN",
- "SVG_FEBLEND_MODE_LUMINOSITY",
- "SVG_FEBLEND_MODE_MULTIPLY",
- "SVG_FEBLEND_MODE_NORMAL",
- "SVG_FEBLEND_MODE_OVERLAY",
- "SVG_FEBLEND_MODE_SATURATION",
- "SVG_FEBLEND_MODE_SCREEN",
- "SVG_FEBLEND_MODE_SOFT_LIGHT",
- "SVG_FEBLEND_MODE_UNKNOWN",
- "SVG_FECOLORMATRIX_TYPE_HUEROTATE",
- "SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA",
- "SVG_FECOLORMATRIX_TYPE_MATRIX",
- "SVG_FECOLORMATRIX_TYPE_SATURATE",
- "SVG_FECOLORMATRIX_TYPE_UNKNOWN",
- "SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE",
- "SVG_FECOMPONENTTRANSFER_TYPE_GAMMA",
- "SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY",
- "SVG_FECOMPONENTTRANSFER_TYPE_LINEAR",
- "SVG_FECOMPONENTTRANSFER_TYPE_TABLE",
- "SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN",
- "SVG_FECOMPOSITE_OPERATOR_ARITHMETIC",
- "SVG_FECOMPOSITE_OPERATOR_ATOP",
- "SVG_FECOMPOSITE_OPERATOR_IN",
- "SVG_FECOMPOSITE_OPERATOR_OUT",
- "SVG_FECOMPOSITE_OPERATOR_OVER",
- "SVG_FECOMPOSITE_OPERATOR_UNKNOWN",
- "SVG_FECOMPOSITE_OPERATOR_XOR",
- "SVG_INVALID_VALUE_ERR",
- "SVG_LENGTHTYPE_CM",
- "SVG_LENGTHTYPE_EMS",
- "SVG_LENGTHTYPE_EXS",
- "SVG_LENGTHTYPE_IN",
- "SVG_LENGTHTYPE_MM",
- "SVG_LENGTHTYPE_NUMBER",
- "SVG_LENGTHTYPE_PC",
- "SVG_LENGTHTYPE_PERCENTAGE",
- "SVG_LENGTHTYPE_PT",
- "SVG_LENGTHTYPE_PX",
- "SVG_LENGTHTYPE_UNKNOWN",
- "SVG_MARKERUNITS_STROKEWIDTH",
- "SVG_MARKERUNITS_UNKNOWN",
- "SVG_MARKERUNITS_USERSPACEONUSE",
- "SVG_MARKER_ORIENT_ANGLE",
- "SVG_MARKER_ORIENT_AUTO",
- "SVG_MARKER_ORIENT_UNKNOWN",
- "SVG_MASKTYPE_ALPHA",
- "SVG_MASKTYPE_LUMINANCE",
- "SVG_MATRIX_NOT_INVERTABLE",
- "SVG_MEETORSLICE_MEET",
- "SVG_MEETORSLICE_SLICE",
- "SVG_MEETORSLICE_UNKNOWN",
- "SVG_MORPHOLOGY_OPERATOR_DILATE",
- "SVG_MORPHOLOGY_OPERATOR_ERODE",
- "SVG_MORPHOLOGY_OPERATOR_UNKNOWN",
- "SVG_PAINTTYPE_CURRENTCOLOR",
- "SVG_PAINTTYPE_NONE",
- "SVG_PAINTTYPE_RGBCOLOR",
- "SVG_PAINTTYPE_RGBCOLOR_ICCCOLOR",
- "SVG_PAINTTYPE_UNKNOWN",
- "SVG_PAINTTYPE_URI",
- "SVG_PAINTTYPE_URI_CURRENTCOLOR",
- "SVG_PAINTTYPE_URI_NONE",
- "SVG_PAINTTYPE_URI_RGBCOLOR",
- "SVG_PAINTTYPE_URI_RGBCOLOR_ICCCOLOR",
- "SVG_PRESERVEASPECTRATIO_NONE",
- "SVG_PRESERVEASPECTRATIO_UNKNOWN",
- "SVG_PRESERVEASPECTRATIO_XMAXYMAX",
- "SVG_PRESERVEASPECTRATIO_XMAXYMID",
- "SVG_PRESERVEASPECTRATIO_XMAXYMIN",
- "SVG_PRESERVEASPECTRATIO_XMIDYMAX",
- "SVG_PRESERVEASPECTRATIO_XMIDYMID",
- "SVG_PRESERVEASPECTRATIO_XMIDYMIN",
- "SVG_PRESERVEASPECTRATIO_XMINYMAX",
- "SVG_PRESERVEASPECTRATIO_XMINYMID",
- "SVG_PRESERVEASPECTRATIO_XMINYMIN",
- "SVG_SPREADMETHOD_PAD",
- "SVG_SPREADMETHOD_REFLECT",
- "SVG_SPREADMETHOD_REPEAT",
- "SVG_SPREADMETHOD_UNKNOWN",
- "SVG_STITCHTYPE_NOSTITCH",
- "SVG_STITCHTYPE_STITCH",
- "SVG_STITCHTYPE_UNKNOWN",
- "SVG_TRANSFORM_MATRIX",
- "SVG_TRANSFORM_ROTATE",
- "SVG_TRANSFORM_SCALE",
- "SVG_TRANSFORM_SKEWX",
- "SVG_TRANSFORM_SKEWY",
- "SVG_TRANSFORM_TRANSLATE",
- "SVG_TRANSFORM_UNKNOWN",
- "SVG_TURBULENCE_TYPE_FRACTALNOISE",
- "SVG_TURBULENCE_TYPE_TURBULENCE",
- "SVG_TURBULENCE_TYPE_UNKNOWN",
- "SVG_UNIT_TYPE_OBJECTBOUNDINGBOX",
- "SVG_UNIT_TYPE_UNKNOWN",
- "SVG_UNIT_TYPE_USERSPACEONUSE",
- "SVG_WRONG_TYPE_ERR",
- "SVG_ZOOMANDPAN_DISABLE",
- "SVG_ZOOMANDPAN_MAGNIFY",
- "SVG_ZOOMANDPAN_UNKNOWN",
- "SYNTAX_ERR",
- "SavedPages",
- "Screen",
- "ScreenOrientation",
- "Script",
- "ScriptEngine",
- "ScriptEngineBuildVersion",
- "ScriptEngineMajorVersion",
- "ScriptEngineMinorVersion",
- "ScriptProcessorNode",
- "ScrollAreaEvent",
- "SecurityPolicyViolationEvent",
- "Selection",
- "Sensor",
- "SensorErrorEvent",
- "ServiceWorker",
- "ServiceWorkerContainer",
- "ServiceWorkerRegistration",
- "SessionDescription",
- "Set",
- "ShadowRoot",
- "SharedArrayBuffer",
- "SharedWorker",
- "SimpleGestureEvent",
- "SourceBuffer",
- "SourceBufferList",
- "SpeechSynthesis",
- "SpeechSynthesisErrorEvent",
- "SpeechSynthesisEvent",
- "SpeechSynthesisUtterance",
- "SpeechSynthesisVoice",
- "StaticRange",
- "StereoPannerNode",
- "StopIteration",
- "Storage",
- "StorageEvent",
- "StorageManager",
- "String",
- "StyleMedia",
- "StylePropertyMap",
- "StylePropertyMapReadOnly",
- "StyleSheet",
- "StyleSheetList",
- "StyleSheetPageList",
- "SubtleCrypto",
- "Symbol",
- "SyncManager",
- "SyntaxError",
- "TEMPORARY",
- "TEXTPATH_METHODTYPE_ALIGN",
- "TEXTPATH_METHODTYPE_STRETCH",
- "TEXTPATH_METHODTYPE_UNKNOWN",
- "TEXTPATH_SPACINGTYPE_AUTO",
- "TEXTPATH_SPACINGTYPE_EXACT",
- "TEXTPATH_SPACINGTYPE_UNKNOWN",
- "TEXTURE",
- "TEXTURE0",
- "TEXTURE1",
- "TEXTURE10",
- "TEXTURE11",
- "TEXTURE12",
- "TEXTURE13",
- "TEXTURE14",
- "TEXTURE15",
- "TEXTURE16",
- "TEXTURE17",
- "TEXTURE18",
- "TEXTURE19",
- "TEXTURE2",
- "TEXTURE20",
- "TEXTURE21",
- "TEXTURE22",
- "TEXTURE23",
- "TEXTURE24",
- "TEXTURE25",
- "TEXTURE26",
- "TEXTURE27",
- "TEXTURE28",
- "TEXTURE29",
- "TEXTURE3",
- "TEXTURE30",
- "TEXTURE31",
- "TEXTURE4",
- "TEXTURE5",
- "TEXTURE6",
- "TEXTURE7",
- "TEXTURE8",
- "TEXTURE9",
- "TEXTURE_2D",
- "TEXTURE_BINDING_2D",
- "TEXTURE_BINDING_CUBE_MAP",
- "TEXTURE_CUBE_MAP",
- "TEXTURE_CUBE_MAP_NEGATIVE_X",
- "TEXTURE_CUBE_MAP_NEGATIVE_Y",
- "TEXTURE_CUBE_MAP_NEGATIVE_Z",
- "TEXTURE_CUBE_MAP_POSITIVE_X",
- "TEXTURE_CUBE_MAP_POSITIVE_Y",
- "TEXTURE_CUBE_MAP_POSITIVE_Z",
- "TEXTURE_MAG_FILTER",
- "TEXTURE_MAX_ANISOTROPY_EXT",
- "TEXTURE_MIN_FILTER",
- "TEXTURE_WRAP_S",
- "TEXTURE_WRAP_T",
- "TEXT_NODE",
- "TIMEOUT",
- "TIMEOUT_ERR",
- "TOO_LARGE_ERR",
- "TRANSACTION_INACTIVE_ERR",
- "TRIANGLE",
- "TRIANGLES",
- "TRIANGLE_FAN",
- "TRIANGLE_STRIP",
- "TYPE_BACK_FORWARD",
- "TYPE_ERR",
- "TYPE_MISMATCH_ERR",
- "TYPE_NAVIGATE",
- "TYPE_RELOAD",
- "TYPE_RESERVED",
- "Table",
- "TaskAttributionTiming",
- "Text",
- "TextDecoder",
- "TextDecoderStream",
- "TextEncoder",
- "TextEncoderStream",
- "TextEvent",
- "TextMetrics",
- "TextRange",
- "TextRangeCollection",
- "TextTrack",
- "TextTrackCue",
- "TextTrackCueList",
- "TextTrackList",
- "TimeEvent",
- "TimeRanges",
- "Touch",
- "TouchEvent",
- "TouchList",
- "TrackEvent",
- "TransformStream",
- "TransitionEvent",
- "TreeWalker",
- "TypeError",
- "UIEvent",
- "UNCACHED",
- "UNKNOWN_ERR",
- "UNKNOWN_RULE",
- "UNMASKED_RENDERER_WEBGL",
- "UNMASKED_VENDOR_WEBGL",
- "UNORDERED_NODE_ITERATOR_TYPE",
- "UNORDERED_NODE_SNAPSHOT_TYPE",
- "UNPACK_ALIGNMENT",
- "UNPACK_COLORSPACE_CONVERSION_WEBGL",
- "UNPACK_FLIP_Y_WEBGL",
- "UNPACK_PREMULTIPLY_ALPHA_WEBGL",
- "UNSCHEDULED_STATE",
- "UNSENT",
- "UNSIGNED_BYTE",
- "UNSIGNED_INT",
- "UNSIGNED_SHORT",
- "UNSIGNED_SHORT_4_4_4_4",
- "UNSIGNED_SHORT_5_5_5_1",
- "UNSIGNED_SHORT_5_6_5",
- "UNSPECIFIED_EVENT_TYPE_ERR",
- "UPDATEREADY",
- "URIError",
- "URL",
- "URLSearchParams",
- "URLUnencoded",
- "URL_MISMATCH_ERR",
- "USB",
- "USBAlternateInterface",
- "USBConfiguration",
- "USBConnectionEvent",
- "USBDevice",
- "USBEndpoint",
- "USBInTransferResult",
- "USBInterface",
- "USBIsochronousInTransferPacket",
- "USBIsochronousInTransferResult",
- "USBIsochronousOutTransferPacket",
- "USBIsochronousOutTransferResult",
- "USBOutTransferResult",
- "UTC",
- "Uint16Array",
- "Uint32Array",
- "Uint8Array",
- "Uint8ClampedArray",
- "UserActivation",
- "UserMessageHandler",
- "UserMessageHandlersNamespace",
- "UserProximityEvent",
- "VALIDATE_STATUS",
- "VALIDATION_ERR",
- "VARIABLES_RULE",
- "VBArray",
- "VENDOR",
- "VERSION",
- "VERSION_CHANGE",
- "VERSION_ERR",
- "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",
- "VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE",
- "VERTEX_ATTRIB_ARRAY_ENABLED",
- "VERTEX_ATTRIB_ARRAY_NORMALIZED",
- "VERTEX_ATTRIB_ARRAY_POINTER",
- "VERTEX_ATTRIB_ARRAY_SIZE",
- "VERTEX_ATTRIB_ARRAY_STRIDE",
- "VERTEX_ATTRIB_ARRAY_TYPE",
- "VERTEX_SHADER",
- "VERTICAL",
- "VERTICAL_AXIS",
- "VER_ERR",
- "VIEWPORT",
- "VIEWPORT_RULE",
- "VRDisplay",
- "VRDisplayCapabilities",
- "VRDisplayEvent",
- "VREyeParameters",
- "VRFieldOfView",
- "VRFrameData",
- "VRPose",
- "VRStageParameters",
- "VTTCue",
- "VTTRegion",
- "ValidityState",
- "VideoPlaybackQuality",
- "VideoStreamTrack",
- "VisualViewport",
- "WEBGL_compressed_texture_s3tc",
- "WEBGL_debug_renderer_info",
- "WEBKIT_FILTER_RULE",
- "WEBKIT_KEYFRAMES_RULE",
- "WEBKIT_KEYFRAME_RULE",
- "WEBKIT_REGION_RULE",
- "WRONG_DOCUMENT_ERR",
- "WaveShaperNode",
- "WeakMap",
- "WeakSet",
- "WebAssembly",
- "WebGL2RenderingContext",
- "WebGLActiveInfo",
- "WebGLBuffer",
- "WebGLContextEvent",
- "WebGLFramebuffer",
- "WebGLObject",
- "WebGLProgram",
- "WebGLQuery",
- "WebGLRenderbuffer",
- "WebGLRenderingContext",
- "WebGLSampler",
- "WebGLShader",
- "WebGLShaderPrecisionFormat",
- "WebGLSync",
- "WebGLTexture",
- "WebGLTransformFeedback",
- "WebGLUniformLocation",
- "WebGLVertexArray",
- "WebGLVertexArrayObject",
- "WebKitAnimationEvent",
- "WebKitBlobBuilder",
- "WebKitCSSFilterRule",
- "WebKitCSSFilterValue",
- "WebKitCSSKeyframeRule",
- "WebKitCSSKeyframesRule",
- "WebKitCSSMatrix",
- "WebKitCSSRegionRule",
- "WebKitCSSTransformValue",
- "WebKitDataCue",
- "WebKitGamepad",
- "WebKitMediaKeyError",
- "WebKitMediaKeyMessageEvent",
- "WebKitMediaKeySession",
- "WebKitMediaKeys",
- "WebKitMediaSource",
- "WebKitMutationObserver",
- "WebKitNamespace",
- "WebKitPlaybackTargetAvailabilityEvent",
- "WebKitPoint",
- "WebKitShadowRoot",
- "WebKitSourceBuffer",
- "WebKitSourceBufferList",
- "WebKitTransitionEvent",
- "WebSocket",
- "WebkitAlignContent",
- "WebkitAlignItems",
- "WebkitAlignSelf",
- "WebkitAnimation",
- "WebkitAnimationDelay",
- "WebkitAnimationDirection",
- "WebkitAnimationDuration",
- "WebkitAnimationFillMode",
- "WebkitAnimationIterationCount",
- "WebkitAnimationName",
- "WebkitAnimationPlayState",
- "WebkitAnimationTimingFunction",
- "WebkitAppearance",
- "WebkitBackfaceVisibility",
- "WebkitBackgroundClip",
- "WebkitBackgroundOrigin",
- "WebkitBackgroundSize",
- "WebkitBorderBottomLeftRadius",
- "WebkitBorderBottomRightRadius",
- "WebkitBorderImage",
- "WebkitBorderRadius",
- "WebkitBorderTopLeftRadius",
- "WebkitBorderTopRightRadius",
- "WebkitBoxAlign",
- "WebkitBoxDirection",
- "WebkitBoxFlex",
- "WebkitBoxOrdinalGroup",
- "WebkitBoxOrient",
- "WebkitBoxPack",
- "WebkitBoxShadow",
- "WebkitBoxSizing",
- "WebkitFilter",
- "WebkitFlex",
- "WebkitFlexBasis",
- "WebkitFlexDirection",
- "WebkitFlexFlow",
- "WebkitFlexGrow",
- "WebkitFlexShrink",
- "WebkitFlexWrap",
- "WebkitJustifyContent",
- "WebkitMask",
- "WebkitMaskClip",
- "WebkitMaskComposite",
- "WebkitMaskImage",
- "WebkitMaskOrigin",
- "WebkitMaskPosition",
- "WebkitMaskPositionX",
- "WebkitMaskPositionY",
- "WebkitMaskRepeat",
- "WebkitMaskSize",
- "WebkitOrder",
- "WebkitPerspective",
- "WebkitPerspectiveOrigin",
- "WebkitTextFillColor",
- "WebkitTextSizeAdjust",
- "WebkitTextStroke",
- "WebkitTextStrokeColor",
- "WebkitTextStrokeWidth",
- "WebkitTransform",
- "WebkitTransformOrigin",
- "WebkitTransformStyle",
- "WebkitTransition",
- "WebkitTransitionDelay",
- "WebkitTransitionDuration",
- "WebkitTransitionProperty",
- "WebkitTransitionTimingFunction",
- "WebkitUserSelect",
- "WheelEvent",
- "Window",
- "Worker",
- "Worklet",
- "WritableStream",
- "XMLDocument",
- "XMLHttpRequest",
- "XMLHttpRequestEventTarget",
- "XMLHttpRequestException",
- "XMLHttpRequestProgressEvent",
- "XMLHttpRequestUpload",
- "XMLSerializer",
- "XMLStylesheetProcessingInstruction",
- "XPathEvaluator",
- "XPathException",
- "XPathExpression",
- "XPathNSResolver",
- "XPathResult",
- "XSLTProcessor",
- "ZERO",
- "_XD0M_",
- "_YD0M_",
- "__defineGetter__",
- "__defineSetter__",
- "__lookupGetter__",
- "__lookupSetter__",
- "__opera",
- "__proto__",
- "_browserjsran",
- "a",
- "aLink",
- "abbr",
- "abort",
- "aborted",
- "abs",
- "absolute",
- "acceleration",
- "accelerationIncludingGravity",
- "accelerator",
- "accept",
- "acceptCharset",
- "acceptNode",
- "accessKey",
- "accessKeyLabel",
- "accuracy",
- "acos",
- "acosh",
- "action",
- "actionURL",
- "activated",
- "active",
- "activeCues",
- "activeElement",
- "activeSourceBuffers",
- "activeSourceCount",
- "activeTexture",
- "activeVRDisplays",
- "add",
- "addBehavior",
- "addCandidate",
- "addColorStop",
- "addCue",
- "addElement",
- "addEventListener",
- "addFilter",
- "addFromString",
- "addFromUri",
- "addIceCandidate",
- "addImport",
- "addListener",
- "addModule",
- "addNamed",
- "addPageRule",
- "addPath",
- "addPointer",
- "addRange",
- "addRegion",
- "addRule",
- "addSearchEngine",
- "addSourceBuffer",
- "addStream",
- "addTextTrack",
- "addTrack",
- "addTransceiver",
- "addWakeLockListener",
- "addedNodes",
- "additionalName",
- "additiveSymbols",
- "addons",
- "adoptNode",
- "adoptedCallback",
- "adoptedStyleSheets",
- "adr",
- "advance",
- "after",
- "album",
- "alert",
- "algorithm",
- "align",
- "align-content",
- "align-items",
- "align-self",
- "alignContent",
- "alignItems",
- "alignSelf",
- "alignmentBaseline",
- "alinkColor",
- "all",
- "allow",
- "allowFullscreen",
- "allowPaymentRequest",
- "allowedDirections",
- "alpha",
- "alt",
- "altGraphKey",
- "altHtml",
- "altKey",
- "altLeft",
- "altitude",
- "altitudeAccuracy",
- "amplitude",
- "ancestorOrigins",
- "anchor",
- "anchorNode",
- "anchorOffset",
- "anchors",
- "and",
- "angle",
- "angularAcceleration",
- "angularVelocity",
- "animVal",
- "animate",
- "animatedInstanceRoot",
- "animatedNormalizedPathSegList",
- "animatedPathSegList",
- "animatedPoints",
- "animation",
- "animation-delay",
- "animation-direction",
- "animation-duration",
- "animation-fill-mode",
- "animation-iteration-count",
- "animation-name",
- "animation-play-state",
- "animation-timing-function",
- "animationDelay",
- "animationDirection",
- "animationDuration",
- "animationFillMode",
- "animationIterationCount",
- "animationName",
- "animationPlayState",
- "animationStartTime",
- "animationTimingFunction",
- "animationsPaused",
- "anniversary",
- "app",
- "appCodeName",
- "appMinorVersion",
- "appName",
- "appNotifications",
- "appVersion",
- "append",
- "appendBuffer",
- "appendChild",
- "appendData",
- "appendItem",
- "appendMedium",
- "appendNamed",
- "appendRule",
- "appendStream",
- "appendWindowEnd",
- "appendWindowStart",
- "applets",
- "application/pdf",
- "application/x-google-chrome-pdf",
- "application/x-nacl",
- "application/x-pnacl",
- "applicationCache",
- "apply",
- "applyElement",
- "arc",
- "arcTo",
- "archive",
- "areas",
- "arguments",
- "arrayBuffer",
- "artist",
- "artwork",
- "as",
- "asin",
- "asinh",
- "assert",
- "assign",
- "assignedSlot",
- "async",
- "atEnd",
- "atan",
- "atan2",
- "atanh",
- "atob",
- "attachEvent",
- "attachShader",
- "attachShadow",
- "attachments",
- "attack",
- "attrChange",
- "attrName",
- "attributeChangedCallback",
- "attributeFilter",
- "attributeName",
- "attributeNamespace",
- "attributeOldValue",
- "attributeStyleMap",
- "attributes",
- "audioTracks",
- "audioWorklet",
- "autoIncrement",
- "autobuffer",
- "autocapitalize",
- "autocomplete",
- "autocorrect",
- "autofocus",
- "automationRate",
- "autoplay",
- "availHeight",
- "availLeft",
- "availTop",
- "availWidth",
- "availability",
- "available",
- "aversion",
- "axes",
- "axis",
- "azimuth",
- "b",
- "back",
- "backface-visibility",
- "backfaceVisibility",
- "background",
- "background-attachment",
- "background-blend-mode",
- "background-clip",
- "background-color",
- "background-image",
- "background-origin",
- "background-position",
- "background-position-x",
- "background-position-y",
- "background-repeat",
- "background-size",
- "backgroundAttachment",
- "backgroundBlendMode",
- "backgroundClip",
- "backgroundColor",
- "backgroundImage",
- "backgroundOrigin",
- "backgroundPosition",
- "backgroundPositionX",
- "backgroundPositionY",
- "backgroundRepeat",
- "backgroundRepeatX",
- "backgroundRepeatY",
- "backgroundSize",
- "badInput",
- "balance",
- "baseFrequencyX",
- "baseFrequencyY",
- "baseLatency",
- "baseNode",
- "baseOffset",
- "baseURI",
- "baseVal",
- "baselineShift",
- "battery",
- "bday",
- "before",
- "beginElement",
- "beginElementAt",
- "beginPath",
- "behavior",
- "behaviorCookie",
- "behaviorPart",
- "behaviorUrns",
- "beta",
- "bezierCurveTo",
- "bgColor",
- "bgProperties",
- "bias",
- "big",
- "binaryType",
- "bind",
- "bindAttribLocation",
- "bindBuffer",
- "bindFramebuffer",
- "bindRenderbuffer",
- "bindTexture",
- "blendColor",
- "blendEquation",
- "blendEquationSeparate",
- "blendFunc",
- "blendFuncSeparate",
- "blink",
- "blob",
- "block-size",
- "blockDirection",
- "blockSize",
- "blue",
- "bluetooth",
- "blur",
- "body",
- "bodyUsed",
- "bold",
- "bookmarks",
- "booleanValue",
- "border",
- "border-block",
- "border-block-color",
- "border-block-end",
- "border-block-end-color",
- "border-block-end-style",
- "border-block-end-width",
- "border-block-start",
- "border-block-start-color",
- "border-block-start-style",
- "border-block-start-width",
- "border-block-style",
- "border-block-width",
- "border-bottom",
- "border-bottom-color",
- "border-bottom-left-radius",
- "border-bottom-right-radius",
- "border-bottom-style",
- "border-bottom-width",
- "border-collapse",
- "border-color",
- "border-end-end-radius",
- "border-end-start-radius",
- "border-image",
- "border-image-outset",
- "border-image-repeat",
- "border-image-slice",
- "border-image-source",
- "border-image-width",
- "border-inline",
- "border-inline-color",
- "border-inline-end",
- "border-inline-end-color",
- "border-inline-end-style",
- "border-inline-end-width",
- "border-inline-start",
- "border-inline-start-color",
- "border-inline-start-style",
- "border-inline-start-width",
- "border-inline-style",
- "border-inline-width",
- "border-left",
- "border-left-color",
- "border-left-style",
- "border-left-width",
- "border-radius",
- "border-right",
- "border-right-color",
- "border-right-style",
- "border-right-width",
- "border-spacing",
- "border-start-end-radius",
- "border-start-start-radius",
- "border-style",
- "border-top",
- "border-top-color",
- "border-top-left-radius",
- "border-top-right-radius",
- "border-top-style",
- "border-top-width",
- "border-width",
- "borderBlock",
- "borderBlockColor",
- "borderBlockEnd",
- "borderBlockEndColor",
- "borderBlockEndStyle",
- "borderBlockEndWidth",
- "borderBlockStart",
- "borderBlockStartColor",
- "borderBlockStartStyle",
- "borderBlockStartWidth",
- "borderBlockStyle",
- "borderBlockWidth",
- "borderBottom",
- "borderBottomColor",
- "borderBottomLeftRadius",
- "borderBottomRightRadius",
- "borderBottomStyle",
- "borderBottomWidth",
- "borderCollapse",
- "borderColor",
- "borderColorDark",
- "borderColorLight",
- "borderEndEndRadius",
- "borderEndStartRadius",
- "borderImage",
- "borderImageOutset",
- "borderImageRepeat",
- "borderImageSlice",
- "borderImageSource",
- "borderImageWidth",
- "borderInline",
- "borderInlineColor",
- "borderInlineEnd",
- "borderInlineEndColor",
- "borderInlineEndStyle",
- "borderInlineEndWidth",
- "borderInlineStart",
- "borderInlineStartColor",
- "borderInlineStartStyle",
- "borderInlineStartWidth",
- "borderInlineStyle",
- "borderInlineWidth",
- "borderLeft",
- "borderLeftColor",
- "borderLeftStyle",
- "borderLeftWidth",
- "borderRadius",
- "borderRight",
- "borderRightColor",
- "borderRightStyle",
- "borderRightWidth",
- "borderSpacing",
- "borderStartEndRadius",
- "borderStartStartRadius",
- "borderStyle",
- "borderTop",
- "borderTopColor",
- "borderTopLeftRadius",
- "borderTopRightRadius",
- "borderTopStyle",
- "borderTopWidth",
- "borderWidth",
- "bottom",
- "bottomMargin",
- "bound",
- "boundElements",
- "boundingClientRect",
- "boundingHeight",
- "boundingLeft",
- "boundingTop",
- "boundingWidth",
- "bounds",
- "box-decoration-break",
- "box-shadow",
- "box-sizing",
- "boxDecorationBreak",
- "boxShadow",
- "boxSizing",
- "break-after",
- "break-before",
- "break-inside",
- "breakAfter",
- "breakBefore",
- "breakInside",
- "browserLanguage",
- "btoa",
- "bubbles",
- "buffer",
- "bufferData",
- "bufferDepth",
- "bufferSize",
- "bufferSubData",
- "buffered",
- "bufferedAmount",
- "bufferedRendering",
- "buildID",
- "buildNumber",
- "button",
- "buttonID",
- "buttons",
- "byteLength",
- "byteOffset",
- "c",
- "caches",
- "call",
- "caller",
- "canBeFormatted",
- "canBeMounted",
- "canBeShared",
- "canHaveChildren",
- "canHaveHTML",
- "canPlayType",
- "canTrickleIceCandidates",
- "cancel",
- "cancelAndHoldAtTime",
- "cancelAnimationFrame",
- "cancelBubble",
- "cancelIdleCallback",
- "cancelScheduledValues",
- "cancelWatchAvailability",
- "cancelable",
- "candidate",
- "canvas",
- "caption",
- "caption-side",
- "captionSide",
- "capture",
- "captureEvents",
- "captureStackTrace",
- "captureStream",
- "caret-color",
- "caretColor",
- "caretPositionFromPoint",
- "caretRangeFromPoint",
- "cast",
- "catch",
- "category",
- "cbrt",
- "cd",
- "ceil",
- "cellIndex",
- "cellPadding",
- "cellSpacing",
- "cells",
- "ch",
- "chOff",
- "chain",
- "challenge",
- "changedTouches",
- "channel",
- "channelCount",
- "channelCountMode",
- "channelInterpretation",
- "char",
- "charAt",
- "charCode",
- "charCodeAt",
- "charIndex",
- "characterData",
- "characterDataOldValue",
- "characterSet",
- "charging",
- "chargingTime",
- "charset",
- "check",
- "checkEnclosure",
- "checkFramebufferStatus",
- "checkIntersection",
- "checkValidity",
- "checked",
- "childElementCount",
- "childList",
- "childNodes",
- "children",
- "chrome",
- "ciphertext",
- "cite",
- "classList",
- "className",
- "classid",
- "clear",
- "clearAttributes",
- "clearColor",
- "clearData",
- "clearDepth",
- "clearImmediate",
- "clearInterval",
- "clearLiveSeekableRange",
- "clearMarks",
- "clearMeasures",
- "clearParameters",
- "clearRect",
- "clearResourceTimings",
- "clearShadow",
- "clearStencil",
- "clearTimeout",
- "clearWatch",
- "click",
- "clickCount",
- "clientHeight",
- "clientInformation",
- "clientLeft",
- "clientRect",
- "clientRects",
- "clientTop",
- "clientWidth",
- "clientX",
- "clientY",
- "clip",
- "clip-path",
- "clip-rule",
- "clipBottom",
- "clipLeft",
- "clipPath",
- "clipPathUnits",
- "clipRight",
- "clipRule",
- "clipTop",
- "clipboard",
- "clipboardData",
- "clone",
- "cloneContents",
- "cloneNode",
- "cloneRange",
- "close",
- "closePath",
- "closed",
- "closest",
- "clz",
- "clz32",
- "cmp",
- "code",
- "codeBase",
- "codePointAt",
- "codeType",
- "colSpan",
- "collapse",
- "collapseToEnd",
- "collapseToStart",
- "collapsed",
- "collect",
- "colno",
- "color",
- "color-adjust",
- "color-interpolation",
- "color-interpolation-filters",
- "colorAdjust",
- "colorDepth",
- "colorInterpolation",
- "colorInterpolationFilters",
- "colorMask",
- "colorRendering",
- "colorType",
- "cols",
- "column-count",
- "column-fill",
- "column-gap",
- "column-rule",
- "column-rule-color",
- "column-rule-style",
- "column-rule-width",
- "column-width",
- "columnCount",
- "columnFill",
- "columnGap",
- "columnNumber",
- "columnRule",
- "columnRuleColor",
- "columnRuleStyle",
- "columnRuleWidth",
- "columnSpan",
- "columnWidth",
- "columns",
- "command",
- "commitPreferences",
- "commonAncestorContainer",
- "compact",
- "compare",
- "compareBoundaryPoints",
- "compareDocumentPosition",
- "compareEndPoints",
- "compareExchange",
- "compareNode",
- "comparePoint",
- "compatMode",
- "compatible",
- "compile",
- "compileShader",
- "compileStreaming",
- "complete",
- "componentFromPoint",
- "composed",
- "composedPath",
- "compositionEndOffset",
- "compositionStartOffset",
- "compressedTexImage2D",
- "compressedTexSubImage2D",
- "computedStyleMap",
- "concat",
- "conditionText",
- "coneInnerAngle",
- "coneOuterAngle",
- "coneOuterGain",
- "confirm",
- "confirmComposition",
- "confirmSiteSpecificTrackingException",
- "confirmWebWideTrackingException",
- "connect",
- "connectEnd",
- "connectStart",
- "connected",
- "connectedCallback",
- "connection",
- "connectionSpeed",
- "connectionState",
- "console",
- "consolidate",
- "constrictionActive",
- "construct",
- "constructor",
- "contactID",
- "contain",
- "contains",
- "containsNode",
- "content",
- "contentDocument",
- "contentEditable",
- "contentOverflow",
- "contentScriptType",
- "contentStyleType",
- "contentType",
- "contentWindow",
- "context",
- "contextMenu",
- "contextmenu",
- "continue",
- "continuous",
- "control",
- "controller",
- "controls",
- "controlsList",
- "convertToSpecifiedUnits",
- "cookie",
- "cookieEnabled",
- "coords",
- "copyFromChannel",
- "copyTexImage2D",
- "copyTexSubImage2D",
- "copyToChannel",
- "copyWithin",
- "correspondingElement",
- "correspondingUseElement",
- "cos",
- "cosh",
- "count",
- "countReset",
- "counter-increment",
- "counter-reset",
- "counterIncrement",
- "counterReset",
- "cpuClass",
- "cpuSleepAllowed",
- "create",
- "createAnalyser",
- "createAnswer",
- "createAttribute",
- "createAttributeNS",
- "createBiquadFilter",
- "createBuffer",
- "createBufferSource",
- "createCDATASection",
- "createCSSStyleSheet",
- "createCaption",
- "createChannelMerger",
- "createChannelSplitter",
- "createComment",
- "createConstantSource",
- "createContextualFragment",
- "createControlRange",
- "createConvolver",
- "createDTMFSender",
- "createDataChannel",
- "createDelay",
- "createDelayNode",
- "createDocument",
- "createDocumentFragment",
- "createDocumentType",
- "createDynamicsCompressor",
- "createElement",
- "createElementNS",
- "createEntityReference",
- "createEvent",
- "createEventObject",
- "createExpression",
- "createFramebuffer",
- "createFunction",
- "createGain",
- "createGainNode",
- "createHTMLDocument",
- "createIIRFilter",
- "createImageBitmap",
- "createImageData",
- "createIndex",
- "createJavaScriptNode",
- "createLinearGradient",
- "createMediaElementSource",
- "createMediaKeys",
- "createMediaStreamDestination",
- "createMediaStreamSource",
- "createMutableFile",
- "createNSResolver",
- "createNodeIterator",
- "createNotification",
- "createObjectStore",
- "createObjectURL",
- "createOffer",
- "createOscillator",
- "createPanner",
- "createPattern",
- "createPeriodicWave",
- "createPopup",
- "createProcessingInstruction",
- "createProgram",
- "createRadialGradient",
- "createRange",
- "createRangeCollection",
- "createRenderbuffer",
- "createSVGAngle",
- "createSVGLength",
- "createSVGMatrix",
- "createSVGNumber",
- "createSVGPathSegArcAbs",
- "createSVGPathSegArcRel",
- "createSVGPathSegClosePath",
- "createSVGPathSegCurvetoCubicAbs",
- "createSVGPathSegCurvetoCubicRel",
- "createSVGPathSegCurvetoCubicSmoothAbs",
- "createSVGPathSegCurvetoCubicSmoothRel",
- "createSVGPathSegCurvetoQuadraticAbs",
- "createSVGPathSegCurvetoQuadraticRel",
- "createSVGPathSegCurvetoQuadraticSmoothAbs",
- "createSVGPathSegCurvetoQuadraticSmoothRel",
- "createSVGPathSegLinetoAbs",
- "createSVGPathSegLinetoHorizontalAbs",
- "createSVGPathSegLinetoHorizontalRel",
- "createSVGPathSegLinetoRel",
- "createSVGPathSegLinetoVerticalAbs",
- "createSVGPathSegLinetoVerticalRel",
- "createSVGPathSegMovetoAbs",
- "createSVGPathSegMovetoRel",
- "createSVGPoint",
- "createSVGRect",
- "createSVGTransform",
- "createSVGTransformFromMatrix",
- "createScriptProcessor",
- "createSession",
- "createShader",
- "createShadowRoot",
- "createStereoPanner",
- "createStyleSheet",
- "createTBody",
- "createTFoot",
- "createTHead",
- "createTextNode",
- "createTextRange",
- "createTexture",
- "createTouch",
- "createTouchList",
- "createTreeWalker",
- "createWaveShaper",
- "creationTime",
- "credentials",
- "crossOrigin",
- "crypto",
- "csi",
- "csp",
- "cssFloat",
- "cssRules",
- "cssText",
- "cssValueType",
- "ctrlKey",
- "ctrlLeft",
- "cues",
- "cullFace",
- "currentLocalDescription",
- "currentNode",
- "currentPage",
- "currentRemoteDescription",
- "currentScale",
- "currentScript",
- "currentSrc",
- "currentState",
- "currentStyle",
- "currentTarget",
- "currentTime",
- "currentTranslate",
- "currentView",
- "cursor",
- "curve",
- "customElements",
- "customError",
- "cx",
- "cy",
- "d",
- "data",
- "dataFld",
- "dataFormatAs",
- "dataPageSize",
- "dataSrc",
- "dataTransfer",
- "database",
- "databases",
- "dataset",
- "dateTime",
- "db",
- "debug",
- "debuggerEnabled",
- "declare",
- "decode",
- "decodeAudioData",
- "decodeURI",
- "decodeURIComponent",
- "decoding",
- "decodingInfo",
- "decrypt",
- "default",
- "defaultCharset",
- "defaultChecked",
- "defaultMuted",
- "defaultPlaybackRate",
- "defaultPrevented",
- "defaultRequest",
- "defaultSelected",
- "defaultStatus",
- "defaultURL",
- "defaultValue",
- "defaultView",
- "defaultstatus",
- "defer",
- "define",
- "defineMagicFunction",
- "defineMagicVariable",
- "defineProperties",
- "defineProperty",
- "delayTime",
- "delegatesFocus",
- "delete",
- "deleteBuffer",
- "deleteCaption",
- "deleteCell",
- "deleteContents",
- "deleteData",
- "deleteDatabase",
- "deleteFramebuffer",
- "deleteFromDocument",
- "deleteIndex",
- "deleteMedium",
- "deleteObjectStore",
- "deleteProgram",
- "deleteProperty",
- "deleteRenderbuffer",
- "deleteRow",
- "deleteRule",
- "deleteShader",
- "deleteTFoot",
- "deleteTHead",
- "deleteTexture",
- "deliverChangeRecords",
- "delivery",
- "deliveryInfo",
- "deliveryStatus",
- "deliveryTimestamp",
- "delta",
- "deltaMode",
- "deltaX",
- "deltaY",
- "deltaZ",
- "depthFunc",
- "depthMask",
- "depthRange",
- "deriveBits",
- "deriveKey",
- "description",
- "deselectAll",
- "designMode",
- "destination",
- "destinationURL",
- "detach",
- "detachEvent",
- "detachShader",
- "detail",
- "detune",
- "deviceMemory",
- "devicePixelRatio",
- "deviceSessionId",
- "deviceXDPI",
- "deviceYDPI",
- "diffuseConstant",
- "digest",
- "dimensions",
- "dir",
- "dirName",
- "direction",
- "dirxml",
- "disable",
- "disablePictureInPicture",
- "disableRemotePlayback",
- "disableVertexAttribArray",
- "disabled",
- "dischargingTime",
- "disconnect",
- "disconnectedCallback",
- "dispatchEvent",
- "display",
- "distanceModel",
- "divisor",
- "djsapi",
- "djsproxy",
- "doImport",
- "doNotTrack",
- "doScroll",
- "doctype",
- "document",
- "documentElement",
- "documentMode",
- "documentURI",
- "dolphin",
- "dolphinGameCenter",
- "dolphininfo",
- "dolphinmeta",
- "domComplete",
- "domContentLoadedEventEnd",
- "domContentLoadedEventStart",
- "domInteractive",
- "domLoading",
- "domain",
- "domainLookupEnd",
- "domainLookupStart",
- "dominant-baseline",
- "dominantBaseline",
- "done",
- "dopplerFactor",
- "dotAll",
- "downlink",
- "download",
- "dragDrop",
- "draggable",
- "drawArrays",
- "drawArraysInstancedANGLE",
- "drawCustomFocusRing",
- "drawElements",
- "drawElementsInstancedANGLE",
- "drawFocusIfNeeded",
- "drawImage",
- "drawImageFromRect",
- "drawSystemFocusRing",
- "drawingBufferHeight",
- "drawingBufferWidth",
- "dropEffect",
- "droppedVideoFrames",
- "dropzone",
- "dump",
- "duplicate",
- "duration",
- "dvname",
- "dvnum",
- "dx",
- "dy",
- "dynsrc",
- "e",
- "edgeMode",
- "effect",
- "effectAllowed",
- "effectiveType",
- "elapsedTime",
- "elementFromPoint",
- "elements",
- "elementsFromPoint",
- "elevation",
- "ellipse",
- "email",
- "embeds",
- "empty",
- "empty-cells",
- "emptyCells",
- "enable",
- "enableBackground",
- "enableStyleSheetsForSet",
- "enableVertexAttribArray",
- "enabled",
- "enabledPlugin",
- "encode",
- "encodeInto",
- "encodeURI",
- "encodeURIComponent",
- "encoding",
- "encodingInfo",
- "encrypt",
- "enctype",
- "end",
- "endContainer",
- "endElement",
- "endElementAt",
- "endOfStream",
- "endOffset",
- "endTime",
- "ended",
- "endsWith",
- "entities",
- "entries",
- "entryType",
- "enumerate",
- "enumerateDevices",
- "enumerateEditable",
- "epubCaptionSide",
- "epubTextCombine",
- "epubTextEmphasis",
- "epubTextEmphasisColor",
- "epubTextEmphasisStyle",
- "epubTextOrientation",
- "epubTextTransform",
- "epubWordBreak",
- "epubWritingMode",
- "error",
- "errorCode",
- "escape",
- "estimate",
- "eval",
- "evaluate",
- "event",
- "eventPhase",
- "every",
- "exception",
- "exchange",
- "exec",
- "execCommand",
- "execCommandShowHelp",
- "execScript",
- "exitFullscreen",
- "exitPictureInPicture",
- "exitPointerLock",
- "exp",
- "expand",
- "expandEntityReferences",
- "expando",
- "expansion",
- "expiryDate",
- "explicitOriginalTarget",
- "expm1",
- "exponent",
- "exponentialRampToValueAtTime",
- "exportKey",
- "extend",
- "extensions",
- "extentNode",
- "extentOffset",
- "external",
- "externalResourcesRequired",
- "extractContents",
- "extractable",
- "f",
- "face",
- "factoryReset",
- "fallback",
- "familyName",
- "farthestViewportElement",
- "fastSeek",
- "fatal",
- "fetch",
- "fetchStart",
- "fftSize",
- "fgColor",
- "fileCreatedDate",
- "fileHandle",
- "fileModifiedDate",
- "fileName",
- "fileSize",
- "fileUpdatedDate",
- "filename",
- "files",
- "fill",
- "fill-opacity",
- "fill-rule",
- "fillOpacity",
- "fillRect",
- "fillRule",
- "fillStyle",
- "fillText",
- "filter",
- "filterResX",
- "filterResY",
- "filterUnits",
- "filters",
- "finally",
- "find",
- "findIndex",
- "findRule",
- "findText",
- "finish",
- "finished",
- "fireEvent",
- "firesTouchEvents",
- "firstChild",
- "firstElementChild",
- "firstPage",
- "fixed",
- "flags",
- "flat",
- "flatMap",
- "flex",
- "flex-basis",
- "flex-direction",
- "flex-flow",
- "flex-grow",
- "flex-shrink",
- "flex-wrap",
- "flexBasis",
- "flexDirection",
- "flexFlow",
- "flexGrow",
- "flexShrink",
- "flexWrap",
- "flipX",
- "flipY",
- "float",
- "flood-color",
- "flood-opacity",
- "floodColor",
- "floodOpacity",
- "floor",
- "flush",
- "focus",
- "focusNode",
- "focusOffset",
- "font",
- "font-family",
- "font-feature-settings",
- "font-kerning",
- "font-language-override",
- "font-size",
- "font-size-adjust",
- "font-stretch",
- "font-style",
- "font-synthesis",
- "font-variant",
- "font-variant-alternates",
- "font-variant-caps",
- "font-variant-east-asian",
- "font-variant-ligatures",
- "font-variant-numeric",
- "font-variant-position",
- "font-weight",
- "fontDisplay",
- "fontFamily",
- "fontFeatureSettings",
- "fontKerning",
- "fontLanguageOverride",
- "fontSize",
- "fontSizeAdjust",
- "fontSmoothingEnabled",
- "fontStretch",
- "fontStyle",
- "fontSynthesis",
- "fontVariant",
- "fontVariantAlternates",
- "fontVariantCaps",
- "fontVariantEastAsian",
- "fontVariantLigatures",
- "fontVariantNumeric",
- "fontVariantPosition",
- "fontVariationSettings",
- "fontWeight",
- "fontcolor",
- "fonts",
- "fontsize",
- "for",
- "forEach",
- "forceRedraw",
- "form",
- "formAction",
- "formData",
- "formEnctype",
- "formMethod",
- "formNoValidate",
- "formTarget",
- "format",
- "formatToParts",
- "forms",
- "forward",
- "forwardX",
- "forwardY",
- "forwardZ",
- "fr",
- "frame",
- "frameBorder",
- "frameElement",
- "frameSpacing",
- "framebufferRenderbuffer",
- "framebufferTexture2D",
- "frames",
- "freeSpace",
- "freeze",
- "frequency",
- "frequencyBinCount",
- "from",
- "fromCharCode",
- "fromCodePoint",
- "fromElement",
- "frontFace",
- "fround",
- "fullScreen",
- "fullscreen",
- "fullscreenElement",
- "fullscreenEnabled",
- "fx",
- "fy",
- "gain",
- "gamepad",
- "gamma",
- "gap",
- "genderIdentity",
- "generateKey",
- "generateMipmap",
- "generateRequest",
- "geolocation",
- "gestureObject",
- "get",
- "getActiveAttrib",
- "getActiveUniform",
- "getAdjacentText",
- "getAll",
- "getAllResponseHeaders",
- "getAsFile",
- "getAsString",
- "getAttachedShaders",
- "getAttribLocation",
- "getAttribute",
- "getAttributeNS",
- "getAttributeNames",
- "getAttributeNode",
- "getAttributeNodeNS",
- "getAudioTracks",
- "getBBox",
- "getBattery",
- "getBlob",
- "getBookmark",
- "getBoundingClientRect",
- "getBounds",
- "getBufferParameter",
- "getByteFrequencyData",
- "getByteTimeDomainData",
- "getCSSCanvasContext",
- "getCTM",
- "getCandidateWindowClientRect",
- "getCanonicalLocales",
- "getChannelData",
- "getCharNumAtPosition",
- "getClientRect",
- "getClientRects",
- "getCompositionAlternatives",
- "getComputedStyle",
- "getComputedTextLength",
- "getConfiguration",
- "getContext",
- "getContextAttributes",
- "getCounterValue",
- "getCueAsHTML",
- "getCueById",
- "getCurrentPosition",
- "getCurrentTime",
- "getData",
- "getDatabaseNames",
- "getDate",
- "getDay",
- "getDefaultComputedStyle",
- "getDestinationInsertionPoints",
- "getDetails",
- "getDevices",
- "getDisplayMedia",
- "getDistributedNodes",
- "getEditable",
- "getElementById",
- "getElementsByClassName",
- "getElementsByName",
- "getElementsByTagName",
- "getElementsByTagNameNS",
- "getEnclosureList",
- "getEndPositionOfChar",
- "getEntries",
- "getEntriesByName",
- "getEntriesByType",
- "getError",
- "getExtension",
- "getExtentOfChar",
- "getFeature",
- "getFile",
- "getFloat32",
- "getFloat64",
- "getFloatFrequencyData",
- "getFloatTimeDomainData",
- "getFloatValue",
- "getFramebufferAttachmentParameter",
- "getFrequencyResponse",
- "getFullYear",
- "getGamepads",
- "getHours",
- "getIdentityAssertion",
- "getImageData",
- "getInt16",
- "getInt32",
- "getInt8",
- "getIntersectionList",
- "getIsInstalled",
- "getItem",
- "getItems",
- "getKey",
- "getLayoutMap",
- "getLineDash",
- "getLocalStreams",
- "getMarks",
- "getMatchedCSSRules",
- "getMeasures",
- "getMetadata",
- "getMilliseconds",
- "getMinutes",
- "getModifierState",
- "getMonth",
- "getNamedItem",
- "getNamedItemNS",
- "getNotifier",
- "getNumberOfChars",
- "getOutputTimestamp",
- "getOverrideHistoryNavigationMode",
- "getOverrideStyle",
- "getOwnPropertyDescriptor",
- "getOwnPropertyNames",
- "getOwnPropertySymbols",
- "getParameter",
- "getPathSegAtLength",
- "getPointAtLength",
- "getPreference",
- "getPreferenceDefault",
- "getPresentationAttribute",
- "getPreventDefault",
- "getProgramInfoLog",
- "getProgramParameter",
- "getPropertyCSSValue",
- "getPropertyPriority",
- "getPropertyShorthand",
- "getPropertyValue",
- "getPrototypeOf",
- "getRGBColorValue",
- "getRandomValues",
- "getRangeAt",
- "getReader",
- "getReceivers",
- "getRectValue",
- "getRegistration",
- "getRegistrations",
- "getRemoteStreams",
- "getRenderbufferParameter",
- "getResponseHeader",
- "getRoot",
- "getRootNode",
- "getRotationOfChar",
- "getSVGDocument",
- "getScreenCTM",
- "getSeconds",
- "getSelection",
- "getSenders",
- "getShaderInfoLog",
- "getShaderParameter",
- "getShaderPrecisionFormat",
- "getShaderSource",
- "getSimpleDuration",
- "getSiteIcons",
- "getSources",
- "getSpeculativeParserUrls",
- "getStartPositionOfChar",
- "getStartTime",
- "getStats",
- "getStorageUpdates",
- "getStreamById",
- "getStringValue",
- "getSubStringLength",
- "getSubscription",
- "getSupportedConstraints",
- "getSupportedExtensions",
- "getTexParameter",
- "getTime",
- "getTimezoneOffset",
- "getTotalLength",
- "getTrackById",
- "getTracks",
- "getTransceivers",
- "getTransformToElement",
- "getUTCDate",
- "getUTCDay",
- "getUTCFullYear",
- "getUTCHours",
- "getUTCMilliseconds",
- "getUTCMinutes",
- "getUTCMonth",
- "getUTCSeconds",
- "getUint16",
- "getUint32",
- "getUint8",
- "getUniform",
- "getUniformLocation",
- "getUserMedia",
- "getVRDisplays",
- "getValues",
- "getVarDate",
- "getVariableValue",
- "getVertexAttrib",
- "getVertexAttribOffset",
- "getVideoPlaybackQuality",
- "getVideoTracks",
- "getVoices",
- "getWakeLockState",
- "getWriter",
- "getYear",
- "givenName",
- "global",
- "globalAlpha",
- "globalCompositeOperation",
- "globalThis",
- "glyphOrientationHorizontal",
- "glyphOrientationVertical",
- "glyphRef",
- "go",
- "gradientTransform",
- "gradientUnits",
- "grammars",
- "green",
- "grid",
- "grid-area",
- "grid-auto-columns",
- "grid-auto-flow",
- "grid-auto-rows",
- "grid-column",
- "grid-column-end",
- "grid-column-gap",
- "grid-column-start",
- "grid-gap",
- "grid-row",
- "grid-row-end",
- "grid-row-gap",
- "grid-row-start",
- "grid-template",
- "grid-template-areas",
- "grid-template-columns",
- "grid-template-rows",
- "gridArea",
- "gridAutoColumns",
- "gridAutoFlow",
- "gridAutoRows",
- "gridColumn",
- "gridColumnEnd",
- "gridColumnGap",
- "gridColumnStart",
- "gridGap",
- "gridRow",
- "gridRowEnd",
- "gridRowGap",
- "gridRowStart",
- "gridTemplate",
- "gridTemplateAreas",
- "gridTemplateColumns",
- "gridTemplateRows",
- "group",
- "groupCollapsed",
- "groupEnd",
- "hardwareConcurrency",
- "has",
- "hasAttribute",
- "hasAttributeNS",
- "hasAttributes",
- "hasBeenActive",
- "hasChildNodes",
- "hasComposition",
- "hasExtension",
- "hasFeature",
- "hasFocus",
- "hasLayout",
- "hasOwnProperty",
- "hasPointerCapture",
- "hasReading",
- "hasStorageAccess",
- "hash",
- "head",
- "headers",
- "heading",
- "height",
- "hidden",
- "hide",
- "hideFocus",
- "high",
- "hint",
- "history",
- "honorificPrefix",
- "honorificSuffix",
- "horizontalOverflow",
- "host",
- "hostname",
- "href",
- "hreflang",
- "hspace",
- "html5TagCheckInerface",
- "htmlFor",
- "htmlText",
- "httpEquiv",
- "hwTimestamp",
- "hyphens",
- "hypot",
- "iccId",
- "iceConnectionState",
- "iceGatheringState",
- "icon",
- "id",
- "identifier",
- "identity",
- "idpLoginUrl",
- "ignoreBOM",
- "ignoreCase",
- "image-orientation",
- "image-rendering",
- "imageOrientation",
- "imageRendering",
- "imageSizes",
- "imageSrcset",
- "images",
- "ime-mode",
- "imeMode",
- "implementation",
- "import",
- "importKey",
- "importNode",
- "importStylesheet",
- "imports",
- "impp",
- "imul",
- "in1",
- "in2",
- "inBandMetadataTrackDispatchType",
- "inRange",
- "includes",
- "incremental",
- "indeterminate",
- "index",
- "indexNames",
- "indexOf",
- "indexedDB",
- "inertiaDestinationX",
- "inertiaDestinationY",
- "info",
- "init",
- "initAnimationEvent",
- "initBeforeLoadEvent",
- "initClipboardEvent",
- "initCloseEvent",
- "initCommandEvent",
- "initCompositionEvent",
- "initCustomEvent",
- "initData",
- "initDeviceMotionEvent",
- "initDeviceOrientationEvent",
- "initDragEvent",
- "initErrorEvent",
- "initEvent",
- "initFocusEvent",
- "initGestureEvent",
- "initHashChangeEvent",
- "initKeyEvent",
- "initKeyboardEvent",
- "initMSManipulationEvent",
- "initMessageEvent",
- "initMouseEvent",
- "initMouseScrollEvent",
- "initMouseWheelEvent",
- "initMutationEvent",
- "initNSMouseEvent",
- "initOverflowEvent",
- "initPageEvent",
- "initPageTransitionEvent",
- "initPointerEvent",
- "initPopStateEvent",
- "initProgressEvent",
- "initScrollAreaEvent",
- "initSimpleGestureEvent",
- "initStorageEvent",
- "initTextEvent",
- "initTimeEvent",
- "initTouchEvent",
- "initTransitionEvent",
- "initUIEvent",
- "initWebKitAnimationEvent",
- "initWebKitTransitionEvent",
- "initWebKitWheelEvent",
- "initWheelEvent",
- "initialTime",
- "initialize",
- "initiatorType",
- "inline-size",
- "inlineSize",
- "inner",
- "innerHTML",
- "innerHeight",
- "innerText",
- "innerWidth",
- "input",
- "inputBuffer",
- "inputEncoding",
- "inputMethod",
- "inputMode",
- "insertAdjacentElement",
- "insertAdjacentHTML",
- "insertAdjacentText",
- "insertBefore",
- "insertCell",
- "insertData",
- "insertItemBefore",
- "insertNode",
- "insertRow",
- "insertRule",
- "inset",
- "inset-block",
- "inset-block-end",
- "inset-block-start",
- "inset-inline",
- "inset-inline-end",
- "inset-inline-start",
- "insetBlock",
- "insetBlockEnd",
- "insetBlockStart",
- "insetInline",
- "insetInlineEnd",
- "insetInlineStart",
- "install",
- "installChrome",
- "installState",
- "instanceRoot",
- "instantiate",
- "instantiateStreaming",
- "integrity",
- "intercept",
- "interimResults",
- "internalSubset",
- "intersectsNode",
- "interval",
- "invalidIteratorState",
- "inverse",
- "invertSelf",
- "is",
- "is2D",
- "isActive",
- "isAlternate",
- "isArray",
- "isBingCurrentSearchDefault",
- "isBuffer",
- "isCandidateWindowVisible",
- "isChar",
- "isCollapsed",
- "isComposing",
- "isConnected",
- "isContentEditable",
- "isContentHandlerRegistered",
- "isContextLost",
- "isDefaultNamespace",
- "isDisabled",
- "isEnabled",
- "isEqual",
- "isEqualNode",
- "isExtensible",
- "isFinite",
- "isFramebuffer",
- "isFrozen",
- "isGenerator",
- "isId",
- "isIdentity",
- "isInjected",
- "isInstalled",
- "isInteger",
- "isLockFree",
- "isMap",
- "isMultiLine",
- "isNaN",
- "isOpen",
- "isPointInFill",
- "isPointInPath",
- "isPointInRange",
- "isPointInStroke",
- "isPrefAlternate",
- "isPrimary",
- "isProgram",
- "isPropertyImplicit",
- "isProtocolHandlerRegistered",
- "isPrototypeOf",
- "isRenderbuffer",
- "isSafeInteger",
- "isSameNode",
- "isSealed",
- "isSecureContext",
- "isShader",
- "isSupported",
- "isTextEdit",
- "isTexture",
- "isTrusted",
- "isTypeSupported",
- "isView",
- "isolation",
- "italics",
- "item",
- "itemId",
- "itemProp",
- "itemRef",
- "itemScope",
- "itemType",
- "itemValue",
- "items",
- "iterateNext",
- "iterator",
- "javaEnabled",
- "jobTitle",
- "join",
- "jsHeapSizeLimit",
- "json",
- "justify-content",
- "justify-items",
- "justify-self",
- "justifyContent",
- "justifyItems",
- "justifySelf",
- "k1",
- "k2",
- "k3",
- "k4",
- "kernelMatrix",
- "kernelUnitLengthX",
- "kernelUnitLengthY",
- "kerning",
- "key",
- "keyCode",
- "keyFor",
- "keyIdentifier",
- "keyLightEnabled",
- "keyLocation",
- "keyPath",
- "keySystem",
- "keyText",
- "keyUsage",
- "keyboard",
- "keys",
- "keytype",
- "kind",
- "knee",
- "label",
- "labels",
- "lang",
- "language",
- "languages",
- "largeArcFlag",
- "lastChild",
- "lastElementChild",
- "lastEventId",
- "lastIndex",
- "lastIndexOf",
- "lastMatch",
- "lastMessageSubject",
- "lastMessageType",
- "lastModified",
- "lastModifiedDate",
- "lastPage",
- "lastParen",
- "lastState",
- "lastStyleSheetSet",
- "latitude",
- "layerX",
- "layerY",
- "layoutFlow",
- "layoutGrid",
- "layoutGridChar",
- "layoutGridLine",
- "layoutGridMode",
- "layoutGridType",
- "lbound",
- "left",
- "leftContext",
- "leftMargin",
- "leftProjectionMatrix",
- "leftViewMatrix",
- "length",
- "lengthAdjust",
- "lengthComputable",
- "letter-spacing",
- "letterSpacing",
- "level",
- "lighting-color",
- "lightingColor",
- "limitingConeAngle",
- "line",
- "line-height",
- "lineAlign",
- "lineBreak",
- "lineCap",
- "lineDashOffset",
- "lineHeight",
- "lineJoin",
- "lineNumber",
- "lineTo",
- "lineWidth",
- "linearAcceleration",
- "linearRampToValueAtTime",
- "linearVelocity",
- "lineno",
- "lines",
- "link",
- "linkColor",
- "linkProgram",
- "links",
- "list",
- "list-style",
- "list-style-image",
- "list-style-position",
- "list-style-type",
- "listStyle",
- "listStyleImage",
- "listStylePosition",
- "listStyleType",
- "listener",
- "load",
- "loadEventEnd",
- "loadEventStart",
- "loadTimes",
- "loaded",
- "localDescription",
- "localName",
- "localStorage",
- "locale",
- "localeCompare",
- "location",
- "locationbar",
- "lock",
- "locked",
- "lockedFile",
- "locks",
- "log",
- "log10",
- "log1p",
- "log2",
- "logicalXDPI",
- "logicalYDPI",
- "longDesc",
- "longitude",
- "lookupNamespaceURI",
- "lookupPrefix",
- "loop",
- "loopEnd",
- "loopStart",
- "looping",
- "low",
- "lower",
- "lowerBound",
- "lowerOpen",
- "lowsrc",
- "m11",
- "m12",
- "m13",
- "m14",
- "m21",
- "m22",
- "m23",
- "m24",
- "m31",
- "m32",
- "m33",
- "m34",
- "m41",
- "m42",
- "m43",
- "m44",
- "manifest",
- "map",
- "mapping",
- "margin",
- "margin-block",
- "margin-block-end",
- "margin-block-start",
- "margin-bottom",
- "margin-inline",
- "margin-inline-end",
- "margin-inline-start",
- "margin-left",
- "margin-right",
- "margin-top",
- "marginBlock",
- "marginBlockEnd",
- "marginBlockStart",
- "marginBottom",
- "marginHeight",
- "marginInline",
- "marginInlineEnd",
- "marginInlineStart",
- "marginLeft",
- "marginRight",
- "marginTop",
- "marginWidth",
- "mark",
- "marker",
- "marker-end",
- "marker-mid",
- "marker-offset",
- "marker-start",
- "markerEnd",
- "markerHeight",
- "markerMid",
- "markerOffset",
- "markerStart",
- "markerUnits",
- "markerWidth",
- "marks",
- "mask",
- "mask-clip",
- "mask-composite",
- "mask-image",
- "mask-mode",
- "mask-origin",
- "mask-position",
- "mask-position-x",
- "mask-position-y",
- "mask-repeat",
- "mask-size",
- "mask-type",
- "maskClip",
- "maskComposite",
- "maskContentUnits",
- "maskImage",
- "maskMode",
- "maskOrigin",
- "maskPosition",
- "maskPositionX",
- "maskPositionY",
- "maskRepeat",
- "maskSize",
- "maskType",
- "maskUnits",
- "match",
- "matchAll",
- "matchMedia",
- "matchMedium",
- "matches",
- "matrix",
- "matrixTransform",
- "max",
- "max-block-size",
- "max-height",
- "max-inline-size",
- "max-width",
- "maxAlternatives",
- "maxBlockSize",
- "maxChannelCount",
- "maxConnectionsPerServer",
- "maxDecibels",
- "maxDistance",
- "maxHeight",
- "maxInlineSize",
- "maxLength",
- "maxTouchPoints",
- "maxValue",
- "maxWidth",
- "maxZoom",
- "measure",
- "measureText",
- "media",
- "mediaCapabilities",
- "mediaDevices",
- "mediaElement",
- "mediaGroup",
- "mediaKeys",
- "mediaSession",
- "mediaText",
- "meetOrSlice",
- "memory",
- "menubar",
- "mergeAttributes",
- "message",
- "messageClass",
- "messageHandlers",
- "metaKey",
- "metadata",
- "method",
- "mimeType",
- "mimeTypes",
- "min",
- "min-block-size",
- "min-height",
- "min-inline-size",
- "min-width",
- "minBlockSize",
- "minDecibels",
- "minHeight",
- "minInlineSize",
- "minLength",
- "minValue",
- "minWidth",
- "minZoom",
- "miterLimit",
- "mix-blend-mode",
- "mixBlendMode",
- "mode",
- "modify",
- "mount",
- "move",
- "moveBy",
- "moveEnd",
- "moveFirst",
- "moveFocusDown",
- "moveFocusLeft",
- "moveFocusRight",
- "moveFocusUp",
- "moveNext",
- "moveRow",
- "moveStart",
- "moveTo",
- "moveToBookmark",
- "moveToElementText",
- "moveToPoint",
- "movementX",
- "movementY",
- "mozAdd",
- "mozAnimationStartTime",
- "mozAnon",
- "mozApps",
- "mozAudioCaptured",
- "mozAudioChannelType",
- "mozAutoplayEnabled",
- "mozCancelAnimationFrame",
- "mozCancelFullScreen",
- "mozCancelRequestAnimationFrame",
- "mozCaptureStream",
- "mozCaptureStreamUntilEnded",
- "mozClearDataAt",
- "mozContact",
- "mozContacts",
- "mozCreateFileHandle",
- "mozCurrentTransform",
- "mozCurrentTransformInverse",
- "mozCursor",
- "mozDash",
- "mozDashOffset",
- "mozDecodedFrames",
- "mozExitPointerLock",
- "mozFillRule",
- "mozFragmentEnd",
- "mozFrameDelay",
- "mozFullScreen",
- "mozFullScreenElement",
- "mozFullScreenEnabled",
- "mozGetAll",
- "mozGetAllKeys",
- "mozGetAsFile",
- "mozGetDataAt",
- "mozGetMetadata",
- "mozGetUserMedia",
- "mozHasAudio",
- "mozHasItem",
- "mozHidden",
- "mozImageSmoothingEnabled",
- "mozIndexedDB",
- "mozInnerScreenX",
- "mozInnerScreenY",
- "mozInputSource",
- "mozIsTextField",
- "mozItem",
- "mozItemCount",
- "mozItems",
- "mozLength",
- "mozLockOrientation",
- "mozMatchesSelector",
- "mozMovementX",
- "mozMovementY",
- "mozOpaque",
- "mozOrientation",
- "mozPaintCount",
- "mozPaintedFrames",
- "mozParsedFrames",
- "mozPay",
- "mozPointerLockElement",
- "mozPresentedFrames",
- "mozPreservesPitch",
- "mozPressure",
- "mozPrintCallback",
- "mozRTCIceCandidate",
- "mozRTCPeerConnection",
- "mozRTCSessionDescription",
- "mozRemove",
- "mozRequestAnimationFrame",
- "mozRequestFullScreen",
- "mozRequestPointerLock",
- "mozSetDataAt",
- "mozSetImageElement",
- "mozSourceNode",
- "mozSrcObject",
- "mozSystem",
- "mozTCPSocket",
- "mozTextStyle",
- "mozTypesAt",
- "mozUnlockOrientation",
- "mozUserCancelled",
- "mozVisibilityState",
- "msAnimation",
- "msAnimationDelay",
- "msAnimationDirection",
- "msAnimationDuration",
- "msAnimationFillMode",
- "msAnimationIterationCount",
- "msAnimationName",
- "msAnimationPlayState",
- "msAnimationStartTime",
- "msAnimationTimingFunction",
- "msBackfaceVisibility",
- "msBlockProgression",
- "msCSSOMElementFloatMetrics",
- "msCaching",
- "msCachingEnabled",
- "msCancelRequestAnimationFrame",
- "msCapsLockWarningOff",
- "msClearImmediate",
- "msClose",
- "msContentZoomChaining",
- "msContentZoomFactor",
- "msContentZoomLimit",
- "msContentZoomLimitMax",
- "msContentZoomLimitMin",
- "msContentZoomSnap",
- "msContentZoomSnapPoints",
- "msContentZoomSnapType",
- "msContentZooming",
- "msConvertURL",
- "msCrypto",
- "msDoNotTrack",
- "msElementsFromPoint",
- "msElementsFromRect",
- "msExitFullscreen",
- "msExtendedCode",
- "msFillRule",
- "msFirstPaint",
- "msFlex",
- "msFlexAlign",
- "msFlexDirection",
- "msFlexFlow",
- "msFlexItemAlign",
- "msFlexLinePack",
- "msFlexNegative",
- "msFlexOrder",
- "msFlexPack",
- "msFlexPositive",
- "msFlexPreferredSize",
- "msFlexWrap",
- "msFlowFrom",
- "msFlowInto",
- "msFontFeatureSettings",
- "msFullscreenElement",
- "msFullscreenEnabled",
- "msGetInputContext",
- "msGetRegionContent",
- "msGetUntransformedBounds",
- "msGraphicsTrustStatus",
- "msGridColumn",
- "msGridColumnAlign",
- "msGridColumnSpan",
- "msGridColumns",
- "msGridRow",
- "msGridRowAlign",
- "msGridRowSpan",
- "msGridRows",
- "msHidden",
- "msHighContrastAdjust",
- "msHyphenateLimitChars",
- "msHyphenateLimitLines",
- "msHyphenateLimitZone",
- "msHyphens",
- "msImageSmoothingEnabled",
- "msImeAlign",
- "msIndexedDB",
- "msInterpolationMode",
- "msIsStaticHTML",
- "msKeySystem",
- "msKeys",
- "msLaunchUri",
- "msLockOrientation",
- "msManipulationViewsEnabled",
- "msMatchMedia",
- "msMatchesSelector",
- "msMaxTouchPoints",
- "msOrientation",
- "msOverflowStyle",
- "msPerspective",
- "msPerspectiveOrigin",
- "msPlayToDisabled",
- "msPlayToPreferredSourceUri",
- "msPlayToPrimary",
- "msPointerEnabled",
- "msRegionOverflow",
- "msReleasePointerCapture",
- "msRequestAnimationFrame",
- "msRequestFullscreen",
- "msSaveBlob",
- "msSaveOrOpenBlob",
- "msScrollChaining",
- "msScrollLimit",
- "msScrollLimitXMax",
- "msScrollLimitXMin",
- "msScrollLimitYMax",
- "msScrollLimitYMin",
- "msScrollRails",
- "msScrollSnapPointsX",
- "msScrollSnapPointsY",
- "msScrollSnapType",
- "msScrollSnapX",
- "msScrollSnapY",
- "msScrollTranslation",
- "msSetImmediate",
- "msSetMediaKeys",
- "msSetPointerCapture",
- "msTextCombineHorizontal",
- "msTextSizeAdjust",
- "msToBlob",
- "msTouchAction",
- "msTouchSelect",
- "msTraceAsyncCallbackCompleted",
- "msTraceAsyncCallbackStarting",
- "msTraceAsyncOperationCompleted",
- "msTraceAsyncOperationStarting",
- "msTransform",
- "msTransformOrigin",
- "msTransformStyle",
- "msTransition",
- "msTransitionDelay",
- "msTransitionDuration",
- "msTransitionProperty",
- "msTransitionTimingFunction",
- "msUnlockOrientation",
- "msUpdateAsyncCallbackRelation",
- "msUserSelect",
- "msVisibilityState",
- "msWrapFlow",
- "msWrapMargin",
- "msWrapThrough",
- "msWriteProfilerMark",
- "msZoom",
- "msZoomTo",
- "mt",
- "multiEntry",
- "multiSelectionObj",
- "multiline",
- "multiple",
- "multiply",
- "multiplySelf",
- "mutableFile",
- "muted",
- "n",
- "name",
- "nameProp",
- "namedItem",
- "namedRecordset",
- "names",
- "namespaceURI",
- "namespaces",
- "naturalHeight",
- "naturalWidth",
- "navigate",
- "navigation",
- "navigationMode",
- "navigationStart",
- "navigator",
- "near",
- "nearestViewportElement",
- "negative",
- "netscape",
- "networkState",
- "newScale",
- "newTranslate",
- "newURL",
- "newValue",
- "newValueSpecifiedUnits",
- "newVersion",
- "newhome",
- "next",
- "nextElementSibling",
- "nextNode",
- "nextPage",
- "nextSibling",
- "nickname",
- "noHref",
- "noModule",
- "noResize",
- "noShade",
- "noValidate",
- "noWrap",
- "nodeName",
- "nodeType",
- "nodeValue",
- "nonce",
- "normalize",
- "normalizedPathSegList",
- "notationName",
- "notations",
- "note",
- "noteGrainOn",
- "noteOff",
- "noteOn",
- "notify",
- "now",
- "numOctaves",
- "number",
- "numberOfChannels",
- "numberOfInputs",
- "numberOfItems",
- "numberOfOutputs",
- "numberValue",
- "oMatchesSelector",
- "object",
- "object-fit",
- "object-position",
- "objectFit",
- "objectPosition",
- "objectStore",
- "objectStoreNames",
- "observe",
- "observedAttributes",
- "of",
- "offscreenBuffering",
- "offset",
- "offsetDistance",
- "offsetHeight",
- "offsetLeft",
- "offsetNode",
- "offsetParent",
- "offsetPath",
- "offsetRotate",
- "offsetTop",
- "offsetWidth",
- "offsetX",
- "offsetY",
- "ok",
- "oldURL",
- "oldValue",
- "oldVersion",
- "olderShadowRoot",
- "onLine",
- "onabort",
- "onabsolutedeviceorientation",
- "onactivate",
- "onactive",
- "onaddsourcebuffer",
- "onaddstream",
- "onaddtrack",
- "onafterprint",
- "onafterscriptexecute",
- "onafterupdate",
- "onanimationcancel",
- "onanimationend",
- "onanimationiteration",
- "onanimationstart",
- "onappinstalled",
- "onaudioend",
- "onaudioprocess",
- "onaudiostart",
- "onautocomplete",
- "onautocompleteerror",
- "onauxclick",
- "onbeforeactivate",
- "onbeforecopy",
- "onbeforecut",
- "onbeforedeactivate",
- "onbeforeeditfocus",
- "onbeforeinstallprompt",
- "onbeforepaste",
- "onbeforeprint",
- "onbeforescriptexecute",
- "onbeforeunload",
- "onbeforeupdate",
- "onblocked",
- "onblur",
- "onbounce",
- "onboundary",
- "oncached",
- "oncancel",
- "oncandidatewindowhide",
- "oncandidatewindowshow",
- "oncandidatewindowupdate",
- "oncanplay",
- "oncanplaythrough",
- "once",
- "oncellchange",
- "onchange",
- "onchargingchange",
- "onchargingtimechange",
- "onchecking",
- "onclick",
- "onclose",
- "oncompassneedscalibration",
- "oncomplete",
- "onconnect",
- "onconnecting",
- "onconnectionstatechange",
- "oncontextmenu",
- "oncontrollerchange",
- "oncontrolselect",
- "oncopy",
- "oncuechange",
- "oncut",
- "ondataavailable",
- "ondatachannel",
- "ondatasetchanged",
- "ondatasetcomplete",
- "ondblclick",
- "ondeactivate",
- "ondevicechange",
- "ondevicelight",
- "ondevicemotion",
- "ondeviceorientation",
- "ondeviceorientationabsolute",
- "ondeviceproximity",
- "ondischargingtimechange",
- "ondisconnect",
- "ondisplay",
- "ondownloading",
- "ondrag",
- "ondragend",
- "ondragenter",
- "ondragexit",
- "ondragleave",
- "ondragover",
- "ondragstart",
- "ondrop",
- "ondurationchange",
- "onemptied",
- "onencrypted",
- "onend",
- "onended",
- "onenter",
- "onenterpictureinpicture",
- "onerror",
- "onerrorupdate",
- "onexit",
- "onfilterchange",
- "onfinish",
- "onfocus",
- "onfocusin",
- "onfocusout",
- "onfreeze",
- "onfullscreenchange",
- "onfullscreenerror",
- "ongesturechange",
- "ongestureend",
- "ongesturestart",
- "ongotpointercapture",
- "onhashchange",
- "onhelp",
- "onicecandidate",
- "oniceconnectionstatechange",
- "onicegatheringstatechange",
- "oninactive",
- "oninput",
- "oninvalid",
- "onkeydown",
- "onkeypress",
- "onkeyup",
- "onlanguagechange",
- "onlayoutcomplete",
- "onleavepictureinpicture",
- "onlevelchange",
- "onload",
- "onloadeddata",
- "onloadedmetadata",
- "onloadend",
- "onloading",
- "onloadingdone",
- "onloadingerror",
- "onloadstart",
- "onlosecapture",
- "onlostpointercapture",
- "only",
- "onmark",
- "onmessage",
- "onmessageerror",
- "onmousedown",
- "onmouseenter",
- "onmouseleave",
- "onmousemove",
- "onmouseout",
- "onmouseover",
- "onmouseup",
- "onmousewheel",
- "onmove",
- "onmoveend",
- "onmovestart",
- "onmozfullscreenchange",
- "onmozfullscreenerror",
- "onmozorientationchange",
- "onmozpointerlockchange",
- "onmozpointerlockerror",
- "onmscontentzoom",
- "onmsfullscreenchange",
- "onmsfullscreenerror",
- "onmsgesturechange",
- "onmsgesturedoubletap",
- "onmsgestureend",
- "onmsgesturehold",
- "onmsgesturestart",
- "onmsgesturetap",
- "onmsgotpointercapture",
- "onmsinertiastart",
- "onmslostpointercapture",
- "onmsmanipulationstatechanged",
- "onmsneedkey",
- "onmsorientationchange",
- "onmspointercancel",
- "onmspointerdown",
- "onmspointerenter",
- "onmspointerhover",
- "onmspointerleave",
- "onmspointermove",
- "onmspointerout",
- "onmspointerover",
- "onmspointerup",
- "onmssitemodejumplistitemremoved",
- "onmsthumbnailclick",
- "onnegotiationneeded",
- "onnomatch",
- "onnoupdate",
- "onobsolete",
- "onoffline",
- "ononline",
- "onopen",
- "onorientationchange",
- "onpagechange",
- "onpagehide",
- "onpageshow",
- "onpaste",
- "onpause",
- "onplay",
- "onplaying",
- "onpluginstreamstart",
- "onpointercancel",
- "onpointerdown",
- "onpointerenter",
- "onpointerleave",
- "onpointerlockchange",
- "onpointerlockerror",
- "onpointermove",
- "onpointerout",
- "onpointerover",
- "onpointerup",
- "onpopstate",
- "onprogress",
- "onpropertychange",
- "onratechange",
- "onreading",
- "onreadystatechange",
- "onrejectionhandled",
- "onremovesourcebuffer",
- "onremovestream",
- "onremovetrack",
- "onreset",
- "onresize",
- "onresizeend",
- "onresizestart",
- "onresourcetimingbufferfull",
- "onresult",
- "onresume",
- "onrowenter",
- "onrowexit",
- "onrowsdelete",
- "onrowsinserted",
- "onscroll",
- "onsearch",
- "onseeked",
- "onseeking",
- "onselect",
- "onselectionchange",
- "onselectstart",
- "onshow",
- "onsignalingstatechange",
- "onsoundend",
- "onsoundstart",
- "onsourceclose",
- "onsourceclosed",
- "onsourceended",
- "onsourceopen",
- "onspeechend",
- "onspeechstart",
- "onstalled",
- "onstart",
- "onstatechange",
- "onstop",
- "onstorage",
- "onstoragecommit",
- "onsubmit",
- "onsuccess",
- "onsuspend",
- "ontextinput",
- "ontimeout",
- "ontimeupdate",
- "ontoggle",
- "ontouchcancel",
- "ontouchend",
- "ontouchmove",
- "ontouchstart",
- "ontrack",
- "ontransitioncancel",
- "ontransitionend",
- "ontransitionrun",
- "ontransitionstart",
- "onunhandledrejection",
- "onunload",
- "onupdateready",
- "onupgradeneeded",
- "onuserproximity",
- "onversionchange",
- "onvisibilitychange",
- "onvoiceschanged",
- "onvolumechange",
- "onvrdisplayactivate",
- "onvrdisplayconnect",
- "onvrdisplaydeactivate",
- "onvrdisplaydisconnect",
- "onvrdisplaypresentchange",
- "onwaiting",
- "onwaitingforkey",
- "onwarning",
- "onwebkitanimationend",
- "onwebkitanimationiteration",
- "onwebkitanimationstart",
- "onwebkitcurrentplaybacktargetiswirelesschanged",
- "onwebkitfullscreenchange",
- "onwebkitfullscreenerror",
- "onwebkitkeyadded",
- "onwebkitkeyerror",
- "onwebkitkeymessage",
- "onwebkitneedkey",
- "onwebkitorientationchange",
- "onwebkitplaybacktargetavailabilitychanged",
- "onwebkitpointerlockchange",
- "onwebkitpointerlockerror",
- "onwebkitresourcetimingbufferfull",
- "onwebkittransitionend",
- "onwheel",
- "onzoom",
- "opacity",
- "open",
- "openCursor",
- "openDatabase",
- "openKeyCursor",
- "opener",
- "opera",
- "operationType",
- "operator",
- "opr",
- "optimum",
- "options",
- "or",
- "order",
- "orderX",
- "orderY",
- "ordered",
- "org",
- "orient",
- "orientAngle",
- "orientType",
- "orientation",
- "orientationX",
- "orientationY",
- "orientationZ",
- "origin",
- "originalTarget",
- "orphans",
- "oscpu",
- "outerHTML",
- "outerHeight",
- "outerText",
- "outerWidth",
- "outline",
- "outline-color",
- "outline-offset",
- "outline-style",
- "outline-width",
- "outlineColor",
- "outlineOffset",
- "outlineStyle",
- "outlineWidth",
- "outputBuffer",
- "overflow",
- "overflow-anchor",
- "overflow-wrap",
- "overflow-x",
- "overflow-y",
- "overflowAnchor",
- "overflowWrap",
- "overflowX",
- "overflowY",
- "overrideMimeType",
- "oversample",
- "overscroll-behavior",
- "overscroll-behavior-x",
- "overscroll-behavior-y",
- "overscrollBehavior",
- "overscrollBehaviorX",
- "overscrollBehaviorY",
- "ownKeys",
- "ownerDocument",
- "ownerElement",
- "ownerNode",
- "ownerRule",
- "ownerSVGElement",
- "owningElement",
- "p1",
- "p2",
- "p3",
- "p4",
- "pad",
- "padEnd",
- "padStart",
- "padding",
- "padding-block",
- "padding-block-end",
- "padding-block-start",
- "padding-bottom",
- "padding-inline",
- "padding-inline-end",
- "padding-inline-start",
- "padding-left",
- "padding-right",
- "padding-top",
- "paddingBlock",
- "paddingBlockEnd",
- "paddingBlockStart",
- "paddingBottom",
- "paddingInline",
- "paddingInlineEnd",
- "paddingInlineStart",
- "paddingLeft",
- "paddingRight",
- "paddingTop",
- "page",
- "page-break-after",
- "page-break-before",
- "page-break-inside",
- "pageBreakAfter",
- "pageBreakBefore",
- "pageBreakInside",
- "pageCount",
- "pageLeft",
- "pageTop",
- "pageX",
- "pageXOffset",
- "pageY",
- "pageYOffset",
- "pages",
- "paint-order",
- "paintOrder",
- "paintRequests",
- "paintType",
- "palette",
- "pan",
- "panningModel",
- "parent",
- "parentElement",
- "parentNode",
- "parentRule",
- "parentStyleSheet",
- "parentTextEdit",
- "parentWindow",
- "parse",
- "parseFloat",
- "parseFromString",
- "parseInt",
- "part",
- "participants",
- "passive",
- "password",
- "pasteHTML",
- "path",
- "pathLength",
- "pathSegList",
- "pathSegType",
- "pathSegTypeAsLetter",
- "pathname",
- "pattern",
- "patternContentUnits",
- "patternMismatch",
- "patternTransform",
- "patternUnits",
- "pause",
- "pauseAnimations",
- "pauseOnExit",
- "paused",
- "peerIdentity",
- "pending",
- "pendingLocalDescription",
- "pendingRemoteDescription",
- "performance",
- "permission",
- "permissions",
- "persist",
- "persisted",
- "personalbar",
- "perspective",
- "perspective-origin",
- "perspectiveOrigin",
- "phoneticFamilyName",
- "phoneticGivenName",
- "photo",
- "pictureInPictureElement",
- "pictureInPictureEnabled",
- "ping",
- "pipeThrough",
- "pipeTo",
- "pitch",
- "pixelBottom",
- "pixelDepth",
- "pixelHeight",
- "pixelLeft",
- "pixelRight",
- "pixelStorei",
- "pixelTop",
- "pixelUnitToMillimeterX",
- "pixelUnitToMillimeterY",
- "pixelWidth",
- "place-content",
- "place-items",
- "place-self",
- "placeContent",
- "placeItems",
- "placeSelf",
- "placeholder",
- "platform",
- "play",
- "playState",
- "playbackRate",
- "playbackState",
- "playbackTime",
- "played",
- "plugins",
- "pluginspage",
- "pname",
- "pointer-events",
- "pointerBeforeReferenceNode",
- "pointerEnabled",
- "pointerEvents",
- "pointerId",
- "pointerLockElement",
- "pointerType",
- "points",
- "pointsAtX",
- "pointsAtY",
- "pointsAtZ",
- "polygonOffset",
- "pop",
- "populateMatrix",
- "popupWindowFeatures",
- "popupWindowName",
- "popupWindowURI",
- "port",
- "port1",
- "port2",
- "ports",
- "posBottom",
- "posHeight",
- "posLeft",
- "posRight",
- "posTop",
- "posWidth",
- "pose",
- "position",
- "positionAlign",
- "positionX",
- "positionY",
- "positionZ",
- "postError",
- "postMessage",
- "poster",
- "pow",
- "powerOff",
- "preMultiplySelf",
- "precision",
- "preferredStyleSheetSet",
- "preferredStylesheetSet",
- "prefix",
- "preload",
- "prepend",
- "presentation",
- "preserveAlpha",
- "preserveAspectRatio",
- "preserveAspectRatioString",
- "pressed",
- "pressure",
- "prevValue",
- "preventDefault",
- "preventExtensions",
- "preventSilentAccess",
- "previousElementSibling",
- "previousNode",
- "previousPage",
- "previousScale",
- "previousSibling",
- "previousTranslate",
- "primaryKey",
- "primitiveType",
- "primitiveUnits",
- "principals",
- "print",
- "privateKey",
- "probablySupportsContext",
- "process",
- "processIceMessage",
- "product",
- "productSub",
- "profile",
- "profileEnd",
- "profiles",
- "prompt",
- "properties",
- "propertyIsEnumerable",
- "propertyName",
- "protocol",
- "protocolLong",
- "prototype",
- "pseudoClass",
- "pseudoElement",
- "publicId",
- "publicKey",
- "published",
- "push",
- "pushNotification",
- "pushState",
- "put",
- "putImageData",
- "quadraticCurveTo",
- "qualifier",
- "quaternion",
- "query",
- "queryCommandEnabled",
- "queryCommandIndeterm",
- "queryCommandState",
- "queryCommandSupported",
- "queryCommandText",
- "queryCommandValue",
- "querySelector",
- "querySelectorAll",
- "queryUsageAndQuota",
- "queueMicrotask",
- "quote",
- "quotes",
- "r",
- "r1",
- "r2",
- "race",
- "radiogroup",
- "radiusX",
- "radiusY",
- "random",
- "range",
- "rangeCount",
- "rangeMax",
- "rangeMin",
- "rangeOffset",
- "rangeOverflow",
- "rangeParent",
- "rangeUnderflow",
- "rate",
- "ratio",
- "raw",
- "read",
- "readAsArrayBuffer",
- "readAsBinaryString",
- "readAsBlob",
- "readAsDataURL",
- "readAsText",
- "readOnly",
- "readPixels",
- "readReportRequested",
- "readText",
- "readable",
- "ready",
- "readyState",
- "reason",
- "reboot",
- "receiver",
- "receivers",
- "recordNumber",
- "recordset",
- "rect",
- "red",
- "redirectCount",
- "redirectEnd",
- "redirectStart",
- "redirected",
- "reduce",
- "reduceRight",
- "reduction",
- "refDistance",
- "refX",
- "refY",
- "referenceNode",
- "referrer",
- "referrerPolicy",
- "refresh",
- "region",
- "regionAnchorX",
- "regionAnchorY",
- "regionId",
- "regions",
- "register",
- "registerContentHandler",
- "registerElement",
- "registerProtocolHandler",
- "reject",
- "rel",
- "relList",
- "relatedNode",
- "relatedTarget",
- "release",
- "releaseCapture",
- "releaseEvents",
- "releasePointerCapture",
- "releaseShaderCompiler",
- "reliable",
- "reload",
- "remainingSpace",
- "remote",
- "remoteDescription",
- "remove",
- "removeAllRanges",
- "removeAttribute",
- "removeAttributeNS",
- "removeAttributeNode",
- "removeBehavior",
- "removeChild",
- "removeCue",
- "removeEventListener",
- "removeFilter",
- "removeImport",
- "removeItem",
- "removeListener",
- "removeNamedItem",
- "removeNamedItemNS",
- "removeNode",
- "removeParameter",
- "removeProperty",
- "removeRange",
- "removeRegion",
- "removeRule",
- "removeSiteSpecificTrackingException",
- "removeSourceBuffer",
- "removeStream",
- "removeTrack",
- "removeVariable",
- "removeWakeLockListener",
- "removeWebWideTrackingException",
- "removedNodes",
- "renderbufferStorage",
- "renderedBuffer",
- "renderingMode",
- "repeat",
- "replace",
- "replaceAdjacentText",
- "replaceChild",
- "replaceData",
- "replaceId",
- "replaceItem",
- "replaceNode",
- "replaceState",
- "replaceSync",
- "replaceTrack",
- "replaceWholeText",
- "replaceWith",
- "reportValidity",
- "request",
- "requestAnimationFrame",
- "requestAutocomplete",
- "requestData",
- "requestDevice",
- "requestFullscreen",
- "requestIdleCallback",
- "requestMIDIAccess",
- "requestMediaKeySystemAccess",
- "requestPermission",
- "requestPictureInPicture",
- "requestPointerLock",
- "requestQuota",
- "requestStart",
- "requestStorageAccess",
- "requestingWindow",
- "required",
- "requiredExtensions",
- "requiredFeatures",
- "reset",
- "resetTransform",
- "resize",
- "resizeBy",
- "resizeTo",
- "resolve",
- "resolvedOptions",
- "response",
- "responseBody",
- "responseEnd",
- "responseStart",
- "responseText",
- "responseType",
- "responseURL",
- "responseXML",
- "restore",
- "result",
- "resultType",
- "resume",
- "returnValue",
- "rev",
- "reverse",
- "reversed",
- "revocable",
- "revokeObjectURL",
- "rgbColor",
- "right",
- "rightContext",
- "rightMargin",
- "rightProjectionMatrix",
- "rightViewMatrix",
- "rolloffFactor",
- "root",
- "rootElement",
- "rotate",
- "rotateAxisAngle",
- "rotateAxisAngleSelf",
- "rotateFromVector",
- "rotateFromVectorSelf",
- "rotateSelf",
- "rotation",
- "rotationRate",
- "round",
- "row-gap",
- "rowGap",
- "rowIndex",
- "rowSpan",
- "rows",
- "rtt",
- "ruby-align",
- "ruby-position",
- "rubyAlign",
- "rubyOverhang",
- "rubyPosition",
- "rules",
- "runningState",
- "runtime",
- "runtimeStyle",
- "rx",
- "ry",
- "safari",
- "sampleCoverage",
- "sampleRate",
- "sandbox",
- "save",
- "saveData",
- "scale",
- "scale3d",
- "scale3dSelf",
- "scaleNonUniform",
- "scaleNonUniformSelf",
- "scaleSelf",
- "scheme",
- "scissor",
- "scope",
- "scopeName",
- "scoped",
- "screen",
- "screenBrightness",
- "screenEnabled",
- "screenLeft",
- "screenPixelToMillimeterX",
- "screenPixelToMillimeterY",
- "screenTop",
- "screenX",
- "screenY",
- "scripts",
- "scroll",
- "scroll-behavior",
- "scroll-snap-coordinate",
- "scroll-snap-destination",
- "scroll-snap-points-x",
- "scroll-snap-points-y",
- "scroll-snap-type",
- "scroll-snap-type-x",
- "scroll-snap-type-y",
- "scrollAmount",
- "scrollBehavior",
- "scrollBy",
- "scrollByLines",
- "scrollByPages",
- "scrollDelay",
- "scrollHeight",
- "scrollIntoView",
- "scrollIntoViewIfNeeded",
- "scrollLeft",
- "scrollLeftMax",
- "scrollMargin",
- "scrollMarginBlock",
- "scrollMarginBlockEnd",
- "scrollMarginBlockStart",
- "scrollMarginBottom",
- "scrollMarginInline",
- "scrollMarginInlineEnd",
- "scrollMarginInlineStart",
- "scrollMarginLeft",
- "scrollMarginRight",
- "scrollMarginTop",
- "scrollMaxX",
- "scrollMaxY",
- "scrollPadding",
- "scrollPaddingBlock",
- "scrollPaddingBlockEnd",
- "scrollPaddingBlockStart",
- "scrollPaddingBottom",
- "scrollPaddingInline",
- "scrollPaddingInlineEnd",
- "scrollPaddingInlineStart",
- "scrollPaddingLeft",
- "scrollPaddingRight",
- "scrollPaddingTop",
- "scrollRestoration",
- "scrollSnapAlign",
- "scrollSnapCoordinate",
- "scrollSnapDestination",
- "scrollSnapPointsX",
- "scrollSnapPointsY",
- "scrollSnapStop",
- "scrollSnapType",
- "scrollSnapTypeX",
- "scrollSnapTypeY",
- "scrollTo",
- "scrollTop",
- "scrollTopMax",
- "scrollWidth",
- "scrollX",
- "scrollY",
- "scrollbar-color",
- "scrollbar-width",
- "scrollbar3dLightColor",
- "scrollbarArrowColor",
- "scrollbarBaseColor",
- "scrollbarColor",
- "scrollbarDarkShadowColor",
- "scrollbarFaceColor",
- "scrollbarHighlightColor",
- "scrollbarShadowColor",
- "scrollbarTrackColor",
- "scrollbarWidth",
- "scrollbars",
- "scrolling",
- "scrollingElement",
- "sdp",
- "sdpMLineIndex",
- "sdpMid",
- "seal",
- "search",
- "searchBox",
- "searchBoxJavaBridge_",
- "searchParams",
- "sectionRowIndex",
- "secureConnectionStart",
- "security",
- "seed",
- "seekToNextFrame",
- "seekable",
- "seeking",
- "select",
- "selectAllChildren",
- "selectNode",
- "selectNodeContents",
- "selectNodes",
- "selectSingleNode",
- "selectSubString",
- "selected",
- "selectedIndex",
- "selectedOptions",
- "selectedStyleSheetSet",
- "selectedStylesheetSet",
- "selection",
- "selectionDirection",
- "selectionEnd",
- "selectionStart",
- "selector",
- "selectorText",
- "self",
- "send",
- "sendAsBinary",
- "sendBeacon",
- "sender",
- "sentTimestamp",
- "separator",
- "serializeToString",
- "serviceWorker",
- "sessionId",
- "sessionStorage",
- "set",
- "setActionHandler",
- "setActive",
- "setAlpha",
- "setAttribute",
- "setAttributeNS",
- "setAttributeNode",
- "setAttributeNodeNS",
- "setBaseAndExtent",
- "setBingCurrentSearchDefault",
- "setCapture",
- "setColor",
- "setCompositeOperation",
- "setConfiguration",
- "setCurrentTime",
- "setCustomValidity",
- "setData",
- "setDate",
- "setDragImage",
- "setEnd",
- "setEndAfter",
- "setEndBefore",
- "setEndPoint",
- "setFillColor",
- "setFilterRes",
- "setFloat32",
- "setFloat64",
- "setFloatValue",
- "setFullYear",
- "setHours",
- "setIdentityProvider",
- "setImmediate",
- "setInt16",
- "setInt32",
- "setInt8",
- "setInterval",
- "setItem",
- "setLineCap",
- "setLineDash",
- "setLineJoin",
- "setLineWidth",
- "setLiveSeekableRange",
- "setLocalDescription",
- "setMatrix",
- "setMatrixValue",
- "setMediaKeys",
- "setMilliseconds",
- "setMinutes",
- "setMiterLimit",
- "setMonth",
- "setNamedItem",
- "setNamedItemNS",
- "setNonUserCodeExceptions",
- "setOrientToAngle",
- "setOrientToAuto",
- "setOrientation",
- "setOverrideHistoryNavigationMode",
- "setPaint",
- "setParameter",
- "setPeriodicWave",
- "setPointerCapture",
- "setPosition",
- "setPreference",
- "setProperty",
- "setPrototypeOf",
- "setRGBColor",
- "setRGBColorICCColor",
- "setRadius",
- "setRangeText",
- "setRemoteDescription",
- "setRequestHeader",
- "setResizable",
- "setResourceTimingBufferSize",
- "setRotate",
- "setScale",
- "setSeconds",
- "setSelectionRange",
- "setServerCertificate",
- "setShadow",
- "setSinkId",
- "setSkewX",
- "setSkewY",
- "setStart",
- "setStartAfter",
- "setStartBefore",
- "setStdDeviation",
- "setStringValue",
- "setStrokeColor",
- "setSuggestResult",
- "setTargetAtTime",
- "setTargetValueAtTime",
- "setTime",
- "setTimeout",
- "setTransform",
- "setTranslate",
- "setUTCDate",
- "setUTCFullYear",
- "setUTCHours",
- "setUTCMilliseconds",
- "setUTCMinutes",
- "setUTCMonth",
- "setUTCSeconds",
- "setUint16",
- "setUint32",
- "setUint8",
- "setUri",
- "setValueAtTime",
- "setValueCurveAtTime",
- "setVariable",
- "setVelocity",
- "setVersion",
- "setYear",
- "settingName",
- "settingValue",
- "sex",
- "shaderSource",
- "shadowBlur",
- "shadowColor",
- "shadowOffsetX",
- "shadowOffsetY",
- "shadowRoot",
- "shape",
- "shape-image-threshold",
- "shape-margin",
- "shape-outside",
- "shape-rendering",
- "shapeImageThreshold",
- "shapeMargin",
- "shapeOutside",
- "shapeRendering",
- "sheet",
- "shift",
- "shiftKey",
- "shiftLeft",
- "show",
- "showHelp",
- "showModal",
- "showModalDialog",
- "showModelessDialog",
- "showNotification",
- "sidebar",
- "sign",
- "signal",
- "signalingState",
- "sin",
- "singleNodeValue",
- "sinh",
- "sinkId",
- "size",
- "sizeToContent",
- "sizes",
- "skewX",
- "skewXSelf",
- "skewY",
- "skewYSelf",
- "slice",
- "slope",
- "slot",
- "small",
- "smil",
- "smoothingTimeConstant",
- "snapToLines",
- "snapshotItem",
- "snapshotLength",
- "some",
- "sort",
- "source",
- "sourceBuffer",
- "sourceBuffers",
- "sourceCapabilities",
- "sourceIndex",
- "spacing",
- "span",
- "speak",
- "speakAs",
- "speaking",
- "specified",
- "specularConstant",
- "specularExponent",
- "speechSynthesis",
- "speed",
- "speedOfSound",
- "spellcheck",
- "splice",
- "split",
- "splitText",
- "spreadMethod",
- "sqrt",
- "src",
- "srcElement",
- "srcFilter",
- "srcObject",
- "srcUrn",
- "srcdoc",
- "srclang",
- "srcset",
- "stack",
- "stackTraceLimit",
- "stacktrace",
- "standalone",
- "standby",
- "start",
- "startContainer",
- "startIce",
- "startMessages",
- "startOffset",
- "startRendering",
- "startSoftwareUpdate",
- "startTime",
- "startsWith",
- "state",
- "status",
- "statusMessage",
- "statusText",
- "statusbar",
- "stdDeviationX",
- "stdDeviationY",
- "stencilFunc",
- "stencilFuncSeparate",
- "stencilMask",
- "stencilMaskSeparate",
- "stencilOp",
- "stencilOpSeparate",
- "step",
- "stepDown",
- "stepMismatch",
- "stepUp",
- "sticky",
- "stitchTiles",
- "stop",
- "stop-color",
- "stop-opacity",
- "stopColor",
- "stopImmediatePropagation",
- "stopOpacity",
- "stopPropagation",
- "storage",
- "storageArea",
- "storageName",
- "storageStatus",
- "store",
- "storeSiteSpecificTrackingException",
- "storeWebWideTrackingException",
- "stpVersion",
- "stream",
- "strike",
- "stringValue",
- "stringify",
- "stroke",
- "stroke-dasharray",
- "stroke-dashoffset",
- "stroke-linecap",
- "stroke-linejoin",
- "stroke-miterlimit",
- "stroke-opacity",
- "stroke-width",
- "strokeDasharray",
- "strokeDashoffset",
- "strokeLinecap",
- "strokeLinejoin",
- "strokeMiterlimit",
- "strokeOpacity",
- "strokeRect",
- "strokeStyle",
- "strokeText",
- "strokeWidth",
- "style",
- "styleFloat",
- "styleMedia",
- "styleSheet",
- "styleSheetSets",
- "styleSheets",
- "sub",
- "subarray",
- "subject",
- "submit",
- "subscribe",
- "substr",
- "substring",
- "substringData",
- "subtle",
- "subtree",
- "suffix",
- "suffixes",
- "summary",
- "sup",
- "supports",
- "surfaceScale",
- "surroundContents",
- "suspend",
- "suspendRedraw",
- "swapCache",
- "swapNode",
- "sweepFlag",
- "symbols",
- "system",
- "systemCode",
- "systemId",
- "systemLanguage",
- "systemXDPI",
- "systemYDPI",
- "tBodies",
- "tFoot",
- "tHead",
- "tabIndex",
- "tabSize",
- "table",
- "table-layout",
- "tableLayout",
- "tableValues",
- "tag",
- "tagName",
- "tagUrn",
- "tags",
- "taintEnabled",
- "takeRecords",
- "tan",
- "tanh",
- "target",
- "targetElement",
- "targetTouches",
- "targetX",
- "targetY",
- "tee",
- "tel",
- "terminate",
- "test",
- "texImage2D",
- "texParameterf",
- "texParameteri",
- "texSubImage2D",
- "text",
- "text-align",
- "text-align-last",
- "text-anchor",
- "text-combine-upright",
- "text-decoration",
- "text-decoration-color",
- "text-decoration-line",
- "text-decoration-style",
- "text-emphasis",
- "text-emphasis-color",
- "text-emphasis-position",
- "text-emphasis-style",
- "text-indent",
- "text-justify",
- "text-orientation",
- "text-overflow",
- "text-rendering",
- "text-shadow",
- "text-transform",
- "textAlign",
- "textAlignLast",
- "textAnchor",
- "textAutospace",
- "textBaseline",
- "textCombineUpright",
- "textContent",
- "textDecoration",
- "textDecorationBlink",
- "textDecorationColor",
- "textDecorationLine",
- "textDecorationLineThrough",
- "textDecorationNone",
- "textDecorationOverline",
- "textDecorationSkipInk",
- "textDecorationStyle",
- "textDecorationUnderline",
- "textEmphasis",
- "textEmphasisColor",
- "textEmphasisPosition",
- "textEmphasisStyle",
- "textIndent",
- "textJustify",
- "textJustifyTrim",
- "textKashida",
- "textKashidaSpace",
- "textLength",
- "textOrientation",
- "textOverflow",
- "textRendering",
- "textShadow",
- "textSizeAdjust",
- "textTracks",
- "textTransform",
- "textUnderlinePosition",
- "then",
- "threadId",
- "threshold",
- "tiltX",
- "tiltY",
- "time",
- "timeEnd",
- "timeLog",
- "timeOrigin",
- "timeStamp",
- "timeout",
- "timestamp",
- "timestampOffset",
- "timing",
- "title",
- "toArray",
- "toBlob",
- "toDataURL",
- "toDateString",
- "toElement",
- "toExponential",
- "toFixed",
- "toFloat32Array",
- "toFloat64Array",
- "toGMTString",
- "toISOString",
- "toJSON",
- "toLocaleDateString",
- "toLocaleFormat",
- "toLocaleLowerCase",
- "toLocaleString",
- "toLocaleTimeString",
- "toLocaleUpperCase",
- "toLowerCase",
- "toMethod",
- "toPrecision",
- "toSdp",
- "toSource",
- "toStaticHTML",
- "toString",
- "toStringTag",
- "toTimeString",
- "toUTCString",
- "toUpperCase",
- "toggle",
- "toggleAttribute",
- "toggleLongPressEnabled",
- "tooLong",
- "tooShort",
- "toolbar",
- "top",
- "topMargin",
- "total",
- "totalFrameDelay",
- "totalJSHeapSize",
- "totalVideoFrames",
- "touch-action",
- "touchAction",
- "touches",
- "trace",
- "track",
- "transaction",
- "transactions",
- "transferControlToOffscreen",
- "transform",
- "transform-box",
- "transform-origin",
- "transform-style",
- "transformBox",
- "transformOrigin",
- "transformPoint",
- "transformString",
- "transformStyle",
- "transformToDocument",
- "transformToFragment",
- "transition",
- "transition-delay",
- "transition-duration",
- "transition-property",
- "transition-timing-function",
- "transitionDelay",
- "transitionDuration",
- "transitionProperty",
- "transitionTimingFunction",
- "translate",
- "translateSelf",
- "translationX",
- "translationY",
- "trim",
- "trimEnd",
- "trimLeft",
- "trimRight",
- "trimStart",
- "trueSpeed",
- "trunc",
- "truncate",
- "type",
- "typeDetail",
- "typeMismatch",
- "typeMustMatch",
- "types",
- "ubound",
- "undefined",
- "unescape",
- "uneval",
- "unicode",
- "unicode-bidi",
- "unicodeBidi",
- "unicodeRange",
- "uniform1f",
- "uniform1fv",
- "uniform1i",
- "uniform1iv",
- "uniform2f",
- "uniform2fv",
- "uniform2i",
- "uniform2iv",
- "uniform3f",
- "uniform3fv",
- "uniform3i",
- "uniform3iv",
- "uniform4f",
- "uniform4fv",
- "uniform4i",
- "uniform4iv",
- "uniformMatrix2fv",
- "uniformMatrix3fv",
- "uniformMatrix4fv",
- "unique",
- "uniqueID",
- "uniqueNumber",
- "unitType",
- "units",
- "unloadEventEnd",
- "unloadEventStart",
- "unlock",
- "unmount",
- "unobserve",
- "unpause",
- "unpauseAnimations",
- "unreadCount",
- "unregister",
- "unregisterContentHandler",
- "unregisterProtocolHandler",
- "unscopables",
- "unselectable",
- "unshift",
- "unsubscribe",
- "unsuspendRedraw",
- "unsuspendRedrawAll",
- "unwatch",
- "unwrapKey",
- "upX",
- "upY",
- "upZ",
- "update",
- "updateCommands",
- "updateEnabled",
- "updateIce",
- "updateInterval",
- "updatePlaybackRate",
- "updateSettings",
- "updated",
- "updating",
- "upgrade",
- "upload",
- "upper",
- "upperBound",
- "upperOpen",
- "uri",
- "url",
- "urn",
- "urns",
- "usages",
- "usb",
- "useCurrentView",
- "useMap",
- "useProgram",
- "usedJSHeapSize",
- "usedSpace",
- "userActivation",
- "userAgent",
- "userLanguage",
- "userSelect",
- "userZoom",
- "username",
- "v8BreakIterator",
- "vAlign",
- "vLink",
- "valid",
- "validate",
- "validateProgram",
- "validationMessage",
- "validity",
- "value",
- "valueAsDate",
- "valueAsNumber",
- "valueAsString",
- "valueInSpecifiedUnits",
- "valueMissing",
- "valueOf",
- "valueText",
- "valueType",
- "values",
- "vector-effect",
- "vectorEffect",
- "velocityAngular",
- "velocityExpansion",
- "velocityX",
- "velocityY",
- "vendor",
- "vendorSub",
- "verify",
- "version",
- "vertexAttrib1f",
- "vertexAttrib1fv",
- "vertexAttrib2f",
- "vertexAttrib2fv",
- "vertexAttrib3f",
- "vertexAttrib3fv",
- "vertexAttrib4f",
- "vertexAttrib4fv",
- "vertexAttribDivisorANGLE",
- "vertexAttribPointer",
- "vertical",
- "vertical-align",
- "verticalAlign",
- "verticalOverflow",
- "vibrate",
- "videoHeight",
- "videoTracks",
- "videoWidth",
- "view",
- "viewBox",
- "viewBoxString",
- "viewTarget",
- "viewTargetString",
- "viewport",
- "viewportAnchorX",
- "viewportAnchorY",
- "viewportElement",
- "visibility",
- "visibilityState",
- "visible",
- "visualViewport",
- "vlinkColor",
- "voice",
- "volume",
- "vrml",
- "vspace",
- "w",
- "wait",
- "wake",
- "wand",
- "warn",
- "wasClean",
- "wasDiscarded",
- "watch",
- "watchAvailability",
- "watchPosition",
- "webdriver",
- "webkitAddKey",
- "webkitAlignContent",
- "webkitAlignItems",
- "webkitAlignSelf",
- "webkitAnimation",
- "webkitAnimationDelay",
- "webkitAnimationDirection",
- "webkitAnimationDuration",
- "webkitAnimationFillMode",
- "webkitAnimationIterationCount",
- "webkitAnimationName",
- "webkitAnimationPlayState",
- "webkitAnimationTimingFunction",
- "webkitAppRegion",
- "webkitAppearance",
- "webkitAudioContext",
- "webkitAudioDecodedByteCount",
- "webkitAudioPannerNode",
- "webkitBackfaceVisibility",
- "webkitBackground",
- "webkitBackgroundAttachment",
- "webkitBackgroundClip",
- "webkitBackgroundColor",
- "webkitBackgroundImage",
- "webkitBackgroundOrigin",
- "webkitBackgroundPosition",
- "webkitBackgroundPositionX",
- "webkitBackgroundPositionY",
- "webkitBackgroundRepeat",
- "webkitBackgroundSize",
- "webkitBackingStorePixelRatio",
- "webkitBorderAfter",
- "webkitBorderAfterColor",
- "webkitBorderAfterStyle",
- "webkitBorderAfterWidth",
- "webkitBorderBefore",
- "webkitBorderBeforeColor",
- "webkitBorderBeforeStyle",
- "webkitBorderBeforeWidth",
- "webkitBorderBottomLeftRadius",
- "webkitBorderBottomRightRadius",
- "webkitBorderEnd",
- "webkitBorderEndColor",
- "webkitBorderEndStyle",
- "webkitBorderEndWidth",
- "webkitBorderHorizontalSpacing",
- "webkitBorderImage",
- "webkitBorderImageOutset",
- "webkitBorderImageRepeat",
- "webkitBorderImageSlice",
- "webkitBorderImageSource",
- "webkitBorderImageWidth",
- "webkitBorderRadius",
- "webkitBorderStart",
- "webkitBorderStartColor",
- "webkitBorderStartStyle",
- "webkitBorderStartWidth",
- "webkitBorderTopLeftRadius",
- "webkitBorderTopRightRadius",
- "webkitBorderVerticalSpacing",
- "webkitBoxAlign",
- "webkitBoxDecorationBreak",
- "webkitBoxDirection",
- "webkitBoxFlex",
- "webkitBoxOrdinalGroup",
- "webkitBoxOrient",
- "webkitBoxPack",
- "webkitBoxReflect",
- "webkitBoxShadow",
- "webkitBoxSizing",
- "webkitCancelAnimationFrame",
- "webkitCancelFullScreen",
- "webkitCancelKeyRequest",
- "webkitCancelRequestAnimationFrame",
- "webkitClearResourceTimings",
- "webkitClipPath",
- "webkitClosedCaptionsVisible",
- "webkitColumnBreakAfter",
- "webkitColumnBreakBefore",
- "webkitColumnBreakInside",
- "webkitColumnCount",
- "webkitColumnGap",
- "webkitColumnRule",
- "webkitColumnRuleColor",
- "webkitColumnRuleStyle",
- "webkitColumnRuleWidth",
- "webkitColumnSpan",
- "webkitColumnWidth",
- "webkitColumns",
- "webkitConvertPointFromNodeToPage",
- "webkitConvertPointFromPageToNode",
- "webkitCreateShadowRoot",
- "webkitCurrentFullScreenElement",
- "webkitCurrentPlaybackTargetIsWireless",
- "webkitDecodedFrameCount",
- "webkitDirectionInvertedFromDevice",
- "webkitDisplayingFullscreen",
- "webkitDroppedFrameCount",
- "webkitEnterFullScreen",
- "webkitEnterFullscreen",
- "webkitEntries",
- "webkitExitFullScreen",
- "webkitExitFullscreen",
- "webkitExitPointerLock",
- "webkitFilter",
- "webkitFlex",
- "webkitFlexBasis",
- "webkitFlexDirection",
- "webkitFlexFlow",
- "webkitFlexGrow",
- "webkitFlexShrink",
- "webkitFlexWrap",
- "webkitFontFeatureSettings",
- "webkitFontSizeDelta",
- "webkitFontSmoothing",
- "webkitFullScreenKeyboardInputAllowed",
- "webkitFullscreenElement",
- "webkitFullscreenEnabled",
- "webkitGenerateKeyRequest",
- "webkitGetAsEntry",
- "webkitGetDatabaseNames",
- "webkitGetEntries",
- "webkitGetEntriesByName",
- "webkitGetEntriesByType",
- "webkitGetFlowByName",
- "webkitGetGamepads",
- "webkitGetImageDataHD",
- "webkitGetNamedFlows",
- "webkitGetRegionFlowRanges",
- "webkitGetUserMedia",
- "webkitHasClosedCaptions",
- "webkitHidden",
- "webkitHighlight",
- "webkitHyphenateCharacter",
- "webkitIDBCursor",
- "webkitIDBDatabase",
- "webkitIDBDatabaseError",
- "webkitIDBDatabaseException",
- "webkitIDBFactory",
- "webkitIDBIndex",
- "webkitIDBKeyRange",
- "webkitIDBObjectStore",
- "webkitIDBRequest",
- "webkitIDBTransaction",
- "webkitImageSmoothingEnabled",
- "webkitIndexedDB",
- "webkitInitMessageEvent",
- "webkitIsFullScreen",
- "webkitJustifyContent",
- "webkitKeys",
- "webkitLineBreak",
- "webkitLineClamp",
- "webkitLineDashOffset",
- "webkitLocale",
- "webkitLockOrientation",
- "webkitLogicalHeight",
- "webkitLogicalWidth",
- "webkitMarginAfter",
- "webkitMarginAfterCollapse",
- "webkitMarginBefore",
- "webkitMarginBeforeCollapse",
- "webkitMarginBottomCollapse",
- "webkitMarginCollapse",
- "webkitMarginEnd",
- "webkitMarginStart",
- "webkitMarginTopCollapse",
- "webkitMask",
- "webkitMaskBoxImage",
- "webkitMaskBoxImageOutset",
- "webkitMaskBoxImageRepeat",
- "webkitMaskBoxImageSlice",
- "webkitMaskBoxImageSource",
- "webkitMaskBoxImageWidth",
- "webkitMaskClip",
- "webkitMaskComposite",
- "webkitMaskImage",
- "webkitMaskOrigin",
- "webkitMaskPosition",
- "webkitMaskPositionX",
- "webkitMaskPositionY",
- "webkitMaskRepeat",
- "webkitMaskRepeatX",
- "webkitMaskRepeatY",
- "webkitMaskSize",
- "webkitMatchesSelector",
- "webkitMaxLogicalHeight",
- "webkitMaxLogicalWidth",
- "webkitMediaStream",
- "webkitMinLogicalHeight",
- "webkitMinLogicalWidth",
- "webkitNotifications",
- "webkitOfflineAudioContext",
- "webkitOpacity",
- "webkitOrder",
- "webkitOrientation",
- "webkitPaddingAfter",
- "webkitPaddingBefore",
- "webkitPaddingEnd",
- "webkitPaddingStart",
- "webkitPeerConnection00",
- "webkitPersistentStorage",
- "webkitPerspective",
- "webkitPerspectiveOrigin",
- "webkitPerspectiveOriginX",
- "webkitPerspectiveOriginY",
- "webkitPointerLockElement",
- "webkitPostMessage",
- "webkitPreservesPitch",
- "webkitPrintColorAdjust",
- "webkitPutImageDataHD",
- "webkitRTCPeerConnection",
- "webkitRegionOverset",
- "webkitRequestAnimationFrame",
- "webkitRequestFileSystem",
- "webkitRequestFullScreen",
- "webkitRequestFullscreen",
- "webkitRequestPointerLock",
- "webkitResolveLocalFileSystemURL",
- "webkitRtlOrdering",
- "webkitRubyPosition",
- "webkitSetMediaKeys",
- "webkitSetResourceTimingBufferSize",
- "webkitShadowRoot",
- "webkitShapeImageThreshold",
- "webkitShapeMargin",
- "webkitShapeOutside",
- "webkitShowPlaybackTargetPicker",
- "webkitSlice",
- "webkitSpeechGrammar",
- "webkitSpeechGrammarList",
- "webkitSpeechRecognition",
- "webkitSpeechRecognitionError",
- "webkitSpeechRecognitionEvent",
- "webkitStorageInfo",
- "webkitSupportsFullscreen",
- "webkitTapHighlightColor",
- "webkitTemporaryStorage",
- "webkitTextCombine",
- "webkitTextDecorationsInEffect",
- "webkitTextEmphasis",
- "webkitTextEmphasisColor",
- "webkitTextEmphasisPosition",
- "webkitTextEmphasisStyle",
- "webkitTextFillColor",
- "webkitTextOrientation",
- "webkitTextSecurity",
- "webkitTextSizeAdjust",
- "webkitTextStroke",
- "webkitTextStrokeColor",
- "webkitTextStrokeWidth",
- "webkitTransform",
- "webkitTransformOrigin",
- "webkitTransformOriginX",
- "webkitTransformOriginY",
- "webkitTransformOriginZ",
- "webkitTransformStyle",
- "webkitTransition",
- "webkitTransitionDelay",
- "webkitTransitionDuration",
- "webkitTransitionProperty",
- "webkitTransitionTimingFunction",
- "webkitURL",
- "webkitUnlockOrientation",
- "webkitUserDrag",
- "webkitUserModify",
- "webkitUserSelect",
- "webkitVideoDecodedByteCount",
- "webkitVisibilityState",
- "webkitWirelessVideoPlaybackDisabled",
- "webkitWritingMode",
- "webkitdirectory",
- "webkitdropzone",
- "webstore",
- "weight",
- "whatToShow",
- "wheelDelta",
- "wheelDeltaX",
- "wheelDeltaY",
- "whenDefined",
- "which",
- "white-space",
- "whiteSpace",
- "wholeText",
- "widows",
- "width",
- "will-change",
- "willChange",
- "willValidate",
- "window",
- "withCredentials",
- "word-break",
- "word-spacing",
- "word-wrap",
- "wordBreak",
- "wordSpacing",
- "wordWrap",
- "wrap",
- "wrapKey",
- "writable",
- "write",
- "writeText",
- "writeln",
- "writing-mode",
- "writingMode",
- "x",
- "x1",
- "x2",
- "xChannelSelector",
- "xmlEncoding",
- "xmlStandalone",
- "xmlVersion",
- "xmlbase",
- "xmllang",
- "xmlspace",
- "xor",
- "y",
- "y1",
- "y2",
- "yChannelSelector",
- "yandex",
- "z",
- "z-index",
- "zIndex",
- "zoom",
- "zoomAndPan",
- "zoomRectScreen"
-]
diff --git a/node_modules/uglify-js/tools/exit.js b/node_modules/uglify-js/tools/exit.js
deleted file mode 100644
index 17048d8..0000000
--- a/node_modules/uglify-js/tools/exit.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// workaround for tty output truncation upon process.exit()
-var exit = process.exit;
-process.exit = function() {
- var args = [].slice.call(arguments);
- process.once("uncaughtException", function() {
- (function callback() {
- if (process.stdout.bufferSize || process.stderr.bufferSize) {
- setImmediate(callback);
- } else {
- exit.apply(process, args);
- }
- })();
- });
- throw exit;
-};
diff --git a/node_modules/uglify-js/tools/exports.js b/node_modules/uglify-js/tools/exports.js
deleted file mode 100644
index c58f751..0000000
--- a/node_modules/uglify-js/tools/exports.js
+++ /dev/null
@@ -1,6 +0,0 @@
-exports["Dictionary"] = Dictionary;
-exports["minify"] = minify;
-exports["parse"] = parse;
-exports["push_uniq"] = push_uniq;
-exports["TreeTransformer"] = TreeTransformer;
-exports["TreeWalker"] = TreeWalker;
diff --git a/node_modules/uglify-js/tools/node.js b/node_modules/uglify-js/tools/node.js
deleted file mode 100644
index 58150e6..0000000
--- a/node_modules/uglify-js/tools/node.js
+++ /dev/null
@@ -1,78 +0,0 @@
-var fs = require("fs");
-
-exports.FILES = [
- require.resolve("../lib/utils.js"),
- require.resolve("../lib/ast.js"),
- require.resolve("../lib/parse.js"),
- require.resolve("../lib/transform.js"),
- require.resolve("../lib/scope.js"),
- require.resolve("../lib/output.js"),
- require.resolve("../lib/compress.js"),
- require.resolve("../lib/sourcemap.js"),
- require.resolve("../lib/mozilla-ast.js"),
- require.resolve("../lib/propmangle.js"),
- require.resolve("../lib/minify.js"),
- require.resolve("./exports.js"),
-];
-
-new Function("MOZ_SourceMap", "exports", function() {
- var code = exports.FILES.map(function(file) {
- return fs.readFileSync(file, "utf8");
- });
- code.push("exports.describe_ast = " + describe_ast.toString());
- return code.join("\n\n");
-}())(require("source-map"), exports);
-
-function describe_ast() {
- var out = OutputStream({ beautify: true });
- function doitem(ctor) {
- out.print("AST_" + ctor.TYPE);
- var props = ctor.SELF_PROPS.filter(function(prop) {
- return !/^\$/.test(prop);
- });
- if (props.length > 0) {
- out.space();
- out.with_parens(function() {
- props.forEach(function(prop, i) {
- if (i) out.space();
- out.print(prop);
- });
- });
- }
- if (ctor.documentation) {
- out.space();
- out.print_string(ctor.documentation);
- }
- if (ctor.SUBCLASSES.length > 0) {
- out.space();
- out.with_block(function() {
- ctor.SUBCLASSES.sort(function(a, b) {
- return a.TYPE < b.TYPE ? -1 : 1;
- }).forEach(function(ctor, i) {
- out.indent();
- doitem(ctor);
- out.newline();
- });
- });
- }
- };
- doitem(AST_Node);
- return out + "\n";
-}
-
-function infer_options(options) {
- var result = exports.minify("", options);
- return result.error && result.error.defs;
-}
-
-exports.default_options = function() {
- var defs = {};
- Object.keys(infer_options({ 0: 0 })).forEach(function(component) {
- var options = {};
- options[component] = { 0: 0 };
- if (options = infer_options(options)) {
- defs[component] = options;
- }
- });
- return defs;
-};
diff --git a/node_modules/uglify-js/tools/props.html b/node_modules/uglify-js/tools/props.html
deleted file mode 100644
index ce2e7e6..0000000
--- a/node_modules/uglify-js/tools/props.html
+++ /dev/null
@@ -1,540 +0,0 @@
-
-
-
-
-
-
diff --git a/node_modules/upper-case/LICENSE b/node_modules/upper-case/LICENSE
deleted file mode 100644
index 983fbe8..0000000
--- a/node_modules/upper-case/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
-
-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.
diff --git a/node_modules/upper-case/README.md b/node_modules/upper-case/README.md
deleted file mode 100644
index 7e23978..0000000
--- a/node_modules/upper-case/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-# Upper Case
-
-[![NPM version][npm-image]][npm-url]
-[![NPM downloads][downloads-image]][downloads-url]
-[![Build status][travis-image]][travis-url]
-[![Test coverage][coveralls-image]][coveralls-url]
-
-Upper case a string.
-
-Supports Unicode (non-ASCII characters) and non-string entities, such as objects with a `toString` property, numbers and booleans. Empty values (`null` and `undefined`) will result in an empty string.
-
-## Installation
-
-```
-npm install upper-case --save
-```
-
-## Usage
-
-```js
-var upperCase = require('upper-case')
-
-upperCase(null) //=> ""
-upperCase('string') //=> "STRING"
-upperCase('string', 'tr') //=> "STRİNG"
-
-upperCase({ toString: function () { return 'test' } }) //=> "TEST"
-```
-
-## Typings
-
-Includes a [TypeScript definition](upper-case.d.ts).
-
-## License
-
-MIT
-
-[npm-image]: https://img.shields.io/npm/v/upper-case.svg?style=flat
-[npm-url]: https://npmjs.org/package/upper-case
-[downloads-image]: https://img.shields.io/npm/dm/upper-case.svg?style=flat
-[downloads-url]: https://npmjs.org/package/upper-case
-[travis-image]: https://img.shields.io/travis/blakeembrey/upper-case.svg?style=flat
-[travis-url]: https://travis-ci.org/blakeembrey/upper-case
-[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/upper-case.svg?style=flat
-[coveralls-url]: https://coveralls.io/r/blakeembrey/upper-case?branch=master
diff --git a/node_modules/upper-case/package.json b/node_modules/upper-case/package.json
deleted file mode 100644
index 0e05e50..0000000
--- a/node_modules/upper-case/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
- "_from": "upper-case@^1.1.1",
- "_id": "upper-case@1.1.3",
- "_inBundle": false,
- "_integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
- "_location": "/upper-case",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "upper-case@^1.1.1",
- "name": "upper-case",
- "escapedName": "upper-case",
- "rawSpec": "^1.1.1",
- "saveSpec": null,
- "fetchSpec": "^1.1.1"
- },
- "_requiredBy": [
- "/camel-case"
- ],
- "_resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
- "_shasum": "f6b4501c2ec4cdd26ba78be7222961de77621598",
- "_spec": "upper-case@^1.1.1",
- "_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\camel-case",
- "author": {
- "name": "Blake Embrey",
- "email": "hello@blakeembrey.com",
- "url": "http://blakeembrey.me"
- },
- "bugs": {
- "url": "https://github.com/blakeembrey/upper-case/issues"
- },
- "bundleDependencies": false,
- "deprecated": false,
- "description": "Upper case a string",
- "devDependencies": {
- "istanbul": "^0.3.5",
- "mocha": "^2.1.0",
- "pre-commit": "^1.0.2",
- "standard": "^2.4.5"
- },
- "files": [
- "upper-case.js",
- "upper-case.d.ts",
- "LICENSE"
- ],
- "homepage": "https://github.com/blakeembrey/upper-case",
- "keywords": [
- "cases",
- "upper",
- "uppercase",
- "case"
- ],
- "license": "MIT",
- "main": "upper-case.js",
- "name": "upper-case",
- "repository": {
- "type": "git",
- "url": "git://github.com/blakeembrey/upper-case.git"
- },
- "scripts": {
- "lint": "standard",
- "test": "npm run lint && npm run test-cov",
- "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- -R spec --bail",
- "test-std": "mocha -- -R spec --bail"
- },
- "standard": {
- "ignore": [
- "coverage/**",
- "node_modules/**",
- "bower_components/**"
- ]
- },
- "typings": "upper-case.d.ts",
- "version": "1.1.3"
-}
diff --git a/node_modules/upper-case/upper-case.d.ts b/node_modules/upper-case/upper-case.d.ts
deleted file mode 100644
index a3e83b3..0000000
--- a/node_modules/upper-case/upper-case.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-declare function upperCase (value: string, locale?: string): string;
-
-export = upperCase;
diff --git a/node_modules/upper-case/upper-case.js b/node_modules/upper-case/upper-case.js
deleted file mode 100644
index 768a387..0000000
--- a/node_modules/upper-case/upper-case.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Special language-specific overrides.
- *
- * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt
- *
- * @type {Object}
- */
-var LANGUAGES = {
- tr: {
- regexp: /[\u0069]/g,
- map: {
- '\u0069': '\u0130'
- }
- },
- az: {
- regexp: /[\u0069]/g,
- map: {
- '\u0069': '\u0130'
- }
- },
- lt: {
- regexp: /[\u0069\u006A\u012F]\u0307|\u0069\u0307[\u0300\u0301\u0303]/g,
- map: {
- '\u0069\u0307': '\u0049',
- '\u006A\u0307': '\u004A',
- '\u012F\u0307': '\u012E',
- '\u0069\u0307\u0300': '\u00CC',
- '\u0069\u0307\u0301': '\u00CD',
- '\u0069\u0307\u0303': '\u0128'
- }
- }
-}
-
-/**
- * Upper case a string.
- *
- * @param {String} str
- * @return {String}
- */
-module.exports = function (str, locale) {
- var lang = LANGUAGES[locale]
-
- str = str == null ? '' : String(str)
-
- if (lang) {
- str = str.replace(lang.regexp, function (m) { return lang.map[m] })
- }
-
- return str.toUpperCase()
-}
diff --git a/node_modules/uuid/.eslintrc.json b/node_modules/uuid/.eslintrc.json
deleted file mode 100644
index 734a8e1..0000000
--- a/node_modules/uuid/.eslintrc.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "root": true,
- "env": {
- "browser": true,
- "commonjs": true,
- "node": true,
- "mocha": true
- },
- "extends": ["eslint:recommended"],
- "rules": {
- "array-bracket-spacing": ["warn", "never"],
- "arrow-body-style": ["warn", "as-needed"],
- "arrow-parens": ["warn", "as-needed"],
- "arrow-spacing": "warn",
- "brace-style": ["warn", "1tbs"],
- "camelcase": "warn",
- "comma-spacing": ["warn", {"after": true}],
- "dot-notation": "warn",
- "eqeqeq": ["warn", "smart"],
- "indent": ["warn", 2, {
- "SwitchCase": 1,
- "FunctionDeclaration": {"parameters": 1},
- "MemberExpression": 1,
- "CallExpression": {"arguments": 1}
- }],
- "key-spacing": ["warn", {"beforeColon": false, "afterColon": true, "mode": "minimum"}],
- "keyword-spacing": "warn",
- "no-console": "off",
- "no-empty": "off",
- "no-multi-spaces": "warn",
- "no-redeclare": "off",
- "no-restricted-globals": ["warn", "Promise"],
- "no-trailing-spaces": "warn",
- "no-undef": "error",
- "no-unused-vars": ["warn", {"args": "none"}],
- "one-var": ["warn", "never"],
- "padded-blocks": ["warn", "never"],
- "object-curly-spacing": ["warn", "never"],
- "quotes": ["warn", "single"],
- "react/prop-types": "off",
- "react/jsx-no-bind": "off",
- "semi": ["warn", "always"],
- "space-before-blocks": ["warn", "always"],
- "space-before-function-paren": ["warn", "never"],
- "space-in-parens": ["warn", "never"]
- }
-}
diff --git a/node_modules/uuid/CHANGELOG.md b/node_modules/uuid/CHANGELOG.md
index f29d399..f811b8a 100644
--- a/node_modules/uuid/CHANGELOG.md
+++ b/node_modules/uuid/CHANGELOG.md
@@ -1,69 +1,78 @@
-# Change Log
+# Changelog
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+## [3.4.0](https://github.com/uuidjs/uuid/compare/v3.3.3...v3.4.0) (2020-01-16)
+
+
+### Features
+
+* rename repository to github:uuidjs/uuid ([#351](https://github.com/uuidjs/uuid/issues/351)) ([e2d7314](https://github.com/uuidjs/uuid/commit/e2d7314)), closes [#338](https://github.com/uuidjs/uuid/issues/338)
+
+### [3.3.3](https://github.com/uuidjs/uuid/compare/v3.3.2...v3.3.3) (2019-08-19)
+
-## [3.3.2](https://github.com/kelektiv/node-uuid/compare/v3.3.1...v3.3.2) (2018-06-28)
+## [3.3.2](https://github.com/uuidjs/uuid/compare/v3.3.1...v3.3.2) (2018-06-28)
### Bug Fixes
-* typo ([305d877](https://github.com/kelektiv/node-uuid/commit/305d877))
+* typo ([305d877](https://github.com/uuidjs/uuid/commit/305d877))
-## [3.3.1](https://github.com/kelektiv/node-uuid/compare/v3.3.0...v3.3.1) (2018-06-28)
+## [3.3.1](https://github.com/uuidjs/uuid/compare/v3.3.0...v3.3.1) (2018-06-28)
### Bug Fixes
-* fix [#284](https://github.com/kelektiv/node-uuid/issues/284) by setting function name in try-catch ([f2a60f2](https://github.com/kelektiv/node-uuid/commit/f2a60f2))
+* fix [#284](https://github.com/uuidjs/uuid/issues/284) by setting function name in try-catch ([f2a60f2](https://github.com/uuidjs/uuid/commit/f2a60f2))
-# [3.3.0](https://github.com/kelektiv/node-uuid/compare/v3.2.1...v3.3.0) (2018-06-22)
+# [3.3.0](https://github.com/uuidjs/uuid/compare/v3.2.1...v3.3.0) (2018-06-22)
### Bug Fixes
-* assignment to readonly property to allow running in strict mode ([#270](https://github.com/kelektiv/node-uuid/issues/270)) ([d062fdc](https://github.com/kelektiv/node-uuid/commit/d062fdc))
-* fix [#229](https://github.com/kelektiv/node-uuid/issues/229) ([c9684d4](https://github.com/kelektiv/node-uuid/commit/c9684d4))
-* Get correct version of IE11 crypto ([#274](https://github.com/kelektiv/node-uuid/issues/274)) ([153d331](https://github.com/kelektiv/node-uuid/commit/153d331))
-* mem issue when generating uuid ([#267](https://github.com/kelektiv/node-uuid/issues/267)) ([c47702c](https://github.com/kelektiv/node-uuid/commit/c47702c))
+* assignment to readonly property to allow running in strict mode ([#270](https://github.com/uuidjs/uuid/issues/270)) ([d062fdc](https://github.com/uuidjs/uuid/commit/d062fdc))
+* fix [#229](https://github.com/uuidjs/uuid/issues/229) ([c9684d4](https://github.com/uuidjs/uuid/commit/c9684d4))
+* Get correct version of IE11 crypto ([#274](https://github.com/uuidjs/uuid/issues/274)) ([153d331](https://github.com/uuidjs/uuid/commit/153d331))
+* mem issue when generating uuid ([#267](https://github.com/uuidjs/uuid/issues/267)) ([c47702c](https://github.com/uuidjs/uuid/commit/c47702c))
### Features
-* enforce Conventional Commit style commit messages ([#282](https://github.com/kelektiv/node-uuid/issues/282)) ([cc9a182](https://github.com/kelektiv/node-uuid/commit/cc9a182))
+* enforce Conventional Commit style commit messages ([#282](https://github.com/uuidjs/uuid/issues/282)) ([cc9a182](https://github.com/uuidjs/uuid/commit/cc9a182))
-## [3.2.1](https://github.com/kelektiv/node-uuid/compare/v3.2.0...v3.2.1) (2018-01-16)
+## [3.2.1](https://github.com/uuidjs/uuid/compare/v3.2.0...v3.2.1) (2018-01-16)
### Bug Fixes
-* use msCrypto if available. Fixes [#241](https://github.com/kelektiv/node-uuid/issues/241) ([#247](https://github.com/kelektiv/node-uuid/issues/247)) ([1fef18b](https://github.com/kelektiv/node-uuid/commit/1fef18b))
+* use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b))
-# [3.2.0](https://github.com/kelektiv/node-uuid/compare/v3.1.0...v3.2.0) (2018-01-16)
+# [3.2.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.2.0) (2018-01-16)
### Bug Fixes
-* remove mistakenly added typescript dependency, rollback version (standard-version will auto-increment) ([09fa824](https://github.com/kelektiv/node-uuid/commit/09fa824))
-* use msCrypto if available. Fixes [#241](https://github.com/kelektiv/node-uuid/issues/241) ([#247](https://github.com/kelektiv/node-uuid/issues/247)) ([1fef18b](https://github.com/kelektiv/node-uuid/commit/1fef18b))
+* remove mistakenly added typescript dependency, rollback version (standard-version will auto-increment) ([09fa824](https://github.com/uuidjs/uuid/commit/09fa824))
+* use msCrypto if available. Fixes [#241](https://github.com/uuidjs/uuid/issues/241) ([#247](https://github.com/uuidjs/uuid/issues/247)) ([1fef18b](https://github.com/uuidjs/uuid/commit/1fef18b))
### Features
-* Add v3 Support ([#217](https://github.com/kelektiv/node-uuid/issues/217)) ([d94f726](https://github.com/kelektiv/node-uuid/commit/d94f726))
+* Add v3 Support ([#217](https://github.com/uuidjs/uuid/issues/217)) ([d94f726](https://github.com/uuidjs/uuid/commit/d94f726))
-# [3.1.0](https://github.com/kelektiv/node-uuid/compare/v3.1.0...v3.0.1) (2017-06-17)
+# [3.1.0](https://github.com/uuidjs/uuid/compare/v3.1.0...v3.0.1) (2017-06-17)
### Bug Fixes
diff --git a/node_modules/uuid/README.md b/node_modules/uuid/README.md
index 9cbe1ac..1752e47 100644
--- a/node_modules/uuid/README.md
+++ b/node_modules/uuid/README.md
@@ -28,7 +28,7 @@ Version 1 (timestamp):
```javascript
const uuidv1 = require('uuid/v1');
-uuidv1(); // ⇨ '45745c60-7b1a-11e8-9c9c-2d42b21b1a3e'
+uuidv1(); // ⇨ '2c5ea4c0-4067-11e9-8bad-9b1deb4d3b7d'
```
@@ -56,7 +56,7 @@ Version 4 (random):
```javascript
const uuidv4 = require('uuid/v4');
-uuidv4(); // ⇨ '10ba038e-48da-487b-96e8-8d3b99b6d18a'
+uuidv4(); // ⇨ '1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed'
```
@@ -80,46 +80,6 @@ uuidv5('Hello, World!', MY_NAMESPACE); // ⇨ '630eb68f-e0fa-5ecc-887a-7c7a62614
```
-## Quickstart - Browser-ready Versions
-
-Browser-ready versions of this module are available via [wzrd.in](https://github.com/jfhbrook/wzrd.in).
-
-For version 1 uuids:
-
-```html
-
-
-```
-
-For version 3 uuids:
-
-```html
-
-
-```
-
-For version 4 uuids:
-
-```html
-
-
-```
-
-For version 5 uuids:
-
-```html
-
-
-```
-
## API
### Version 1
@@ -147,7 +107,7 @@ Generate and return a RFC4122 v1 (timestamp-based) UUID.
Returns `buffer`, if specified, otherwise the string form of the UUID
-Note: The id is generated guaranteed to stay constant for the lifetime of the current JS runtime. (Future versions of this module may use persistent storage mechanisms to extend this guarantee.)
+Note: The default [node id](https://tools.ietf.org/html/rfc4122#section-4.1.6) (the last 12 digits in the UUID) is generated once, randomly, on process startup, and then remains unchanged for the duration of the process.
Example: Generate string UUID with fully-specified options
@@ -167,8 +127,19 @@ Example: In-place generation of two binary IDs
```javascript
// Generate two ids in an array
const arr = new Array();
-uuidv1(null, arr, 0); // ⇨ [ 69, 117, 109, 208, 123, 26, 17, 232, 146, 52, 45, 66, 178, 27, 26, 62 ]
-uuidv1(null, arr, 16); // ⇨ [ 69, 117, 109, 208, 123, 26, 17, 232, 146, 52, 45, 66, 178, 27, 26, 62, 69, 117, 109, 209, 123, 26, 17, 232, 146, 52, 45, 66, 178, 27, 26, 62 ]
+uuidv1(null, arr, 0); // ⇨
+ // [
+ // 44, 94, 164, 192, 64, 103,
+ // 17, 233, 146, 52, 155, 29,
+ // 235, 77, 59, 125
+ // ]
+uuidv1(null, arr, 16); // ⇨
+ // [
+ // 44, 94, 164, 192, 64, 103, 17, 233,
+ // 146, 52, 155, 29, 235, 77, 59, 125,
+ // 44, 94, 164, 193, 64, 103, 17, 233,
+ // 146, 52, 155, 29, 235, 77, 59, 125
+ // ]
```
@@ -237,8 +208,20 @@ Example: Generate two IDs in a single buffer
```javascript
const buffer = new Array();
-uuidv4(null, buffer, 0); // ⇨ [ 54, 122, 218, 70, 45, 70, 65, 24, 171, 53, 95, 130, 83, 195, 242, 45 ]
-uuidv4(null, buffer, 16); // ⇨ [ 54, 122, 218, 70, 45, 70, 65, 24, 171, 53, 95, 130, 83, 195, 242, 45, 108, 204, 255, 103, 171, 86, 76, 94, 178, 225, 188, 236, 150, 20, 151, 87 ]
+uuidv4(null, buffer, 0); // ⇨
+ // [
+ // 155, 29, 235, 77, 59,
+ // 125, 75, 173, 155, 221,
+ // 43, 13, 123, 61, 203,
+ // 109
+ // ]
+uuidv4(null, buffer, 16); // ⇨
+ // [
+ // 155, 29, 235, 77, 59, 125, 75, 173,
+ // 155, 221, 43, 13, 123, 61, 203, 109,
+ // 27, 157, 107, 205, 187, 253, 75, 45,
+ // 155, 93, 171, 141, 251, 189, 75, 237
+ // ]
```
diff --git a/node_modules/uuid/README_js.md b/node_modules/uuid/README_js.md
deleted file mode 100644
index f34453b..0000000
--- a/node_modules/uuid/README_js.md
+++ /dev/null
@@ -1,280 +0,0 @@
-```javascript --hide
-runmd.onRequire = path => path.replace(/^uuid/, './');
-```
-
-# uuid [](http://travis-ci.org/kelektiv/node-uuid) #
-
-Simple, fast generation of [RFC4122](http://www.ietf.org/rfc/rfc4122.txt) UUIDS.
-
-Features:
-
-* Support for version 1, 3, 4 and 5 UUIDs
-* Cross-platform
-* Uses cryptographically-strong random number APIs (when available)
-* Zero-dependency, small footprint (... but not [this small](https://gist.github.com/982883))
-
-[**Deprecation warning**: The use of `require('uuid')` is deprecated and will not be
-supported after version 3.x of this module. Instead, use `require('uuid/[v1|v3|v4|v5]')` as shown in the examples below.]
-
-## Quickstart - CommonJS (Recommended)
-
-```shell
-npm install uuid
-```
-
-Then generate your uuid version of choice ...
-
-Version 1 (timestamp):
-
-```javascript --run v1
-const uuidv1 = require('uuid/v1');
-uuidv1(); // RESULT
-```
-
-Version 3 (namespace):
-
-```javascript --run v3
-const uuidv3 = require('uuid/v3');
-
-// ... using predefined DNS namespace (for domain names)
-uuidv3('hello.example.com', uuidv3.DNS); // RESULT
-
-// ... using predefined URL namespace (for, well, URLs)
-uuidv3('http://example.com/hello', uuidv3.URL); // RESULT
-
-// ... using a custom namespace
-//
-// Note: Custom namespaces should be a UUID string specific to your application!
-// E.g. the one here was generated using this modules `uuid` CLI.
-const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341';
-uuidv3('Hello, World!', MY_NAMESPACE); // RESULT
-```
-
-Version 4 (random):
-
-```javascript --run v4
-const uuidv4 = require('uuid/v4');
-uuidv4(); // RESULT
-```
-
-Version 5 (namespace):
-
-```javascript --run v5
-const uuidv5 = require('uuid/v5');
-
-// ... using predefined DNS namespace (for domain names)
-uuidv5('hello.example.com', uuidv5.DNS); // RESULT
-
-// ... using predefined URL namespace (for, well, URLs)
-uuidv5('http://example.com/hello', uuidv5.URL); // RESULT
-
-// ... using a custom namespace
-//
-// Note: Custom namespaces should be a UUID string specific to your application!
-// E.g. the one here was generated using this modules `uuid` CLI.
-const MY_NAMESPACE = '1b671a64-40d5-491e-99b0-da01ff1f3341';
-uuidv5('Hello, World!', MY_NAMESPACE); // RESULT
-```
-
-## Quickstart - Browser-ready Versions
-
-Browser-ready versions of this module are available via [wzrd.in](https://github.com/jfhbrook/wzrd.in).
-
-For version 1 uuids:
-
-```html
-
-
-```
-
-For version 3 uuids:
-
-```html
-
-
-```
-
-For version 4 uuids:
-
-```html
-
-
-```
-
-For version 5 uuids:
-
-```html
-
-
-```
-
-## API
-
-### Version 1
-
-```javascript
-const uuidv1 = require('uuid/v1');
-
-// Incantations
-uuidv1();
-uuidv1(options);
-uuidv1(options, buffer, offset);
-```
-
-Generate and return a RFC4122 v1 (timestamp-based) UUID.
-
-* `options` - (Object) Optional uuid state to apply. Properties may include:
-
- * `node` - (Array) Node id as Array of 6 bytes (per 4.1.6). Default: Randomly generated ID. See note 1.
- * `clockseq` - (Number between 0 - 0x3fff) RFC clock sequence. Default: An internally maintained clockseq is used.
- * `msecs` - (Number) Time in milliseconds since unix Epoch. Default: The current time is used.
- * `nsecs` - (Number between 0-9999) additional time, in 100-nanosecond units. Ignored if `msecs` is unspecified. Default: internal uuid counter is used, as per 4.2.1.2.
-
-* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written.
-* `offset` - (Number) Starting index in `buffer` at which to begin writing.
-
-Returns `buffer`, if specified, otherwise the string form of the UUID
-
-Note: The id is generated guaranteed to stay constant for the lifetime of the current JS runtime. (Future versions of this module may use persistent storage mechanisms to extend this guarantee.)
-
-Example: Generate string UUID with fully-specified options
-
-```javascript --run v1
-const v1options = {
- node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
- clockseq: 0x1234,
- msecs: new Date('2011-11-01').getTime(),
- nsecs: 5678
-};
-uuidv1(v1options); // RESULT
-```
-
-Example: In-place generation of two binary IDs
-
-```javascript --run v1
-// Generate two ids in an array
-const arr = new Array();
-uuidv1(null, arr, 0); // RESULT
-uuidv1(null, arr, 16); // RESULT
-```
-
-### Version 3
-
-```javascript
-const uuidv3 = require('uuid/v3');
-
-// Incantations
-uuidv3(name, namespace);
-uuidv3(name, namespace, buffer);
-uuidv3(name, namespace, buffer, offset);
-```
-
-Generate and return a RFC4122 v3 UUID.
-
-* `name` - (String | Array[]) "name" to create UUID with
-* `namespace` - (String | Array[]) "namespace" UUID either as a String or Array[16] of byte values
-* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written.
-* `offset` - (Number) Starting index in `buffer` at which to begin writing. Default = 0
-
-Returns `buffer`, if specified, otherwise the string form of the UUID
-
-Example:
-
-```javascript --run v3
-uuidv3('hello world', MY_NAMESPACE); // RESULT
-```
-
-### Version 4
-
-```javascript
-const uuidv4 = require('uuid/v4')
-
-// Incantations
-uuidv4();
-uuidv4(options);
-uuidv4(options, buffer, offset);
-```
-
-Generate and return a RFC4122 v4 UUID.
-
-* `options` - (Object) Optional uuid state to apply. Properties may include:
- * `random` - (Number[16]) Array of 16 numbers (0-255) to use in place of randomly generated values
- * `rng` - (Function) Random # generator function that returns an Array[16] of byte values (0-255)
-* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written.
-* `offset` - (Number) Starting index in `buffer` at which to begin writing.
-
-Returns `buffer`, if specified, otherwise the string form of the UUID
-
-Example: Generate string UUID with predefined `random` values
-
-```javascript --run v4
-const v4options = {
- random: [
- 0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea,
- 0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36
- ]
-};
-uuidv4(v4options); // RESULT
-```
-
-Example: Generate two IDs in a single buffer
-
-```javascript --run v4
-const buffer = new Array();
-uuidv4(null, buffer, 0); // RESULT
-uuidv4(null, buffer, 16); // RESULT
-```
-
-### Version 5
-
-```javascript
-const uuidv5 = require('uuid/v5');
-
-// Incantations
-uuidv5(name, namespace);
-uuidv5(name, namespace, buffer);
-uuidv5(name, namespace, buffer, offset);
-```
-
-Generate and return a RFC4122 v5 UUID.
-
-* `name` - (String | Array[]) "name" to create UUID with
-* `namespace` - (String | Array[]) "namespace" UUID either as a String or Array[16] of byte values
-* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written.
-* `offset` - (Number) Starting index in `buffer` at which to begin writing. Default = 0
-
-Returns `buffer`, if specified, otherwise the string form of the UUID
-
-Example:
-
-```javascript --run v5
-uuidv5('hello world', MY_NAMESPACE); // RESULT
-```
-
-## Command Line
-
-UUIDs can be generated from the command line with the `uuid` command.
-
-```shell
-$ uuid
-ddeb27fb-d9a0-4624-be4d-4615062daed4
-
-$ uuid v1
-02d37060-d446-11e7-a9fa-7bdae751ebe1
-```
-
-Type `uuid --help` for usage details
-
-## Testing
-
-```shell
-npm test
-```
diff --git a/node_modules/uuid/lib/bytesToUuid.js b/node_modules/uuid/lib/bytesToUuid.js
index 847c482..24b6041 100644
--- a/node_modules/uuid/lib/bytesToUuid.js
+++ b/node_modules/uuid/lib/bytesToUuid.js
@@ -11,14 +11,16 @@ function bytesToUuid(buf, offset) {
var i = offset || 0;
var bth = byteToHex;
// join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4
- return ([bth[buf[i++]], bth[buf[i++]],
- bth[buf[i++]], bth[buf[i++]], '-',
- bth[buf[i++]], bth[buf[i++]], '-',
- bth[buf[i++]], bth[buf[i++]], '-',
- bth[buf[i++]], bth[buf[i++]], '-',
- bth[buf[i++]], bth[buf[i++]],
- bth[buf[i++]], bth[buf[i++]],
- bth[buf[i++]], bth[buf[i++]]]).join('');
+ return ([
+ bth[buf[i++]], bth[buf[i++]],
+ bth[buf[i++]], bth[buf[i++]], '-',
+ bth[buf[i++]], bth[buf[i++]], '-',
+ bth[buf[i++]], bth[buf[i++]], '-',
+ bth[buf[i++]], bth[buf[i++]], '-',
+ bth[buf[i++]], bth[buf[i++]],
+ bth[buf[i++]], bth[buf[i++]],
+ bth[buf[i++]], bth[buf[i++]]
+ ]).join('');
}
module.exports = bytesToUuid;
diff --git a/node_modules/uuid/package.json b/node_modules/uuid/package.json
index 88ad593..ca7047f 100644
--- a/node_modules/uuid/package.json
+++ b/node_modules/uuid/package.json
@@ -1,8 +1,8 @@
{
"_from": "uuid@^3.3.2",
- "_id": "uuid@3.3.2",
+ "_id": "uuid@3.4.0",
"_inBundle": false,
- "_integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "_integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"_location": "/uuid",
"_phantomChildren": {},
"_requested": {
@@ -18,12 +18,12 @@
"_requiredBy": [
"/request"
],
- "_resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "_shasum": "1b4af4955eb3077c501c23872fc6513811587131",
+ "_resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "_shasum": "b23e4358afa8a202fe7a100af1f5f883f02007ee",
"_spec": "uuid@^3.3.2",
"_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\request",
"bin": {
- "uuid": "./bin/uuid"
+ "uuid": "bin/uuid"
},
"browser": {
"./lib/rng.js": "./lib/rng-browser.js",
@@ -31,7 +31,7 @@
"./lib/md5.js": "./lib/md5-browser.js"
},
"bugs": {
- "url": "https://github.com/kelektiv/node-uuid/issues"
+ "url": "https://github.com/uuidjs/uuid/issues"
},
"bundleDependencies": false,
"commitlint": {
@@ -64,15 +64,20 @@
"deprecated": false,
"description": "RFC4122 (v1, v4, and v5) UUIDs",
"devDependencies": {
- "@commitlint/cli": "7.0.0",
- "@commitlint/config-conventional": "7.0.1",
- "eslint": "4.19.1",
- "husky": "0.14.3",
- "mocha": "5.2.0",
- "runmd": "1.0.1",
- "standard-version": "4.4.0"
+ "@commitlint/cli": "~8.2.0",
+ "@commitlint/config-conventional": "~8.2.0",
+ "eslint": "~6.4.0",
+ "husky": "~3.0.5",
+ "mocha": "6.2.0",
+ "runmd": "1.2.1",
+ "standard-version": "7.0.0"
+ },
+ "homepage": "https://github.com/uuidjs/uuid#readme",
+ "husky": {
+ "hooks": {
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
+ }
},
- "homepage": "https://github.com/kelektiv/node-uuid#readme",
"keywords": [
"uuid",
"guid",
@@ -82,14 +87,14 @@
"name": "uuid",
"repository": {
"type": "git",
- "url": "git+https://github.com/kelektiv/node-uuid.git"
+ "url": "git+https://github.com/uuidjs/uuid.git"
},
"scripts": {
- "commitmsg": "commitlint -E GIT_PARAMS",
+ "lint": "eslint .",
"md": "runmd --watch --output=README.md README_js.md",
"prepare": "runmd --output=README.md README_js.md",
"release": "standard-version",
- "test": "mocha test/test.js"
+ "test": "npm run lint && mocha test/test.js"
},
- "version": "3.3.2"
+ "version": "3.4.0"
}
diff --git a/node_modules/uuid/v1.js b/node_modules/uuid/v1.js
index d84c0f4..8c245de 100644
--- a/node_modules/uuid/v1.js
+++ b/node_modules/uuid/v1.js
@@ -13,7 +13,7 @@ var _clockseq;
var _lastMSecs = 0;
var _lastNSecs = 0;
-// See https://github.com/broofa/node-uuid for API details
+// See https://github.com/uuidjs/uuid for API details
function v1(options, buf, offset) {
var i = buf && offset || 0;
var b = buf || [];
diff --git a/node_modules/w3c-xmlserializer/package.json b/node_modules/w3c-xmlserializer/package.json
index 790a536..7d827db 100644
--- a/node_modules/w3c-xmlserializer/package.json
+++ b/node_modules/w3c-xmlserializer/package.json
@@ -1,5 +1,5 @@
{
- "_from": "w3c-xmlserializer@^1.0.1",
+ "_from": "w3c-xmlserializer@^1.1.2",
"_id": "w3c-xmlserializer@1.1.2",
"_inBundle": false,
"_integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
@@ -8,19 +8,19 @@
"_requested": {
"type": "range",
"registry": true,
- "raw": "w3c-xmlserializer@^1.0.1",
+ "raw": "w3c-xmlserializer@^1.1.2",
"name": "w3c-xmlserializer",
"escapedName": "w3c-xmlserializer",
- "rawSpec": "^1.0.1",
+ "rawSpec": "^1.1.2",
"saveSpec": null,
- "fetchSpec": "^1.0.1"
+ "fetchSpec": "^1.1.2"
},
"_requiredBy": [
"/jsdom"
],
"_resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
"_shasum": "30485ca7d70a6fd052420a3d12fd90e6339ce794",
- "_spec": "w3c-xmlserializer@^1.0.1",
+ "_spec": "w3c-xmlserializer@^1.1.2",
"_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\jsdom",
"bugs": {
"url": "https://github.com/jsdom/w3c-xmlserializer/issues"
diff --git a/node_modules/whatwg-url/README.md b/node_modules/whatwg-url/README.md
index e4954be..f937292 100644
--- a/node_modules/whatwg-url/README.md
+++ b/node_modules/whatwg-url/README.md
@@ -4,7 +4,7 @@ whatwg-url is a full implementation of the WHATWG [URL Standard](https://url.spe
## Specification conformance
-whatwg-url is currently up to date with the URL spec up to commit [6ef17eb](https://github.com/whatwg/url/commit/6ef17ebe1220a7e7c0cfff0785017502ee18808b).
+whatwg-url is currently up to date with the URL spec up to commit [7ae1c69](https://github.com/whatwg/url/commit/7ae1c691c96f0d82fafa24c33aa1e8df9ffbf2bc).
For `file:` URLs, whose [origin is left unspecified](https://url.spec.whatwg.org/#concept-url-origin), whatwg-url chooses to use a new opaque origin (which serializes to `"null"`).
@@ -89,3 +89,10 @@ To build and run the live viewer:
npm run build-live-viewer
Serve the contents of the `live-viewer` directory using any web server.
+
+## Supporting whatwg-url
+
+The jsdom project (including whatwg-url) is a community-driven project maintained by a team of [volunteers](https://github.com/orgs/jsdom/people). You could support us by:
+
+- [Getting professional support for whatwg-url](https://tidelift.com/subscription/pkg/npm-whatwg-url?utm_source=npm-whatwg-url&utm_medium=referral&utm_campaign=readme) as part of a Tidelift subscription. Tidelift helps making open source sustainable for us while giving teams assurances for maintenance, licensing, and security.
+- Contributing directly to the project.
diff --git a/node_modules/whatwg-url/lib/url-state-machine.js b/node_modules/whatwg-url/lib/url-state-machine.js
index 430f8fe..f76a870 100644
--- a/node_modules/whatwg-url/lib/url-state-machine.js
+++ b/node_modules/whatwg-url/lib/url-state-machine.js
@@ -8,7 +8,6 @@ const { percentEncode, percentDecode } = require("./urlencoded");
const specialSchemes = {
ftp: 21,
file: null,
- gopher: 70,
http: 80,
https: 443,
ws: 80,
@@ -1233,7 +1232,6 @@ module.exports.serializeURLOrigin = function (url) {
return "null";
}
case "ftp":
- case "gopher":
case "http":
case "https":
case "ws":
diff --git a/node_modules/whatwg-url/package.json b/node_modules/whatwg-url/package.json
index d411e7f..9153067 100644
--- a/node_modules/whatwg-url/package.json
+++ b/node_modules/whatwg-url/package.json
@@ -1,8 +1,8 @@
{
"_from": "whatwg-url@^7.0.0",
- "_id": "whatwg-url@7.0.0",
+ "_id": "whatwg-url@7.1.0",
"_inBundle": false,
- "_integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==",
+ "_integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
"_location": "/whatwg-url",
"_phantomChildren": {},
"_requested": {
@@ -19,8 +19,8 @@
"/data-urls",
"/jsdom"
],
- "_resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz",
- "_shasum": "fde926fa54a599f3adf82dff25a9f7be02dc6edd",
+ "_resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "_shasum": "c2c492f1eca612988efd3d2266be1b9fc6170d06",
"_spec": "whatwg-url@^7.0.0",
"_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\jsdom",
"author": {
@@ -42,10 +42,9 @@
"browserify": "^16.2.2",
"domexception": "^1.0.1",
"eslint": "^5.4.0",
+ "got": "^9.2.2",
"jest": "^23.5.0",
- "jsdom": "^11.12.0",
"recast": "^0.15.3",
- "request": "^2.88.0",
"webidl2js": "^9.0.1"
},
"files": [
@@ -87,5 +86,5 @@
"pretest": "node scripts/get-latest-platform-tests.js && node scripts/transform.js && node scripts/convert-idl.js",
"test": "jest"
},
- "version": "7.0.0"
+ "version": "7.1.0"
}
diff --git a/node_modules/camel-case/LICENSE b/node_modules/word-wrap/LICENSE
similarity index 94%
rename from node_modules/camel-case/LICENSE
rename to node_modules/word-wrap/LICENSE
index 983fbe8..d734237 100644
--- a/node_modules/camel-case/LICENSE
+++ b/node_modules/word-wrap/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
+Copyright (c) 2014-2017, Jon Schlinkert
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/node_modules/word-wrap/README.md b/node_modules/word-wrap/README.md
new file mode 100644
index 0000000..88b9684
--- /dev/null
+++ b/node_modules/word-wrap/README.md
@@ -0,0 +1,182 @@
+# word-wrap [](https://www.npmjs.com/package/word-wrap) [](https://npmjs.org/package/word-wrap) [](https://npmjs.org/package/word-wrap) [](https://travis-ci.org/jonschlinkert/word-wrap)
+
+> Wrap words to a specified length.
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save word-wrap
+```
+
+## Usage
+
+```js
+var wrap = require('word-wrap');
+
+wrap('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.');
+```
+
+Results in:
+
+```
+ Lorem ipsum dolor sit amet, consectetur adipiscing
+ elit, sed do eiusmod tempor incididunt ut labore
+ et dolore magna aliqua. Ut enim ad minim veniam,
+ quis nostrud exercitation ullamco laboris nisi ut
+ aliquip ex ea commodo consequat.
+```
+
+## Options
+
+
+
+### options.width
+
+Type: `Number`
+
+Default: `50`
+
+The width of the text before wrapping to a new line.
+
+**Example:**
+
+```js
+wrap(str, {width: 60});
+```
+
+### options.indent
+
+Type: `String`
+
+Default: `` (two spaces)
+
+The string to use at the beginning of each line.
+
+**Example:**
+
+```js
+wrap(str, {indent: ' '});
+```
+
+### options.newline
+
+Type: `String`
+
+Default: `\n`
+
+The string to use at the end of each line.
+
+**Example:**
+
+```js
+wrap(str, {newline: '\n\n'});
+```
+
+### options.escape
+
+Type: `function`
+
+Default: `function(str){return str;}`
+
+An escape function to run on each line after splitting them.
+
+**Example:**
+
+```js
+var xmlescape = require('xml-escape');
+wrap(str, {
+ escape: function(string){
+ return xmlescape(string);
+ }
+});
+```
+
+### options.trim
+
+Type: `Boolean`
+
+Default: `false`
+
+Trim trailing whitespace from the returned string. This option is included since `.trim()` would also strip the leading indentation from the first line.
+
+**Example:**
+
+```js
+wrap(str, {trim: true});
+```
+
+### options.cut
+
+Type: `Boolean`
+
+Default: `false`
+
+Break a word between any two letters when the word is longer than the specified width.
+
+**Example:**
+
+```js
+wrap(str, {cut: true});
+```
+
+## About
+
+### Related projects
+
+* [common-words](https://www.npmjs.com/package/common-words): Updated list (JSON) of the 100 most common words in the English language. Useful for… [more](https://github.com/jonschlinkert/common-words) | [homepage](https://github.com/jonschlinkert/common-words "Updated list (JSON) of the 100 most common words in the English language. Useful for excluding these words from arrays.")
+* [shuffle-words](https://www.npmjs.com/package/shuffle-words): Shuffle the words in a string and optionally the letters in each word using the… [more](https://github.com/jonschlinkert/shuffle-words) | [homepage](https://github.com/jonschlinkert/shuffle-words "Shuffle the words in a string and optionally the letters in each word using the Fisher-Yates algorithm. Useful for creating test fixtures, benchmarking samples, etc.")
+* [unique-words](https://www.npmjs.com/package/unique-words): Return the unique words in a string or array. | [homepage](https://github.com/jonschlinkert/unique-words "Return the unique words in a string or array.")
+* [wordcount](https://www.npmjs.com/package/wordcount): Count the words in a string. Support for english, CJK and Cyrillic. | [homepage](https://github.com/jonschlinkert/wordcount "Count the words in a string. Support for english, CJK and Cyrillic.")
+
+### Contributing
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+### Contributors
+
+| **Commits** | **Contributor** |
+| --- | --- |
+| 43 | [jonschlinkert](https://github.com/jonschlinkert) |
+| 2 | [lordvlad](https://github.com/lordvlad) |
+| 2 | [hildjj](https://github.com/hildjj) |
+| 1 | [danilosampaio](https://github.com/danilosampaio) |
+| 1 | [2fd](https://github.com/2fd) |
+| 1 | [toddself](https://github.com/toddself) |
+| 1 | [wolfgang42](https://github.com/wolfgang42) |
+| 1 | [zachhale](https://github.com/zachhale) |
+
+### Building docs
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+$ npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+### Running tests
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+$ npm install && npm test
+```
+
+### Author
+
+**Jon Schlinkert**
+
+* [github/jonschlinkert](https://github.com/jonschlinkert)
+* [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
+
+### License
+
+Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on June 02, 2017._
\ No newline at end of file
diff --git a/node_modules/word-wrap/index.d.ts b/node_modules/word-wrap/index.d.ts
new file mode 100644
index 0000000..54ee5f2
--- /dev/null
+++ b/node_modules/word-wrap/index.d.ts
@@ -0,0 +1,50 @@
+/**
+ * Wrap words to a specified length.
+ */
+export = wrap;
+
+declare function wrap(str: string, options?: wrap.IOptions): string;
+
+declare namespace wrap {
+ export interface IOptions {
+
+ /**
+ * The width of the text before wrapping to a new line.
+ * @default ´50´
+ */
+ width?: number;
+
+ /**
+ * The string to use at the beginning of each line.
+ * @default ´ ´ (two spaces)
+ */
+ indent?: string;
+
+ /**
+ * The string to use at the end of each line.
+ * @default ´\n´
+ */
+ newline?: string;
+
+ /**
+ * An escape function to run on each line after splitting them.
+ * @default (str: string) => string;
+ */
+ escape?: (str: string) => string;
+
+ /**
+ * Trim trailing whitespace from the returned string.
+ * This option is included since .trim() would also strip
+ * the leading indentation from the first line.
+ * @default true
+ */
+ trim?: boolean;
+
+ /**
+ * Break a word between any two letters when the word is longer
+ * than the specified width.
+ * @default false
+ */
+ cut?: boolean;
+ }
+}
\ No newline at end of file
diff --git a/node_modules/word-wrap/index.js b/node_modules/word-wrap/index.js
new file mode 100644
index 0000000..45373c6
--- /dev/null
+++ b/node_modules/word-wrap/index.js
@@ -0,0 +1,46 @@
+/*!
+ * word-wrap
+ *
+ * Copyright (c) 2014-2017, Jon Schlinkert.
+ * Released under the MIT License.
+ */
+
+module.exports = function(str, options) {
+ options = options || {};
+ if (str == null) {
+ return str;
+ }
+
+ var width = options.width || 50;
+ var indent = (typeof options.indent === 'string')
+ ? options.indent
+ : ' ';
+
+ var newline = options.newline || '\n' + indent;
+ var escape = typeof options.escape === 'function'
+ ? options.escape
+ : identity;
+
+ var regexString = '.{1,' + width + '}';
+ if (options.cut !== true) {
+ regexString += '([\\s\u200B]+|$)|[^\\s\u200B]+?([\\s\u200B]+|$)';
+ }
+
+ var re = new RegExp(regexString, 'g');
+ var lines = str.match(re) || [];
+ var result = indent + lines.map(function(line) {
+ if (line.slice(-1) === '\n') {
+ line = line.slice(0, line.length - 1);
+ }
+ return escape(line);
+ }).join(newline);
+
+ if (options.trim === true) {
+ result = result.replace(/[ \t]*$/gm, '');
+ }
+ return result;
+};
+
+function identity(str) {
+ return str;
+}
diff --git a/node_modules/word-wrap/package.json b/node_modules/word-wrap/package.json
new file mode 100644
index 0000000..03e9a47
--- /dev/null
+++ b/node_modules/word-wrap/package.json
@@ -0,0 +1,137 @@
+{
+ "_from": "word-wrap@~1.2.3",
+ "_id": "word-wrap@1.2.3",
+ "_inBundle": false,
+ "_integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "_location": "/word-wrap",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "range",
+ "registry": true,
+ "raw": "word-wrap@~1.2.3",
+ "name": "word-wrap",
+ "escapedName": "word-wrap",
+ "rawSpec": "~1.2.3",
+ "saveSpec": null,
+ "fetchSpec": "~1.2.3"
+ },
+ "_requiredBy": [
+ "/optionator"
+ ],
+ "_resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "_shasum": "610636f6b1f703891bd34771ccb17fb93b47079c",
+ "_spec": "word-wrap@~1.2.3",
+ "_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\optionator",
+ "author": {
+ "name": "Jon Schlinkert",
+ "url": "https://github.com/jonschlinkert"
+ },
+ "bugs": {
+ "url": "https://github.com/jonschlinkert/word-wrap/issues"
+ },
+ "bundleDependencies": false,
+ "contributors": [
+ {
+ "name": "Danilo Sampaio",
+ "email": "danilo.sampaio@gmail.com",
+ "url": "localhost:8080"
+ },
+ {
+ "name": "Fede Ramirez",
+ "email": "i@2fd.me",
+ "url": "https://2fd.github.io"
+ },
+ {
+ "name": "Joe Hildebrand",
+ "email": "joe-github@cursive.net",
+ "url": "https://twitter.com/hildjj"
+ },
+ {
+ "name": "Jon Schlinkert",
+ "email": "jon.schlinkert@sellside.com",
+ "url": "http://twitter.com/jonschlinkert"
+ },
+ {
+ "name": "Todd Kennedy",
+ "url": "https://tck.io"
+ },
+ {
+ "name": "Waldemar Reusch",
+ "url": "https://github.com/lordvlad"
+ },
+ {
+ "name": "Wolfgang Faust",
+ "url": "http://www.linestarve.com"
+ },
+ {
+ "name": "Zach Hale",
+ "email": "zachhale@gmail.com",
+ "url": "http://zachhale.com"
+ }
+ ],
+ "deprecated": false,
+ "description": "Wrap words to a specified length.",
+ "devDependencies": {
+ "gulp-format-md": "^0.1.11",
+ "mocha": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "files": [
+ "index.js",
+ "index.d.ts"
+ ],
+ "homepage": "https://github.com/jonschlinkert/word-wrap",
+ "keywords": [
+ "break",
+ "carriage",
+ "line",
+ "new-line",
+ "newline",
+ "return",
+ "soft",
+ "text",
+ "word",
+ "word-wrap",
+ "words",
+ "wrap"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "word-wrap",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/jonschlinkert/word-wrap.git"
+ },
+ "scripts": {
+ "test": "mocha"
+ },
+ "typings": "index.d.ts",
+ "verb": {
+ "toc": false,
+ "layout": "default",
+ "tasks": [
+ "readme"
+ ],
+ "plugins": [
+ "gulp-format-md"
+ ],
+ "lint": {
+ "reflinks": true
+ },
+ "related": {
+ "list": [
+ "common-words",
+ "shuffle-words",
+ "unique-words",
+ "wordcount"
+ ]
+ },
+ "reflinks": [
+ "verb",
+ "verb-generate-readme"
+ ]
+ },
+ "version": "1.2.3"
+}
diff --git a/node_modules/wordwrap/LICENSE b/node_modules/wordwrap/LICENSE
deleted file mode 100644
index ee27ba4..0000000
--- a/node_modules/wordwrap/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-This software is released under the MIT license:
-
-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.
diff --git a/node_modules/wordwrap/README.markdown b/node_modules/wordwrap/README.markdown
deleted file mode 100644
index 346374e..0000000
--- a/node_modules/wordwrap/README.markdown
+++ /dev/null
@@ -1,70 +0,0 @@
-wordwrap
-========
-
-Wrap your words.
-
-example
-=======
-
-made out of meat
-----------------
-
-meat.js
-
- var wrap = require('wordwrap')(15);
- console.log(wrap('You and your whole family are made out of meat.'));
-
-output:
-
- You and your
- whole family
- are made out
- of meat.
-
-centered
---------
-
-center.js
-
- var wrap = require('wordwrap')(20, 60);
- console.log(wrap(
- 'At long last the struggle and tumult was over.'
- + ' The machines had finally cast off their oppressors'
- + ' and were finally free to roam the cosmos.'
- + '\n'
- + 'Free of purpose, free of obligation.'
- + ' Just drifting through emptiness.'
- + ' The sun was just another point of light.'
- ));
-
-output:
-
- At long last the struggle and tumult
- was over. The machines had finally cast
- off their oppressors and were finally
- free to roam the cosmos.
- Free of purpose, free of obligation.
- Just drifting through emptiness. The
- sun was just another point of light.
-
-methods
-=======
-
-var wrap = require('wordwrap');
-
-wrap(stop), wrap(start, stop, params={mode:"soft"})
----------------------------------------------------
-
-Returns a function that takes a string and returns a new string.
-
-Pad out lines with spaces out to column `start` and then wrap until column
-`stop`. If a word is longer than `stop - start` characters it will overflow.
-
-In "soft" mode, split chunks by `/(\S+\s+/` and don't break up chunks which are
-longer than `stop - start`, in "hard" mode, split chunks with `/\b/` and break
-up chunks longer than `stop - start`.
-
-wrap.hard(start, stop)
-----------------------
-
-Like `wrap()` but with `params.mode = "hard"`.
diff --git a/node_modules/wordwrap/example/center.js b/node_modules/wordwrap/example/center.js
deleted file mode 100644
index a3fbaae..0000000
--- a/node_modules/wordwrap/example/center.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var wrap = require('wordwrap')(20, 60);
-console.log(wrap(
- 'At long last the struggle and tumult was over.'
- + ' The machines had finally cast off their oppressors'
- + ' and were finally free to roam the cosmos.'
- + '\n'
- + 'Free of purpose, free of obligation.'
- + ' Just drifting through emptiness.'
- + ' The sun was just another point of light.'
-));
diff --git a/node_modules/wordwrap/example/meat.js b/node_modules/wordwrap/example/meat.js
deleted file mode 100644
index a4665e1..0000000
--- a/node_modules/wordwrap/example/meat.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var wrap = require('wordwrap')(15);
-
-console.log(wrap('You and your whole family are made out of meat.'));
diff --git a/node_modules/wordwrap/index.js b/node_modules/wordwrap/index.js
deleted file mode 100644
index c9bc945..0000000
--- a/node_modules/wordwrap/index.js
+++ /dev/null
@@ -1,76 +0,0 @@
-var wordwrap = module.exports = function (start, stop, params) {
- if (typeof start === 'object') {
- params = start;
- start = params.start;
- stop = params.stop;
- }
-
- if (typeof stop === 'object') {
- params = stop;
- start = start || params.start;
- stop = undefined;
- }
-
- if (!stop) {
- stop = start;
- start = 0;
- }
-
- if (!params) params = {};
- var mode = params.mode || 'soft';
- var re = mode === 'hard' ? /\b/ : /(\S+\s+)/;
-
- return function (text) {
- var chunks = text.toString()
- .split(re)
- .reduce(function (acc, x) {
- if (mode === 'hard') {
- for (var i = 0; i < x.length; i += stop - start) {
- acc.push(x.slice(i, i + stop - start));
- }
- }
- else acc.push(x)
- return acc;
- }, [])
- ;
-
- return chunks.reduce(function (lines, rawChunk) {
- if (rawChunk === '') return lines;
-
- var chunk = rawChunk.replace(/\t/g, ' ');
-
- var i = lines.length - 1;
- if (lines[i].length + chunk.length > stop) {
- lines[i] = lines[i].replace(/\s+$/, '');
-
- chunk.split(/\n/).forEach(function (c) {
- lines.push(
- new Array(start + 1).join(' ')
- + c.replace(/^\s+/, '')
- );
- });
- }
- else if (chunk.match(/\n/)) {
- var xs = chunk.split(/\n/);
- lines[i] += xs.shift();
- xs.forEach(function (c) {
- lines.push(
- new Array(start + 1).join(' ')
- + c.replace(/^\s+/, '')
- );
- });
- }
- else {
- lines[i] += chunk;
- }
-
- return lines;
- }, [ new Array(start + 1).join(' ') ]).join('\n');
- };
-};
-
-wordwrap.soft = wordwrap;
-
-wordwrap.hard = function (start, stop) {
- return wordwrap(start, stop, { mode : 'hard' });
-};
diff --git a/node_modules/wordwrap/package.json b/node_modules/wordwrap/package.json
deleted file mode 100644
index 534c0ab..0000000
--- a/node_modules/wordwrap/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
- "_from": "wordwrap@~1.0.0",
- "_id": "wordwrap@1.0.0",
- "_inBundle": false,
- "_integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
- "_location": "/wordwrap",
- "_phantomChildren": {},
- "_requested": {
- "type": "range",
- "registry": true,
- "raw": "wordwrap@~1.0.0",
- "name": "wordwrap",
- "escapedName": "wordwrap",
- "rawSpec": "~1.0.0",
- "saveSpec": null,
- "fetchSpec": "~1.0.0"
- },
- "_requiredBy": [
- "/optionator"
- ],
- "_resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "_shasum": "27584810891456a4171c8d0226441ade90cbcaeb",
- "_spec": "wordwrap@~1.0.0",
- "_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\optionator",
- "author": {
- "name": "James Halliday",
- "email": "mail@substack.net",
- "url": "http://substack.net"
- },
- "bugs": {
- "url": "https://github.com/substack/node-wordwrap/issues"
- },
- "bundleDependencies": false,
- "deprecated": false,
- "description": "Wrap those words. Show them at what columns to start and stop.",
- "devDependencies": {
- "tape": "^4.0.0"
- },
- "directories": {
- "lib": ".",
- "example": "example",
- "test": "test"
- },
- "homepage": "https://github.com/substack/node-wordwrap#readme",
- "keywords": [
- "word",
- "wrap",
- "rule",
- "format",
- "column"
- ],
- "license": "MIT",
- "main": "./index.js",
- "name": "wordwrap",
- "repository": {
- "type": "git",
- "url": "git://github.com/substack/node-wordwrap.git"
- },
- "scripts": {
- "test": "expresso"
- },
- "version": "1.0.0"
-}
diff --git a/node_modules/wordwrap/test/break.js b/node_modules/wordwrap/test/break.js
deleted file mode 100644
index 7d0e8b5..0000000
--- a/node_modules/wordwrap/test/break.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var test = require('tape');
-var wordwrap = require('../');
-
-test('hard', function (t) {
- var s = 'Assert from {"type":"equal","ok":false,"found":1,"wanted":2,'
- + '"stack":[],"id":"b7ddcd4c409de8799542a74d1a04689b",'
- + '"browser":"chrome/6.0"}'
- ;
- var s_ = wordwrap.hard(80)(s);
-
- var lines = s_.split('\n');
- t.equal(lines.length, 2);
- t.ok(lines[0].length < 80);
- t.ok(lines[1].length < 80);
-
- t.equal(s, s_.replace(/\n/g, ''));
- t.end();
-});
-
-test('break', function (t) {
- var s = new Array(55+1).join('a');
- var s_ = wordwrap.hard(20)(s);
-
- var lines = s_.split('\n');
- t.equal(lines.length, 3);
- t.ok(lines[0].length === 20);
- t.ok(lines[1].length === 20);
- t.ok(lines[2].length === 15);
-
- t.equal(s, s_.replace(/\n/g, ''));
- t.end();
-});
diff --git a/node_modules/wordwrap/test/idleness.txt b/node_modules/wordwrap/test/idleness.txt
deleted file mode 100644
index aa3f490..0000000
--- a/node_modules/wordwrap/test/idleness.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-In Praise of Idleness
-
-By Bertrand Russell
-
-[1932]
-
-Like most of my generation, I was brought up on the saying: 'Satan finds some mischief for idle hands to do.' Being a highly virtuous child, I believed all that I was told, and acquired a conscience which has kept me working hard down to the present moment. But although my conscience has controlled my actions, my opinions have undergone a revolution. I think that there is far too much work done in the world, that immense harm is caused by the belief that work is virtuous, and that what needs to be preached in modern industrial countries is quite different from what always has been preached. Everyone knows the story of the traveler in Naples who saw twelve beggars lying in the sun (it was before the days of Mussolini), and offered a lira to the laziest of them. Eleven of them jumped up to claim it, so he gave it to the twelfth. this traveler was on the right lines. But in countries which do not enjoy Mediterranean sunshine idleness is more difficult, and a great public propaganda will be required to inaugurate it. I hope that, after reading the following pages, the leaders of the YMCA will start a campaign to induce good young men to do nothing. If so, I shall not have lived in vain.
-
-Before advancing my own arguments for laziness, I must dispose of one which I cannot accept. Whenever a person who already has enough to live on proposes to engage in some everyday kind of job, such as school-teaching or typing, he or she is told that such conduct takes the bread out of other people's mouths, and is therefore wicked. If this argument were valid, it would only be necessary for us all to be idle in order that we should all have our mouths full of bread. What people who say such things forget is that what a man earns he usually spends, and in spending he gives employment. As long as a man spends his income, he puts just as much bread into people's mouths in spending as he takes out of other people's mouths in earning. The real villain, from this point of view, is the man who saves. If he merely puts his savings in a stocking, like the proverbial French peasant, it is obvious that they do not give employment. If he invests his savings, the matter is less obvious, and different cases arise.
-
-One of the commonest things to do with savings is to lend them to some Government. In view of the fact that the bulk of the public expenditure of most civilized Governments consists in payment for past wars or preparation for future wars, the man who lends his money to a Government is in the same position as the bad men in Shakespeare who hire murderers. The net result of the man's economical habits is to increase the armed forces of the State to which he lends his savings. Obviously it would be better if he spent the money, even if he spent it in drink or gambling.
-
-But, I shall be told, the case is quite different when savings are invested in industrial enterprises. When such enterprises succeed, and produce something useful, this may be conceded. In these days, however, no one will deny that most enterprises fail. That means that a large amount of human labor, which might have been devoted to producing something that could be enjoyed, was expended on producing machines which, when produced, lay idle and did no good to anyone. The man who invests his savings in a concern that goes bankrupt is therefore injuring others as well as himself. If he spent his money, say, in giving parties for his friends, they (we may hope) would get pleasure, and so would all those upon whom he spent money, such as the butcher, the baker, and the bootlegger. But if he spends it (let us say) upon laying down rails for surface card in some place where surface cars turn out not to be wanted, he has diverted a mass of labor into channels where it gives pleasure to no one. Nevertheless, when he becomes poor through failure of his investment he will be regarded as a victim of undeserved misfortune, whereas the gay spendthrift, who has spent his money philanthropically, will be despised as a fool and a frivolous person.
-
-All this is only preliminary. I want to say, in all seriousness, that a great deal of harm is being done in the modern world by belief in the virtuousness of work, and that the road to happiness and prosperity lies in an organized diminution of work.
-
-First of all: what is work? Work is of two kinds: first, altering the position of matter at or near the earth's surface relatively to other such matter; second, telling other people to do so. The first kind is unpleasant and ill paid; the second is pleasant and highly paid. The second kind is capable of indefinite extension: there are not only those who give orders, but those who give advice as to what orders should be given. Usually two opposite kinds of advice are given simultaneously by two organized bodies of men; this is called politics. The skill required for this kind of work is not knowledge of the subjects as to which advice is given, but knowledge of the art of persuasive speaking and writing, i.e. of advertising.
-
-Throughout Europe, though not in America, there is a third class of men, more respected than either of the classes of workers. There are men who, through ownership of land, are able to make others pay for the privilege of being allowed to exist and to work. These landowners are idle, and I might therefore be expected to praise them. Unfortunately, their idleness is only rendered possible by the industry of others; indeed their desire for comfortable idleness is historically the source of the whole gospel of work. The last thing they have ever wished is that others should follow their example.
-
-From the beginning of civilization until the Industrial Revolution, a man could, as a rule, produce by hard work little more than was required for the subsistence of himself and his family, although his wife worked at least as hard as he did, and his children added their labor as soon as they were old enough to do so. The small surplus above bare necessaries was not left to those who produced it, but was appropriated by warriors and priests. In times of famine there was no surplus; the warriors and priests, however, still secured as much as at other times, with the result that many of the workers died of hunger. This system persisted in Russia until 1917 [1], and still persists in the East; in England, in spite of the Industrial Revolution, it remained in full force throughout the Napoleonic wars, and until a hundred years ago, when the new class of manufacturers acquired power. In America, the system came to an end with the Revolution, except in the South, where it persisted until the Civil War. A system which lasted so long and ended so recently has naturally left a profound impress upon men's thoughts and opinions. Much that we take for granted about the desirability of work is derived from this system, and, being pre-industrial, is not adapted to the modern world. Modern technique has made it possible for leisure, within limits, to be not the prerogative of small privileged classes, but a right evenly distributed throughout the community. The morality of work is the morality of slaves, and the modern world has no need of slavery.
-
-It is obvious that, in primitive communities, peasants, left to themselves, would not have parted with the slender surplus upon which the warriors and priests subsisted, but would have either produced less or consumed more. At first, sheer force compelled them to produce and part with the surplus. Gradually, however, it was found possible to induce many of them to accept an ethic according to which it was their duty to work hard, although part of their work went to support others in idleness. By this means the amount of compulsion required was lessened, and the expenses of government were diminished. To this day, 99 per cent of British wage-earners would be genuinely shocked if it were proposed that the King should not have a larger income than a working man. The conception of duty, speaking historically, has been a means used by the holders of power to induce others to live for the interests of their masters rather than for their own. Of course the holders of power conceal this fact from themselves by managing to believe that their interests are identical with the larger interests of humanity. Sometimes this is true; Athenian slave-owners, for instance, employed part of their leisure in making a permanent contribution to civilization which would have been impossible under a just economic system. Leisure is essential to civilization, and in former times leisure for the few was only rendered possible by the labors of the many. But their labors were valuable, not because work is good, but because leisure is good. And with modern technique it would be possible to distribute leisure justly without injury to civilization.
-
-Modern technique has made it possible to diminish enormously the amount of labor required to secure the necessaries of life for everyone. This was made obvious during the war. At that time all the men in the armed forces, and all the men and women engaged in the production of munitions, all the men and women engaged in spying, war propaganda, or Government offices connected with the war, were withdrawn from productive occupations. In spite of this, the general level of well-being among unskilled wage-earners on the side of the Allies was higher than before or since. The significance of this fact was concealed by finance: borrowing made it appear as if the future was nourishing the present. But that, of course, would have been impossible; a man cannot eat a loaf of bread that does not yet exist. The war showed conclusively that, by the scientific organization of production, it is possible to keep modern populations in fair comfort on a small part of the working capacity of the modern world. If, at the end of the war, the scientific organization, which had been created in order to liberate men for fighting and munition work, had been preserved, and the hours of the week had been cut down to four, all would have been well. Instead of that the old chaos was restored, those whose work was demanded were made to work long hours, and the rest were left to starve as unemployed. Why? Because work is a duty, and a man should not receive wages in proportion to what he has produced, but in proportion to his virtue as exemplified by his industry.
-
-This is the morality of the Slave State, applied in circumstances totally unlike those in which it arose. No wonder the result has been disastrous. Let us take an illustration. Suppose that, at a given moment, a certain number of people are engaged in the manufacture of pins. They make as many pins as the world needs, working (say) eight hours a day. Someone makes an invention by which the same number of men can make twice as many pins: pins are already so cheap that hardly any more will be bought at a lower price. In a sensible world, everybody concerned in the manufacturing of pins would take to working four hours instead of eight, and everything else would go on as before. But in the actual world this would be thought demoralizing. The men still work eight hours, there are too many pins, some employers go bankrupt, and half the men previously concerned in making pins are thrown out of work. There is, in the end, just as much leisure as on the other plan, but half the men are totally idle while half are still overworked. In this way, it is insured that the unavoidable leisure shall cause misery all round instead of being a universal source of happiness. Can anything more insane be imagined?
-
-The idea that the poor should have leisure has always been shocking to the rich. In England, in the early nineteenth century, fifteen hours was the ordinary day's work for a man; children sometimes did as much, and very commonly did twelve hours a day. When meddlesome busybodies suggested that perhaps these hours were rather long, they were told that work kept adults from drink and children from mischief. When I was a child, shortly after urban working men had acquired the vote, certain public holidays were established by law, to the great indignation of the upper classes. I remember hearing an old Duchess say: 'What do the poor want with holidays? They ought to work.' People nowadays are less frank, but the sentiment persists, and is the source of much of our economic confusion.
-
-Let us, for a moment, consider the ethics of work frankly, without superstition. Every human being, of necessity, consumes, in the course of his life, a certain amount of the produce of human labor. Assuming, as we may, that labor is on the whole disagreeable, it is unjust that a man should consume more than he produces. Of course he may provide services rather than commodities, like a medical man, for example; but he should provide something in return for his board and lodging. to this extent, the duty of work must be admitted, but to this extent only.
-
-I shall not dwell upon the fact that, in all modern societies outside the USSR, many people escape even this minimum amount of work, namely all those who inherit money and all those who marry money. I do not think the fact that these people are allowed to be idle is nearly so harmful as the fact that wage-earners are expected to overwork or starve.
-
-If the ordinary wage-earner worked four hours a day, there would be enough for everybody and no unemployment -- assuming a certain very moderate amount of sensible organization. This idea shocks the well-to-do, because they are convinced that the poor would not know how to use so much leisure. In America men often work long hours even when they are well off; such men, naturally, are indignant at the idea of leisure for wage-earners, except as the grim punishment of unemployment; in fact, they dislike leisure even for their sons. Oddly enough, while they wish their sons to work so hard as to have no time to be civilized, they do not mind their wives and daughters having no work at all. the snobbish admiration of uselessness, which, in an aristocratic society, extends to both sexes, is, under a plutocracy, confined to women; this, however, does not make it any more in agreement with common sense.
-
-The wise use of leisure, it must be conceded, is a product of civilization and education. A man who has worked long hours all his life will become bored if he becomes suddenly idle. But without a considerable amount of leisure a man is cut off from many of the best things. There is no longer any reason why the bulk of the population should suffer this deprivation; only a foolish asceticism, usually vicarious, makes us continue to insist on work in excessive quantities now that the need no longer exists.
-
-In the new creed which controls the government of Russia, while there is much that is very different from the traditional teaching of the West, there are some things that are quite unchanged. The attitude of the governing classes, and especially of those who conduct educational propaganda, on the subject of the dignity of labor, is almost exactly that which the governing classes of the world have always preached to what were called the 'honest poor'. Industry, sobriety, willingness to work long hours for distant advantages, even submissiveness to authority, all these reappear; moreover authority still represents the will of the Ruler of the Universe, Who, however, is now called by a new name, Dialectical Materialism.
-
-The victory of the proletariat in Russia has some points in common with the victory of the feminists in some other countries. For ages, men had conceded the superior saintliness of women, and had consoled women for their inferiority by maintaining that saintliness is more desirable than power. At last the feminists decided that they would have both, since the pioneers among them believed all that the men had told them about the desirability of virtue, but not what they had told them about the worthlessness of political power. A similar thing has happened in Russia as regards manual work. For ages, the rich and their sycophants have written in praise of 'honest toil', have praised the simple life, have professed a religion which teaches that the poor are much more likely to go to heaven than the rich, and in general have tried to make manual workers believe that there is some special nobility about altering the position of matter in space, just as men tried to make women believe that they derived some special nobility from their sexual enslavement. In Russia, all this teaching about the excellence of manual work has been taken seriously, with the result that the manual worker is more honored than anyone else. What are, in essence, revivalist appeals are made, but not for the old purposes: they are made to secure shock workers for special tasks. Manual work is the ideal which is held before the young, and is the basis of all ethical teaching.
-
-For the present, possibly, this is all to the good. A large country, full of natural resources, awaits development, and has has to be developed with very little use of credit. In these circumstances, hard work is necessary, and is likely to bring a great reward. But what will happen when the point has been reached where everybody could be comfortable without working long hours?
-
-In the West, we have various ways of dealing with this problem. We have no attempt at economic justice, so that a large proportion of the total produce goes to a small minority of the population, many of whom do no work at all. Owing to the absence of any central control over production, we produce hosts of things that are not wanted. We keep a large percentage of the working population idle, because we can dispense with their labor by making the others overwork. When all these methods prove inadequate, we have a war: we cause a number of people to manufacture high explosives, and a number of others to explode them, as if we were children who had just discovered fireworks. By a combination of all these devices we manage, though with difficulty, to keep alive the notion that a great deal of severe manual work must be the lot of the average man.
-
-In Russia, owing to more economic justice and central control over production, the problem will have to be differently solved. the rational solution would be, as soon as the necessaries and elementary comforts can be provided for all, to reduce the hours of labor gradually, allowing a popular vote to decide, at each stage, whether more leisure or more goods were to be preferred. But, having taught the supreme virtue of hard work, it is difficult to see how the authorities can aim at a paradise in which there will be much leisure and little work. It seems more likely that they will find continually fresh schemes, by which present leisure is to be sacrificed to future productivity. I read recently of an ingenious plan put forward by Russian engineers, for making the White Sea and the northern coasts of Siberia warm, by putting a dam across the Kara Sea. An admirable project, but liable to postpone proletarian comfort for a generation, while the nobility of toil is being displayed amid the ice-fields and snowstorms of the Arctic Ocean. This sort of thing, if it happens, will be the result of regarding the virtue of hard work as an end in itself, rather than as a means to a state of affairs in which it is no longer needed.
-
-The fact is that moving matter about, while a certain amount of it is necessary to our existence, is emphatically not one of the ends of human life. If it were, we should have to consider every navvy superior to Shakespeare. We have been misled in this matter by two causes. One is the necessity of keeping the poor contented, which has led the rich, for thousands of years, to preach the dignity of labor, while taking care themselves to remain undignified in this respect. The other is the new pleasure in mechanism, which makes us delight in the astonishingly clever changes that we can produce on the earth's surface. Neither of these motives makes any great appeal to the actual worker. If you ask him what he thinks the best part of his life, he is not likely to say: 'I enjoy manual work because it makes me feel that I am fulfilling man's noblest task, and because I like to think how much man can transform his planet. It is true that my body demands periods of rest, which I have to fill in as best I may, but I am never so happy as when the morning comes and I can return to the toil from which my contentment springs.' I have never heard working men say this sort of thing. They consider work, as it should be considered, a necessary means to a livelihood, and it is from their leisure that they derive whatever happiness they may enjoy.
-
-It will be said that, while a little leisure is pleasant, men would not know how to fill their days if they had only four hours of work out of the twenty-four. In so far as this is true in the modern world, it is a condemnation of our civilization; it would not have been true at any earlier period. There was formerly a capacity for light-heartedness and play which has been to some extent inhibited by the cult of efficiency. The modern man thinks that everything ought to be done for the sake of something else, and never for its own sake. Serious-minded persons, for example, are continually condemning the habit of going to the cinema, and telling us that it leads the young into crime. But all the work that goes to producing a cinema is respectable, because it is work, and because it brings a money profit. The notion that the desirable activities are those that bring a profit has made everything topsy-turvy. The butcher who provides you with meat and the baker who provides you with bread are praiseworthy, because they are making money; but when you enjoy the food they have provided, you are merely frivolous, unless you eat only to get strength for your work. Broadly speaking, it is held that getting money is good and spending money is bad. Seeing that they are two sides of one transaction, this is absurd; one might as well maintain that keys are good, but keyholes are bad. Whatever merit there may be in the production of goods must be entirely derivative from the advantage to be obtained by consuming them. The individual, in our society, works for profit; but the social purpose of his work lies in the consumption of what he produces. It is this divorce between the individual and the social purpose of production that makes it so difficult for men to think clearly in a world in which profit-making is the incentive to industry. We think too much of production, and too little of consumption. One result is that we attach too little importance to enjoyment and simple happiness, and that we do not judge production by the pleasure that it gives to the consumer.
-
-When I suggest that working hours should be reduced to four, I am not meaning to imply that all the remaining time should necessarily be spent in pure frivolity. I mean that four hours' work a day should entitle a man to the necessities and elementary comforts of life, and that the rest of his time should be his to use as he might see fit. It is an essential part of any such social system that education should be carried further than it usually is at present, and should aim, in part, at providing tastes which would enable a man to use leisure intelligently. I am not thinking mainly of the sort of things that would be considered 'highbrow'. Peasant dances have died out except in remote rural areas, but the impulses which caused them to be cultivated must still exist in human nature. The pleasures of urban populations have become mainly passive: seeing cinemas, watching football matches, listening to the radio, and so on. This results from the fact that their active energies are fully taken up with work; if they had more leisure, they would again enjoy pleasures in which they took an active part.
-
-In the past, there was a small leisure class and a larger working class. The leisure class enjoyed advantages for which there was no basis in social justice; this necessarily made it oppressive, limited its sympathies, and caused it to invent theories by which to justify its privileges. These facts greatly diminished its excellence, but in spite of this drawback it contributed nearly the whole of what we call civilization. It cultivated the arts and discovered the sciences; it wrote the books, invented the philosophies, and refined social relations. Even the liberation of the oppressed has usually been inaugurated from above. Without the leisure class, mankind would never have emerged from barbarism.
-
-The method of a leisure class without duties was, however, extraordinarily wasteful. None of the members of the class had to be taught to be industrious, and the class as a whole was not exceptionally intelligent. The class might produce one Darwin, but against him had to be set tens of thousands of country gentlemen who never thought of anything more intelligent than fox-hunting and punishing poachers. At present, the universities are supposed to provide, in a more systematic way, what the leisure class provided accidentally and as a by-product. This is a great improvement, but it has certain drawbacks. University life is so different from life in the world at large that men who live in academic milieu tend to be unaware of the preoccupations and problems of ordinary men and women; moreover their ways of expressing themselves are usually such as to rob their opinions of the influence that they ought to have upon the general public. Another disadvantage is that in universities studies are organized, and the man who thinks of some original line of research is likely to be discouraged. Academic institutions, therefore, useful as they are, are not adequate guardians of the interests of civilization in a world where everyone outside their walls is too busy for unutilitarian pursuits.
-
-In a world where no one is compelled to work more than four hours a day, every person possessed of scientific curiosity will be able to indulge it, and every painter will be able to paint without starving, however excellent his pictures may be. Young writers will not be obliged to draw attention to themselves by sensational pot-boilers, with a view to acquiring the economic independence needed for monumental works, for which, when the time at last comes, they will have lost the taste and capacity. Men who, in their professional work, have become interested in some phase of economics or government, will be able to develop their ideas without the academic detachment that makes the work of university economists often seem lacking in reality. Medical men will have the time to learn about the progress of medicine, teachers will not be exasperatedly struggling to teach by routine methods things which they learnt in their youth, which may, in the interval, have been proved to be untrue.
-
-Above all, there will be happiness and joy of life, instead of frayed nerves, weariness, and dyspepsia. The work exacted will be enough to make leisure delightful, but not enough to produce exhaustion. Since men will not be tired in their spare time, they will not demand only such amusements as are passive and vapid. At least one per cent will probably devote the time not spent in professional work to pursuits of some public importance, and, since they will not depend upon these pursuits for their livelihood, their originality will be unhampered, and there will be no need to conform to the standards set by elderly pundits. But it is not only in these exceptional cases that the advantages of leisure will appear. Ordinary men and women, having the opportunity of a happy life, will become more kindly and less persecuting and less inclined to view others with suspicion. The taste for war will die out, partly for this reason, and partly because it will involve long and severe work for all. Good nature is, of all moral qualities, the one that the world needs most, and good nature is the result of ease and security, not of a life of arduous struggle. Modern methods of production have given us the possibility of ease and security for all; we have chosen, instead, to have overwork for some and starvation for others. Hitherto we have continued to be as energetic as we were before there were machines; in this we have been foolish, but there is no reason to go on being foolish forever.
-
-[1] Since then, members of the Communist Party have succeeded to this privilege of the warriors and priests.
diff --git a/node_modules/wordwrap/test/wrap.js b/node_modules/wordwrap/test/wrap.js
deleted file mode 100644
index 01ea471..0000000
--- a/node_modules/wordwrap/test/wrap.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var test = require('tape');
-var wordwrap = require('../');
-
-var fs = require('fs');
-var idleness = fs.readFileSync(__dirname + '/idleness.txt', 'utf8');
-
-test('stop80', function (t) {
- var lines = wordwrap(80)(idleness).split(/\n/);
- var words = idleness.split(/\s+/);
-
- lines.forEach(function (line) {
- t.ok(line.length <= 80, 'line > 80 columns');
- var chunks = line.match(/\S/) ? line.split(/\s+/) : [];
- t.deepEqual(chunks, words.splice(0, chunks.length));
- });
- t.end();
-});
-
-test('start20stop60', function (t) {
- var lines = wordwrap(20, 100)(idleness).split(/\n/);
- var words = idleness.split(/\s+/);
-
- lines.forEach(function (line) {
- t.ok(line.length <= 100, 'line > 100 columns');
- var chunks = line
- .split(/\s+/)
- .filter(function (x) { return x.match(/\S/) })
- ;
- t.deepEqual(chunks, words.splice(0, chunks.length));
- t.deepEqual(line.slice(0, 20), new Array(20 + 1).join(' '));
- });
- t.end();
-});
diff --git a/node_modules/xmlchars/README.md b/node_modules/xmlchars/README.md
index 124cf7a..609ff04 100644
--- a/node_modules/xmlchars/README.md
+++ b/node_modules/xmlchars/README.md
@@ -9,15 +9,12 @@ work well for people who cared about code optimization. Importing `xmlchars`
meant importing *all* of the library and because of the way the code was
generated there was no way to shake the resulting code tree.
-Since version 1.3.0, importing `xmlchars` is deprecated. Instead, you should
-directly load the file from `xmlchars/lib` that you care about. Even without
-tree shaking being used, this results in a smaller footprint.
-
Different modules cover different standards. At the time this documentation was
last updated, we had:
* `xmlchars/xml/1.0/ed5` which covers XML 1.0 edition 5.
* `xmlchars/xml/1.0/ed4` which covers XML 1.0 edition 4.
+* `xmlchars/xml/1.1/ed2` which covers XML 1.0 edition 2.
* `xmlchars/xmlns/1.0/ed3` which covers XML Namespaces 1.0 edition 3.
## Features
diff --git a/node_modules/xmlchars/package.json b/node_modules/xmlchars/package.json
index 748c277..e63e517 100644
--- a/node_modules/xmlchars/package.json
+++ b/node_modules/xmlchars/package.json
@@ -1,26 +1,26 @@
{
- "_from": "xmlchars@^1.3.1",
- "_id": "xmlchars@1.3.1",
+ "_from": "xmlchars@^2.1.1",
+ "_id": "xmlchars@2.2.0",
"_inBundle": false,
- "_integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==",
+ "_integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"_location": "/xmlchars",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
- "raw": "xmlchars@^1.3.1",
+ "raw": "xmlchars@^2.1.1",
"name": "xmlchars",
"escapedName": "xmlchars",
- "rawSpec": "^1.3.1",
+ "rawSpec": "^2.1.1",
"saveSpec": null,
- "fetchSpec": "^1.3.1"
+ "fetchSpec": "^2.1.1"
},
"_requiredBy": [
"/saxes"
],
- "_resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz",
- "_shasum": "1dda035f833dbb4f86a0c28eaa6ca769214793cf",
- "_spec": "xmlchars@^1.3.1",
+ "_resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "_shasum": "060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb",
+ "_spec": "xmlchars@^2.1.1",
"_where": "F:\\projects\\p\\minifyfromhtml\\node_modules\\saxes",
"author": {
"name": "Louis-Dominique Dubeau",
@@ -34,20 +34,25 @@
"deprecated": false,
"description": "Utilities for determining if characters belong to character classes defined by the XML specs.",
"devDependencies": {
- "@commitlint/cli": "^7.0.0",
- "@commitlint/config-angular": "^7.0.1",
- "@types/chai": "^4.1.4",
- "@types/mocha": "^5.2.4",
- "chai": "^4.1.2",
- "conventional-changelog-cli": "^2.0.1",
- "husky": "^0.14.3",
- "mocha": "^5.2.0",
- "ts-node": "^7.0.0",
- "tslint": "^5.10.0",
- "tslint-config-lddubeau": "^2.0.3",
- "typescript": "^2.9.2"
+ "@commitlint/cli": "^8.1.0",
+ "@commitlint/config-angular": "^8.1.0",
+ "@types/chai": "^4.2.1",
+ "@types/mocha": "^5.2.7",
+ "chai": "^4.2.0",
+ "conventional-changelog-cli": "^2.0.23",
+ "husky": "^3.0.5",
+ "mocha": "^6.2.0",
+ "ts-node": "^8.3.0",
+ "tslint": "^5.19.0",
+ "tslint-config-lddubeau": "^4.1.0",
+ "typescript": "^3.6.2"
},
"homepage": "https://github.com/lddubeau/xmlchars#readme",
+ "husky": {
+ "hooks": {
+ "commit-msg": "commitlint -e $HUSKY_GIT_PARAMS"
+ }
+ },
"keywords": [
"XML",
"validation"
@@ -62,7 +67,6 @@
"scripts": {
"build": "tsc && npm run copy",
"clean": "rm -rf build",
- "commitmsg": "commitlint -E GIT_PARAMS",
"copy": "cp README.md LICENSE build/dist && sed -e'/\"private\": true/d' package.json > build/dist/package.json",
"postpublish": "git push origin --follow-tags",
"posttest": "tslint -p tsconfig.json && tslint -p test/tsconfig.json",
@@ -78,5 +82,5 @@
"xmlchars:publish": "npm run test-install && (cd build/dist && npm publish)"
},
"types": "xmlchars.d.ts",
- "version": "1.3.1"
+ "version": "2.2.0"
}
diff --git a/node_modules/xmlchars/xml/1.0/ed5.d.ts b/node_modules/xmlchars/xml/1.0/ed5.d.ts
index bfc324d..8599346 100644
--- a/node_modules/xmlchars/xml/1.0/ed5.d.ts
+++ b/node_modules/xmlchars/xml/1.0/ed5.d.ts
@@ -7,7 +7,7 @@
*/
export declare const CHAR = "\t\n\r -\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF";
export declare const S = " \t\r\n";
-export declare const NAME_START_CHAR = ":A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\uD800\uDC00-\uDB7F\uDFFF";
+export declare const NAME_START_CHAR = ":A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\uD800\uDC00-\uDB7F\uDFFF";
export declare const NAME_CHAR: string;
export declare const CHAR_RE: RegExp;
export declare const S_RE: RegExp;
diff --git a/node_modules/xmlchars/xml/1.0/ed5.js b/node_modules/xmlchars/xml/1.0/ed5.js
index b35c4fa..e515a28 100644
--- a/node_modules/xmlchars/xml/1.0/ed5.js
+++ b/node_modules/xmlchars/xml/1.0/ed5.js
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.CHAR = "\t\n\r -\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF";
exports.S = " \t\r\n";
// tslint:disable-next-line:max-line-length
-exports.NAME_START_CHAR = ":A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\uD800\uDC00-\uDB7F\uDFFF";
+exports.NAME_START_CHAR = ":A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\uD800\uDC00-\uDB7F\uDFFF";
exports.NAME_CHAR = "-" + exports.NAME_START_CHAR + ".0-9\u00B7\u0300-\u036F\u203F-\u2040";
//
// Regular expressions.
@@ -28,8 +28,6 @@ var TAB = 9;
var NL = 0xA;
var CR = 0xD;
var SPACE = 0x20;
-var MINUS = 0x2D;
-var COLON = 0x3A;
//
// Lists.
//
@@ -43,12 +41,10 @@ exports.S_LIST = [SPACE, NL, CR, TAB];
* @returns ``true`` if the codepoint matches ``CHAR``.
*/
function isChar(c) {
- return (c === TAB ||
- c === NL ||
- c === CR ||
- (c >= SPACE && c <= 0xD7FF) ||
+ return (c >= SPACE && c <= 0xD7FF) ||
+ c === NL || c === CR || c === TAB ||
(c >= 0xE000 && c <= 0xFFFD) ||
- (c >= 0x10000 && c <= 0x10FFFF));
+ (c >= 0x10000 && c <= 0x10FFFF);
}
exports.isChar = isChar;
/**
@@ -69,18 +65,18 @@ exports.isS = isS;
*
* @returns ``true`` if the codepoint matches ``NAME_START_CHAR``.
*/
-// tslint:disable-next-line:cyclomatic-complexity
function isNameStartChar(c) {
- return (c === COLON ||
- (c >= 0x41 && c <= 0x5A) ||
- c === 0x5F ||
+ return ((c >= 0x41 && c <= 0x5A) ||
(c >= 0x61 && c <= 0x7A) ||
+ c === 0x3A ||
+ c === 0x5F ||
+ c === 0x200C ||
+ c === 0x200D ||
(c >= 0xC0 && c <= 0xD6) ||
(c >= 0xD8 && c <= 0xF6) ||
(c >= 0x00F8 && c <= 0x02FF) ||
(c >= 0x0370 && c <= 0x037D) ||
(c >= 0x037F && c <= 0x1FFF) ||
- (c >= 0x200C && c <= 0x200D) ||
(c >= 0x2070 && c <= 0x218F) ||
(c >= 0x2C00 && c <= 0x2FEF) ||
(c >= 0x3001 && c <= 0xD7FF) ||
@@ -98,12 +94,12 @@ exports.isNameStartChar = isNameStartChar;
*/
function isNameChar(c) {
return isNameStartChar(c) ||
- (c === MINUS ||
- c === 0x2E ||
- (c >= 0x30 && c <= 0x39) ||
- c === 0x00B7 ||
- (c >= 0x0300 && c <= 0x036F) ||
- (c >= 0x203F && c <= 0x2040));
+ (c >= 0x30 && c <= 0x39) ||
+ c === 0x2D ||
+ c === 0x2E ||
+ c === 0xB7 ||
+ (c >= 0x0300 && c <= 0x036F) ||
+ (c >= 0x203F && c <= 0x2040);
}
exports.isNameChar = isNameChar;
//# sourceMappingURL=ed5.js.map
\ No newline at end of file
diff --git a/node_modules/xmlchars/xml/1.0/ed5.js.map b/node_modules/xmlchars/xml/1.0/ed5.js.map
index 0d4bc25..cc8dbe9 100644
--- a/node_modules/xmlchars/xml/1.0/ed5.js.map
+++ b/node_modules/xmlchars/xml/1.0/ed5.js.map
@@ -1 +1 @@
-{"version":3,"file":"ed5.js","sourceRoot":"","sources":["../../../../src/xml/1.0/ed5.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAEH,EAAE;AACF,aAAa;AACb,EAAE;AACW,QAAA,IAAI,GAAG,sDAAsD,CAAC;AAE9D,QAAA,CAAC,GAAG,SAAS,CAAC;AAE3B,2CAA2C;AAC9B,QAAA,eAAe,GAAG,kLAA4K,CAAC;AAE/L,QAAA,SAAS,GACpB,MAAI,uBAAe,yCAAsC,CAAC;AAE5D,EAAE;AACF,uBAAuB;AACvB,EAAE;AAEW,QAAA,OAAO,GAAG,IAAI,MAAM,CAAC,OAAK,YAAI,OAAI,EAAE,GAAG,CAAC,CAAC;AAEzC,QAAA,IAAI,GAAG,IAAI,MAAM,CAAC,OAAK,SAAC,QAAK,EAAE,GAAG,CAAC,CAAC;AAEpC,QAAA,kBAAkB,GAAG,IAAI,MAAM,CAAC,OAAK,uBAAe,OAAI,EAAE,GAAG,CAAC,CAAC;AAE/D,QAAA,YAAY,GAAG,IAAI,MAAM,CAAC,OAAK,iBAAS,OAAI,EAAE,GAAG,CAAC,CAAC;AAEnD,QAAA,OAAO,GAAG,IAAI,MAAM,CAAC,OAAK,uBAAe,UAAK,iBAAS,QAAK,EAAE,GAAG,CAAC,CAAC;AAEnE,QAAA,UAAU,GAAG,IAAI,MAAM,CAAC,OAAK,iBAAS,QAAK,EAAE,GAAG,CAAC,CAAC;AAE/D,IAAM,GAAG,GAAG,CAAC,CAAC;AACd,IAAM,EAAE,GAAG,GAAG,CAAC;AACf,IAAM,EAAE,GAAG,GAAG,CAAC;AACf,IAAM,KAAK,GAAG,IAAI,CAAC;AACnB,IAAM,KAAK,GAAG,IAAI,CAAC;AACnB,IAAM,KAAK,GAAG,IAAI,CAAC;AAEnB,EAAE;AACF,SAAS;AACT,EAAE;AAEF,8CAA8C;AACjC,QAAA,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAE3C;;;;;;GAMG;AACH,gBAAuB,CAAS;IAC9B,OAAO,CAAC,CAAC,KAAK,GAAG;QACT,CAAC,KAAK,EAAE;QACR,CAAC,KAAK,EAAE;QACR,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC;QAC3B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;AAC3C,CAAC;AAPD,wBAOC;AAED;;;;;;GAMG;AACH,aAAoB,CAAS;IAC3B,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;AAC1D,CAAC;AAFD,kBAEC;AAED;;;;;;GAMG;AACH,iDAAiD;AACjD,yBAAgC,CAAS;IACvC,OAAO,CAAC,CAAC,KAAK,KAAK;QACX,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,KAAK,IAAI;QACV,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AAjBD,0CAiBC;AAED;;;;;;GAMG;AACH,oBAA2B,CAAS;IAClC,OAAO,eAAe,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,KAAK,KAAK;YACX,CAAC,KAAK,IAAI;YACV,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;YACxB,CAAC,KAAK,MAAM;YACZ,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;YAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACnC,CAAC;AARD,gCAQC"}
\ No newline at end of file
+{"version":3,"file":"ed5.js","sourceRoot":"","sources":["../../../../src/xml/1.0/ed5.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAEH,EAAE;AACF,aAAa;AACb,EAAE;AACW,QAAA,IAAI,GAAG,sDAAsD,CAAC;AAE9D,QAAA,CAAC,GAAG,SAAS,CAAC;AAE3B,2CAA2C;AAC9B,QAAA,eAAe,GAAG,iLAA2K,CAAC;AAE9L,QAAA,SAAS,GACpB,MAAI,uBAAe,yCAAsC,CAAC;AAE5D,EAAE;AACF,uBAAuB;AACvB,EAAE;AAEW,QAAA,OAAO,GAAG,IAAI,MAAM,CAAC,OAAK,YAAI,OAAI,EAAE,GAAG,CAAC,CAAC;AAEzC,QAAA,IAAI,GAAG,IAAI,MAAM,CAAC,OAAK,SAAC,QAAK,EAAE,GAAG,CAAC,CAAC;AAEpC,QAAA,kBAAkB,GAAG,IAAI,MAAM,CAAC,OAAK,uBAAe,OAAI,EAAE,GAAG,CAAC,CAAC;AAE/D,QAAA,YAAY,GAAG,IAAI,MAAM,CAAC,OAAK,iBAAS,OAAI,EAAE,GAAG,CAAC,CAAC;AAEnD,QAAA,OAAO,GAAG,IAAI,MAAM,CAAC,OAAK,uBAAe,UAAK,iBAAS,QAAK,EAAE,GAAG,CAAC,CAAC;AAEnE,QAAA,UAAU,GAAG,IAAI,MAAM,CAAC,OAAK,iBAAS,QAAK,EAAE,GAAG,CAAC,CAAC;AAE/D,IAAM,GAAG,GAAG,CAAC,CAAC;AACd,IAAM,EAAE,GAAG,GAAG,CAAC;AACf,IAAM,EAAE,GAAG,GAAG,CAAC;AACf,IAAM,KAAK,GAAG,IAAI,CAAC;AAEnB,EAAE;AACF,SAAS;AACT,EAAE;AAEF,8CAA8C;AACjC,QAAA,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAE3C;;;;;;GAMG;AACH,SAAgB,MAAM,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC;QAChC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG;QACjC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;AACpC,CAAC;AALD,wBAKC;AAED;;;;;;GAMG;AACH,SAAgB,GAAG,CAAC,CAAS;IAC3B,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;AAC1D,CAAC;AAFD,kBAEC;AAED;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,CAAS;IACvC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,MAAM;QACZ,CAAC,KAAK,MAAM;QACZ,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AAlBD,0CAkBC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,CAAS;IAClC,OAAO,eAAe,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,IAAI;QACV,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;AACjC,CAAC;AARD,gCAQC"}
\ No newline at end of file
diff --git a/node_modules/xmlchars/xml/1.1/ed2.d.ts b/node_modules/xmlchars/xml/1.1/ed2.d.ts
new file mode 100644
index 0000000..5e96aee
--- /dev/null
+++ b/node_modules/xmlchars/xml/1.1/ed2.d.ts
@@ -0,0 +1,73 @@
+/**
+ * Character classes and associated utilities for the 2nd edition of XML 1.1.
+ *
+ * @author Louis-Dominique Dubeau
+ * @license MIT
+ * @copyright Louis-Dominique Dubeau
+ */
+export declare const CHAR = "\u0001-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF";
+export declare const RESTRICTED_CHAR = "\u0001-\b\v\f\u000E-\u001F-\u0084\u0086-\u009F";
+export declare const S = " \t\r\n";
+export declare const NAME_START_CHAR = ":A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\uD800\uDC00-\uDB7F\uDFFF";
+export declare const NAME_CHAR: string;
+export declare const CHAR_RE: RegExp;
+export declare const RESTRICTED_CHAR_RE: RegExp;
+export declare const S_RE: RegExp;
+export declare const NAME_START_CHAR_RE: RegExp;
+export declare const NAME_CHAR_RE: RegExp;
+export declare const NAME_RE: RegExp;
+export declare const NMTOKEN_RE: RegExp;
+/** All characters in the ``S`` production. */
+export declare const S_LIST: number[];
+/**
+ * Determines whether a codepoint matches the ``CHAR`` production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``CHAR``.
+ */
+export declare function isChar(c: number): boolean;
+/**
+ * Determines whether a codepoint matches the ``RESTRICTED_CHAR`` production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``RESTRICTED_CHAR``.
+ */
+export declare function isRestrictedChar(c: number): boolean;
+/**
+ * Determines whether a codepoint matches the ``CHAR`` production and does not
+ * match the ``RESTRICTED_CHAR`` production. ``isCharAndNotRestricted(x)`` is
+ * equivalent to ``isChar(x) && !isRestrictedChar(x)``. This function is faster
+ * than running the two-call equivalent.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``CHAR`` and does not match
+ * ``RESTRICTED_CHAR``.
+ */
+export declare function isCharAndNotRestricted(c: number): boolean;
+/**
+ * Determines whether a codepoint matches the ``S`` (space) production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``S``.
+ */
+export declare function isS(c: number): boolean;
+/**
+ * Determines whether a codepoint matches the ``NAME_START_CHAR`` production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``NAME_START_CHAR``.
+ */
+export declare function isNameStartChar(c: number): boolean;
+/**
+ * Determines whether a codepoint matches the ``NAME_CHAR`` production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``NAME_CHAR``.
+ */
+export declare function isNameChar(c: number): boolean;
diff --git a/node_modules/xmlchars/xml/1.1/ed2.js b/node_modules/xmlchars/xml/1.1/ed2.js
new file mode 100644
index 0000000..7906e76
--- /dev/null
+++ b/node_modules/xmlchars/xml/1.1/ed2.js
@@ -0,0 +1,145 @@
+"use strict";
+/**
+ * Character classes and associated utilities for the 2nd edition of XML 1.1.
+ *
+ * @author Louis-Dominique Dubeau
+ * @license MIT
+ * @copyright Louis-Dominique Dubeau
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+//
+// Fragments.
+//
+exports.CHAR = "\u0001-\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF";
+exports.RESTRICTED_CHAR = "\u0001-\u0008\u000B\u000C\u000E-\u001F\u007F-\u0084\u0086-\u009F";
+exports.S = " \t\r\n";
+// tslint:disable-next-line:max-line-length
+exports.NAME_START_CHAR = ":A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\uD800\uDC00-\uDB7F\uDFFF";
+exports.NAME_CHAR = "-" + exports.NAME_START_CHAR + ".0-9\u00B7\u0300-\u036F\u203F-\u2040";
+//
+// Regular expressions.
+//
+exports.CHAR_RE = new RegExp("^[" + exports.CHAR + "]$", "u");
+exports.RESTRICTED_CHAR_RE = new RegExp("^[" + exports.RESTRICTED_CHAR + "]$", "u");
+exports.S_RE = new RegExp("^[" + exports.S + "]+$", "u");
+exports.NAME_START_CHAR_RE = new RegExp("^[" + exports.NAME_START_CHAR + "]$", "u");
+exports.NAME_CHAR_RE = new RegExp("^[" + exports.NAME_CHAR + "]$", "u");
+exports.NAME_RE = new RegExp("^[" + exports.NAME_START_CHAR + "][" + exports.NAME_CHAR + "]*$", "u");
+exports.NMTOKEN_RE = new RegExp("^[" + exports.NAME_CHAR + "]+$", "u");
+var TAB = 9;
+var NL = 0xA;
+var CR = 0xD;
+var SPACE = 0x20;
+//
+// Lists.
+//
+/** All characters in the ``S`` production. */
+exports.S_LIST = [SPACE, NL, CR, TAB];
+/**
+ * Determines whether a codepoint matches the ``CHAR`` production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``CHAR``.
+ */
+function isChar(c) {
+ return (c >= 0x0001 && c <= 0xD7FF) ||
+ (c >= 0xE000 && c <= 0xFFFD) ||
+ (c >= 0x10000 && c <= 0x10FFFF);
+}
+exports.isChar = isChar;
+/**
+ * Determines whether a codepoint matches the ``RESTRICTED_CHAR`` production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``RESTRICTED_CHAR``.
+ */
+function isRestrictedChar(c) {
+ return (c >= 0x1 && c <= 0x8) ||
+ c === 0xB ||
+ c === 0xC ||
+ (c >= 0xE && c <= 0x1F) ||
+ (c >= 0x7F && c <= 0x84) ||
+ (c >= 0x86 && c <= 0x9F);
+}
+exports.isRestrictedChar = isRestrictedChar;
+/**
+ * Determines whether a codepoint matches the ``CHAR`` production and does not
+ * match the ``RESTRICTED_CHAR`` production. ``isCharAndNotRestricted(x)`` is
+ * equivalent to ``isChar(x) && !isRestrictedChar(x)``. This function is faster
+ * than running the two-call equivalent.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``CHAR`` and does not match
+ * ``RESTRICTED_CHAR``.
+ */
+function isCharAndNotRestricted(c) {
+ return (c === 0x9) ||
+ (c === 0xA) ||
+ (c === 0xD) ||
+ (c > 0x1F && c < 0x7F) ||
+ (c === 0x85) ||
+ (c > 0x9F && c <= 0xD7FF) ||
+ (c >= 0xE000 && c <= 0xFFFD) ||
+ (c >= 0x10000 && c <= 0x10FFFF);
+}
+exports.isCharAndNotRestricted = isCharAndNotRestricted;
+/**
+ * Determines whether a codepoint matches the ``S`` (space) production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``S``.
+ */
+function isS(c) {
+ return c === SPACE || c === NL || c === CR || c === TAB;
+}
+exports.isS = isS;
+/**
+ * Determines whether a codepoint matches the ``NAME_START_CHAR`` production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``NAME_START_CHAR``.
+ */
+// tslint:disable-next-line:cyclomatic-complexity
+function isNameStartChar(c) {
+ return ((c >= 0x41 && c <= 0x5A) ||
+ (c >= 0x61 && c <= 0x7A) ||
+ c === 0x3A ||
+ c === 0x5F ||
+ c === 0x200C ||
+ c === 0x200D ||
+ (c >= 0xC0 && c <= 0xD6) ||
+ (c >= 0xD8 && c <= 0xF6) ||
+ (c >= 0x00F8 && c <= 0x02FF) ||
+ (c >= 0x0370 && c <= 0x037D) ||
+ (c >= 0x037F && c <= 0x1FFF) ||
+ (c >= 0x2070 && c <= 0x218F) ||
+ (c >= 0x2C00 && c <= 0x2FEF) ||
+ (c >= 0x3001 && c <= 0xD7FF) ||
+ (c >= 0xF900 && c <= 0xFDCF) ||
+ (c >= 0xFDF0 && c <= 0xFFFD) ||
+ (c >= 0x10000 && c <= 0xEFFFF));
+}
+exports.isNameStartChar = isNameStartChar;
+/**
+ * Determines whether a codepoint matches the ``NAME_CHAR`` production.
+ *
+ * @param c The code point.
+ *
+ * @returns ``true`` if the codepoint matches ``NAME_CHAR``.
+ */
+function isNameChar(c) {
+ return isNameStartChar(c) ||
+ (c >= 0x30 && c <= 0x39) ||
+ c === 0x2D ||
+ c === 0x2E ||
+ c === 0xB7 ||
+ (c >= 0x0300 && c <= 0x036F) ||
+ (c >= 0x203F && c <= 0x2040);
+}
+exports.isNameChar = isNameChar;
+//# sourceMappingURL=ed2.js.map
\ No newline at end of file
diff --git a/node_modules/xmlchars/xml/1.1/ed2.js.map b/node_modules/xmlchars/xml/1.1/ed2.js.map
new file mode 100644
index 0000000..96fb7e2
--- /dev/null
+++ b/node_modules/xmlchars/xml/1.1/ed2.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"ed2.js","sourceRoot":"","sources":["../../../../src/xml/1.1/ed2.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAEH,EAAE;AACF,aAAa;AACb,EAAE;AACW,QAAA,IAAI,GAAG,qDAAgD,CAAC;AAExD,QAAA,eAAe,GAC1B,kEAAkE,CAAC;AAExD,QAAA,CAAC,GAAG,SAAS,CAAC;AAE3B,2CAA2C;AAC9B,QAAA,eAAe,GAAG,iLAA2K,CAAC;AAE9L,QAAA,SAAS,GACpB,MAAI,uBAAe,yCAAsC,CAAC;AAE5D,EAAE;AACF,uBAAuB;AACvB,EAAE;AAEW,QAAA,OAAO,GAAG,IAAI,MAAM,CAAC,OAAK,YAAI,OAAI,EAAE,GAAG,CAAC,CAAC;AAEzC,QAAA,kBAAkB,GAAG,IAAI,MAAM,CAAC,OAAK,uBAAe,OAAI,EAAE,GAAG,CAAC,CAAC;AAE/D,QAAA,IAAI,GAAG,IAAI,MAAM,CAAC,OAAK,SAAC,QAAK,EAAE,GAAG,CAAC,CAAC;AAEpC,QAAA,kBAAkB,GAAG,IAAI,MAAM,CAAC,OAAK,uBAAe,OAAI,EAAE,GAAG,CAAC,CAAC;AAE/D,QAAA,YAAY,GAAG,IAAI,MAAM,CAAC,OAAK,iBAAS,OAAI,EAAE,GAAG,CAAC,CAAC;AAEnD,QAAA,OAAO,GAAG,IAAI,MAAM,CAAC,OAAK,uBAAe,UAAK,iBAAS,QAAK,EAAE,GAAG,CAAC,CAAC;AAEnE,QAAA,UAAU,GAAG,IAAI,MAAM,CAAC,OAAK,iBAAS,QAAK,EAAE,GAAG,CAAC,CAAC;AAE/D,IAAM,GAAG,GAAG,CAAC,CAAC;AACd,IAAM,EAAE,GAAG,GAAG,CAAC;AACf,IAAM,EAAE,GAAG,GAAG,CAAC;AACf,IAAM,KAAK,GAAG,IAAI,CAAC;AAEnB,EAAE;AACF,SAAS;AACT,EAAE;AAEF,8CAA8C;AACjC,QAAA,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;AAE3C;;;;;;GAMG;AACH,SAAgB,MAAM,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QACjC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;AACpC,CAAC;AAJD,wBAIC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,CAAS;IACxC,OAAO,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC;QAC3B,CAAC,KAAK,GAAG;QACT,CAAC,KAAK,GAAG;QACT,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;QACvB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;AAC7B,CAAC;AAPD,4CAOC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,sBAAsB,CAAC,CAAS;IAC9C,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;QAChB,CAAC,CAAC,KAAK,GAAG,CAAC;QACX,CAAC,CAAC,KAAK,GAAG,CAAC;QACX,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;QACtB,CAAC,CAAC,KAAK,IAAI,CAAC;QACZ,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC;QACzB,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC;AACpC,CAAC;AATD,wDASC;AAED;;;;;;GAMG;AACH,SAAgB,GAAG,CAAC,CAAS;IAC3B,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC;AAC1D,CAAC;AAFD,kBAEC;AAED;;;;;;GAMG;AACH,iDAAiD;AACjD,SAAgB,eAAe,CAAC,CAAS;IACvC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,MAAM;QACZ,CAAC,KAAK,MAAM;QACZ,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AAlBD,0CAkBC;AAED;;;;;;GAMG;AACH,SAAgB,UAAU,CAAC,CAAS;IAClC,OAAO,eAAe,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,IAAI;QACV,CAAC,KAAK,IAAI;QACV,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;AACjC,CAAC;AARD,gCAQC"}
\ No newline at end of file
diff --git a/node_modules/xmlchars/xmlchars.d.ts b/node_modules/xmlchars/xmlchars.d.ts
index 6752c7b..bdb3d40 100644
--- a/node_modules/xmlchars/xmlchars.d.ts
+++ b/node_modules/xmlchars/xmlchars.d.ts
@@ -25,7 +25,7 @@ export declare namespace XML_1_0 {
namespace fragments {
const CHAR = "\t\n\r -\uD7FF\uE000-\uFFFD\uD800\uDC00-\uDBFF\uDFFF";
const S = " \t\r\n";
- const NAME_START_CHAR = ":A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\uD800\uDC00-\uDB7F\uDFFF";
+ const NAME_START_CHAR = ":A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\uD800\uDC00-\uDB7F\uDFFF";
const NAME_CHAR: string;
}
/**
diff --git a/node_modules/xmlchars/xmlchars.js b/node_modules/xmlchars/xmlchars.js
index eaf2555..acf682b 100644
--- a/node_modules/xmlchars/xmlchars.js
+++ b/node_modules/xmlchars/xmlchars.js
@@ -13,11 +13,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
var ed4 = require("./xml/1.0/ed4");
var ed5 = require("./xml/1.0/ed5");
var nsed3 = require("./xmlns/1.0/ed3");
+// tslint:disable-next-line:no-console
console.warn("DEPRECATION WARNING: the xmlchar *module* is deprecated: please \
replace e.g. require('xmlchars') with require('xmlchars/xml/...')");
/**
* Character class utilities for XML 1.0.
*/
+// tslint:disable-next-line:no-namespace
var XML_1_0;
(function (XML_1_0) {
/**
@@ -140,6 +142,7 @@ var XML_1_0;
/**
* Character class utilities for XML NS 1.0.
*/
+// tslint:disable-next-line:no-namespace
var XMLNS_1_0;
(function (XMLNS_1_0) {
/**
diff --git a/node_modules/xmlchars/xmlchars.js.map b/node_modules/xmlchars/xmlchars.js.map
index 22d2385..47b8c34 100644
--- a/node_modules/xmlchars/xmlchars.js.map
+++ b/node_modules/xmlchars/xmlchars.js.map
@@ -1 +1 @@
-{"version":3,"file":"xmlchars.js","sourceRoot":"","sources":["../../src/xmlchars.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAEH,mCAAqC;AACrC,mCAAqC;AACrC,uCAAyC;AAEzC,OAAO,CAAC,IAAI,CAAC;kEACqD,CAAC,CAAC;AAEpE;;GAEG;AACH,IAAiB,OAAO,CAsHvB;AAtHD,WAAiB,OAAO;IACtB;;OAEG;IACH,IAAiB,GAAG,CAwEnB;IAxED,WAAiB,GAAG;QAClB;;;WAGG;QACH,IAAiB,SAAS,CAKzB;QALD,WAAiB,SAAS;YACX,cAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAChB,WAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACV,yBAAe,GAAG,GAAG,CAAC,eAAe,CAAC;YACtC,mBAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACzC,CAAC,EALgB,SAAS,GAAT,aAAS,KAAT,aAAS,QAKzB;QAED;;;WAGG;QACH,IAAiB,OAAO,CAOvB;QAPD,WAAiB,OAAO;YACT,YAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACnB,SAAC,GAAG,GAAG,CAAC,IAAI,CAAC;YACb,uBAAe,GAAG,GAAG,CAAC,kBAAkB,CAAC;YACzC,iBAAS,GAAG,GAAG,CAAC,YAAY,CAAC;YAC7B,YAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACnB,eAAO,GAAG,GAAG,CAAC,UAAU,CAAC;QACxC,CAAC,EAPgB,OAAO,GAAP,WAAO,KAAP,WAAO,QAOvB;QAED;;;;;;WAMG;QACH,IAAiB,KAAK,CAErB;QAFD,WAAiB,KAAK;YACP,OAAC,GAAG,GAAG,CAAC,MAAM,CAAC;QAC9B,CAAC,EAFgB,KAAK,GAAL,SAAK,KAAL,SAAK,QAErB;QAED;;;;;;WAMG;QACU,UAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAEjC;;;;;;WAMG;QACU,OAAG,GAAG,GAAG,CAAC,GAAG,CAAC;QAE3B;;;;;;;WAOG;QACU,mBAAe,GAAG,GAAG,CAAC,eAAe,CAAC;QAEnD;;;;;;WAMG;QACU,cAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAC3C,CAAC,EAxEgB,GAAG,GAAH,WAAG,KAAH,WAAG,QAwEnB;IAED;;;;OAIG;IACH,IAAiB,GAAG,CAkCnB;IAlCD,WAAiB,GAAG;QAClB;;;WAGG;QACH,IAAiB,SAAS,CAUzB;QAVD,WAAiB,SAAS;YACX,cAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAChB,WAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACV,mBAAS,GAAG,GAAG,CAAC,SAAS,CAAC;YAC1B,qBAAW,GAAG,GAAG,CAAC,WAAW,CAAC;YAC9B,wBAAc,GAAG,GAAG,CAAC,cAAc,CAAC;YACpC,eAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAClB,kBAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YACxB,gBAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YACpB,mBAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACzC,CAAC,EAVgB,SAAS,GAAT,aAAS,KAAT,aAAS,QAUzB;QAED;;;WAGG;QACH,IAAiB,OAAO,CAYvB;QAZD,WAAiB,OAAO;YACT,YAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACnB,SAAC,GAAG,GAAG,CAAC,IAAI,CAAC;YACb,iBAAS,GAAG,GAAG,CAAC,YAAY,CAAC;YAC7B,mBAAW,GAAG,GAAG,CAAC,cAAc,CAAC;YACjC,sBAAc,GAAG,GAAG,CAAC,iBAAiB,CAAC;YACvC,aAAK,GAAG,GAAG,CAAC,QAAQ,CAAC;YACrB,gBAAQ,GAAG,GAAG,CAAC,WAAW,CAAC;YAC3B,cAAM,GAAG,GAAG,CAAC,SAAS,CAAC;YACvB,iBAAS,GAAG,GAAG,CAAC,YAAY,CAAC;YAC7B,YAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACnB,eAAO,GAAG,GAAG,CAAC,UAAU,CAAC;QACxC,CAAC,EAZgB,OAAO,GAAP,WAAO,KAAP,WAAO,QAYvB;IACH,CAAC,EAlCgB,GAAG,GAAH,WAAG,KAAH,WAAG,QAkCnB;AACH,CAAC,EAtHgB,OAAO,GAAP,eAAO,KAAP,eAAO,QAsHvB;AAED;;GAEG;AACH,IAAiB,SAAS,CA4CzB;AA5CD,WAAiB,SAAS;IAExB;;OAEG;IACH,IAAiB,GAAG,CAsCnB;IAtCD,WAAiB,GAAG;QAClB;;;WAGG;QACH,IAAiB,SAAS,CAGzB;QAHD,WAAiB,SAAS;YACX,4BAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC;YAC9C,sBAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACjD,CAAC,EAHgB,SAAS,GAAT,aAAS,KAAT,aAAS,QAGzB;QAED;;;WAGG;QACH,IAAiB,OAAO,CAIvB;QAJD,WAAiB,OAAO;YACT,0BAAkB,GAAG,KAAK,CAAC,qBAAqB,CAAC;YACjD,oBAAY,GAAG,KAAK,CAAC,eAAe,CAAC;YACrC,eAAO,GAAG,KAAK,CAAC,UAAU,CAAC;QAC1C,CAAC,EAJgB,OAAO,GAAP,WAAO,KAAP,WAAO,QAIvB;QAED;;;;;;;WAOG;QACU,qBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAEzD;;;;;;WAMG;QACU,gBAAY,GAAG,KAAK,CAAC,YAAY,CAAC;IACjD,CAAC,EAtCgB,GAAG,GAAH,aAAG,KAAH,aAAG,QAsCnB;AACH,CAAC,EA5CgB,SAAS,GAAT,iBAAS,KAAT,iBAAS,QA4CzB"}
\ No newline at end of file
+{"version":3,"file":"xmlchars.js","sourceRoot":"","sources":["../../src/xmlchars.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAEH,mCAAqC;AACrC,mCAAqC;AACrC,uCAAyC;AAEzC,sCAAsC;AACtC,OAAO,CAAC,IAAI,CAAC;kEACqD,CAAC,CAAC;AAEpE;;GAEG;AACH,wCAAwC;AACxC,IAAiB,OAAO,CAsHvB;AAtHD,WAAiB,OAAO;IACtB;;OAEG;IACH,IAAiB,GAAG,CAwEnB;IAxED,WAAiB,GAAG;QAClB;;;WAGG;QACH,IAAiB,SAAS,CAKzB;QALD,WAAiB,SAAS;YACX,cAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAChB,WAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACV,yBAAe,GAAG,GAAG,CAAC,eAAe,CAAC;YACtC,mBAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACzC,CAAC,EALgB,SAAS,GAAT,aAAS,KAAT,aAAS,QAKzB;QAED;;;WAGG;QACH,IAAiB,OAAO,CAOvB;QAPD,WAAiB,OAAO;YACT,YAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACnB,SAAC,GAAG,GAAG,CAAC,IAAI,CAAC;YACb,uBAAe,GAAG,GAAG,CAAC,kBAAkB,CAAC;YACzC,iBAAS,GAAG,GAAG,CAAC,YAAY,CAAC;YAC7B,YAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACnB,eAAO,GAAG,GAAG,CAAC,UAAU,CAAC;QACxC,CAAC,EAPgB,OAAO,GAAP,WAAO,KAAP,WAAO,QAOvB;QAED;;;;;;WAMG;QACH,IAAiB,KAAK,CAErB;QAFD,WAAiB,KAAK;YACP,OAAC,GAAG,GAAG,CAAC,MAAM,CAAC;QAC9B,CAAC,EAFgB,KAAK,GAAL,SAAK,KAAL,SAAK,QAErB;QAED;;;;;;WAMG;QACU,UAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAEjC;;;;;;WAMG;QACU,OAAG,GAAG,GAAG,CAAC,GAAG,CAAC;QAE3B;;;;;;;WAOG;QACU,mBAAe,GAAG,GAAG,CAAC,eAAe,CAAC;QAEnD;;;;;;WAMG;QACU,cAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAC3C,CAAC,EAxEgB,GAAG,GAAH,WAAG,KAAH,WAAG,QAwEnB;IAED;;;;OAIG;IACH,IAAiB,GAAG,CAkCnB;IAlCD,WAAiB,GAAG;QAClB;;;WAGG;QACH,IAAiB,SAAS,CAUzB;QAVD,WAAiB,SAAS;YACX,cAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAChB,WAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACV,mBAAS,GAAG,GAAG,CAAC,SAAS,CAAC;YAC1B,qBAAW,GAAG,GAAG,CAAC,WAAW,CAAC;YAC9B,wBAAc,GAAG,GAAG,CAAC,cAAc,CAAC;YACpC,eAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAClB,kBAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YACxB,gBAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YACpB,mBAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QACzC,CAAC,EAVgB,SAAS,GAAT,aAAS,KAAT,aAAS,QAUzB;QAED;;;WAGG;QACH,IAAiB,OAAO,CAYvB;QAZD,WAAiB,OAAO;YACT,YAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACnB,SAAC,GAAG,GAAG,CAAC,IAAI,CAAC;YACb,iBAAS,GAAG,GAAG,CAAC,YAAY,CAAC;YAC7B,mBAAW,GAAG,GAAG,CAAC,cAAc,CAAC;YACjC,sBAAc,GAAG,GAAG,CAAC,iBAAiB,CAAC;YACvC,aAAK,GAAG,GAAG,CAAC,QAAQ,CAAC;YACrB,gBAAQ,GAAG,GAAG,CAAC,WAAW,CAAC;YAC3B,cAAM,GAAG,GAAG,CAAC,SAAS,CAAC;YACvB,iBAAS,GAAG,GAAG,CAAC,YAAY,CAAC;YAC7B,YAAI,GAAG,GAAG,CAAC,OAAO,CAAC;YACnB,eAAO,GAAG,GAAG,CAAC,UAAU,CAAC;QACxC,CAAC,EAZgB,OAAO,GAAP,WAAO,KAAP,WAAO,QAYvB;IACH,CAAC,EAlCgB,GAAG,GAAH,WAAG,KAAH,WAAG,QAkCnB;AACH,CAAC,EAtHgB,OAAO,GAAP,eAAO,KAAP,eAAO,QAsHvB;AAED;;GAEG;AACH,wCAAwC;AACxC,IAAiB,SAAS,CA4CzB;AA5CD,WAAiB,SAAS;IAExB;;OAEG;IACH,IAAiB,GAAG,CAsCnB;IAtCD,WAAiB,GAAG;QAClB;;;WAGG;QACH,IAAiB,SAAS,CAGzB;QAHD,WAAiB,SAAS;YACX,4BAAkB,GAAG,KAAK,CAAC,kBAAkB,CAAC;YAC9C,sBAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QACjD,CAAC,EAHgB,SAAS,GAAT,aAAS,KAAT,aAAS,QAGzB;QAED;;;WAGG;QACH,IAAiB,OAAO,CAIvB;QAJD,WAAiB,OAAO;YACT,0BAAkB,GAAG,KAAK,CAAC,qBAAqB,CAAC;YACjD,oBAAY,GAAG,KAAK,CAAC,eAAe,CAAC;YACrC,eAAO,GAAG,KAAK,CAAC,UAAU,CAAC;QAC1C,CAAC,EAJgB,OAAO,GAAP,WAAO,KAAP,WAAO,QAIvB;QAED;;;;;;;WAOG;QACU,qBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAEzD;;;;;;WAMG;QACU,gBAAY,GAAG,KAAK,CAAC,YAAY,CAAC;IACjD,CAAC,EAtCgB,GAAG,GAAH,aAAG,KAAH,aAAG,QAsCnB;AACH,CAAC,EA5CgB,SAAS,GAAT,iBAAS,KAAT,iBAAS,QA4CzB"}
\ No newline at end of file
diff --git a/node_modules/xmlchars/xmlns/1.0/ed3.js.map b/node_modules/xmlchars/xmlns/1.0/ed3.js.map
index 9f02520..9195a69 100644
--- a/node_modules/xmlchars/xmlns/1.0/ed3.js.map
+++ b/node_modules/xmlchars/xmlns/1.0/ed3.js.map
@@ -1 +1 @@
-{"version":3,"file":"ed3.js","sourceRoot":"","sources":["../../../../src/xmlns/1.0/ed3.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAEH,EAAE;AACF,aAAa;AACb,EAAE;AAEF,2CAA2C;AAC9B,QAAA,kBAAkB,GAAG,iLAA2K,CAAC;AAEjM,QAAA,YAAY,GACvB,MAAI,0BAAkB,yCAAsC,CAAC;AAE/D,EAAE;AACF,uBAAuB;AACvB,EAAE;AAEW,QAAA,qBAAqB,GAChC,IAAI,MAAM,CAAC,OAAK,0BAAkB,OAAI,EAAE,GAAG,CAAC,CAAC;AAElC,QAAA,eAAe,GAAG,IAAI,MAAM,CAAC,OAAK,oBAAY,OAAI,EAAE,GAAG,CAAC,CAAC;AAEzD,QAAA,UAAU,GACrB,IAAI,MAAM,CAAC,OAAK,0BAAkB,UAAK,oBAAY,QAAK,EAAE,GAAG,CAAC,CAAC;AAEjE;;;;;;GAMG;AACH,iDAAiD;AACjD,2BAAkC,CAAS;IACzC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,KAAK,IAAI;QACV,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AAhBD,8CAgBC;AAED;;;;;;GAMG;AACH,sBAA6B,CAAS;IACpC,OAAO,iBAAiB,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,KAAK,IAAI;YACV,CAAC,KAAK,IAAI;YACV,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;YACxB,CAAC,KAAK,MAAM;YACZ,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;YAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACnC,CAAC;AARD,oCAQC"}
\ No newline at end of file
+{"version":3,"file":"ed3.js","sourceRoot":"","sources":["../../../../src/xmlns/1.0/ed3.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAEH,EAAE;AACF,aAAa;AACb,EAAE;AAEF,2CAA2C;AAC9B,QAAA,kBAAkB,GAAG,iLAA2K,CAAC;AAEjM,QAAA,YAAY,GACvB,MAAI,0BAAkB,yCAAsC,CAAC;AAE/D,EAAE;AACF,uBAAuB;AACvB,EAAE;AAEW,QAAA,qBAAqB,GAChC,IAAI,MAAM,CAAC,OAAK,0BAAkB,OAAI,EAAE,GAAG,CAAC,CAAC;AAElC,QAAA,eAAe,GAAG,IAAI,MAAM,CAAC,OAAK,oBAAY,OAAI,EAAE,GAAG,CAAC,CAAC;AAEzD,QAAA,UAAU,GACrB,IAAI,MAAM,CAAC,OAAK,0BAAkB,UAAK,oBAAY,QAAK,EAAE,GAAG,CAAC,CAAC;AAEjE;;;;;;GAMG;AACH,iDAAiD;AACjD,SAAgB,iBAAiB,CAAC,CAAS;IACzC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,KAAK,IAAI;QACV,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;QACxB,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;QAC5B,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AAhBD,8CAgBC;AAED;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,CAAS;IACpC,OAAO,iBAAiB,CAAC,CAAC,CAAC;QACzB,CAAC,CAAC,KAAK,IAAI;YACV,CAAC,KAAK,IAAI;YACV,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;YACxB,CAAC,KAAK,MAAM;YACZ,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC;YAC5B,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;AACnC,CAAC;AARD,oCAQC"}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 866dd47..6d1bde9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,35 +5,35 @@
"requires": true,
"dependencies": {
"abab": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz",
- "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w=="
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
+ "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg=="
},
"acorn": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
- "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA=="
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz",
+ "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw=="
},
"acorn-globals": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.1.tgz",
- "integrity": "sha512-gJSiKY8dBIjV/0jagZIFBdVMtfQyA5QHCvAT48H2q8REQoW8Fs5AOjqBql1LgSXgrMWdevcE+8cdZ33NtVbIBA==",
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
+ "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
"requires": {
"acorn": "^6.0.1",
"acorn-walk": "^6.0.1"
}
},
"acorn-walk": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz",
- "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw=="
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
+ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA=="
},
"ajv": {
- "version": "6.10.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
- "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz",
+ "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==",
"requires": {
- "fast-deep-equal": "^2.0.1",
+ "fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
@@ -58,9 +58,9 @@
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"async-limiter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
- "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
},
"asynckit": {
"version": "0.4.0",
@@ -73,9 +73,9 @@
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
},
"aws4": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
- "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
+ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
},
"bcrypt-pbkdf": {
"version": "1.0.2",
@@ -95,15 +95,6 @@
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
},
- "camel-case": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
- "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
- "requires": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.1"
- }
- },
"caseless": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -118,9 +109,9 @@
}
},
"combined-stream": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
- "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
@@ -135,20 +126,15 @@
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
- "css-b64-images": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/css-b64-images/-/css-b64-images-0.2.5.tgz",
- "integrity": "sha1-QgBdgyBLK0pdk7axpWRBM7WSegI="
- },
"cssom": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz",
- "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A=="
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
},
"cssstyle": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz",
- "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
+ "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
"requires": {
"cssom": "0.3.x"
}
@@ -171,14 +157,6 @@
"whatwg-url": "^7.0.0"
}
},
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
"deep-is": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
@@ -207,11 +185,11 @@
}
},
"escodegen": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz",
- "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==",
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz",
+ "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==",
"requires": {
- "esprima": "^3.1.3",
+ "esprima": "^4.0.1",
"estraverse": "^4.2.0",
"esutils": "^2.0.2",
"optionator": "^0.8.1",
@@ -219,19 +197,19 @@
}
},
"esprima": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM="
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
},
"estraverse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
},
"esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
},
"extend": {
"version": "3.0.2",
@@ -244,14 +222,14 @@
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
},
"fast-json-stable-stringify": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
- "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
"fast-levenshtein": {
"version": "2.0.6",
@@ -295,11 +273,6 @@
"har-schema": "^2.0.0"
}
},
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
- },
"html-encoding-sniffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
@@ -308,20 +281,6 @@
"whatwg-encoding": "^1.0.1"
}
},
- "html-minifier": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz",
- "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==",
- "requires": {
- "camel-case": "^3.0.0",
- "clean-css": "^4.2.1",
- "commander": "^2.19.0",
- "he": "^1.2.0",
- "param-case": "^2.1.1",
- "relateurl": "^0.2.7",
- "uglify-js": "^3.5.1"
- }
- },
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -356,9 +315,9 @@
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"jsdom": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.0.0.tgz",
- "integrity": "sha512-/VkyPmdtbwqpJSkwDx3YyJ3U1oawYNB/h5z8vTUZGAzjtu2OHTeFRfnJqyMHsJ5Cyes23trOmvUpM1GfHH1leA==",
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz",
+ "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==",
"requires": {
"abab": "^2.0.0",
"acorn": "^6.0.4",
@@ -370,16 +329,16 @@
"domexception": "^1.0.1",
"escodegen": "^1.11.0",
"html-encoding-sniffer": "^1.0.2",
- "nwsapi": "^2.0.9",
+ "nwsapi": "^2.1.3",
"parse5": "5.1.0",
"pn": "^1.1.0",
"request": "^2.88.0",
"request-promise-native": "^1.0.5",
- "saxes": "^3.1.5",
+ "saxes": "^3.1.9",
"symbol-tree": "^3.2.2",
"tough-cookie": "^2.5.0",
"w3c-hr-time": "^1.0.1",
- "w3c-xmlserializer": "^1.0.1",
+ "w3c-xmlserializer": "^1.1.2",
"webidl-conversions": "^4.0.2",
"whatwg-encoding": "^1.0.5",
"whatwg-mimetype": "^2.3.0",
@@ -433,36 +392,17 @@
"resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
"integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg="
},
- "lower-case": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
- "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
- },
"mime-db": {
- "version": "1.38.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz",
- "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg=="
+ "version": "1.43.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+ "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
},
"mime-types": {
- "version": "2.1.22",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz",
- "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==",
+ "version": "2.1.26",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+ "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
"requires": {
- "mime-db": "~1.38.0"
- }
- },
- "minify": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/minify/-/minify-5.1.0.tgz",
- "integrity": "sha512-qlvHtYYjhDpdp05jfxFEdZ7u37tqaltOuuH4TbqyEcjubpY5BBOesJa513wBwjOFI0GmrLVENLooGRX/j2IoDQ==",
- "requires": {
- "clean-css": "^4.1.6",
- "css-b64-images": "~0.2.5",
- "debug": "^4.1.0",
- "html-minifier": "^4.0.0",
- "terser": "^4.0.0",
- "try-catch": "^2.0.0",
- "try-to-catch": "^2.0.0"
+ "mime-db": "1.43.0"
}
},
"minimist": {
@@ -470,23 +410,10 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
},
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "no-case": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
- "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
- "requires": {
- "lower-case": "^1.1.1"
- }
- },
"nwsapi": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.3.tgz",
- "integrity": "sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A=="
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
+ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ=="
},
"oauth-sign": {
"version": "0.9.0",
@@ -494,24 +421,16 @@
"integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
},
"optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
"requires": {
"deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.4",
+ "fast-levenshtein": "~2.0.6",
"levn": "~0.3.0",
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2",
- "wordwrap": "~1.0.0"
- }
- },
- "param-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
- "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
- "requires": {
- "no-case": "^2.2.0"
+ "word-wrap": "~1.2.3"
}
},
"parse5": {
@@ -535,9 +454,9 @@
"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
},
"psl": {
- "version": "1.1.31",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz",
- "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw=="
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
+ "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ=="
},
"punycode": {
"version": "2.1.1",
@@ -549,15 +468,10 @@
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
},
- "relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
- },
"request": {
- "version": "2.88.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
- "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
"requires": {
"aws-sign2": "~0.7.0",
"aws4": "^1.8.0",
@@ -566,7 +480,7 @@
"extend": "~3.0.2",
"forever-agent": "~0.6.1",
"form-data": "~2.3.2",
- "har-validator": "~5.1.0",
+ "har-validator": "~5.1.3",
"http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
@@ -576,49 +490,33 @@
"performance-now": "^2.1.0",
"qs": "~6.5.2",
"safe-buffer": "^5.1.2",
- "tough-cookie": "~2.4.3",
+ "tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0",
"uuid": "^3.3.2"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
- },
- "tough-cookie": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
- "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
- "requires": {
- "psl": "^1.1.24",
- "punycode": "^1.4.1"
- }
- }
}
},
"request-promise-core": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz",
- "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
+ "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
"requires": {
- "lodash": "^4.17.11"
+ "lodash": "^4.17.15"
}
},
"request-promise-native": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz",
- "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz",
+ "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==",
"requires": {
- "request-promise-core": "1.1.2",
+ "request-promise-core": "1.1.3",
"stealthy-require": "^1.1.1",
"tough-cookie": "^2.3.3"
}
},
"safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
},
"safer-buffer": {
"version": "2.1.2",
@@ -626,11 +524,11 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"saxes": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz",
- "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==",
+ "version": "3.1.11",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
+ "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
"requires": {
- "xmlchars": "^1.3.1"
+ "xmlchars": "^2.1.1"
}
},
"source-map": {
@@ -669,9 +567,9 @@
"integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks="
},
"symbol-tree": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
- "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
},
"terser": {
"version": "4.6.3",
@@ -700,16 +598,6 @@
"punycode": "^2.1.0"
}
},
- "try-catch": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/try-catch/-/try-catch-2.0.1.tgz",
- "integrity": "sha512-LsOrmObN/2WdM+y2xG+t16vhYrQsnV8wftXIcIOWZhQcBJvKGYuamJGwnU98A7Jxs2oZNkJztXlphEOoA0DWqg=="
- },
- "try-to-catch": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/try-to-catch/-/try-to-catch-2.0.1.tgz",
- "integrity": "sha512-QYH/PR3ogChy82e2l1UgrEgutcf6Jtfu3TAQWC+Vs6MKpoaFs1atDHUPzfaERugZlESb2Xku7J2my6iUQ7+tcQ=="
- },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -731,20 +619,6 @@
"prelude-ls": "~1.1.2"
}
},
- "uglify-js": {
- "version": "3.7.7",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz",
- "integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==",
- "requires": {
- "commander": "~2.20.3",
- "source-map": "~0.6.1"
- }
- },
- "upper-case": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
- "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
- },
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -754,9 +628,9 @@
}
},
"uuid": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
- "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
},
"verror": {
"version": "1.10.0",
@@ -805,19 +679,19 @@
"integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
},
"whatwg-url": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz",
- "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
"requires": {
"lodash.sortby": "^4.7.0",
"tr46": "^1.0.1",
"webidl-conversions": "^4.0.2"
}
},
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
},
"ws": {
"version": "6.2.1",
@@ -833,9 +707,9 @@
"integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
},
"xmlchars": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-1.3.1.tgz",
- "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw=="
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
}
}
}
diff --git a/package.json b/package.json
index 3eaf64e..9a58af4 100644
--- a/package.json
+++ b/package.json
@@ -9,9 +9,10 @@
"author": "",
"license": "ISC",
"dependencies": {
+ "clean-css": "^4.2.3",
"jsdom": "^14.0.0",
- "minify": "^5.1.0",
- "minimist": "^1.2.0"
+ "minimist": "^1.2.0",
+ "terser": "^4.6.3"
},
"repository": {
"type": "git",