From f9fb05e4db0faa07b096b320612f9900dbda1f9e Mon Sep 17 00:00:00 2001 From: s2 Date: Mon, 20 Jul 2020 16:20:39 +0200 Subject: [PATCH] update node modules --- node_modules/.bin/css-b64-images | 15 - node_modules/.bin/css-b64-images.cmd | 17 - node_modules/.bin/css-b64-images.ps1 | 18 - node_modules/.bin/he | 15 - node_modules/.bin/html-minifier | 15 - node_modules/.bin/html-minifier.cmd | 17 - node_modules/.bin/minify | 15 - node_modules/.bin/minify.ps1 | 18 - node_modules/.bin/uglifyjs | 15 - node_modules/.bin/uglifyjs.cmd | 17 - node_modules/.bin/uglifyjs.ps1 | 18 - .../@ungap/url-search-params/cjs/index.js | 2 +- .../@ungap/url-search-params/esm/index.js | 2 +- .../@ungap/url-search-params/index.js | 2 +- node_modules/@ungap/url-search-params/min.js | 2 +- .../@ungap/url-search-params/package.json | 31 +- .../acorn-globals/node_modules/.bin/acorn | 15 + .../node_modules/.bin/acorn.cmd} | 2 +- .../node_modules/.bin/acorn.ps1} | 4 +- .../node_modules/acorn-walk/CHANGELOG.md | 131 + .../node_modules/acorn-walk}/LICENSE | 5 +- .../node_modules/acorn-walk/README.md | 126 + .../node_modules/acorn-walk/dist/walk.d.ts | 112 + .../node_modules/acorn-walk/dist/walk.js | 463 + .../node_modules/acorn-walk/dist/walk.js.map | 1 + .../node_modules/acorn-walk/dist/walk.mjs | 443 + .../node_modules/acorn-walk/dist/walk.mjs.map | 1 + .../node_modules/acorn-walk/package.json | 64 + .../node_modules/acorn/CHANGELOG.md | 612 ++ .../node_modules/acorn}/LICENSE | 4 +- .../node_modules/acorn/README.md | 270 + .../node_modules/acorn/bin/acorn | 4 + .../node_modules/acorn/dist/acorn.d.ts | 209 + .../node_modules/acorn/dist/acorn.js | 5138 ++++++++++ .../node_modules/acorn/dist/acorn.js.map | 1 + .../node_modules/acorn/dist/acorn.mjs | 5107 ++++++++++ .../node_modules/acorn/dist/acorn.mjs.d.ts | 2 + .../node_modules/acorn/dist/acorn.mjs.map | 1 + .../node_modules/acorn/dist/bin.js | 64 + .../node_modules/acorn/package.json | 67 + node_modules/acorn-globals/package.json | 38 +- node_modules/ajv/README.md | 182 +- node_modules/ajv/dist/ajv.bundle.js | 112 +- node_modules/ajv/dist/ajv.min.js | 4 +- node_modules/ajv/dist/ajv.min.js.map | 2 +- node_modules/ajv/lib/ajv.d.ts | 3 +- node_modules/ajv/lib/compile/equal.js | 2 +- node_modules/ajv/lib/compile/index.js | 2 +- node_modules/ajv/lib/compile/util.js | 53 +- node_modules/ajv/lib/data.js | 2 +- node_modules/ajv/lib/definition_schema.js | 2 +- node_modules/ajv/lib/dot/_limit.jst | 9 + node_modules/ajv/lib/dot/_limitItems.jst | 2 + node_modules/ajv/lib/dot/_limitLength.jst | 2 + node_modules/ajv/lib/dot/_limitProperties.jst | 2 + node_modules/ajv/lib/dot/allOf.jst | 2 - node_modules/ajv/lib/dot/anyOf.jst | 2 - node_modules/ajv/lib/dot/contains.jst | 2 - node_modules/ajv/lib/dot/definitions.def | 13 +- node_modules/ajv/lib/dot/dependencies.jst | 3 +- node_modules/ajv/lib/dot/if.jst | 2 - node_modules/ajv/lib/dot/items.jst | 2 - node_modules/ajv/lib/dot/multipleOf.jst | 2 + node_modules/ajv/lib/dot/properties.jst | 11 +- node_modules/ajv/lib/dot/propertyNames.jst | 2 - node_modules/ajv/lib/dot/uniqueItems.jst | 2 +- node_modules/ajv/lib/dot/validate.jst | 10 +- node_modules/ajv/lib/dotjs/_limit.js | 6 + node_modules/ajv/lib/dotjs/_limitItems.js | 3 + node_modules/ajv/lib/dotjs/_limitLength.js | 3 + .../ajv/lib/dotjs/_limitProperties.js | 3 + node_modules/ajv/lib/dotjs/allOf.js | 1 - node_modules/ajv/lib/dotjs/anyOf.js | 1 - node_modules/ajv/lib/dotjs/contains.js | 1 - node_modules/ajv/lib/dotjs/dependencies.js | 2 +- node_modules/ajv/lib/dotjs/if.js | 1 - node_modules/ajv/lib/dotjs/items.js | 1 - node_modules/ajv/lib/dotjs/multipleOf.js | 3 + node_modules/ajv/lib/dotjs/properties.js | 13 +- node_modules/ajv/lib/dotjs/propertyNames.js | 1 - node_modules/ajv/lib/dotjs/uniqueItems.js | 2 +- node_modules/ajv/lib/dotjs/validate.js | 8 +- node_modules/ajv/lib/keyword.js | 2 +- node_modules/ajv/lib/refs/data.json | 2 +- .../ajv/lib/refs/json-schema-secure.json | 2 +- node_modules/ajv/package.json | 48 +- .../ajv/scripts/publish-built-version | 2 +- node_modules/ajv/scripts/travis-gh-pages | 2 +- node_modules/array-equal/.npmignore | 1 - node_modules/array-equal/README.md | 11 - node_modules/array-equal/component.json | 10 - node_modules/array-equal/index.js | 9 - node_modules/array-equal/package.json | 48 - node_modules/async-limiter/.eslintignore | 2 - node_modules/async-limiter/.nycrc | 10 - node_modules/async-limiter/.travis.yml | 9 - node_modules/async-limiter/LICENSE | 8 - node_modules/async-limiter/index.js | 67 - node_modules/async-limiter/package.json | 73 - node_modules/async-limiter/readme.md | 132 - node_modules/camel-case/camel-case.d.ts | 3 - node_modules/camel-case/camel-case.js | 23 - node_modules/camel-case/package.json | 85 - node_modules/css-b64-images/.npmignore | 15 - node_modules/css-b64-images/.travis.yml | 5 - node_modules/css-b64-images/README.md | 78 - .../css-b64-images/bin/css-b64-images | 13 - node_modules/css-b64-images/draft.png | Bin 267269 -> 0 bytes node_modules/css-b64-images/draft.xcf | Bin 477539 -> 0 bytes .../css-b64-images/lib/css-b64-images.js | 116 - node_modules/css-b64-images/package.json | 68 - .../test/css-b64-images-test.js | 38 - .../css-b64-images/test/fixture/css/style.css | 52 - .../fonts/callunasansregular-webfont.eot | Bin 28462 -> 0 bytes .../fonts/callunasansregular-webfont.svg | 248 - .../fonts/callunasansregular-webfont.ttf | Bin 63460 -> 0 bytes .../fonts/callunasansregular-webfont.woff | Bin 31820 -> 0 bytes .../fonts/maven_pro_medium-webfont.eot | Bin 35453 -> 0 bytes .../fonts/maven_pro_medium-webfont.svg | 245 - .../fonts/maven_pro_medium-webfont.ttf | Bin 90548 -> 0 bytes .../fonts/maven_pro_medium-webfont.woff | Bin 36520 -> 0 bytes .../test/fixture/img/background-pattern.gif | Bin 1103 -> 0 bytes .../css-b64-images/test/fixture/img/dots.svg | 6 - .../test/fixture/img/mixit-banner.png | Bin 4821 -> 0 bytes node_modules/cssom/lib/CSSKeyframeRule.js | 2 +- node_modules/cssom/lib/CSSKeyframesRule.js | 2 +- node_modules/cssom/lib/clone.js | 17 +- node_modules/cssom/lib/parse.js | 1 - node_modules/cssom/package.json | 33 +- node_modules/cssstyle/.eslintignore | 3 - node_modules/cssstyle/.eslintrc.js | 50 - node_modules/cssstyle/.travis.yml | 15 - .../cssstyle/{MIT-LICENSE.txt => LICENSE} | 0 node_modules/cssstyle/README.md | 26 +- .../cssstyle/lib/CSSStyleDeclaration.js | 5 + .../cssstyle/lib/CSSStyleDeclaration.test.js | 556 ++ .../cssstyle/lib/allExtraProperties.js | 301 +- node_modules/cssstyle/lib/allProperties.js | 903 +- .../cssstyle/lib/allWebkitProperties.js | 194 + .../cssstyle/lib/implementedProperties.js | 2 +- node_modules/cssstyle/lib/parsers.js | 41 +- node_modules/cssstyle/lib/parsers.test.js | 139 + node_modules/cssstyle/lib/properties.js | 11 +- .../cssstyle/lib/properties/fontSize.js | 12 +- node_modules/cssstyle/lib/utils/colorSpace.js | 21 + .../node_modules/cssom/LICENSE.txt} | 4 +- .../cssstyle/node_modules/cssom/README.mdown | 67 + .../node_modules/cssom/lib/CSSDocumentRule.js | 39 + .../node_modules/cssom/lib/CSSFontFaceRule.js | 36 + .../node_modules/cssom/lib/CSSHostRule.js | 37 + .../node_modules/cssom/lib/CSSImportRule.js | 132 + .../node_modules/cssom/lib/CSSKeyframeRule.js | 37 + .../cssom/lib/CSSKeyframesRule.js | 39 + .../node_modules/cssom/lib/CSSMediaRule.js | 41 + .../cssstyle/node_modules/cssom/lib/CSSOM.js | 3 + .../node_modules/cssom/lib/CSSRule.js | 43 + .../cssom/lib/CSSStyleDeclaration.js | 148 + .../node_modules/cssom/lib/CSSStyleRule.js | 190 + .../node_modules/cssom/lib/CSSStyleSheet.js | 88 + .../node_modules/cssom/lib/CSSSupportsRule.js | 36 + .../node_modules/cssom/lib/CSSValue.js | 43 + .../cssom/lib/CSSValueExpression.js | 344 + .../node_modules/cssom/lib/MatcherList.js | 62 + .../node_modules/cssom/lib/MediaList.js | 61 + .../node_modules/cssom/lib/StyleSheet.js | 17 + .../cssstyle/node_modules/cssom/lib/clone.js | 82 + .../cssstyle/node_modules/cssom/lib/index.js | 21 + .../cssstyle/node_modules/cssom/lib/parse.js | 464 + .../cssstyle/node_modules/cssom/package.json | 53 + node_modules/cssstyle/package.json | 85 +- .../scripts/download_latest_properties.js | 88 - .../generate_implemented_properties.js | 61 - .../cssstyle/scripts/generate_properties.js | 292 - node_modules/cssstyle/tests/tests.js | 669 -- node_modules/data-urls/LICENSE.txt | 2 +- node_modules/data-urls/README.md | 6 +- node_modules/data-urls/package.json | 45 +- node_modules/debug/CHANGELOG.md | 395 - node_modules/debug/LICENSE | 19 - node_modules/debug/README.md | 455 - node_modules/debug/dist/debug.js | 912 -- node_modules/debug/package.json | 106 - node_modules/debug/src/browser.js | 264 - node_modules/debug/src/common.js | 266 - node_modules/debug/src/index.js | 10 - node_modules/debug/src/node.js | 257 - node_modules/decimal.js/CHANGELOG.md | 209 + node_modules/decimal.js/LICENCE.md | 23 + node_modules/decimal.js/README.md | 235 + node_modules/decimal.js/decimal.d.ts | 295 + node_modules/decimal.js/decimal.global.d.ts | 316 + node_modules/decimal.js/decimal.js | 4877 ++++++++++ node_modules/decimal.js/decimal.min.js | 3 + node_modules/decimal.js/decimal.min.js.map | 1 + node_modules/decimal.js/decimal.mjs | 4841 ++++++++++ node_modules/decimal.js/doc/API.html | 2678 ++++++ node_modules/decimal.js/package.json | 65 + node_modules/domexception/README.md | 12 + node_modules/domexception/index.js | 7 + .../domexception/lib/DOMException-impl.js | 2 +- node_modules/domexception/lib/DOMException.js | 459 +- node_modules/domexception/lib/public-api.js | 5 - node_modules/domexception/lib/utils.js | 85 +- .../webidl-conversions/LICENSE.md | 12 + .../node_modules/webidl-conversions/README.md | 79 + .../webidl-conversions/lib/index.js | 361 + .../webidl-conversions/package.json | 66 + node_modules/domexception/package.json | 57 +- .../domexception/webidl2js-wrapper.js | 15 + node_modules/escodegen/LICENSE.BSD | 2 + node_modules/escodegen/escodegen.js | 12 +- node_modules/escodegen/package.json | 32 +- node_modules/fast-deep-equal/es6/index.d.ts | 2 +- node_modules/fast-deep-equal/es6/react.d.ts | 2 +- node_modules/fast-deep-equal/package.json | 44 +- node_modules/fast-deep-equal/react.d.ts | 2 +- node_modules/he/README.md | 379 - node_modules/he/bin/he | 148 - node_modules/he/he.js | 345 - node_modules/he/man/he.1 | 78 - node_modules/he/package.json | 94 - .../html-encoding-sniffer/LICENSE.txt | 2 +- .../lib/html-encoding-sniffer.js | 47 +- .../html-encoding-sniffer/package.json | 43 +- node_modules/html-minifier/README.md | 160 - node_modules/html-minifier/cli.js | 311 - node_modules/html-minifier/package.json | 133 - .../html-minifier/sample-cli-config-file.conf | 40 - .../html-minifier/src/htmlminifier.js | 1344 --- node_modules/html-minifier/src/htmlparser.js | 567 -- node_modules/html-minifier/src/tokenchain.js | 71 - node_modules/html-minifier/src/utils.js | 18 - .../CHANGELOG.md | 8 + .../README.md | 17 +- .../cjs/i18nextBrowserLanguageDetector.js | 33 +- .../esm/i18nextBrowserLanguageDetector.js | 33 +- .../umd/i18nextBrowserLanguageDetector.js | 33 +- .../umd/i18nextBrowserLanguageDetector.min.js | 2 +- .../i18nextBrowserLanguageDetector.js | 33 +- .../i18nextBrowserLanguageDetector.min.js | 2 +- .../index.d.ts | 29 +- .../package.json | 23 +- node_modules/i18next/CHANGELOG.md | 53 + node_modules/i18next/dist/cjs/i18next.js | 616 +- node_modules/i18next/dist/esm/i18next.js | 616 +- node_modules/i18next/dist/umd/i18next.js | 689 +- node_modules/i18next/dist/umd/i18next.min.js | 2 +- node_modules/i18next/i18next.js | 689 +- node_modules/i18next/i18next.min.js | 2 +- node_modules/i18next/index.d.ts | 42 +- node_modules/i18next/package.json | 27 +- node_modules/ip-regex/index.js | 24 + node_modules/{relateurl => ip-regex}/license | 2 +- node_modules/ip-regex/package.json | 77 + node_modules/ip-regex/readme.md | 63 + .../LICENSE-MIT.txt | 0 .../is-potential-custom-element-name/index.js | 9 + .../package.json | 63 + node_modules/jsdom/Changelog.md | 192 +- node_modules/jsdom/README.md | 71 +- node_modules/jsdom/lib/api.js | 64 +- .../jsdom/lib/jsdom/browser/Window.js | 578 +- .../jsdom/lib/jsdom/browser/js-globals.json | 292 + .../jsdom/lib/jsdom/browser/parser/html.js | 117 +- .../jsdom/lib/jsdom/browser/parser/xml.js | 159 +- .../browser/resources/resource-loader.js | 16 +- node_modules/jsdom/lib/jsdom/level2/style.js | 13 - .../living/aborting/AbortController-impl.js | 6 +- .../jsdom/living/aborting/AbortSignal-impl.js | 6 +- .../jsdom/lib/jsdom/living/attributes.js | 120 +- .../lib/jsdom/living/attributes/Attr-impl.js | 35 +- .../living/attributes/NamedNodeMap-impl.js | 16 +- .../DefaultConstraintValidation-impl.js | 4 +- .../ValidityState-impl.js | 6 +- .../jsdom/living/cssom/StyleSheetList-impl.js | 38 + .../CustomElementRegistry-impl.js | 260 + .../jsdom/lib/jsdom/living/documents.js | 15 + .../jsdom/living/domparsing/DOMParser-impl.js | 42 +- .../living/domparsing/XMLSerializer-impl.js | 18 + .../parse5-adapter-serialization.js | 16 +- .../jsdom/living/domparsing/serialization.js | 24 +- .../lib/jsdom/living/events/Event-impl.js | 3 +- .../jsdom/living/events/EventTarget-impl.js | 134 +- .../lib/jsdom/living/events/UIEvent-impl.js | 4 +- .../lib/jsdom/living/fetch/Headers-impl.js | 165 + .../lib/jsdom/living/fetch/header-list.js | 54 + .../lib/jsdom/living/fetch/header-types.js | 103 + .../lib/jsdom/living/file-api/Blob-impl.js | 13 +- .../lib/jsdom/living/file-api/File-impl.js | 4 +- .../jsdom/living/file-api/FileReader-impl.js | 41 +- .../jsdom/living/generated/AbortController.js | 232 +- .../lib/jsdom/living/generated/AbortSignal.js | 259 +- .../jsdom/living/generated/AbstractRange.js | 162 + .../generated/AddEventListenerOptions.js | 60 +- .../living/generated/AssignedNodesOptions.js | 40 +- .../jsdom/lib/jsdom/living/generated/Attr.js | 394 +- .../lib/jsdom/living/generated/BarProp.js | 182 +- .../lib/jsdom/living/generated/BinaryType.js | 15 +- .../jsdom/lib/jsdom/living/generated/Blob.js | 338 +- .../jsdom/living/generated/BlobPropertyBag.js | 60 +- .../jsdom/living/generated/CDATASection.js | 174 +- .../living/generated/CanPlayTypeResult.js | 15 +- .../jsdom/living/generated/CharacterData.js | 763 +- .../lib/jsdom/living/generated/ChildNode.js | 160 - .../lib/jsdom/living/generated/CloseEvent.js | 263 +- .../jsdom/living/generated/CloseEventInit.js | 78 +- .../lib/jsdom/living/generated/Comment.js | 190 +- .../living/generated/CompositionEvent.js | 365 +- .../living/generated/CompositionEventInit.js | 42 +- .../living/generated/CustomElementRegistry.js | 237 + .../lib/jsdom/living/generated/CustomEvent.js | 338 +- .../jsdom/living/generated/CustomEventInit.js | 42 +- .../living/generated/DOMImplementation.js | 368 +- .../lib/jsdom/living/generated/DOMParser.js | 227 +- .../jsdom/living/generated/DOMStringMap.js | 507 +- .../jsdom/living/generated/DOMTokenList.js | 944 +- .../lib/jsdom/living/generated/Document.js | 5374 ++++++----- .../living/generated/DocumentFragment.js | 498 +- .../living/generated/DocumentReadyState.js | 15 +- .../jsdom/living/generated/DocumentType.js | 399 +- .../lib/jsdom/living/generated/Element.js | 2820 +++--- .../living/generated/ElementCSSInlineStyle.js | 108 - .../generated/ElementContentEditable.js | 89 - .../generated/ElementCreationOptions.js | 36 +- .../generated/ElementDefinitionOptions.js | 26 + .../lib/jsdom/living/generated/EndingType.js | 15 +- .../lib/jsdom/living/generated/ErrorEvent.js | 303 +- .../jsdom/living/generated/ErrorEventInit.js | 114 +- .../jsdom/lib/jsdom/living/generated/Event.js | 691 +- .../lib/jsdom/living/generated/EventInit.js | 76 +- .../jsdom/living/generated/EventListener.js | 35 + .../living/generated/EventListenerOptions.js | 40 +- .../living/generated/EventModifierInit.js | 276 +- .../lib/jsdom/living/generated/EventTarget.js | 444 +- .../lib/jsdom/living/generated/External.js | 198 +- .../jsdom/lib/jsdom/living/generated/File.js | 290 +- .../lib/jsdom/living/generated/FileList.js | 542 +- .../jsdom/living/generated/FilePropertyBag.js | 38 +- .../lib/jsdom/living/generated/FileReader.js | 752 +- .../lib/jsdom/living/generated/FocusEvent.js | 224 +- .../jsdom/living/generated/FocusEventInit.js | 48 +- .../lib/jsdom/living/generated/FormData.js | 725 +- .../living/generated/GetRootNodeOptions.js | 40 +- .../living/generated/GlobalEventHandlers.js | 1251 --- .../living/generated/HTMLAnchorElement.js | 1457 +-- .../jsdom/living/generated/HTMLAreaElement.js | 1175 ++- .../living/generated/HTMLAudioElement.js | 175 +- .../jsdom/living/generated/HTMLBRElement.js | 229 +- .../jsdom/living/generated/HTMLBaseElement.js | 285 +- .../jsdom/living/generated/HTMLBodyElement.js | 1202 ++- .../living/generated/HTMLButtonElement.js | 780 +- .../living/generated/HTMLCanvasElement.js | 482 +- .../jsdom/living/generated/HTMLCollection.js | 650 +- .../living/generated/HTMLDListElement.js | 235 +- .../jsdom/living/generated/HTMLDataElement.js | 229 +- .../living/generated/HTMLDataListElement.js | 195 +- .../living/generated/HTMLDetailsElement.js | 235 +- .../living/generated/HTMLDialogElement.js | 235 +- .../living/generated/HTMLDirectoryElement.js | 235 +- .../jsdom/living/generated/HTMLDivElement.js | 229 +- .../lib/jsdom/living/generated/HTMLElement.js | 3450 ++++--- .../living/generated/HTMLEmbedElement.js | 531 +- .../living/generated/HTMLFieldSetElement.js | 508 +- .../jsdom/living/generated/HTMLFontElement.js | 347 +- .../jsdom/living/generated/HTMLFormElement.js | 721 +- .../living/generated/HTMLFrameElement.js | 706 +- .../living/generated/HTMLFrameSetElement.js | 960 +- .../jsdom/living/generated/HTMLHRElement.js | 467 +- .../jsdom/living/generated/HTMLHeadElement.js | 175 +- .../living/generated/HTMLHeadingElement.js | 229 +- .../jsdom/living/generated/HTMLHtmlElement.js | 229 +- .../generated/HTMLHyperlinkElementUtils.js | 316 - .../living/generated/HTMLIFrameElement.js | 957 +- .../living/generated/HTMLImageElement.js | 1230 ++- .../living/generated/HTMLInputElement.js | 2644 +++-- .../jsdom/living/generated/HTMLLIElement.js | 292 +- .../living/generated/HTMLLabelElement.js | 269 +- .../living/generated/HTMLLegendElement.js | 249 +- .../jsdom/living/generated/HTMLLinkElement.js | 749 +- .../jsdom/living/generated/HTMLMapElement.js | 253 +- .../living/generated/HTMLMarqueeElement.js | 778 +- .../living/generated/HTMLMediaElement.js | 1366 +-- .../jsdom/living/generated/HTMLMenuElement.js | 235 +- .../jsdom/living/generated/HTMLMetaElement.js | 403 +- .../living/generated/HTMLMeterElement.js | 527 +- .../jsdom/living/generated/HTMLModElement.js | 299 +- .../living/generated/HTMLOListElement.js | 413 +- .../living/generated/HTMLObjectElement.js | 1326 ++- .../living/generated/HTMLOptGroupElement.js | 293 +- .../living/generated/HTMLOptionElement.js | 553 +- .../living/generated/HTMLOptionsCollection.js | 895 +- .../living/generated/HTMLOutputElement.js | 594 +- .../living/generated/HTMLParagraphElement.js | 229 +- .../living/generated/HTMLParamElement.js | 403 +- .../living/generated/HTMLPictureElement.js | 175 +- .../jsdom/living/generated/HTMLPreElement.js | 234 +- .../living/generated/HTMLProgressElement.js | 323 +- .../living/generated/HTMLQuoteElement.js | 241 +- .../living/generated/HTMLScriptElement.js | 680 +- .../living/generated/HTMLSelectElement.js | 1578 +-- .../jsdom/living/generated/HTMLSlotElement.js | 297 +- .../living/generated/HTMLSourceElement.js | 472 +- .../jsdom/living/generated/HTMLSpanElement.js | 175 +- .../living/generated/HTMLStyleElement.js | 330 +- .../generated/HTMLTableCaptionElement.js | 229 +- .../living/generated/HTMLTableCellElement.js | 1005 +- .../living/generated/HTMLTableColElement.js | 525 +- .../living/generated/HTMLTableElement.js | 1183 ++- .../living/generated/HTMLTableRowElement.js | 622 +- .../generated/HTMLTableSectionElement.js | 522 +- .../living/generated/HTMLTemplateElement.js | 191 +- .../living/generated/HTMLTextAreaElement.js | 1774 ++-- .../jsdom/living/generated/HTMLTimeElement.js | 229 +- .../living/generated/HTMLTitleElement.js | 227 +- .../living/generated/HTMLTrackElement.js | 519 +- .../living/generated/HTMLUListElement.js | 293 +- .../living/generated/HTMLUnknownElement.js | 174 +- .../living/generated/HTMLVideoElement.js | 472 +- .../jsdom/living/generated/HashChangeEvent.js | 242 +- .../living/generated/HashChangeEventInit.js | 60 +- .../lib/jsdom/living/generated/Headers.js | 390 + .../lib/jsdom/living/generated/History.js | 447 +- .../lib/jsdom/living/generated/InputEvent.js | 242 +- .../jsdom/living/generated/InputEventInit.js | 64 +- .../jsdom/living/generated/KeyboardEvent.js | 742 +- .../living/generated/KeyboardEventInit.js | 150 +- .../lib/jsdom/living/generated/LinkStyle.js | 98 - .../lib/jsdom/living/generated/Location.js | 649 +- .../jsdom/living/generated/MessageEvent.js | 533 +- .../living/generated/MessageEventInit.js | 138 +- .../lib/jsdom/living/generated/MimeType.js | 240 +- .../jsdom/living/generated/MimeTypeArray.js | 648 +- .../lib/jsdom/living/generated/MouseEvent.js | 842 +- .../jsdom/living/generated/MouseEventInit.js | 178 +- .../living/generated/MutationObserver.js | 283 +- .../living/generated/MutationObserverInit.js | 150 +- .../jsdom/living/generated/MutationRecord.js | 352 +- .../jsdom/living/generated/NamedNodeMap.js | 953 +- .../lib/jsdom/living/generated/Navigator.js | 513 +- .../generated/NavigatorConcurrentHardware.js | 98 - .../living/generated/NavigatorCookies.js | 98 - .../lib/jsdom/living/generated/NavigatorID.js | 170 - .../living/generated/NavigatorLanguage.js | 107 - .../jsdom/living/generated/NavigatorOnLine.js | 98 - .../living/generated/NavigatorPlugins.js | 120 - .../jsdom/lib/jsdom/living/generated/Node.js | 1309 +-- .../lib/jsdom/living/generated/NodeFilter.js | 74 + .../jsdom/living/generated/NodeIterator.js | 321 +- .../lib/jsdom/living/generated/NodeList.js | 549 +- .../generated/NonDocumentTypeChildNode.js | 107 - .../living/generated/NonElementParentNode.js | 113 - .../living/generated/PageTransitionEvent.js | 230 +- .../generated/PageTransitionEventInit.js | 42 +- .../lib/jsdom/living/generated/ParentNode.js | 217 - .../lib/jsdom/living/generated/Performance.js | 227 +- .../lib/jsdom/living/generated/Plugin.js | 698 +- .../lib/jsdom/living/generated/PluginArray.js | 689 +- .../jsdom/living/generated/PopStateEvent.js | 224 +- .../living/generated/PopStateEventInit.js | 42 +- .../living/generated/ProcessingInstruction.js | 190 +- .../jsdom/living/generated/ProgressEvent.js | 264 +- .../living/generated/ProgressEventInit.js | 78 +- .../jsdom/lib/jsdom/living/generated/Range.js | 619 ++ .../living/generated/SVGAnimatedString.js | 226 +- .../living/generated/SVGBoundingBoxOptions.js | 94 +- .../lib/jsdom/living/generated/SVGElement.js | 3008 +++--- .../living/generated/SVGGraphicsElement.js | 217 +- .../lib/jsdom/living/generated/SVGNumber.js | 202 +- .../jsdom/living/generated/SVGSVGElement.js | 1045 +- .../jsdom/living/generated/SVGStringList.js | 931 +- .../lib/jsdom/living/generated/SVGTests.js | 111 - .../jsdom/living/generated/SVGTitleElement.js | 174 +- .../lib/jsdom/living/generated/Screen.js | 280 +- .../jsdom/living/generated/ScrollBehavior.js | 15 +- .../living/generated/ScrollIntoViewOptions.js | 62 +- .../living/generated/ScrollLogicalPosition.js | 15 +- .../jsdom/living/generated/ScrollOptions.js | 42 +- .../living/generated/ScrollRestoration.js | 15 +- .../lib/jsdom/living/generated/Selection.js | 527 + .../jsdom/living/generated/SelectionMode.js | 15 +- .../lib/jsdom/living/generated/ShadowRoot.js | 279 +- .../jsdom/living/generated/ShadowRootInit.js | 42 +- .../jsdom/living/generated/ShadowRootMode.js | 15 +- .../lib/jsdom/living/generated/Slotable.js | 100 - .../lib/jsdom/living/generated/StaticRange.js | 126 + .../jsdom/living/generated/StaticRangeInit.js | 66 + .../lib/jsdom/living/generated/Storage.js | 705 +- .../jsdom/living/generated/StorageEvent.js | 539 +- .../living/generated/StorageEventInit.js | 132 +- .../jsdom/living/generated/StyleSheetList.js | 306 + .../jsdom/living/generated/SupportedType.js | 15 +- .../jsdom/lib/jsdom/living/generated/Text.js | 274 +- .../jsdom/living/generated/TextTrackKind.js | 15 +- .../lib/jsdom/living/generated/TouchEvent.js | 342 +- .../jsdom/living/generated/TouchEventInit.js | 136 +- .../lib/jsdom/living/generated/TreeWalker.js | 401 +- .../lib/jsdom/living/generated/UIEvent.js | 399 +- .../lib/jsdom/living/generated/UIEventInit.js | 88 +- .../jsdom/living/generated/ValidityState.js | 380 +- .../jsdom/living/generated/VisibilityState.js | 15 +- .../lib/jsdom/living/generated/WebSocket.js | 733 +- .../lib/jsdom/living/generated/WheelEvent.js | 298 +- .../jsdom/living/generated/WheelEventInit.js | 96 +- .../living/generated/WindowEventHandlers.js | 393 - .../lib/jsdom/living/generated/XMLDocument.js | 172 +- .../jsdom/living/generated/XMLHttpRequest.js | 601 ++ .../generated/XMLHttpRequestEventTarget.js | 466 +- .../generated/XMLHttpRequestResponseType.js | 12 + .../living/generated/XMLHttpRequestUpload.js | 176 +- .../jsdom/living/generated/XMLSerializer.js | 133 + .../jsdom/lib/jsdom/living/generated/utils.js | 44 +- .../lib/jsdom/living/helpers/binary-data.js | 9 + .../jsdom/living/helpers/create-element.js | 320 + .../living/helpers/create-event-accessor.js | 9 +- .../jsdom/living/helpers/custom-elements.js | 249 +- .../jsdom/living/helpers/dates-and-times.js | 29 +- .../jsdom/lib/jsdom/living/helpers/details.js | 15 + .../jsdom/lib/jsdom/living/helpers/events.js | 7 +- .../lib/jsdom/living/helpers/focusing.js | 19 +- .../lib/jsdom/living/helpers/form-controls.js | 99 +- .../jsdom/living/helpers/html-constructor.js | 78 + .../living/helpers/mutation-observers.js | 3 +- .../jsdom/lib/jsdom/living/helpers/node.js | 68 + .../living/helpers/number-and-date-inputs.js | 195 + .../living/helpers/runtime-script-errors.js | 2 +- .../lib/jsdom/living/helpers/selectors.js | 21 +- .../lib/jsdom/living/helpers/shadow-dom.js | 26 +- .../jsdom/lib/jsdom/living/helpers/strings.js | 49 +- .../lib/jsdom/living/helpers/style-rules.js | 108 + .../lib/jsdom/living/helpers/stylesheets.js | 6 +- .../jsdom/living/helpers/validate-names.js | 38 +- .../jsdom/living/hr-time/Performance-impl.js | 4 +- node_modules/jsdom/lib/jsdom/living/index.js | 92 - .../jsdom/lib/jsdom/living/interfaces.js | 217 + .../MutationObserver-impl.js | 2 +- .../mutation-observer/MutationRecord-impl.js | 8 +- .../jsdom/living/named-properties-window.js | 2 +- .../jsdom/living/navigator/Navigator-impl.js | 3 +- .../living/navigator/NavigatorPlugins-impl.js | 4 +- .../jsdom/lib/jsdom/living/node-filter.js | 47 - .../jsdom/lib/jsdom/living/node-type.js | 2 +- node_modules/jsdom/lib/jsdom/living/node.js | 70 +- .../jsdom/living/nodes/CDATASection-impl.js | 4 +- .../jsdom/living/nodes/CharacterData-impl.js | 48 +- .../lib/jsdom/living/nodes/Comment-impl.js | 7 +- .../living/nodes/DOMImplementation-impl.js | 42 +- .../jsdom/living/nodes/DOMStringMap-impl.js | 12 +- .../jsdom/living/nodes/DOMTokenList-impl.js | 24 +- .../lib/jsdom/living/nodes/Document-impl.js | 281 +- .../living/nodes/DocumentFragment-impl.js | 8 +- .../living/nodes/DocumentOrShadowRoot-impl.js | 28 + .../jsdom/living/nodes/DocumentType-impl.js | 4 +- .../lib/jsdom/living/nodes/Element-impl.js | 116 +- .../nodes/ElementCSSInlineStyle-impl.js | 1 + .../living/nodes/HTMLAnchorElement-impl.js | 6 +- .../nodes/HTMLAndSVGElementShared-impl.js | 56 - .../living/nodes/HTMLAreaElement-impl.js | 6 +- .../living/nodes/HTMLButtonElement-impl.js | 4 +- .../living/nodes/HTMLCanvasElement-impl.js | 3 + .../jsdom/living/nodes/HTMLCollection-impl.js | 5 +- .../living/nodes/HTMLDataListElement-impl.js | 2 +- .../living/nodes/HTMLDetailsElement-impl.js | 4 +- .../jsdom/living/nodes/HTMLElement-impl.js | 36 +- .../living/nodes/HTMLEmbedElement-impl.js | 11 +- .../living/nodes/HTMLFieldSetElement-impl.js | 6 +- .../living/nodes/HTMLFormElement-impl.js | 49 +- .../living/nodes/HTMLFrameElement-impl.js | 46 +- .../living/nodes/HTMLImageElement-impl.js | 123 +- .../living/nodes/HTMLInputElement-impl.js | 732 +- .../living/nodes/HTMLLabelElement-impl.js | 29 +- .../living/nodes/HTMLLinkElement-impl.js | 17 +- .../living/nodes/HTMLMediaElement-impl.js | 21 +- .../living/nodes/HTMLMeterElement-impl.js | 27 +- .../jsdom/living/nodes/HTMLModElement-impl.js | 11 +- .../living/nodes/HTMLObjectElement-impl.js | 17 - .../living/nodes/HTMLOptionElement-impl.js | 11 +- .../nodes/HTMLOptionsCollection-impl.js | 9 +- .../living/nodes/HTMLOrSVGElement-impl.js | 85 + .../living/nodes/HTMLOutputElement-impl.js | 6 +- .../living/nodes/HTMLProgressElement-impl.js | 48 +- .../living/nodes/HTMLQuoteElement-impl.js | 11 +- .../living/nodes/HTMLScriptElement-impl.js | 34 +- .../living/nodes/HTMLSelectElement-impl.js | 52 +- .../living/nodes/HTMLSlotElement-impl.js | 10 +- .../living/nodes/HTMLSourceElement-impl.js | 20 +- .../living/nodes/HTMLStyleElement-impl.js | 4 +- .../living/nodes/HTMLTableCellElement-impl.js | 8 +- .../living/nodes/HTMLTableElement-impl.js | 27 +- .../living/nodes/HTMLTableRowElement-impl.js | 8 +- .../nodes/HTMLTableSectionElement-impl.js | 15 +- .../living/nodes/HTMLTemplateElement-impl.js | 8 +- .../living/nodes/HTMLTextAreaElement-impl.js | 39 +- .../living/nodes/HTMLTrackElement-impl.js | 8 - .../living/nodes/HTMLVideoElement-impl.js | 9 - .../jsdom/lib/jsdom/living/nodes/Node-impl.js | 360 +- .../lib/jsdom/living/nodes/NodeList-impl.js | 2 +- .../lib/jsdom/living/nodes/ParentNode-impl.js | 6 +- .../nodes/ProcessingInstruction-impl.js | 4 +- .../lib/jsdom/living/nodes/SVGElement-impl.js | 25 +- .../jsdom/living/nodes/SVGSVGElement-impl.js | 6 +- .../lib/jsdom/living/nodes/SVGTests-impl.js | 4 +- .../lib/jsdom/living/nodes/ShadowRoot-impl.js | 17 +- .../jsdom/lib/jsdom/living/nodes/Text-impl.js | 44 +- .../jsdom/lib/jsdom/living/post-message.js | 51 +- .../jsdom/living/range/AbstractRange-impl.js | 43 + .../lib/jsdom/living/range/Range-impl.js | 892 ++ .../jsdom/living/range/StaticRange-impl.js | 39 + .../lib/jsdom/living/range/boundary-point.js | 47 + .../lib/jsdom/living/register-elements.js | 387 - .../jsdom/living/selection/Selection-impl.js | 342 + .../living/svg/SVGAnimatedString-impl.js | 2 +- .../jsdom/lib/jsdom/living/svg/SVGListBase.js | 39 +- .../lib/jsdom/living/svg/SVGNumber-impl.js | 9 +- .../jsdom/living/svg/SVGStringList-impl.js | 4 +- .../living/traversal/NodeIterator-impl.js | 4 +- .../jsdom/living/traversal/TreeWalker-impl.js | 9 +- .../lib/jsdom/living/traversal/helpers.js | 15 +- .../websockets/WebSocket-impl-browser.js | 31 +- .../jsdom/living/websockets/WebSocket-impl.js | 69 +- .../jsdom/living/webstorage/Storage-impl.js | 13 +- .../lib/jsdom/living/window/History-impl.js | 25 +- .../lib/jsdom/living/window/Location-impl.js | 18 +- .../lib/jsdom/living/window/navigation.js | 17 +- .../lib/jsdom/living/xhr/FormData-impl.js | 92 +- .../jsdom/living/xhr/XMLHttpRequest-impl.js | 1022 ++ .../xhr/XMLHttpRequestEventTarget-impl.js | 9 +- .../jsdom/living/{ => xhr}/xhr-sync-worker.js | 26 +- .../lib/jsdom/living/{ => xhr}/xhr-utils.js | 59 +- .../jsdom/living/xmlhttprequest-symbols.js | 4 - .../jsdom/lib/jsdom/living/xmlhttprequest.js | 1093 --- node_modules/jsdom/lib/jsdom/utils.js | 14 - node_modules/jsdom/lib/jsdom/vm-shim.js | 34 +- node_modules/jsdom/node_modules/.bin/acorn | 15 + .../node_modules/.bin/acorn.cmd} | 2 +- .../node_modules/.bin/acorn.ps1} | 4 +- .../jsdom/node_modules/acorn/CHANGELOG.md | 612 ++ .../node_modules/acorn}/LICENSE | 4 +- .../jsdom/node_modules/acorn/README.md | 270 + .../jsdom/node_modules/acorn/bin/acorn | 4 + .../jsdom/node_modules/acorn/dist/acorn.d.ts | 209 + .../jsdom/node_modules/acorn/dist/acorn.js | 5138 ++++++++++ .../node_modules/acorn/dist/acorn.js.map | 1 + .../jsdom/node_modules/acorn/dist/acorn.mjs | 5107 ++++++++++ .../node_modules/acorn/dist/acorn.mjs.d.ts | 2 + .../node_modules/acorn/dist/acorn.mjs.map | 1 + .../jsdom/node_modules/acorn/dist/bin.js | 64 + .../jsdom/node_modules/acorn/package.json | 67 + .../node_modules/parse5}/LICENSE | 4 +- .../jsdom/node_modules/parse5/README.md | 38 + .../node_modules/parse5/lib/common/doctype.js | 162 + .../parse5/lib/common/error-codes.js | 65 + .../parse5/lib/common/foreign-content.js | 265 + .../node_modules/parse5/lib/common/html.js | 272 + .../node_modules/parse5/lib/common/unicode.js | 109 + .../extensions/error-reporting/mixin-base.js | 43 + .../error-reporting/parser-mixin.js | 52 + .../error-reporting/preprocessor-mixin.js | 24 + .../error-reporting/tokenizer-mixin.js | 17 + .../location-info/open-element-stack-mixin.js | 35 + .../extensions/location-info/parser-mixin.js | 222 + .../location-info/tokenizer-mixin.js | 146 + .../position-tracking/preprocessor-mixin.js | 64 + .../jsdom/node_modules/parse5/lib/index.js | 29 + .../lib/parser/formatting-element-list.js | 181 + .../node_modules/parse5/lib/parser/index.js | 2956 ++++++ .../parse5/lib/parser/open-element-stack.js | 482 + .../parse5/lib/serializer/index.js | 176 + .../parse5/lib/tokenizer/index.js | 2196 +++++ .../parse5/lib/tokenizer/named-entity-data.js | 5 + .../parse5/lib/tokenizer/preprocessor.js | 159 + .../parse5/lib/tree-adapters/default.js | 217 + .../parse5/lib/utils/merge-options.js | 13 + .../node_modules/parse5/lib/utils/mixin.js | 39 + .../jsdom/node_modules/parse5/package.json | 67 + node_modules/jsdom/package.json | 138 +- node_modules/lodash/README.md | 4 +- node_modules/lodash/core.js | 23 +- node_modules/lodash/core.min.js | 4 +- node_modules/lodash/lodash.js | 93 +- node_modules/lodash/lodash.min.js | 270 +- node_modules/lodash/package.json | 30 +- node_modules/lower-case/README.md | 45 - node_modules/lower-case/lower-case.d.ts | 3 - node_modules/lower-case/lower-case.js | 54 - node_modules/lower-case/package.json | 81 - node_modules/minify/ChangeLog | 1052 -- node_modules/minify/HELP.md | 114 - node_modules/minify/README.md | 127 - node_modules/minify/bin/minify.js | 101 - node_modules/minify/help.json | 7 - node_modules/minify/lib/css.js | 31 - node_modules/minify/lib/html.js | 47 - node_modules/minify/lib/img.js | 37 - node_modules/minify/lib/js.js | 27 - node_modules/minify/lib/minify.js | 84 - node_modules/minify/package.json | 96 - .../minifyfromhtml/example/css/more.css | 3 + .../minifyfromhtml/example/dist/dist.css | 2 +- .../minifyfromhtml/example/dist/dist.js | 4 +- .../minifyfromhtml/example/dist/dist.js.map | 1 + .../minifyfromhtml/example/index.html | 1 + node_modules/minifyfromhtml/minifyfromhtml.js | 54 +- node_modules/minifyfromhtml/package.json | 40 +- node_modules/ms/index.js | 162 - node_modules/ms/license.md | 21 - node_modules/ms/package.json | 73 - node_modules/ms/readme.md | 60 - node_modules/no-case/README.md | 50 - node_modules/no-case/no-case.d.ts | 3 - node_modules/no-case/no-case.js | 40 - node_modules/no-case/package.json | 86 - .../no-case/vendor/camel-case-regexp.js | 1 - .../no-case/vendor/camel-case-upper-regexp.js | 1 - .../no-case/vendor/non-word-regexp.js | 1 - node_modules/param-case/LICENSE | 21 - node_modules/param-case/README.md | 45 - node_modules/param-case/package.json | 75 - node_modules/param-case/param-case.d.ts | 3 - node_modules/param-case/param-case.js | 12 - node_modules/pn/.travis.yml | 13 - node_modules/pn/README.md | 148 - node_modules/pn/_promise.js | 6 - node_modules/pn/_promisify.js | 58 - node_modules/pn/assert.js | 2 - node_modules/pn/async_hooks.js | 3 - node_modules/pn/buffer.js | 2 - node_modules/pn/child_process.js | 14 - node_modules/pn/cluster.js | 20 - node_modules/pn/console.js | 2 - node_modules/pn/crypto.js | 53 - node_modules/pn/dgram.js | 8 - node_modules/pn/dns.js | 49 - node_modules/pn/domain.js | 10 - node_modules/pn/events.js | 2 - node_modules/pn/fs.js | 87 - node_modules/pn/http.js | 20 - node_modules/pn/http2.js | 15 - node_modules/pn/https.js | 11 - node_modules/pn/inspector.js | 3 - node_modules/pn/net.js | 17 - node_modules/pn/os.js | 2 - node_modules/pn/package.json | 59 - node_modules/pn/path.js | 2 - node_modules/pn/perf_hooks.js | 3 - node_modules/pn/process.js | 74 - node_modules/pn/punycode.js | 3 - node_modules/pn/querystring.js | 2 - node_modules/pn/readline.js | 16 - node_modules/pn/repl.js | 2 - node_modules/pn/scripts/generate.js | 244 - node_modules/pn/stream.js | 14 - node_modules/pn/string_decoder.js | 2 - node_modules/pn/test/cp.js | 13 - node_modules/pn/test/custom.js | 20 - node_modules/pn/test/fs.js | 60 - node_modules/pn/test/load.js | 14 - node_modules/pn/test/timers.js | 34 - node_modules/pn/timers.js | 15 - node_modules/pn/tls.js | 22 - node_modules/pn/tty.js | 2 - node_modules/pn/url.js | 2 - node_modules/pn/util.js | 41 - node_modules/pn/v8.js | 3 - node_modules/pn/vm.js | 2 - node_modules/pn/zlib.js | 81 - node_modules/relateurl/README.md | 159 - node_modules/relateurl/lib/constants.js | 10 - node_modules/relateurl/lib/format.js | 174 - node_modules/relateurl/lib/index.js | 94 - node_modules/relateurl/lib/options.js | 57 - node_modules/relateurl/lib/parse/host.js | 26 - node_modules/relateurl/lib/parse/hrefInfo.js | 20 - node_modules/relateurl/lib/parse/index.js | 58 - node_modules/relateurl/lib/parse/path.js | 100 - node_modules/relateurl/lib/parse/port.js | 32 - node_modules/relateurl/lib/parse/query.js | 53 - node_modules/relateurl/lib/parse/urlstring.js | 146 - .../relateurl/lib/relate/absolutize.js | 89 - .../relateurl/lib/relate/findRelation.js | 79 - node_modules/relateurl/lib/relate/index.js | 18 - .../relateurl/lib/relate/relativize.js | 67 - node_modules/relateurl/lib/util/devlog.js | 25 - node_modules/relateurl/lib/util/object.js | 64 - node_modules/relateurl/lib/util/path.js | 49 - node_modules/relateurl/package.json | 75 - .../node_modules/tough-cookie/LICENSE | 12 + .../node_modules/tough-cookie/README.md | 527 + .../node_modules/tough-cookie/lib/cookie.js | 1482 +++ .../node_modules/tough-cookie/lib/memstore.js | 181 + .../tough-cookie/lib/pathMatch.js | 61 + .../tough-cookie/lib/permuteDomain.js | 56 + .../tough-cookie/lib/pubsuffix-psl.js | 38 + .../node_modules/tough-cookie/lib/store.js | 75 + .../node_modules/tough-cookie/lib/version.js | 2 + .../node_modules/tough-cookie/package.json | 96 + .../request/node_modules/tough-cookie/LICENSE | 12 + .../node_modules/tough-cookie/README.md | 527 + .../node_modules/tough-cookie/lib/cookie.js | 1482 +++ .../node_modules/tough-cookie/lib/memstore.js | 181 + .../tough-cookie/lib/pathMatch.js | 61 + .../tough-cookie/lib/permuteDomain.js | 56 + .../tough-cookie/lib/pubsuffix-psl.js | 38 + .../node_modules/tough-cookie/lib/store.js | 75 + .../node_modules/tough-cookie/lib/version.js | 2 + .../node_modules/tough-cookie/package.json | 96 + node_modules/saxes/CHANGELOG.md | 366 - node_modules/saxes/LICENSE | 64 - node_modules/saxes/README.md | 169 +- node_modules/saxes/lib/saxes.d.ts | 67 - node_modules/saxes/lib/saxes.js | 2065 ---- node_modules/saxes/package.json | 100 +- node_modules/saxes/saxes.d.ts | 635 ++ node_modules/saxes/saxes.js | 2064 ++++ node_modules/saxes/saxes.js.map | 1 + node_modules/terser/CHANGELOG.md | 6 + node_modules/terser/README.md | 1 + node_modules/terser/dist/bundle.min.js | 2 +- node_modules/terser/dist/bundle.min.js.map | 2 +- node_modules/terser/package.json | 34 +- node_modules/tough-cookie/lib/cookie.js | 16 +- node_modules/tough-cookie/lib/version.js | 2 +- node_modules/tough-cookie/package.json | 39 +- node_modules/tr46/README.md | 9 +- node_modules/tr46/index.js | 38 +- node_modules/tr46/lib/mappingTable.json | 2 +- node_modules/tr46/lib/regexes.js | 22 +- node_modules/tr46/lib/statusMapping.js | 11 + node_modules/tr46/package.json | 69 +- node_modules/try-catch/ChangeLog | 45 - node_modules/try-catch/LICENSE | 21 - node_modules/try-catch/README.md | 42 - node_modules/try-catch/lib/try-catch.js | 10 - node_modules/try-catch/package.json | 70 - node_modules/try-to-catch/ChangeLog | 55 - node_modules/try-to-catch/LICENSE | 21 - node_modules/try-to-catch/README.md | 78 - node_modules/try-to-catch/lib/try-to-catch.js | 17 - node_modules/try-to-catch/package.json | 82 - node_modules/uglify-js/LICENSE | 29 - node_modules/uglify-js/README.md | 1159 --- node_modules/uglify-js/bin/uglifyjs | 455 - node_modules/uglify-js/lib/ast.js | 1239 --- node_modules/uglify-js/lib/compress.js | 8480 ----------------- node_modules/uglify-js/lib/minify.js | 261 - node_modules/uglify-js/lib/mozilla-ast.js | 639 -- node_modules/uglify-js/lib/output.js | 1508 --- node_modules/uglify-js/lib/parse.js | 1613 ---- node_modules/uglify-js/lib/propmangle.js | 234 - node_modules/uglify-js/lib/scope.js | 636 -- node_modules/uglify-js/lib/sourcemap.js | 191 - node_modules/uglify-js/lib/transform.js | 185 - node_modules/uglify-js/lib/utils.js | 282 - node_modules/uglify-js/package.json | 106 - node_modules/uglify-js/tools/domprops.json | 6850 ------------- node_modules/uglify-js/tools/exit.js | 15 - node_modules/uglify-js/tools/exports.js | 7 - node_modules/uglify-js/tools/node.js | 78 - node_modules/uglify-js/tools/props.html | 540 -- node_modules/upper-case/LICENSE | 21 - node_modules/upper-case/README.md | 45 - node_modules/upper-case/package.json | 80 - node_modules/upper-case/upper-case.d.ts | 3 - node_modules/upper-case/upper-case.js | 50 - .../LICENSE => w3c-xmlserializer/LICENSE.md} | 9 +- node_modules/w3c-xmlserializer/README.md | 33 +- .../lib/XMLSerializer-impl.js | 9 - .../w3c-xmlserializer/lib/XMLSerializer.js | 113 - node_modules/w3c-xmlserializer/lib/index.js | 9 - .../lib/{serialization.js => serialize.js} | 38 +- node_modules/w3c-xmlserializer/lib/utils.js | 127 - node_modules/w3c-xmlserializer/package.json | 48 +- node_modules/webidl-conversions/README.md | 35 +- node_modules/webidl-conversions/lib/index.js | 249 +- node_modules/webidl-conversions/package.json | 46 +- node_modules/whatwg-url/README.md | 6 +- node_modules/whatwg-url/index.js | 24 + node_modules/whatwg-url/lib/URL-impl.js | 4 +- node_modules/whatwg-url/lib/URL.js | 662 +- .../whatwg-url/lib/URLSearchParams-impl.js | 2 +- .../whatwg-url/lib/URLSearchParams.js | 763 +- node_modules/whatwg-url/lib/public-api.js | 16 - .../whatwg-url/lib/url-state-machine.js | 9 +- node_modules/whatwg-url/lib/utils.js | 40 +- .../webidl-conversions/LICENSE.md | 12 + .../node_modules/webidl-conversions/README.md | 79 + .../webidl-conversions/lib/index.js | 361 + .../webidl-conversions/package.json | 66 + node_modules/whatwg-url/package.json | 61 +- node_modules/whatwg-url/webidl2js-wrapper.js | 7 + node_modules/ws/README.md | 139 +- node_modules/ws/browser.js | 2 +- node_modules/ws/index.js | 1 + node_modules/ws/lib/buffer-util.js | 33 +- node_modules/ws/lib/event-target.js | 39 +- node_modules/ws/lib/extension.js | 39 +- node_modules/ws/lib/limiter.js | 54 + node_modules/ws/lib/permessage-deflate.js | 60 +- node_modules/ws/lib/receiver.js | 27 +- node_modules/ws/lib/sender.js | 56 +- node_modules/ws/lib/stream.js | 164 + node_modules/ws/lib/validation.js | 2 +- node_modules/ws/lib/websocket-server.js | 81 +- node_modules/ws/lib/websocket.js | 252 +- node_modules/ws/package.json | 76 +- package-lock.json | 459 +- package.json | 8 +- 906 files changed, 124011 insertions(+), 93468 deletions(-) delete mode 120000 node_modules/.bin/css-b64-images delete mode 100644 node_modules/.bin/css-b64-images.cmd delete mode 100644 node_modules/.bin/css-b64-images.ps1 delete mode 120000 node_modules/.bin/he delete mode 120000 node_modules/.bin/html-minifier delete mode 100644 node_modules/.bin/html-minifier.cmd delete mode 120000 node_modules/.bin/minify delete mode 100644 node_modules/.bin/minify.ps1 delete mode 120000 node_modules/.bin/uglifyjs delete mode 100644 node_modules/.bin/uglifyjs.cmd delete mode 100644 node_modules/.bin/uglifyjs.ps1 create mode 100644 node_modules/acorn-globals/node_modules/.bin/acorn rename node_modules/{.bin/he.cmd => acorn-globals/node_modules/.bin/acorn.cmd} (84%) rename node_modules/{.bin/he.ps1 => acorn-globals/node_modules/.bin/acorn.ps1} (76%) create mode 100644 node_modules/acorn-globals/node_modules/acorn-walk/CHANGELOG.md rename node_modules/{array-equal => acorn-globals/node_modules/acorn-walk}/LICENSE (93%) create mode 100644 node_modules/acorn-globals/node_modules/acorn-walk/README.md create mode 100644 node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.d.ts create mode 100644 node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.js create mode 100644 node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.js.map create mode 100644 node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.mjs create mode 100644 node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.mjs.map create mode 100644 node_modules/acorn-globals/node_modules/acorn-walk/package.json create mode 100644 node_modules/acorn-globals/node_modules/acorn/CHANGELOG.md rename node_modules/{camel-case => acorn-globals/node_modules/acorn}/LICENSE (92%) create mode 100644 node_modules/acorn-globals/node_modules/acorn/README.md create mode 100644 node_modules/acorn-globals/node_modules/acorn/bin/acorn create mode 100644 node_modules/acorn-globals/node_modules/acorn/dist/acorn.d.ts create mode 100644 node_modules/acorn-globals/node_modules/acorn/dist/acorn.js create mode 100644 node_modules/acorn-globals/node_modules/acorn/dist/acorn.js.map create mode 100644 node_modules/acorn-globals/node_modules/acorn/dist/acorn.mjs create mode 100644 node_modules/acorn-globals/node_modules/acorn/dist/acorn.mjs.d.ts create mode 100644 node_modules/acorn-globals/node_modules/acorn/dist/acorn.mjs.map create mode 100644 node_modules/acorn-globals/node_modules/acorn/dist/bin.js create mode 100644 node_modules/acorn-globals/node_modules/acorn/package.json delete mode 100644 node_modules/array-equal/.npmignore delete mode 100644 node_modules/array-equal/README.md delete mode 100644 node_modules/array-equal/component.json delete mode 100644 node_modules/array-equal/index.js delete mode 100644 node_modules/array-equal/package.json delete mode 100644 node_modules/async-limiter/.eslintignore delete mode 100644 node_modules/async-limiter/.nycrc delete mode 100644 node_modules/async-limiter/.travis.yml delete mode 100644 node_modules/async-limiter/LICENSE delete mode 100644 node_modules/async-limiter/index.js delete mode 100644 node_modules/async-limiter/package.json delete mode 100644 node_modules/async-limiter/readme.md delete mode 100644 node_modules/camel-case/camel-case.d.ts delete mode 100644 node_modules/camel-case/camel-case.js delete mode 100644 node_modules/camel-case/package.json delete mode 100644 node_modules/css-b64-images/.npmignore delete mode 100644 node_modules/css-b64-images/.travis.yml delete mode 100644 node_modules/css-b64-images/README.md delete mode 100644 node_modules/css-b64-images/bin/css-b64-images delete mode 100644 node_modules/css-b64-images/draft.png delete mode 100644 node_modules/css-b64-images/draft.xcf delete mode 100644 node_modules/css-b64-images/lib/css-b64-images.js delete mode 100644 node_modules/css-b64-images/package.json delete mode 100644 node_modules/css-b64-images/test/css-b64-images-test.js delete mode 100644 node_modules/css-b64-images/test/fixture/css/style.css delete mode 100644 node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.eot delete mode 100644 node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.svg delete mode 100644 node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.ttf delete mode 100644 node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.woff delete mode 100644 node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.eot delete mode 100644 node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.svg delete mode 100644 node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.ttf delete mode 100644 node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.woff delete mode 100644 node_modules/css-b64-images/test/fixture/img/background-pattern.gif delete mode 100644 node_modules/css-b64-images/test/fixture/img/dots.svg delete mode 100644 node_modules/css-b64-images/test/fixture/img/mixit-banner.png delete mode 100644 node_modules/cssstyle/.eslintignore delete mode 100644 node_modules/cssstyle/.eslintrc.js delete mode 100644 node_modules/cssstyle/.travis.yml rename node_modules/cssstyle/{MIT-LICENSE.txt => LICENSE} (100%) create mode 100644 node_modules/cssstyle/lib/CSSStyleDeclaration.test.js create mode 100644 node_modules/cssstyle/lib/allWebkitProperties.js create mode 100644 node_modules/cssstyle/lib/parsers.test.js create mode 100644 node_modules/cssstyle/lib/utils/colorSpace.js rename node_modules/{minify/LICENSE => cssstyle/node_modules/cssom/LICENSE.txt} (92%) create mode 100644 node_modules/cssstyle/node_modules/cssom/README.mdown create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSDocumentRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSFontFaceRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSHostRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSImportRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSKeyframeRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSKeyframesRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSMediaRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSOM.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSStyleDeclaration.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSStyleRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSStyleSheet.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSSupportsRule.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSValue.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/CSSValueExpression.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/MatcherList.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/MediaList.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/StyleSheet.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/clone.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/index.js create mode 100644 node_modules/cssstyle/node_modules/cssom/lib/parse.js create mode 100644 node_modules/cssstyle/node_modules/cssom/package.json delete mode 100644 node_modules/cssstyle/scripts/download_latest_properties.js delete mode 100644 node_modules/cssstyle/scripts/generate_implemented_properties.js delete mode 100644 node_modules/cssstyle/scripts/generate_properties.js delete mode 100644 node_modules/cssstyle/tests/tests.js delete mode 100644 node_modules/debug/CHANGELOG.md delete mode 100644 node_modules/debug/LICENSE delete mode 100644 node_modules/debug/README.md delete mode 100644 node_modules/debug/dist/debug.js delete mode 100644 node_modules/debug/package.json delete mode 100644 node_modules/debug/src/browser.js delete mode 100644 node_modules/debug/src/common.js delete mode 100644 node_modules/debug/src/index.js delete mode 100644 node_modules/debug/src/node.js create mode 100644 node_modules/decimal.js/CHANGELOG.md create mode 100644 node_modules/decimal.js/LICENCE.md create mode 100644 node_modules/decimal.js/README.md create mode 100644 node_modules/decimal.js/decimal.d.ts create mode 100644 node_modules/decimal.js/decimal.global.d.ts create mode 100644 node_modules/decimal.js/decimal.js create mode 100644 node_modules/decimal.js/decimal.min.js create mode 100644 node_modules/decimal.js/decimal.min.js.map create mode 100644 node_modules/decimal.js/decimal.mjs create mode 100644 node_modules/decimal.js/doc/API.html create mode 100644 node_modules/decimal.js/package.json create mode 100644 node_modules/domexception/index.js delete mode 100644 node_modules/domexception/lib/public-api.js create mode 100644 node_modules/domexception/node_modules/webidl-conversions/LICENSE.md create mode 100644 node_modules/domexception/node_modules/webidl-conversions/README.md create mode 100644 node_modules/domexception/node_modules/webidl-conversions/lib/index.js create mode 100644 node_modules/domexception/node_modules/webidl-conversions/package.json create mode 100644 node_modules/domexception/webidl2js-wrapper.js delete mode 100644 node_modules/he/README.md delete mode 100644 node_modules/he/bin/he delete mode 100644 node_modules/he/he.js delete mode 100644 node_modules/he/man/he.1 delete mode 100644 node_modules/he/package.json delete mode 100644 node_modules/html-minifier/README.md delete mode 100755 node_modules/html-minifier/cli.js delete mode 100644 node_modules/html-minifier/package.json delete mode 100644 node_modules/html-minifier/sample-cli-config-file.conf delete mode 100644 node_modules/html-minifier/src/htmlminifier.js delete mode 100644 node_modules/html-minifier/src/htmlparser.js delete mode 100644 node_modules/html-minifier/src/tokenchain.js delete mode 100644 node_modules/html-minifier/src/utils.js create mode 100644 node_modules/ip-regex/index.js rename node_modules/{relateurl => ip-regex}/license (93%) create mode 100644 node_modules/ip-regex/package.json create mode 100644 node_modules/ip-regex/readme.md rename node_modules/{he => is-potential-custom-element-name}/LICENSE-MIT.txt (100%) create mode 100644 node_modules/is-potential-custom-element-name/index.js create mode 100644 node_modules/is-potential-custom-element-name/package.json create mode 100644 node_modules/jsdom/lib/jsdom/browser/js-globals.json create mode 100644 node_modules/jsdom/lib/jsdom/living/cssom/StyleSheetList-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/custom-elements/CustomElementRegistry-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/documents.js create mode 100644 node_modules/jsdom/lib/jsdom/living/domparsing/XMLSerializer-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/fetch/Headers-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/fetch/header-list.js create mode 100644 node_modules/jsdom/lib/jsdom/living/fetch/header-types.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/AbstractRange.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/ChildNode.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/CustomElementRegistry.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/ElementCSSInlineStyle.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/ElementContentEditable.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/ElementDefinitionOptions.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/EventListener.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/GlobalEventHandlers.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/HTMLHyperlinkElementUtils.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/Headers.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/LinkStyle.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/NavigatorConcurrentHardware.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/NavigatorCookies.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/NavigatorID.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/NavigatorLanguage.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/NavigatorOnLine.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/NavigatorPlugins.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/NodeFilter.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/NonDocumentTypeChildNode.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/NonElementParentNode.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/ParentNode.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/Range.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/SVGTests.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/Selection.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/Slotable.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/StaticRange.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/StaticRangeInit.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/StyleSheetList.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/generated/WindowEventHandlers.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequest.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/XMLHttpRequestResponseType.js create mode 100644 node_modules/jsdom/lib/jsdom/living/generated/XMLSerializer.js create mode 100644 node_modules/jsdom/lib/jsdom/living/helpers/binary-data.js create mode 100644 node_modules/jsdom/lib/jsdom/living/helpers/create-element.js create mode 100644 node_modules/jsdom/lib/jsdom/living/helpers/details.js create mode 100644 node_modules/jsdom/lib/jsdom/living/helpers/html-constructor.js create mode 100644 node_modules/jsdom/lib/jsdom/living/helpers/node.js create mode 100644 node_modules/jsdom/lib/jsdom/living/helpers/number-and-date-inputs.js create mode 100644 node_modules/jsdom/lib/jsdom/living/helpers/style-rules.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/index.js create mode 100644 node_modules/jsdom/lib/jsdom/living/interfaces.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/node-filter.js create mode 100644 node_modules/jsdom/lib/jsdom/living/nodes/DocumentOrShadowRoot-impl.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/nodes/HTMLAndSVGElementShared-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/range/AbstractRange-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/range/Range-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/range/StaticRange-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/range/boundary-point.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/register-elements.js create mode 100644 node_modules/jsdom/lib/jsdom/living/selection/Selection-impl.js create mode 100644 node_modules/jsdom/lib/jsdom/living/xhr/XMLHttpRequest-impl.js rename node_modules/jsdom/lib/jsdom/living/{ => xhr}/xhr-sync-worker.js (59%) rename node_modules/jsdom/lib/jsdom/living/{ => xhr}/xhr-utils.js (88%) delete mode 100644 node_modules/jsdom/lib/jsdom/living/xmlhttprequest-symbols.js delete mode 100644 node_modules/jsdom/lib/jsdom/living/xmlhttprequest.js create mode 100644 node_modules/jsdom/node_modules/.bin/acorn rename node_modules/{.bin/minify.cmd => jsdom/node_modules/.bin/acorn.cmd} (82%) rename node_modules/{.bin/html-minifier.ps1 => jsdom/node_modules/.bin/acorn.ps1} (75%) create mode 100644 node_modules/jsdom/node_modules/acorn/CHANGELOG.md rename node_modules/{no-case => jsdom/node_modules/acorn}/LICENSE (92%) create mode 100644 node_modules/jsdom/node_modules/acorn/README.md create mode 100644 node_modules/jsdom/node_modules/acorn/bin/acorn create mode 100644 node_modules/jsdom/node_modules/acorn/dist/acorn.d.ts create mode 100644 node_modules/jsdom/node_modules/acorn/dist/acorn.js create mode 100644 node_modules/jsdom/node_modules/acorn/dist/acorn.js.map create mode 100644 node_modules/jsdom/node_modules/acorn/dist/acorn.mjs create mode 100644 node_modules/jsdom/node_modules/acorn/dist/acorn.mjs.d.ts create mode 100644 node_modules/jsdom/node_modules/acorn/dist/acorn.mjs.map create mode 100644 node_modules/jsdom/node_modules/acorn/dist/bin.js create mode 100644 node_modules/jsdom/node_modules/acorn/package.json rename node_modules/{lower-case => jsdom/node_modules/parse5}/LICENSE (92%) create mode 100644 node_modules/jsdom/node_modules/parse5/README.md create mode 100644 node_modules/jsdom/node_modules/parse5/lib/common/doctype.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/common/error-codes.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/common/foreign-content.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/common/html.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/common/unicode.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/extensions/error-reporting/mixin-base.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/extensions/error-reporting/parser-mixin.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/extensions/error-reporting/preprocessor-mixin.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/extensions/error-reporting/tokenizer-mixin.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/extensions/location-info/open-element-stack-mixin.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/extensions/location-info/parser-mixin.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/extensions/location-info/tokenizer-mixin.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/extensions/position-tracking/preprocessor-mixin.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/index.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/parser/formatting-element-list.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/parser/index.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/parser/open-element-stack.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/serializer/index.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/tokenizer/index.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/tokenizer/named-entity-data.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/tokenizer/preprocessor.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/tree-adapters/default.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/utils/merge-options.js create mode 100644 node_modules/jsdom/node_modules/parse5/lib/utils/mixin.js create mode 100644 node_modules/jsdom/node_modules/parse5/package.json delete mode 100644 node_modules/lower-case/README.md delete mode 100644 node_modules/lower-case/lower-case.d.ts delete mode 100644 node_modules/lower-case/lower-case.js delete mode 100644 node_modules/lower-case/package.json delete mode 100644 node_modules/minify/ChangeLog delete mode 100644 node_modules/minify/HELP.md delete mode 100644 node_modules/minify/README.md delete mode 100755 node_modules/minify/bin/minify.js delete mode 100644 node_modules/minify/help.json delete mode 100644 node_modules/minify/lib/css.js delete mode 100644 node_modules/minify/lib/html.js delete mode 100644 node_modules/minify/lib/img.js delete mode 100644 node_modules/minify/lib/js.js delete mode 100644 node_modules/minify/lib/minify.js delete mode 100644 node_modules/minify/package.json create mode 100644 node_modules/minifyfromhtml/example/css/more.css create mode 100644 node_modules/minifyfromhtml/example/dist/dist.js.map delete mode 100644 node_modules/ms/index.js delete mode 100644 node_modules/ms/license.md delete mode 100644 node_modules/ms/package.json delete mode 100644 node_modules/ms/readme.md delete mode 100644 node_modules/no-case/README.md delete mode 100644 node_modules/no-case/no-case.d.ts delete mode 100644 node_modules/no-case/no-case.js delete mode 100644 node_modules/no-case/package.json delete mode 100644 node_modules/no-case/vendor/camel-case-regexp.js delete mode 100644 node_modules/no-case/vendor/camel-case-upper-regexp.js delete mode 100644 node_modules/no-case/vendor/non-word-regexp.js delete mode 100644 node_modules/param-case/LICENSE delete mode 100644 node_modules/param-case/README.md delete mode 100644 node_modules/param-case/package.json delete mode 100644 node_modules/param-case/param-case.d.ts delete mode 100644 node_modules/param-case/param-case.js delete mode 100644 node_modules/pn/.travis.yml delete mode 100644 node_modules/pn/README.md delete mode 100644 node_modules/pn/_promise.js delete mode 100644 node_modules/pn/_promisify.js delete mode 100644 node_modules/pn/assert.js delete mode 100644 node_modules/pn/async_hooks.js delete mode 100644 node_modules/pn/buffer.js delete mode 100644 node_modules/pn/child_process.js delete mode 100644 node_modules/pn/cluster.js delete mode 100644 node_modules/pn/console.js delete mode 100644 node_modules/pn/crypto.js delete mode 100644 node_modules/pn/dgram.js delete mode 100644 node_modules/pn/dns.js delete mode 100644 node_modules/pn/domain.js delete mode 100644 node_modules/pn/events.js delete mode 100644 node_modules/pn/fs.js delete mode 100644 node_modules/pn/http.js delete mode 100644 node_modules/pn/http2.js delete mode 100644 node_modules/pn/https.js delete mode 100644 node_modules/pn/inspector.js delete mode 100644 node_modules/pn/net.js delete mode 100644 node_modules/pn/os.js delete mode 100644 node_modules/pn/package.json delete mode 100644 node_modules/pn/path.js delete mode 100644 node_modules/pn/perf_hooks.js delete mode 100644 node_modules/pn/process.js delete mode 100644 node_modules/pn/punycode.js delete mode 100644 node_modules/pn/querystring.js delete mode 100644 node_modules/pn/readline.js delete mode 100644 node_modules/pn/repl.js delete mode 100644 node_modules/pn/scripts/generate.js delete mode 100644 node_modules/pn/stream.js delete mode 100644 node_modules/pn/string_decoder.js delete mode 100644 node_modules/pn/test/cp.js delete mode 100644 node_modules/pn/test/custom.js delete mode 100644 node_modules/pn/test/fs.js delete mode 100644 node_modules/pn/test/load.js delete mode 100644 node_modules/pn/test/timers.js delete mode 100644 node_modules/pn/timers.js delete mode 100644 node_modules/pn/tls.js delete mode 100644 node_modules/pn/tty.js delete mode 100644 node_modules/pn/url.js delete mode 100644 node_modules/pn/util.js delete mode 100644 node_modules/pn/v8.js delete mode 100644 node_modules/pn/vm.js delete mode 100644 node_modules/pn/zlib.js delete mode 100644 node_modules/relateurl/README.md delete mode 100644 node_modules/relateurl/lib/constants.js delete mode 100644 node_modules/relateurl/lib/format.js delete mode 100644 node_modules/relateurl/lib/index.js delete mode 100644 node_modules/relateurl/lib/options.js delete mode 100644 node_modules/relateurl/lib/parse/host.js delete mode 100644 node_modules/relateurl/lib/parse/hrefInfo.js delete mode 100644 node_modules/relateurl/lib/parse/index.js delete mode 100644 node_modules/relateurl/lib/parse/path.js delete mode 100644 node_modules/relateurl/lib/parse/port.js delete mode 100644 node_modules/relateurl/lib/parse/query.js delete mode 100644 node_modules/relateurl/lib/parse/urlstring.js delete mode 100644 node_modules/relateurl/lib/relate/absolutize.js delete mode 100644 node_modules/relateurl/lib/relate/findRelation.js delete mode 100644 node_modules/relateurl/lib/relate/index.js delete mode 100644 node_modules/relateurl/lib/relate/relativize.js delete mode 100644 node_modules/relateurl/lib/util/devlog.js delete mode 100644 node_modules/relateurl/lib/util/object.js delete mode 100644 node_modules/relateurl/lib/util/path.js delete mode 100644 node_modules/relateurl/package.json create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/LICENSE create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/README.md create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/lib/cookie.js create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/lib/memstore.js create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/lib/pathMatch.js create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/lib/permuteDomain.js create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/lib/pubsuffix-psl.js create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/lib/store.js create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/lib/version.js create mode 100644 node_modules/request-promise-native/node_modules/tough-cookie/package.json create mode 100644 node_modules/request/node_modules/tough-cookie/LICENSE create mode 100644 node_modules/request/node_modules/tough-cookie/README.md create mode 100644 node_modules/request/node_modules/tough-cookie/lib/cookie.js create mode 100644 node_modules/request/node_modules/tough-cookie/lib/memstore.js create mode 100644 node_modules/request/node_modules/tough-cookie/lib/pathMatch.js create mode 100644 node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js create mode 100644 node_modules/request/node_modules/tough-cookie/lib/pubsuffix-psl.js create mode 100644 node_modules/request/node_modules/tough-cookie/lib/store.js create mode 100644 node_modules/request/node_modules/tough-cookie/lib/version.js create mode 100644 node_modules/request/node_modules/tough-cookie/package.json delete mode 100644 node_modules/saxes/CHANGELOG.md delete mode 100644 node_modules/saxes/LICENSE delete mode 100644 node_modules/saxes/lib/saxes.d.ts delete mode 100644 node_modules/saxes/lib/saxes.js create mode 100644 node_modules/saxes/saxes.d.ts create mode 100644 node_modules/saxes/saxes.js create mode 100644 node_modules/saxes/saxes.js.map create mode 100644 node_modules/tr46/lib/statusMapping.js delete mode 100644 node_modules/try-catch/ChangeLog delete mode 100644 node_modules/try-catch/LICENSE delete mode 100644 node_modules/try-catch/README.md delete mode 100644 node_modules/try-catch/lib/try-catch.js delete mode 100644 node_modules/try-catch/package.json delete mode 100644 node_modules/try-to-catch/ChangeLog delete mode 100644 node_modules/try-to-catch/LICENSE delete mode 100644 node_modules/try-to-catch/README.md delete mode 100644 node_modules/try-to-catch/lib/try-to-catch.js delete mode 100644 node_modules/try-to-catch/package.json delete mode 100644 node_modules/uglify-js/LICENSE delete mode 100644 node_modules/uglify-js/README.md delete mode 100755 node_modules/uglify-js/bin/uglifyjs delete mode 100644 node_modules/uglify-js/lib/ast.js delete mode 100644 node_modules/uglify-js/lib/compress.js delete mode 100644 node_modules/uglify-js/lib/minify.js delete mode 100644 node_modules/uglify-js/lib/mozilla-ast.js delete mode 100644 node_modules/uglify-js/lib/output.js delete mode 100644 node_modules/uglify-js/lib/parse.js delete mode 100644 node_modules/uglify-js/lib/propmangle.js delete mode 100644 node_modules/uglify-js/lib/scope.js delete mode 100644 node_modules/uglify-js/lib/sourcemap.js delete mode 100644 node_modules/uglify-js/lib/transform.js delete mode 100644 node_modules/uglify-js/lib/utils.js delete mode 100644 node_modules/uglify-js/package.json delete mode 100644 node_modules/uglify-js/tools/domprops.json delete mode 100644 node_modules/uglify-js/tools/exit.js delete mode 100644 node_modules/uglify-js/tools/exports.js delete mode 100644 node_modules/uglify-js/tools/node.js delete mode 100644 node_modules/uglify-js/tools/props.html delete mode 100644 node_modules/upper-case/LICENSE delete mode 100644 node_modules/upper-case/README.md delete mode 100644 node_modules/upper-case/package.json delete mode 100644 node_modules/upper-case/upper-case.d.ts delete mode 100644 node_modules/upper-case/upper-case.js rename node_modules/{html-minifier/LICENSE => w3c-xmlserializer/LICENSE.md} (81%) delete mode 100644 node_modules/w3c-xmlserializer/lib/XMLSerializer-impl.js delete mode 100644 node_modules/w3c-xmlserializer/lib/XMLSerializer.js delete mode 100644 node_modules/w3c-xmlserializer/lib/index.js rename node_modules/w3c-xmlserializer/lib/{serialization.js => serialize.js} (88%) delete mode 100644 node_modules/w3c-xmlserializer/lib/utils.js create mode 100644 node_modules/whatwg-url/index.js delete mode 100644 node_modules/whatwg-url/lib/public-api.js create mode 100644 node_modules/whatwg-url/node_modules/webidl-conversions/LICENSE.md create mode 100644 node_modules/whatwg-url/node_modules/webidl-conversions/README.md create mode 100644 node_modules/whatwg-url/node_modules/webidl-conversions/lib/index.js create mode 100644 node_modules/whatwg-url/node_modules/webidl-conversions/package.json create mode 100644 node_modules/whatwg-url/webidl2js-wrapper.js create mode 100644 node_modules/ws/lib/limiter.js create mode 100644 node_modules/ws/lib/stream.js diff --git a/node_modules/.bin/css-b64-images b/node_modules/.bin/css-b64-images deleted file mode 120000 index 808b0ce..0000000 --- a/node_modules/.bin/css-b64-images +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../css-b64-images/bin/css-b64-images" "$@" - ret=$? -else - node "$basedir/../css-b64-images/bin/css-b64-images" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/.bin/css-b64-images.cmd b/node_modules/.bin/css-b64-images.cmd deleted file mode 100644 index db1bd6b..0000000 --- a/node_modules/.bin/css-b64-images.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -"%_prog%" "%dp0%\..\css-b64-images\bin\css-b64-images" %* -ENDLOCAL -EXIT /b %errorlevel% -:find_dp0 -SET dp0=%~dp0 -EXIT /b diff --git a/node_modules/.bin/css-b64-images.ps1 b/node_modules/.bin/css-b64-images.ps1 deleted file mode 100644 index dac988f..0000000 --- a/node_modules/.bin/css-b64-images.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - & "$basedir/node$exe" "$basedir/../css-b64-images/bin/css-b64-images" $args - $ret=$LASTEXITCODE -} else { - & "node$exe" "$basedir/../css-b64-images/bin/css-b64-images" $args - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/he b/node_modules/.bin/he deleted file mode 120000 index 6837070..0000000 --- a/node_modules/.bin/he +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../he/bin/he" "$@" - ret=$? -else - node "$basedir/../he/bin/he" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/.bin/html-minifier b/node_modules/.bin/html-minifier deleted file mode 120000 index 8c6403f..0000000 --- a/node_modules/.bin/html-minifier +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../html-minifier/cli.js" "$@" - ret=$? -else - node "$basedir/../html-minifier/cli.js" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/.bin/html-minifier.cmd b/node_modules/.bin/html-minifier.cmd deleted file mode 100644 index 5547e48..0000000 --- a/node_modules/.bin/html-minifier.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -"%_prog%" "%dp0%\..\html-minifier\cli.js" %* -ENDLOCAL -EXIT /b %errorlevel% -:find_dp0 -SET dp0=%~dp0 -EXIT /b diff --git a/node_modules/.bin/minify b/node_modules/.bin/minify deleted file mode 120000 index 6d5030b..0000000 --- a/node_modules/.bin/minify +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../minify/bin/minify.js" "$@" - ret=$? -else - node "$basedir/../minify/bin/minify.js" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/.bin/minify.ps1 b/node_modules/.bin/minify.ps1 deleted file mode 100644 index 143b6e0..0000000 --- a/node_modules/.bin/minify.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - & "$basedir/node$exe" "$basedir/../minify/bin/minify.js" $args - $ret=$LASTEXITCODE -} else { - & "node$exe" "$basedir/../minify/bin/minify.js" $args - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/.bin/uglifyjs b/node_modules/.bin/uglifyjs deleted file mode 120000 index 8aa695c..0000000 --- a/node_modules/.bin/uglifyjs +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") - -case `uname` in - *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; -esac - -if [ -x "$basedir/node" ]; then - "$basedir/node" "$basedir/../uglify-js/bin/uglifyjs" "$@" - ret=$? -else - node "$basedir/../uglify-js/bin/uglifyjs" "$@" - ret=$? -fi -exit $ret diff --git a/node_modules/.bin/uglifyjs.cmd b/node_modules/.bin/uglifyjs.cmd deleted file mode 100644 index ad74c56..0000000 --- a/node_modules/.bin/uglifyjs.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@ECHO off -SETLOCAL -CALL :find_dp0 - -IF EXIST "%dp0%\node.exe" ( - SET "_prog=%dp0%\node.exe" -) ELSE ( - SET "_prog=node" - SET PATHEXT=%PATHEXT:;.JS;=;% -) - -"%_prog%" "%dp0%\..\uglify-js\bin\uglifyjs" %* -ENDLOCAL -EXIT /b %errorlevel% -:find_dp0 -SET dp0=%~dp0 -EXIT /b diff --git a/node_modules/.bin/uglifyjs.ps1 b/node_modules/.bin/uglifyjs.ps1 deleted file mode 100644 index e6749c7..0000000 --- a/node_modules/.bin/uglifyjs.ps1 +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -} -$ret=0 -if (Test-Path "$basedir/node$exe") { - & "$basedir/node$exe" "$basedir/../uglify-js/bin/uglifyjs" $args - $ret=$LASTEXITCODE -} else { - & "node$exe" "$basedir/../uglify-js/bin/uglifyjs" $args - $ret=$LASTEXITCODE -} -exit $ret diff --git a/node_modules/@ungap/url-search-params/cjs/index.js b/node_modules/@ungap/url-search-params/cjs/index.js index c35a060..9ca81af 100644 --- a/node_modules/@ungap/url-search-params/cjs/index.js +++ b/node_modules/@ungap/url-search-params/cjs/index.js @@ -1,5 +1,5 @@ /*! (c) Andrea Giammarchi - ISC */ -var self = this || /* istanbul ignore next */ {}; +var self = {}; try { (function (URLSearchParams, plus) { if ( diff --git a/node_modules/@ungap/url-search-params/esm/index.js b/node_modules/@ungap/url-search-params/esm/index.js index 497a668..1ee409a 100644 --- a/node_modules/@ungap/url-search-params/esm/index.js +++ b/node_modules/@ungap/url-search-params/esm/index.js @@ -1,5 +1,5 @@ /*! (c) Andrea Giammarchi - ISC */ -var self = this || /* istanbul ignore next */ {}; +var self = {}; try { (function (URLSearchParams, plus) { if ( diff --git a/node_modules/@ungap/url-search-params/index.js b/node_modules/@ungap/url-search-params/index.js index a2b0183..ac7e220 100644 --- a/node_modules/@ungap/url-search-params/index.js +++ b/node_modules/@ungap/url-search-params/index.js @@ -1,5 +1,5 @@ /*! (c) Andrea Giammarchi - ISC */ -var self = this || /* istanbul ignore next */ {}; +var self = this || {}; try { (function (URLSearchParams, plus) { if ( diff --git a/node_modules/@ungap/url-search-params/min.js b/node_modules/@ungap/url-search-params/min.js index ff9e344..ddf750e 100644 --- a/node_modules/@ungap/url-search-params/min.js +++ b/node_modules/@ungap/url-search-params/min.js @@ -1,2 +1,2 @@ /*! (c) Andrea Giammarchi - ISC */ -var self=this||{};try{!function(t,e){if(new t("q=%2B").get("q")!==e||new t({q:e}).get("q")!==e||new t([["q",e]]).get("q")!==e||"q=%0A"!==new t("q=\n").toString()||"q=+%26"!==new t({q:" &"}).toString()||"q=%25zx"!==new t({q:"%zx"}).toString())throw t;self.URLSearchParams=t}(URLSearchParams,"+")}catch(t){!function(t,a,o){"use strict";var u=t.create,h=t.defineProperty,e=/[!'\(\)~]|%20|%00/g,n=/%(?![0-9a-fA-F]{2})/g,r=/\+/g,i={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"},s={append:function(t,e){p(this._ungap,t,e)},delete:function(t){delete this._ungap[t]},get:function(t){return this.has(t)?this._ungap[t][0]:null},getAll:function(t){return this.has(t)?this._ungap[t].slice(0):[]},has:function(t){return t in this._ungap},set:function(t,e){this._ungap[t]=[a(e)]},forEach:function(e,n){var r=this;for(var i in r._ungap)r._ungap[i].forEach(t,i);function t(t){e.call(n,t,a(i),r)}},toJSON:function(){return{}},toString:function(){var t=[];for(var e in this._ungap)for(var n=v(e),r=0,i=this._ungap[e];r> cjs/index.js", + "cjs": "cat index.js | sed 's/var self = this || {};/var self = {};/' > cjs/index.js && echo 'module.exports = self.URLSearchParams;' >> cjs/index.js", "coveralls": "nyc report --reporter=text-lcov | coveralls", - "esm": "cp index.js esm/ && echo 'export default self.URLSearchParams;' >> esm/index.js", + "esm": "cat index.js | sed 's/var self = this || {};/var self = {};/' > esm/index.js && echo 'export default self.URLSearchParams;' >> esm/index.js", "min": "uglifyjs index.js --support-ie8 --comments=/^!/ -c -m -o min.js", "size": "cat index.js | wc -c && cat min.js | wc -c && gzip -c9 min.js | wc -c && cat min.js | brotli | wc -c", "test": "nyc node test/index.js" }, "type": "module", "unpkg": "min.js", - "version": "0.2.0" + "version": "0.2.2" } diff --git a/node_modules/acorn-globals/node_modules/.bin/acorn b/node_modules/acorn-globals/node_modules/.bin/acorn new file mode 100644 index 0000000..c31c430 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/.bin/acorn @@ -0,0 +1,15 @@ +#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')") + +case `uname` in + *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;; +esac + +if [ -x "$basedir/node" ]; then + "$basedir/node" "$basedir/../acorn/bin/acorn" "$@" + ret=$? +else + node "$basedir/../acorn/bin/acorn" "$@" + ret=$? +fi +exit $ret diff --git a/node_modules/.bin/he.cmd b/node_modules/acorn-globals/node_modules/.bin/acorn.cmd similarity index 84% rename from node_modules/.bin/he.cmd rename to node_modules/acorn-globals/node_modules/.bin/acorn.cmd index efc7fc8..3c863f5 100644 --- a/node_modules/.bin/he.cmd +++ b/node_modules/acorn-globals/node_modules/.bin/acorn.cmd @@ -9,7 +9,7 @@ IF EXIST "%dp0%\node.exe" ( SET PATHEXT=%PATHEXT:;.JS;=;% ) -"%_prog%" "%dp0%\..\he\bin\he" %* +"%_prog%" "%dp0%\..\acorn\bin\acorn" %* ENDLOCAL EXIT /b %errorlevel% :find_dp0 diff --git a/node_modules/.bin/he.ps1 b/node_modules/acorn-globals/node_modules/.bin/acorn.ps1 similarity index 76% rename from node_modules/.bin/he.ps1 rename to node_modules/acorn-globals/node_modules/.bin/acorn.ps1 index 4f94281..759f820 100644 --- a/node_modules/.bin/he.ps1 +++ b/node_modules/acorn-globals/node_modules/.bin/acorn.ps1 @@ -9,10 +9,10 @@ if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { } $ret=0 if (Test-Path "$basedir/node$exe") { - & "$basedir/node$exe" "$basedir/../he/bin/he" $args + & "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args $ret=$LASTEXITCODE } else { - & "node$exe" "$basedir/../he/bin/he" $args + & "node$exe" "$basedir/../acorn/bin/acorn" $args $ret=$LASTEXITCODE } exit $ret diff --git a/node_modules/acorn-globals/node_modules/acorn-walk/CHANGELOG.md b/node_modules/acorn-globals/node_modules/acorn-walk/CHANGELOG.md new file mode 100644 index 0000000..c6c2e05 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn-walk/CHANGELOG.md @@ -0,0 +1,131 @@ +## 7.2.0 (2020-06-17) + +### New features + +Support optional chaining and nullish coalescing. + +Support `import.meta`. + +Add support for `export * as ns from "source"`. + +## 7.1.1 (2020-02-13) + +### Bug fixes + +Clean up the type definitions to actually work well with the main parser. + +## 7.1.0 (2020-02-11) + +### New features + +Add a TypeScript definition file for the library. + +## 7.0.0 (2017-08-12) + +### New features + +Support walking `ImportExpression` nodes. + +## 6.2.0 (2017-07-04) + +### New features + +Add support for `Import` nodes. + +## 6.1.0 (2018-09-28) + +### New features + +The walker now walks `TemplateElement` nodes. + +## 6.0.1 (2018-09-14) + +### Bug fixes + +Fix bad "main" field in package.json. + +## 6.0.0 (2018-09-14) + +### Breaking changes + +This is now a separate package, `acorn-walk`, rather than part of the main `acorn` package. + +The `ScopeBody` and `ScopeExpression` meta-node-types are no longer supported. + +## 5.7.1 (2018-06-15) + +### Bug fixes + +Make sure the walker and bin files are rebuilt on release (the previous release didn't get the up-to-date versions). + +## 5.7.0 (2018-06-15) + +### Bug fixes + +Fix crash in walker when walking a binding-less catch node. + +## 5.6.2 (2018-06-05) + +### Bug fixes + +In the walker, go back to allowing the `baseVisitor` argument to be null to default to the default base everywhere. + +## 5.6.1 (2018-06-01) + +### Bug fixes + +Fix regression when passing `null` as fourth argument to `walk.recursive`. + +## 5.6.0 (2018-05-31) + +### Bug fixes + +Fix a bug in the walker that caused a crash when walking an object pattern spread. + +## 5.5.1 (2018-03-06) + +### Bug fixes + +Fix regression in walker causing property values in object patterns to be walked as expressions. + +## 5.5.0 (2018-02-27) + +### Bug fixes + +Support object spread in the AST walker. + +## 5.4.1 (2018-02-02) + +### Bug fixes + +5.4.0 somehow accidentally included an old version of walk.js. + +## 5.2.0 (2017-10-30) + +### Bug fixes + +The `full` and `fullAncestor` walkers no longer visit nodes multiple times. + +## 5.1.0 (2017-07-05) + +### New features + +New walker functions `full` and `fullAncestor`. + +## 3.2.0 (2016-06-07) + +### New features + +Make it possible to use `visit.ancestor` with a walk state. + +## 3.1.0 (2016-04-18) + +### New features + +The walker now allows defining handlers for `CatchClause` nodes. + +## 2.5.2 (2015-10-27) + +### Fixes + +Fix bug where the walker walked an exported `let` statement as an expression. diff --git a/node_modules/array-equal/LICENSE b/node_modules/acorn-globals/node_modules/acorn-walk/LICENSE similarity index 93% rename from node_modules/array-equal/LICENSE rename to node_modules/acorn-globals/node_modules/acorn-walk/LICENSE index a7ae8ee..2c0632b 100644 --- a/node_modules/array-equal/LICENSE +++ b/node_modules/acorn-globals/node_modules/acorn-walk/LICENSE @@ -1,7 +1,4 @@ - -The MIT License (MIT) - -Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (C) 2012-2018 by various contributors (see AUTHORS) 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/acorn-globals/node_modules/acorn-walk/README.md b/node_modules/acorn-globals/node_modules/acorn-walk/README.md new file mode 100644 index 0000000..e192bac --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn-walk/README.md @@ -0,0 +1,126 @@ +# Acorn AST walker + +An abstract syntax tree walker for the +[ESTree](https://github.com/estree/estree) format. + +## Community + +Acorn is open source software released under an +[MIT license](https://github.com/acornjs/acorn/blob/master/acorn-walk/LICENSE). + +You are welcome to +[report bugs](https://github.com/acornjs/acorn/issues) or create pull +requests on [github](https://github.com/acornjs/acorn). For questions +and discussion, please use the +[Tern discussion forum](https://discuss.ternjs.net). + +## Installation + +The easiest way to install acorn is from [`npm`](https://www.npmjs.com/): + +```sh +npm install acorn-walk +``` + +Alternately, you can download the source and build acorn yourself: + +```sh +git clone https://github.com/acornjs/acorn.git +cd acorn +npm install +``` + +## Interface + +An algorithm for recursing through a syntax tree is stored as an +object, with a property for each tree node type holding a function +that will recurse through such a node. There are several ways to run +such a walker. + +**simple**`(node, visitors, base, state)` does a 'simple' walk over a +tree. `node` should be the AST node to walk, and `visitors` an object +with properties whose names correspond to node types in the [ESTree +spec](https://github.com/estree/estree). The properties should contain +functions that will be called with the node object and, if applicable +the state at that point. The last two arguments are optional. `base` +is a walker algorithm, and `state` is a start state. The default +walker will simply visit all statements and expressions and not +produce a meaningful state. (An example of a use of state is to track +scope at each point in the tree.) + +```js +const acorn = require("acorn") +const walk = require("acorn-walk") + +walk.simple(acorn.parse("let x = 10"), { + Literal(node) { + console.log(`Found a literal: ${node.value}`) + } +}) +``` + +**ancestor**`(node, visitors, base, state)` does a 'simple' walk over +a tree, building up an array of ancestor nodes (including the current node) +and passing the array to the callbacks as a third parameter. + +```js +const acorn = require("acorn") +const walk = require("acorn-walk") + +walk.ancestor(acorn.parse("foo('hi')"), { + Literal(_, ancestors) { + console.log("This literal's ancestors are:", ancestors.map(n => n.type)) + } +}) +``` + +**recursive**`(node, state, functions, base)` does a 'recursive' +walk, where the walker functions are responsible for continuing the +walk on the child nodes of their target node. `state` is the start +state, and `functions` should contain an object that maps node types +to walker functions. Such functions are called with `(node, state, c)` +arguments, and can cause the walk to continue on a sub-node by calling +the `c` argument on it with `(node, state)` arguments. The optional +`base` argument provides the fallback walker functions for node types +that aren't handled in the `functions` object. If not given, the +default walkers will be used. + +**make**`(functions, base)` builds a new walker object by using the +walker functions in `functions` and filling in the missing ones by +taking defaults from `base`. + +**full**`(node, callback, base, state)` does a 'full' walk over a +tree, calling the callback with the arguments (node, state, type) for +each node + +**fullAncestor**`(node, callback, base, state)` does a 'full' walk +over a tree, building up an array of ancestor nodes (including the +current node) and passing the array to the callbacks as a third +parameter. + +```js +const acorn = require("acorn") +const walk = require("acorn-walk") + +walk.full(acorn.parse("1 + 1"), node => { + console.log(`There's a ${node.type} node at ${node.ch}`) +}) +``` + +**findNodeAt**`(node, start, end, test, base, state)` tries to locate +a node in a tree at the given start and/or end offsets, which +satisfies the predicate `test`. `start` and `end` can be either `null` +(as wildcard) or a number. `test` may be a string (indicating a node +type) or a function that takes `(nodeType, node)` arguments and +returns a boolean indicating whether this node is interesting. `base` +and `state` are optional, and can be used to specify a custom walker. +Nodes are tested from inner to outer, so if two nodes match the +boundaries, the inner one will be preferred. + +**findNodeAround**`(node, pos, test, base, state)` is a lot like +`findNodeAt`, but will match any node that exists 'around' (spanning) +the given position. + +**findNodeAfter**`(node, pos, test, base, state)` is similar to +`findNodeAround`, but will match all nodes *after* the given position +(testing outer nodes before inner nodes). diff --git a/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.d.ts b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.d.ts new file mode 100644 index 0000000..00cc005 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.d.ts @@ -0,0 +1,112 @@ +import {Node} from 'acorn'; + +declare module "acorn-walk" { + type FullWalkerCallback = ( + node: Node, + state: TState, + type: string + ) => void; + + type FullAncestorWalkerCallback = ( + node: Node, + state: TState | Node[], + ancestors: Node[], + type: string + ) => void; + type WalkerCallback = (node: Node, state: TState) => void; + + type SimpleWalkerFn = ( + node: Node, + state: TState + ) => void; + + type AncestorWalkerFn = ( + node: Node, + state: TState| Node[], + ancestors: Node[] + ) => void; + + type RecursiveWalkerFn = ( + node: Node, + state: TState, + callback: WalkerCallback + ) => void; + + type SimpleVisitors = { + [type: string]: SimpleWalkerFn + }; + + type AncestorVisitors = { + [type: string]: AncestorWalkerFn + }; + + type RecursiveVisitors = { + [type: string]: RecursiveWalkerFn + }; + + type FindPredicate = (type: string, node: Node) => boolean; + + interface Found { + node: Node, + state: TState + } + + export function simple( + node: Node, + visitors: SimpleVisitors, + base?: RecursiveVisitors, + state?: TState + ): void; + + export function ancestor( + node: Node, + visitors: AncestorVisitors, + base?: RecursiveVisitors, + state?: TState + ): void; + + export function recursive( + node: Node, + state: TState, + functions: RecursiveVisitors, + base?: RecursiveVisitors + ): void; + + export function full( + node: Node, + callback: FullWalkerCallback, + base?: RecursiveVisitors, + state?: TState + ): void; + + export function fullAncestor( + node: Node, + callback: FullAncestorWalkerCallback, + base?: RecursiveVisitors, + state?: TState + ): void; + + export function make( + functions: RecursiveVisitors, + base?: RecursiveVisitors + ): RecursiveVisitors; + + export function findNodeAt( + node: Node, + start: number | undefined, + end?: number | undefined, + type?: FindPredicate | string, + base?: RecursiveVisitors, + state?: TState + ): Found | undefined; + + export function findNodeAround( + node: Node, + start: number | undefined, + type?: FindPredicate | string, + base?: RecursiveVisitors, + state?: TState + ): Found | undefined; + + export const findNodeAfter: typeof findNodeAround; +} diff --git a/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.js b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.js new file mode 100644 index 0000000..17da67c --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.js @@ -0,0 +1,463 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory((global.acorn = global.acorn || {}, global.acorn.walk = {}))); +}(this, (function (exports) { 'use strict'; + + // AST walker module for Mozilla Parser API compatible trees + + // A simple walk is one where you simply specify callbacks to be + // called on specific nodes. The last two arguments are optional. A + // simple use would be + // + // walk.simple(myTree, { + // Expression: function(node) { ... } + // }); + // + // to do something with all expressions. All Parser API node types + // can be used to identify node types, as well as Expression and + // Statement, which denote categories of nodes. + // + // The base argument can be used to pass a custom (recursive) + // walker, and state can be used to give this walked an initial + // state. + + function simple(node, visitors, baseVisitor, state, override) { + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type, found = visitors[type]; + baseVisitor[type](node, st, c); + if (found) { found(node, st); } + })(node, state, override); + } + + // An ancestor walk keeps an array of ancestor nodes (including the + // current node) and passes them to the callback as third parameter + // (and also as state parameter when no other state is present). + function ancestor(node, visitors, baseVisitor, state, override) { + var ancestors = []; + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type, found = visitors[type]; + var isNew = node !== ancestors[ancestors.length - 1]; + if (isNew) { ancestors.push(node); } + baseVisitor[type](node, st, c); + if (found) { found(node, st || ancestors, ancestors); } + if (isNew) { ancestors.pop(); } + })(node, state, override); + } + + // A recursive walk is one where your functions override the default + // walkers. They can modify and replace the state parameter that's + // threaded through the walk, and can opt how and whether to walk + // their child nodes (by calling their third argument on these + // nodes). + function recursive(node, state, funcs, baseVisitor, override) { + var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor + ;(function c(node, st, override) { + visitor[override || node.type](node, st, c); + })(node, state, override); + } + + function makeTest(test) { + if (typeof test === "string") + { return function (type) { return type === test; } } + else if (!test) + { return function () { return true; } } + else + { return test } + } + + var Found = function Found(node, state) { this.node = node; this.state = state; }; + + // A full walk triggers the callback on each node + function full(node, callback, baseVisitor, state, override) { + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type; + baseVisitor[type](node, st, c); + if (!override) { callback(node, st, type); } + })(node, state, override); + } + + // An fullAncestor walk is like an ancestor walk, but triggers + // the callback on each node + function fullAncestor(node, callback, baseVisitor, state) { + if (!baseVisitor) { baseVisitor = base; } + var ancestors = [] + ;(function c(node, st, override) { + var type = override || node.type; + var isNew = node !== ancestors[ancestors.length - 1]; + if (isNew) { ancestors.push(node); } + baseVisitor[type](node, st, c); + if (!override) { callback(node, st || ancestors, ancestors, type); } + if (isNew) { ancestors.pop(); } + })(node, state); + } + + // Find a node with a given start, end, and type (all are optional, + // null can be used as wildcard). Returns a {node, state} object, or + // undefined when it doesn't find a matching node. + function findNodeAt(node, start, end, test, baseVisitor, state) { + if (!baseVisitor) { baseVisitor = base; } + test = makeTest(test); + try { + (function c(node, st, override) { + var type = override || node.type; + if ((start == null || node.start <= start) && + (end == null || node.end >= end)) + { baseVisitor[type](node, st, c); } + if ((start == null || node.start === start) && + (end == null || node.end === end) && + test(type, node)) + { throw new Found(node, st) } + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } + } + + // Find the innermost node of a given type that contains the given + // position. Interface similar to findNodeAt. + function findNodeAround(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + try { + (function c(node, st, override) { + var type = override || node.type; + if (node.start > pos || node.end < pos) { return } + baseVisitor[type](node, st, c); + if (test(type, node)) { throw new Found(node, st) } + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } + } + + // Find the outermost matching node after a given position. + function findNodeAfter(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + try { + (function c(node, st, override) { + if (node.end < pos) { return } + var type = override || node.type; + if (node.start >= pos && test(type, node)) { throw new Found(node, st) } + baseVisitor[type](node, st, c); + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } + } + + // Find the outermost matching node before a given position. + function findNodeBefore(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + var max + ;(function c(node, st, override) { + if (node.start > pos) { return } + var type = override || node.type; + if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node)) + { max = new Found(node, st); } + baseVisitor[type](node, st, c); + })(node, state); + return max + } + + // Fallback to an Object.create polyfill for older environments. + var create = Object.create || function(proto) { + function Ctor() {} + Ctor.prototype = proto; + return new Ctor + }; + + // Used to create a custom walker. Will fill in all missing node + // type properties with the defaults. + function make(funcs, baseVisitor) { + var visitor = create(baseVisitor || base); + for (var type in funcs) { visitor[type] = funcs[type]; } + return visitor + } + + function skipThrough(node, st, c) { c(node, st); } + function ignore(_node, _st, _c) {} + + // Node walkers. + + var base = {}; + + base.Program = base.BlockStatement = function (node, st, c) { + for (var i = 0, list = node.body; i < list.length; i += 1) + { + var stmt = list[i]; + + c(stmt, st, "Statement"); + } + }; + base.Statement = skipThrough; + base.EmptyStatement = ignore; + base.ExpressionStatement = base.ParenthesizedExpression = base.ChainExpression = + function (node, st, c) { return c(node.expression, st, "Expression"); }; + base.IfStatement = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.consequent, st, "Statement"); + if (node.alternate) { c(node.alternate, st, "Statement"); } + }; + base.LabeledStatement = function (node, st, c) { return c(node.body, st, "Statement"); }; + base.BreakStatement = base.ContinueStatement = ignore; + base.WithStatement = function (node, st, c) { + c(node.object, st, "Expression"); + c(node.body, st, "Statement"); + }; + base.SwitchStatement = function (node, st, c) { + c(node.discriminant, st, "Expression"); + for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) { + var cs = list$1[i$1]; + + if (cs.test) { c(cs.test, st, "Expression"); } + for (var i = 0, list = cs.consequent; i < list.length; i += 1) + { + var cons = list[i]; + + c(cons, st, "Statement"); + } + } + }; + base.SwitchCase = function (node, st, c) { + if (node.test) { c(node.test, st, "Expression"); } + for (var i = 0, list = node.consequent; i < list.length; i += 1) + { + var cons = list[i]; + + c(cons, st, "Statement"); + } + }; + base.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) { + if (node.argument) { c(node.argument, st, "Expression"); } + }; + base.ThrowStatement = base.SpreadElement = + function (node, st, c) { return c(node.argument, st, "Expression"); }; + base.TryStatement = function (node, st, c) { + c(node.block, st, "Statement"); + if (node.handler) { c(node.handler, st); } + if (node.finalizer) { c(node.finalizer, st, "Statement"); } + }; + base.CatchClause = function (node, st, c) { + if (node.param) { c(node.param, st, "Pattern"); } + c(node.body, st, "Statement"); + }; + base.WhileStatement = base.DoWhileStatement = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.body, st, "Statement"); + }; + base.ForStatement = function (node, st, c) { + if (node.init) { c(node.init, st, "ForInit"); } + if (node.test) { c(node.test, st, "Expression"); } + if (node.update) { c(node.update, st, "Expression"); } + c(node.body, st, "Statement"); + }; + base.ForInStatement = base.ForOfStatement = function (node, st, c) { + c(node.left, st, "ForInit"); + c(node.right, st, "Expression"); + c(node.body, st, "Statement"); + }; + base.ForInit = function (node, st, c) { + if (node.type === "VariableDeclaration") { c(node, st); } + else { c(node, st, "Expression"); } + }; + base.DebuggerStatement = ignore; + + base.FunctionDeclaration = function (node, st, c) { return c(node, st, "Function"); }; + base.VariableDeclaration = function (node, st, c) { + for (var i = 0, list = node.declarations; i < list.length; i += 1) + { + var decl = list[i]; + + c(decl, st); + } + }; + base.VariableDeclarator = function (node, st, c) { + c(node.id, st, "Pattern"); + if (node.init) { c(node.init, st, "Expression"); } + }; + + base.Function = function (node, st, c) { + if (node.id) { c(node.id, st, "Pattern"); } + for (var i = 0, list = node.params; i < list.length; i += 1) + { + var param = list[i]; + + c(param, st, "Pattern"); + } + c(node.body, st, node.expression ? "Expression" : "Statement"); + }; + + base.Pattern = function (node, st, c) { + if (node.type === "Identifier") + { c(node, st, "VariablePattern"); } + else if (node.type === "MemberExpression") + { c(node, st, "MemberPattern"); } + else + { c(node, st); } + }; + base.VariablePattern = ignore; + base.MemberPattern = skipThrough; + base.RestElement = function (node, st, c) { return c(node.argument, st, "Pattern"); }; + base.ArrayPattern = function (node, st, c) { + for (var i = 0, list = node.elements; i < list.length; i += 1) { + var elt = list[i]; + + if (elt) { c(elt, st, "Pattern"); } + } + }; + base.ObjectPattern = function (node, st, c) { + for (var i = 0, list = node.properties; i < list.length; i += 1) { + var prop = list[i]; + + if (prop.type === "Property") { + if (prop.computed) { c(prop.key, st, "Expression"); } + c(prop.value, st, "Pattern"); + } else if (prop.type === "RestElement") { + c(prop.argument, st, "Pattern"); + } + } + }; + + base.Expression = skipThrough; + base.ThisExpression = base.Super = base.MetaProperty = ignore; + base.ArrayExpression = function (node, st, c) { + for (var i = 0, list = node.elements; i < list.length; i += 1) { + var elt = list[i]; + + if (elt) { c(elt, st, "Expression"); } + } + }; + base.ObjectExpression = function (node, st, c) { + for (var i = 0, list = node.properties; i < list.length; i += 1) + { + var prop = list[i]; + + c(prop, st); + } + }; + base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration; + base.SequenceExpression = function (node, st, c) { + for (var i = 0, list = node.expressions; i < list.length; i += 1) + { + var expr = list[i]; + + c(expr, st, "Expression"); + } + }; + base.TemplateLiteral = function (node, st, c) { + for (var i = 0, list = node.quasis; i < list.length; i += 1) + { + var quasi = list[i]; + + c(quasi, st); + } + + for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1) + { + var expr = list$1[i$1]; + + c(expr, st, "Expression"); + } + }; + base.TemplateElement = ignore; + base.UnaryExpression = base.UpdateExpression = function (node, st, c) { + c(node.argument, st, "Expression"); + }; + base.BinaryExpression = base.LogicalExpression = function (node, st, c) { + c(node.left, st, "Expression"); + c(node.right, st, "Expression"); + }; + base.AssignmentExpression = base.AssignmentPattern = function (node, st, c) { + c(node.left, st, "Pattern"); + c(node.right, st, "Expression"); + }; + base.ConditionalExpression = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.consequent, st, "Expression"); + c(node.alternate, st, "Expression"); + }; + base.NewExpression = base.CallExpression = function (node, st, c) { + c(node.callee, st, "Expression"); + if (node.arguments) + { for (var i = 0, list = node.arguments; i < list.length; i += 1) + { + var arg = list[i]; + + c(arg, st, "Expression"); + } } + }; + base.MemberExpression = function (node, st, c) { + c(node.object, st, "Expression"); + if (node.computed) { c(node.property, st, "Expression"); } + }; + base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) { + if (node.declaration) + { c(node.declaration, st, node.type === "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression"); } + if (node.source) { c(node.source, st, "Expression"); } + }; + base.ExportAllDeclaration = function (node, st, c) { + if (node.exported) + { c(node.exported, st); } + c(node.source, st, "Expression"); + }; + base.ImportDeclaration = function (node, st, c) { + for (var i = 0, list = node.specifiers; i < list.length; i += 1) + { + var spec = list[i]; + + c(spec, st); + } + c(node.source, st, "Expression"); + }; + base.ImportExpression = function (node, st, c) { + c(node.source, st, "Expression"); + }; + base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore; + + base.TaggedTemplateExpression = function (node, st, c) { + c(node.tag, st, "Expression"); + c(node.quasi, st, "Expression"); + }; + base.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, "Class"); }; + base.Class = function (node, st, c) { + if (node.id) { c(node.id, st, "Pattern"); } + if (node.superClass) { c(node.superClass, st, "Expression"); } + c(node.body, st); + }; + base.ClassBody = function (node, st, c) { + for (var i = 0, list = node.body; i < list.length; i += 1) + { + var elt = list[i]; + + c(elt, st); + } + }; + base.MethodDefinition = base.Property = function (node, st, c) { + if (node.computed) { c(node.key, st, "Expression"); } + c(node.value, st, "Expression"); + }; + + exports.ancestor = ancestor; + exports.base = base; + exports.findNodeAfter = findNodeAfter; + exports.findNodeAround = findNodeAround; + exports.findNodeAt = findNodeAt; + exports.findNodeBefore = findNodeBefore; + exports.full = full; + exports.fullAncestor = fullAncestor; + exports.make = make; + exports.recursive = recursive; + exports.simple = simple; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.js.map b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.js.map new file mode 100644 index 0000000..5590a29 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"walk.js","sources":["../src/index.js"],"sourcesContent":["// AST walker module for Mozilla Parser API compatible trees\n\n// A simple walk is one where you simply specify callbacks to be\n// called on specific nodes. The last two arguments are optional. A\n// simple use would be\n//\n// walk.simple(myTree, {\n// Expression: function(node) { ... }\n// });\n//\n// to do something with all expressions. All Parser API node types\n// can be used to identify node types, as well as Expression and\n// Statement, which denote categories of nodes.\n//\n// The base argument can be used to pass a custom (recursive)\n// walker, and state can be used to give this walked an initial\n// state.\n\nexport function simple(node, visitors, baseVisitor, state, override) {\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type, found = visitors[type]\n baseVisitor[type](node, st, c)\n if (found) found(node, st)\n })(node, state, override)\n}\n\n// An ancestor walk keeps an array of ancestor nodes (including the\n// current node) and passes them to the callback as third parameter\n// (and also as state parameter when no other state is present).\nexport function ancestor(node, visitors, baseVisitor, state) {\n let ancestors = []\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type, found = visitors[type]\n let isNew = node !== ancestors[ancestors.length - 1]\n if (isNew) ancestors.push(node)\n baseVisitor[type](node, st, c)\n if (found) found(node, st || ancestors, ancestors)\n if (isNew) ancestors.pop()\n })(node, state)\n}\n\n// A recursive walk is one where your functions override the default\n// walkers. They can modify and replace the state parameter that's\n// threaded through the walk, and can opt how and whether to walk\n// their child nodes (by calling their third argument on these\n// nodes).\nexport function recursive(node, state, funcs, baseVisitor, override) {\n let visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor\n ;(function c(node, st, override) {\n visitor[override || node.type](node, st, c)\n })(node, state, override)\n}\n\nfunction makeTest(test) {\n if (typeof test === \"string\")\n return type => type === test\n else if (!test)\n return () => true\n else\n return test\n}\n\nclass Found {\n constructor(node, state) { this.node = node; this.state = state }\n}\n\n// A full walk triggers the callback on each node\nexport function full(node, callback, baseVisitor, state, override) {\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type\n baseVisitor[type](node, st, c)\n if (!override) callback(node, st, type)\n })(node, state, override)\n}\n\n// An fullAncestor walk is like an ancestor walk, but triggers\n// the callback on each node\nexport function fullAncestor(node, callback, baseVisitor, state) {\n if (!baseVisitor) baseVisitor = base\n let ancestors = []\n ;(function c(node, st, override) {\n let type = override || node.type\n let isNew = node !== ancestors[ancestors.length - 1]\n if (isNew) ancestors.push(node)\n baseVisitor[type](node, st, c)\n if (!override) callback(node, st || ancestors, ancestors, type)\n if (isNew) ancestors.pop()\n })(node, state)\n}\n\n// Find a node with a given start, end, and type (all are optional,\n// null can be used as wildcard). Returns a {node, state} object, or\n// undefined when it doesn't find a matching node.\nexport function findNodeAt(node, start, end, test, baseVisitor, state) {\n if (!baseVisitor) baseVisitor = base\n test = makeTest(test)\n try {\n (function c(node, st, override) {\n let type = override || node.type\n if ((start == null || node.start <= start) &&\n (end == null || node.end >= end))\n baseVisitor[type](node, st, c)\n if ((start == null || node.start === start) &&\n (end == null || node.end === end) &&\n test(type, node))\n throw new Found(node, st)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the innermost node of a given type that contains the given\n// position. Interface similar to findNodeAt.\nexport function findNodeAround(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n try {\n (function c(node, st, override) {\n let type = override || node.type\n if (node.start > pos || node.end < pos) return\n baseVisitor[type](node, st, c)\n if (test(type, node)) throw new Found(node, st)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the outermost matching node after a given position.\nexport function findNodeAfter(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n try {\n (function c(node, st, override) {\n if (node.end < pos) return\n let type = override || node.type\n if (node.start >= pos && test(type, node)) throw new Found(node, st)\n baseVisitor[type](node, st, c)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the outermost matching node before a given position.\nexport function findNodeBefore(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n let max\n ;(function c(node, st, override) {\n if (node.start > pos) return\n let type = override || node.type\n if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node))\n max = new Found(node, st)\n baseVisitor[type](node, st, c)\n })(node, state)\n return max\n}\n\n// Fallback to an Object.create polyfill for older environments.\nconst create = Object.create || function(proto) {\n function Ctor() {}\n Ctor.prototype = proto\n return new Ctor\n}\n\n// Used to create a custom walker. Will fill in all missing node\n// type properties with the defaults.\nexport function make(funcs, baseVisitor) {\n let visitor = create(baseVisitor || base)\n for (let type in funcs) visitor[type] = funcs[type]\n return visitor\n}\n\nfunction skipThrough(node, st, c) { c(node, st) }\nfunction ignore(_node, _st, _c) {}\n\n// Node walkers.\n\nexport const base = {}\n\nbase.Program = base.BlockStatement = (node, st, c) => {\n for (let stmt of node.body)\n c(stmt, st, \"Statement\")\n}\nbase.Statement = skipThrough\nbase.EmptyStatement = ignore\nbase.ExpressionStatement = base.ParenthesizedExpression =\n (node, st, c) => c(node.expression, st, \"Expression\")\nbase.IfStatement = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.consequent, st, \"Statement\")\n if (node.alternate) c(node.alternate, st, \"Statement\")\n}\nbase.LabeledStatement = (node, st, c) => c(node.body, st, \"Statement\")\nbase.BreakStatement = base.ContinueStatement = ignore\nbase.WithStatement = (node, st, c) => {\n c(node.object, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.SwitchStatement = (node, st, c) => {\n c(node.discriminant, st, \"Expression\")\n for (let cs of node.cases) {\n if (cs.test) c(cs.test, st, \"Expression\")\n for (let cons of cs.consequent)\n c(cons, st, \"Statement\")\n }\n}\nbase.SwitchCase = (node, st, c) => {\n if (node.test) c(node.test, st, \"Expression\")\n for (let cons of node.consequent)\n c(cons, st, \"Statement\")\n}\nbase.ReturnStatement = base.YieldExpression = base.AwaitExpression = (node, st, c) => {\n if (node.argument) c(node.argument, st, \"Expression\")\n}\nbase.ThrowStatement = base.SpreadElement =\n (node, st, c) => c(node.argument, st, \"Expression\")\nbase.TryStatement = (node, st, c) => {\n c(node.block, st, \"Statement\")\n if (node.handler) c(node.handler, st)\n if (node.finalizer) c(node.finalizer, st, \"Statement\")\n}\nbase.CatchClause = (node, st, c) => {\n if (node.param) c(node.param, st, \"Pattern\")\n c(node.body, st, \"Statement\")\n}\nbase.WhileStatement = base.DoWhileStatement = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForStatement = (node, st, c) => {\n if (node.init) c(node.init, st, \"ForInit\")\n if (node.test) c(node.test, st, \"Expression\")\n if (node.update) c(node.update, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForInStatement = base.ForOfStatement = (node, st, c) => {\n c(node.left, st, \"ForInit\")\n c(node.right, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForInit = (node, st, c) => {\n if (node.type === \"VariableDeclaration\") c(node, st)\n else c(node, st, \"Expression\")\n}\nbase.DebuggerStatement = ignore\n\nbase.FunctionDeclaration = (node, st, c) => c(node, st, \"Function\")\nbase.VariableDeclaration = (node, st, c) => {\n for (let decl of node.declarations)\n c(decl, st)\n}\nbase.VariableDeclarator = (node, st, c) => {\n c(node.id, st, \"Pattern\")\n if (node.init) c(node.init, st, \"Expression\")\n}\n\nbase.Function = (node, st, c) => {\n if (node.id) c(node.id, st, \"Pattern\")\n for (let param of node.params)\n c(param, st, \"Pattern\")\n c(node.body, st, node.expression ? \"Expression\" : \"Statement\")\n}\n\nbase.Pattern = (node, st, c) => {\n if (node.type === \"Identifier\")\n c(node, st, \"VariablePattern\")\n else if (node.type === \"MemberExpression\")\n c(node, st, \"MemberPattern\")\n else\n c(node, st)\n}\nbase.VariablePattern = ignore\nbase.MemberPattern = skipThrough\nbase.RestElement = (node, st, c) => c(node.argument, st, \"Pattern\")\nbase.ArrayPattern = (node, st, c) => {\n for (let elt of node.elements) {\n if (elt) c(elt, st, \"Pattern\")\n }\n}\nbase.ObjectPattern = (node, st, c) => {\n for (let prop of node.properties) {\n if (prop.type === \"Property\") {\n if (prop.computed) c(prop.key, st, \"Expression\")\n c(prop.value, st, \"Pattern\")\n } else if (prop.type === \"RestElement\") {\n c(prop.argument, st, \"Pattern\")\n }\n }\n}\n\nbase.Expression = skipThrough\nbase.ThisExpression = base.Super = base.MetaProperty = ignore\nbase.ArrayExpression = (node, st, c) => {\n for (let elt of node.elements) {\n if (elt) c(elt, st, \"Expression\")\n }\n}\nbase.ObjectExpression = (node, st, c) => {\n for (let prop of node.properties)\n c(prop, st)\n}\nbase.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration\nbase.SequenceExpression = (node, st, c) => {\n for (let expr of node.expressions)\n c(expr, st, \"Expression\")\n}\nbase.TemplateLiteral = (node, st, c) => {\n for (let quasi of node.quasis)\n c(quasi, st)\n\n for (let expr of node.expressions)\n c(expr, st, \"Expression\")\n}\nbase.TemplateElement = ignore\nbase.UnaryExpression = base.UpdateExpression = (node, st, c) => {\n c(node.argument, st, \"Expression\")\n}\nbase.BinaryExpression = base.LogicalExpression = (node, st, c) => {\n c(node.left, st, \"Expression\")\n c(node.right, st, \"Expression\")\n}\nbase.AssignmentExpression = base.AssignmentPattern = (node, st, c) => {\n c(node.left, st, \"Pattern\")\n c(node.right, st, \"Expression\")\n}\nbase.ConditionalExpression = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.consequent, st, \"Expression\")\n c(node.alternate, st, \"Expression\")\n}\nbase.NewExpression = base.CallExpression = (node, st, c) => {\n c(node.callee, st, \"Expression\")\n if (node.arguments)\n for (let arg of node.arguments)\n c(arg, st, \"Expression\")\n}\nbase.MemberExpression = (node, st, c) => {\n c(node.object, st, \"Expression\")\n if (node.computed) c(node.property, st, \"Expression\")\n}\nbase.ExportNamedDeclaration = base.ExportDefaultDeclaration = (node, st, c) => {\n if (node.declaration)\n c(node.declaration, st, node.type === \"ExportNamedDeclaration\" || node.declaration.id ? \"Statement\" : \"Expression\")\n if (node.source) c(node.source, st, \"Expression\")\n}\nbase.ExportAllDeclaration = (node, st, c) => {\n c(node.source, st, \"Expression\")\n}\nbase.ImportDeclaration = (node, st, c) => {\n for (let spec of node.specifiers)\n c(spec, st)\n c(node.source, st, \"Expression\")\n}\nbase.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore\n\nbase.TaggedTemplateExpression = (node, st, c) => {\n c(node.tag, st, \"Expression\")\n c(node.quasi, st, \"Expression\")\n}\nbase.ClassDeclaration = base.ClassExpression = (node, st, c) => c(node, st, \"Class\")\nbase.Class = (node, st, c) => {\n if (node.id) c(node.id, st, \"Pattern\")\n if (node.superClass) c(node.superClass, st, \"Expression\")\n c(node.body, st)\n}\nbase.ClassBody = (node, st, c) => {\n for (let elt of node.body)\n c(elt, st)\n}\nbase.MethodDefinition = base.Property = (node, st, c) => {\n if (node.computed) c(node.key, st, \"Expression\")\n c(node.value, st, \"Expression\")\n}\n"],"names":["let","const"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.mjs b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.mjs new file mode 100644 index 0000000..a7fcec8 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.mjs @@ -0,0 +1,443 @@ +// AST walker module for Mozilla Parser API compatible trees + +// A simple walk is one where you simply specify callbacks to be +// called on specific nodes. The last two arguments are optional. A +// simple use would be +// +// walk.simple(myTree, { +// Expression: function(node) { ... } +// }); +// +// to do something with all expressions. All Parser API node types +// can be used to identify node types, as well as Expression and +// Statement, which denote categories of nodes. +// +// The base argument can be used to pass a custom (recursive) +// walker, and state can be used to give this walked an initial +// state. + +function simple(node, visitors, baseVisitor, state, override) { + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type, found = visitors[type]; + baseVisitor[type](node, st, c); + if (found) { found(node, st); } + })(node, state, override); +} + +// An ancestor walk keeps an array of ancestor nodes (including the +// current node) and passes them to the callback as third parameter +// (and also as state parameter when no other state is present). +function ancestor(node, visitors, baseVisitor, state, override) { + var ancestors = []; + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type, found = visitors[type]; + var isNew = node !== ancestors[ancestors.length - 1]; + if (isNew) { ancestors.push(node); } + baseVisitor[type](node, st, c); + if (found) { found(node, st || ancestors, ancestors); } + if (isNew) { ancestors.pop(); } + })(node, state, override); +} + +// A recursive walk is one where your functions override the default +// walkers. They can modify and replace the state parameter that's +// threaded through the walk, and can opt how and whether to walk +// their child nodes (by calling their third argument on these +// nodes). +function recursive(node, state, funcs, baseVisitor, override) { + var visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor + ;(function c(node, st, override) { + visitor[override || node.type](node, st, c); + })(node, state, override); +} + +function makeTest(test) { + if (typeof test === "string") + { return function (type) { return type === test; } } + else if (!test) + { return function () { return true; } } + else + { return test } +} + +var Found = function Found(node, state) { this.node = node; this.state = state; }; + +// A full walk triggers the callback on each node +function full(node, callback, baseVisitor, state, override) { + if (!baseVisitor) { baseVisitor = base + ; }(function c(node, st, override) { + var type = override || node.type; + baseVisitor[type](node, st, c); + if (!override) { callback(node, st, type); } + })(node, state, override); +} + +// An fullAncestor walk is like an ancestor walk, but triggers +// the callback on each node +function fullAncestor(node, callback, baseVisitor, state) { + if (!baseVisitor) { baseVisitor = base; } + var ancestors = [] + ;(function c(node, st, override) { + var type = override || node.type; + var isNew = node !== ancestors[ancestors.length - 1]; + if (isNew) { ancestors.push(node); } + baseVisitor[type](node, st, c); + if (!override) { callback(node, st || ancestors, ancestors, type); } + if (isNew) { ancestors.pop(); } + })(node, state); +} + +// Find a node with a given start, end, and type (all are optional, +// null can be used as wildcard). Returns a {node, state} object, or +// undefined when it doesn't find a matching node. +function findNodeAt(node, start, end, test, baseVisitor, state) { + if (!baseVisitor) { baseVisitor = base; } + test = makeTest(test); + try { + (function c(node, st, override) { + var type = override || node.type; + if ((start == null || node.start <= start) && + (end == null || node.end >= end)) + { baseVisitor[type](node, st, c); } + if ((start == null || node.start === start) && + (end == null || node.end === end) && + test(type, node)) + { throw new Found(node, st) } + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } +} + +// Find the innermost node of a given type that contains the given +// position. Interface similar to findNodeAt. +function findNodeAround(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + try { + (function c(node, st, override) { + var type = override || node.type; + if (node.start > pos || node.end < pos) { return } + baseVisitor[type](node, st, c); + if (test(type, node)) { throw new Found(node, st) } + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } +} + +// Find the outermost matching node after a given position. +function findNodeAfter(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + try { + (function c(node, st, override) { + if (node.end < pos) { return } + var type = override || node.type; + if (node.start >= pos && test(type, node)) { throw new Found(node, st) } + baseVisitor[type](node, st, c); + })(node, state); + } catch (e) { + if (e instanceof Found) { return e } + throw e + } +} + +// Find the outermost matching node before a given position. +function findNodeBefore(node, pos, test, baseVisitor, state) { + test = makeTest(test); + if (!baseVisitor) { baseVisitor = base; } + var max + ;(function c(node, st, override) { + if (node.start > pos) { return } + var type = override || node.type; + if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node)) + { max = new Found(node, st); } + baseVisitor[type](node, st, c); + })(node, state); + return max +} + +// Fallback to an Object.create polyfill for older environments. +var create = Object.create || function(proto) { + function Ctor() {} + Ctor.prototype = proto; + return new Ctor +}; + +// Used to create a custom walker. Will fill in all missing node +// type properties with the defaults. +function make(funcs, baseVisitor) { + var visitor = create(baseVisitor || base); + for (var type in funcs) { visitor[type] = funcs[type]; } + return visitor +} + +function skipThrough(node, st, c) { c(node, st); } +function ignore(_node, _st, _c) {} + +// Node walkers. + +var base = {}; + +base.Program = base.BlockStatement = function (node, st, c) { + for (var i = 0, list = node.body; i < list.length; i += 1) + { + var stmt = list[i]; + + c(stmt, st, "Statement"); + } +}; +base.Statement = skipThrough; +base.EmptyStatement = ignore; +base.ExpressionStatement = base.ParenthesizedExpression = base.ChainExpression = + function (node, st, c) { return c(node.expression, st, "Expression"); }; +base.IfStatement = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.consequent, st, "Statement"); + if (node.alternate) { c(node.alternate, st, "Statement"); } +}; +base.LabeledStatement = function (node, st, c) { return c(node.body, st, "Statement"); }; +base.BreakStatement = base.ContinueStatement = ignore; +base.WithStatement = function (node, st, c) { + c(node.object, st, "Expression"); + c(node.body, st, "Statement"); +}; +base.SwitchStatement = function (node, st, c) { + c(node.discriminant, st, "Expression"); + for (var i$1 = 0, list$1 = node.cases; i$1 < list$1.length; i$1 += 1) { + var cs = list$1[i$1]; + + if (cs.test) { c(cs.test, st, "Expression"); } + for (var i = 0, list = cs.consequent; i < list.length; i += 1) + { + var cons = list[i]; + + c(cons, st, "Statement"); + } + } +}; +base.SwitchCase = function (node, st, c) { + if (node.test) { c(node.test, st, "Expression"); } + for (var i = 0, list = node.consequent; i < list.length; i += 1) + { + var cons = list[i]; + + c(cons, st, "Statement"); + } +}; +base.ReturnStatement = base.YieldExpression = base.AwaitExpression = function (node, st, c) { + if (node.argument) { c(node.argument, st, "Expression"); } +}; +base.ThrowStatement = base.SpreadElement = + function (node, st, c) { return c(node.argument, st, "Expression"); }; +base.TryStatement = function (node, st, c) { + c(node.block, st, "Statement"); + if (node.handler) { c(node.handler, st); } + if (node.finalizer) { c(node.finalizer, st, "Statement"); } +}; +base.CatchClause = function (node, st, c) { + if (node.param) { c(node.param, st, "Pattern"); } + c(node.body, st, "Statement"); +}; +base.WhileStatement = base.DoWhileStatement = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.body, st, "Statement"); +}; +base.ForStatement = function (node, st, c) { + if (node.init) { c(node.init, st, "ForInit"); } + if (node.test) { c(node.test, st, "Expression"); } + if (node.update) { c(node.update, st, "Expression"); } + c(node.body, st, "Statement"); +}; +base.ForInStatement = base.ForOfStatement = function (node, st, c) { + c(node.left, st, "ForInit"); + c(node.right, st, "Expression"); + c(node.body, st, "Statement"); +}; +base.ForInit = function (node, st, c) { + if (node.type === "VariableDeclaration") { c(node, st); } + else { c(node, st, "Expression"); } +}; +base.DebuggerStatement = ignore; + +base.FunctionDeclaration = function (node, st, c) { return c(node, st, "Function"); }; +base.VariableDeclaration = function (node, st, c) { + for (var i = 0, list = node.declarations; i < list.length; i += 1) + { + var decl = list[i]; + + c(decl, st); + } +}; +base.VariableDeclarator = function (node, st, c) { + c(node.id, st, "Pattern"); + if (node.init) { c(node.init, st, "Expression"); } +}; + +base.Function = function (node, st, c) { + if (node.id) { c(node.id, st, "Pattern"); } + for (var i = 0, list = node.params; i < list.length; i += 1) + { + var param = list[i]; + + c(param, st, "Pattern"); + } + c(node.body, st, node.expression ? "Expression" : "Statement"); +}; + +base.Pattern = function (node, st, c) { + if (node.type === "Identifier") + { c(node, st, "VariablePattern"); } + else if (node.type === "MemberExpression") + { c(node, st, "MemberPattern"); } + else + { c(node, st); } +}; +base.VariablePattern = ignore; +base.MemberPattern = skipThrough; +base.RestElement = function (node, st, c) { return c(node.argument, st, "Pattern"); }; +base.ArrayPattern = function (node, st, c) { + for (var i = 0, list = node.elements; i < list.length; i += 1) { + var elt = list[i]; + + if (elt) { c(elt, st, "Pattern"); } + } +}; +base.ObjectPattern = function (node, st, c) { + for (var i = 0, list = node.properties; i < list.length; i += 1) { + var prop = list[i]; + + if (prop.type === "Property") { + if (prop.computed) { c(prop.key, st, "Expression"); } + c(prop.value, st, "Pattern"); + } else if (prop.type === "RestElement") { + c(prop.argument, st, "Pattern"); + } + } +}; + +base.Expression = skipThrough; +base.ThisExpression = base.Super = base.MetaProperty = ignore; +base.ArrayExpression = function (node, st, c) { + for (var i = 0, list = node.elements; i < list.length; i += 1) { + var elt = list[i]; + + if (elt) { c(elt, st, "Expression"); } + } +}; +base.ObjectExpression = function (node, st, c) { + for (var i = 0, list = node.properties; i < list.length; i += 1) + { + var prop = list[i]; + + c(prop, st); + } +}; +base.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration; +base.SequenceExpression = function (node, st, c) { + for (var i = 0, list = node.expressions; i < list.length; i += 1) + { + var expr = list[i]; + + c(expr, st, "Expression"); + } +}; +base.TemplateLiteral = function (node, st, c) { + for (var i = 0, list = node.quasis; i < list.length; i += 1) + { + var quasi = list[i]; + + c(quasi, st); + } + + for (var i$1 = 0, list$1 = node.expressions; i$1 < list$1.length; i$1 += 1) + { + var expr = list$1[i$1]; + + c(expr, st, "Expression"); + } +}; +base.TemplateElement = ignore; +base.UnaryExpression = base.UpdateExpression = function (node, st, c) { + c(node.argument, st, "Expression"); +}; +base.BinaryExpression = base.LogicalExpression = function (node, st, c) { + c(node.left, st, "Expression"); + c(node.right, st, "Expression"); +}; +base.AssignmentExpression = base.AssignmentPattern = function (node, st, c) { + c(node.left, st, "Pattern"); + c(node.right, st, "Expression"); +}; +base.ConditionalExpression = function (node, st, c) { + c(node.test, st, "Expression"); + c(node.consequent, st, "Expression"); + c(node.alternate, st, "Expression"); +}; +base.NewExpression = base.CallExpression = function (node, st, c) { + c(node.callee, st, "Expression"); + if (node.arguments) + { for (var i = 0, list = node.arguments; i < list.length; i += 1) + { + var arg = list[i]; + + c(arg, st, "Expression"); + } } +}; +base.MemberExpression = function (node, st, c) { + c(node.object, st, "Expression"); + if (node.computed) { c(node.property, st, "Expression"); } +}; +base.ExportNamedDeclaration = base.ExportDefaultDeclaration = function (node, st, c) { + if (node.declaration) + { c(node.declaration, st, node.type === "ExportNamedDeclaration" || node.declaration.id ? "Statement" : "Expression"); } + if (node.source) { c(node.source, st, "Expression"); } +}; +base.ExportAllDeclaration = function (node, st, c) { + if (node.exported) + { c(node.exported, st); } + c(node.source, st, "Expression"); +}; +base.ImportDeclaration = function (node, st, c) { + for (var i = 0, list = node.specifiers; i < list.length; i += 1) + { + var spec = list[i]; + + c(spec, st); + } + c(node.source, st, "Expression"); +}; +base.ImportExpression = function (node, st, c) { + c(node.source, st, "Expression"); +}; +base.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore; + +base.TaggedTemplateExpression = function (node, st, c) { + c(node.tag, st, "Expression"); + c(node.quasi, st, "Expression"); +}; +base.ClassDeclaration = base.ClassExpression = function (node, st, c) { return c(node, st, "Class"); }; +base.Class = function (node, st, c) { + if (node.id) { c(node.id, st, "Pattern"); } + if (node.superClass) { c(node.superClass, st, "Expression"); } + c(node.body, st); +}; +base.ClassBody = function (node, st, c) { + for (var i = 0, list = node.body; i < list.length; i += 1) + { + var elt = list[i]; + + c(elt, st); + } +}; +base.MethodDefinition = base.Property = function (node, st, c) { + if (node.computed) { c(node.key, st, "Expression"); } + c(node.value, st, "Expression"); +}; + +export { ancestor, base, findNodeAfter, findNodeAround, findNodeAt, findNodeBefore, full, fullAncestor, make, recursive, simple }; diff --git a/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.mjs.map b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.mjs.map new file mode 100644 index 0000000..2a94219 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn-walk/dist/walk.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"walk.mjs","sources":["../src/index.js"],"sourcesContent":["// AST walker module for Mozilla Parser API compatible trees\n\n// A simple walk is one where you simply specify callbacks to be\n// called on specific nodes. The last two arguments are optional. A\n// simple use would be\n//\n// walk.simple(myTree, {\n// Expression: function(node) { ... }\n// });\n//\n// to do something with all expressions. All Parser API node types\n// can be used to identify node types, as well as Expression and\n// Statement, which denote categories of nodes.\n//\n// The base argument can be used to pass a custom (recursive)\n// walker, and state can be used to give this walked an initial\n// state.\n\nexport function simple(node, visitors, baseVisitor, state, override) {\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type, found = visitors[type]\n baseVisitor[type](node, st, c)\n if (found) found(node, st)\n })(node, state, override)\n}\n\n// An ancestor walk keeps an array of ancestor nodes (including the\n// current node) and passes them to the callback as third parameter\n// (and also as state parameter when no other state is present).\nexport function ancestor(node, visitors, baseVisitor, state) {\n let ancestors = []\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type, found = visitors[type]\n let isNew = node !== ancestors[ancestors.length - 1]\n if (isNew) ancestors.push(node)\n baseVisitor[type](node, st, c)\n if (found) found(node, st || ancestors, ancestors)\n if (isNew) ancestors.pop()\n })(node, state)\n}\n\n// A recursive walk is one where your functions override the default\n// walkers. They can modify and replace the state parameter that's\n// threaded through the walk, and can opt how and whether to walk\n// their child nodes (by calling their third argument on these\n// nodes).\nexport function recursive(node, state, funcs, baseVisitor, override) {\n let visitor = funcs ? make(funcs, baseVisitor || undefined) : baseVisitor\n ;(function c(node, st, override) {\n visitor[override || node.type](node, st, c)\n })(node, state, override)\n}\n\nfunction makeTest(test) {\n if (typeof test === \"string\")\n return type => type === test\n else if (!test)\n return () => true\n else\n return test\n}\n\nclass Found {\n constructor(node, state) { this.node = node; this.state = state }\n}\n\n// A full walk triggers the callback on each node\nexport function full(node, callback, baseVisitor, state, override) {\n if (!baseVisitor) baseVisitor = base\n ;(function c(node, st, override) {\n let type = override || node.type\n baseVisitor[type](node, st, c)\n if (!override) callback(node, st, type)\n })(node, state, override)\n}\n\n// An fullAncestor walk is like an ancestor walk, but triggers\n// the callback on each node\nexport function fullAncestor(node, callback, baseVisitor, state) {\n if (!baseVisitor) baseVisitor = base\n let ancestors = []\n ;(function c(node, st, override) {\n let type = override || node.type\n let isNew = node !== ancestors[ancestors.length - 1]\n if (isNew) ancestors.push(node)\n baseVisitor[type](node, st, c)\n if (!override) callback(node, st || ancestors, ancestors, type)\n if (isNew) ancestors.pop()\n })(node, state)\n}\n\n// Find a node with a given start, end, and type (all are optional,\n// null can be used as wildcard). Returns a {node, state} object, or\n// undefined when it doesn't find a matching node.\nexport function findNodeAt(node, start, end, test, baseVisitor, state) {\n if (!baseVisitor) baseVisitor = base\n test = makeTest(test)\n try {\n (function c(node, st, override) {\n let type = override || node.type\n if ((start == null || node.start <= start) &&\n (end == null || node.end >= end))\n baseVisitor[type](node, st, c)\n if ((start == null || node.start === start) &&\n (end == null || node.end === end) &&\n test(type, node))\n throw new Found(node, st)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the innermost node of a given type that contains the given\n// position. Interface similar to findNodeAt.\nexport function findNodeAround(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n try {\n (function c(node, st, override) {\n let type = override || node.type\n if (node.start > pos || node.end < pos) return\n baseVisitor[type](node, st, c)\n if (test(type, node)) throw new Found(node, st)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the outermost matching node after a given position.\nexport function findNodeAfter(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n try {\n (function c(node, st, override) {\n if (node.end < pos) return\n let type = override || node.type\n if (node.start >= pos && test(type, node)) throw new Found(node, st)\n baseVisitor[type](node, st, c)\n })(node, state)\n } catch (e) {\n if (e instanceof Found) return e\n throw e\n }\n}\n\n// Find the outermost matching node before a given position.\nexport function findNodeBefore(node, pos, test, baseVisitor, state) {\n test = makeTest(test)\n if (!baseVisitor) baseVisitor = base\n let max\n ;(function c(node, st, override) {\n if (node.start > pos) return\n let type = override || node.type\n if (node.end <= pos && (!max || max.node.end < node.end) && test(type, node))\n max = new Found(node, st)\n baseVisitor[type](node, st, c)\n })(node, state)\n return max\n}\n\n// Fallback to an Object.create polyfill for older environments.\nconst create = Object.create || function(proto) {\n function Ctor() {}\n Ctor.prototype = proto\n return new Ctor\n}\n\n// Used to create a custom walker. Will fill in all missing node\n// type properties with the defaults.\nexport function make(funcs, baseVisitor) {\n let visitor = create(baseVisitor || base)\n for (let type in funcs) visitor[type] = funcs[type]\n return visitor\n}\n\nfunction skipThrough(node, st, c) { c(node, st) }\nfunction ignore(_node, _st, _c) {}\n\n// Node walkers.\n\nexport const base = {}\n\nbase.Program = base.BlockStatement = (node, st, c) => {\n for (let stmt of node.body)\n c(stmt, st, \"Statement\")\n}\nbase.Statement = skipThrough\nbase.EmptyStatement = ignore\nbase.ExpressionStatement = base.ParenthesizedExpression =\n (node, st, c) => c(node.expression, st, \"Expression\")\nbase.IfStatement = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.consequent, st, \"Statement\")\n if (node.alternate) c(node.alternate, st, \"Statement\")\n}\nbase.LabeledStatement = (node, st, c) => c(node.body, st, \"Statement\")\nbase.BreakStatement = base.ContinueStatement = ignore\nbase.WithStatement = (node, st, c) => {\n c(node.object, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.SwitchStatement = (node, st, c) => {\n c(node.discriminant, st, \"Expression\")\n for (let cs of node.cases) {\n if (cs.test) c(cs.test, st, \"Expression\")\n for (let cons of cs.consequent)\n c(cons, st, \"Statement\")\n }\n}\nbase.SwitchCase = (node, st, c) => {\n if (node.test) c(node.test, st, \"Expression\")\n for (let cons of node.consequent)\n c(cons, st, \"Statement\")\n}\nbase.ReturnStatement = base.YieldExpression = base.AwaitExpression = (node, st, c) => {\n if (node.argument) c(node.argument, st, \"Expression\")\n}\nbase.ThrowStatement = base.SpreadElement =\n (node, st, c) => c(node.argument, st, \"Expression\")\nbase.TryStatement = (node, st, c) => {\n c(node.block, st, \"Statement\")\n if (node.handler) c(node.handler, st)\n if (node.finalizer) c(node.finalizer, st, \"Statement\")\n}\nbase.CatchClause = (node, st, c) => {\n if (node.param) c(node.param, st, \"Pattern\")\n c(node.body, st, \"Statement\")\n}\nbase.WhileStatement = base.DoWhileStatement = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForStatement = (node, st, c) => {\n if (node.init) c(node.init, st, \"ForInit\")\n if (node.test) c(node.test, st, \"Expression\")\n if (node.update) c(node.update, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForInStatement = base.ForOfStatement = (node, st, c) => {\n c(node.left, st, \"ForInit\")\n c(node.right, st, \"Expression\")\n c(node.body, st, \"Statement\")\n}\nbase.ForInit = (node, st, c) => {\n if (node.type === \"VariableDeclaration\") c(node, st)\n else c(node, st, \"Expression\")\n}\nbase.DebuggerStatement = ignore\n\nbase.FunctionDeclaration = (node, st, c) => c(node, st, \"Function\")\nbase.VariableDeclaration = (node, st, c) => {\n for (let decl of node.declarations)\n c(decl, st)\n}\nbase.VariableDeclarator = (node, st, c) => {\n c(node.id, st, \"Pattern\")\n if (node.init) c(node.init, st, \"Expression\")\n}\n\nbase.Function = (node, st, c) => {\n if (node.id) c(node.id, st, \"Pattern\")\n for (let param of node.params)\n c(param, st, \"Pattern\")\n c(node.body, st, node.expression ? \"Expression\" : \"Statement\")\n}\n\nbase.Pattern = (node, st, c) => {\n if (node.type === \"Identifier\")\n c(node, st, \"VariablePattern\")\n else if (node.type === \"MemberExpression\")\n c(node, st, \"MemberPattern\")\n else\n c(node, st)\n}\nbase.VariablePattern = ignore\nbase.MemberPattern = skipThrough\nbase.RestElement = (node, st, c) => c(node.argument, st, \"Pattern\")\nbase.ArrayPattern = (node, st, c) => {\n for (let elt of node.elements) {\n if (elt) c(elt, st, \"Pattern\")\n }\n}\nbase.ObjectPattern = (node, st, c) => {\n for (let prop of node.properties) {\n if (prop.type === \"Property\") {\n if (prop.computed) c(prop.key, st, \"Expression\")\n c(prop.value, st, \"Pattern\")\n } else if (prop.type === \"RestElement\") {\n c(prop.argument, st, \"Pattern\")\n }\n }\n}\n\nbase.Expression = skipThrough\nbase.ThisExpression = base.Super = base.MetaProperty = ignore\nbase.ArrayExpression = (node, st, c) => {\n for (let elt of node.elements) {\n if (elt) c(elt, st, \"Expression\")\n }\n}\nbase.ObjectExpression = (node, st, c) => {\n for (let prop of node.properties)\n c(prop, st)\n}\nbase.FunctionExpression = base.ArrowFunctionExpression = base.FunctionDeclaration\nbase.SequenceExpression = (node, st, c) => {\n for (let expr of node.expressions)\n c(expr, st, \"Expression\")\n}\nbase.TemplateLiteral = (node, st, c) => {\n for (let quasi of node.quasis)\n c(quasi, st)\n\n for (let expr of node.expressions)\n c(expr, st, \"Expression\")\n}\nbase.TemplateElement = ignore\nbase.UnaryExpression = base.UpdateExpression = (node, st, c) => {\n c(node.argument, st, \"Expression\")\n}\nbase.BinaryExpression = base.LogicalExpression = (node, st, c) => {\n c(node.left, st, \"Expression\")\n c(node.right, st, \"Expression\")\n}\nbase.AssignmentExpression = base.AssignmentPattern = (node, st, c) => {\n c(node.left, st, \"Pattern\")\n c(node.right, st, \"Expression\")\n}\nbase.ConditionalExpression = (node, st, c) => {\n c(node.test, st, \"Expression\")\n c(node.consequent, st, \"Expression\")\n c(node.alternate, st, \"Expression\")\n}\nbase.NewExpression = base.CallExpression = (node, st, c) => {\n c(node.callee, st, \"Expression\")\n if (node.arguments)\n for (let arg of node.arguments)\n c(arg, st, \"Expression\")\n}\nbase.MemberExpression = (node, st, c) => {\n c(node.object, st, \"Expression\")\n if (node.computed) c(node.property, st, \"Expression\")\n}\nbase.ExportNamedDeclaration = base.ExportDefaultDeclaration = (node, st, c) => {\n if (node.declaration)\n c(node.declaration, st, node.type === \"ExportNamedDeclaration\" || node.declaration.id ? \"Statement\" : \"Expression\")\n if (node.source) c(node.source, st, \"Expression\")\n}\nbase.ExportAllDeclaration = (node, st, c) => {\n c(node.source, st, \"Expression\")\n}\nbase.ImportDeclaration = (node, st, c) => {\n for (let spec of node.specifiers)\n c(spec, st)\n c(node.source, st, \"Expression\")\n}\nbase.ImportSpecifier = base.ImportDefaultSpecifier = base.ImportNamespaceSpecifier = base.Identifier = base.Literal = ignore\n\nbase.TaggedTemplateExpression = (node, st, c) => {\n c(node.tag, st, \"Expression\")\n c(node.quasi, st, \"Expression\")\n}\nbase.ClassDeclaration = base.ClassExpression = (node, st, c) => c(node, st, \"Class\")\nbase.Class = (node, st, c) => {\n if (node.id) c(node.id, st, \"Pattern\")\n if (node.superClass) c(node.superClass, st, \"Expression\")\n c(node.body, st)\n}\nbase.ClassBody = (node, st, c) => {\n for (let elt of node.body)\n c(elt, st)\n}\nbase.MethodDefinition = base.Property = (node, st, c) => {\n if (node.computed) c(node.key, st, \"Expression\")\n c(node.value, st, \"Expression\")\n}\n"],"names":["let","const"],"mappings":"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"} \ No newline at end of file diff --git a/node_modules/acorn-globals/node_modules/acorn-walk/package.json b/node_modules/acorn-globals/node_modules/acorn-walk/package.json new file mode 100644 index 0000000..7e8ac0b --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn-walk/package.json @@ -0,0 +1,64 @@ +{ + "_from": "acorn-walk@^7.1.1", + "_id": "acorn-walk@7.2.0", + "_inBundle": false, + "_integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "_location": "/acorn-globals/acorn-walk", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "acorn-walk@^7.1.1", + "name": "acorn-walk", + "escapedName": "acorn-walk", + "rawSpec": "^7.1.1", + "saveSpec": null, + "fetchSpec": "^7.1.1" + }, + "_requiredBy": [ + "/acorn-globals" + ], + "_resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "_shasum": "0de889a601203909b0fbe07b8938dc21d2e967bc", + "_spec": "acorn-walk@^7.1.1", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\acorn-globals", + "bugs": { + "url": "https://github.com/acornjs/acorn/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "ECMAScript (ESTree) AST walker", + "engines": { + "node": ">=0.4.0" + }, + "homepage": "https://github.com/acornjs/acorn", + "license": "MIT", + "main": "dist/walk.js", + "maintainers": [ + { + "name": "Marijn Haverbeke", + "email": "marijnh@gmail.com", + "url": "https://marijnhaverbeke.nl" + }, + { + "name": "Ingvar Stepanyan", + "email": "me@rreverser.com", + "url": "https://rreverser.com/" + }, + { + "name": "Adrian Heine", + "url": "http://adrianheine.de" + } + ], + "module": "dist/walk.mjs", + "name": "acorn-walk", + "repository": { + "type": "git", + "url": "git+https://github.com/acornjs/acorn.git" + }, + "scripts": { + "prepare": "cd ..; npm run build:walk" + }, + "types": "dist/walk.d.ts", + "version": "7.2.0" +} diff --git a/node_modules/acorn-globals/node_modules/acorn/CHANGELOG.md b/node_modules/acorn-globals/node_modules/acorn/CHANGELOG.md new file mode 100644 index 0000000..b728cb8 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn/CHANGELOG.md @@ -0,0 +1,612 @@ +## 7.3.1 (2020-06-11) + +### Bug fixes + +Make the string in the `version` export match the actual library version. + +## 7.3.0 (2020-06-11) + +### Bug fixes + +Fix a bug that caused parsing of object patterns with a property named `set` that had a default value to fail. + +### New features + +Add support for optional chaining (`?.`). + +## 7.2.0 (2020-05-09) + +### Bug fixes + +Fix precedence issue in parsing of async arrow functions. + +### New features + +Add support for nullish coalescing. + +Add support for `import.meta`. + +Support `export * as ...` syntax. + +Upgrade to Unicode 13. + +## 6.4.1 (2020-03-09) + +### Bug fixes + +More carefully check for valid UTF16 surrogate pairs in regexp validator. + +## 7.1.1 (2020-03-01) + +### Bug fixes + +Treat `\8` and `\9` as invalid escapes in template strings. + +Allow unicode escapes in property names that are keywords. + +Don't error on an exponential operator expression as argument to `await`. + +More carefully check for valid UTF16 surrogate pairs in regexp validator. + +## 7.1.0 (2019-09-24) + +### Bug fixes + +Disallow trailing object literal commas when ecmaVersion is less than 5. + +### New features + +Add a static `acorn` property to the `Parser` class that contains the entire module interface, to allow plugins to access the instance of the library that they are acting on. + +## 7.0.0 (2019-08-13) + +### Breaking changes + +Changes the node format for dynamic imports to use the `ImportExpression` node type, as defined in [ESTree](https://github.com/estree/estree/blob/master/es2020.md#importexpression). + +Makes 10 (ES2019) the default value for the `ecmaVersion` option. + +## 6.3.0 (2019-08-12) + +### New features + +`sourceType: "module"` can now be used even when `ecmaVersion` is less than 6, to parse module-style code that otherwise conforms to an older standard. + +## 6.2.1 (2019-07-21) + +### Bug fixes + +Fix bug causing Acorn to treat some characters as identifier characters that shouldn't be treated as such. + +Fix issue where setting the `allowReserved` option to `"never"` allowed reserved words in some circumstances. + +## 6.2.0 (2019-07-04) + +### Bug fixes + +Improve valid assignment checking in `for`/`in` and `for`/`of` loops. + +Disallow binding `let` in patterns. + +### New features + +Support bigint syntax with `ecmaVersion` >= 11. + +Support dynamic `import` syntax with `ecmaVersion` >= 11. + +Upgrade to Unicode version 12. + +## 6.1.1 (2019-02-27) + +### Bug fixes + +Fix bug that caused parsing default exports of with names to fail. + +## 6.1.0 (2019-02-08) + +### Bug fixes + +Fix scope checking when redefining a `var` as a lexical binding. + +### New features + +Split up `parseSubscripts` to use an internal `parseSubscript` method to make it easier to extend with plugins. + +## 6.0.7 (2019-02-04) + +### Bug fixes + +Check that exported bindings are defined. + +Don't treat `\u180e` as a whitespace character. + +Check for duplicate parameter names in methods. + +Don't allow shorthand properties when they are generators or async methods. + +Forbid binding `await` in async arrow function's parameter list. + +## 6.0.6 (2019-01-30) + +### Bug fixes + +The content of class declarations and expressions is now always parsed in strict mode. + +Don't allow `let` or `const` to bind the variable name `let`. + +Treat class declarations as lexical. + +Don't allow a generator function declaration as the sole body of an `if` or `else`. + +Ignore `"use strict"` when after an empty statement. + +Allow string line continuations with special line terminator characters. + +Treat `for` bodies as part of the `for` scope when checking for conflicting bindings. + +Fix bug with parsing `yield` in a `for` loop initializer. + +Implement special cases around scope checking for functions. + +## 6.0.5 (2019-01-02) + +### Bug fixes + +Fix TypeScript type for `Parser.extend` and add `allowAwaitOutsideFunction` to options type. + +Don't treat `let` as a keyword when the next token is `{` on the next line. + +Fix bug that broke checking for parentheses around an object pattern in a destructuring assignment when `preserveParens` was on. + +## 6.0.4 (2018-11-05) + +### Bug fixes + +Further improvements to tokenizing regular expressions in corner cases. + +## 6.0.3 (2018-11-04) + +### Bug fixes + +Fix bug in tokenizing an expression-less return followed by a function followed by a regular expression. + +Remove stray symlink in the package tarball. + +## 6.0.2 (2018-09-26) + +### Bug fixes + +Fix bug where default expressions could fail to parse inside an object destructuring assignment expression. + +## 6.0.1 (2018-09-14) + +### Bug fixes + +Fix wrong value in `version` export. + +## 6.0.0 (2018-09-14) + +### Bug fixes + +Better handle variable-redefinition checks for catch bindings and functions directly under if statements. + +Forbid `new.target` in top-level arrow functions. + +Fix issue with parsing a regexp after `yield` in some contexts. + +### New features + +The package now comes with TypeScript definitions. + +### Breaking changes + +The default value of the `ecmaVersion` option is now 9 (2018). + +Plugins work differently, and will have to be rewritten to work with this version. + +The loose parser and walker have been moved into separate packages (`acorn-loose` and `acorn-walk`). + +## 5.7.3 (2018-09-10) + +### Bug fixes + +Fix failure to tokenize regexps after expressions like `x.of`. + +Better error message for unterminated template literals. + +## 5.7.2 (2018-08-24) + +### Bug fixes + +Properly handle `allowAwaitOutsideFunction` in for statements. + +Treat function declarations at the top level of modules like let bindings. + +Don't allow async function declarations as the only statement under a label. + +## 5.7.0 (2018-06-15) + +### New features + +Upgraded to Unicode 11. + +## 5.6.0 (2018-05-31) + +### New features + +Allow U+2028 and U+2029 in string when ECMAVersion >= 10. + +Allow binding-less catch statements when ECMAVersion >= 10. + +Add `allowAwaitOutsideFunction` option for parsing top-level `await`. + +## 5.5.3 (2018-03-08) + +### Bug fixes + +A _second_ republish of the code in 5.5.1, this time with yarn, to hopefully get valid timestamps. + +## 5.5.2 (2018-03-08) + +### Bug fixes + +A republish of the code in 5.5.1 in an attempt to solve an issue with the file timestamps in the npm package being 0. + +## 5.5.1 (2018-03-06) + +### Bug fixes + +Fix misleading error message for octal escapes in template strings. + +## 5.5.0 (2018-02-27) + +### New features + +The identifier character categorization is now based on Unicode version 10. + +Acorn will now validate the content of regular expressions, including new ES9 features. + +## 5.4.0 (2018-02-01) + +### Bug fixes + +Disallow duplicate or escaped flags on regular expressions. + +Disallow octal escapes in strings in strict mode. + +### New features + +Add support for async iteration. + +Add support for object spread and rest. + +## 5.3.0 (2017-12-28) + +### Bug fixes + +Fix parsing of floating point literals with leading zeroes in loose mode. + +Allow duplicate property names in object patterns. + +Don't allow static class methods named `prototype`. + +Disallow async functions directly under `if` or `else`. + +Parse right-hand-side of `for`/`of` as an assignment expression. + +Stricter parsing of `for`/`in`. + +Don't allow unicode escapes in contextual keywords. + +### New features + +Parsing class members was factored into smaller methods to allow plugins to hook into it. + +## 5.2.1 (2017-10-30) + +### Bug fixes + +Fix a token context corruption bug. + +## 5.2.0 (2017-10-30) + +### Bug fixes + +Fix token context tracking for `class` and `function` in property-name position. + +Make sure `%*` isn't parsed as a valid operator. + +Allow shorthand properties `get` and `set` to be followed by default values. + +Disallow `super` when not in callee or object position. + +### New features + +Support [`directive` property](https://github.com/estree/estree/compare/b3de58c9997504d6fba04b72f76e6dd1619ee4eb...1da8e603237144f44710360f8feb7a9977e905e0) on directive expression statements. + +## 5.1.2 (2017-09-04) + +### Bug fixes + +Disable parsing of legacy HTML-style comments in modules. + +Fix parsing of async methods whose names are keywords. + +## 5.1.1 (2017-07-06) + +### Bug fixes + +Fix problem with disambiguating regexp and division after a class. + +## 5.1.0 (2017-07-05) + +### Bug fixes + +Fix tokenizing of regexps in an object-desctructuring `for`/`of` loop and after `yield`. + +Parse zero-prefixed numbers with non-octal digits as decimal. + +Allow object/array patterns in rest parameters. + +Don't error when `yield` is used as a property name. + +Allow `async` as a shorthand object property. + +### New features + +Implement the [template literal revision proposal](https://github.com/tc39/proposal-template-literal-revision) for ES9. + +## 5.0.3 (2017-04-01) + +### Bug fixes + +Fix spurious duplicate variable definition errors for named functions. + +## 5.0.2 (2017-03-30) + +### Bug fixes + +A binary operator after a parenthesized arrow expression is no longer incorrectly treated as an error. + +## 5.0.0 (2017-03-28) + +### Bug fixes + +Raise an error for duplicated lexical bindings. + +Fix spurious error when an assignement expression occurred after a spread expression. + +Accept regular expressions after `of` (in `for`/`of`), `yield` (in a generator), and braced arrow functions. + +Allow labels in front or `var` declarations, even in strict mode. + +### Breaking changes + +Parse declarations following `export default` as declaration nodes, not expressions. This means that class and function declarations nodes can now have `null` as their `id`. + +## 4.0.11 (2017-02-07) + +### Bug fixes + +Allow all forms of member expressions to be parenthesized as lvalue. + +## 4.0.10 (2017-02-07) + +### Bug fixes + +Don't expect semicolons after default-exported functions or classes, even when they are expressions. + +Check for use of `'use strict'` directives in non-simple parameter functions, even when already in strict mode. + +## 4.0.9 (2017-02-06) + +### Bug fixes + +Fix incorrect error raised for parenthesized simple assignment targets, so that `(x) = 1` parses again. + +## 4.0.8 (2017-02-03) + +### Bug fixes + +Solve spurious parenthesized pattern errors by temporarily erring on the side of accepting programs that our delayed errors don't handle correctly yet. + +## 4.0.7 (2017-02-02) + +### Bug fixes + +Accept invalidly rejected code like `(x).y = 2` again. + +Don't raise an error when a function _inside_ strict code has a non-simple parameter list. + +## 4.0.6 (2017-02-02) + +### Bug fixes + +Fix exponential behavior (manifesting itself as a complete hang for even relatively small source files) introduced by the new 'use strict' check. + +## 4.0.5 (2017-02-02) + +### Bug fixes + +Disallow parenthesized pattern expressions. + +Allow keywords as export names. + +Don't allow the `async` keyword to be parenthesized. + +Properly raise an error when a keyword contains a character escape. + +Allow `"use strict"` to appear after other string literal expressions. + +Disallow labeled declarations. + +## 4.0.4 (2016-12-19) + +### Bug fixes + +Fix crash when `export` was followed by a keyword that can't be +exported. + +## 4.0.3 (2016-08-16) + +### Bug fixes + +Allow regular function declarations inside single-statement `if` branches in loose mode. Forbid them entirely in strict mode. + +Properly parse properties named `async` in ES2017 mode. + +Fix bug where reserved words were broken in ES2017 mode. + +## 4.0.2 (2016-08-11) + +### Bug fixes + +Don't ignore period or 'e' characters after octal numbers. + +Fix broken parsing for call expressions in default parameter values of arrow functions. + +## 4.0.1 (2016-08-08) + +### Bug fixes + +Fix false positives in duplicated export name errors. + +## 4.0.0 (2016-08-07) + +### Breaking changes + +The default `ecmaVersion` option value is now 7. + +A number of internal method signatures changed, so plugins might need to be updated. + +### Bug fixes + +The parser now raises errors on duplicated export names. + +`arguments` and `eval` can now be used in shorthand properties. + +Duplicate parameter names in non-simple argument lists now always produce an error. + +### New features + +The `ecmaVersion` option now also accepts year-style version numbers +(2015, etc). + +Support for `async`/`await` syntax when `ecmaVersion` is >= 8. + +Support for trailing commas in call expressions when `ecmaVersion` is >= 8. + +## 3.3.0 (2016-07-25) + +### Bug fixes + +Fix bug in tokenizing of regexp operator after a function declaration. + +Fix parser crash when parsing an array pattern with a hole. + +### New features + +Implement check against complex argument lists in functions that enable strict mode in ES7. + +## 3.2.0 (2016-06-07) + +### Bug fixes + +Improve handling of lack of unicode regexp support in host +environment. + +Properly reject shorthand properties whose name is a keyword. + +### New features + +Visitors created with `visit.make` now have their base as _prototype_, rather than copying properties into a fresh object. + +## 3.1.0 (2016-04-18) + +### Bug fixes + +Properly tokenize the division operator directly after a function expression. + +Allow trailing comma in destructuring arrays. + +## 3.0.4 (2016-02-25) + +### Fixes + +Allow update expressions as left-hand-side of the ES7 exponential operator. + +## 3.0.2 (2016-02-10) + +### Fixes + +Fix bug that accidentally made `undefined` a reserved word when parsing ES7. + +## 3.0.0 (2016-02-10) + +### Breaking changes + +The default value of the `ecmaVersion` option is now 6 (used to be 5). + +Support for comprehension syntax (which was dropped from the draft spec) has been removed. + +### Fixes + +`let` and `yield` are now “contextual keywords”, meaning you can mostly use them as identifiers in ES5 non-strict code. + +A parenthesized class or function expression after `export default` is now parsed correctly. + +### New features + +When `ecmaVersion` is set to 7, Acorn will parse the exponentiation operator (`**`). + +The identifier character ranges are now based on Unicode 8.0.0. + +Plugins can now override the `raiseRecoverable` method to override the way non-critical errors are handled. + +## 2.7.0 (2016-01-04) + +### Fixes + +Stop allowing rest parameters in setters. + +Disallow `y` rexexp flag in ES5. + +Disallow `\00` and `\000` escapes in strict mode. + +Raise an error when an import name is a reserved word. + +## 2.6.2 (2015-11-10) + +### Fixes + +Don't crash when no options object is passed. + +## 2.6.0 (2015-11-09) + +### Fixes + +Add `await` as a reserved word in module sources. + +Disallow `yield` in a parameter default value for a generator. + +Forbid using a comma after a rest pattern in an array destructuring. + +### New features + +Support parsing stdin in command-line tool. + +## 2.5.0 (2015-10-27) + +### Fixes + +Fix tokenizer support in the command-line tool. + +Stop allowing `new.target` outside of functions. + +Remove legacy `guard` and `guardedHandler` properties from try nodes. + +Stop allowing multiple `__proto__` properties on an object literal in strict mode. + +Don't allow rest parameters to be non-identifier patterns. + +Check for duplicate paramter names in arrow functions. diff --git a/node_modules/camel-case/LICENSE b/node_modules/acorn-globals/node_modules/acorn/LICENSE similarity index 92% rename from node_modules/camel-case/LICENSE rename to node_modules/acorn-globals/node_modules/acorn/LICENSE index 983fbe8..2c0632b 100644 --- a/node_modules/camel-case/LICENSE +++ b/node_modules/acorn-globals/node_modules/acorn/LICENSE @@ -1,6 +1,4 @@ -The MIT License (MIT) - -Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) +Copyright (C) 2012-2018 by various contributors (see AUTHORS) 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/acorn-globals/node_modules/acorn/README.md b/node_modules/acorn-globals/node_modules/acorn/README.md new file mode 100644 index 0000000..585f273 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn/README.md @@ -0,0 +1,270 @@ +# Acorn + +A tiny, fast JavaScript parser written in JavaScript. + +## Community + +Acorn is open source software released under an +[MIT license](https://github.com/acornjs/acorn/blob/master/acorn/LICENSE). + +You are welcome to +[report bugs](https://github.com/acornjs/acorn/issues) or create pull +requests on [github](https://github.com/acornjs/acorn). For questions +and discussion, please use the +[Tern discussion forum](https://discuss.ternjs.net). + +## Installation + +The easiest way to install acorn is from [`npm`](https://www.npmjs.com/): + +```sh +npm install acorn +``` + +Alternately, you can download the source and build acorn yourself: + +```sh +git clone https://github.com/acornjs/acorn.git +cd acorn +npm install +``` + +## Interface + +**parse**`(input, options)` is the main interface to the library. The +`input` parameter is a string, `options` can be undefined or an object +setting some of the options listed below. The return value will be an +abstract syntax tree object as specified by the [ESTree +spec](https://github.com/estree/estree). + +```javascript +let acorn = require("acorn"); +console.log(acorn.parse("1 + 1")); +``` + +When encountering a syntax error, the parser will raise a +`SyntaxError` object with a meaningful message. The error object will +have a `pos` property that indicates the string offset at which the +error occurred, and a `loc` object that contains a `{line, column}` +object referring to that same position. + +Options can be provided by passing a second argument, which should be +an object containing any of these fields: + +- **ecmaVersion**: Indicates the ECMAScript version to parse. Must be + either 3, 5, 6 (2015), 7 (2016), 8 (2017), 9 (2018), 10 (2019) or 11 + (2020, partial support). This influences support for strict mode, + the set of reserved words, and support for new syntax features. + Default is 10. + + **NOTE**: Only 'stage 4' (finalized) ECMAScript features are being + implemented by Acorn. Other proposed new features can be implemented + through plugins. + +- **sourceType**: Indicate the mode the code should be parsed in. Can be + either `"script"` or `"module"`. This influences global strict mode + and parsing of `import` and `export` declarations. + + **NOTE**: If set to `"module"`, then static `import` / `export` syntax + will be valid, even if `ecmaVersion` is less than 6. + +- **onInsertedSemicolon**: If given a callback, that callback will be + called whenever a missing semicolon is inserted by the parser. The + callback will be given the character offset of the point where the + semicolon is inserted as argument, and if `locations` is on, also a + `{line, column}` object representing this position. + +- **onTrailingComma**: Like `onInsertedSemicolon`, but for trailing + commas. + +- **allowReserved**: If `false`, using a reserved word will generate + an error. Defaults to `true` for `ecmaVersion` 3, `false` for higher + versions. When given the value `"never"`, reserved words and + keywords can also not be used as property names (as in Internet + Explorer's old parser). + +- **allowReturnOutsideFunction**: By default, a return statement at + the top level raises an error. Set this to `true` to accept such + code. + +- **allowImportExportEverywhere**: By default, `import` and `export` + declarations can only appear at a program's top level. Setting this + option to `true` allows them anywhere where a statement is allowed. + +- **allowAwaitOutsideFunction**: By default, `await` expressions can + only appear inside `async` functions. Setting this option to + `true` allows to have top-level `await` expressions. They are + still not allowed in non-`async` functions, though. + +- **allowHashBang**: When this is enabled (off by default), if the + code starts with the characters `#!` (as in a shellscript), the + first line will be treated as a comment. + +- **locations**: When `true`, each node has a `loc` object attached + with `start` and `end` subobjects, each of which contains the + one-based line and zero-based column numbers in `{line, column}` + form. Default is `false`. + +- **onToken**: If a function is passed for this option, each found + token will be passed in same format as tokens returned from + `tokenizer().getToken()`. + + If array is passed, each found token is pushed to it. + + Note that you are not allowed to call the parser from the + callback—that will corrupt its internal state. + +- **onComment**: If a function is passed for this option, whenever a + comment is encountered the function will be called with the + following parameters: + + - `block`: `true` if the comment is a block comment, false if it + is a line comment. + - `text`: The content of the comment. + - `start`: Character offset of the start of the comment. + - `end`: Character offset of the end of the comment. + + When the `locations` options is on, the `{line, column}` locations + of the comment’s start and end are passed as two additional + parameters. + + If array is passed for this option, each found comment is pushed + to it as object in Esprima format: + + ```javascript + { + "type": "Line" | "Block", + "value": "comment text", + "start": Number, + "end": Number, + // If `locations` option is on: + "loc": { + "start": {line: Number, column: Number} + "end": {line: Number, column: Number} + }, + // If `ranges` option is on: + "range": [Number, Number] + } + ``` + + Note that you are not allowed to call the parser from the + callback—that will corrupt its internal state. + +- **ranges**: Nodes have their start and end characters offsets + recorded in `start` and `end` properties (directly on the node, + rather than the `loc` object, which holds line/column data. To also + add a + [semi-standardized](https://bugzilla.mozilla.org/show_bug.cgi?id=745678) + `range` property holding a `[start, end]` array with the same + numbers, set the `ranges` option to `true`. + +- **program**: It is possible to parse multiple files into a single + AST by passing the tree produced by parsing the first file as the + `program` option in subsequent parses. This will add the toplevel + forms of the parsed file to the "Program" (top) node of an existing + parse tree. + +- **sourceFile**: When the `locations` option is `true`, you can pass + this option to add a `source` attribute in every node’s `loc` + object. Note that the contents of this option are not examined or + processed in any way; you are free to use whatever format you + choose. + +- **directSourceFile**: Like `sourceFile`, but a `sourceFile` property + will be added (regardless of the `location` option) directly to the + nodes, rather than the `loc` object. + +- **preserveParens**: If this option is `true`, parenthesized expressions + are represented by (non-standard) `ParenthesizedExpression` nodes + that have a single `expression` property containing the expression + inside parentheses. + +**parseExpressionAt**`(input, offset, options)` will parse a single +expression in a string, and return its AST. It will not complain if +there is more of the string left after the expression. + +**tokenizer**`(input, options)` returns an object with a `getToken` +method that can be called repeatedly to get the next token, a `{start, +end, type, value}` object (with added `loc` property when the +`locations` option is enabled and `range` property when the `ranges` +option is enabled). When the token's type is `tokTypes.eof`, you +should stop calling the method, since it will keep returning that same +token forever. + +In ES6 environment, returned result can be used as any other +protocol-compliant iterable: + +```javascript +for (let token of acorn.tokenizer(str)) { + // iterate over the tokens +} + +// transform code to array of tokens: +var tokens = [...acorn.tokenizer(str)]; +``` + +**tokTypes** holds an object mapping names to the token type objects +that end up in the `type` properties of tokens. + +**getLineInfo**`(input, offset)` can be used to get a `{line, +column}` object for a given program string and offset. + +### The `Parser` class + +Instances of the **`Parser`** class contain all the state and logic +that drives a parse. It has static methods `parse`, +`parseExpressionAt`, and `tokenizer` that match the top-level +functions by the same name. + +When extending the parser with plugins, you need to call these methods +on the extended version of the class. To extend a parser with plugins, +you can use its static `extend` method. + +```javascript +var acorn = require("acorn"); +var jsx = require("acorn-jsx"); +var JSXParser = acorn.Parser.extend(jsx()); +JSXParser.parse("foo()"); +``` + +The `extend` method takes any number of plugin values, and returns a +new `Parser` class that includes the extra parser logic provided by +the plugins. + +## Command line interface + +The `bin/acorn` utility can be used to parse a file from the command +line. It accepts as arguments its input file and the following +options: + +- `--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|--ecma10`: Sets the ECMAScript version + to parse. Default is version 9. + +- `--module`: Sets the parsing mode to `"module"`. Is set to `"script"` otherwise. + +- `--locations`: Attaches a "loc" object to each node with "start" and + "end" subobjects, each of which contains the one-based line and + zero-based column numbers in `{line, column}` form. + +- `--allow-hash-bang`: If the code starts with the characters #! (as + in a shellscript), the first line will be treated as a comment. + +- `--compact`: No whitespace is used in the AST output. + +- `--silent`: Do not output the AST, just return the exit status. + +- `--help`: Print the usage information and quit. + +The utility spits out the syntax tree as JSON data. + +## Existing plugins + + - [`acorn-jsx`](https://github.com/RReverser/acorn-jsx): Parse [Facebook JSX syntax extensions](https://github.com/facebook/jsx) + +Plugins for ECMAScript proposals: + + - [`acorn-stage3`](https://github.com/acornjs/acorn-stage3): Parse most stage 3 proposals, bundling: + - [`acorn-class-fields`](https://github.com/acornjs/acorn-class-fields): Parse [class fields proposal](https://github.com/tc39/proposal-class-fields) + - [`acorn-import-meta`](https://github.com/acornjs/acorn-import-meta): Parse [import.meta proposal](https://github.com/tc39/proposal-import-meta) + - [`acorn-numeric-separator`](https://github.com/acornjs/acorn-numeric-separator): Parse [numeric separator proposal](https://github.com/tc39/proposal-numeric-separator) + - [`acorn-private-methods`](https://github.com/acornjs/acorn-private-methods): parse [private methods, getters and setters proposal](https://github.com/tc39/proposal-private-methods)n diff --git a/node_modules/acorn-globals/node_modules/acorn/bin/acorn b/node_modules/acorn-globals/node_modules/acorn/bin/acorn new file mode 100644 index 0000000..cf7df46 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn/bin/acorn @@ -0,0 +1,4 @@ +#!/usr/bin/env node +'use strict'; + +require('../dist/bin.js'); diff --git a/node_modules/acorn-globals/node_modules/acorn/dist/acorn.d.ts b/node_modules/acorn-globals/node_modules/acorn/dist/acorn.d.ts new file mode 100644 index 0000000..bda5f80 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn/dist/acorn.d.ts @@ -0,0 +1,209 @@ +export as namespace acorn +export = acorn + +declare namespace acorn { + function parse(input: string, options?: Options): Node + + function parseExpressionAt(input: string, pos?: number, options?: Options): Node + + function tokenizer(input: string, options?: Options): { + getToken(): Token + [Symbol.iterator](): Iterator + } + + interface Options { + ecmaVersion?: 3 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 + sourceType?: 'script' | 'module' + onInsertedSemicolon?: (lastTokEnd: number, lastTokEndLoc?: Position) => void + onTrailingComma?: (lastTokEnd: number, lastTokEndLoc?: Position) => void + allowReserved?: boolean | 'never' + allowReturnOutsideFunction?: boolean + allowImportExportEverywhere?: boolean + allowAwaitOutsideFunction?: boolean + allowHashBang?: boolean + locations?: boolean + onToken?: ((token: Token) => any) | Token[] + onComment?: (( + isBlock: boolean, text: string, start: number, end: number, startLoc?: Position, + endLoc?: Position + ) => void) | Comment[] + ranges?: boolean + program?: Node + sourceFile?: string + directSourceFile?: string + preserveParens?: boolean + } + + class Parser { + constructor(options: Options, input: string, startPos?: number) + parse(this: Parser): Node + static parse(this: typeof Parser, input: string, options?: Options): Node + static parseExpressionAt(this: typeof Parser, input: string, pos: number, options?: Options): Node + static tokenizer(this: typeof Parser, input: string, options?: Options): { + getToken(): Token + [Symbol.iterator](): Iterator + } + static extend(this: typeof Parser, ...plugins: ((BaseParser: typeof Parser) => typeof Parser)[]): typeof Parser + } + + interface Position { line: number; column: number; offset: number } + + const defaultOptions: Options + + function getLineInfo(input: string, offset: number): Position + + class SourceLocation { + start: Position + end: Position + source?: string | null + constructor(p: Parser, start: Position, end: Position) + } + + class Node { + type: string + start: number + end: number + loc?: SourceLocation + sourceFile?: string + range?: [number, number] + constructor(parser: Parser, pos: number, loc?: SourceLocation) + } + + class TokenType { + label: string + keyword: string + beforeExpr: boolean + startsExpr: boolean + isLoop: boolean + isAssign: boolean + prefix: boolean + postfix: boolean + binop: number + updateContext?: (prevType: TokenType) => void + constructor(label: string, conf?: any) + } + + const tokTypes: { + num: TokenType + regexp: TokenType + string: TokenType + name: TokenType + eof: TokenType + bracketL: TokenType + bracketR: TokenType + braceL: TokenType + braceR: TokenType + parenL: TokenType + parenR: TokenType + comma: TokenType + semi: TokenType + colon: TokenType + dot: TokenType + question: TokenType + arrow: TokenType + template: TokenType + ellipsis: TokenType + backQuote: TokenType + dollarBraceL: TokenType + eq: TokenType + assign: TokenType + incDec: TokenType + prefix: TokenType + logicalOR: TokenType + logicalAND: TokenType + bitwiseOR: TokenType + bitwiseXOR: TokenType + bitwiseAND: TokenType + equality: TokenType + relational: TokenType + bitShift: TokenType + plusMin: TokenType + modulo: TokenType + star: TokenType + slash: TokenType + starstar: TokenType + _break: TokenType + _case: TokenType + _catch: TokenType + _continue: TokenType + _debugger: TokenType + _default: TokenType + _do: TokenType + _else: TokenType + _finally: TokenType + _for: TokenType + _function: TokenType + _if: TokenType + _return: TokenType + _switch: TokenType + _throw: TokenType + _try: TokenType + _var: TokenType + _const: TokenType + _while: TokenType + _with: TokenType + _new: TokenType + _this: TokenType + _super: TokenType + _class: TokenType + _extends: TokenType + _export: TokenType + _import: TokenType + _null: TokenType + _true: TokenType + _false: TokenType + _in: TokenType + _instanceof: TokenType + _typeof: TokenType + _void: TokenType + _delete: TokenType + } + + class TokContext { + constructor(token: string, isExpr: boolean, preserveSpace: boolean, override?: (p: Parser) => void) + } + + const tokContexts: { + b_stat: TokContext + b_expr: TokContext + b_tmpl: TokContext + p_stat: TokContext + p_expr: TokContext + q_tmpl: TokContext + f_expr: TokContext + } + + function isIdentifierStart(code: number, astral?: boolean): boolean + + function isIdentifierChar(code: number, astral?: boolean): boolean + + interface AbstractToken { + } + + interface Comment extends AbstractToken { + type: string + value: string + start: number + end: number + loc?: SourceLocation + range?: [number, number] + } + + class Token { + type: TokenType + value: any + start: number + end: number + loc?: SourceLocation + range?: [number, number] + constructor(p: Parser) + } + + function isNewLine(code: number): boolean + + const lineBreak: RegExp + + const lineBreakG: RegExp + + const version: string +} diff --git a/node_modules/acorn-globals/node_modules/acorn/dist/acorn.js b/node_modules/acorn-globals/node_modules/acorn/dist/acorn.js new file mode 100644 index 0000000..f4c2404 --- /dev/null +++ b/node_modules/acorn-globals/node_modules/acorn/dist/acorn.js @@ -0,0 +1,5138 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.acorn = {})); +}(this, (function (exports) { 'use strict'; + + // Reserved word lists for various dialects of the language + + var reservedWords = { + 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile", + 5: "class enum extends super const export import", + 6: "enum", + strict: "implements interface let package private protected public static yield", + strictBind: "eval arguments" + }; + + // And the keywords + + var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this"; + + var keywords = { + 5: ecma5AndLessKeywords, + "5module": ecma5AndLessKeywords + " export import", + 6: ecma5AndLessKeywords + " const class extends export import super" + }; + + var keywordRelationalOperator = /^in(stanceof)?$/; + + // ## Character categories + + // Big ugly regular expressions that match characters in the + // whitespace, identifier, and identifier-start categories. These + // are only applied when a character is found to actually have a + // code point above 128. + // Generated by `bin/generate-identifier-regex.js`. + var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u08a0-\u08b4\u08b6-\u08c7\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\u9ffc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7bf\ua7c2-\ua7ca\ua7f5-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc"; + var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08d3-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf\u1ac0\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1df9\u1dfb-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f"; + + var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]"); + var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]"); + + nonASCIIidentifierStartChars = nonASCIIidentifierChars = null; + + // These are a run-length and offset encoded representation of the + // >0xffff code points that are a valid part of identifiers. The + // offset starts at 0x10000, and each pair of numbers represents an + // offset to the next range, and then a size of the range. They were + // generated by bin/generate-identifier-regex.js + + // eslint-disable-next-line comma-spacing + var astralIdentifierStartCodes = [0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,107,20,28,22,13,52,76,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,190,0,80,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8952,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42717,35,4148,12,221,3,5761,15,7472,3104,541,1507,4938]; + + // eslint-disable-next-line comma-spacing + var astralIdentifierCodes = [509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,154,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,4759,9,787719,239]; + + // This has a complexity linear to the value of the code. The + // assumption is that looking up astral identifier characters is + // rare. + function isInAstralSet(code, set) { + var pos = 0x10000; + for (var i = 0; i < set.length; i += 2) { + pos += set[i]; + if (pos > code) { return false } + pos += set[i + 1]; + if (pos >= code) { return true } + } + } + + // Test whether a given character code starts an identifier. + + function isIdentifierStart(code, astral) { + if (code < 65) { return code === 36 } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) + } + + // Test whether a given character is part of an identifier. + + function isIdentifierChar(code, astral) { + if (code < 48) { return code === 36 } + if (code < 58) { return true } + if (code < 65) { return false } + if (code < 91) { return true } + if (code < 97) { return code === 95 } + if (code < 123) { return true } + if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) } + if (astral === false) { return false } + return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes) + } + + // ## Token types + + // The assignment of fine-grained, information-carrying type objects + // allows the tokenizer to store the information it has about a + // token in a way that is very cheap for the parser to look up. + + // All token type variables start with an underscore, to make them + // easy to recognize. + + // The `beforeExpr` property is used to disambiguate between regular + // expressions and divisions. It is set on all token types that can + // be followed by an expression (thus, a slash after them would be a + // regular expression). + // + // The `startsExpr` property is used to check if the token ends a + // `yield` expression. It is set on all token types that either can + // directly start an expression (like a quotation mark) or can + // continue an expression (like the body of a string). + // + // `isLoop` marks a keyword as starting a loop, which is important + // to know when parsing a label, in order to allow or disallow + // continue jumps to that label. + + var TokenType = function TokenType(label, conf) { + if ( conf === void 0 ) conf = {}; + + this.label = label; + this.keyword = conf.keyword; + this.beforeExpr = !!conf.beforeExpr; + this.startsExpr = !!conf.startsExpr; + this.isLoop = !!conf.isLoop; + this.isAssign = !!conf.isAssign; + this.prefix = !!conf.prefix; + this.postfix = !!conf.postfix; + this.binop = conf.binop || null; + this.updateContext = null; + }; + + function binop(name, prec) { + return new TokenType(name, {beforeExpr: true, binop: prec}) + } + var beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true}; + + // Map keyword names to token types. + + var keywords$1 = {}; + + // Succinct definitions of keyword token types + function kw(name, options) { + if ( options === void 0 ) options = {}; + + options.keyword = name; + return keywords$1[name] = new TokenType(name, options) + } + + var types = { + num: new TokenType("num", startsExpr), + regexp: new TokenType("regexp", startsExpr), + string: new TokenType("string", startsExpr), + name: new TokenType("name", startsExpr), + eof: new TokenType("eof"), + + // Punctuation token types. + bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}), + bracketR: new TokenType("]"), + braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}), + braceR: new TokenType("}"), + parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}), + parenR: new TokenType(")"), + comma: new TokenType(",", beforeExpr), + semi: new TokenType(";", beforeExpr), + colon: new TokenType(":", beforeExpr), + dot: new TokenType("."), + question: new TokenType("?", beforeExpr), + questionDot: new TokenType("?."), + arrow: new TokenType("=>", beforeExpr), + template: new TokenType("template"), + invalidTemplate: new TokenType("invalidTemplate"), + ellipsis: new TokenType("...", beforeExpr), + backQuote: new TokenType("`", startsExpr), + dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}), + + // Operators. These carry several kinds of properties to help the + // parser use them properly (the presence of these properties is + // what categorizes them as operators). + // + // `binop`, when present, specifies that this operator is a binary + // operator, and will refer to its precedence. + // + // `prefix` and `postfix` mark the operator as a prefix or postfix + // unary operator. + // + // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as + // binary operators with a very low precedence, that should result + // in AssignmentExpression nodes. + + eq: new TokenType("=", {beforeExpr: true, isAssign: true}), + assign: new TokenType("_=", {beforeExpr: true, isAssign: true}), + incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}), + prefix: new TokenType("!/~", {beforeExpr: true, prefix: true, startsExpr: true}), + logicalOR: binop("||", 1), + logicalAND: binop("&&", 2), + bitwiseOR: binop("|", 3), + bitwiseXOR: binop("^", 4), + bitwiseAND: binop("&", 5), + equality: binop("==/!=/===/!==", 6), + relational: binop("/<=/>=", 7), + bitShift: binop("<>/>>>", 8), + plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}), + modulo: binop("%", 10), + star: binop("*", 10), + slash: binop("/", 10), + starstar: new TokenType("**", {beforeExpr: true}), + coalesce: binop("??", 1), + + // Keyword token types. + _break: kw("break"), + _case: kw("case", beforeExpr), + _catch: kw("catch"), + _continue: kw("continue"), + _debugger: kw("debugger"), + _default: kw("default", beforeExpr), + _do: kw("do", {isLoop: true, beforeExpr: true}), + _else: kw("else", beforeExpr), + _finally: kw("finally"), + _for: kw("for", {isLoop: true}), + _function: kw("function", startsExpr), + _if: kw("if"), + _return: kw("return", beforeExpr), + _switch: kw("switch"), + _throw: kw("throw", beforeExpr), + _try: kw("try"), + _var: kw("var"), + _const: kw("const"), + _while: kw("while", {isLoop: true}), + _with: kw("with"), + _new: kw("new", {beforeExpr: true, startsExpr: true}), + _this: kw("this", startsExpr), + _super: kw("super", startsExpr), + _class: kw("class", startsExpr), + _extends: kw("extends", beforeExpr), + _export: kw("export"), + _import: kw("import", startsExpr), + _null: kw("null", startsExpr), + _true: kw("true", startsExpr), + _false: kw("false", startsExpr), + _in: kw("in", {beforeExpr: true, binop: 7}), + _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}), + _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}), + _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}), + _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true}) + }; + + // Matches a whole line break (where CRLF is considered a single + // line break). Used to count lines. + + var lineBreak = /\r\n?|\n|\u2028|\u2029/; + var lineBreakG = new RegExp(lineBreak.source, "g"); + + function isNewLine(code, ecma2019String) { + return code === 10 || code === 13 || (!ecma2019String && (code === 0x2028 || code === 0x2029)) + } + + var nonASCIIwhitespace = /[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/; + + var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g; + + var ref = Object.prototype; + var hasOwnProperty = ref.hasOwnProperty; + var toString = ref.toString; + + // Checks if an object has a property. + + function has(obj, propName) { + return hasOwnProperty.call(obj, propName) + } + + var isArray = Array.isArray || (function (obj) { return ( + toString.call(obj) === "[object Array]" + ); }); + + function wordsRegexp(words) { + return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$") + } + + // These are used when `options.locations` is on, for the + // `startLoc` and `endLoc` properties. + + var Position = function Position(line, col) { + this.line = line; + this.column = col; + }; + + Position.prototype.offset = function offset (n) { + return new Position(this.line, this.column + n) + }; + + var SourceLocation = function SourceLocation(p, start, end) { + this.start = start; + this.end = end; + if (p.sourceFile !== null) { this.source = p.sourceFile; } + }; + + // The `getLineInfo` function is mostly useful when the + // `locations` option is off (for performance reasons) and you + // want to find the line/column position for a given character + // offset. `input` should be the code string that the offset refers + // into. + + function getLineInfo(input, offset) { + for (var line = 1, cur = 0;;) { + lineBreakG.lastIndex = cur; + var match = lineBreakG.exec(input); + if (match && match.index < offset) { + ++line; + cur = match.index + match[0].length; + } else { + return new Position(line, offset - cur) + } + } + } + + // A second optional argument can be given to further configure + // the parser process. These options are recognized: + + var defaultOptions = { + // `ecmaVersion` indicates the ECMAScript version to parse. Must be + // either 3, 5, 6 (2015), 7 (2016), 8 (2017), 9 (2018), or 10 + // (2019). This influences support for strict mode, the set of + // reserved words, and support for new syntax features. The default + // is 10. + ecmaVersion: 10, + // `sourceType` indicates the mode the code should be parsed in. + // Can be either `"script"` or `"module"`. This influences global + // strict mode and parsing of `import` and `export` declarations. + sourceType: "script", + // `onInsertedSemicolon` can be a callback that will be called + // when a semicolon is automatically inserted. It will be passed + // the position of the comma as an offset, and if `locations` is + // enabled, it is given the location as a `{line, column}` object + // as second argument. + onInsertedSemicolon: null, + // `onTrailingComma` is similar to `onInsertedSemicolon`, but for + // trailing commas. + onTrailingComma: null, + // By default, reserved words are only enforced if ecmaVersion >= 5. + // Set `allowReserved` to a boolean value to explicitly turn this on + // an off. When this option has the value "never", reserved words + // and keywords can also not be used as property names. + allowReserved: null, + // When enabled, a return at the top level is not considered an + // error. + allowReturnOutsideFunction: false, + // When enabled, import/export statements are not constrained to + // appearing at the top of the program. + allowImportExportEverywhere: false, + // When enabled, await identifiers are allowed to appear at the top-level scope, + // but they are still not allowed in non-async functions. + allowAwaitOutsideFunction: false, + // When enabled, hashbang directive in the beginning of file + // is allowed and treated as a line comment. + allowHashBang: false, + // When `locations` is on, `loc` properties holding objects with + // `start` and `end` properties in `{line, column}` form (with + // line being 1-based and column 0-based) will be attached to the + // nodes. + locations: false, + // A function can be passed as `onToken` option, which will + // cause Acorn to call that function with object in the same + // format as tokens returned from `tokenizer().getToken()`. Note + // that you are not allowed to call the parser from the + // callback—that will corrupt its internal state. + onToken: null, + // A function can be passed as `onComment` option, which will + // cause Acorn to call that function with `(block, text, start, + // end)` parameters whenever a comment is skipped. `block` is a + // boolean indicating whether this is a block (`/* */`) comment, + // `text` is the content of the comment, and `start` and `end` are + // character offsets that denote the start and end of the comment. + // When the `locations` option is on, two more parameters are + // passed, the full `{line, column}` locations of the start and + // end of the comments. Note that you are not allowed to call the + // parser from the callback—that will corrupt its internal state. + onComment: null, + // Nodes have their start and end characters offsets recorded in + // `start` and `end` properties (directly on the node, rather than + // the `loc` object, which holds line/column data. To also add a + // [semi-standardized][range] `range` property holding a `[start, + // end]` array with the same numbers, set the `ranges` option to + // `true`. + // + // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678 + ranges: false, + // It is possible to parse multiple files into a single AST by + // passing the tree produced by parsing the first file as + // `program` option in subsequent parses. This will add the + // toplevel forms of the parsed file to the `Program` (top) node + // of an existing parse tree. + program: null, + // When `locations` is on, you can pass this to record the source + // file in every node's `loc` object. + sourceFile: null, + // This value, if given, is stored in every node, whether + // `locations` is on or off. + directSourceFile: null, + // When enabled, parenthesized expressions are represented by + // (non-standard) ParenthesizedExpression nodes + preserveParens: false + }; + + // Interpret and default an options object + + function getOptions(opts) { + var options = {}; + + for (var opt in defaultOptions) + { options[opt] = opts && has(opts, opt) ? opts[opt] : defaultOptions[opt]; } + + if (options.ecmaVersion >= 2015) + { options.ecmaVersion -= 2009; } + + if (options.allowReserved == null) + { options.allowReserved = options.ecmaVersion < 5; } + + if (isArray(options.onToken)) { + var tokens = options.onToken; + options.onToken = function (token) { return tokens.push(token); }; + } + if (isArray(options.onComment)) + { options.onComment = pushComment(options, options.onComment); } + + return options + } + + function pushComment(options, array) { + return function(block, text, start, end, startLoc, endLoc) { + var comment = { + type: block ? "Block" : "Line", + value: text, + start: start, + end: end + }; + if (options.locations) + { comment.loc = new SourceLocation(this, startLoc, endLoc); } + if (options.ranges) + { comment.range = [start, end]; } + array.push(comment); + } + } + + // Each scope gets a bitset that may contain these flags + var + SCOPE_TOP = 1, + SCOPE_FUNCTION = 2, + SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION, + SCOPE_ASYNC = 4, + SCOPE_GENERATOR = 8, + SCOPE_ARROW = 16, + SCOPE_SIMPLE_CATCH = 32, + SCOPE_SUPER = 64, + SCOPE_DIRECT_SUPER = 128; + + function functionFlags(async, generator) { + return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0) + } + + // Used in checkLVal and declareName to determine the type of a binding + var + BIND_NONE = 0, // Not a binding + BIND_VAR = 1, // Var-style binding + BIND_LEXICAL = 2, // Let- or const-style binding + BIND_FUNCTION = 3, // Function declaration + BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding + BIND_OUTSIDE = 5; // Special case for function names as bound inside the function + + var Parser = function Parser(options, input, startPos) { + this.options = options = getOptions(options); + this.sourceFile = options.sourceFile; + this.keywords = wordsRegexp(keywords[options.ecmaVersion >= 6 ? 6 : options.sourceType === "module" ? "5module" : 5]); + var reserved = ""; + if (options.allowReserved !== true) { + for (var v = options.ecmaVersion;; v--) + { if (reserved = reservedWords[v]) { break } } + if (options.sourceType === "module") { reserved += " await"; } + } + this.reservedWords = wordsRegexp(reserved); + var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict; + this.reservedWordsStrict = wordsRegexp(reservedStrict); + this.reservedWordsStrictBind = wordsRegexp(reservedStrict + " " + reservedWords.strictBind); + this.input = String(input); + + // Used to signal to callers of `readWord1` whether the word + // contained any escape sequences. This is needed because words with + // escape sequences must not be interpreted as keywords. + this.containsEsc = false; + + // Set up token state + + // The current position of the tokenizer in the input. + if (startPos) { + this.pos = startPos; + this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1; + this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length; + } else { + this.pos = this.lineStart = 0; + this.curLine = 1; + } + + // Properties of the current token: + // Its type + this.type = types.eof; + // For tokens that include more information than their type, the value + this.value = null; + // Its start and end offset + this.start = this.end = this.pos; + // And, if locations are used, the {line, column} object + // corresponding to those offsets + this.startLoc = this.endLoc = this.curPosition(); + + // Position information for the previous token + this.lastTokEndLoc = this.lastTokStartLoc = null; + this.lastTokStart = this.lastTokEnd = this.pos; + + // The context stack is used to superficially track syntactic + // context to predict whether a regular expression is allowed in a + // given position. + this.context = this.initialContext(); + this.exprAllowed = true; + + // Figure out if it's a module code. + this.inModule = options.sourceType === "module"; + this.strict = this.inModule || this.strictDirective(this.pos); + + // Used to signify the start of a potential arrow function + this.potentialArrowAt = -1; + + // Positions to delayed-check that yield/await does not exist in default parameters. + this.yieldPos = this.awaitPos = this.awaitIdentPos = 0; + // Labels in scope. + this.labels = []; + // Thus-far undefined exports. + this.undefinedExports = {}; + + // If enabled, skip leading hashbang line. + if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === "#!") + { this.skipLineComment(2); } + + // Scope tracking for duplicate variable names (see scope.js) + this.scopeStack = []; + this.enterScope(SCOPE_TOP); + + // For RegExp validation + this.regexpState = null; + }; + + var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true } }; + + Parser.prototype.parse = function parse () { + var node = this.options.program || this.startNode(); + this.nextToken(); + return this.parseTopLevel(node) + }; + + prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 }; + prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 }; + prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 }; + prototypeAccessors.allowSuper.get = function () { return (this.currentThisScope().flags & SCOPE_SUPER) > 0 }; + prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 }; + prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) }; + + // Switch to a getter for 7.0.0. + Parser.prototype.inNonArrowFunction = function inNonArrowFunction () { return (this.currentThisScope().flags & SCOPE_FUNCTION) > 0 }; + + Parser.extend = function extend () { + var plugins = [], len = arguments.length; + while ( len-- ) plugins[ len ] = arguments[ len ]; + + var cls = this; + for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); } + return cls + }; + + Parser.parse = function parse (input, options) { + return new this(options, input).parse() + }; + + Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) { + var parser = new this(options, input, pos); + parser.nextToken(); + return parser.parseExpression() + }; + + Parser.tokenizer = function tokenizer (input, options) { + return new this(options, input) + }; + + Object.defineProperties( Parser.prototype, prototypeAccessors ); + + var pp = Parser.prototype; + + // ## Parser utilities + + var literal = /^(?:'((?:\\.|[^'])*?)'|"((?:\\.|[^"])*?)")/; + pp.strictDirective = function(start) { + for (;;) { + // Try to find string literal. + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + var match = literal.exec(this.input.slice(start)); + if (!match) { return false } + if ((match[1] || match[2]) === "use strict") { + skipWhiteSpace.lastIndex = start + match[0].length; + var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length; + var next = this.input.charAt(end); + return next === ";" || next === "}" || + (lineBreak.test(spaceAfter[0]) && + !(/[(`.[+\-/*%<>=,?^&]/.test(next) || next === "!" && this.input.charAt(end + 1) === "=")) + } + start += match[0].length; + + // Skip semicolon, if any. + skipWhiteSpace.lastIndex = start; + start += skipWhiteSpace.exec(this.input)[0].length; + if (this.input[start] === ";") + { start++; } + } + }; + + // Predicate that tests whether the next token is of the given + // type, and if yes, consumes it as a side effect. + + pp.eat = function(type) { + if (this.type === type) { + this.next(); + return true + } else { + return false + } + }; + + // Tests whether parsed token is a contextual keyword. + + pp.isContextual = function(name) { + return this.type === types.name && this.value === name && !this.containsEsc + }; + + // Consumes contextual keyword if possible. + + pp.eatContextual = function(name) { + if (!this.isContextual(name)) { return false } + this.next(); + return true + }; + + // Asserts that following token is given contextual keyword. + + pp.expectContextual = function(name) { + if (!this.eatContextual(name)) { this.unexpected(); } + }; + + // Test whether a semicolon can be inserted at the current position. + + pp.canInsertSemicolon = function() { + return this.type === types.eof || + this.type === types.braceR || + lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) + }; + + pp.insertSemicolon = function() { + if (this.canInsertSemicolon()) { + if (this.options.onInsertedSemicolon) + { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); } + return true + } + }; + + // Consume a semicolon, or, failing that, see if we are allowed to + // pretend that there is a semicolon at this position. + + pp.semicolon = function() { + if (!this.eat(types.semi) && !this.insertSemicolon()) { this.unexpected(); } + }; + + pp.afterTrailingComma = function(tokType, notNext) { + if (this.type === tokType) { + if (this.options.onTrailingComma) + { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); } + if (!notNext) + { this.next(); } + return true + } + }; + + // Expect a token of a given type. If found, consume it, otherwise, + // raise an unexpected token error. + + pp.expect = function(type) { + this.eat(type) || this.unexpected(); + }; + + // Raise an unexpected token error. + + pp.unexpected = function(pos) { + this.raise(pos != null ? pos : this.start, "Unexpected token"); + }; + + function DestructuringErrors() { + this.shorthandAssign = + this.trailingComma = + this.parenthesizedAssign = + this.parenthesizedBind = + this.doubleProto = + -1; + } + + pp.checkPatternErrors = function(refDestructuringErrors, isAssign) { + if (!refDestructuringErrors) { return } + if (refDestructuringErrors.trailingComma > -1) + { this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); } + var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind; + if (parens > -1) { this.raiseRecoverable(parens, "Parenthesized pattern"); } + }; + + pp.checkExpressionErrors = function(refDestructuringErrors, andThrow) { + if (!refDestructuringErrors) { return false } + var shorthandAssign = refDestructuringErrors.shorthandAssign; + var doubleProto = refDestructuringErrors.doubleProto; + if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 } + if (shorthandAssign >= 0) + { this.raise(shorthandAssign, "Shorthand property assignments are valid only in destructuring patterns"); } + if (doubleProto >= 0) + { this.raiseRecoverable(doubleProto, "Redefinition of __proto__ property"); } + }; + + pp.checkYieldAwaitInDefaultParams = function() { + if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos)) + { this.raise(this.yieldPos, "Yield expression cannot be a default value"); } + if (this.awaitPos) + { this.raise(this.awaitPos, "Await expression cannot be a default value"); } + }; + + pp.isSimpleAssignTarget = function(expr) { + if (expr.type === "ParenthesizedExpression") + { return this.isSimpleAssignTarget(expr.expression) } + return expr.type === "Identifier" || expr.type === "MemberExpression" + }; + + var pp$1 = Parser.prototype; + + // ### Statement parsing + + // Parse a program. Initializes the parser, reads any number of + // statements, and wraps them in a Program node. Optionally takes a + // `program` argument. If present, the statements will be appended + // to its body instead of creating a new node. + + pp$1.parseTopLevel = function(node) { + var exports = {}; + if (!node.body) { node.body = []; } + while (this.type !== types.eof) { + var stmt = this.parseStatement(null, true, exports); + node.body.push(stmt); + } + if (this.inModule) + { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1) + { + var name = list[i]; + + this.raiseRecoverable(this.undefinedExports[name].start, ("Export '" + name + "' is not defined")); + } } + this.adaptDirectivePrologue(node.body); + this.next(); + node.sourceType = this.options.sourceType; + return this.finishNode(node, "Program") + }; + + var loopLabel = {kind: "loop"}, switchLabel = {kind: "switch"}; + + pp$1.isLet = function(context) { + if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { return false } + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + // For ambiguous cases, determine if a LexicalDeclaration (or only a + // Statement) is allowed here. If context is not empty then only a Statement + // is allowed. However, `let [` is an explicit negative lookahead for + // ExpressionStatement, so special-case it first. + if (nextCh === 91) { return true } // '[' + if (context) { return false } + + if (nextCh === 123) { return true } // '{' + if (isIdentifierStart(nextCh, true)) { + var pos = next + 1; + while (isIdentifierChar(this.input.charCodeAt(pos), true)) { ++pos; } + var ident = this.input.slice(next, pos); + if (!keywordRelationalOperator.test(ident)) { return true } + } + return false + }; + + // check 'async [no LineTerminator here] function' + // - 'async /*foo*/ function' is OK. + // - 'async /*\n*/ function' is invalid. + pp$1.isAsyncFunction = function() { + if (this.options.ecmaVersion < 8 || !this.isContextual("async")) + { return false } + + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length; + return !lineBreak.test(this.input.slice(this.pos, next)) && + this.input.slice(next, next + 8) === "function" && + (next + 8 === this.input.length || !isIdentifierChar(this.input.charAt(next + 8))) + }; + + // Parse a single statement. + // + // If expecting a statement and finding a slash operator, parse a + // regular expression literal. This is to handle cases like + // `if (foo) /blah/.exec(foo)`, where looking at the previous token + // does not help. + + pp$1.parseStatement = function(context, topLevel, exports) { + var starttype = this.type, node = this.startNode(), kind; + + if (this.isLet(context)) { + starttype = types._var; + kind = "let"; + } + + // Most types of statements are recognized by the keyword they + // start with. Many are trivial to parse, some require a bit of + // complexity. + + switch (starttype) { + case types._break: case types._continue: return this.parseBreakContinueStatement(node, starttype.keyword) + case types._debugger: return this.parseDebuggerStatement(node) + case types._do: return this.parseDoStatement(node) + case types._for: return this.parseForStatement(node) + case types._function: + // Function as sole body of either an if statement or a labeled statement + // works, but not when it is part of a labeled statement that is the sole + // body of an if statement. + if ((context && (this.strict || context !== "if" && context !== "label")) && this.options.ecmaVersion >= 6) { this.unexpected(); } + return this.parseFunctionStatement(node, false, !context) + case types._class: + if (context) { this.unexpected(); } + return this.parseClass(node, true) + case types._if: return this.parseIfStatement(node) + case types._return: return this.parseReturnStatement(node) + case types._switch: return this.parseSwitchStatement(node) + case types._throw: return this.parseThrowStatement(node) + case types._try: return this.parseTryStatement(node) + case types._const: case types._var: + kind = kind || this.value; + if (context && kind !== "var") { this.unexpected(); } + return this.parseVarStatement(node, kind) + case types._while: return this.parseWhileStatement(node) + case types._with: return this.parseWithStatement(node) + case types.braceL: return this.parseBlock(true, node) + case types.semi: return this.parseEmptyStatement(node) + case types._export: + case types._import: + if (this.options.ecmaVersion > 10 && starttype === types._import) { + skipWhiteSpace.lastIndex = this.pos; + var skip = skipWhiteSpace.exec(this.input); + var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next); + if (nextCh === 40 || nextCh === 46) // '(' or '.' + { return this.parseExpressionStatement(node, this.parseExpression()) } + } + + if (!this.options.allowImportExportEverywhere) { + if (!topLevel) + { this.raise(this.start, "'import' and 'export' may only appear at the top level"); } + if (!this.inModule) + { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); } + } + return starttype === types._import ? this.parseImport(node) : this.parseExport(node, exports) + + // If the statement does not start with a statement keyword or a + // brace, it's an ExpressionStatement or LabeledStatement. We + // simply start parsing an expression, and afterwards, if the + // next token is a colon and the expression was a simple + // Identifier node, we switch to interpreting it as a label. + default: + if (this.isAsyncFunction()) { + if (context) { this.unexpected(); } + this.next(); + return this.parseFunctionStatement(node, true, !context) + } + + var maybeName = this.value, expr = this.parseExpression(); + if (starttype === types.name && expr.type === "Identifier" && this.eat(types.colon)) + { return this.parseLabeledStatement(node, maybeName, expr, context) } + else { return this.parseExpressionStatement(node, expr) } + } + }; + + pp$1.parseBreakContinueStatement = function(node, keyword) { + var isBreak = keyword === "break"; + this.next(); + if (this.eat(types.semi) || this.insertSemicolon()) { node.label = null; } + else if (this.type !== types.name) { this.unexpected(); } + else { + node.label = this.parseIdent(); + this.semicolon(); + } + + // Verify that there is an actual destination to break or + // continue to. + var i = 0; + for (; i < this.labels.length; ++i) { + var lab = this.labels[i]; + if (node.label == null || lab.name === node.label.name) { + if (lab.kind != null && (isBreak || lab.kind === "loop")) { break } + if (node.label && isBreak) { break } + } + } + if (i === this.labels.length) { this.raise(node.start, "Unsyntactic " + keyword); } + return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement") + }; + + pp$1.parseDebuggerStatement = function(node) { + this.next(); + this.semicolon(); + return this.finishNode(node, "DebuggerStatement") + }; + + pp$1.parseDoStatement = function(node) { + this.next(); + this.labels.push(loopLabel); + node.body = this.parseStatement("do"); + this.labels.pop(); + this.expect(types._while); + node.test = this.parseParenExpression(); + if (this.options.ecmaVersion >= 6) + { this.eat(types.semi); } + else + { this.semicolon(); } + return this.finishNode(node, "DoWhileStatement") + }; + + // Disambiguating between a `for` and a `for`/`in` or `for`/`of` + // loop is non-trivial. Basically, we have to parse the init `var` + // statement or expression, disallowing the `in` operator (see + // the second parameter to `parseExpression`), and then check + // whether the next token is `in` or `of`. When there is no init + // part (semicolon immediately after the opening parenthesis), it + // is a regular `for` loop. + + pp$1.parseForStatement = function(node) { + this.next(); + var awaitAt = (this.options.ecmaVersion >= 9 && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction)) && this.eatContextual("await")) ? this.lastTokStart : -1; + this.labels.push(loopLabel); + this.enterScope(0); + this.expect(types.parenL); + if (this.type === types.semi) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, null) + } + var isLet = this.isLet(); + if (this.type === types._var || this.type === types._const || isLet) { + var init$1 = this.startNode(), kind = isLet ? "let" : this.value; + this.next(); + this.parseVar(init$1, true, kind); + this.finishNode(init$1, "VariableDeclaration"); + if ((this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + return this.parseForIn(node, init$1) + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init$1) + } + var refDestructuringErrors = new DestructuringErrors; + var init = this.parseExpression(true, refDestructuringErrors); + if (this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) { + if (this.options.ecmaVersion >= 9) { + if (this.type === types._in) { + if (awaitAt > -1) { this.unexpected(awaitAt); } + } else { node.await = awaitAt > -1; } + } + this.toAssignable(init, false, refDestructuringErrors); + this.checkLVal(init); + return this.parseForIn(node, init) + } else { + this.checkExpressionErrors(refDestructuringErrors, true); + } + if (awaitAt > -1) { this.unexpected(awaitAt); } + return this.parseFor(node, init) + }; + + pp$1.parseFunctionStatement = function(node, isAsync, declarationPosition) { + this.next(); + return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync) + }; + + pp$1.parseIfStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + // allow function declarations in branches, but only in non-strict mode + node.consequent = this.parseStatement("if"); + node.alternate = this.eat(types._else) ? this.parseStatement("if") : null; + return this.finishNode(node, "IfStatement") + }; + + pp$1.parseReturnStatement = function(node) { + if (!this.inFunction && !this.options.allowReturnOutsideFunction) + { this.raise(this.start, "'return' outside of function"); } + this.next(); + + // In `return` (and `break`/`continue`), the keywords with + // optional arguments, we eagerly look for a semicolon or the + // possibility to insert one. + + if (this.eat(types.semi) || this.insertSemicolon()) { node.argument = null; } + else { node.argument = this.parseExpression(); this.semicolon(); } + return this.finishNode(node, "ReturnStatement") + }; + + pp$1.parseSwitchStatement = function(node) { + this.next(); + node.discriminant = this.parseParenExpression(); + node.cases = []; + this.expect(types.braceL); + this.labels.push(switchLabel); + this.enterScope(0); + + // Statements under must be grouped (by label) in SwitchCase + // nodes. `cur` is used to keep the node that we are currently + // adding statements to. + + var cur; + for (var sawDefault = false; this.type !== types.braceR;) { + if (this.type === types._case || this.type === types._default) { + var isCase = this.type === types._case; + if (cur) { this.finishNode(cur, "SwitchCase"); } + node.cases.push(cur = this.startNode()); + cur.consequent = []; + this.next(); + if (isCase) { + cur.test = this.parseExpression(); + } else { + if (sawDefault) { this.raiseRecoverable(this.lastTokStart, "Multiple default clauses"); } + sawDefault = true; + cur.test = null; + } + this.expect(types.colon); + } else { + if (!cur) { this.unexpected(); } + cur.consequent.push(this.parseStatement(null)); + } + } + this.exitScope(); + if (cur) { this.finishNode(cur, "SwitchCase"); } + this.next(); // Closing brace + this.labels.pop(); + return this.finishNode(node, "SwitchStatement") + }; + + pp$1.parseThrowStatement = function(node) { + this.next(); + if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) + { this.raise(this.lastTokEnd, "Illegal newline after throw"); } + node.argument = this.parseExpression(); + this.semicolon(); + return this.finishNode(node, "ThrowStatement") + }; + + // Reused empty array added for node fields that are always empty. + + var empty = []; + + pp$1.parseTryStatement = function(node) { + this.next(); + node.block = this.parseBlock(); + node.handler = null; + if (this.type === types._catch) { + var clause = this.startNode(); + this.next(); + if (this.eat(types.parenL)) { + clause.param = this.parseBindingAtom(); + var simple = clause.param.type === "Identifier"; + this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0); + this.checkLVal(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL); + this.expect(types.parenR); + } else { + if (this.options.ecmaVersion < 10) { this.unexpected(); } + clause.param = null; + this.enterScope(0); + } + clause.body = this.parseBlock(false); + this.exitScope(); + node.handler = this.finishNode(clause, "CatchClause"); + } + node.finalizer = this.eat(types._finally) ? this.parseBlock() : null; + if (!node.handler && !node.finalizer) + { this.raise(node.start, "Missing catch or finally clause"); } + return this.finishNode(node, "TryStatement") + }; + + pp$1.parseVarStatement = function(node, kind) { + this.next(); + this.parseVar(node, false, kind); + this.semicolon(); + return this.finishNode(node, "VariableDeclaration") + }; + + pp$1.parseWhileStatement = function(node) { + this.next(); + node.test = this.parseParenExpression(); + this.labels.push(loopLabel); + node.body = this.parseStatement("while"); + this.labels.pop(); + return this.finishNode(node, "WhileStatement") + }; + + pp$1.parseWithStatement = function(node) { + if (this.strict) { this.raise(this.start, "'with' in strict mode"); } + this.next(); + node.object = this.parseParenExpression(); + node.body = this.parseStatement("with"); + return this.finishNode(node, "WithStatement") + }; + + pp$1.parseEmptyStatement = function(node) { + this.next(); + return this.finishNode(node, "EmptyStatement") + }; + + pp$1.parseLabeledStatement = function(node, maybeName, expr, context) { + for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1) + { + var label = list[i$1]; + + if (label.name === maybeName) + { this.raise(expr.start, "Label '" + maybeName + "' is already declared"); + } } + var kind = this.type.isLoop ? "loop" : this.type === types._switch ? "switch" : null; + for (var i = this.labels.length - 1; i >= 0; i--) { + var label$1 = this.labels[i]; + if (label$1.statementStart === node.start) { + // Update information about previous labels on this node + label$1.statementStart = this.start; + label$1.kind = kind; + } else { break } + } + this.labels.push({name: maybeName, kind: kind, statementStart: this.start}); + node.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label"); + this.labels.pop(); + node.label = expr; + return this.finishNode(node, "LabeledStatement") + }; + + pp$1.parseExpressionStatement = function(node, expr) { + node.expression = expr; + this.semicolon(); + return this.finishNode(node, "ExpressionStatement") + }; + + // Parse a semicolon-enclosed block of statements, handling `"use + // strict"` declarations when `allowStrict` is true (used for + // function bodies). + + pp$1.parseBlock = function(createNewLexicalScope, node, exitStrict) { + if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true; + if ( node === void 0 ) node = this.startNode(); + + node.body = []; + this.expect(types.braceL); + if (createNewLexicalScope) { this.enterScope(0); } + while (this.type !== types.braceR) { + var stmt = this.parseStatement(null); + node.body.push(stmt); + } + if (exitStrict) { this.strict = false; } + this.next(); + if (createNewLexicalScope) { this.exitScope(); } + return this.finishNode(node, "BlockStatement") + }; + + // Parse a regular `for` loop. The disambiguation code in + // `parseStatement` will already have parsed the init statement or + // expression. + + pp$1.parseFor = function(node, init) { + node.init = init; + this.expect(types.semi); + node.test = this.type === types.semi ? null : this.parseExpression(); + this.expect(types.semi); + node.update = this.type === types.parenR ? null : this.parseExpression(); + this.expect(types.parenR); + node.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node, "ForStatement") + }; + + // Parse a `for`/`in` and `for`/`of` loop, which are almost + // same from parser's perspective. + + pp$1.parseForIn = function(node, init) { + var isForIn = this.type === types._in; + this.next(); + + if ( + init.type === "VariableDeclaration" && + init.declarations[0].init != null && + ( + !isForIn || + this.options.ecmaVersion < 8 || + this.strict || + init.kind !== "var" || + init.declarations[0].id.type !== "Identifier" + ) + ) { + this.raise( + init.start, + ((isForIn ? "for-in" : "for-of") + " loop variable declaration may not have an initializer") + ); + } else if (init.type === "AssignmentPattern") { + this.raise(init.start, "Invalid left-hand side in for-loop"); + } + node.left = init; + node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign(); + this.expect(types.parenR); + node.body = this.parseStatement("for"); + this.exitScope(); + this.labels.pop(); + return this.finishNode(node, isForIn ? "ForInStatement" : "ForOfStatement") + }; + + // Parse a list of variable declarations. + + pp$1.parseVar = function(node, isFor, kind) { + node.declarations = []; + node.kind = kind; + for (;;) { + var decl = this.startNode(); + this.parseVarId(decl, kind); + if (this.eat(types.eq)) { + decl.init = this.parseMaybeAssign(isFor); + } else if (kind === "const" && !(this.type === types._in || (this.options.ecmaVersion >= 6 && this.isContextual("of")))) { + this.unexpected(); + } else if (decl.id.type !== "Identifier" && !(isFor && (this.type === types._in || this.isContextual("of")))) { + this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value"); + } else { + decl.init = null; + } + node.declarations.push(this.finishNode(decl, "VariableDeclarator")); + if (!this.eat(types.comma)) { break } + } + return node + }; + + pp$1.parseVarId = function(decl, kind) { + decl.id = this.parseBindingAtom(); + this.checkLVal(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false); + }; + + var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4; + + // Parse a function declaration or literal (depending on the + // `statement & FUNC_STATEMENT`). + + // Remove `allowExpressionBody` for 7.0.0, as it is only called with false + pp$1.parseFunction = function(node, statement, allowExpressionBody, isAsync) { + this.initFunction(node); + if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) { + if (this.type === types.star && (statement & FUNC_HANGING_STATEMENT)) + { this.unexpected(); } + node.generator = this.eat(types.star); + } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + if (statement & FUNC_STATEMENT) { + node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types.name ? null : this.parseIdent(); + if (node.id && !(statement & FUNC_HANGING_STATEMENT)) + // If it is a regular function declaration in sloppy mode, then it is + // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding + // mode depends on properties of the current scope (see + // treatFunctionsAsVar). + { this.checkLVal(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); } + } + + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(node.async, node.generator)); + + if (!(statement & FUNC_STATEMENT)) + { node.id = this.type === types.name ? this.parseIdent() : null; } + + this.parseFunctionParams(node); + this.parseFunctionBody(node, allowExpressionBody, false); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node, (statement & FUNC_STATEMENT) ? "FunctionDeclaration" : "FunctionExpression") + }; + + pp$1.parseFunctionParams = function(node) { + this.expect(types.parenL); + node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + }; + + // Parse a class declaration or literal (depending on the + // `isStatement` parameter). + + pp$1.parseClass = function(node, isStatement) { + this.next(); + + // ecma-262 14.6 Class Definitions + // A class definition is always strict mode code. + var oldStrict = this.strict; + this.strict = true; + + this.parseClassId(node, isStatement); + this.parseClassSuper(node); + var classBody = this.startNode(); + var hadConstructor = false; + classBody.body = []; + this.expect(types.braceL); + while (this.type !== types.braceR) { + var element = this.parseClassElement(node.superClass !== null); + if (element) { + classBody.body.push(element); + if (element.type === "MethodDefinition" && element.kind === "constructor") { + if (hadConstructor) { this.raise(element.start, "Duplicate constructor in the same class"); } + hadConstructor = true; + } + } + } + this.strict = oldStrict; + this.next(); + node.body = this.finishNode(classBody, "ClassBody"); + return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression") + }; + + pp$1.parseClassElement = function(constructorAllowsSuper) { + var this$1 = this; + + if (this.eat(types.semi)) { return null } + + var method = this.startNode(); + var tryContextual = function (k, noLineBreak) { + if ( noLineBreak === void 0 ) noLineBreak = false; + + var start = this$1.start, startLoc = this$1.startLoc; + if (!this$1.eatContextual(k)) { return false } + if (this$1.type !== types.parenL && (!noLineBreak || !this$1.canInsertSemicolon())) { return true } + if (method.key) { this$1.unexpected(); } + method.computed = false; + method.key = this$1.startNodeAt(start, startLoc); + method.key.name = k; + this$1.finishNode(method.key, "Identifier"); + return false + }; + + method.kind = "method"; + method.static = tryContextual("static"); + var isGenerator = this.eat(types.star); + var isAsync = false; + if (!isGenerator) { + if (this.options.ecmaVersion >= 8 && tryContextual("async", true)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star); + } else if (tryContextual("get")) { + method.kind = "get"; + } else if (tryContextual("set")) { + method.kind = "set"; + } + } + if (!method.key) { this.parsePropertyName(method); } + var key = method.key; + var allowsDirectSuper = false; + if (!method.computed && !method.static && (key.type === "Identifier" && key.name === "constructor" || + key.type === "Literal" && key.value === "constructor")) { + if (method.kind !== "method") { this.raise(key.start, "Constructor can't have get/set modifier"); } + if (isGenerator) { this.raise(key.start, "Constructor can't be a generator"); } + if (isAsync) { this.raise(key.start, "Constructor can't be an async method"); } + method.kind = "constructor"; + allowsDirectSuper = constructorAllowsSuper; + } else if (method.static && key.type === "Identifier" && key.name === "prototype") { + this.raise(key.start, "Classes may not have a static property named prototype"); + } + this.parseClassMethod(method, isGenerator, isAsync, allowsDirectSuper); + if (method.kind === "get" && method.value.params.length !== 0) + { this.raiseRecoverable(method.value.start, "getter should have no params"); } + if (method.kind === "set" && method.value.params.length !== 1) + { this.raiseRecoverable(method.value.start, "setter should have exactly one param"); } + if (method.kind === "set" && method.value.params[0].type === "RestElement") + { this.raiseRecoverable(method.value.params[0].start, "Setter cannot use rest params"); } + return method + }; + + pp$1.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) { + method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper); + return this.finishNode(method, "MethodDefinition") + }; + + pp$1.parseClassId = function(node, isStatement) { + if (this.type === types.name) { + node.id = this.parseIdent(); + if (isStatement) + { this.checkLVal(node.id, BIND_LEXICAL, false); } + } else { + if (isStatement === true) + { this.unexpected(); } + node.id = null; + } + }; + + pp$1.parseClassSuper = function(node) { + node.superClass = this.eat(types._extends) ? this.parseExprSubscripts() : null; + }; + + // Parses module export declaration. + + pp$1.parseExport = function(node, exports) { + this.next(); + // export * from '...' + if (this.eat(types.star)) { + if (this.options.ecmaVersion >= 11) { + if (this.eatContextual("as")) { + node.exported = this.parseIdent(true); + this.checkExport(exports, node.exported.name, this.lastTokStart); + } else { + node.exported = null; + } + } + this.expectContextual("from"); + if (this.type !== types.string) { this.unexpected(); } + node.source = this.parseExprAtom(); + this.semicolon(); + return this.finishNode(node, "ExportAllDeclaration") + } + if (this.eat(types._default)) { // export default ... + this.checkExport(exports, "default", this.lastTokStart); + var isAsync; + if (this.type === types._function || (isAsync = this.isAsyncFunction())) { + var fNode = this.startNode(); + this.next(); + if (isAsync) { this.next(); } + node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync); + } else if (this.type === types._class) { + var cNode = this.startNode(); + node.declaration = this.parseClass(cNode, "nullableID"); + } else { + node.declaration = this.parseMaybeAssign(); + this.semicolon(); + } + return this.finishNode(node, "ExportDefaultDeclaration") + } + // export var|const|let|function|class ... + if (this.shouldParseExportStatement()) { + node.declaration = this.parseStatement(null); + if (node.declaration.type === "VariableDeclaration") + { this.checkVariableExport(exports, node.declaration.declarations); } + else + { this.checkExport(exports, node.declaration.id.name, node.declaration.id.start); } + node.specifiers = []; + node.source = null; + } else { // export { x, y as z } [from '...'] + node.declaration = null; + node.specifiers = this.parseExportSpecifiers(exports); + if (this.eatContextual("from")) { + if (this.type !== types.string) { this.unexpected(); } + node.source = this.parseExprAtom(); + } else { + for (var i = 0, list = node.specifiers; i < list.length; i += 1) { + // check for keywords used as local names + var spec = list[i]; + + this.checkUnreserved(spec.local); + // check if export is defined + this.checkLocalExport(spec.local); + } + + node.source = null; + } + this.semicolon(); + } + return this.finishNode(node, "ExportNamedDeclaration") + }; + + pp$1.checkExport = function(exports, name, pos) { + if (!exports) { return } + if (has(exports, name)) + { this.raiseRecoverable(pos, "Duplicate export '" + name + "'"); } + exports[name] = true; + }; + + pp$1.checkPatternExport = function(exports, pat) { + var type = pat.type; + if (type === "Identifier") + { this.checkExport(exports, pat.name, pat.start); } + else if (type === "ObjectPattern") + { for (var i = 0, list = pat.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this.checkPatternExport(exports, prop); + } } + else if (type === "ArrayPattern") + { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) { + var elt = list$1[i$1]; + + if (elt) { this.checkPatternExport(exports, elt); } + } } + else if (type === "Property") + { this.checkPatternExport(exports, pat.value); } + else if (type === "AssignmentPattern") + { this.checkPatternExport(exports, pat.left); } + else if (type === "RestElement") + { this.checkPatternExport(exports, pat.argument); } + else if (type === "ParenthesizedExpression") + { this.checkPatternExport(exports, pat.expression); } + }; + + pp$1.checkVariableExport = function(exports, decls) { + if (!exports) { return } + for (var i = 0, list = decls; i < list.length; i += 1) + { + var decl = list[i]; + + this.checkPatternExport(exports, decl.id); + } + }; + + pp$1.shouldParseExportStatement = function() { + return this.type.keyword === "var" || + this.type.keyword === "const" || + this.type.keyword === "class" || + this.type.keyword === "function" || + this.isLet() || + this.isAsyncFunction() + }; + + // Parses a comma-separated list of module exports. + + pp$1.parseExportSpecifiers = function(exports) { + var nodes = [], first = true; + // export { x, y as z } [from '...'] + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + if (!first) { + this.expect(types.comma); + if (this.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var node = this.startNode(); + node.local = this.parseIdent(true); + node.exported = this.eatContextual("as") ? this.parseIdent(true) : node.local; + this.checkExport(exports, node.exported.name, node.exported.start); + nodes.push(this.finishNode(node, "ExportSpecifier")); + } + return nodes + }; + + // Parses import declaration. + + pp$1.parseImport = function(node) { + this.next(); + // import '...' + if (this.type === types.string) { + node.specifiers = empty; + node.source = this.parseExprAtom(); + } else { + node.specifiers = this.parseImportSpecifiers(); + this.expectContextual("from"); + node.source = this.type === types.string ? this.parseExprAtom() : this.unexpected(); + } + this.semicolon(); + return this.finishNode(node, "ImportDeclaration") + }; + + // Parses a comma-separated list of module imports. + + pp$1.parseImportSpecifiers = function() { + var nodes = [], first = true; + if (this.type === types.name) { + // import defaultObj, { x, y as z } from '...' + var node = this.startNode(); + node.local = this.parseIdent(); + this.checkLVal(node.local, BIND_LEXICAL); + nodes.push(this.finishNode(node, "ImportDefaultSpecifier")); + if (!this.eat(types.comma)) { return nodes } + } + if (this.type === types.star) { + var node$1 = this.startNode(); + this.next(); + this.expectContextual("as"); + node$1.local = this.parseIdent(); + this.checkLVal(node$1.local, BIND_LEXICAL); + nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier")); + return nodes + } + this.expect(types.braceL); + while (!this.eat(types.braceR)) { + if (!first) { + this.expect(types.comma); + if (this.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var node$2 = this.startNode(); + node$2.imported = this.parseIdent(true); + if (this.eatContextual("as")) { + node$2.local = this.parseIdent(); + } else { + this.checkUnreserved(node$2.imported); + node$2.local = node$2.imported; + } + this.checkLVal(node$2.local, BIND_LEXICAL); + nodes.push(this.finishNode(node$2, "ImportSpecifier")); + } + return nodes + }; + + // Set `ExpressionStatement#directive` property for directive prologues. + pp$1.adaptDirectivePrologue = function(statements) { + for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) { + statements[i].directive = statements[i].expression.raw.slice(1, -1); + } + }; + pp$1.isDirectiveCandidate = function(statement) { + return ( + statement.type === "ExpressionStatement" && + statement.expression.type === "Literal" && + typeof statement.expression.value === "string" && + // Reject parenthesized strings. + (this.input[statement.start] === "\"" || this.input[statement.start] === "'") + ) + }; + + var pp$2 = Parser.prototype; + + // Convert existing expression atom to assignable pattern + // if possible. + + pp$2.toAssignable = function(node, isBinding, refDestructuringErrors) { + if (this.options.ecmaVersion >= 6 && node) { + switch (node.type) { + case "Identifier": + if (this.inAsync && node.name === "await") + { this.raise(node.start, "Cannot use 'await' as identifier inside an async function"); } + break + + case "ObjectPattern": + case "ArrayPattern": + case "RestElement": + break + + case "ObjectExpression": + node.type = "ObjectPattern"; + if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + for (var i = 0, list = node.properties; i < list.length; i += 1) { + var prop = list[i]; + + this.toAssignable(prop, isBinding); + // Early error: + // AssignmentRestProperty[Yield, Await] : + // `...` DestructuringAssignmentTarget[Yield, Await] + // + // It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|. + if ( + prop.type === "RestElement" && + (prop.argument.type === "ArrayPattern" || prop.argument.type === "ObjectPattern") + ) { + this.raise(prop.argument.start, "Unexpected token"); + } + } + break + + case "Property": + // AssignmentProperty has type === "Property" + if (node.kind !== "init") { this.raise(node.key.start, "Object pattern can't contain getter or setter"); } + this.toAssignable(node.value, isBinding); + break + + case "ArrayExpression": + node.type = "ArrayPattern"; + if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + this.toAssignableList(node.elements, isBinding); + break + + case "SpreadElement": + node.type = "RestElement"; + this.toAssignable(node.argument, isBinding); + if (node.argument.type === "AssignmentPattern") + { this.raise(node.argument.start, "Rest elements cannot have a default value"); } + break + + case "AssignmentExpression": + if (node.operator !== "=") { this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); } + node.type = "AssignmentPattern"; + delete node.operator; + this.toAssignable(node.left, isBinding); + // falls through to AssignmentPattern + + case "AssignmentPattern": + break + + case "ParenthesizedExpression": + this.toAssignable(node.expression, isBinding, refDestructuringErrors); + break + + case "ChainExpression": + this.raiseRecoverable(node.start, "Optional chaining cannot appear in left-hand side"); + break + + case "MemberExpression": + if (!isBinding) { break } + + default: + this.raise(node.start, "Assigning to rvalue"); + } + } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); } + return node + }; + + // Convert list of expression atoms to binding list. + + pp$2.toAssignableList = function(exprList, isBinding) { + var end = exprList.length; + for (var i = 0; i < end; i++) { + var elt = exprList[i]; + if (elt) { this.toAssignable(elt, isBinding); } + } + if (end) { + var last = exprList[end - 1]; + if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier") + { this.unexpected(last.argument.start); } + } + return exprList + }; + + // Parses spread element. + + pp$2.parseSpread = function(refDestructuringErrors) { + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeAssign(false, refDestructuringErrors); + return this.finishNode(node, "SpreadElement") + }; + + pp$2.parseRestBinding = function() { + var node = this.startNode(); + this.next(); + + // RestElement inside of a function parameter must be an identifier + if (this.options.ecmaVersion === 6 && this.type !== types.name) + { this.unexpected(); } + + node.argument = this.parseBindingAtom(); + + return this.finishNode(node, "RestElement") + }; + + // Parses lvalue (assignable) atom. + + pp$2.parseBindingAtom = function() { + if (this.options.ecmaVersion >= 6) { + switch (this.type) { + case types.bracketL: + var node = this.startNode(); + this.next(); + node.elements = this.parseBindingList(types.bracketR, true, true); + return this.finishNode(node, "ArrayPattern") + + case types.braceL: + return this.parseObj(true) + } + } + return this.parseIdent() + }; + + pp$2.parseBindingList = function(close, allowEmpty, allowTrailingComma) { + var elts = [], first = true; + while (!this.eat(close)) { + if (first) { first = false; } + else { this.expect(types.comma); } + if (allowEmpty && this.type === types.comma) { + elts.push(null); + } else if (allowTrailingComma && this.afterTrailingComma(close)) { + break + } else if (this.type === types.ellipsis) { + var rest = this.parseRestBinding(); + this.parseBindingListItem(rest); + elts.push(rest); + if (this.type === types.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); } + this.expect(close); + break + } else { + var elem = this.parseMaybeDefault(this.start, this.startLoc); + this.parseBindingListItem(elem); + elts.push(elem); + } + } + return elts + }; + + pp$2.parseBindingListItem = function(param) { + return param + }; + + // Parses assignment pattern around given atom if possible. + + pp$2.parseMaybeDefault = function(startPos, startLoc, left) { + left = left || this.parseBindingAtom(); + if (this.options.ecmaVersion < 6 || !this.eat(types.eq)) { return left } + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.right = this.parseMaybeAssign(); + return this.finishNode(node, "AssignmentPattern") + }; + + // Verify that a node is an lval — something that can be assigned + // to. + // bindingType can be either: + // 'var' indicating that the lval creates a 'var' binding + // 'let' indicating that the lval creates a lexical ('let' or 'const') binding + // 'none' indicating that the binding should be checked for illegal identifiers, but not for duplicate references + + pp$2.checkLVal = function(expr, bindingType, checkClashes) { + if ( bindingType === void 0 ) bindingType = BIND_NONE; + + switch (expr.type) { + case "Identifier": + if (bindingType === BIND_LEXICAL && expr.name === "let") + { this.raiseRecoverable(expr.start, "let is disallowed as a lexically bound name"); } + if (this.strict && this.reservedWordsStrictBind.test(expr.name)) + { this.raiseRecoverable(expr.start, (bindingType ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); } + if (checkClashes) { + if (has(checkClashes, expr.name)) + { this.raiseRecoverable(expr.start, "Argument name clash"); } + checkClashes[expr.name] = true; + } + if (bindingType !== BIND_NONE && bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); } + break + + case "ChainExpression": + this.raiseRecoverable(expr.start, "Optional chaining cannot appear in left-hand side"); + break + + case "MemberExpression": + if (bindingType) { this.raiseRecoverable(expr.start, "Binding member expression"); } + break + + case "ObjectPattern": + for (var i = 0, list = expr.properties; i < list.length; i += 1) + { + var prop = list[i]; + + this.checkLVal(prop, bindingType, checkClashes); + } + break + + case "Property": + // AssignmentProperty has type === "Property" + this.checkLVal(expr.value, bindingType, checkClashes); + break + + case "ArrayPattern": + for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) { + var elem = list$1[i$1]; + + if (elem) { this.checkLVal(elem, bindingType, checkClashes); } + } + break + + case "AssignmentPattern": + this.checkLVal(expr.left, bindingType, checkClashes); + break + + case "RestElement": + this.checkLVal(expr.argument, bindingType, checkClashes); + break + + case "ParenthesizedExpression": + this.checkLVal(expr.expression, bindingType, checkClashes); + break + + default: + this.raise(expr.start, (bindingType ? "Binding" : "Assigning to") + " rvalue"); + } + }; + + // A recursive descent parser operates by defining functions for all + + var pp$3 = Parser.prototype; + + // Check if property name clashes with already added. + // Object/class getters and setters are not allowed to clash — + // either with each other or with an init property — and in + // strict mode, init properties are also not allowed to be repeated. + + pp$3.checkPropClash = function(prop, propHash, refDestructuringErrors) { + if (this.options.ecmaVersion >= 9 && prop.type === "SpreadElement") + { return } + if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand)) + { return } + var key = prop.key; + var name; + switch (key.type) { + case "Identifier": name = key.name; break + case "Literal": name = String(key.value); break + default: return + } + var kind = prop.kind; + if (this.options.ecmaVersion >= 6) { + if (name === "__proto__" && kind === "init") { + if (propHash.proto) { + if (refDestructuringErrors) { + if (refDestructuringErrors.doubleProto < 0) + { refDestructuringErrors.doubleProto = key.start; } + // Backwards-compat kludge. Can be removed in version 6.0 + } else { this.raiseRecoverable(key.start, "Redefinition of __proto__ property"); } + } + propHash.proto = true; + } + return + } + name = "$" + name; + var other = propHash[name]; + if (other) { + var redefinition; + if (kind === "init") { + redefinition = this.strict && other.init || other.get || other.set; + } else { + redefinition = other.init || other[kind]; + } + if (redefinition) + { this.raiseRecoverable(key.start, "Redefinition of property"); } + } else { + other = propHash[name] = { + init: false, + get: false, + set: false + }; + } + other[kind] = true; + }; + + // ### Expression parsing + + // These nest, from the most general expression type at the top to + // 'atomic', nondivisible expression types at the bottom. Most of + // the functions will simply let the function(s) below them parse, + // and, *if* the syntactic construct they handle is present, wrap + // the AST node that the inner parser gave them in another node. + + // Parse a full expression. The optional arguments are used to + // forbid the `in` operator (in for loops initalization expressions) + // and provide reference for storing '=' operator inside shorthand + // property assignment in contexts where both object expression + // and object pattern might appear (so it's possible to raise + // delayed syntax error at correct position). + + pp$3.parseExpression = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeAssign(noIn, refDestructuringErrors); + if (this.type === types.comma) { + var node = this.startNodeAt(startPos, startLoc); + node.expressions = [expr]; + while (this.eat(types.comma)) { node.expressions.push(this.parseMaybeAssign(noIn, refDestructuringErrors)); } + return this.finishNode(node, "SequenceExpression") + } + return expr + }; + + // Parse an assignment expression. This includes applications of + // operators like `+=`. + + pp$3.parseMaybeAssign = function(noIn, refDestructuringErrors, afterLeftParse) { + if (this.isContextual("yield")) { + if (this.inGenerator) { return this.parseYield(noIn) } + // The tokenizer will assume an expression is allowed after + // `yield`, but this isn't that kind of yield + else { this.exprAllowed = false; } + } + + var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1; + if (refDestructuringErrors) { + oldParenAssign = refDestructuringErrors.parenthesizedAssign; + oldTrailingComma = refDestructuringErrors.trailingComma; + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1; + } else { + refDestructuringErrors = new DestructuringErrors; + ownDestructuringErrors = true; + } + + var startPos = this.start, startLoc = this.startLoc; + if (this.type === types.parenL || this.type === types.name) + { this.potentialArrowAt = this.start; } + var left = this.parseMaybeConditional(noIn, refDestructuringErrors); + if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); } + if (this.type.isAssign) { + var node = this.startNodeAt(startPos, startLoc); + node.operator = this.value; + node.left = this.type === types.eq ? this.toAssignable(left, false, refDestructuringErrors) : left; + if (!ownDestructuringErrors) { + refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1; + } + if (refDestructuringErrors.shorthandAssign >= node.left.start) + { refDestructuringErrors.shorthandAssign = -1; } // reset because shorthand default was used correctly + this.checkLVal(left); + this.next(); + node.right = this.parseMaybeAssign(noIn); + return this.finishNode(node, "AssignmentExpression") + } else { + if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); } + } + if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; } + if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; } + return left + }; + + // Parse a ternary conditional (`?:`) operator. + + pp$3.parseMaybeConditional = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprOps(noIn, refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + if (this.eat(types.question)) { + var node = this.startNodeAt(startPos, startLoc); + node.test = expr; + node.consequent = this.parseMaybeAssign(); + this.expect(types.colon); + node.alternate = this.parseMaybeAssign(noIn); + return this.finishNode(node, "ConditionalExpression") + } + return expr + }; + + // Start the precedence parser. + + pp$3.parseExprOps = function(noIn, refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseMaybeUnary(refDestructuringErrors, false); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + return expr.start === startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, noIn) + }; + + // Parse binary operators with the operator precedence parsing + // algorithm. `left` is the left-hand side of the operator. + // `minPrec` provides context that allows the function to stop and + // defer further parser to one of its callers when it encounters an + // operator that has a lower precedence than the set it is parsing. + + pp$3.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, noIn) { + var prec = this.type.binop; + if (prec != null && (!noIn || this.type !== types._in)) { + if (prec > minPrec) { + var logical = this.type === types.logicalOR || this.type === types.logicalAND; + var coalesce = this.type === types.coalesce; + if (coalesce) { + // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions. + // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error. + prec = types.logicalAND.binop; + } + var op = this.value; + this.next(); + var startPos = this.start, startLoc = this.startLoc; + var right = this.parseExprOp(this.parseMaybeUnary(null, false), startPos, startLoc, prec, noIn); + var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce); + if ((logical && this.type === types.coalesce) || (coalesce && (this.type === types.logicalOR || this.type === types.logicalAND))) { + this.raiseRecoverable(this.start, "Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses"); + } + return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, noIn) + } + } + return left + }; + + pp$3.buildBinary = function(startPos, startLoc, left, right, op, logical) { + var node = this.startNodeAt(startPos, startLoc); + node.left = left; + node.operator = op; + node.right = right; + return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression") + }; + + // Parse unary operators, both prefix and postfix. + + pp$3.parseMaybeUnary = function(refDestructuringErrors, sawUnary) { + var startPos = this.start, startLoc = this.startLoc, expr; + if (this.isContextual("await") && (this.inAsync || (!this.inFunction && this.options.allowAwaitOutsideFunction))) { + expr = this.parseAwait(); + sawUnary = true; + } else if (this.type.prefix) { + var node = this.startNode(), update = this.type === types.incDec; + node.operator = this.value; + node.prefix = true; + this.next(); + node.argument = this.parseMaybeUnary(null, true); + this.checkExpressionErrors(refDestructuringErrors, true); + if (update) { this.checkLVal(node.argument); } + else if (this.strict && node.operator === "delete" && + node.argument.type === "Identifier") + { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); } + else { sawUnary = true; } + expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression"); + } else { + expr = this.parseExprSubscripts(refDestructuringErrors); + if (this.checkExpressionErrors(refDestructuringErrors)) { return expr } + while (this.type.postfix && !this.canInsertSemicolon()) { + var node$1 = this.startNodeAt(startPos, startLoc); + node$1.operator = this.value; + node$1.prefix = false; + node$1.argument = expr; + this.checkLVal(expr); + this.next(); + expr = this.finishNode(node$1, "UpdateExpression"); + } + } + + if (!sawUnary && this.eat(types.starstar)) + { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false), "**", false) } + else + { return expr } + }; + + // Parse call, dot, and `[]`-subscript expressions. + + pp$3.parseExprSubscripts = function(refDestructuringErrors) { + var startPos = this.start, startLoc = this.startLoc; + var expr = this.parseExprAtom(refDestructuringErrors); + if (expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")") + { return expr } + var result = this.parseSubscripts(expr, startPos, startLoc); + if (refDestructuringErrors && result.type === "MemberExpression") { + if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; } + if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; } + } + return result + }; + + pp$3.parseSubscripts = function(base, startPos, startLoc, noCalls) { + var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === "Identifier" && base.name === "async" && + this.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 && + this.potentialArrowAt === base.start; + var optionalChained = false; + + while (true) { + var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained); + + if (element.optional) { optionalChained = true; } + if (element === base || element.type === "ArrowFunctionExpression") { + if (optionalChained) { + var chainNode = this.startNodeAt(startPos, startLoc); + chainNode.expression = element; + element = this.finishNode(chainNode, "ChainExpression"); + } + return element + } + + base = element; + } + }; + + pp$3.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained) { + var optionalSupported = this.options.ecmaVersion >= 11; + var optional = optionalSupported && this.eat(types.questionDot); + if (noCalls && optional) { this.raise(this.lastTokStart, "Optional chaining cannot appear in the callee of new expressions"); } + + var computed = this.eat(types.bracketL); + if (computed || (optional && this.type !== types.parenL && this.type !== types.backQuote) || this.eat(types.dot)) { + var node = this.startNodeAt(startPos, startLoc); + node.object = base; + node.property = computed ? this.parseExpression() : this.parseIdent(this.options.allowReserved !== "never"); + node.computed = !!computed; + if (computed) { this.expect(types.bracketR); } + if (optionalSupported) { + node.optional = optional; + } + base = this.finishNode(node, "MemberExpression"); + } else if (!noCalls && this.eat(types.parenL)) { + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + var exprList = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors); + if (maybeAsyncArrow && !optional && !this.canInsertSemicolon() && this.eat(types.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + if (this.awaitIdentPos > 0) + { this.raise(this.awaitIdentPos, "Cannot use 'await' as identifier inside an async function"); } + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true) + } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos; + var node$1 = this.startNodeAt(startPos, startLoc); + node$1.callee = base; + node$1.arguments = exprList; + if (optionalSupported) { + node$1.optional = optional; + } + base = this.finishNode(node$1, "CallExpression"); + } else if (this.type === types.backQuote) { + if (optional || optionalChained) { + this.raise(this.start, "Optional chaining cannot appear in the tag of tagged template expressions"); + } + var node$2 = this.startNodeAt(startPos, startLoc); + node$2.tag = base; + node$2.quasi = this.parseTemplate({isTagged: true}); + base = this.finishNode(node$2, "TaggedTemplateExpression"); + } + return base + }; + + // Parse an atomic expression — either a single token that is an + // expression, an expression started by a keyword like `function` or + // `new`, or an expression wrapped in punctuation like `()`, `[]`, + // or `{}`. + + pp$3.parseExprAtom = function(refDestructuringErrors) { + // If a division operator appears in an expression position, the + // tokenizer got confused, and we force it to read a regexp instead. + if (this.type === types.slash) { this.readRegexp(); } + + var node, canBeArrow = this.potentialArrowAt === this.start; + switch (this.type) { + case types._super: + if (!this.allowSuper) + { this.raise(this.start, "'super' keyword outside a method"); } + node = this.startNode(); + this.next(); + if (this.type === types.parenL && !this.allowDirectSuper) + { this.raise(node.start, "super() call outside constructor of a subclass"); } + // The `super` keyword can appear at below: + // SuperProperty: + // super [ Expression ] + // super . IdentifierName + // SuperCall: + // super ( Arguments ) + if (this.type !== types.dot && this.type !== types.bracketL && this.type !== types.parenL) + { this.unexpected(); } + return this.finishNode(node, "Super") + + case types._this: + node = this.startNode(); + this.next(); + return this.finishNode(node, "ThisExpression") + + case types.name: + var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc; + var id = this.parseIdent(false); + if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === "async" && !this.canInsertSemicolon() && this.eat(types._function)) + { return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true) } + if (canBeArrow && !this.canInsertSemicolon()) { + if (this.eat(types.arrow)) + { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false) } + if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types.name && !containsEsc) { + id = this.parseIdent(false); + if (this.canInsertSemicolon() || !this.eat(types.arrow)) + { this.unexpected(); } + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true) + } + } + return id + + case types.regexp: + var value = this.value; + node = this.parseLiteral(value.value); + node.regex = {pattern: value.pattern, flags: value.flags}; + return node + + case types.num: case types.string: + return this.parseLiteral(this.value) + + case types._null: case types._true: case types._false: + node = this.startNode(); + node.value = this.type === types._null ? null : this.type === types._true; + node.raw = this.type.keyword; + this.next(); + return this.finishNode(node, "Literal") + + case types.parenL: + var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow); + if (refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr)) + { refDestructuringErrors.parenthesizedAssign = start; } + if (refDestructuringErrors.parenthesizedBind < 0) + { refDestructuringErrors.parenthesizedBind = start; } + } + return expr + + case types.bracketL: + node = this.startNode(); + this.next(); + node.elements = this.parseExprList(types.bracketR, true, true, refDestructuringErrors); + return this.finishNode(node, "ArrayExpression") + + case types.braceL: + return this.parseObj(false, refDestructuringErrors) + + case types._function: + node = this.startNode(); + this.next(); + return this.parseFunction(node, 0) + + case types._class: + return this.parseClass(this.startNode(), false) + + case types._new: + return this.parseNew() + + case types.backQuote: + return this.parseTemplate() + + case types._import: + if (this.options.ecmaVersion >= 11) { + return this.parseExprImport() + } else { + return this.unexpected() + } + + default: + this.unexpected(); + } + }; + + pp$3.parseExprImport = function() { + var node = this.startNode(); + + // Consume `import` as an identifier for `import.meta`. + // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`. + if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword import"); } + var meta = this.parseIdent(true); + + switch (this.type) { + case types.parenL: + return this.parseDynamicImport(node) + case types.dot: + node.meta = meta; + return this.parseImportMeta(node) + default: + this.unexpected(); + } + }; + + pp$3.parseDynamicImport = function(node) { + this.next(); // skip `(` + + // Parse node.source. + node.source = this.parseMaybeAssign(); + + // Verify ending. + if (!this.eat(types.parenR)) { + var errorPos = this.start; + if (this.eat(types.comma) && this.eat(types.parenR)) { + this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()"); + } else { + this.unexpected(errorPos); + } + } + + return this.finishNode(node, "ImportExpression") + }; + + pp$3.parseImportMeta = function(node) { + this.next(); // skip `.` + + var containsEsc = this.containsEsc; + node.property = this.parseIdent(true); + + if (node.property.name !== "meta") + { this.raiseRecoverable(node.property.start, "The only valid meta property for import is 'import.meta'"); } + if (containsEsc) + { this.raiseRecoverable(node.start, "'import.meta' must not contain escaped characters"); } + if (this.options.sourceType !== "module") + { this.raiseRecoverable(node.start, "Cannot use 'import.meta' outside a module"); } + + return this.finishNode(node, "MetaProperty") + }; + + pp$3.parseLiteral = function(value) { + var node = this.startNode(); + node.value = value; + node.raw = this.input.slice(this.start, this.end); + if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1); } + this.next(); + return this.finishNode(node, "Literal") + }; + + pp$3.parseParenExpression = function() { + this.expect(types.parenL); + var val = this.parseExpression(); + this.expect(types.parenR); + return val + }; + + pp$3.parseParenAndDistinguishExpression = function(canBeArrow) { + var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8; + if (this.options.ecmaVersion >= 6) { + this.next(); + + var innerStartPos = this.start, innerStartLoc = this.startLoc; + var exprList = [], first = true, lastIsComma = false; + var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart; + this.yieldPos = 0; + this.awaitPos = 0; + // Do not save awaitIdentPos to allow checking awaits nested in parameters + while (this.type !== types.parenR) { + first ? first = false : this.expect(types.comma); + if (allowTrailingComma && this.afterTrailingComma(types.parenR, true)) { + lastIsComma = true; + break + } else if (this.type === types.ellipsis) { + spreadStart = this.start; + exprList.push(this.parseParenItem(this.parseRestBinding())); + if (this.type === types.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); } + break + } else { + exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem)); + } + } + var innerEndPos = this.start, innerEndLoc = this.startLoc; + this.expect(types.parenR); + + if (canBeArrow && !this.canInsertSemicolon() && this.eat(types.arrow)) { + this.checkPatternErrors(refDestructuringErrors, false); + this.checkYieldAwaitInDefaultParams(); + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + return this.parseParenArrowList(startPos, startLoc, exprList) + } + + if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); } + if (spreadStart) { this.unexpected(spreadStart); } + this.checkExpressionErrors(refDestructuringErrors, true); + this.yieldPos = oldYieldPos || this.yieldPos; + this.awaitPos = oldAwaitPos || this.awaitPos; + + if (exprList.length > 1) { + val = this.startNodeAt(innerStartPos, innerStartLoc); + val.expressions = exprList; + this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc); + } else { + val = exprList[0]; + } + } else { + val = this.parseParenExpression(); + } + + if (this.options.preserveParens) { + var par = this.startNodeAt(startPos, startLoc); + par.expression = val; + return this.finishNode(par, "ParenthesizedExpression") + } else { + return val + } + }; + + pp$3.parseParenItem = function(item) { + return item + }; + + pp$3.parseParenArrowList = function(startPos, startLoc, exprList) { + return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList) + }; + + // New's precedence is slightly tricky. It must allow its argument to + // be a `[]` or dot subscript expression, but not a call — at least, + // not without wrapping it in parentheses. Thus, it uses the noCalls + // argument to parseSubscripts to prevent it from consuming the + // argument list. + + var empty$1 = []; + + pp$3.parseNew = function() { + if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); } + var node = this.startNode(); + var meta = this.parseIdent(true); + if (this.options.ecmaVersion >= 6 && this.eat(types.dot)) { + node.meta = meta; + var containsEsc = this.containsEsc; + node.property = this.parseIdent(true); + if (node.property.name !== "target") + { this.raiseRecoverable(node.property.start, "The only valid meta property for new is 'new.target'"); } + if (containsEsc) + { this.raiseRecoverable(node.start, "'new.target' must not contain escaped characters"); } + if (!this.inNonArrowFunction()) + { this.raiseRecoverable(node.start, "'new.target' can only be used in functions"); } + return this.finishNode(node, "MetaProperty") + } + var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types._import; + node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true); + if (isImport && node.callee.type === "ImportExpression") { + this.raise(startPos, "Cannot use new with import()"); + } + if (this.eat(types.parenL)) { node.arguments = this.parseExprList(types.parenR, this.options.ecmaVersion >= 8, false); } + else { node.arguments = empty$1; } + return this.finishNode(node, "NewExpression") + }; + + // Parse template expression. + + pp$3.parseTemplateElement = function(ref) { + var isTagged = ref.isTagged; + + var elem = this.startNode(); + if (this.type === types.invalidTemplate) { + if (!isTagged) { + this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal"); + } + elem.value = { + raw: this.value, + cooked: null + }; + } else { + elem.value = { + raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"), + cooked: this.value + }; + } + this.next(); + elem.tail = this.type === types.backQuote; + return this.finishNode(elem, "TemplateElement") + }; + + pp$3.parseTemplate = function(ref) { + if ( ref === void 0 ) ref = {}; + var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false; + + var node = this.startNode(); + this.next(); + node.expressions = []; + var curElt = this.parseTemplateElement({isTagged: isTagged}); + node.quasis = [curElt]; + while (!curElt.tail) { + if (this.type === types.eof) { this.raise(this.pos, "Unterminated template literal"); } + this.expect(types.dollarBraceL); + node.expressions.push(this.parseExpression()); + this.expect(types.braceR); + node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged})); + } + this.next(); + return this.finishNode(node, "TemplateLiteral") + }; + + pp$3.isAsyncProp = function(prop) { + return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" && + (this.type === types.name || this.type === types.num || this.type === types.string || this.type === types.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types.star)) && + !lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) + }; + + // Parse an object literal or binding pattern. + + pp$3.parseObj = function(isPattern, refDestructuringErrors) { + var node = this.startNode(), first = true, propHash = {}; + node.properties = []; + this.next(); + while (!this.eat(types.braceR)) { + if (!first) { + this.expect(types.comma); + if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types.braceR)) { break } + } else { first = false; } + + var prop = this.parseProperty(isPattern, refDestructuringErrors); + if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); } + node.properties.push(prop); + } + return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression") + }; + + pp$3.parseProperty = function(isPattern, refDestructuringErrors) { + var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc; + if (this.options.ecmaVersion >= 9 && this.eat(types.ellipsis)) { + if (isPattern) { + prop.argument = this.parseIdent(false); + if (this.type === types.comma) { + this.raise(this.start, "Comma is not permitted after the rest element"); + } + return this.finishNode(prop, "RestElement") + } + // To disallow parenthesized identifier via `this.toAssignable()`. + if (this.type === types.parenL && refDestructuringErrors) { + if (refDestructuringErrors.parenthesizedAssign < 0) { + refDestructuringErrors.parenthesizedAssign = this.start; + } + if (refDestructuringErrors.parenthesizedBind < 0) { + refDestructuringErrors.parenthesizedBind = this.start; + } + } + // Parse argument. + prop.argument = this.parseMaybeAssign(false, refDestructuringErrors); + // To disallow trailing comma via `this.toAssignable()`. + if (this.type === types.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) { + refDestructuringErrors.trailingComma = this.start; + } + // Finish + return this.finishNode(prop, "SpreadElement") + } + if (this.options.ecmaVersion >= 6) { + prop.method = false; + prop.shorthand = false; + if (isPattern || refDestructuringErrors) { + startPos = this.start; + startLoc = this.startLoc; + } + if (!isPattern) + { isGenerator = this.eat(types.star); } + } + var containsEsc = this.containsEsc; + this.parsePropertyName(prop); + if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) { + isAsync = true; + isGenerator = this.options.ecmaVersion >= 9 && this.eat(types.star); + this.parsePropertyName(prop, refDestructuringErrors); + } else { + isAsync = false; + } + this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc); + return this.finishNode(prop, "Property") + }; + + pp$3.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) { + if ((isGenerator || isAsync) && this.type === types.colon) + { this.unexpected(); } + + if (this.eat(types.colon)) { + prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors); + prop.kind = "init"; + } else if (this.options.ecmaVersion >= 6 && this.type === types.parenL) { + if (isPattern) { this.unexpected(); } + prop.kind = "init"; + prop.method = true; + prop.value = this.parseMethod(isGenerator, isAsync); + } else if (!isPattern && !containsEsc && + this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" && + (prop.key.name === "get" || prop.key.name === "set") && + (this.type !== types.comma && this.type !== types.braceR && this.type !== types.eq)) { + if (isGenerator || isAsync) { this.unexpected(); } + prop.kind = prop.key.name; + this.parsePropertyName(prop); + prop.value = this.parseMethod(false); + var paramCount = prop.kind === "get" ? 0 : 1; + if (prop.value.params.length !== paramCount) { + var start = prop.value.start; + if (prop.kind === "get") + { this.raiseRecoverable(start, "getter should have no params"); } + else + { this.raiseRecoverable(start, "setter should have exactly one param"); } + } else { + if (prop.kind === "set" && prop.value.params[0].type === "RestElement") + { this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); } + } + } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") { + if (isGenerator || isAsync) { this.unexpected(); } + this.checkUnreserved(prop.key); + if (prop.key.name === "await" && !this.awaitIdentPos) + { this.awaitIdentPos = startPos; } + prop.kind = "init"; + if (isPattern) { + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); + } else if (this.type === types.eq && refDestructuringErrors) { + if (refDestructuringErrors.shorthandAssign < 0) + { refDestructuringErrors.shorthandAssign = this.start; } + prop.value = this.parseMaybeDefault(startPos, startLoc, prop.key); + } else { + prop.value = prop.key; + } + prop.shorthand = true; + } else { this.unexpected(); } + }; + + pp$3.parsePropertyName = function(prop) { + if (this.options.ecmaVersion >= 6) { + if (this.eat(types.bracketL)) { + prop.computed = true; + prop.key = this.parseMaybeAssign(); + this.expect(types.bracketR); + return prop.key + } else { + prop.computed = false; + } + } + return prop.key = this.type === types.num || this.type === types.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never") + }; + + // Initialize empty function node. + + pp$3.initFunction = function(node) { + node.id = null; + if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; } + if (this.options.ecmaVersion >= 8) { node.async = false; } + }; + + // Parse object or class method. + + pp$3.parseMethod = function(isGenerator, isAsync, allowDirectSuper) { + var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + + this.initFunction(node); + if (this.options.ecmaVersion >= 6) + { node.generator = isGenerator; } + if (this.options.ecmaVersion >= 8) + { node.async = !!isAsync; } + + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0)); + + this.expect(types.parenL); + node.params = this.parseBindingList(types.parenR, false, this.options.ecmaVersion >= 8); + this.checkYieldAwaitInDefaultParams(); + this.parseFunctionBody(node, false, true); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node, "FunctionExpression") + }; + + // Parse arrow function expression with given parameters. + + pp$3.parseArrowExpression = function(node, params, isAsync) { + var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos; + + this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW); + this.initFunction(node); + if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; } + + this.yieldPos = 0; + this.awaitPos = 0; + this.awaitIdentPos = 0; + + node.params = this.toAssignableList(params, true); + this.parseFunctionBody(node, true, false); + + this.yieldPos = oldYieldPos; + this.awaitPos = oldAwaitPos; + this.awaitIdentPos = oldAwaitIdentPos; + return this.finishNode(node, "ArrowFunctionExpression") + }; + + // Parse function body and check parameters. + + pp$3.parseFunctionBody = function(node, isArrowFunction, isMethod) { + var isExpression = isArrowFunction && this.type !== types.braceL; + var oldStrict = this.strict, useStrict = false; + + if (isExpression) { + node.body = this.parseMaybeAssign(); + node.expression = true; + this.checkParams(node, false); + } else { + var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params); + if (!oldStrict || nonSimple) { + useStrict = this.strictDirective(this.end); + // If this is a strict mode function, verify that argument names + // are not repeated, and it does not try to bind the words `eval` + // or `arguments`. + if (useStrict && nonSimple) + { this.raiseRecoverable(node.start, "Illegal 'use strict' directive in function with non-simple parameter list"); } + } + // Start a new scope with regard to labels and the `inFunction` + // flag (restore them to their old value afterwards). + var oldLabels = this.labels; + this.labels = []; + if (useStrict) { this.strict = true; } + + // Add the params to varDeclaredNames to ensure that an error is thrown + // if a let/const declaration in the function clashes with one of the params. + this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params)); + // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval' + if (this.strict && node.id) { this.checkLVal(node.id, BIND_OUTSIDE); } + node.body = this.parseBlock(false, undefined, useStrict && !oldStrict); + node.expression = false; + this.adaptDirectivePrologue(node.body.body); + this.labels = oldLabels; + } + this.exitScope(); + }; + + pp$3.isSimpleParamList = function(params) { + for (var i = 0, list = params; i < list.length; i += 1) + { + var param = list[i]; + + if (param.type !== "Identifier") { return false + } } + return true + }; + + // Checks function params for various disallowed patterns such as using "eval" + // or "arguments" and duplicate parameters. + + pp$3.checkParams = function(node, allowDuplicates) { + var nameHash = {}; + for (var i = 0, list = node.params; i < list.length; i += 1) + { + var param = list[i]; + + this.checkLVal(param, BIND_VAR, allowDuplicates ? null : nameHash); + } + }; + + // Parses a comma-separated list of expressions, and returns them as + // an array. `close` is the token type that ends the list, and + // `allowEmpty` can be turned on to allow subsequent commas with + // nothing in between them to be parsed as `null` (which is needed + // for array literals). + + pp$3.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) { + var elts = [], first = true; + while (!this.eat(close)) { + if (!first) { + this.expect(types.comma); + if (allowTrailingComma && this.afterTrailingComma(close)) { break } + } else { first = false; } + + var elt = (void 0); + if (allowEmpty && this.type === types.comma) + { elt = null; } + else if (this.type === types.ellipsis) { + elt = this.parseSpread(refDestructuringErrors); + if (refDestructuringErrors && this.type === types.comma && refDestructuringErrors.trailingComma < 0) + { refDestructuringErrors.trailingComma = this.start; } + } else { + elt = this.parseMaybeAssign(false, refDestructuringErrors); + } + elts.push(elt); + } + return elts + }; + + pp$3.checkUnreserved = function(ref) { + var start = ref.start; + var end = ref.end; + var name = ref.name; + + if (this.inGenerator && name === "yield") + { this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); } + if (this.inAsync && name === "await") + { this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); } + if (this.keywords.test(name)) + { this.raise(start, ("Unexpected keyword '" + name + "'")); } + if (this.options.ecmaVersion < 6 && + this.input.slice(start, end).indexOf("\\") !== -1) { return } + var re = this.strict ? this.reservedWordsStrict : this.reservedWords; + if (re.test(name)) { + if (!this.inAsync && name === "await") + { this.raiseRecoverable(start, "Cannot use keyword 'await' outside an async function"); } + this.raiseRecoverable(start, ("The keyword '" + name + "' is reserved")); + } + }; + + // Parse the next token as an identifier. If `liberal` is true (used + // when parsing properties), it will also convert keywords into + // identifiers. + + pp$3.parseIdent = function(liberal, isBinding) { + var node = this.startNode(); + if (this.type === types.name) { + node.name = this.value; + } else if (this.type.keyword) { + node.name = this.type.keyword; + + // To fix https://github.com/acornjs/acorn/issues/575 + // `class` and `function` keywords push new context into this.context. + // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name. + // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword + if ((node.name === "class" || node.name === "function") && + (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) { + this.context.pop(); + } + } else { + this.unexpected(); + } + this.next(!!liberal); + this.finishNode(node, "Identifier"); + if (!liberal) { + this.checkUnreserved(node); + if (node.name === "await" && !this.awaitIdentPos) + { this.awaitIdentPos = node.start; } + } + return node + }; + + // Parses yield expression inside generator. + + pp$3.parseYield = function(noIn) { + if (!this.yieldPos) { this.yieldPos = this.start; } + + var node = this.startNode(); + this.next(); + if (this.type === types.semi || this.canInsertSemicolon() || (this.type !== types.star && !this.type.startsExpr)) { + node.delegate = false; + node.argument = null; + } else { + node.delegate = this.eat(types.star); + node.argument = this.parseMaybeAssign(noIn); + } + return this.finishNode(node, "YieldExpression") + }; + + pp$3.parseAwait = function() { + if (!this.awaitPos) { this.awaitPos = this.start; } + + var node = this.startNode(); + this.next(); + node.argument = this.parseMaybeUnary(null, false); + return this.finishNode(node, "AwaitExpression") + }; + + var pp$4 = Parser.prototype; + + // This function is used to raise exceptions on parse errors. It + // takes an offset integer (into the current `input`) to indicate + // the location of the error, attaches the position to the end + // of the error message, and then raises a `SyntaxError` with that + // message. + + pp$4.raise = function(pos, message) { + var loc = getLineInfo(this.input, pos); + message += " (" + loc.line + ":" + loc.column + ")"; + var err = new SyntaxError(message); + err.pos = pos; err.loc = loc; err.raisedAt = this.pos; + throw err + }; + + pp$4.raiseRecoverable = pp$4.raise; + + pp$4.curPosition = function() { + if (this.options.locations) { + return new Position(this.curLine, this.pos - this.lineStart) + } + }; + + var pp$5 = Parser.prototype; + + var Scope = function Scope(flags) { + this.flags = flags; + // A list of var-declared names in the current lexical scope + this.var = []; + // A list of lexically-declared names in the current lexical scope + this.lexical = []; + // A list of lexically-declared FunctionDeclaration names in the current lexical scope + this.functions = []; + }; + + // The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names. + + pp$5.enterScope = function(flags) { + this.scopeStack.push(new Scope(flags)); + }; + + pp$5.exitScope = function() { + this.scopeStack.pop(); + }; + + // The spec says: + // > At the top level of a function, or script, function declarations are + // > treated like var declarations rather than like lexical declarations. + pp$5.treatFunctionsAsVarInScope = function(scope) { + return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP) + }; + + pp$5.declareName = function(name, bindingType, pos) { + var redeclared = false; + if (bindingType === BIND_LEXICAL) { + var scope = this.currentScope(); + redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1; + scope.lexical.push(name); + if (this.inModule && (scope.flags & SCOPE_TOP)) + { delete this.undefinedExports[name]; } + } else if (bindingType === BIND_SIMPLE_CATCH) { + var scope$1 = this.currentScope(); + scope$1.lexical.push(name); + } else if (bindingType === BIND_FUNCTION) { + var scope$2 = this.currentScope(); + if (this.treatFunctionsAsVar) + { redeclared = scope$2.lexical.indexOf(name) > -1; } + else + { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; } + scope$2.functions.push(name); + } else { + for (var i = this.scopeStack.length - 1; i >= 0; --i) { + var scope$3 = this.scopeStack[i]; + if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) || + !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) { + redeclared = true; + break + } + scope$3.var.push(name); + if (this.inModule && (scope$3.flags & SCOPE_TOP)) + { delete this.undefinedExports[name]; } + if (scope$3.flags & SCOPE_VAR) { break } + } + } + if (redeclared) { this.raiseRecoverable(pos, ("Identifier '" + name + "' has already been declared")); } + }; + + pp$5.checkLocalExport = function(id) { + // scope.functions must be empty as Module code is always strict. + if (this.scopeStack[0].lexical.indexOf(id.name) === -1 && + this.scopeStack[0].var.indexOf(id.name) === -1) { + this.undefinedExports[id.name] = id; + } + }; + + pp$5.currentScope = function() { + return this.scopeStack[this.scopeStack.length - 1] + }; + + pp$5.currentVarScope = function() { + for (var i = this.scopeStack.length - 1;; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR) { return scope } + } + }; + + // Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`. + pp$5.currentThisScope = function() { + for (var i = this.scopeStack.length - 1;; i--) { + var scope = this.scopeStack[i]; + if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope } + } + }; + + var Node = function Node(parser, pos, loc) { + this.type = ""; + this.start = pos; + this.end = 0; + if (parser.options.locations) + { this.loc = new SourceLocation(parser, loc); } + if (parser.options.directSourceFile) + { this.sourceFile = parser.options.directSourceFile; } + if (parser.options.ranges) + { this.range = [pos, 0]; } + }; + + // Start an AST node, attaching a start offset. + + var pp$6 = Parser.prototype; + + pp$6.startNode = function() { + return new Node(this, this.start, this.startLoc) + }; + + pp$6.startNodeAt = function(pos, loc) { + return new Node(this, pos, loc) + }; + + // Finish an AST node, adding `type` and `end` properties. + + function finishNodeAt(node, type, pos, loc) { + node.type = type; + node.end = pos; + if (this.options.locations) + { node.loc.end = loc; } + if (this.options.ranges) + { node.range[1] = pos; } + return node + } + + pp$6.finishNode = function(node, type) { + return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc) + }; + + // Finish node at given position + + pp$6.finishNodeAt = function(node, type, pos, loc) { + return finishNodeAt.call(this, node, type, pos, loc) + }; + + // The algorithm used to determine whether a regexp can appear at a + + var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) { + this.token = token; + this.isExpr = !!isExpr; + this.preserveSpace = !!preserveSpace; + this.override = override; + this.generator = !!generator; + }; + + var types$1 = { + b_stat: new TokContext("{", false), + b_expr: new TokContext("{", true), + b_tmpl: new TokContext("${", false), + p_stat: new TokContext("(", false), + p_expr: new TokContext("(", true), + q_tmpl: new TokContext("`", true, true, function (p) { return p.tryReadTemplateToken(); }), + f_stat: new TokContext("function", false), + f_expr: new TokContext("function", true), + f_expr_gen: new TokContext("function", true, false, null, true), + f_gen: new TokContext("function", false, false, null, true) + }; + + var pp$7 = Parser.prototype; + + pp$7.initialContext = function() { + return [types$1.b_stat] + }; + + pp$7.braceIsBlock = function(prevType) { + var parent = this.curContext(); + if (parent === types$1.f_expr || parent === types$1.f_stat) + { return true } + if (prevType === types.colon && (parent === types$1.b_stat || parent === types$1.b_expr)) + { return !parent.isExpr } + + // The check for `tt.name && exprAllowed` detects whether we are + // after a `yield` or `of` construct. See the `updateContext` for + // `tt.name`. + if (prevType === types._return || prevType === types.name && this.exprAllowed) + { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) } + if (prevType === types._else || prevType === types.semi || prevType === types.eof || prevType === types.parenR || prevType === types.arrow) + { return true } + if (prevType === types.braceL) + { return parent === types$1.b_stat } + if (prevType === types._var || prevType === types._const || prevType === types.name) + { return false } + return !this.exprAllowed + }; + + pp$7.inGeneratorContext = function() { + for (var i = this.context.length - 1; i >= 1; i--) { + var context = this.context[i]; + if (context.token === "function") + { return context.generator } + } + return false + }; + + pp$7.updateContext = function(prevType) { + var update, type = this.type; + if (type.keyword && prevType === types.dot) + { this.exprAllowed = false; } + else if (update = type.updateContext) + { update.call(this, prevType); } + else + { this.exprAllowed = type.beforeExpr; } + }; + + // Token-specific context update code + + types.parenR.updateContext = types.braceR.updateContext = function() { + if (this.context.length === 1) { + this.exprAllowed = true; + return + } + var out = this.context.pop(); + if (out === types$1.b_stat && this.curContext().token === "function") { + out = this.context.pop(); + } + this.exprAllowed = !out.isExpr; + }; + + types.braceL.updateContext = function(prevType) { + this.context.push(this.braceIsBlock(prevType) ? types$1.b_stat : types$1.b_expr); + this.exprAllowed = true; + }; + + types.dollarBraceL.updateContext = function() { + this.context.push(types$1.b_tmpl); + this.exprAllowed = true; + }; + + types.parenL.updateContext = function(prevType) { + var statementParens = prevType === types._if || prevType === types._for || prevType === types._with || prevType === types._while; + this.context.push(statementParens ? types$1.p_stat : types$1.p_expr); + this.exprAllowed = true; + }; + + types.incDec.updateContext = function() { + // tokExprAllowed stays unchanged + }; + + types._function.updateContext = types._class.updateContext = function(prevType) { + if (prevType.beforeExpr && prevType !== types.semi && prevType !== types._else && + !(prevType === types._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) && + !((prevType === types.colon || prevType === types.braceL) && this.curContext() === types$1.b_stat)) + { this.context.push(types$1.f_expr); } + else + { this.context.push(types$1.f_stat); } + this.exprAllowed = false; + }; + + types.backQuote.updateContext = function() { + if (this.curContext() === types$1.q_tmpl) + { this.context.pop(); } + else + { this.context.push(types$1.q_tmpl); } + this.exprAllowed = false; + }; + + types.star.updateContext = function(prevType) { + if (prevType === types._function) { + var index = this.context.length - 1; + if (this.context[index] === types$1.f_expr) + { this.context[index] = types$1.f_expr_gen; } + else + { this.context[index] = types$1.f_gen; } + } + this.exprAllowed = true; + }; + + types.name.updateContext = function(prevType) { + var allowed = false; + if (this.options.ecmaVersion >= 6 && prevType !== types.dot) { + if (this.value === "of" && !this.exprAllowed || + this.value === "yield" && this.inGeneratorContext()) + { allowed = true; } + } + this.exprAllowed = allowed; + }; + + // This file contains Unicode properties extracted from the ECMAScript + // specification. The lists are extracted like so: + // $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText) + + // #table-binary-unicode-properties + var ecma9BinaryProperties = "ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS"; + var ecma10BinaryProperties = ecma9BinaryProperties + " Extended_Pictographic"; + var ecma11BinaryProperties = ecma10BinaryProperties; + var unicodeBinaryProperties = { + 9: ecma9BinaryProperties, + 10: ecma10BinaryProperties, + 11: ecma11BinaryProperties + }; + + // #table-unicode-general-category-values + var unicodeGeneralCategoryValues = "Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu"; + + // #table-unicode-script-values + var ecma9ScriptValues = "Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb"; + var ecma10ScriptValues = ecma9ScriptValues + " Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd"; + var ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"; + var unicodeScriptValues = { + 9: ecma9ScriptValues, + 10: ecma10ScriptValues, + 11: ecma11ScriptValues + }; + + var data = {}; + function buildUnicodeData(ecmaVersion) { + var d = data[ecmaVersion] = { + binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + " " + unicodeGeneralCategoryValues), + nonBinary: { + General_Category: wordsRegexp(unicodeGeneralCategoryValues), + Script: wordsRegexp(unicodeScriptValues[ecmaVersion]) + } + }; + d.nonBinary.Script_Extensions = d.nonBinary.Script; + + d.nonBinary.gc = d.nonBinary.General_Category; + d.nonBinary.sc = d.nonBinary.Script; + d.nonBinary.scx = d.nonBinary.Script_Extensions; + } + buildUnicodeData(9); + buildUnicodeData(10); + buildUnicodeData(11); + + var pp$8 = Parser.prototype; + + var RegExpValidationState = function RegExpValidationState(parser) { + this.parser = parser; + this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : ""); + this.unicodeProperties = data[parser.options.ecmaVersion >= 11 ? 11 : parser.options.ecmaVersion]; + this.source = ""; + this.flags = ""; + this.start = 0; + this.switchU = false; + this.switchN = false; + this.pos = 0; + this.lastIntValue = 0; + this.lastStringValue = ""; + this.lastAssertionIsQuantifiable = false; + this.numCapturingParens = 0; + this.maxBackReference = 0; + this.groupNames = []; + this.backReferenceNames = []; + }; + + RegExpValidationState.prototype.reset = function reset (start, pattern, flags) { + var unicode = flags.indexOf("u") !== -1; + this.start = start | 0; + this.source = pattern + ""; + this.flags = flags; + this.switchU = unicode && this.parser.options.ecmaVersion >= 6; + this.switchN = unicode && this.parser.options.ecmaVersion >= 9; + }; + + RegExpValidationState.prototype.raise = function raise (message) { + this.parser.raiseRecoverable(this.start, ("Invalid regular expression: /" + (this.source) + "/: " + message)); + }; + + // If u flag is given, this returns the code point at the index (it combines a surrogate pair). + // Otherwise, this returns the code unit of the index (can be a part of a surrogate pair). + RegExpValidationState.prototype.at = function at (i, forceU) { + if ( forceU === void 0 ) forceU = false; + + var s = this.source; + var l = s.length; + if (i >= l) { + return -1 + } + var c = s.charCodeAt(i); + if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) { + return c + } + var next = s.charCodeAt(i + 1); + return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c + }; + + RegExpValidationState.prototype.nextIndex = function nextIndex (i, forceU) { + if ( forceU === void 0 ) forceU = false; + + var s = this.source; + var l = s.length; + if (i >= l) { + return l + } + var c = s.charCodeAt(i), next; + if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l || + (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) { + return i + 1 + } + return i + 2 + }; + + RegExpValidationState.prototype.current = function current (forceU) { + if ( forceU === void 0 ) forceU = false; + + return this.at(this.pos, forceU) + }; + + RegExpValidationState.prototype.lookahead = function lookahead (forceU) { + if ( forceU === void 0 ) forceU = false; + + return this.at(this.nextIndex(this.pos, forceU), forceU) + }; + + RegExpValidationState.prototype.advance = function advance (forceU) { + if ( forceU === void 0 ) forceU = false; + + this.pos = this.nextIndex(this.pos, forceU); + }; + + RegExpValidationState.prototype.eat = function eat (ch, forceU) { + if ( forceU === void 0 ) forceU = false; + + if (this.current(forceU) === ch) { + this.advance(forceU); + return true + } + return false + }; + + function codePointToString(ch) { + if (ch <= 0xFFFF) { return String.fromCharCode(ch) } + ch -= 0x10000; + return String.fromCharCode((ch >> 10) + 0xD800, (ch & 0x03FF) + 0xDC00) + } + + /** + * Validate the flags part of a given RegExpLiteral. + * + * @param {RegExpValidationState} state The state to validate RegExp. + * @returns {void} + */ + pp$8.validateRegExpFlags = function(state) { + var validFlags = state.validFlags; + var flags = state.flags; + + for (var i = 0; i < flags.length; i++) { + var flag = flags.charAt(i); + if (validFlags.indexOf(flag) === -1) { + this.raise(state.start, "Invalid regular expression flag"); + } + if (flags.indexOf(flag, i + 1) > -1) { + this.raise(state.start, "Duplicate regular expression flag"); + } + } + }; + + /** + * Validate the pattern part of a given RegExpLiteral. + * + * @param {RegExpValidationState} state The state to validate RegExp. + * @returns {void} + */ + pp$8.validateRegExpPattern = function(state) { + this.regexp_pattern(state); + + // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of + // parsing contains a |GroupName|, reparse with the goal symbol + // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError* + // exception if _P_ did not conform to the grammar, if any elements of _P_ + // were not matched by the parse, or if any Early Error conditions exist. + if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) { + state.switchN = true; + this.regexp_pattern(state); + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern + pp$8.regexp_pattern = function(state) { + state.pos = 0; + state.lastIntValue = 0; + state.lastStringValue = ""; + state.lastAssertionIsQuantifiable = false; + state.numCapturingParens = 0; + state.maxBackReference = 0; + state.groupNames.length = 0; + state.backReferenceNames.length = 0; + + this.regexp_disjunction(state); + + if (state.pos !== state.source.length) { + // Make the same messages as V8. + if (state.eat(0x29 /* ) */)) { + state.raise("Unmatched ')'"); + } + if (state.eat(0x5D /* ] */) || state.eat(0x7D /* } */)) { + state.raise("Lone quantifier brackets"); + } + } + if (state.maxBackReference > state.numCapturingParens) { + state.raise("Invalid escape"); + } + for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) { + var name = list[i]; + + if (state.groupNames.indexOf(name) === -1) { + state.raise("Invalid named capture referenced"); + } + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction + pp$8.regexp_disjunction = function(state) { + this.regexp_alternative(state); + while (state.eat(0x7C /* | */)) { + this.regexp_alternative(state); + } + + // Make the same message as V8. + if (this.regexp_eatQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + if (state.eat(0x7B /* { */)) { + state.raise("Lone quantifier brackets"); + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative + pp$8.regexp_alternative = function(state) { + while (state.pos < state.source.length && this.regexp_eatTerm(state)) + { } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term + pp$8.regexp_eatTerm = function(state) { + if (this.regexp_eatAssertion(state)) { + // Handle `QuantifiableAssertion Quantifier` alternative. + // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion + // is a QuantifiableAssertion. + if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) { + // Make the same message as V8. + if (state.switchU) { + state.raise("Invalid quantifier"); + } + } + return true + } + + if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) { + this.regexp_eatQuantifier(state); + return true + } + + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion + pp$8.regexp_eatAssertion = function(state) { + var start = state.pos; + state.lastAssertionIsQuantifiable = false; + + // ^, $ + if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) { + return true + } + + // \b \B + if (state.eat(0x5C /* \ */)) { + if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) { + return true + } + state.pos = start; + } + + // Lookahead / Lookbehind + if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) { + var lookbehind = false; + if (this.options.ecmaVersion >= 9) { + lookbehind = state.eat(0x3C /* < */); + } + if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) { + this.regexp_disjunction(state); + if (!state.eat(0x29 /* ) */)) { + state.raise("Unterminated group"); + } + state.lastAssertionIsQuantifiable = !lookbehind; + return true + } + } + + state.pos = start; + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier + pp$8.regexp_eatQuantifier = function(state, noError) { + if ( noError === void 0 ) noError = false; + + if (this.regexp_eatQuantifierPrefix(state, noError)) { + state.eat(0x3F /* ? */); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix + pp$8.regexp_eatQuantifierPrefix = function(state, noError) { + return ( + state.eat(0x2A /* * */) || + state.eat(0x2B /* + */) || + state.eat(0x3F /* ? */) || + this.regexp_eatBracedQuantifier(state, noError) + ) + }; + pp$8.regexp_eatBracedQuantifier = function(state, noError) { + var start = state.pos; + if (state.eat(0x7B /* { */)) { + var min = 0, max = -1; + if (this.regexp_eatDecimalDigits(state)) { + min = state.lastIntValue; + if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) { + max = state.lastIntValue; + } + if (state.eat(0x7D /* } */)) { + // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term + if (max !== -1 && max < min && !noError) { + state.raise("numbers out of order in {} quantifier"); + } + return true + } + } + if (state.switchU && !noError) { + state.raise("Incomplete quantifier"); + } + state.pos = start; + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Atom + pp$8.regexp_eatAtom = function(state) { + return ( + this.regexp_eatPatternCharacters(state) || + state.eat(0x2E /* . */) || + this.regexp_eatReverseSolidusAtomEscape(state) || + this.regexp_eatCharacterClass(state) || + this.regexp_eatUncapturingGroup(state) || + this.regexp_eatCapturingGroup(state) + ) + }; + pp$8.regexp_eatReverseSolidusAtomEscape = function(state) { + var start = state.pos; + if (state.eat(0x5C /* \ */)) { + if (this.regexp_eatAtomEscape(state)) { + return true + } + state.pos = start; + } + return false + }; + pp$8.regexp_eatUncapturingGroup = function(state) { + var start = state.pos; + if (state.eat(0x28 /* ( */)) { + if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) { + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + return true + } + state.raise("Unterminated group"); + } + state.pos = start; + } + return false + }; + pp$8.regexp_eatCapturingGroup = function(state) { + if (state.eat(0x28 /* ( */)) { + if (this.options.ecmaVersion >= 9) { + this.regexp_groupSpecifier(state); + } else if (state.current() === 0x3F /* ? */) { + state.raise("Invalid group"); + } + this.regexp_disjunction(state); + if (state.eat(0x29 /* ) */)) { + state.numCapturingParens += 1; + return true + } + state.raise("Unterminated group"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom + pp$8.regexp_eatExtendedAtom = function(state) { + return ( + state.eat(0x2E /* . */) || + this.regexp_eatReverseSolidusAtomEscape(state) || + this.regexp_eatCharacterClass(state) || + this.regexp_eatUncapturingGroup(state) || + this.regexp_eatCapturingGroup(state) || + this.regexp_eatInvalidBracedQuantifier(state) || + this.regexp_eatExtendedPatternCharacter(state) + ) + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier + pp$8.regexp_eatInvalidBracedQuantifier = function(state) { + if (this.regexp_eatBracedQuantifier(state, true)) { + state.raise("Nothing to repeat"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter + pp$8.regexp_eatSyntaxCharacter = function(state) { + var ch = state.current(); + if (isSyntaxCharacter(ch)) { + state.lastIntValue = ch; + state.advance(); + return true + } + return false + }; + function isSyntaxCharacter(ch) { + return ( + ch === 0x24 /* $ */ || + ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ || + ch === 0x2E /* . */ || + ch === 0x3F /* ? */ || + ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ || + ch >= 0x7B /* { */ && ch <= 0x7D /* } */ + ) + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter + // But eat eager. + pp$8.regexp_eatPatternCharacters = function(state) { + var start = state.pos; + var ch = 0; + while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) { + state.advance(); + } + return state.pos !== start + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter + pp$8.regexp_eatExtendedPatternCharacter = function(state) { + var ch = state.current(); + if ( + ch !== -1 && + ch !== 0x24 /* $ */ && + !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) && + ch !== 0x2E /* . */ && + ch !== 0x3F /* ? */ && + ch !== 0x5B /* [ */ && + ch !== 0x5E /* ^ */ && + ch !== 0x7C /* | */ + ) { + state.advance(); + return true + } + return false + }; + + // GroupSpecifier :: + // [empty] + // `?` GroupName + pp$8.regexp_groupSpecifier = function(state) { + if (state.eat(0x3F /* ? */)) { + if (this.regexp_eatGroupName(state)) { + if (state.groupNames.indexOf(state.lastStringValue) !== -1) { + state.raise("Duplicate capture group name"); + } + state.groupNames.push(state.lastStringValue); + return + } + state.raise("Invalid group"); + } + }; + + // GroupName :: + // `<` RegExpIdentifierName `>` + // Note: this updates `state.lastStringValue` property with the eaten name. + pp$8.regexp_eatGroupName = function(state) { + state.lastStringValue = ""; + if (state.eat(0x3C /* < */)) { + if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) { + return true + } + state.raise("Invalid capture group name"); + } + return false + }; + + // RegExpIdentifierName :: + // RegExpIdentifierStart + // RegExpIdentifierName RegExpIdentifierPart + // Note: this updates `state.lastStringValue` property with the eaten name. + pp$8.regexp_eatRegExpIdentifierName = function(state) { + state.lastStringValue = ""; + if (this.regexp_eatRegExpIdentifierStart(state)) { + state.lastStringValue += codePointToString(state.lastIntValue); + while (this.regexp_eatRegExpIdentifierPart(state)) { + state.lastStringValue += codePointToString(state.lastIntValue); + } + return true + } + return false + }; + + // RegExpIdentifierStart :: + // UnicodeIDStart + // `$` + // `_` + // `\` RegExpUnicodeEscapeSequence[+U] + pp$8.regexp_eatRegExpIdentifierStart = function(state) { + var start = state.pos; + var forceU = this.options.ecmaVersion >= 11; + var ch = state.current(forceU); + state.advance(forceU); + + if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierStart(ch)) { + state.lastIntValue = ch; + return true + } + + state.pos = start; + return false + }; + function isRegExpIdentifierStart(ch) { + return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ + } + + // RegExpIdentifierPart :: + // UnicodeIDContinue + // `$` + // `_` + // `\` RegExpUnicodeEscapeSequence[+U] + // + // + pp$8.regexp_eatRegExpIdentifierPart = function(state) { + var start = state.pos; + var forceU = this.options.ecmaVersion >= 11; + var ch = state.current(forceU); + state.advance(forceU); + + if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) { + ch = state.lastIntValue; + } + if (isRegExpIdentifierPart(ch)) { + state.lastIntValue = ch; + return true + } + + state.pos = start; + return false + }; + function isRegExpIdentifierPart(ch) { + return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* */ || ch === 0x200D /* */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape + pp$8.regexp_eatAtomEscape = function(state) { + if ( + this.regexp_eatBackReference(state) || + this.regexp_eatCharacterClassEscape(state) || + this.regexp_eatCharacterEscape(state) || + (state.switchN && this.regexp_eatKGroupName(state)) + ) { + return true + } + if (state.switchU) { + // Make the same message as V8. + if (state.current() === 0x63 /* c */) { + state.raise("Invalid unicode escape"); + } + state.raise("Invalid escape"); + } + return false + }; + pp$8.regexp_eatBackReference = function(state) { + var start = state.pos; + if (this.regexp_eatDecimalEscape(state)) { + var n = state.lastIntValue; + if (state.switchU) { + // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape + if (n > state.maxBackReference) { + state.maxBackReference = n; + } + return true + } + if (n <= state.numCapturingParens) { + return true + } + state.pos = start; + } + return false + }; + pp$8.regexp_eatKGroupName = function(state) { + if (state.eat(0x6B /* k */)) { + if (this.regexp_eatGroupName(state)) { + state.backReferenceNames.push(state.lastStringValue); + return true + } + state.raise("Invalid named reference"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape + pp$8.regexp_eatCharacterEscape = function(state) { + return ( + this.regexp_eatControlEscape(state) || + this.regexp_eatCControlLetter(state) || + this.regexp_eatZero(state) || + this.regexp_eatHexEscapeSequence(state) || + this.regexp_eatRegExpUnicodeEscapeSequence(state, false) || + (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) || + this.regexp_eatIdentityEscape(state) + ) + }; + pp$8.regexp_eatCControlLetter = function(state) { + var start = state.pos; + if (state.eat(0x63 /* c */)) { + if (this.regexp_eatControlLetter(state)) { + return true + } + state.pos = start; + } + return false + }; + pp$8.regexp_eatZero = function(state) { + if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) { + state.lastIntValue = 0; + state.advance(); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape + pp$8.regexp_eatControlEscape = function(state) { + var ch = state.current(); + if (ch === 0x74 /* t */) { + state.lastIntValue = 0x09; /* \t */ + state.advance(); + return true + } + if (ch === 0x6E /* n */) { + state.lastIntValue = 0x0A; /* \n */ + state.advance(); + return true + } + if (ch === 0x76 /* v */) { + state.lastIntValue = 0x0B; /* \v */ + state.advance(); + return true + } + if (ch === 0x66 /* f */) { + state.lastIntValue = 0x0C; /* \f */ + state.advance(); + return true + } + if (ch === 0x72 /* r */) { + state.lastIntValue = 0x0D; /* \r */ + state.advance(); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter + pp$8.regexp_eatControlLetter = function(state) { + var ch = state.current(); + if (isControlLetter(ch)) { + state.lastIntValue = ch % 0x20; + state.advance(); + return true + } + return false + }; + function isControlLetter(ch) { + return ( + (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) || + (ch >= 0x61 /* a */ && ch <= 0x7A /* z */) + ) + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence + pp$8.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) { + if ( forceU === void 0 ) forceU = false; + + var start = state.pos; + var switchU = forceU || state.switchU; + + if (state.eat(0x75 /* u */)) { + if (this.regexp_eatFixedHexDigits(state, 4)) { + var lead = state.lastIntValue; + if (switchU && lead >= 0xD800 && lead <= 0xDBFF) { + var leadSurrogateEnd = state.pos; + if (state.eat(0x5C /* \ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) { + var trail = state.lastIntValue; + if (trail >= 0xDC00 && trail <= 0xDFFF) { + state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; + return true + } + } + state.pos = leadSurrogateEnd; + state.lastIntValue = lead; + } + return true + } + if ( + switchU && + state.eat(0x7B /* { */) && + this.regexp_eatHexDigits(state) && + state.eat(0x7D /* } */) && + isValidUnicode(state.lastIntValue) + ) { + return true + } + if (switchU) { + state.raise("Invalid unicode escape"); + } + state.pos = start; + } + + return false + }; + function isValidUnicode(ch) { + return ch >= 0 && ch <= 0x10FFFF + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape + pp$8.regexp_eatIdentityEscape = function(state) { + if (state.switchU) { + if (this.regexp_eatSyntaxCharacter(state)) { + return true + } + if (state.eat(0x2F /* / */)) { + state.lastIntValue = 0x2F; /* / */ + return true + } + return false + } + + var ch = state.current(); + if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) { + state.lastIntValue = ch; + state.advance(); + return true + } + + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape + pp$8.regexp_eatDecimalEscape = function(state) { + state.lastIntValue = 0; + var ch = state.current(); + if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) { + do { + state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */); + state.advance(); + } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape + pp$8.regexp_eatCharacterClassEscape = function(state) { + var ch = state.current(); + + if (isCharacterClassEscape(ch)) { + state.lastIntValue = -1; + state.advance(); + return true + } + + if ( + state.switchU && + this.options.ecmaVersion >= 9 && + (ch === 0x50 /* P */ || ch === 0x70 /* p */) + ) { + state.lastIntValue = -1; + state.advance(); + if ( + state.eat(0x7B /* { */) && + this.regexp_eatUnicodePropertyValueExpression(state) && + state.eat(0x7D /* } */) + ) { + return true + } + state.raise("Invalid property name"); + } + + return false + }; + function isCharacterClassEscape(ch) { + return ( + ch === 0x64 /* d */ || + ch === 0x44 /* D */ || + ch === 0x73 /* s */ || + ch === 0x53 /* S */ || + ch === 0x77 /* w */ || + ch === 0x57 /* W */ + ) + } + + // UnicodePropertyValueExpression :: + // UnicodePropertyName `=` UnicodePropertyValue + // LoneUnicodePropertyNameOrValue + pp$8.regexp_eatUnicodePropertyValueExpression = function(state) { + var start = state.pos; + + // UnicodePropertyName `=` UnicodePropertyValue + if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) { + var name = state.lastStringValue; + if (this.regexp_eatUnicodePropertyValue(state)) { + var value = state.lastStringValue; + this.regexp_validateUnicodePropertyNameAndValue(state, name, value); + return true + } + } + state.pos = start; + + // LoneUnicodePropertyNameOrValue + if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) { + var nameOrValue = state.lastStringValue; + this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue); + return true + } + return false + }; + pp$8.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) { + if (!has(state.unicodeProperties.nonBinary, name)) + { state.raise("Invalid property name"); } + if (!state.unicodeProperties.nonBinary[name].test(value)) + { state.raise("Invalid property value"); } + }; + pp$8.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) { + if (!state.unicodeProperties.binary.test(nameOrValue)) + { state.raise("Invalid property name"); } + }; + + // UnicodePropertyName :: + // UnicodePropertyNameCharacters + pp$8.regexp_eatUnicodePropertyName = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyNameCharacter(ch = state.current())) { + state.lastStringValue += codePointToString(ch); + state.advance(); + } + return state.lastStringValue !== "" + }; + function isUnicodePropertyNameCharacter(ch) { + return isControlLetter(ch) || ch === 0x5F /* _ */ + } + + // UnicodePropertyValue :: + // UnicodePropertyValueCharacters + pp$8.regexp_eatUnicodePropertyValue = function(state) { + var ch = 0; + state.lastStringValue = ""; + while (isUnicodePropertyValueCharacter(ch = state.current())) { + state.lastStringValue += codePointToString(ch); + state.advance(); + } + return state.lastStringValue !== "" + }; + function isUnicodePropertyValueCharacter(ch) { + return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch) + } + + // LoneUnicodePropertyNameOrValue :: + // UnicodePropertyValueCharacters + pp$8.regexp_eatLoneUnicodePropertyNameOrValue = function(state) { + return this.regexp_eatUnicodePropertyValue(state) + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass + pp$8.regexp_eatCharacterClass = function(state) { + if (state.eat(0x5B /* [ */)) { + state.eat(0x5E /* ^ */); + this.regexp_classRanges(state); + if (state.eat(0x5D /* ] */)) { + return true + } + // Unreachable since it threw "unterminated regular expression" error before. + state.raise("Unterminated character class"); + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges + // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges + // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash + pp$8.regexp_classRanges = function(state) { + while (this.regexp_eatClassAtom(state)) { + var left = state.lastIntValue; + if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) { + var right = state.lastIntValue; + if (state.switchU && (left === -1 || right === -1)) { + state.raise("Invalid character class"); + } + if (left !== -1 && right !== -1 && left > right) { + state.raise("Range out of order in character class"); + } + } + } + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom + // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash + pp$8.regexp_eatClassAtom = function(state) { + var start = state.pos; + + if (state.eat(0x5C /* \ */)) { + if (this.regexp_eatClassEscape(state)) { + return true + } + if (state.switchU) { + // Make the same message as V8. + var ch$1 = state.current(); + if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) { + state.raise("Invalid class escape"); + } + state.raise("Invalid escape"); + } + state.pos = start; + } + + var ch = state.current(); + if (ch !== 0x5D /* ] */) { + state.lastIntValue = ch; + state.advance(); + return true + } + + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape + pp$8.regexp_eatClassEscape = function(state) { + var start = state.pos; + + if (state.eat(0x62 /* b */)) { + state.lastIntValue = 0x08; /* */ + return true + } + + if (state.switchU && state.eat(0x2D /* - */)) { + state.lastIntValue = 0x2D; /* - */ + return true + } + + if (!state.switchU && state.eat(0x63 /* c */)) { + if (this.regexp_eatClassControlLetter(state)) { + return true + } + state.pos = start; + } + + return ( + this.regexp_eatCharacterClassEscape(state) || + this.regexp_eatCharacterEscape(state) + ) + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter + pp$8.regexp_eatClassControlLetter = function(state) { + var ch = state.current(); + if (isDecimalDigit(ch) || ch === 0x5F /* _ */) { + state.lastIntValue = ch % 0x20; + state.advance(); + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence + pp$8.regexp_eatHexEscapeSequence = function(state) { + var start = state.pos; + if (state.eat(0x78 /* x */)) { + if (this.regexp_eatFixedHexDigits(state, 2)) { + return true + } + if (state.switchU) { + state.raise("Invalid escape"); + } + state.pos = start; + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits + pp$8.regexp_eatDecimalDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isDecimalDigit(ch = state.current())) { + state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */); + state.advance(); + } + return state.pos !== start + }; + function isDecimalDigit(ch) { + return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits + pp$8.regexp_eatHexDigits = function(state) { + var start = state.pos; + var ch = 0; + state.lastIntValue = 0; + while (isHexDigit(ch = state.current())) { + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return state.pos !== start + }; + function isHexDigit(ch) { + return ( + (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) || + (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) || + (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) + ) + } + function hexToInt(ch) { + if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) { + return 10 + (ch - 0x41 /* A */) + } + if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) { + return 10 + (ch - 0x61 /* a */) + } + return ch - 0x30 /* 0 */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence + // Allows only 0-377(octal) i.e. 0-255(decimal). + pp$8.regexp_eatLegacyOctalEscapeSequence = function(state) { + if (this.regexp_eatOctalDigit(state)) { + var n1 = state.lastIntValue; + if (this.regexp_eatOctalDigit(state)) { + var n2 = state.lastIntValue; + if (n1 <= 3 && this.regexp_eatOctalDigit(state)) { + state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue; + } else { + state.lastIntValue = n1 * 8 + n2; + } + } else { + state.lastIntValue = n1; + } + return true + } + return false + }; + + // https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit + pp$8.regexp_eatOctalDigit = function(state) { + var ch = state.current(); + if (isOctalDigit(ch)) { + state.lastIntValue = ch - 0x30; /* 0 */ + state.advance(); + return true + } + state.lastIntValue = 0; + return false + }; + function isOctalDigit(ch) { + return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */ + } + + // https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits + // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit + // And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence + pp$8.regexp_eatFixedHexDigits = function(state, length) { + var start = state.pos; + state.lastIntValue = 0; + for (var i = 0; i < length; ++i) { + var ch = state.current(); + if (!isHexDigit(ch)) { + state.pos = start; + return false + } + state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch); + state.advance(); + } + return true + }; + + // Object type used to represent tokens. Note that normally, tokens + // simply exist as properties on the parser object. This is only + // used for the onToken callback and the external tokenizer. + + var Token = function Token(p) { + this.type = p.type; + this.value = p.value; + this.start = p.start; + this.end = p.end; + if (p.options.locations) + { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); } + if (p.options.ranges) + { this.range = [p.start, p.end]; } + }; + + // ## Tokenizer + + var pp$9 = Parser.prototype; + + // Move to the next token + + pp$9.next = function(ignoreEscapeSequenceInKeyword) { + if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc) + { this.raiseRecoverable(this.start, "Escape sequence in keyword " + this.type.keyword); } + if (this.options.onToken) + { this.options.onToken(new Token(this)); } + + this.lastTokEnd = this.end; + this.lastTokStart = this.start; + this.lastTokEndLoc = this.endLoc; + this.lastTokStartLoc = this.startLoc; + this.nextToken(); + }; + + pp$9.getToken = function() { + this.next(); + return new Token(this) + }; + + // If we're in an ES6 environment, make parsers iterable + if (typeof Symbol !== "undefined") + { pp$9[Symbol.iterator] = function() { + var this$1 = this; + + return { + next: function () { + var token = this$1.getToken(); + return { + done: token.type === types.eof, + value: token + } + } + } + }; } + + // Toggle strict mode. Re-reads the next number or string to please + // pedantic tests (`"use strict"; 010;` should fail). + + pp$9.curContext = function() { + return this.context[this.context.length - 1] + }; + + // Read a single token, updating the parser object's token-related + // properties. + + pp$9.nextToken = function() { + var curContext = this.curContext(); + if (!curContext || !curContext.preserveSpace) { this.skipSpace(); } + + this.start = this.pos; + if (this.options.locations) { this.startLoc = this.curPosition(); } + if (this.pos >= this.input.length) { return this.finishToken(types.eof) } + + if (curContext.override) { return curContext.override(this) } + else { this.readToken(this.fullCharCodeAtPos()); } + }; + + pp$9.readToken = function(code) { + // Identifier or keyword. '\uXXXX' sequences are allowed in + // identifiers, so '\' also dispatches to that. + if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\' */) + { return this.readWord() } + + return this.getTokenFromCode(code) + }; + + pp$9.fullCharCodeAtPos = function() { + var code = this.input.charCodeAt(this.pos); + if (code <= 0xd7ff || code >= 0xe000) { return code } + var next = this.input.charCodeAt(this.pos + 1); + return (code << 10) + next - 0x35fdc00 + }; + + pp$9.skipBlockComment = function() { + var startLoc = this.options.onComment && this.curPosition(); + var start = this.pos, end = this.input.indexOf("*/", this.pos += 2); + if (end === -1) { this.raise(this.pos - 2, "Unterminated comment"); } + this.pos = end + 2; + if (this.options.locations) { + lineBreakG.lastIndex = start; + var match; + while ((match = lineBreakG.exec(this.input)) && match.index < this.pos) { + ++this.curLine; + this.lineStart = match.index + match[0].length; + } + } + if (this.options.onComment) + { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos, + startLoc, this.curPosition()); } + }; + + pp$9.skipLineComment = function(startSkip) { + var start = this.pos; + var startLoc = this.options.onComment && this.curPosition(); + var ch = this.input.charCodeAt(this.pos += startSkip); + while (this.pos < this.input.length && !isNewLine(ch)) { + ch = this.input.charCodeAt(++this.pos); + } + if (this.options.onComment) + { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos, + startLoc, this.curPosition()); } + }; + + // Called at the start of the parse and after every token. Skips + // whitespace and comments, and. + + pp$9.skipSpace = function() { + loop: while (this.pos < this.input.length) { + var ch = this.input.charCodeAt(this.pos); + switch (ch) { + case 32: case 160: // ' ' + ++this.pos; + break + case 13: + if (this.input.charCodeAt(this.pos + 1) === 10) { + ++this.pos; + } + case 10: case 8232: case 8233: + ++this.pos; + if (this.options.locations) { + ++this.curLine; + this.lineStart = this.pos; + } + break + case 47: // '/' + switch (this.input.charCodeAt(this.pos + 1)) { + case 42: // '*' + this.skipBlockComment(); + break + case 47: + this.skipLineComment(2); + break + default: + break loop + } + break + default: + if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) { + ++this.pos; + } else { + break loop + } + } + } + }; + + // Called at the end of every token. Sets `end`, `val`, and + // maintains `context` and `exprAllowed`, and skips the space after + // the token, so that the next one's `start` will point at the + // right position. + + pp$9.finishToken = function(type, val) { + this.end = this.pos; + if (this.options.locations) { this.endLoc = this.curPosition(); } + var prevType = this.type; + this.type = type; + this.value = val; + + this.updateContext(prevType); + }; + + // ### Token reading + + // This is the function that is called to fetch the next token. It + // is somewhat obscure, because it works in character codes rather + // than characters, and because operator parsing has been inlined + // into it. + // + // All in the name of speed. + // + pp$9.readToken_dot = function() { + var next = this.input.charCodeAt(this.pos + 1); + if (next >= 48 && next <= 57) { return this.readNumber(true) } + var next2 = this.input.charCodeAt(this.pos + 2); + if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.' + this.pos += 3; + return this.finishToken(types.ellipsis) + } else { + ++this.pos; + return this.finishToken(types.dot) + } + }; + + pp$9.readToken_slash = function() { // '/' + var next = this.input.charCodeAt(this.pos + 1); + if (this.exprAllowed) { ++this.pos; return this.readRegexp() } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.slash, 1) + }; + + pp$9.readToken_mult_modulo_exp = function(code) { // '%*' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + var tokentype = code === 42 ? types.star : types.modulo; + + // exponentiation operator ** and **= + if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) { + ++size; + tokentype = types.starstar; + next = this.input.charCodeAt(this.pos + 2); + } + + if (next === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(tokentype, size) + }; + + pp$9.readToken_pipe_amp = function(code) { // '|&' + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { return this.finishOp(code === 124 ? types.logicalOR : types.logicalAND, 2) } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(code === 124 ? types.bitwiseOR : types.bitwiseAND, 1) + }; + + pp$9.readToken_caret = function() { // '^' + var next = this.input.charCodeAt(this.pos + 1); + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.bitwiseXOR, 1) + }; + + pp$9.readToken_plus_min = function(code) { // '+-' + var next = this.input.charCodeAt(this.pos + 1); + if (next === code) { + if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 && + (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) { + // A `-->` line comment + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken() + } + return this.finishOp(types.incDec, 2) + } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.plusMin, 1) + }; + + pp$9.readToken_lt_gt = function(code) { // '<>' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(types.bitShift, size) + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && + this.input.charCodeAt(this.pos + 3) === 45) { + // `` line comment\n this.skipLineComment(3)\n this.skipSpace()\n return this.nextToken()\n }\n return this.finishOp(tt.incDec, 2)\n }\n if (next === 61) return this.finishOp(tt.assign, 2)\n return this.finishOp(tt.plusMin, 1)\n}\n\npp.readToken_lt_gt = function(code) { // '<>'\n let next = this.input.charCodeAt(this.pos + 1)\n let size = 1\n if (next === code) {\n size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2\n if (this.input.charCodeAt(this.pos + size) === 61) return this.finishOp(tt.assign, size + 1)\n return this.finishOp(tt.bitShift, size)\n }\n if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&\n this.input.charCodeAt(this.pos + 3) === 45) {\n // `` line comment + this.skipLineComment(3); + this.skipSpace(); + return this.nextToken() + } + return this.finishOp(types.incDec, 2) + } + if (next === 61) { return this.finishOp(types.assign, 2) } + return this.finishOp(types.plusMin, 1) +}; + +pp$9.readToken_lt_gt = function(code) { // '<>' + var next = this.input.charCodeAt(this.pos + 1); + var size = 1; + if (next === code) { + size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2; + if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types.assign, size + 1) } + return this.finishOp(types.bitShift, size) + } + if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 && + this.input.charCodeAt(this.pos + 3) === 45) { + // `` line comment\n this.skipLineComment(3)\n this.skipSpace()\n return this.nextToken()\n }\n return this.finishOp(tt.incDec, 2)\n }\n if (next === 61) return this.finishOp(tt.assign, 2)\n return this.finishOp(tt.plusMin, 1)\n}\n\npp.readToken_lt_gt = function(code) { // '<>'\n let next = this.input.charCodeAt(this.pos + 1)\n let size = 1\n if (next === code) {\n size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2\n if (this.input.charCodeAt(this.pos + size) === 61) return this.finishOp(tt.assign, size + 1)\n return this.finishOp(tt.bitShift, size)\n }\n if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&\n this.input.charCodeAt(this.pos + 3) === 45) {\n // `w5j@aUW!=y+eb2%?&@5 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 options.maxSize){ - return cb(new Error('Skip ' + imageUrl + ' Exceed max size'), css); - } - fs.readFile(imagePath, 'base64', function(err, img){ - if(err) return cb(err, css); - var ext = Path.extname(imagePath); - var newCss = css.replace(imageUrl, 'data:' + mediatypes[ext] + ';base64,' + img); - cb(null, newCss); - }); - }); -} - -/* Adapted from async. Continue on error. */ -function forEachSeries(arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0, errs = []; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - errs.push(err); - } - completed += 1; - if (completed === arr.length) { - if(errs.length) return callback(errs); - callback(null); - } - else { - iterate(); - } - }); - }; - iterate(); -} diff --git a/node_modules/css-b64-images/package.json b/node_modules/css-b64-images/package.json deleted file mode 100644 index dca3ca3..0000000 --- a/node_modules/css-b64-images/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "_args": [ - [ - "css-b64-images@0.2.5", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "css-b64-images@0.2.5", - "_id": "css-b64-images@0.2.5", - "_inBundle": false, - "_integrity": "sha1-QgBdgyBLK0pdk7axpWRBM7WSegI=", - "_location": "/css-b64-images", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "css-b64-images@0.2.5", - "name": "css-b64-images", - "escapedName": "css-b64-images", - "rawSpec": "0.2.5", - "saveSpec": null, - "fetchSpec": "0.2.5" - }, - "_requiredBy": [ - "/minify" - ], - "_resolved": "https://registry.npmjs.org/css-b64-images/-/css-b64-images-0.2.5.tgz", - "_spec": "0.2.5", - "_where": "D:\\Projects\\vanillajs-seed", - "author": { - "name": "Filirom1", - "email": "filirom1@gmail.com" - }, - "bin": { - "css-b64-images": "bin/css-b64-images" - }, - "bugs": { - "url": "https://github.com/Filirom1/css-base64-images/issues" - }, - "dependencies": {}, - "description": "Base64 images in your css", - "devDependencies": { - "mocha": "~1.1.0", - "should": "~0.6.3" - }, - "engines": { - "node": "*" - }, - "homepage": "https://github.com/Filirom1/css-base64-images#readme", - "licenses": [ - { - "type": "MIT", - "url": "http://www.opensource.org/licenses/MIT" - } - ], - "main": "lib/css-b64-images.js", - "name": "css-b64-images", - "optionalDependencies": {}, - "repository": { - "type": "git", - "url": "git+https://github.com/Filirom1/css-base64-images.git" - }, - "scripts": { - "test": "mocha" - }, - "version": "0.2.5" -} diff --git a/node_modules/css-b64-images/test/css-b64-images-test.js b/node_modules/css-b64-images/test/css-b64-images-test.js deleted file mode 100644 index 1a4fb6c..0000000 --- a/node_modules/css-b64-images/test/css-b64-images-test.js +++ /dev/null @@ -1,38 +0,0 @@ -var Path = require('path'), - fs = require('fs'), - b64 = require('..'); - -require('should'); - -describe('A complex CSS', function(){ - var cssFile = Path.join(__dirname, 'fixture', 'css', 'style.css'), - relative = Path.join(__dirname, 'fixture', 'css'); - root = Path.join(__dirname, 'fixture'); - - it('a file should be optimized with base64', function(done){ - b64.fromFile(cssFile, root, function(err, css){ - cssShouldBeCorrect(css); - done(); - }); - }); - - it('a string should be optimized with base64', function(done){ - var css = fs.readFileSync(cssFile); - b64.fromString(css, relative, root, function(err, css){ - cssShouldBeCorrect(css); - done(); - }); - }); -}); - -function cssShouldBeCorrect(css){ - css.should.include(".single-quote {\n background: url('data:image/gif;base64,"); - css.should.include(".double-quote {\n background: url(\"data:image/gif;base64,"); - css.should.include(".absolute {\n background: url('data:image/gif;base64,"); - - css.should.include(".external {\n background: url('http"); - css.should.include(".tooBig {\n background: url('../img"); - css.should.include(".not-found {\n background: url('../img"); - - css.should.include(".mediatype {\n background: url('data:image/svg+xml;base64,"); -} diff --git a/node_modules/css-b64-images/test/fixture/css/style.css b/node_modules/css-b64-images/test/fixture/css/style.css deleted file mode 100644 index e215a78..0000000 --- a/node_modules/css-b64-images/test/fixture/css/style.css +++ /dev/null @@ -1,52 +0,0 @@ -/* ---- Fonts ---- */ - -@font-face { - font-family: 'MavenProMedium'; - src: url('../fonts/maven_pro_medium-webfont.eot'); - src: url('../fonts/maven_pro_medium-webfont.eot?iefix') format('eot'), - url('../fonts/maven_pro_medium-webfont.woff') format('woff'), - url('../fonts/maven_pro_medium-webfont.ttf') format('truetype'), - url('../fonts/maven_pro_medium-webfont.svg#webfontyQA0TEWF') format('svg'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'CallunaSansRegular'; - src: url('../fonts/callunasansregular-webfont.eot'); - src: url('../fonts/callunasansregular-webfont.eot?#iefix') format('eot'), - url('../fonts/callunasansregular-webfont.woff') format('woff'), - url('../fonts/callunasansregular-webfont.ttf') format('truetype'), - url('../fonts/callunasansregular-webfont.svg#webfontW850hM1B') format('svg'); - font-weight: normal; - font-style: normal; -} - - -.single-quote { - background: url('../img/background-pattern.gif'); -} - -.double-quote { - background: url("../img/background-pattern.gif"); -} - -.absolute { - background: url('/img/background-pattern.gif'); -} - -.external { - background: url('http://pullrequest.org/img/background-pattern.gif'); -} - -.tooBig { - background: url('../img/mixit-banner.png'); -} - -.not-found { - background: url('../img/nlabal.png'); -} - -.mediatype { - background: url('../img/dots.svg'); -} \ No newline at end of file diff --git a/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.eot b/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.eot deleted file mode 100644 index ba3b5dba656f9c14037ce0d928ac6d687b63cbf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28462 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 diff --git a/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.svg b/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.svg deleted file mode 100644 index f562d3c..0000000 --- a/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.svg +++ /dev/null @@ -1,248 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Copyright c 2010 by Jos Buivenga All rights reserved -Designer : Jos Buivenga -Foundry : Jos Buivenga -Foundry URL : httpexljbriscom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.ttf b/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.ttf deleted file mode 100644 index 1a180938d702ad9d4c102a8de6cb1c5e2326c1d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63460 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Ð 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

=l@)?%WD&(aHUTl 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 FnY!wz?#ciF diff --git a/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.svg b/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.svg deleted file mode 100644 index c4fe7b5..0000000 --- a/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.svg +++ /dev/null @@ -1,245 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Copyright c 2011 by Vissol Ltd All rights reserved -Designer : Joe Prince -Foundry : Joe Prince - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.ttf b/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.ttf deleted file mode 100644 index ffd16e2c320ef70d2b108d70e6e68054f73d8198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90548 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: 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 diff --git a/node_modules/css-b64-images/test/fixture/img/background-pattern.gif b/node_modules/css-b64-images/test/fixture/img/background-pattern.gif deleted file mode 100644 index 77893d50af0e8565d41ca40d211a8ec8804c0cf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1103 zcmZ?wbhEHbWMg1sXkcJ?_UzfGPoEV3b4U0FD7Yk+Bm!w0`-+0ZIIg#cFVINM%8) zeo$(0erZv1Dp0vH$f^P>=c3falKi5O{QMkPCIEf*+ybD@E~!PCWvMA{Mftf3U@u!`;&zJ*PV=C8 zQ*gS)#TBPseV}9XK@p1-(J&!k>H#s~$ri|gC;ZerU}`S{CTqt3|Nj2@{p;tC@87({PcxqRv3h4bgmo;iK$#u35cm<%;FYmM&SmXyJnS^XAT(J!|HS z>C>i8nLKIYg#NzXp6;&Bj`p_Jmgc6$hWfhNn(C^`it@73lH#Jmg8aPPob0U3jP$hB zl;otug!s7FnCPg;i14t`kl>)e0DnJUA8#*D4|g|L7iT9&2YWkP8*3{|3v)A56JsM_ zmeSMJ(bm$`P*+n`QC3n^ke8E{k(QE_5El~_5f%~@;OFDz;pXDxU}s}xVP;}vU{L(Y c!TtZSIFfPujp0I{xw*#H0l diff --git a/node_modules/css-b64-images/test/fixture/img/dots.svg b/node_modules/css-b64-images/test/fixture/img/dots.svg deleted file mode 100644 index 30cd43f..0000000 --- a/node_modules/css-b64-images/test/fixture/img/dots.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/node_modules/css-b64-images/test/fixture/img/mixit-banner.png b/node_modules/css-b64-images/test/fixture/img/mixit-banner.png deleted file mode 100644 index c5c20cb4c6ce362983b584c5d7251c747a968a35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4821 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 diff --git a/node_modules/cssom/lib/CSSKeyframeRule.js b/node_modules/cssom/lib/CSSKeyframeRule.js index c22f2f5..3b928ef 100644 --- a/node_modules/cssom/lib/CSSKeyframeRule.js +++ b/node_modules/cssom/lib/CSSKeyframeRule.js @@ -19,7 +19,7 @@ CSSOM.CSSKeyframeRule = function CSSKeyframeRule() { CSSOM.CSSKeyframeRule.prototype = new CSSOM.CSSRule(); CSSOM.CSSKeyframeRule.prototype.constructor = CSSOM.CSSKeyframeRule; -CSSOM.CSSKeyframeRule.prototype.type = 9; +CSSOM.CSSKeyframeRule.prototype.type = 8; //FIXME //CSSOM.CSSKeyframeRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule; //CSSOM.CSSKeyframeRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule; diff --git a/node_modules/cssom/lib/CSSKeyframesRule.js b/node_modules/cssom/lib/CSSKeyframesRule.js index 7e42717..53e61fa 100644 --- a/node_modules/cssom/lib/CSSKeyframesRule.js +++ b/node_modules/cssom/lib/CSSKeyframesRule.js @@ -17,7 +17,7 @@ CSSOM.CSSKeyframesRule = function CSSKeyframesRule() { CSSOM.CSSKeyframesRule.prototype = new CSSOM.CSSRule(); CSSOM.CSSKeyframesRule.prototype.constructor = CSSOM.CSSKeyframesRule; -CSSOM.CSSKeyframesRule.prototype.type = 8; +CSSOM.CSSKeyframesRule.prototype.type = 7; //FIXME //CSSOM.CSSKeyframesRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule; //CSSOM.CSSKeyframesRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule; diff --git a/node_modules/cssom/lib/clone.js b/node_modules/cssom/lib/clone.js index f15e245..c6867f2 100644 --- a/node_modules/cssom/lib/clone.js +++ b/node_modules/cssom/lib/clone.js @@ -26,25 +26,14 @@ CSSOM.clone = function clone(stylesheet) { return cloned; } - var RULE_TYPES = { - 1: CSSOM.CSSStyleRule, - 4: CSSOM.CSSMediaRule, - //3: CSSOM.CSSImportRule, - //5: CSSOM.CSSFontFaceRule, - //6: CSSOM.CSSPageRule, - 8: CSSOM.CSSKeyframesRule, - 9: CSSOM.CSSKeyframeRule, - 12: CSSOM.CSSSupportsRule - }; - - for (var i=0, rulesLength=rules.length; i < rulesLength; i++) { + for (var i = 0, rulesLength = rules.length; i < rulesLength; i++) { var rule = rules[i]; - var ruleClone = cloned.cssRules[i] = new RULE_TYPES[rule.type](); + var ruleClone = cloned.cssRules[i] = new rule.constructor(); var style = rule.style; if (style) { var styleClone = ruleClone.style = new CSSOM.CSSStyleDeclaration(); - for (var j=0, styleLength=style.length; j < styleLength; j++) { + for (var j = 0, styleLength = style.length; j < styleLength; j++) { var name = styleClone[j] = style[j]; styleClone[name] = style[name]; styleClone._importants[name] = style.getPropertyPriority(name); diff --git a/node_modules/cssom/lib/parse.js b/node_modules/cssom/lib/parse.js index 563fa72..450df31 100644 --- a/node_modules/cssom/lib/parse.js +++ b/node_modules/cssom/lib/parse.js @@ -240,7 +240,6 @@ CSSOM.parse = function parse(token) { state = "before-selector"; } else if (state === "fontFaceRule-begin") { if (parentRule) { - ancestorRules.push(parentRule); fontFaceRule.parentRule = parentRule; } fontFaceRule.parentStyleSheet = styleSheet; diff --git a/node_modules/cssom/package.json b/node_modules/cssom/package.json index e3cf5e4..8df86ae 100644 --- a/node_modules/cssom/package.json +++ b/node_modules/cssom/package.json @@ -1,34 +1,27 @@ { - "_args": [ - [ - "cssom@0.3.8", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "cssom@0.3.8", - "_id": "cssom@0.3.8", + "_from": "cssom@^0.4.4", + "_id": "cssom@0.4.4", "_inBundle": false, - "_integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "_integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "_location": "/cssom", "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "cssom@0.3.8", + "raw": "cssom@^0.4.4", "name": "cssom", "escapedName": "cssom", - "rawSpec": "0.3.8", + "rawSpec": "^0.4.4", "saveSpec": null, - "fetchSpec": "0.3.8" + "fetchSpec": "^0.4.4" }, "_requiredBy": [ - "/cssstyle", "/jsdom" ], - "_resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "_spec": "0.3.8", - "_where": "D:\\Projects\\vanillajs-seed", + "_resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "_shasum": "5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10", + "_spec": "cssom@^0.4.4", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\jsdom", "author": { "name": "Nikita Vasilyev", "email": "me@elv1s.ru" @@ -36,6 +29,8 @@ "bugs": { "url": "https://github.com/NV/CSSOM/issues" }, + "bundleDependencies": false, + "deprecated": false, "description": "CSS Object Model implementation and CSS parser", "files": [ "lib/" @@ -54,5 +49,5 @@ "type": "git", "url": "git+https://github.com/NV/CSSOM.git" }, - "version": "0.3.8" + "version": "0.4.4" } diff --git a/node_modules/cssstyle/.eslintignore b/node_modules/cssstyle/.eslintignore deleted file mode 100644 index f9e0b73..0000000 --- a/node_modules/cssstyle/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -lib/implementedProperties.js -lib/properties.js diff --git a/node_modules/cssstyle/.eslintrc.js b/node_modules/cssstyle/.eslintrc.js deleted file mode 100644 index 770d799..0000000 --- a/node_modules/cssstyle/.eslintrc.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -module.exports = { - root: true, - extends: ['eslint:recommended', 'prettier'], - parserOptions: { - ecmaVersion: 2018, - }, - env: { - es6: true, - }, - globals: { - exports: true, - module: true, - require: true, - window: true, - }, - plugins: ['prettier'], - rules: { - 'prettier/prettier': [ - 'warn', - { - printWidth: 100, - singleQuote: true, - trailingComma: 'es5', - }, - ], - strict: ['warn', 'global'], - }, - overrides: [ - { - files: ['lib/implementedProperties.js', 'lib/properties.js'], - rules: { - 'prettier/prettier': 'off', - }, - }, - { - files: 'scripts/**/*', - rules: { - 'no-console': 'off', - }, - }, - { - files: ['scripts/**/*', 'tests/**/*'], - env: { - node: true, - }, - }, - ], -}; diff --git a/node_modules/cssstyle/.travis.yml b/node_modules/cssstyle/.travis.yml deleted file mode 100644 index cf9a223..0000000 --- a/node_modules/cssstyle/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -sudo: false -language: node_js -cache: - directories: - - node_modules -notifications: - email: true -node_js: - - 6 - - 8 - - 10 - - 11 - -script: - - npm run test-ci diff --git a/node_modules/cssstyle/MIT-LICENSE.txt b/node_modules/cssstyle/LICENSE similarity index 100% rename from node_modules/cssstyle/MIT-LICENSE.txt rename to node_modules/cssstyle/LICENSE diff --git a/node_modules/cssstyle/README.md b/node_modules/cssstyle/README.md index 66b14ae..0016345 100644 --- a/node_modules/cssstyle/README.md +++ b/node_modules/cssstyle/README.md @@ -1,27 +1,15 @@ # CSSStyleDeclaration -[![NpmVersion](https://img.shields.io/npm/v/cssstyle.svg)](https://www.npmjs.com/package/cssstyle) [![Build Status](https://travis-ci.org/jsakas/CSSStyleDeclaration.svg?branch=master)](https://travis-ci.org/jsakas/CSSStyleDeclaration) +A Node JS implementation of the CSS Object Model [CSSStyleDeclaration interface](https://www.w3.org/TR/cssom-1/#the-cssstyledeclaration-interface). -CSSStyleDeclaration is a work-a-like to the CSSStyleDeclaration class in Nikita Vasilyev's [CSSOM](https://github.com/NV/CSSOM). I made it so that when using [jQuery in node](https://github.com/tmtk75/node-jquery) setting css attributes via $.fn.css() would work. node-jquery uses [jsdom](https://github.com/tmpvar/jsdom) to create a DOM to use in node. jsdom uses CSSOM for styling, and CSSOM's implementation of the [CSSStyleDeclaration](http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration) doesn't support [CSS2Properties](http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties), which is how jQuery's [$.fn.css()](http://api.jquery.com/css/) operates. +[![NpmVersion](https://img.shields.io/npm/v/cssstyle.svg)](https://www.npmjs.com/package/cssstyle) [![Build Status](https://travis-ci.org/jsdom/cssstyle.svg?branch=master)](https://travis-ci.org/jsdom/cssstyle) [![codecov](https://codecov.io/gh/jsdom/cssstyle/branch/master/graph/badge.svg)](https://codecov.io/gh/jsdom/cssstyle) -### Why not just issue a pull request? +--- -Well, NV wants to keep CSSOM fast (which I can appreciate) and CSS2Properties aren't required by the standard (though every browser has the interface). So I figured the path of least resistance would be to just modify this one class, publish it as a node module (that requires CSSOM) and then make a pull request of jsdom to use it. +#### Background -### How do I test this code? +This package is an extension of the CSSStyleDeclaration class in Nikita Vasilyev's [CSSOM](https://github.com/NV/CSSOM) with added support for CSS 2 & 3 properties. The primary use case is for testing browser code in a Node environment. -`npm test` should do the trick, assuming you have the dev dependencies installed: +It was originally created by Chad Walker, it is now maintaind by Jon Sakas and other open source contributors. -``` -$ npm test - -tests -✔ Verify Has Properties -✔ Verify Has Functions -✔ Verify Has Special Properties -✔ Test From Style String -✔ Test From Properties -✔ Test Shorthand Properties -✔ Test width and height Properties and null and empty strings -✔ Test Implicit Properties -``` +Bug reports and pull requests are welcome. diff --git a/node_modules/cssstyle/lib/CSSStyleDeclaration.js b/node_modules/cssstyle/lib/CSSStyleDeclaration.js index 0bb9ece..bded9a4 100644 --- a/node_modules/cssstyle/lib/CSSStyleDeclaration.js +++ b/node_modules/cssstyle/lib/CSSStyleDeclaration.js @@ -56,6 +56,11 @@ CSSStyleDeclaration.prototype = { this.removeProperty(name); return; } + var isCustomProperty = name.indexOf('--') === 0; + if (isCustomProperty) { + this._setProperty(name, value, priority); + return; + } var lowercaseName = name.toLowerCase(); if (!allProperties.has(lowercaseName) && !allExtraProperties.has(lowercaseName)) { return; diff --git a/node_modules/cssstyle/lib/CSSStyleDeclaration.test.js b/node_modules/cssstyle/lib/CSSStyleDeclaration.test.js new file mode 100644 index 0000000..9fa8ed3 --- /dev/null +++ b/node_modules/cssstyle/lib/CSSStyleDeclaration.test.js @@ -0,0 +1,556 @@ +'use strict'; + +var { CSSStyleDeclaration } = require('./CSSStyleDeclaration'); + +var allProperties = require('./allProperties'); +var allExtraProperties = require('./allExtraProperties'); +var implementedProperties = require('./implementedProperties'); +var parsers = require('./parsers'); + +var dashedProperties = [...allProperties, ...allExtraProperties]; +var allowedProperties = dashedProperties.map(parsers.dashedToCamelCase); +implementedProperties = Array.from(implementedProperties).map(parsers.dashedToCamelCase); +var invalidProperties = implementedProperties.filter(prop => !allowedProperties.includes(prop)); + +describe('CSSStyleDeclaration', () => { + test('has only valid properties implemented', () => { + expect(invalidProperties.length).toEqual(0); + }); + + test('has all properties', () => { + var style = new CSSStyleDeclaration(); + allProperties.forEach(property => { + expect(style.__lookupGetter__(property)).toBeTruthy(); + expect(style.__lookupSetter__(property)).toBeTruthy(); + }); + }); + + test('has dashed properties', () => { + var style = new CSSStyleDeclaration(); + dashedProperties.forEach(property => { + expect(style.__lookupGetter__(property)).toBeTruthy(); + expect(style.__lookupSetter__(property)).toBeTruthy(); + }); + }); + + test('has all functions', () => { + var style = new CSSStyleDeclaration(); + + expect(typeof style.item).toEqual('function'); + expect(typeof style.getPropertyValue).toEqual('function'); + expect(typeof style.setProperty).toEqual('function'); + expect(typeof style.getPropertyPriority).toEqual('function'); + expect(typeof style.removeProperty).toEqual('function'); + + // TODO - deprecated according to MDN and not implemented at all, can we remove? + expect(typeof style.getPropertyCSSValue).toEqual('function'); + }); + + test('has special properties', () => { + var style = new CSSStyleDeclaration(); + + expect(style.__lookupGetter__('cssText')).toBeTruthy(); + expect(style.__lookupSetter__('cssText')).toBeTruthy(); + expect(style.__lookupGetter__('length')).toBeTruthy(); + expect(style.__lookupSetter__('length')).toBeTruthy(); + expect(style.__lookupGetter__('parentRule')).toBeTruthy(); + }); + + test('from style string', () => { + var style = new CSSStyleDeclaration(); + style.cssText = 'color: blue; background-color: red; width: 78%; height: 50vh;'; + expect(style.length).toEqual(4); + expect(style.cssText).toEqual('color: blue; background-color: red; width: 78%; height: 50vh;'); + expect(style.getPropertyValue('color')).toEqual('blue'); + expect(style.item(0)).toEqual('color'); + expect(style[1]).toEqual('background-color'); + expect(style.backgroundColor).toEqual('red'); + style.cssText = ''; + expect(style.cssText).toEqual(''); + expect(style.length).toEqual(0); + }); + + test('from properties', () => { + var style = new CSSStyleDeclaration(); + style.color = 'blue'; + expect(style.length).toEqual(1); + expect(style[0]).toEqual('color'); + expect(style.cssText).toEqual('color: blue;'); + expect(style.item(0)).toEqual('color'); + expect(style.color).toEqual('blue'); + style.backgroundColor = 'red'; + expect(style.length).toEqual(2); + expect(style[0]).toEqual('color'); + expect(style[1]).toEqual('background-color'); + expect(style.cssText).toEqual('color: blue; background-color: red;'); + expect(style.backgroundColor).toEqual('red'); + style.removeProperty('color'); + expect(style[0]).toEqual('background-color'); + }); + + test('shorthand properties', () => { + var style = new CSSStyleDeclaration(); + style.background = 'blue url(http://www.example.com/some_img.jpg)'; + expect(style.backgroundColor).toEqual('blue'); + expect(style.backgroundImage).toEqual('url(http://www.example.com/some_img.jpg)'); + expect(style.background).toEqual('blue url(http://www.example.com/some_img.jpg)'); + style.border = '0 solid black'; + expect(style.borderWidth).toEqual('0px'); + expect(style.borderStyle).toEqual('solid'); + expect(style.borderColor).toEqual('black'); + expect(style.borderTopWidth).toEqual('0px'); + expect(style.borderLeftStyle).toEqual('solid'); + expect(style.borderBottomColor).toEqual('black'); + style.font = '12em monospace'; + expect(style.fontSize).toEqual('12em'); + expect(style.fontFamily).toEqual('monospace'); + }); + + test('width and height properties and null and empty strings', () => { + var style = new CSSStyleDeclaration(); + style.height = 6; + expect(style.height).toEqual(''); + style.width = 0; + expect(style.width).toEqual('0px'); + style.height = '34%'; + expect(style.height).toEqual('34%'); + style.height = '100vh'; + expect(style.height).toEqual('100vh'); + style.height = '100vw'; + expect(style.height).toEqual('100vw'); + style.height = ''; + expect(1).toEqual(style.length); + expect(style.cssText).toEqual('width: 0px;'); + style.width = null; + expect(0).toEqual(style.length); + expect(style.cssText).toEqual(''); + }); + + test('implicit properties', () => { + var style = new CSSStyleDeclaration(); + style.borderWidth = 0; + expect(style.length).toEqual(1); + expect(style.borderWidth).toEqual('0px'); + expect(style.borderTopWidth).toEqual('0px'); + expect(style.borderBottomWidth).toEqual('0px'); + expect(style.borderLeftWidth).toEqual('0px'); + expect(style.borderRightWidth).toEqual('0px'); + expect(style.cssText).toEqual('border-width: 0px;'); + }); + + test('top, left, right, bottom properties', () => { + var style = new CSSStyleDeclaration(); + style.top = 0; + style.left = '0%'; + style.right = '5em'; + style.bottom = '12pt'; + expect(style.top).toEqual('0px'); + expect(style.left).toEqual('0%'); + expect(style.right).toEqual('5em'); + expect(style.bottom).toEqual('12pt'); + expect(style.length).toEqual(4); + expect(style.cssText).toEqual('top: 0px; left: 0%; right: 5em; bottom: 12pt;'); + }); + + test('clear and clip properties', () => { + var style = new CSSStyleDeclaration(); + style.clear = 'none'; + expect(style.clear).toEqual('none'); + style.clear = 'lfet'; + expect(style.clear).toEqual('none'); + style.clear = 'left'; + expect(style.clear).toEqual('left'); + style.clear = 'right'; + expect(style.clear).toEqual('right'); + style.clear = 'both'; + expect(style.clear).toEqual('both'); + style.clip = 'elipse(5px, 10px)'; + expect(style.clip).toEqual(''); + expect(style.length).toEqual(1); + style.clip = 'rect(0, 3Em, 2pt, 50%)'; + expect(style.clip).toEqual('rect(0px, 3em, 2pt, 50%)'); + expect(style.length).toEqual(2); + expect(style.cssText).toEqual('clear: both; clip: rect(0px, 3em, 2pt, 50%);'); + }); + + test('colors', () => { + var style = new CSSStyleDeclaration(); + style.color = 'rgba(0,0,0,0)'; + expect(style.color).toEqual('rgba(0, 0, 0, 0)'); + style.color = 'rgba(5%, 10%, 20%, 0.4)'; + expect(style.color).toEqual('rgba(12, 25, 51, 0.4)'); + style.color = 'rgb(33%, 34%, 33%)'; + expect(style.color).toEqual('rgb(84, 86, 84)'); + style.color = 'rgba(300, 200, 100, 1.5)'; + expect(style.color).toEqual('rgb(255, 200, 100)'); + style.color = 'hsla(0, 1%, 2%, 0.5)'; + expect(style.color).toEqual('rgba(5, 5, 5, 0.5)'); + style.color = 'hsl(0, 1%, 2%)'; + expect(style.color).toEqual('rgb(5, 5, 5)'); + style.color = 'rebeccapurple'; + expect(style.color).toEqual('rebeccapurple'); + style.color = 'transparent'; + expect(style.color).toEqual('transparent'); + style.color = 'currentcolor'; + expect(style.color).toEqual('currentcolor'); + style.color = '#ffffffff'; + expect(style.color).toEqual('rgba(255, 255, 255, 1)'); + style.color = '#fffa'; + expect(style.color).toEqual('rgba(255, 255, 255, 0.667)'); + style.color = '#ffffff66'; + expect(style.color).toEqual('rgba(255, 255, 255, 0.4)'); + }); + + test('short hand properties with embedded spaces', () => { + var style = new CSSStyleDeclaration(); + style.background = 'rgb(0, 0, 0) url(/something/somewhere.jpg)'; + expect(style.backgroundColor).toEqual('rgb(0, 0, 0)'); + expect(style.backgroundImage).toEqual('url(/something/somewhere.jpg)'); + expect(style.cssText).toEqual('background: rgb(0, 0, 0) url(/something/somewhere.jpg);'); + style = new CSSStyleDeclaration(); + style.border = ' 1px solid black '; + expect(style.border).toEqual('1px solid black'); + }); + + test('setting shorthand properties to an empty string should clear all dependent properties', () => { + var style = new CSSStyleDeclaration(); + style.borderWidth = '1px'; + expect(style.cssText).toEqual('border-width: 1px;'); + style.border = ''; + expect(style.cssText).toEqual(''); + }); + + test('setting implicit properties to an empty string should clear all dependent properties', () => { + var style = new CSSStyleDeclaration(); + style.borderTopWidth = '1px'; + expect(style.cssText).toEqual('border-top-width: 1px;'); + style.borderWidth = ''; + expect(style.cssText).toEqual(''); + }); + + test('setting a shorthand property, whose shorthands are implicit properties, to an empty string should clear all dependent properties', () => { + var style = new CSSStyleDeclaration(); + style.borderTopWidth = '1px'; + expect(style.cssText).toEqual('border-top-width: 1px;'); + style.border = ''; + expect(style.cssText).toEqual(''); + style.borderTop = '1px solid black'; + expect(style.cssText).toEqual('border-top: 1px solid black;'); + style.border = ''; + expect(style.cssText).toEqual(''); + }); + + test('setting border values to "none" should clear dependent values', () => { + var style = new CSSStyleDeclaration(); + style.borderTopWidth = '1px'; + expect(style.cssText).toEqual('border-top-width: 1px;'); + style.border = 'none'; + expect(style.cssText).toEqual(''); + style.borderTopWidth = '1px'; + expect(style.cssText).toEqual('border-top-width: 1px;'); + style.borderTopStyle = 'none'; + expect(style.cssText).toEqual(''); + style.borderTopWidth = '1px'; + expect(style.cssText).toEqual('border-top-width: 1px;'); + style.borderTop = 'none'; + expect(style.cssText).toEqual(''); + style.borderTopWidth = '1px'; + style.borderLeftWidth = '1px'; + expect(style.cssText).toEqual('border-top-width: 1px; border-left-width: 1px;'); + style.borderTop = 'none'; + expect(style.cssText).toEqual('border-left-width: 1px;'); + }); + + test('setting border to 0 should be okay', () => { + var style = new CSSStyleDeclaration(); + style.border = 0; + expect(style.cssText).toEqual('border: 0px;'); + }); + + test('setting values implicit and shorthand properties via csstext and setproperty should propagate to dependent properties', () => { + var style = new CSSStyleDeclaration(); + style.cssText = 'border: 1px solid black;'; + expect(style.cssText).toEqual('border: 1px solid black;'); + expect(style.borderTop).toEqual('1px solid black'); + style.border = ''; + expect(style.cssText).toEqual(''); + style.setProperty('border', '1px solid black'); + expect(style.cssText).toEqual('border: 1px solid black;'); + }); + + test('setting opacity should work', () => { + var style = new CSSStyleDeclaration(); + style.setProperty('opacity', 0.75); + expect(style.cssText).toEqual('opacity: 0.75;'); + style.opacity = '0.50'; + expect(style.cssText).toEqual('opacity: 0.5;'); + style.opacity = 1; + expect(style.cssText).toEqual('opacity: 1;'); + }); + + test('width and height of auto should work', () => { + var style = new CSSStyleDeclaration(); + style.width = 'auto'; + expect(style.cssText).toEqual('width: auto;'); + expect(style.width).toEqual('auto'); + style = new CSSStyleDeclaration(); + style.height = 'auto'; + expect(style.cssText).toEqual('height: auto;'); + expect(style.height).toEqual('auto'); + }); + + test('padding and margin should set/clear shorthand properties', () => { + var style = new CSSStyleDeclaration(); + var parts = ['Top', 'Right', 'Bottom', 'Left']; + var testParts = function(name, v, V) { + style[name] = v; + for (var i = 0; i < 4; i++) { + var part = name + parts[i]; + expect(style[part]).toEqual(V[i]); + } + + expect(style[name]).toEqual(v); + style[name] = ''; + }; + testParts('padding', '1px', ['1px', '1px', '1px', '1px']); + testParts('padding', '1px 2%', ['1px', '2%', '1px', '2%']); + testParts('padding', '1px 2px 3px', ['1px', '2px', '3px', '2px']); + testParts('padding', '1px 2px 3px 4px', ['1px', '2px', '3px', '4px']); + style.paddingTop = style.paddingRight = style.paddingBottom = style.paddingLeft = '1px'; + testParts('padding', '', ['', '', '', '']); + testParts('margin', '1px', ['1px', '1px', '1px', '1px']); + testParts('margin', '1px auto', ['1px', 'auto', '1px', 'auto']); + testParts('margin', '1px 2% 3px', ['1px', '2%', '3px', '2%']); + testParts('margin', '1px 2px 3px 4px', ['1px', '2px', '3px', '4px']); + style.marginTop = style.marginRight = style.marginBottom = style.marginLeft = '1px'; + testParts('margin', '', ['', '', '', '']); + }); + + test('padding and margin shorthands should set main properties', () => { + var style = new CSSStyleDeclaration(); + var parts = ['Top', 'Right', 'Bottom', 'Left']; + var testParts = function(name, v, V) { + var expected; + for (var i = 0; i < 4; i++) { + style[name] = v; + style[name + parts[i]] = V; + expected = v.split(/ /); + expected[i] = V; + expected = expected.join(' '); + + expect(style[name]).toEqual(expected); + } + }; + testParts('padding', '1px 2px 3px 4px', '10px'); + testParts('margin', '1px 2px 3px 4px', '10px'); + testParts('margin', '1px 2px 3px 4px', 'auto'); + }); + + test('setting a value to 0 should return the string value', () => { + var style = new CSSStyleDeclaration(); + style.setProperty('fill-opacity', 0); + expect(style.fillOpacity).toEqual('0'); + }); + + test('onchange callback should be called when the csstext changes', () => { + var style = new CSSStyleDeclaration(function(cssText) { + expect(cssText).toEqual('opacity: 0;'); + }); + style.setProperty('opacity', 0); + }); + + test('setting float should work the same as cssfloat', () => { + var style = new CSSStyleDeclaration(); + style.float = 'left'; + expect(style.cssFloat).toEqual('left'); + }); + + test('setting improper css to csstext should not throw', () => { + var style = new CSSStyleDeclaration(); + style.cssText = 'color: '; + expect(style.cssText).toEqual(''); + style.color = 'black'; + style.cssText = 'float: '; + expect(style.cssText).toEqual(''); + }); + + test('url parsing works with quotes', () => { + var style = new CSSStyleDeclaration(); + style.backgroundImage = 'url(http://some/url/here1.png)'; + expect(style.backgroundImage).toEqual('url(http://some/url/here1.png)'); + style.backgroundImage = "url('http://some/url/here2.png')"; + expect(style.backgroundImage).toEqual('url(http://some/url/here2.png)'); + style.backgroundImage = 'url("http://some/url/here3.png")'; + expect(style.backgroundImage).toEqual('url(http://some/url/here3.png)'); + }); + + test('setting 0 to a padding or margin works', () => { + var style = new CSSStyleDeclaration(); + style.padding = 0; + expect(style.cssText).toEqual('padding: 0px;'); + style.margin = '1em'; + style.marginTop = '0'; + expect(style.marginTop).toEqual('0px'); + }); + + test('setting ex units to a padding or margin works', () => { + var style = new CSSStyleDeclaration(); + style.padding = '1ex'; + expect(style.cssText).toEqual('padding: 1ex;'); + style.margin = '1em'; + style.marginTop = '0.5ex'; + expect(style.marginTop).toEqual('0.5ex'); + }); + + test('setting null to background works', () => { + var style = new CSSStyleDeclaration(); + style.background = 'red'; + expect(style.cssText).toEqual('background: red;'); + style.background = null; + expect(style.cssText).toEqual(''); + }); + + test('flex properties should keep their values', () => { + var style = new CSSStyleDeclaration(); + style.flexDirection = 'column'; + expect(style.cssText).toEqual('flex-direction: column;'); + style.flexDirection = 'row'; + expect(style.cssText).toEqual('flex-direction: row;'); + }); + + test('camelcase properties are not assigned with `.setproperty()`', () => { + var style = new CSSStyleDeclaration(); + style.setProperty('fontSize', '12px'); + expect(style.cssText).toEqual(''); + }); + + test('casing is ignored in `.setproperty()`', () => { + var style = new CSSStyleDeclaration(); + style.setProperty('FoNt-SiZe', '12px'); + expect(style.fontSize).toEqual('12px'); + expect(style.getPropertyValue('font-size')).toEqual('12px'); + }); + + test('support non string entries in border-spacing', () => { + var style = new CSSStyleDeclaration(); + style.borderSpacing = 0; + expect(style.cssText).toEqual('border-spacing: 0px;'); + }); + + test('float should be valid property for `.setproperty()`', () => { + var style = new CSSStyleDeclaration(); + style.setProperty('float', 'left'); + expect(style.float).toEqual('left'); + expect(style.getPropertyValue('float')).toEqual('left'); + }); + + test('flex-shrink works', () => { + var style = new CSSStyleDeclaration(); + style.setProperty('flex-shrink', 0); + expect(style.getPropertyValue('flex-shrink')).toEqual('0'); + style.setProperty('flex-shrink', 1); + expect(style.getPropertyValue('flex-shrink')).toEqual('1'); + expect(style.cssText).toEqual('flex-shrink: 1;'); + }); + + test('flex-grow works', () => { + var style = new CSSStyleDeclaration(); + style.setProperty('flex-grow', 2); + expect(style.getPropertyValue('flex-grow')).toEqual('2'); + expect(style.cssText).toEqual('flex-grow: 2;'); + }); + + test('flex-basis works', () => { + var style = new CSSStyleDeclaration(); + style.setProperty('flex-basis', 0); + expect(style.getPropertyValue('flex-basis')).toEqual('0px'); + style.setProperty('flex-basis', '250px'); + expect(style.getPropertyValue('flex-basis')).toEqual('250px'); + style.setProperty('flex-basis', '10em'); + expect(style.getPropertyValue('flex-basis')).toEqual('10em'); + style.setProperty('flex-basis', '30%'); + expect(style.getPropertyValue('flex-basis')).toEqual('30%'); + expect(style.cssText).toEqual('flex-basis: 30%;'); + }); + + test('shorthand flex works', () => { + var style = new CSSStyleDeclaration(); + style.setProperty('flex', 'none'); + expect(style.getPropertyValue('flex-grow')).toEqual('0'); + expect(style.getPropertyValue('flex-shrink')).toEqual('0'); + expect(style.getPropertyValue('flex-basis')).toEqual('auto'); + style.removeProperty('flex'); + style.removeProperty('flex-basis'); + style.setProperty('flex', 'auto'); + expect(style.getPropertyValue('flex-grow')).toEqual(''); + expect(style.getPropertyValue('flex-shrink')).toEqual(''); + expect(style.getPropertyValue('flex-basis')).toEqual('auto'); + style.removeProperty('flex'); + style.setProperty('flex', '0 1 250px'); + expect(style.getPropertyValue('flex')).toEqual('0 1 250px'); + expect(style.getPropertyValue('flex-grow')).toEqual('0'); + expect(style.getPropertyValue('flex-shrink')).toEqual('1'); + expect(style.getPropertyValue('flex-basis')).toEqual('250px'); + style.removeProperty('flex'); + style.setProperty('flex', '2'); + expect(style.getPropertyValue('flex-grow')).toEqual('2'); + expect(style.getPropertyValue('flex-shrink')).toEqual(''); + expect(style.getPropertyValue('flex-basis')).toEqual(''); + style.removeProperty('flex'); + style.setProperty('flex', '20%'); + expect(style.getPropertyValue('flex-grow')).toEqual(''); + expect(style.getPropertyValue('flex-shrink')).toEqual(''); + expect(style.getPropertyValue('flex-basis')).toEqual('20%'); + style.removeProperty('flex'); + style.setProperty('flex', '2 2'); + expect(style.getPropertyValue('flex-grow')).toEqual('2'); + expect(style.getPropertyValue('flex-shrink')).toEqual('2'); + expect(style.getPropertyValue('flex-basis')).toEqual(''); + style.removeProperty('flex'); + }); + + test('font-size get a valid value', () => { + var style = new CSSStyleDeclaration(); + const invalidValue = '1r5px'; + style.cssText = 'font-size: 15px'; + expect(1).toEqual(style.length); + style.cssText = `font-size: ${invalidValue}`; + expect(0).toEqual(style.length); + expect(undefined).toEqual(style[0]); + }); + + test('getPropertyValue for custom properties in cssText', () => { + const style = new CSSStyleDeclaration(); + style.cssText = '--foo: red'; + + expect(style.getPropertyValue('--foo')).toEqual('red'); + }); + + test('getPropertyValue for custom properties with setProperty', () => { + const style = new CSSStyleDeclaration(); + style.setProperty('--bar', 'blue'); + + expect(style.getPropertyValue('--bar')).toEqual('blue'); + }); + + test('getPropertyValue for custom properties with object setter', () => { + const style = new CSSStyleDeclaration(); + style['--baz'] = 'yellow'; + + expect(style.getPropertyValue('--baz')).toEqual(''); + }); + + test('custom properties are case-sensitive', () => { + const style = new CSSStyleDeclaration(); + style.cssText = '--fOo: purple'; + + expect(style.getPropertyValue('--foo')).toEqual(''); + expect(style.getPropertyValue('--fOo')).toEqual('purple'); + }); + + test('supports calc', () => { + const style = new CSSStyleDeclaration(); + style.setProperty('width', 'calc(100% - 100px)'); + expect(style.getPropertyValue('width')).toEqual('calc(100% - 100px)'); + }); +}); diff --git a/node_modules/cssstyle/lib/allExtraProperties.js b/node_modules/cssstyle/lib/allExtraProperties.js index 0d66ca8..44b9c29 100644 --- a/node_modules/cssstyle/lib/allExtraProperties.js +++ b/node_modules/cssstyle/lib/allExtraProperties.js @@ -5,244 +5,63 @@ * current specifications or drafts, but are handled by browsers nevertheless. */ -var allExtraProperties = new Set(); -module.exports = allExtraProperties; -allExtraProperties.add('background-position-x'); -allExtraProperties.add('background-position-y'); -allExtraProperties.add('background-repeat-x'); -allExtraProperties.add('background-repeat-y'); -allExtraProperties.add('color-interpolation'); -allExtraProperties.add('color-profile'); -allExtraProperties.add('color-rendering'); -allExtraProperties.add('css-float'); -allExtraProperties.add('enable-background'); -allExtraProperties.add('fill'); -allExtraProperties.add('fill-opacity'); -allExtraProperties.add('fill-rule'); -allExtraProperties.add('glyph-orientation-horizontal'); -allExtraProperties.add('image-rendering'); -allExtraProperties.add('kerning'); -allExtraProperties.add('marker'); -allExtraProperties.add('marker-end'); -allExtraProperties.add('marker-mid'); -allExtraProperties.add('marker-offset'); -allExtraProperties.add('marker-start'); -allExtraProperties.add('marks'); -allExtraProperties.add('pointer-events'); -allExtraProperties.add('shape-rendering'); -allExtraProperties.add('size'); -allExtraProperties.add('src'); -allExtraProperties.add('stop-color'); -allExtraProperties.add('stop-opacity'); -allExtraProperties.add('stroke'); -allExtraProperties.add('stroke-dasharray'); -allExtraProperties.add('stroke-dashoffset'); -allExtraProperties.add('stroke-linecap'); -allExtraProperties.add('stroke-linejoin'); -allExtraProperties.add('stroke-miterlimit'); -allExtraProperties.add('stroke-opacity'); -allExtraProperties.add('stroke-width'); -allExtraProperties.add('text-anchor'); -allExtraProperties.add('text-line-through'); -allExtraProperties.add('text-line-through-color'); -allExtraProperties.add('text-line-through-mode'); -allExtraProperties.add('text-line-through-style'); -allExtraProperties.add('text-line-through-width'); -allExtraProperties.add('text-overline'); -allExtraProperties.add('text-overline-color'); -allExtraProperties.add('text-overline-mode'); -allExtraProperties.add('text-overline-style'); -allExtraProperties.add('text-overline-width'); -allExtraProperties.add('text-rendering'); -allExtraProperties.add('text-underline'); -allExtraProperties.add('text-underline-color'); -allExtraProperties.add('text-underline-mode'); -allExtraProperties.add('text-underline-style'); -allExtraProperties.add('text-underline-width'); -allExtraProperties.add('unicode-range'); -allExtraProperties.add('vector-effect'); -allExtraProperties.add('webkit-animation'); -allExtraProperties.add('webkit-animation-delay'); -allExtraProperties.add('webkit-animation-direction'); -allExtraProperties.add('webkit-animation-duration'); -allExtraProperties.add('webkit-animation-fill-mode'); -allExtraProperties.add('webkit-animation-iteration-count'); -allExtraProperties.add('webkit-animation-name'); -allExtraProperties.add('webkit-animation-play-state'); -allExtraProperties.add('webkit-animation-timing-function'); -allExtraProperties.add('webkit-appearance'); -allExtraProperties.add('webkit-aspect-ratio'); -allExtraProperties.add('webkit-backface-visibility'); -allExtraProperties.add('webkit-background-clip'); -allExtraProperties.add('webkit-background-composite'); -allExtraProperties.add('webkit-background-origin'); -allExtraProperties.add('webkit-background-size'); -allExtraProperties.add('webkit-border-after'); -allExtraProperties.add('webkit-border-after-color'); -allExtraProperties.add('webkit-border-after-style'); -allExtraProperties.add('webkit-border-after-width'); -allExtraProperties.add('webkit-border-before'); -allExtraProperties.add('webkit-border-before-color'); -allExtraProperties.add('webkit-border-before-style'); -allExtraProperties.add('webkit-border-before-width'); -allExtraProperties.add('webkit-border-end'); -allExtraProperties.add('webkit-border-end-color'); -allExtraProperties.add('webkit-border-end-style'); -allExtraProperties.add('webkit-border-end-width'); -allExtraProperties.add('webkit-border-fit'); -allExtraProperties.add('webkit-border-horizontal-spacing'); -allExtraProperties.add('webkit-border-image'); -allExtraProperties.add('webkit-border-radius'); -allExtraProperties.add('webkit-border-start'); -allExtraProperties.add('webkit-border-start-color'); -allExtraProperties.add('webkit-border-start-style'); -allExtraProperties.add('webkit-border-start-width'); -allExtraProperties.add('webkit-border-vertical-spacing'); -allExtraProperties.add('webkit-box-align'); -allExtraProperties.add('webkit-box-direction'); -allExtraProperties.add('webkit-box-flex'); -allExtraProperties.add('webkit-box-flex-group'); -allExtraProperties.add('webkit-box-lines'); -allExtraProperties.add('webkit-box-ordinal-group'); -allExtraProperties.add('webkit-box-orient'); -allExtraProperties.add('webkit-box-pack'); -allExtraProperties.add('webkit-box-reflect'); -allExtraProperties.add('webkit-box-shadow'); -allExtraProperties.add('webkit-color-correction'); -allExtraProperties.add('webkit-column-axis'); -allExtraProperties.add('webkit-column-break-after'); -allExtraProperties.add('webkit-column-break-before'); -allExtraProperties.add('webkit-column-break-inside'); -allExtraProperties.add('webkit-column-count'); -allExtraProperties.add('webkit-column-gap'); -allExtraProperties.add('webkit-column-rule'); -allExtraProperties.add('webkit-column-rule-color'); -allExtraProperties.add('webkit-column-rule-style'); -allExtraProperties.add('webkit-column-rule-width'); -allExtraProperties.add('webkit-columns'); -allExtraProperties.add('webkit-column-span'); -allExtraProperties.add('webkit-column-width'); -allExtraProperties.add('webkit-filter'); -allExtraProperties.add('webkit-flex-align'); -allExtraProperties.add('webkit-flex-direction'); -allExtraProperties.add('webkit-flex-flow'); -allExtraProperties.add('webkit-flex-item-align'); -allExtraProperties.add('webkit-flex-line-pack'); -allExtraProperties.add('webkit-flex-order'); -allExtraProperties.add('webkit-flex-pack'); -allExtraProperties.add('webkit-flex-wrap'); -allExtraProperties.add('webkit-flow-from'); -allExtraProperties.add('webkit-flow-into'); -allExtraProperties.add('webkit-font-feature-settings'); -allExtraProperties.add('webkit-font-kerning'); -allExtraProperties.add('webkit-font-size-delta'); -allExtraProperties.add('webkit-font-smoothing'); -allExtraProperties.add('webkit-font-variant-ligatures'); -allExtraProperties.add('webkit-highlight'); -allExtraProperties.add('webkit-hyphenate-character'); -allExtraProperties.add('webkit-hyphenate-limit-after'); -allExtraProperties.add('webkit-hyphenate-limit-before'); -allExtraProperties.add('webkit-hyphenate-limit-lines'); -allExtraProperties.add('webkit-hyphens'); -allExtraProperties.add('webkit-line-align'); -allExtraProperties.add('webkit-line-box-contain'); -allExtraProperties.add('webkit-line-break'); -allExtraProperties.add('webkit-line-clamp'); -allExtraProperties.add('webkit-line-grid'); -allExtraProperties.add('webkit-line-snap'); -allExtraProperties.add('webkit-locale'); -allExtraProperties.add('webkit-logical-height'); -allExtraProperties.add('webkit-logical-width'); -allExtraProperties.add('webkit-margin-after'); -allExtraProperties.add('webkit-margin-after-collapse'); -allExtraProperties.add('webkit-margin-before'); -allExtraProperties.add('webkit-margin-before-collapse'); -allExtraProperties.add('webkit-margin-bottom-collapse'); -allExtraProperties.add('webkit-margin-collapse'); -allExtraProperties.add('webkit-margin-end'); -allExtraProperties.add('webkit-margin-start'); -allExtraProperties.add('webkit-margin-top-collapse'); -allExtraProperties.add('webkit-marquee'); -allExtraProperties.add('webkit-marquee-direction'); -allExtraProperties.add('webkit-marquee-increment'); -allExtraProperties.add('webkit-marquee-repetition'); -allExtraProperties.add('webkit-marquee-speed'); -allExtraProperties.add('webkit-marquee-style'); -allExtraProperties.add('webkit-mask'); -allExtraProperties.add('webkit-mask-attachment'); -allExtraProperties.add('webkit-mask-box-image'); -allExtraProperties.add('webkit-mask-box-image-outset'); -allExtraProperties.add('webkit-mask-box-image-repeat'); -allExtraProperties.add('webkit-mask-box-image-slice'); -allExtraProperties.add('webkit-mask-box-image-source'); -allExtraProperties.add('webkit-mask-box-image-width'); -allExtraProperties.add('webkit-mask-clip'); -allExtraProperties.add('webkit-mask-composite'); -allExtraProperties.add('webkit-mask-image'); -allExtraProperties.add('webkit-mask-origin'); -allExtraProperties.add('webkit-mask-position'); -allExtraProperties.add('webkit-mask-position-x'); -allExtraProperties.add('webkit-mask-position-y'); -allExtraProperties.add('webkit-mask-repeat'); -allExtraProperties.add('webkit-mask-repeat-x'); -allExtraProperties.add('webkit-mask-repeat-y'); -allExtraProperties.add('webkit-mask-size'); -allExtraProperties.add('webkit-match-nearest-mail-blockquote-color'); -allExtraProperties.add('webkit-max-logical-height'); -allExtraProperties.add('webkit-max-logical-width'); -allExtraProperties.add('webkit-min-logical-height'); -allExtraProperties.add('webkit-min-logical-width'); -allExtraProperties.add('webkit-nbsp-mode'); -allExtraProperties.add('webkit-overflow-scrolling'); -allExtraProperties.add('webkit-padding-after'); -allExtraProperties.add('webkit-padding-before'); -allExtraProperties.add('webkit-padding-end'); -allExtraProperties.add('webkit-padding-start'); -allExtraProperties.add('webkit-perspective'); -allExtraProperties.add('webkit-perspective-origin'); -allExtraProperties.add('webkit-perspective-origin-x'); -allExtraProperties.add('webkit-perspective-origin-y'); -allExtraProperties.add('webkit-print-color-adjust'); -allExtraProperties.add('webkit-region-break-after'); -allExtraProperties.add('webkit-region-break-before'); -allExtraProperties.add('webkit-region-break-inside'); -allExtraProperties.add('webkit-region-overflow'); -allExtraProperties.add('webkit-rtl-ordering'); -allExtraProperties.add('webkit-svg-shadow'); -allExtraProperties.add('webkit-tap-highlight-color'); -allExtraProperties.add('webkit-text-combine'); -allExtraProperties.add('webkit-text-decorations-in-effect'); -allExtraProperties.add('webkit-text-emphasis'); -allExtraProperties.add('webkit-text-emphasis-color'); -allExtraProperties.add('webkit-text-emphasis-position'); -allExtraProperties.add('webkit-text-emphasis-style'); -allExtraProperties.add('webkit-text-fill-color'); -allExtraProperties.add('webkit-text-orientation'); -allExtraProperties.add('webkit-text-security'); -allExtraProperties.add('webkit-text-size-adjust'); -allExtraProperties.add('webkit-text-stroke'); -allExtraProperties.add('webkit-text-stroke-color'); -allExtraProperties.add('webkit-text-stroke-width'); -allExtraProperties.add('webkit-transform'); -allExtraProperties.add('webkit-transform-origin'); -allExtraProperties.add('webkit-transform-origin-x'); -allExtraProperties.add('webkit-transform-origin-y'); -allExtraProperties.add('webkit-transform-origin-z'); -allExtraProperties.add('webkit-transform-style'); -allExtraProperties.add('webkit-transition'); -allExtraProperties.add('webkit-transition-delay'); -allExtraProperties.add('webkit-transition-duration'); -allExtraProperties.add('webkit-transition-property'); -allExtraProperties.add('webkit-transition-timing-function'); -allExtraProperties.add('webkit-user-drag'); -allExtraProperties.add('webkit-user-modify'); -allExtraProperties.add('webkit-user-select'); -allExtraProperties.add('webkit-wrap'); -allExtraProperties.add('webkit-wrap-flow'); -allExtraProperties.add('webkit-wrap-margin'); -allExtraProperties.add('webkit-wrap-padding'); -allExtraProperties.add('webkit-wrap-shape-inside'); -allExtraProperties.add('webkit-wrap-shape-outside'); -allExtraProperties.add('webkit-wrap-through'); -allExtraProperties.add('webkit-writing-mode'); -allExtraProperties.add('zoom'); +var allWebkitProperties = require('./allWebkitProperties'); + +module.exports = new Set( + [ + 'background-position-x', + 'background-position-y', + 'background-repeat-x', + 'background-repeat-y', + 'color-interpolation', + 'color-profile', + 'color-rendering', + 'css-float', + 'enable-background', + 'fill', + 'fill-opacity', + 'fill-rule', + 'glyph-orientation-horizontal', + 'image-rendering', + 'kerning', + 'marker', + 'marker-end', + 'marker-mid', + 'marker-offset', + 'marker-start', + 'marks', + 'pointer-events', + 'shape-rendering', + 'size', + 'src', + 'stop-color', + 'stop-opacity', + 'stroke', + 'stroke-dasharray', + 'stroke-dashoffset', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-miterlimit', + 'stroke-opacity', + 'stroke-width', + 'text-anchor', + 'text-line-through', + 'text-line-through-color', + 'text-line-through-mode', + 'text-line-through-style', + 'text-line-through-width', + 'text-overline', + 'text-overline-color', + 'text-overline-mode', + 'text-overline-style', + 'text-overline-width', + 'text-rendering', + 'text-underline', + 'text-underline-color', + 'text-underline-mode', + 'text-underline-style', + 'text-underline-width', + 'unicode-range', + 'vector-effect', + ].concat(allWebkitProperties) +); diff --git a/node_modules/cssstyle/lib/allProperties.js b/node_modules/cssstyle/lib/allProperties.js index fc801df..892a398 100644 --- a/node_modules/cssstyle/lib/allProperties.js +++ b/node_modules/cssstyle/lib/allProperties.js @@ -1,457 +1,462 @@ 'use strict'; -// autogenerated - 2/3/2019 +// autogenerated - 4/29/2020 /* * * https://www.w3.org/Style/CSS/all-properties.en.html */ -var allProperties = new Set(); -module.exports = allProperties; -allProperties.add('align-content'); -allProperties.add('align-items'); -allProperties.add('align-self'); -allProperties.add('alignment-baseline'); -allProperties.add('all'); -allProperties.add('animation'); -allProperties.add('animation-delay'); -allProperties.add('animation-direction'); -allProperties.add('animation-duration'); -allProperties.add('animation-fill-mode'); -allProperties.add('animation-iteration-count'); -allProperties.add('animation-name'); -allProperties.add('animation-play-state'); -allProperties.add('animation-timing-function'); -allProperties.add('appearance'); -allProperties.add('azimuth'); -allProperties.add('background'); -allProperties.add('background-attachment'); -allProperties.add('background-blend-mode'); -allProperties.add('background-clip'); -allProperties.add('background-color'); -allProperties.add('background-image'); -allProperties.add('background-origin'); -allProperties.add('background-position'); -allProperties.add('background-repeat'); -allProperties.add('background-size'); -allProperties.add('baseline-shift'); -allProperties.add('block-overflow'); -allProperties.add('block-size'); -allProperties.add('bookmark-label'); -allProperties.add('bookmark-level'); -allProperties.add('bookmark-state'); -allProperties.add('border'); -allProperties.add('border-block'); -allProperties.add('border-block-color'); -allProperties.add('border-block-end'); -allProperties.add('border-block-end-color'); -allProperties.add('border-block-end-style'); -allProperties.add('border-block-end-width'); -allProperties.add('border-block-start'); -allProperties.add('border-block-start-color'); -allProperties.add('border-block-start-style'); -allProperties.add('border-block-start-width'); -allProperties.add('border-block-style'); -allProperties.add('border-block-width'); -allProperties.add('border-bottom'); -allProperties.add('border-bottom-color'); -allProperties.add('border-bottom-left-radius'); -allProperties.add('border-bottom-right-radius'); -allProperties.add('border-bottom-style'); -allProperties.add('border-bottom-width'); -allProperties.add('border-boundary'); -allProperties.add('border-collapse'); -allProperties.add('border-color'); -allProperties.add('border-end-end-radius'); -allProperties.add('border-end-start-radius'); -allProperties.add('border-image'); -allProperties.add('border-image-outset'); -allProperties.add('border-image-repeat'); -allProperties.add('border-image-slice'); -allProperties.add('border-image-source'); -allProperties.add('border-image-width'); -allProperties.add('border-inline'); -allProperties.add('border-inline-color'); -allProperties.add('border-inline-end'); -allProperties.add('border-inline-end-color'); -allProperties.add('border-inline-end-style'); -allProperties.add('border-inline-end-width'); -allProperties.add('border-inline-start'); -allProperties.add('border-inline-start-color'); -allProperties.add('border-inline-start-style'); -allProperties.add('border-inline-start-width'); -allProperties.add('border-inline-style'); -allProperties.add('border-inline-width'); -allProperties.add('border-left'); -allProperties.add('border-left-color'); -allProperties.add('border-left-style'); -allProperties.add('border-left-width'); -allProperties.add('border-radius'); -allProperties.add('border-right'); -allProperties.add('border-right-color'); -allProperties.add('border-right-style'); -allProperties.add('border-right-width'); -allProperties.add('border-spacing'); -allProperties.add('border-start-end-radius'); -allProperties.add('border-start-start-radius'); -allProperties.add('border-style'); -allProperties.add('border-top'); -allProperties.add('border-top-color'); -allProperties.add('border-top-left-radius'); -allProperties.add('border-top-right-radius'); -allProperties.add('border-top-style'); -allProperties.add('border-top-width'); -allProperties.add('border-width'); -allProperties.add('bottom'); -allProperties.add('box-decoration-break'); -allProperties.add('box-shadow'); -allProperties.add('box-sizing'); -allProperties.add('box-snap'); -allProperties.add('break-after'); -allProperties.add('break-before'); -allProperties.add('break-inside'); -allProperties.add('caption-side'); -allProperties.add('caret'); -allProperties.add('caret-color'); -allProperties.add('caret-shape'); -allProperties.add('chains'); -allProperties.add('clear'); -allProperties.add('clip'); -allProperties.add('clip-path'); -allProperties.add('clip-rule'); -allProperties.add('color'); -allProperties.add('color-interpolation-filters'); -allProperties.add('column-count'); -allProperties.add('column-fill'); -allProperties.add('column-gap'); -allProperties.add('column-rule'); -allProperties.add('column-rule-color'); -allProperties.add('column-rule-style'); -allProperties.add('column-rule-width'); -allProperties.add('column-span'); -allProperties.add('column-width'); -allProperties.add('columns'); -allProperties.add('contain'); -allProperties.add('content'); -allProperties.add('continue'); -allProperties.add('counter-increment'); -allProperties.add('counter-reset'); -allProperties.add('counter-set'); -allProperties.add('cue'); -allProperties.add('cue-after'); -allProperties.add('cue-before'); -allProperties.add('cursor'); -allProperties.add('direction'); -allProperties.add('display'); -allProperties.add('dominant-baseline'); -allProperties.add('elevation'); -allProperties.add('empty-cells'); -allProperties.add('filter'); -allProperties.add('flex'); -allProperties.add('flex-basis'); -allProperties.add('flex-direction'); -allProperties.add('flex-flow'); -allProperties.add('flex-grow'); -allProperties.add('flex-shrink'); -allProperties.add('flex-wrap'); -allProperties.add('float'); -allProperties.add('flood-color'); -allProperties.add('flood-opacity'); -allProperties.add('flow'); -allProperties.add('flow-from'); -allProperties.add('flow-into'); -allProperties.add('font'); -allProperties.add('font-family'); -allProperties.add('font-feature-settings'); -allProperties.add('font-kerning'); -allProperties.add('font-language-override'); -allProperties.add('font-max-size'); -allProperties.add('font-min-size'); -allProperties.add('font-optical-sizing'); -allProperties.add('font-palette'); -allProperties.add('font-size'); -allProperties.add('font-size-adjust'); -allProperties.add('font-stretch'); -allProperties.add('font-style'); -allProperties.add('font-synthesis'); -allProperties.add('font-synthesis-small-caps'); -allProperties.add('font-synthesis-style'); -allProperties.add('font-synthesis-weight'); -allProperties.add('font-variant'); -allProperties.add('font-variant-alternates'); -allProperties.add('font-variant-caps'); -allProperties.add('font-variant-east-asian'); -allProperties.add('font-variant-emoji'); -allProperties.add('font-variant-ligatures'); -allProperties.add('font-variant-numeric'); -allProperties.add('font-variant-position'); -allProperties.add('font-variation-settings'); -allProperties.add('font-weight'); -allProperties.add('footnote-display'); -allProperties.add('footnote-policy'); -allProperties.add('gap'); -allProperties.add('glyph-orientation-vertical'); -allProperties.add('grid'); -allProperties.add('grid-area'); -allProperties.add('grid-auto-columns'); -allProperties.add('grid-auto-flow'); -allProperties.add('grid-auto-rows'); -allProperties.add('grid-column'); -allProperties.add('grid-column-end'); -allProperties.add('grid-column-start'); -allProperties.add('grid-row'); -allProperties.add('grid-row-end'); -allProperties.add('grid-row-start'); -allProperties.add('grid-template'); -allProperties.add('grid-template-areas'); -allProperties.add('grid-template-columns'); -allProperties.add('grid-template-rows'); -allProperties.add('hanging-punctuation'); -allProperties.add('height'); -allProperties.add('hyphenate-character'); -allProperties.add('hyphenate-limit-chars'); -allProperties.add('hyphenate-limit-last'); -allProperties.add('hyphenate-limit-lines'); -allProperties.add('hyphenate-limit-zone'); -allProperties.add('hyphens'); -allProperties.add('image-orientation'); -allProperties.add('image-resolution'); -allProperties.add('initial-letters'); -allProperties.add('initial-letters-align'); -allProperties.add('initial-letters-wrap'); -allProperties.add('inline-size'); -allProperties.add('inline-sizing'); -allProperties.add('inset'); -allProperties.add('inset-block'); -allProperties.add('inset-block-end'); -allProperties.add('inset-block-start'); -allProperties.add('inset-inline'); -allProperties.add('inset-inline-end'); -allProperties.add('inset-inline-start'); -allProperties.add('isolation'); -allProperties.add('justify-content'); -allProperties.add('justify-items'); -allProperties.add('justify-self'); -allProperties.add('left'); -allProperties.add('letter-spacing'); -allProperties.add('lighting-color'); -allProperties.add('line-break'); -allProperties.add('line-clamp'); -allProperties.add('line-grid'); -allProperties.add('line-height'); -allProperties.add('line-padding'); -allProperties.add('line-snap'); -allProperties.add('list-style'); -allProperties.add('list-style-image'); -allProperties.add('list-style-position'); -allProperties.add('list-style-type'); -allProperties.add('margin'); -allProperties.add('margin-block'); -allProperties.add('margin-block-end'); -allProperties.add('margin-block-start'); -allProperties.add('margin-bottom'); -allProperties.add('margin-inline'); -allProperties.add('margin-inline-end'); -allProperties.add('margin-inline-start'); -allProperties.add('margin-left'); -allProperties.add('margin-right'); -allProperties.add('margin-top'); -allProperties.add('margin-trim'); -allProperties.add('marker-side'); -allProperties.add('mask'); -allProperties.add('mask-border'); -allProperties.add('mask-border-mode'); -allProperties.add('mask-border-outset'); -allProperties.add('mask-border-repeat'); -allProperties.add('mask-border-slice'); -allProperties.add('mask-border-source'); -allProperties.add('mask-border-width'); -allProperties.add('mask-clip'); -allProperties.add('mask-composite'); -allProperties.add('mask-image'); -allProperties.add('mask-mode'); -allProperties.add('mask-origin'); -allProperties.add('mask-position'); -allProperties.add('mask-repeat'); -allProperties.add('mask-size'); -allProperties.add('mask-type'); -allProperties.add('max-block-size'); -allProperties.add('max-height'); -allProperties.add('max-inline-size'); -allProperties.add('max-lines'); -allProperties.add('max-width'); -allProperties.add('min-block-size'); -allProperties.add('min-height'); -allProperties.add('min-inline-size'); -allProperties.add('min-width'); -allProperties.add('mix-blend-mode'); -allProperties.add('nav-down'); -allProperties.add('nav-left'); -allProperties.add('nav-right'); -allProperties.add('nav-up'); -allProperties.add('object-fit'); -allProperties.add('object-position'); -allProperties.add('offset'); -allProperties.add('offset-after'); -allProperties.add('offset-anchor'); -allProperties.add('offset-before'); -allProperties.add('offset-distance'); -allProperties.add('offset-end'); -allProperties.add('offset-path'); -allProperties.add('offset-position'); -allProperties.add('offset-rotate'); -allProperties.add('offset-start'); -allProperties.add('opacity'); -allProperties.add('order'); -allProperties.add('orphans'); -allProperties.add('outline'); -allProperties.add('outline-color'); -allProperties.add('outline-offset'); -allProperties.add('outline-style'); -allProperties.add('outline-width'); -allProperties.add('overflow'); -allProperties.add('overflow-block'); -allProperties.add('overflow-inline'); -allProperties.add('overflow-wrap'); -allProperties.add('overflow-x'); -allProperties.add('overflow-y'); -allProperties.add('padding'); -allProperties.add('padding-block'); -allProperties.add('padding-block-end'); -allProperties.add('padding-block-start'); -allProperties.add('padding-bottom'); -allProperties.add('padding-inline'); -allProperties.add('padding-inline-end'); -allProperties.add('padding-inline-start'); -allProperties.add('padding-left'); -allProperties.add('padding-right'); -allProperties.add('padding-top'); -allProperties.add('page'); -allProperties.add('page-break-after'); -allProperties.add('page-break-before'); -allProperties.add('page-break-inside'); -allProperties.add('pause'); -allProperties.add('pause-after'); -allProperties.add('pause-before'); -allProperties.add('pitch'); -allProperties.add('pitch-range'); -allProperties.add('place-content'); -allProperties.add('place-items'); -allProperties.add('place-self'); -allProperties.add('play-during'); -allProperties.add('position'); -allProperties.add('presentation-level'); -allProperties.add('quotes'); -allProperties.add('region-fragment'); -allProperties.add('resize'); -allProperties.add('rest'); -allProperties.add('rest-after'); -allProperties.add('rest-before'); -allProperties.add('richness'); -allProperties.add('right'); -allProperties.add('row-gap'); -allProperties.add('ruby-align'); -allProperties.add('ruby-merge'); -allProperties.add('ruby-position'); -allProperties.add('running'); -allProperties.add('scroll-behavior'); -allProperties.add('scroll-margin'); -allProperties.add('scroll-margin-block'); -allProperties.add('scroll-margin-block-end'); -allProperties.add('scroll-margin-block-start'); -allProperties.add('scroll-margin-bottom'); -allProperties.add('scroll-margin-inline'); -allProperties.add('scroll-margin-inline-end'); -allProperties.add('scroll-margin-inline-start'); -allProperties.add('scroll-margin-left'); -allProperties.add('scroll-margin-right'); -allProperties.add('scroll-margin-top'); -allProperties.add('scroll-padding'); -allProperties.add('scroll-padding-block'); -allProperties.add('scroll-padding-block-end'); -allProperties.add('scroll-padding-block-start'); -allProperties.add('scroll-padding-bottom'); -allProperties.add('scroll-padding-inline'); -allProperties.add('scroll-padding-inline-end'); -allProperties.add('scroll-padding-inline-start'); -allProperties.add('scroll-padding-left'); -allProperties.add('scroll-padding-right'); -allProperties.add('scroll-padding-top'); -allProperties.add('scroll-snap-align'); -allProperties.add('scroll-snap-stop'); -allProperties.add('scroll-snap-type'); -allProperties.add('shape-image-threshold'); -allProperties.add('shape-inside'); -allProperties.add('shape-margin'); -allProperties.add('shape-outside'); -allProperties.add('speak'); -allProperties.add('speak-as'); -allProperties.add('speak-header'); -allProperties.add('speak-numeral'); -allProperties.add('speak-punctuation'); -allProperties.add('speech-rate'); -allProperties.add('stress'); -allProperties.add('string-set'); -allProperties.add('tab-size'); -allProperties.add('table-layout'); -allProperties.add('text-align'); -allProperties.add('text-align-all'); -allProperties.add('text-align-last'); -allProperties.add('text-combine-upright'); -allProperties.add('text-decoration'); -allProperties.add('text-decoration-color'); -allProperties.add('text-decoration-line'); -allProperties.add('text-decoration-style'); -allProperties.add('text-emphasis'); -allProperties.add('text-emphasis-color'); -allProperties.add('text-emphasis-position'); -allProperties.add('text-emphasis-style'); -allProperties.add('text-group-align'); -allProperties.add('text-indent'); -allProperties.add('text-justify'); -allProperties.add('text-orientation'); -allProperties.add('text-overflow'); -allProperties.add('text-shadow'); -allProperties.add('text-space-collapse'); -allProperties.add('text-space-trim'); -allProperties.add('text-spacing'); -allProperties.add('text-transform'); -allProperties.add('text-underline-position'); -allProperties.add('text-wrap'); -allProperties.add('top'); -allProperties.add('transform'); -allProperties.add('transform-box'); -allProperties.add('transform-origin'); -allProperties.add('transition'); -allProperties.add('transition-delay'); -allProperties.add('transition-duration'); -allProperties.add('transition-property'); -allProperties.add('transition-timing-function'); -allProperties.add('unicode-bidi'); -allProperties.add('user-select'); -allProperties.add('vertical-align'); -allProperties.add('visibility'); -allProperties.add('voice-balance'); -allProperties.add('voice-duration'); -allProperties.add('voice-family'); -allProperties.add('voice-pitch'); -allProperties.add('voice-range'); -allProperties.add('voice-rate'); -allProperties.add('voice-stress'); -allProperties.add('voice-volume'); -allProperties.add('volume'); -allProperties.add('white-space'); -allProperties.add('widows'); -allProperties.add('width'); -allProperties.add('will-change'); -allProperties.add('word-break'); -allProperties.add('word-spacing'); -allProperties.add('word-wrap'); -allProperties.add('wrap-after'); -allProperties.add('wrap-before'); -allProperties.add('wrap-flow'); -allProperties.add('wrap-inside'); -allProperties.add('wrap-through'); -allProperties.add('writing-mode'); -allProperties.add('z-index'); +module.exports = new Set([ + 'align-content', + 'align-items', + 'align-self', + 'alignment-baseline', + 'all', + 'animation', + 'animation-delay', + 'animation-direction', + 'animation-duration', + 'animation-fill-mode', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-timing-function', + 'appearance', + 'azimuth', + 'background', + 'background-attachment', + 'background-blend-mode', + 'background-clip', + 'background-color', + 'background-image', + 'background-origin', + 'background-position', + 'background-repeat', + 'background-size', + 'baseline-shift', + 'block-overflow', + 'block-size', + 'bookmark-label', + 'bookmark-level', + 'bookmark-state', + '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-boundary', + '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', + 'bottom', + 'box-decoration-break', + 'box-shadow', + 'box-sizing', + 'box-snap', + 'break-after', + 'break-before', + 'break-inside', + 'caption-side', + 'caret', + 'caret-color', + 'caret-shape', + 'chains', + 'clear', + 'clip', + 'clip-path', + 'clip-rule', + 'color', + 'color-adjust', + 'color-interpolation-filters', + 'color-scheme', + 'column-count', + 'column-fill', + 'column-gap', + 'column-rule', + 'column-rule-color', + 'column-rule-style', + 'column-rule-width', + 'column-span', + 'column-width', + 'columns', + 'contain', + 'content', + 'continue', + 'counter-increment', + 'counter-reset', + 'counter-set', + 'cue', + 'cue-after', + 'cue-before', + 'cursor', + 'direction', + 'display', + 'dominant-baseline', + 'elevation', + 'empty-cells', + 'filter', + 'flex', + 'flex-basis', + 'flex-direction', + 'flex-flow', + 'flex-grow', + 'flex-shrink', + 'flex-wrap', + 'float', + 'flood-color', + 'flood-opacity', + 'flow', + 'flow-from', + 'flow-into', + 'font', + 'font-family', + 'font-feature-settings', + 'font-kerning', + 'font-language-override', + 'font-optical-sizing', + 'font-palette', + 'font-size', + 'font-size-adjust', + 'font-stretch', + 'font-style', + 'font-synthesis', + 'font-synthesis-small-caps', + 'font-synthesis-style', + 'font-synthesis-weight', + 'font-variant', + 'font-variant-alternates', + 'font-variant-caps', + 'font-variant-east-asian', + 'font-variant-emoji', + 'font-variant-ligatures', + 'font-variant-numeric', + 'font-variant-position', + 'font-variation-settings', + 'font-weight', + 'footnote-display', + 'footnote-policy', + 'forced-color-adjust', + 'gap', + 'glyph-orientation-vertical', + 'grid', + 'grid-area', + 'grid-auto-columns', + 'grid-auto-flow', + 'grid-auto-rows', + 'grid-column', + 'grid-column-end', + 'grid-column-start', + 'grid-row', + 'grid-row-end', + 'grid-row-start', + 'grid-template', + 'grid-template-areas', + 'grid-template-columns', + 'grid-template-rows', + 'hanging-punctuation', + 'height', + 'hyphenate-character', + 'hyphenate-limit-chars', + 'hyphenate-limit-last', + 'hyphenate-limit-lines', + 'hyphenate-limit-zone', + 'hyphens', + 'image-orientation', + 'image-rendering', + 'image-resolution', + 'initial-letters', + 'initial-letters-align', + 'initial-letters-wrap', + 'inline-size', + 'inline-sizing', + 'inset', + 'inset-block', + 'inset-block-end', + 'inset-block-start', + 'inset-inline', + 'inset-inline-end', + 'inset-inline-start', + 'isolation', + 'justify-content', + 'justify-items', + 'justify-self', + 'left', + 'letter-spacing', + 'lighting-color', + 'line-break', + 'line-clamp', + 'line-grid', + 'line-height', + 'line-padding', + 'line-snap', + 'list-style', + 'list-style-image', + 'list-style-position', + 'list-style-type', + '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', + 'marker-side', + 'mask', + 'mask-border', + 'mask-border-mode', + 'mask-border-outset', + 'mask-border-repeat', + 'mask-border-slice', + 'mask-border-source', + 'mask-border-width', + 'mask-clip', + 'mask-composite', + 'mask-image', + 'mask-mode', + 'mask-origin', + 'mask-position', + 'mask-repeat', + 'mask-size', + 'mask-type', + 'max-block-size', + 'max-height', + 'max-inline-size', + 'max-lines', + 'max-width', + 'min-block-size', + 'min-height', + 'min-inline-size', + 'min-width', + 'mix-blend-mode', + 'nav-down', + 'nav-left', + 'nav-right', + 'nav-up', + 'object-fit', + 'object-position', + 'offset', + 'offset-after', + 'offset-anchor', + 'offset-before', + 'offset-distance', + 'offset-end', + 'offset-path', + 'offset-position', + 'offset-rotate', + 'offset-start', + 'opacity', + 'order', + 'orphans', + 'outline', + 'outline-color', + 'outline-offset', + 'outline-style', + 'outline-width', + 'overflow', + 'overflow-block', + 'overflow-inline', + 'overflow-wrap', + 'overflow-x', + 'overflow-y', + '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', + 'page', + 'page-break-after', + 'page-break-before', + 'page-break-inside', + 'pause', + 'pause-after', + 'pause-before', + 'pitch', + 'pitch-range', + 'place-content', + 'place-items', + 'place-self', + 'play-during', + 'position', + 'quotes', + 'region-fragment', + 'resize', + 'rest', + 'rest-after', + 'rest-before', + 'richness', + 'right', + 'row-gap', + 'ruby-align', + 'ruby-merge', + 'ruby-position', + 'running', + 'scroll-behavior', + 'scroll-margin', + 'scroll-margin-block', + 'scroll-margin-block-end', + 'scroll-margin-block-start', + 'scroll-margin-bottom', + 'scroll-margin-inline', + 'scroll-margin-inline-end', + 'scroll-margin-inline-start', + 'scroll-margin-left', + 'scroll-margin-right', + 'scroll-margin-top', + 'scroll-padding', + 'scroll-padding-block', + 'scroll-padding-block-end', + 'scroll-padding-block-start', + 'scroll-padding-bottom', + 'scroll-padding-inline', + 'scroll-padding-inline-end', + 'scroll-padding-inline-start', + 'scroll-padding-left', + 'scroll-padding-right', + 'scroll-padding-top', + 'scroll-snap-align', + 'scroll-snap-stop', + 'scroll-snap-type', + 'shape-image-threshold', + 'shape-inside', + 'shape-margin', + 'shape-outside', + 'spatial-navigation-action', + 'spatial-navigation-contain', + 'spatial-navigation-function', + 'speak', + 'speak-as', + 'speak-header', + 'speak-numeral', + 'speak-punctuation', + 'speech-rate', + 'stress', + 'string-set', + 'tab-size', + 'table-layout', + 'text-align', + 'text-align-all', + 'text-align-last', + '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-group-align', + 'text-indent', + 'text-justify', + 'text-orientation', + 'text-overflow', + 'text-shadow', + 'text-space-collapse', + 'text-space-trim', + 'text-spacing', + 'text-transform', + 'text-underline-position', + 'text-wrap', + 'top', + 'transform', + 'transform-box', + 'transform-origin', + 'transition', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + 'unicode-bidi', + 'user-select', + 'vertical-align', + 'visibility', + 'voice-balance', + 'voice-duration', + 'voice-family', + 'voice-pitch', + 'voice-range', + 'voice-rate', + 'voice-stress', + 'voice-volume', + 'volume', + 'white-space', + 'widows', + 'width', + 'will-change', + 'word-boundary-detection', + 'word-boundary-expansion', + 'word-break', + 'word-spacing', + 'word-wrap', + 'wrap-after', + 'wrap-before', + 'wrap-flow', + 'wrap-inside', + 'wrap-through', + 'writing-mode', + 'z-index', +]); diff --git a/node_modules/cssstyle/lib/allWebkitProperties.js b/node_modules/cssstyle/lib/allWebkitProperties.js new file mode 100644 index 0000000..d6e71df --- /dev/null +++ b/node_modules/cssstyle/lib/allWebkitProperties.js @@ -0,0 +1,194 @@ +'use strict'; + +/** + * This file contains all implemented properties that are not a part of any + * current specifications or drafts, but are handled by browsers nevertheless. + */ + +module.exports = [ + 'animation', + 'animation-delay', + 'animation-direction', + 'animation-duration', + 'animation-fill-mode', + 'animation-iteration-count', + 'animation-name', + 'animation-play-state', + 'animation-timing-function', + 'appearance', + 'aspect-ratio', + 'backface-visibility', + 'background-clip', + 'background-composite', + 'background-origin', + 'background-size', + 'border-after', + 'border-after-color', + 'border-after-style', + 'border-after-width', + 'border-before', + 'border-before-color', + 'border-before-style', + 'border-before-width', + 'border-end', + 'border-end-color', + 'border-end-style', + 'border-end-width', + 'border-fit', + 'border-horizontal-spacing', + 'border-image', + 'border-radius', + 'border-start', + 'border-start-color', + 'border-start-style', + 'border-start-width', + 'border-vertical-spacing', + 'box-align', + 'box-direction', + 'box-flex', + 'box-flex-group', + 'box-lines', + 'box-ordinal-group', + 'box-orient', + 'box-pack', + 'box-reflect', + 'box-shadow', + 'color-correction', + 'column-axis', + 'column-break-after', + 'column-break-before', + 'column-break-inside', + 'column-count', + 'column-gap', + 'column-rule', + 'column-rule-color', + 'column-rule-style', + 'column-rule-width', + 'columns', + 'column-span', + 'column-width', + 'filter', + 'flex-align', + 'flex-direction', + 'flex-flow', + 'flex-item-align', + 'flex-line-pack', + 'flex-order', + 'flex-pack', + 'flex-wrap', + 'flow-from', + 'flow-into', + 'font-feature-settings', + 'font-kerning', + 'font-size-delta', + 'font-smoothing', + 'font-variant-ligatures', + 'highlight', + 'hyphenate-character', + 'hyphenate-limit-after', + 'hyphenate-limit-before', + 'hyphenate-limit-lines', + 'hyphens', + 'line-align', + 'line-box-contain', + 'line-break', + 'line-clamp', + 'line-grid', + 'line-snap', + 'locale', + 'logical-height', + 'logical-width', + 'margin-after', + 'margin-after-collapse', + 'margin-before', + 'margin-before-collapse', + 'margin-bottom-collapse', + 'margin-collapse', + 'margin-end', + 'margin-start', + 'margin-top-collapse', + 'marquee', + 'marquee-direction', + 'marquee-increment', + 'marquee-repetition', + 'marquee-speed', + 'marquee-style', + 'mask', + 'mask-attachment', + 'mask-box-image', + 'mask-box-image-outset', + 'mask-box-image-repeat', + 'mask-box-image-slice', + 'mask-box-image-source', + 'mask-box-image-width', + 'mask-clip', + 'mask-composite', + 'mask-image', + 'mask-origin', + 'mask-position', + 'mask-position-x', + 'mask-position-y', + 'mask-repeat', + 'mask-repeat-x', + 'mask-repeat-y', + 'mask-size', + 'match-nearest-mail-blockquote-color', + 'max-logical-height', + 'max-logical-width', + 'min-logical-height', + 'min-logical-width', + 'nbsp-mode', + 'overflow-scrolling', + 'padding-after', + 'padding-before', + 'padding-end', + 'padding-start', + 'perspective', + 'perspective-origin', + 'perspective-origin-x', + 'perspective-origin-y', + 'print-color-adjust', + 'region-break-after', + 'region-break-before', + 'region-break-inside', + 'region-overflow', + 'rtl-ordering', + 'svg-shadow', + 'tap-highlight-color', + 'text-combine', + 'text-decorations-in-effect', + 'text-emphasis', + 'text-emphasis-color', + 'text-emphasis-position', + 'text-emphasis-style', + 'text-fill-color', + 'text-orientation', + 'text-security', + 'text-size-adjust', + 'text-stroke', + 'text-stroke-color', + 'text-stroke-width', + 'transform', + 'transform-origin', + 'transform-origin-x', + 'transform-origin-y', + 'transform-origin-z', + 'transform-style', + 'transition', + 'transition-delay', + 'transition-duration', + 'transition-property', + 'transition-timing-function', + 'user-drag', + 'user-modify', + 'user-select', + 'wrap', + 'wrap-flow', + 'wrap-margin', + 'wrap-padding', + 'wrap-shape-inside', + 'wrap-shape-outside', + 'wrap-through', + 'writing-mode', + 'zoom', +].map(prop => 'webkit-' + prop); diff --git a/node_modules/cssstyle/lib/implementedProperties.js b/node_modules/cssstyle/lib/implementedProperties.js index fd8cbca..3828a80 100644 --- a/node_modules/cssstyle/lib/implementedProperties.js +++ b/node_modules/cssstyle/lib/implementedProperties.js @@ -1,6 +1,6 @@ 'use strict'; -// autogenerated - 7/15/2019 +// autogenerated - 4/29/2020 /* * diff --git a/node_modules/cssstyle/lib/parsers.js b/node_modules/cssstyle/lib/parsers.js index 24021ba..8ecdf5e 100644 --- a/node_modules/cssstyle/lib/parsers.js +++ b/node_modules/cssstyle/lib/parsers.js @@ -5,6 +5,7 @@ 'use strict'; const namedColors = require('./named_colors.json'); +const { hslToRgb } = require('./utils/colorSpace'); exports.TYPES = { INTEGER: 1, @@ -17,18 +18,20 @@ exports.TYPES = { ANGLE: 8, KEYWORD: 9, NULL_OR_EMPTY_STR: 10, + CALC: 11, }; // rough regular expressions var integerRegEx = /^[-+]?[0-9]+$/; -var numberRegEx = /^[-+]?[0-9]*\.[0-9]+$/; -var lengthRegEx = /^(0|[-+]?[0-9]*\.?[0-9]+(in|cm|em|mm|pt|pc|px|ex|rem|vh|vw))$/; +var numberRegEx = /^[-+]?[0-9]*\.?[0-9]+$/; +var lengthRegEx = /^(0|[-+]?[0-9]*\.?[0-9]+(in|cm|em|mm|pt|pc|px|ex|rem|vh|vw|ch))$/; var percentRegEx = /^[-+]?[0-9]*\.?[0-9]+%$/; var urlRegEx = /^url\(\s*([^)]*)\s*\)$/; var stringRegEx = /^("[^"]*"|'[^']*')$/; -var colorRegEx1 = /^#[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])?$/; +var colorRegEx1 = /^#([0-9a-fA-F]{3,4}){1,2}$/; var colorRegEx2 = /^rgb\(([^)]*)\)$/; var colorRegEx3 = /^rgba\(([^)]*)\)$/; +var calcRegEx = /^calc\(([^)]*)\)$/; var colorRegEx4 = /^hsla?\(\s*(-?\d+|-?\d*.\d+)\s*,\s*(-?\d+|-?\d*.\d+)%\s*,\s*(-?\d+|-?\d*.\d+)%\s*(,\s*(-?\d+|-?\d*.\d+)\s*)?\)/; var angleRegEx = /^([-+]?[0-9]*\.?[0-9]+)(deg|grad|rad)$/; @@ -60,6 +63,9 @@ exports.valueType = function valueType(val) { if (urlRegEx.test(val)) { return exports.TYPES.URL; } + if (calcRegEx.test(val)) { + return exports.TYPES.CALC; + } if (stringRegEx.test(val)) { return exports.TYPES.STRING; } @@ -69,6 +75,7 @@ exports.valueType = function valueType(val) { if (colorRegEx1.test(val)) { return exports.TYPES.COLOR; } + var res = colorRegEx2.exec(val); var parts; if (res !== null) { @@ -92,7 +99,7 @@ exports.valueType = function valueType(val) { } if ( parts.slice(0, 3).every(percentRegEx.test.bind(percentRegEx)) || - parts.every(integerRegEx.test.bind(integerRegEx)) + parts.slice(0, 3).every(integerRegEx.test.bind(integerRegEx)) ) { if (numberRegEx.test(parts[3])) { return exports.TYPES.COLOR; @@ -200,6 +207,11 @@ exports.parsePercent = function parsePercent(val) { // either a length or a percent exports.parseMeasurement = function parseMeasurement(val) { + var type = exports.valueType(val); + if (type === exports.TYPES.CALC) { + return val; + } + var length = exports.parseLength(val); if (length !== undefined) { return length; @@ -287,15 +299,26 @@ exports.parseColor = function parseColor(val) { alpha = 1; var parts; var res = colorRegEx1.exec(val); - // is it #aaa or #ababab + // is it #aaa, #ababab, #aaaa, #abababaa if (res) { + var defaultHex = val.substr(1); var hex = val.substr(1); - if (hex.length === 3) { + if (hex.length === 3 || hex.length === 4) { hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + + if (defaultHex.length === 4) { + hex = hex + defaultHex[3] + defaultHex[3]; + } } red = parseInt(hex.substr(0, 2), 16); green = parseInt(hex.substr(2, 2), 16); blue = parseInt(hex.substr(4, 2), 16); + if (hex.length === 8) { + var hexAlpha = hex.substr(6, 2); + var hexAlphaToRgbaAlpha = Number((parseInt(hexAlpha, 16) / 255).toFixed(3)); + + return 'rgba(' + red + ', ' + green + ', ' + blue + ', ' + hexAlphaToRgbaAlpha + ')'; + } return 'rgb(' + red + ', ' + green + ', ' + blue + ')'; } @@ -367,10 +390,12 @@ exports.parseColor = function parseColor(val) { if (_alpha && numberRegEx.test(_alpha)) { alpha = parseFloat(_alpha); } + + const [r, g, b] = hslToRgb(hue, saturation / 100, lightness / 100); if (!_alphaString || alpha === 1) { - return 'hsl(' + hue + ', ' + saturation + '%, ' + lightness + '%)'; + return 'rgb(' + r + ', ' + g + ', ' + b + ')'; } - return 'hsla(' + hue + ', ' + saturation + '%, ' + lightness + '%, ' + alpha + ')'; + return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alpha + ')'; } if (type === exports.TYPES.COLOR) { diff --git a/node_modules/cssstyle/lib/parsers.test.js b/node_modules/cssstyle/lib/parsers.test.js new file mode 100644 index 0000000..926f7e7 --- /dev/null +++ b/node_modules/cssstyle/lib/parsers.test.js @@ -0,0 +1,139 @@ +'use strict'; + +const parsers = require('./parsers'); + +describe('valueType', () => { + it('returns color for red', () => { + let input = 'red'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.COLOR); + }); + + it('returns color for #nnnnnn', () => { + let input = '#fefefe'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.COLOR); + }); + + it('returns color for rgb(n, n, n)', () => { + let input = 'rgb(10, 10, 10)'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.COLOR); + }); + + it('returns color for rgb(p, p, p)', () => { + let input = 'rgb(10%, 10%, 10%)'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.COLOR); + }); + + it('returns color for rgba(n, n, n, n)', () => { + let input = 'rgba(10, 10, 10, 1)'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.COLOR); + }); + + it('returns color for rgba(n, n, n, n) with decimal alpha', () => { + let input = 'rgba(10, 10, 10, 0.5)'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.COLOR); + }); + + it('returns color for rgba(p, p, p, n)', () => { + let input = 'rgba(10%, 10%, 10%, 1)'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.COLOR); + }); + + it('returns color for rgba(p, p, p, n) with decimal alpha', () => { + let input = 'rgba(10%, 10%, 10%, 0.5)'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.COLOR); + }); + + it('returns length for 100ch', () => { + let input = '100ch'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.LENGTH); + }); + + it('returns calc from calc(100px * 2)', () => { + let input = 'calc(100px * 2)'; + let output = parsers.valueType(input); + + expect(output).toEqual(parsers.TYPES.CALC); + }); +}); +describe('parseInteger', () => { + it.todo('test'); +}); +describe('parseNumber', () => { + it.todo('test'); +}); +describe('parseLength', () => { + it.todo('test'); +}); +describe('parsePercent', () => { + it.todo('test'); +}); +describe('parseMeasurement', () => { + it.todo('test'); +}); +describe('parseUrl', () => { + it.todo('test'); +}); +describe('parseString', () => { + it.todo('test'); +}); +describe('parseColor', () => { + it('should convert hsl to rgb values', () => { + let input = 'hsla(0, 1%, 2%)'; + let output = parsers.parseColor(input); + + expect(output).toEqual('rgb(5, 5, 5)'); + }); + it('should convert hsla to rgba values', () => { + let input = 'hsla(0, 1%, 2%, 0.5)'; + let output = parsers.parseColor(input); + + expect(output).toEqual('rgba(5, 5, 5, 0.5)'); + }); + + it.todo('Add more tests'); +}); +describe('parseAngle', () => { + it.todo('test'); +}); +describe('parseKeyword', () => { + it.todo('test'); +}); +describe('dashedToCamelCase', () => { + it.todo('test'); +}); +describe('shorthandParser', () => { + it.todo('test'); +}); +describe('shorthandSetter', () => { + it.todo('test'); +}); +describe('shorthandGetter', () => { + it.todo('test'); +}); +describe('implicitSetter', () => { + it.todo('test'); +}); +describe('subImplicitSetter', () => { + it.todo('test'); +}); +describe('camelToDashed', () => { + it.todo('test'); +}); diff --git a/node_modules/cssstyle/lib/properties.js b/node_modules/cssstyle/lib/properties.js index 2b4939c..7f462f3 100644 --- a/node_modules/cssstyle/lib/properties.js +++ b/node_modules/cssstyle/lib/properties.js @@ -1,6 +1,6 @@ 'use strict'; -// autogenerated - 7/15/2019 +// autogenerated - 4/29/2020 /* * @@ -1040,9 +1040,16 @@ fontSize_export_isValid = function (v) { return type === external_dependency_parsers_0.TYPES.LENGTH || type === external_dependency_parsers_0.TYPES.PERCENT || type === external_dependency_parsers_0.TYPES.KEYWORD && fontSize_local_var_absoluteSizes.indexOf(v.toLowerCase()) !== -1 || type === external_dependency_parsers_0.TYPES.KEYWORD && fontSize_local_var_relativeSizes.indexOf(v.toLowerCase()) !== -1; }; +function fontSize_local_fn_parse(v) { + const valueAsString = String(v).toLowerCase(); + const optionalArguments = fontSize_local_var_absoluteSizes.concat(fontSize_local_var_relativeSizes); + const isOptionalArgument = optionalArguments.some(stringValue => stringValue.toLowerCase() === valueAsString); + return isOptionalArgument ? valueAsString : external_dependency_parsers_0.parseMeasurement(v); +} + fontSize_export_definition = { set: function (v) { - this._setProperty('font-size', v); + this._setProperty('font-size', fontSize_local_fn_parse(v)); }, get: function () { return this.getPropertyValue('font-size'); diff --git a/node_modules/cssstyle/lib/properties/fontSize.js b/node_modules/cssstyle/lib/properties/fontSize.js index 287c82a..c956324 100644 --- a/node_modules/cssstyle/lib/properties/fontSize.js +++ b/node_modules/cssstyle/lib/properties/fontSize.js @@ -2,6 +2,7 @@ var TYPES = require('../parsers').TYPES; var valueType = require('../parsers').valueType; +var parseMeasurement = require('../parsers').parseMeasurement; var absoluteSizes = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large']; var relativeSizes = ['larger', 'smaller']; @@ -16,9 +17,18 @@ module.exports.isValid = function(v) { ); }; +function parse(v) { + const valueAsString = String(v).toLowerCase(); + const optionalArguments = absoluteSizes.concat(relativeSizes); + const isOptionalArgument = optionalArguments.some( + stringValue => stringValue.toLowerCase() === valueAsString + ); + return isOptionalArgument ? valueAsString : parseMeasurement(v); +} + module.exports.definition = { set: function(v) { - this._setProperty('font-size', v); + this._setProperty('font-size', parse(v)); }, get: function() { return this.getPropertyValue('font-size'); diff --git a/node_modules/cssstyle/lib/utils/colorSpace.js b/node_modules/cssstyle/lib/utils/colorSpace.js new file mode 100644 index 0000000..92ca7bd --- /dev/null +++ b/node_modules/cssstyle/lib/utils/colorSpace.js @@ -0,0 +1,21 @@ +'use strict'; + +const hueToRgb = (t1, t2, hue) => { + if (hue < 0) hue += 6; + if (hue >= 6) hue -= 6; + + if (hue < 1) return (t2 - t1) * hue + t1; + else if (hue < 3) return t2; + else if (hue < 4) return (t2 - t1) * (4 - hue) + t1; + else return t1; +}; + +// https://www.w3.org/TR/css-color-4/#hsl-to-rgb +exports.hslToRgb = (hue, sat, light) => { + const t2 = light <= 0.5 ? light * (sat + 1) : light + sat - light * sat; + const t1 = light * 2 - t2; + const r = hueToRgb(t1, t2, hue + 2); + const g = hueToRgb(t1, t2, hue); + const b = hueToRgb(t1, t2, hue - 2); + return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; +}; diff --git a/node_modules/minify/LICENSE b/node_modules/cssstyle/node_modules/cssom/LICENSE.txt similarity index 92% rename from node_modules/minify/LICENSE rename to node_modules/cssstyle/node_modules/cssom/LICENSE.txt index 50fc1d3..bc57aac 100644 --- a/node_modules/minify/LICENSE +++ b/node_modules/cssstyle/node_modules/cssom/LICENSE.txt @@ -1,6 +1,4 @@ -(The MIT License) - -Copyright (c) 2012-2019 Coderaiser +Copyright (c) Nikita Vasilyev Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/node_modules/cssstyle/node_modules/cssom/README.mdown b/node_modules/cssstyle/node_modules/cssom/README.mdown new file mode 100644 index 0000000..83af16b --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/README.mdown @@ -0,0 +1,67 @@ +# CSSOM + +CSSOM.js is a CSS parser written in pure JavaScript. It is also a partial implementation of [CSS Object Model](http://dev.w3.org/csswg/cssom/). + + CSSOM.parse("body {color: black}") + -> { + cssRules: [ + { + selectorText: "body", + style: { + 0: "color", + color: "black", + length: 1 + } + } + ] + } + + +## [Parser demo](http://nv.github.com/CSSOM/docs/parse.html) + +Works well in Google Chrome 6+, Safari 5+, Firefox 3.6+, Opera 10.63+. +Doesn't work in IE < 9 because of unsupported getters/setters. + +To use CSSOM.js in the browser you might want to build a one-file version that exposes a single `CSSOM` global variable: + + ➤ git clone https://github.com/NV/CSSOM.git + ➤ cd CSSOM + ➤ node build.js + build/CSSOM.js is done + +To use it with Node.js or any other CommonJS loader: + + ➤ npm install cssom + +## Don’t use it if... + +You parse CSS to mungle, minify or reformat code like this: + +```css +div { + background: gray; + background: linear-gradient(to bottom, white 0%, black 100%); +} +``` + +This pattern is often used to give browsers that don’t understand linear gradients a fallback solution (e.g. gray color in the example). +In CSSOM, `background: gray` [gets overwritten](http://nv.github.io/CSSOM/docs/parse.html#css=div%20%7B%0A%20%20%20%20%20%20background%3A%20gray%3B%0A%20%20%20%20background%3A%20linear-gradient(to%20bottom%2C%20white%200%25%2C%20black%20100%25)%3B%0A%7D). +It doesn't get preserved. + +If you do CSS mungling, minification, image inlining, and such, CSSOM.js is no good for you, considere using one of the following: + + * [postcss](https://github.com/postcss/postcss) + * [reworkcss/css](https://github.com/reworkcss/css) + * [csso](https://github.com/css/csso) + * [mensch](https://github.com/brettstimmerman/mensch) + + +## [Tests](http://nv.github.com/CSSOM/spec/) + +To run tests locally: + + ➤ git submodule init + ➤ git submodule update + + +## [Who uses CSSOM.js](https://github.com/NV/CSSOM/wiki/Who-uses-CSSOM.js) diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSDocumentRule.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSDocumentRule.js new file mode 100644 index 0000000..aec0776 --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSDocumentRule.js @@ -0,0 +1,39 @@ +//.CommonJS +var CSSOM = { + CSSRule: require("./CSSRule").CSSRule, + MatcherList: require("./MatcherList").MatcherList +}; +///CommonJS + + +/** + * @constructor + * @see https://developer.mozilla.org/en/CSS/@-moz-document + */ +CSSOM.CSSDocumentRule = function CSSDocumentRule() { + CSSOM.CSSRule.call(this); + this.matcher = new CSSOM.MatcherList(); + this.cssRules = []; +}; + +CSSOM.CSSDocumentRule.prototype = new CSSOM.CSSRule(); +CSSOM.CSSDocumentRule.prototype.constructor = CSSOM.CSSDocumentRule; +CSSOM.CSSDocumentRule.prototype.type = 10; +//FIXME +//CSSOM.CSSDocumentRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule; +//CSSOM.CSSDocumentRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule; + +Object.defineProperty(CSSOM.CSSDocumentRule.prototype, "cssText", { + get: function() { + var cssTexts = []; + for (var i=0, length=this.cssRules.length; i < length; i++) { + cssTexts.push(this.cssRules[i].cssText); + } + return "@-moz-document " + this.matcher.matcherText + " {" + cssTexts.join("") + "}"; + } +}); + + +//.CommonJS +exports.CSSDocumentRule = CSSOM.CSSDocumentRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSFontFaceRule.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSFontFaceRule.js new file mode 100644 index 0000000..7a537fb --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSFontFaceRule.js @@ -0,0 +1,36 @@ +//.CommonJS +var CSSOM = { + CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration, + CSSRule: require("./CSSRule").CSSRule +}; +///CommonJS + + +/** + * @constructor + * @see http://dev.w3.org/csswg/cssom/#css-font-face-rule + */ +CSSOM.CSSFontFaceRule = function CSSFontFaceRule() { + CSSOM.CSSRule.call(this); + this.style = new CSSOM.CSSStyleDeclaration(); + this.style.parentRule = this; +}; + +CSSOM.CSSFontFaceRule.prototype = new CSSOM.CSSRule(); +CSSOM.CSSFontFaceRule.prototype.constructor = CSSOM.CSSFontFaceRule; +CSSOM.CSSFontFaceRule.prototype.type = 5; +//FIXME +//CSSOM.CSSFontFaceRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule; +//CSSOM.CSSFontFaceRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule; + +// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSFontFaceRule.cpp +Object.defineProperty(CSSOM.CSSFontFaceRule.prototype, "cssText", { + get: function() { + return "@font-face {" + this.style.cssText + "}"; + } +}); + + +//.CommonJS +exports.CSSFontFaceRule = CSSOM.CSSFontFaceRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSHostRule.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSHostRule.js new file mode 100644 index 0000000..365304f --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSHostRule.js @@ -0,0 +1,37 @@ +//.CommonJS +var CSSOM = { + CSSRule: require("./CSSRule").CSSRule +}; +///CommonJS + + +/** + * @constructor + * @see http://www.w3.org/TR/shadow-dom/#host-at-rule + */ +CSSOM.CSSHostRule = function CSSHostRule() { + CSSOM.CSSRule.call(this); + this.cssRules = []; +}; + +CSSOM.CSSHostRule.prototype = new CSSOM.CSSRule(); +CSSOM.CSSHostRule.prototype.constructor = CSSOM.CSSHostRule; +CSSOM.CSSHostRule.prototype.type = 1001; +//FIXME +//CSSOM.CSSHostRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule; +//CSSOM.CSSHostRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule; + +Object.defineProperty(CSSOM.CSSHostRule.prototype, "cssText", { + get: function() { + var cssTexts = []; + for (var i=0, length=this.cssRules.length; i < length; i++) { + cssTexts.push(this.cssRules[i].cssText); + } + return "@host {" + cssTexts.join("") + "}"; + } +}); + + +//.CommonJS +exports.CSSHostRule = CSSOM.CSSHostRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSImportRule.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSImportRule.js new file mode 100644 index 0000000..0398105 --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSImportRule.js @@ -0,0 +1,132 @@ +//.CommonJS +var CSSOM = { + CSSRule: require("./CSSRule").CSSRule, + CSSStyleSheet: require("./CSSStyleSheet").CSSStyleSheet, + MediaList: require("./MediaList").MediaList +}; +///CommonJS + + +/** + * @constructor + * @see http://dev.w3.org/csswg/cssom/#cssimportrule + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSImportRule + */ +CSSOM.CSSImportRule = function CSSImportRule() { + CSSOM.CSSRule.call(this); + this.href = ""; + this.media = new CSSOM.MediaList(); + this.styleSheet = new CSSOM.CSSStyleSheet(); +}; + +CSSOM.CSSImportRule.prototype = new CSSOM.CSSRule(); +CSSOM.CSSImportRule.prototype.constructor = CSSOM.CSSImportRule; +CSSOM.CSSImportRule.prototype.type = 3; + +Object.defineProperty(CSSOM.CSSImportRule.prototype, "cssText", { + get: function() { + var mediaText = this.media.mediaText; + return "@import url(" + this.href + ")" + (mediaText ? " " + mediaText : "") + ";"; + }, + set: function(cssText) { + var i = 0; + + /** + * @import url(partial.css) screen, handheld; + * || | + * after-import media + * | + * url + */ + var state = ''; + + var buffer = ''; + var index; + for (var character; (character = cssText.charAt(i)); i++) { + + switch (character) { + case ' ': + case '\t': + case '\r': + case '\n': + case '\f': + if (state === 'after-import') { + state = 'url'; + } else { + buffer += character; + } + break; + + case '@': + if (!state && cssText.indexOf('@import', i) === i) { + state = 'after-import'; + i += 'import'.length; + buffer = ''; + } + break; + + case 'u': + if (state === 'url' && cssText.indexOf('url(', i) === i) { + index = cssText.indexOf(')', i + 1); + if (index === -1) { + throw i + ': ")" not found'; + } + i += 'url('.length; + var url = cssText.slice(i, index); + if (url[0] === url[url.length - 1]) { + if (url[0] === '"' || url[0] === "'") { + url = url.slice(1, -1); + } + } + this.href = url; + i = index; + state = 'media'; + } + break; + + case '"': + if (state === 'url') { + index = cssText.indexOf('"', i + 1); + if (!index) { + throw i + ": '\"' not found"; + } + this.href = cssText.slice(i + 1, index); + i = index; + state = 'media'; + } + break; + + case "'": + if (state === 'url') { + index = cssText.indexOf("'", i + 1); + if (!index) { + throw i + ': "\'" not found'; + } + this.href = cssText.slice(i + 1, index); + i = index; + state = 'media'; + } + break; + + case ';': + if (state === 'media') { + if (buffer) { + this.media.mediaText = buffer.trim(); + } + } + break; + + default: + if (state === 'media') { + buffer += character; + } + break; + } + } + } +}); + + +//.CommonJS +exports.CSSImportRule = CSSOM.CSSImportRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSKeyframeRule.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSKeyframeRule.js new file mode 100644 index 0000000..c22f2f5 --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSKeyframeRule.js @@ -0,0 +1,37 @@ +//.CommonJS +var CSSOM = { + CSSRule: require("./CSSRule").CSSRule, + CSSStyleDeclaration: require('./CSSStyleDeclaration').CSSStyleDeclaration +}; +///CommonJS + + +/** + * @constructor + * @see http://www.w3.org/TR/css3-animations/#DOM-CSSKeyframeRule + */ +CSSOM.CSSKeyframeRule = function CSSKeyframeRule() { + CSSOM.CSSRule.call(this); + this.keyText = ''; + this.style = new CSSOM.CSSStyleDeclaration(); + this.style.parentRule = this; +}; + +CSSOM.CSSKeyframeRule.prototype = new CSSOM.CSSRule(); +CSSOM.CSSKeyframeRule.prototype.constructor = CSSOM.CSSKeyframeRule; +CSSOM.CSSKeyframeRule.prototype.type = 9; +//FIXME +//CSSOM.CSSKeyframeRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule; +//CSSOM.CSSKeyframeRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule; + +// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSKeyframeRule.cpp +Object.defineProperty(CSSOM.CSSKeyframeRule.prototype, "cssText", { + get: function() { + return this.keyText + " {" + this.style.cssText + "} "; + } +}); + + +//.CommonJS +exports.CSSKeyframeRule = CSSOM.CSSKeyframeRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSKeyframesRule.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSKeyframesRule.js new file mode 100644 index 0000000..7e42717 --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSKeyframesRule.js @@ -0,0 +1,39 @@ +//.CommonJS +var CSSOM = { + CSSRule: require("./CSSRule").CSSRule +}; +///CommonJS + + +/** + * @constructor + * @see http://www.w3.org/TR/css3-animations/#DOM-CSSKeyframesRule + */ +CSSOM.CSSKeyframesRule = function CSSKeyframesRule() { + CSSOM.CSSRule.call(this); + this.name = ''; + this.cssRules = []; +}; + +CSSOM.CSSKeyframesRule.prototype = new CSSOM.CSSRule(); +CSSOM.CSSKeyframesRule.prototype.constructor = CSSOM.CSSKeyframesRule; +CSSOM.CSSKeyframesRule.prototype.type = 8; +//FIXME +//CSSOM.CSSKeyframesRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule; +//CSSOM.CSSKeyframesRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule; + +// http://www.opensource.apple.com/source/WebCore/WebCore-955.66.1/css/WebKitCSSKeyframesRule.cpp +Object.defineProperty(CSSOM.CSSKeyframesRule.prototype, "cssText", { + get: function() { + var cssTexts = []; + for (var i=0, length=this.cssRules.length; i < length; i++) { + cssTexts.push(" " + this.cssRules[i].cssText); + } + return "@" + (this._vendorPrefix || '') + "keyframes " + this.name + " { \n" + cssTexts.join("\n") + "\n}"; + } +}); + + +//.CommonJS +exports.CSSKeyframesRule = CSSOM.CSSKeyframesRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSMediaRule.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSMediaRule.js new file mode 100644 index 0000000..367a35e --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSMediaRule.js @@ -0,0 +1,41 @@ +//.CommonJS +var CSSOM = { + CSSRule: require("./CSSRule").CSSRule, + MediaList: require("./MediaList").MediaList +}; +///CommonJS + + +/** + * @constructor + * @see http://dev.w3.org/csswg/cssom/#cssmediarule + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule + */ +CSSOM.CSSMediaRule = function CSSMediaRule() { + CSSOM.CSSRule.call(this); + this.media = new CSSOM.MediaList(); + this.cssRules = []; +}; + +CSSOM.CSSMediaRule.prototype = new CSSOM.CSSRule(); +CSSOM.CSSMediaRule.prototype.constructor = CSSOM.CSSMediaRule; +CSSOM.CSSMediaRule.prototype.type = 4; +//FIXME +//CSSOM.CSSMediaRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule; +//CSSOM.CSSMediaRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule; + +// http://opensource.apple.com/source/WebCore/WebCore-658.28/css/CSSMediaRule.cpp +Object.defineProperty(CSSOM.CSSMediaRule.prototype, "cssText", { + get: function() { + var cssTexts = []; + for (var i=0, length=this.cssRules.length; i < length; i++) { + cssTexts.push(this.cssRules[i].cssText); + } + return "@media " + this.media.mediaText + " {" + cssTexts.join("") + "}"; + } +}); + + +//.CommonJS +exports.CSSMediaRule = CSSOM.CSSMediaRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSOM.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSOM.js new file mode 100644 index 0000000..95f3563 --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSOM.js @@ -0,0 +1,3 @@ +var CSSOM = {}; + + diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSRule.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSRule.js new file mode 100644 index 0000000..0b5e25b --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSRule.js @@ -0,0 +1,43 @@ +//.CommonJS +var CSSOM = {}; +///CommonJS + + +/** + * @constructor + * @see http://dev.w3.org/csswg/cssom/#the-cssrule-interface + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSRule + */ +CSSOM.CSSRule = function CSSRule() { + this.parentRule = null; + this.parentStyleSheet = null; +}; + +CSSOM.CSSRule.UNKNOWN_RULE = 0; // obsolete +CSSOM.CSSRule.STYLE_RULE = 1; +CSSOM.CSSRule.CHARSET_RULE = 2; // obsolete +CSSOM.CSSRule.IMPORT_RULE = 3; +CSSOM.CSSRule.MEDIA_RULE = 4; +CSSOM.CSSRule.FONT_FACE_RULE = 5; +CSSOM.CSSRule.PAGE_RULE = 6; +CSSOM.CSSRule.KEYFRAMES_RULE = 7; +CSSOM.CSSRule.KEYFRAME_RULE = 8; +CSSOM.CSSRule.MARGIN_RULE = 9; +CSSOM.CSSRule.NAMESPACE_RULE = 10; +CSSOM.CSSRule.COUNTER_STYLE_RULE = 11; +CSSOM.CSSRule.SUPPORTS_RULE = 12; +CSSOM.CSSRule.DOCUMENT_RULE = 13; +CSSOM.CSSRule.FONT_FEATURE_VALUES_RULE = 14; +CSSOM.CSSRule.VIEWPORT_RULE = 15; +CSSOM.CSSRule.REGION_STYLE_RULE = 16; + + +CSSOM.CSSRule.prototype = { + constructor: CSSOM.CSSRule + //FIXME +}; + + +//.CommonJS +exports.CSSRule = CSSOM.CSSRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSStyleDeclaration.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSStyleDeclaration.js new file mode 100644 index 0000000..b43b9af --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSStyleDeclaration.js @@ -0,0 +1,148 @@ +//.CommonJS +var CSSOM = {}; +///CommonJS + + +/** + * @constructor + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration + */ +CSSOM.CSSStyleDeclaration = function CSSStyleDeclaration(){ + this.length = 0; + this.parentRule = null; + + // NON-STANDARD + this._importants = {}; +}; + + +CSSOM.CSSStyleDeclaration.prototype = { + + constructor: CSSOM.CSSStyleDeclaration, + + /** + * + * @param {string} name + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-getPropertyValue + * @return {string} the value of the property if it has been explicitly set for this declaration block. + * Returns the empty string if the property has not been set. + */ + getPropertyValue: function(name) { + return this[name] || ""; + }, + + /** + * + * @param {string} name + * @param {string} value + * @param {string} [priority=null] "important" or null + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-setProperty + */ + setProperty: function(name, value, priority) { + if (this[name]) { + // Property already exist. Overwrite it. + var index = Array.prototype.indexOf.call(this, name); + if (index < 0) { + this[this.length] = name; + this.length++; + } + } else { + // New property. + this[this.length] = name; + this.length++; + } + this[name] = value + ""; + this._importants[name] = priority; + }, + + /** + * + * @param {string} name + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration-removeProperty + * @return {string} the value of the property if it has been explicitly set for this declaration block. + * Returns the empty string if the property has not been set or the property name does not correspond to a known CSS property. + */ + removeProperty: function(name) { + if (!(name in this)) { + return ""; + } + var index = Array.prototype.indexOf.call(this, name); + if (index < 0) { + return ""; + } + var prevValue = this[name]; + this[name] = ""; + + // That's what WebKit and Opera do + Array.prototype.splice.call(this, index, 1); + + // That's what Firefox does + //this[index] = "" + + return prevValue; + }, + + getPropertyCSSValue: function() { + //FIXME + }, + + /** + * + * @param {String} name + */ + getPropertyPriority: function(name) { + return this._importants[name] || ""; + }, + + + /** + * element.style.overflow = "auto" + * element.style.getPropertyShorthand("overflow-x") + * -> "overflow" + */ + getPropertyShorthand: function() { + //FIXME + }, + + isPropertyImplicit: function() { + //FIXME + }, + + // Doesn't work in IE < 9 + get cssText(){ + var properties = []; + for (var i=0, length=this.length; i < length; ++i) { + var name = this[i]; + var value = this.getPropertyValue(name); + var priority = this.getPropertyPriority(name); + if (priority) { + priority = " !" + priority; + } + properties[i] = name + ": " + value + priority + ";"; + } + return properties.join(" "); + }, + + set cssText(text){ + var i, name; + for (i = this.length; i--;) { + name = this[i]; + this[name] = ""; + } + Array.prototype.splice.call(this, 0, this.length); + this._importants = {}; + + var dummyRule = CSSOM.parse('#bogus{' + text + '}').cssRules[0].style; + var length = dummyRule.length; + for (i = 0; i < length; ++i) { + name = dummyRule[i]; + this.setProperty(dummyRule[i], dummyRule.getPropertyValue(name), dummyRule.getPropertyPriority(name)); + } + } +}; + + +//.CommonJS +exports.CSSStyleDeclaration = CSSOM.CSSStyleDeclaration; +CSSOM.parse = require('./parse').parse; // Cannot be included sooner due to the mutual dependency between parse.js and CSSStyleDeclaration.js +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSStyleRule.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSStyleRule.js new file mode 100644 index 0000000..630b3f8 --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSStyleRule.js @@ -0,0 +1,190 @@ +//.CommonJS +var CSSOM = { + CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration, + CSSRule: require("./CSSRule").CSSRule +}; +///CommonJS + + +/** + * @constructor + * @see http://dev.w3.org/csswg/cssom/#cssstylerule + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule + */ +CSSOM.CSSStyleRule = function CSSStyleRule() { + CSSOM.CSSRule.call(this); + this.selectorText = ""; + this.style = new CSSOM.CSSStyleDeclaration(); + this.style.parentRule = this; +}; + +CSSOM.CSSStyleRule.prototype = new CSSOM.CSSRule(); +CSSOM.CSSStyleRule.prototype.constructor = CSSOM.CSSStyleRule; +CSSOM.CSSStyleRule.prototype.type = 1; + +Object.defineProperty(CSSOM.CSSStyleRule.prototype, "cssText", { + get: function() { + var text; + if (this.selectorText) { + text = this.selectorText + " {" + this.style.cssText + "}"; + } else { + text = ""; + } + return text; + }, + set: function(cssText) { + var rule = CSSOM.CSSStyleRule.parse(cssText); + this.style = rule.style; + this.selectorText = rule.selectorText; + } +}); + + +/** + * NON-STANDARD + * lightweight version of parse.js. + * @param {string} ruleText + * @return CSSStyleRule + */ +CSSOM.CSSStyleRule.parse = function(ruleText) { + var i = 0; + var state = "selector"; + var index; + var j = i; + var buffer = ""; + + var SIGNIFICANT_WHITESPACE = { + "selector": true, + "value": true + }; + + var styleRule = new CSSOM.CSSStyleRule(); + var name, priority=""; + + for (var character; (character = ruleText.charAt(i)); i++) { + + switch (character) { + + case " ": + case "\t": + case "\r": + case "\n": + case "\f": + if (SIGNIFICANT_WHITESPACE[state]) { + // Squash 2 or more white-spaces in the row into 1 + switch (ruleText.charAt(i - 1)) { + case " ": + case "\t": + case "\r": + case "\n": + case "\f": + break; + default: + buffer += " "; + break; + } + } + break; + + // String + case '"': + j = i + 1; + index = ruleText.indexOf('"', j) + 1; + if (!index) { + throw '" is missing'; + } + buffer += ruleText.slice(i, index); + i = index - 1; + break; + + case "'": + j = i + 1; + index = ruleText.indexOf("'", j) + 1; + if (!index) { + throw "' is missing"; + } + buffer += ruleText.slice(i, index); + i = index - 1; + break; + + // Comment + case "/": + if (ruleText.charAt(i + 1) === "*") { + i += 2; + index = ruleText.indexOf("*/", i); + if (index === -1) { + throw new SyntaxError("Missing */"); + } else { + i = index + 1; + } + } else { + buffer += character; + } + break; + + case "{": + if (state === "selector") { + styleRule.selectorText = buffer.trim(); + buffer = ""; + state = "name"; + } + break; + + case ":": + if (state === "name") { + name = buffer.trim(); + buffer = ""; + state = "value"; + } else { + buffer += character; + } + break; + + case "!": + if (state === "value" && ruleText.indexOf("!important", i) === i) { + priority = "important"; + i += "important".length; + } else { + buffer += character; + } + break; + + case ";": + if (state === "value") { + styleRule.style.setProperty(name, buffer.trim(), priority); + priority = ""; + buffer = ""; + state = "name"; + } else { + buffer += character; + } + break; + + case "}": + if (state === "value") { + styleRule.style.setProperty(name, buffer.trim(), priority); + priority = ""; + buffer = ""; + } else if (state === "name") { + break; + } else { + buffer += character; + } + state = "selector"; + break; + + default: + buffer += character; + break; + + } + } + + return styleRule; + +}; + + +//.CommonJS +exports.CSSStyleRule = CSSOM.CSSStyleRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/CSSStyleSheet.js b/node_modules/cssstyle/node_modules/cssom/lib/CSSStyleSheet.js new file mode 100644 index 0000000..f0e0dfc --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/CSSStyleSheet.js @@ -0,0 +1,88 @@ +//.CommonJS +var CSSOM = { + StyleSheet: require("./StyleSheet").StyleSheet, + CSSStyleRule: require("./CSSStyleRule").CSSStyleRule +}; +///CommonJS + + +/** + * @constructor + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet + */ +CSSOM.CSSStyleSheet = function CSSStyleSheet() { + CSSOM.StyleSheet.call(this); + this.cssRules = []; +}; + + +CSSOM.CSSStyleSheet.prototype = new CSSOM.StyleSheet(); +CSSOM.CSSStyleSheet.prototype.constructor = CSSOM.CSSStyleSheet; + + +/** + * Used to insert a new rule into the style sheet. The new rule now becomes part of the cascade. + * + * sheet = new Sheet("body {margin: 0}") + * sheet.toString() + * -> "body{margin:0;}" + * sheet.insertRule("img {border: none}", 0) + * -> 0 + * sheet.toString() + * -> "img{border:none;}body{margin:0;}" + * + * @param {string} rule + * @param {number} index + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-insertRule + * @return {number} The index within the style sheet's rule collection of the newly inserted rule. + */ +CSSOM.CSSStyleSheet.prototype.insertRule = function(rule, index) { + if (index < 0 || index > this.cssRules.length) { + throw new RangeError("INDEX_SIZE_ERR"); + } + var cssRule = CSSOM.parse(rule).cssRules[0]; + cssRule.parentStyleSheet = this; + this.cssRules.splice(index, 0, cssRule); + return index; +}; + + +/** + * Used to delete a rule from the style sheet. + * + * sheet = new Sheet("img{border:none} body{margin:0}") + * sheet.toString() + * -> "img{border:none;}body{margin:0;}" + * sheet.deleteRule(0) + * sheet.toString() + * -> "body{margin:0;}" + * + * @param {number} index within the style sheet's rule list of the rule to remove. + * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet-deleteRule + */ +CSSOM.CSSStyleSheet.prototype.deleteRule = function(index) { + if (index < 0 || index >= this.cssRules.length) { + throw new RangeError("INDEX_SIZE_ERR"); + } + this.cssRules.splice(index, 1); +}; + + +/** + * NON-STANDARD + * @return {string} serialize stylesheet + */ +CSSOM.CSSStyleSheet.prototype.toString = function() { + var result = ""; + var rules = this.cssRules; + for (var i=0; i 1000 ? '1000px' : 'auto'); + * } + */ +CSSOM.CSSValueExpression.prototype.parse = function() { + var token = this._token, + idx = this._idx; + + var character = '', + expression = '', + error = '', + info, + paren = []; + + + for (; ; ++idx) { + character = token.charAt(idx); + + // end of token + if (character === '') { + error = 'css expression error: unfinished expression!'; + break; + } + + switch(character) { + case '(': + paren.push(character); + expression += character; + break; + + case ')': + paren.pop(character); + expression += character; + break; + + case '/': + if ((info = this._parseJSComment(token, idx))) { // comment? + if (info.error) { + error = 'css expression error: unfinished comment in expression!'; + } else { + idx = info.idx; + // ignore the comment + } + } else if ((info = this._parseJSRexExp(token, idx))) { // regexp + idx = info.idx; + expression += info.text; + } else { // other + expression += character; + } + break; + + case "'": + case '"': + info = this._parseJSString(token, idx, character); + if (info) { // string + idx = info.idx; + expression += info.text; + } else { + expression += character; + } + break; + + default: + expression += character; + break; + } + + if (error) { + break; + } + + // end of expression + if (paren.length === 0) { + break; + } + } + + var ret; + if (error) { + ret = { + error: error + }; + } else { + ret = { + idx: idx, + expression: expression + }; + } + + return ret; +}; + + +/** + * + * @return {Object|false} + * - idx: + * - text: + * or + * - error: + * or + * false + * + */ +CSSOM.CSSValueExpression.prototype._parseJSComment = function(token, idx) { + var nextChar = token.charAt(idx + 1), + text; + + if (nextChar === '/' || nextChar === '*') { + var startIdx = idx, + endIdx, + commentEndChar; + + if (nextChar === '/') { // line comment + commentEndChar = '\n'; + } else if (nextChar === '*') { // block comment + commentEndChar = '*/'; + } + + endIdx = token.indexOf(commentEndChar, startIdx + 1 + 1); + if (endIdx !== -1) { + endIdx = endIdx + commentEndChar.length - 1; + text = token.substring(idx, endIdx + 1); + return { + idx: endIdx, + text: text + }; + } else { + var error = 'css expression error: unfinished comment in expression!'; + return { + error: error + }; + } + } else { + return false; + } +}; + + +/** + * + * @return {Object|false} + * - idx: + * - text: + * or + * false + * + */ +CSSOM.CSSValueExpression.prototype._parseJSString = function(token, idx, sep) { + var endIdx = this._findMatchedIdx(token, idx, sep), + text; + + if (endIdx === -1) { + return false; + } else { + text = token.substring(idx, endIdx + sep.length); + + return { + idx: endIdx, + text: text + }; + } +}; + + +/** + * parse regexp in css expression + * + * @return {Object|false} + * - idx: + * - regExp: + * or + * false + */ + +/* + +all legal RegExp + +/a/ +(/a/) +[/a/] +[12, /a/] + +!/a/ + ++/a/ +-/a/ +* /a/ +/ /a/ +%/a/ + +===/a/ +!==/a/ +==/a/ +!=/a/ +>/a/ +>=/a/ +>/a/ +>>>/a/ + +&&/a/ +||/a/ +?/a/ +=/a/ +,/a/ + + delete /a/ + in /a/ +instanceof /a/ + new /a/ + typeof /a/ + void /a/ + +*/ +CSSOM.CSSValueExpression.prototype._parseJSRexExp = function(token, idx) { + var before = token.substring(0, idx).replace(/\s+$/, ""), + legalRegx = [ + /^$/, + /\($/, + /\[$/, + /\!$/, + /\+$/, + /\-$/, + /\*$/, + /\/\s+/, + /\%$/, + /\=$/, + /\>$/, + /<$/, + /\&$/, + /\|$/, + /\^$/, + /\~$/, + /\?$/, + /\,$/, + /delete$/, + /in$/, + /instanceof$/, + /new$/, + /typeof$/, + /void$/ + ]; + + var isLegal = legalRegx.some(function(reg) { + return reg.test(before); + }); + + if (!isLegal) { + return false; + } else { + var sep = '/'; + + // same logic as string + return this._parseJSString(token, idx, sep); + } +}; + + +/** + * + * find next sep(same line) index in `token` + * + * @return {Number} + * + */ +CSSOM.CSSValueExpression.prototype._findMatchedIdx = function(token, idx, sep) { + var startIdx = idx, + endIdx; + + var NOT_FOUND = -1; + + while(true) { + endIdx = token.indexOf(sep, startIdx + 1); + + if (endIdx === -1) { // not found + endIdx = NOT_FOUND; + break; + } else { + var text = token.substring(idx + 1, endIdx), + matched = text.match(/\\+$/); + if (!matched || matched[0] % 2 === 0) { // not escaped + break; + } else { + startIdx = endIdx; + } + } + } + + // boundary must be in the same line(js sting or regexp) + var nextNewLineIdx = token.indexOf('\n', idx + 1); + if (nextNewLineIdx < endIdx) { + endIdx = NOT_FOUND; + } + + + return endIdx; +}; + + + + +//.CommonJS +exports.CSSValueExpression = CSSOM.CSSValueExpression; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/lib/MatcherList.js b/node_modules/cssstyle/node_modules/cssom/lib/MatcherList.js new file mode 100644 index 0000000..a791585 --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/lib/MatcherList.js @@ -0,0 +1,62 @@ +//.CommonJS +var CSSOM = {}; +///CommonJS + + +/** + * @constructor + * @see https://developer.mozilla.org/en/CSS/@-moz-document + */ +CSSOM.MatcherList = function MatcherList(){ + this.length = 0; +}; + +CSSOM.MatcherList.prototype = { + + constructor: CSSOM.MatcherList, + + /** + * @return {string} + */ + get matcherText() { + return Array.prototype.join.call(this, ", "); + }, + + /** + * @param {string} value + */ + set matcherText(value) { + // just a temporary solution, actually it may be wrong by just split the value with ',', because a url can include ','. + var values = value.split(","); + var length = this.length = values.length; + for (var i=0; i 0; + + while (ancestorRules.length > 0) { + parentRule = ancestorRules.pop(); + + if ( + parentRule.constructor.name === "CSSMediaRule" + || parentRule.constructor.name === "CSSSupportsRule" + ) { + prevScope = currentScope; + currentScope = parentRule; + currentScope.cssRules.push(prevScope); + break; + } + + if (ancestorRules.length === 0) { + hasAncestors = false; + } + } + + if (!hasAncestors) { + currentScope.__ends = i + 1; + styleSheet.cssRules.push(currentScope); + currentScope = styleSheet; + parentRule = null; + } + + buffer = ""; + state = "before-selector"; + break; + } + break; + + default: + switch (state) { + case "before-selector": + state = "selector"; + styleRule = new CSSOM.CSSStyleRule(); + styleRule.__starts = i; + break; + case "before-name": + state = "name"; + break; + case "before-value": + state = "value"; + break; + case "importRule-begin": + state = "importRule"; + break; + } + buffer += character; + break; + } + } + + return styleSheet; +}; + + +//.CommonJS +exports.parse = CSSOM.parse; +// The following modules cannot be included sooner due to the mutual dependency with parse.js +CSSOM.CSSStyleSheet = require("./CSSStyleSheet").CSSStyleSheet; +CSSOM.CSSStyleRule = require("./CSSStyleRule").CSSStyleRule; +CSSOM.CSSImportRule = require("./CSSImportRule").CSSImportRule; +CSSOM.CSSMediaRule = require("./CSSMediaRule").CSSMediaRule; +CSSOM.CSSSupportsRule = require("./CSSSupportsRule").CSSSupportsRule; +CSSOM.CSSFontFaceRule = require("./CSSFontFaceRule").CSSFontFaceRule; +CSSOM.CSSHostRule = require("./CSSHostRule").CSSHostRule; +CSSOM.CSSStyleDeclaration = require('./CSSStyleDeclaration').CSSStyleDeclaration; +CSSOM.CSSKeyframeRule = require('./CSSKeyframeRule').CSSKeyframeRule; +CSSOM.CSSKeyframesRule = require('./CSSKeyframesRule').CSSKeyframesRule; +CSSOM.CSSValueExpression = require('./CSSValueExpression').CSSValueExpression; +CSSOM.CSSDocumentRule = require('./CSSDocumentRule').CSSDocumentRule; +///CommonJS diff --git a/node_modules/cssstyle/node_modules/cssom/package.json b/node_modules/cssstyle/node_modules/cssom/package.json new file mode 100644 index 0000000..0d9f4da --- /dev/null +++ b/node_modules/cssstyle/node_modules/cssom/package.json @@ -0,0 +1,53 @@ +{ + "_from": "cssom@~0.3.6", + "_id": "cssom@0.3.8", + "_inBundle": false, + "_integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "_location": "/cssstyle/cssom", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "cssom@~0.3.6", + "name": "cssom", + "escapedName": "cssom", + "rawSpec": "~0.3.6", + "saveSpec": null, + "fetchSpec": "~0.3.6" + }, + "_requiredBy": [ + "/cssstyle" + ], + "_resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "_shasum": "9f1276f5b2b463f2114d3f2c75250af8c1a36f4a", + "_spec": "cssom@~0.3.6", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\cssstyle", + "author": { + "name": "Nikita Vasilyev", + "email": "me@elv1s.ru" + }, + "bugs": { + "url": "https://github.com/NV/CSSOM/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "CSS Object Model implementation and CSS parser", + "files": [ + "lib/" + ], + "homepage": "https://github.com/NV/CSSOM#readme", + "keywords": [ + "CSS", + "CSSOM", + "parser", + "styleSheet" + ], + "license": "MIT", + "main": "./lib/index.js", + "name": "cssom", + "repository": { + "type": "git", + "url": "git+https://github.com/NV/CSSOM.git" + }, + "version": "0.3.8" +} diff --git a/node_modules/cssstyle/package.json b/node_modules/cssstyle/package.json index 6264c2e..c5cd0f9 100644 --- a/node_modules/cssstyle/package.json +++ b/node_modules/cssstyle/package.json @@ -1,80 +1,67 @@ { - "_args": [ - [ - "cssstyle@1.4.0", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "cssstyle@1.4.0", - "_id": "cssstyle@1.4.0", + "_from": "cssstyle@^2.2.0", + "_id": "cssstyle@2.3.0", "_inBundle": false, - "_integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "_integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "_location": "/cssstyle", "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "cssstyle@1.4.0", + "raw": "cssstyle@^2.2.0", "name": "cssstyle", "escapedName": "cssstyle", - "rawSpec": "1.4.0", + "rawSpec": "^2.2.0", "saveSpec": null, - "fetchSpec": "1.4.0" + "fetchSpec": "^2.2.0" }, "_requiredBy": [ "/jsdom" ], - "_resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "_spec": "1.4.0", - "_where": "D:\\Projects\\vanillajs-seed", + "_resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "_shasum": "ff665a0ddbdc31864b09647f34163443d90b0852", + "_spec": "cssstyle@^2.2.0", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\jsdom", "bugs": { - "url": "https://github.com/jsakas/CSSStyleDeclaration/issues" + "url": "https://github.com/jsdom/cssstyle/issues" }, + "bundleDependencies": false, "contributors": [ { "name": "Chad Walker", "email": "chad@chad-cat-lore-eddie.com", "url": "https://github.com/chad3814" - }, - { - "name": "Rafał Ruciński", - "email": "fatfisz@gmail.com", - "url": "https://fatfisz.com" - }, - { - "name": "Nikita Vasilyev", - "email": "me@elv1s.ru" - }, - { - "name": "Davide P. Cervone" - }, - { - "name": "Forbes Lindesay" } ], "dependencies": { - "cssom": "0.3.x" + "cssom": "~0.3.6" }, + "deprecated": false, "description": "CSSStyleDeclaration Object Model implementation", "devDependencies": { "babel-generator": "~6.26.1", "babel-traverse": "~6.26.0", "babel-types": "~6.26.0", "babylon": "~6.18.0", - "eslint": "5.13.0", - "eslint-config-prettier": "4.0.0", - "eslint-plugin-prettier": "3.0.1", - "nodeunit": "~0.11.3", + "eslint": "~6.0.0", + "eslint-config-prettier": "~6.0.0", + "eslint-plugin-prettier": "~3.1.0", + "jest": "^24.8.0", "npm-run-all": "^4.1.5", - "prettier": "1.16.4", + "prettier": "~1.18.0", "request": "^2.88.0", - "resolve": "~1.8.1" + "resolve": "~1.11.1" }, "directories": { "lib": "./lib" }, - "homepage": "https://github.com/jsakas/CSSStyleDeclaration", + "engines": { + "node": ">=8" + }, + "files": [ + "lib/" + ], + "homepage": "https://github.com/jsdom/cssstyle", "keywords": [ "CSS", "CSSStyleDeclaration", @@ -87,12 +74,17 @@ "name": "Jon Sakas", "email": "jon.sakas@gmail.com", "url": "https://jon.sakas.co/" + }, + { + "name": "Rafał Ruciński", + "email": "fatfisz@gmail.com", + "url": "https://fatfisz.com" } ], "name": "cssstyle", "repository": { "type": "git", - "url": "git+https://github.com/jsakas/CSSStyleDeclaration.git" + "url": "git+https://github.com/jsdom/cssstyle.git" }, "scripts": { "download": "node ./scripts/download_latest_properties.js && eslint lib/allProperties.js --fix", @@ -101,9 +93,10 @@ "generate:properties": "node ./scripts/generate_properties.js", "lint": "npm run generate && eslint . --max-warnings 0", "lint:fix": "eslint . --fix --max-warnings 0", - "prepublishOnly": "npm run test-ci", - "test": "npm run generate && nodeunit tests", - "test-ci": "npm run lint && npm run test" + "prepublishOnly": "npm run lint && npm run test", + "test": "npm run generate && jest", + "test-ci": "npm run lint && npm run test && codecov", + "update-authors": "git log --format=\"%aN <%aE>\" | sort -f | uniq > AUTHORS" }, - "version": "1.4.0" + "version": "2.3.0" } diff --git a/node_modules/cssstyle/scripts/download_latest_properties.js b/node_modules/cssstyle/scripts/download_latest_properties.js deleted file mode 100644 index 5f17ef5..0000000 --- a/node_modules/cssstyle/scripts/download_latest_properties.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict'; - -/* - * W3C provides JSON list of all CSS properties and their status in the standard - * - * documentation: https://www.w3.org/Style/CSS/all-properties.en.html - * JSON url: ( https://www.w3.org/Style/CSS/all-properties.en.json ) - * - * Download that file, filter out duplicates and filter the properties based on the wanted standard level - * - * ED - Editors' Draft (not a W3C Technical Report) - * FPWD - First Public Working Draft - * WD - Working Draft - * LC - Last Call Working Draft - * CR - Candidate Recommendation - * PR - Proposed Recommendation - * REC - Recommendation - * NOTE - Working Group Note - */ - -var fs = require('fs'); -var path = require('path'); - -var request = require('request'); - -const { camelToDashed } = require('../lib/parsers'); - -var url = 'https://www.w3.org/Style/CSS/all-properties.en.json'; - -console.log('Downloading CSS properties...'); - -function toCamelCase(propName) { - return propName.replace(/-([a-z])/g, function(g) { - return g[1].toUpperCase(); - }); -} - -request(url, function(error, response, body) { - if (!error && response.statusCode === 200) { - var allCSSProperties = JSON.parse(body); - - // Filter out all properties newer than Working Draft - var workingDraftAndOlderProperties = allCSSProperties.filter(function(cssProp) { - // TODO: --* css Needs additional logic to this module, so filter it out for now - return cssProp.status !== 'ED' && cssProp.status !== 'FPWD' && cssProp.property !== '--*'; - }); - - // Remove duplicates, there can be many properties in different states of standard - // and add only property names to the list - var CSSpropertyNames = []; - workingDraftAndOlderProperties.forEach(function(cssProp) { - const camelCaseName = toCamelCase(cssProp.property); - - if (CSSpropertyNames.indexOf(camelCaseName) === -1) { - CSSpropertyNames.push(camelCaseName); - } - }); - - var out_file = fs.createWriteStream(path.resolve(__dirname, './../lib/allProperties.js'), { - encoding: 'utf-8', - }); - - var date_today = new Date(); - out_file.write( - "'use strict';\n\n// autogenerated - " + - (date_today.getMonth() + 1 + '/' + date_today.getDate() + '/' + date_today.getFullYear()) + - '\n\n' - ); - out_file.write('/*\n *\n * https://www.w3.org/Style/CSS/all-properties.en.html\n */\n\n'); - - out_file.write('var allProperties = new Set();\n'); - out_file.write('module.exports = allProperties;\n'); - - CSSpropertyNames.forEach(function(property) { - out_file.write('allProperties.add(' + JSON.stringify(camelToDashed(property)) + ');\n'); - }); - - out_file.end(function(err) { - if (err) { - throw err; - } - - console.log('Generated ' + Object.keys(CSSpropertyNames).length + ' properties.'); - }); - } else { - throw error; - } -}); diff --git a/node_modules/cssstyle/scripts/generate_implemented_properties.js b/node_modules/cssstyle/scripts/generate_implemented_properties.js deleted file mode 100644 index caa88f1..0000000 --- a/node_modules/cssstyle/scripts/generate_implemented_properties.js +++ /dev/null @@ -1,61 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const path = require('path'); -const t = require('babel-types'); -const generate = require('babel-generator').default; -const camelToDashed = require('../lib/parsers').camelToDashed; - -const dashedProperties = fs - .readdirSync(path.resolve(__dirname, '../lib/properties')) - .filter(propertyFile => propertyFile.substr(-3) === '.js') - .map(propertyFile => camelToDashed(propertyFile.replace('.js', ''))); - -const out_file = fs.createWriteStream(path.resolve(__dirname, '../lib/implementedProperties.js'), { - encoding: 'utf-8', -}); -var date_today = new Date(); -out_file.write( - "'use strict';\n\n// autogenerated - " + - (date_today.getMonth() + 1 + '/' + date_today.getDate() + '/' + date_today.getFullYear()) + - '\n\n' -); -out_file.write('/*\n *\n * https://www.w3.org/Style/CSS/all-properties.en.html\n */\n\n'); - -const statements = []; -statements.push( - t.variableDeclaration('var', [ - t.variableDeclarator( - t.identifier('implementedProperties'), - t.newExpression(t.identifier('Set'), []) - ), - ]) -); - -dashedProperties.forEach(property => { - statements.push( - t.expressionStatement( - t.callExpression( - t.memberExpression(t.identifier('implementedProperties'), t.identifier('add')), - [t.stringLiteral(property)] - ) - ) - ); -}); - -statements.push( - t.expressionStatement( - t.assignmentExpression( - '=', - t.memberExpression(t.identifier('module'), t.identifier('exports')), - t.identifier('implementedProperties') - ) - ) -); - -out_file.write(generate(t.program(statements)).code + '\n'); -out_file.end(function(err) { - if (err) { - throw err; - } -}); diff --git a/node_modules/cssstyle/scripts/generate_properties.js b/node_modules/cssstyle/scripts/generate_properties.js deleted file mode 100644 index 33a4272..0000000 --- a/node_modules/cssstyle/scripts/generate_properties.js +++ /dev/null @@ -1,292 +0,0 @@ -'use strict'; - -var fs = require('fs'); -var path = require('path'); -var babylon = require('babylon'); -var t = require('babel-types'); -var generate = require('babel-generator').default; -var traverse = require('babel-traverse').default; -var resolve = require('resolve'); - -var camelToDashed = require('../lib/parsers').camelToDashed; - -var basename = path.basename; -var dirname = path.dirname; - -var uniqueIndex = 0; -function getUniqueIndex() { - return uniqueIndex++; -} - -var property_files = fs - .readdirSync(path.resolve(__dirname, '../lib/properties')) - .filter(function(property) { - return property.substr(-3) === '.js'; - }); -var out_file = fs.createWriteStream(path.resolve(__dirname, '../lib/properties.js'), { - encoding: 'utf-8', -}); -var date_today = new Date(); -out_file.write( - "'use strict';\n\n// autogenerated - " + - (date_today.getMonth() + 1 + '/' + date_today.getDate() + '/' + date_today.getFullYear()) + - '\n\n' -); -out_file.write('/*\n *\n * https://www.w3.org/Style/CSS/all-properties.en.html\n */\n\n'); - -function isModuleDotExports(node) { - return ( - t.isMemberExpression(node, { computed: false }) && - t.isIdentifier(node.object, { name: 'module' }) && - t.isIdentifier(node.property, { name: 'exports' }) - ); -} -function isRequire(node, filename) { - if ( - t.isCallExpression(node) && - t.isIdentifier(node.callee, { name: 'require' }) && - node.arguments.length === 1 && - t.isStringLiteral(node.arguments[0]) - ) { - var relative = node.arguments[0].value; - var fullPath = resolve.sync(relative, { basedir: dirname(filename) }); - return { relative: relative, fullPath: fullPath }; - } else { - return false; - } -} - -// step 1: parse all files and figure out their dependencies -var parsedFilesByPath = {}; -property_files.map(function(property) { - var filename = path.resolve(__dirname, '../lib/properties/' + property); - var src = fs.readFileSync(filename, 'utf8'); - property = basename(property, '.js'); - var ast = babylon.parse(src); - var dependencies = []; - traverse(ast, { - enter(path) { - var r; - if ((r = isRequire(path.node, filename))) { - dependencies.push(r.fullPath); - } - }, - }); - parsedFilesByPath[filename] = { - filename: filename, - property: property, - ast: ast, - dependencies: dependencies, - }; -}); - -// step 2: serialize the files in an order where dependencies are always above -// the files they depend on -var externalDependencies = []; -var parsedFiles = []; -var addedFiles = {}; -function addFile(filename, dependencyPath) { - if (dependencyPath.indexOf(filename) !== -1) { - throw new Error( - 'Circular dependency: ' + - dependencyPath - .slice(dependencyPath.indexOf(filename)) - .concat([filename]) - .join(' -> ') - ); - } - var file = parsedFilesByPath[filename]; - if (addedFiles[filename]) { - return; - } - if (!file) { - externalDependencies.push(filename); - } else { - file.dependencies.forEach(function(dependency) { - addFile(dependency, dependencyPath.concat([filename])); - }); - parsedFiles.push(parsedFilesByPath[filename]); - } - addedFiles[filename] = true; -} -Object.keys(parsedFilesByPath).forEach(function(filename) { - addFile(filename, []); -}); -// Step 3: add files to output -// renaming exports to local variables `moduleName_export_exportName` -// and updating require calls as appropriate -var moduleExportsByPath = {}; -var statements = []; -externalDependencies.forEach(function(filename, i) { - var id = t.identifier( - 'external_dependency_' + basename(filename, '.js').replace(/[^A-Za-z]/g, '') + '_' + i - ); - moduleExportsByPath[filename] = { defaultExports: id }; - var relativePath = path.relative(path.resolve(__dirname + '/../lib'), filename); - if (relativePath[0] !== '.') { - relativePath = './' + relativePath; - } - statements.push( - t.variableDeclaration('var', [ - t.variableDeclarator( - id, - t.callExpression(t.identifier('require'), [t.stringLiteral(relativePath)]) - ), - ]) - ); -}); -function getRequireValue(node, file) { - var r, e; - // replace require("./foo").bar with the named export from foo - if ( - t.isMemberExpression(node, { computed: false }) && - (r = isRequire(node.object, file.filename)) - ) { - e = moduleExportsByPath[r.fullPath]; - if (!e) { - return; - } - if (!e.namedExports) { - return t.memberExpression(e.defaultExports, node.property); - } - if (!e.namedExports[node.property.name]) { - throw new Error(r.relative + ' does not export ' + node.property.name); - } - return e.namedExports[node.property.name]; - - // replace require("./foo") with the default export of foo - } else if ((r = isRequire(node, file.filename))) { - e = moduleExportsByPath[r.fullPath]; - if (!e) { - if (/^\.\.\//.test(r.relative)) { - node.arguments[0].value = r.relative.substr(1); - } - return; - } - return e.defaultExports; - } -} -parsedFiles.forEach(function(file) { - var namedExports = {}; - var localVariableMap = {}; - - traverse(file.ast, { - enter(path) { - // replace require calls with the corresponding value - var r; - if ((r = getRequireValue(path.node, file))) { - path.replaceWith(r); - return; - } - - // if we see `var foo = require('bar')` we can just inline the variable - // representing `require('bar')` wherever `foo` was used. - if ( - t.isVariableDeclaration(path.node) && - path.node.declarations.length === 1 && - t.isIdentifier(path.node.declarations[0].id) && - (r = getRequireValue(path.node.declarations[0].init, file)) - ) { - var newName = 'compiled_local_variable_reference_' + getUniqueIndex(); - path.scope.rename(path.node.declarations[0].id.name, newName); - localVariableMap[newName] = r; - path.remove(); - return; - } - - // rename all top level functions to keep them local to the module - if (t.isFunctionDeclaration(path.node) && t.isProgram(path.parent)) { - path.scope.rename(path.node.id.name, file.property + '_local_fn_' + path.node.id.name); - return; - } - - // rename all top level variables to keep them local to the module - if (t.isVariableDeclaration(path.node) && t.isProgram(path.parent)) { - path.node.declarations.forEach(function(declaration) { - path.scope.rename( - declaration.id.name, - file.property + '_local_var_' + declaration.id.name - ); - }); - return; - } - - // replace module.exports.bar with a variable for the named export - if ( - t.isMemberExpression(path.node, { computed: false }) && - isModuleDotExports(path.node.object) - ) { - var name = path.node.property.name; - var identifier = t.identifier(file.property + '_export_' + name); - path.replaceWith(identifier); - namedExports[name] = identifier; - } - }, - }); - traverse(file.ast, { - enter(path) { - if ( - t.isIdentifier(path.node) && - Object.prototype.hasOwnProperty.call(localVariableMap, path.node.name) - ) { - path.replaceWith(localVariableMap[path.node.name]); - } - }, - }); - var defaultExports = t.objectExpression( - Object.keys(namedExports).map(function(name) { - return t.objectProperty(t.identifier(name), namedExports[name]); - }) - ); - moduleExportsByPath[file.filename] = { - namedExports: namedExports, - defaultExports: defaultExports, - }; - statements.push( - t.variableDeclaration( - 'var', - Object.keys(namedExports).map(function(name) { - return t.variableDeclarator(namedExports[name]); - }) - ) - ); - statements.push.apply(statements, file.ast.program.body); -}); -var propertyDefinitions = []; -parsedFiles.forEach(function(file) { - var dashed = camelToDashed(file.property); - propertyDefinitions.push( - t.objectProperty( - t.identifier(file.property), - t.identifier(file.property + '_export_definition') - ) - ); - if (file.property !== dashed) { - propertyDefinitions.push( - t.objectProperty(t.stringLiteral(dashed), t.identifier(file.property + '_export_definition')) - ); - } -}); -var definePropertiesCall = t.callExpression( - t.memberExpression(t.identifier('Object'), t.identifier('defineProperties')), - [t.identifier('prototype'), t.objectExpression(propertyDefinitions)] -); -statements.push( - t.expressionStatement( - t.assignmentExpression( - '=', - t.memberExpression(t.identifier('module'), t.identifier('exports')), - t.functionExpression( - null, - [t.identifier('prototype')], - t.blockStatement([t.expressionStatement(definePropertiesCall)]) - ) - ) - ) -); -out_file.write(generate(t.program(statements)).code + '\n'); -out_file.end(function(err) { - if (err) { - throw err; - } -}); diff --git a/node_modules/cssstyle/tests/tests.js b/node_modules/cssstyle/tests/tests.js deleted file mode 100644 index 945040c..0000000 --- a/node_modules/cssstyle/tests/tests.js +++ /dev/null @@ -1,669 +0,0 @@ -'use strict'; -var cssstyle = require('../lib/CSSStyleDeclaration'); - -var { dashedToCamelCase } = require('../lib/parsers'); - -var dashedProperties = [ - ...require('../lib/allProperties'), - ...require('../lib/allExtraProperties'), -]; -var allowedProperties = dashedProperties.map(dashedToCamelCase); -var implementedProperties = Array.from(require('../lib/implementedProperties')).map( - dashedToCamelCase -); -var invalidProperties = implementedProperties.filter(function(property) { - return !allowedProperties.includes(property); -}); - -module.exports = { - 'Verify Has Only Valid Properties Implemented': function(test) { - test.expect(1); - test.ok( - invalidProperties.length === 0, - invalidProperties.length + - ' invalid properties implemented: ' + - Array.from(invalidProperties).join(', ') - ); - test.done(); - }, - 'Verify Has All Properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(allowedProperties.length * 2); - allowedProperties.forEach(function(property) { - test.ok(style.__lookupGetter__(property), 'missing ' + property + ' property'); - test.ok(style.__lookupSetter__(property), 'missing ' + property + ' property'); - }); - test.done(); - }, - 'Verify Has All Dashed Properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(dashedProperties.length * 2); - dashedProperties.forEach(function(property) { - test.ok(style.__lookupGetter__(property), 'missing ' + property + ' property'); - test.ok(style.__lookupSetter__(property), 'missing ' + property + ' property'); - }); - test.done(); - }, - 'Verify Has Functions': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(6); - test.ok(typeof style.getPropertyValue === 'function', 'missing getPropertyValue()'); - test.ok(typeof style.getPropertyCSSValue === 'function', 'missing getPropertyCSSValue()'); - test.ok(typeof style.removeProperty === 'function', 'missing removeProperty()'); - test.ok(typeof style.getPropertyPriority === 'function', 'missing getPropertyPriority()'); - test.ok(typeof style.setProperty === 'function', 'missing setProperty()'); - test.ok(typeof style.item === 'function', 'missing item()'); - test.done(); - }, - 'Verify Has Special Properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(5); - test.ok(style.__lookupGetter__('cssText'), 'missing cssText getter'); - test.ok(style.__lookupSetter__('cssText'), 'missing cssText setter'); - test.ok(style.__lookupGetter__('length'), 'missing length getter'); - test.ok(style.__lookupSetter__('length'), 'missing length setter'); - test.ok(style.__lookupGetter__('parentRule'), 'missing parentRule getter'); - test.done(); - }, - 'Test From Style String': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(8); - style.cssText = 'color: blue; background-color: red; width: 78%; height: 50vh;'; - test.ok(4 === style.length, 'length is not 4'); - test.ok( - 'color: blue; background-color: red; width: 78%; height: 50vh;' === style.cssText, - 'cssText is wrong' - ); - test.ok('blue' === style.getPropertyValue('color'), "getPropertyValue('color') failed"); - test.ok('color' === style.item(0), 'item(0) failed'); - test.ok('background-color' === style[1], 'style[1] failed'); - test.ok( - 'red' === style.backgroundColor, - 'style.backgroundColor failed with "' + style.backgroundColor + '"' - ); - style.cssText = ''; - test.ok('' === style.cssText, 'cssText is not empty'); - test.ok(0 === style.length, 'length is not 0'); - test.done(); - }, - 'Test From Properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(11); - style.color = 'blue'; - test.ok(1 === style.length, 'length is not 1'); - test.ok('color' === style[0], 'style[0] is not color'); - test.ok('color: blue;' === style.cssText, 'cssText is wrong'); - test.ok('color' === style.item(0), 'item(0) is not color'); - test.ok('blue' === style.color, 'color is not blue'); - style.backgroundColor = 'red'; - test.ok(2 === style.length, 'length is not 2'); - test.ok('color' === style[0], 'style[0] is not color'); - test.ok('background-color' === style[1], 'style[1] is not background-color'); - test.ok('color: blue; background-color: red;' === style.cssText, 'cssText is wrong'); - test.ok('red' === style.backgroundColor, 'backgroundColor is not red'); - style.removeProperty('color'); - test.ok('background-color' === style[0], 'style[0] is not background-color'); - test.done(); - }, - 'Test Shorthand Properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(11); - style.background = 'blue url(http://www.example.com/some_img.jpg)'; - test.ok('blue' === style.backgroundColor, 'backgroundColor is not blue'); - test.ok( - 'url(http://www.example.com/some_img.jpg)' === style.backgroundImage, - 'backgroundImage is wrong' - ); - test.ok( - 'blue url(http://www.example.com/some_img.jpg)' === style.background, - 'background is different' - ); - style.border = '0 solid black'; - test.ok('0px' === style.borderWidth, 'borderWidth is not 0px'); - test.ok('solid' === style.borderStyle, 'borderStyle is not solid'); - test.ok('black' === style.borderColor, 'borderColor is not black'); - test.ok('0px' === style.borderTopWidth, 'borderTopWidth is not 0px'); - test.ok('solid' === style.borderLeftStyle, 'borderLeftStyle is not solid'); - test.ok('black' === style.borderBottomColor, 'borderBottomColor is not black'); - style.font = '12em monospace'; - test.ok('12em' === style.fontSize, 'fontSize is not 12em'); - test.ok('monospace' === style.fontFamily, 'fontFamily is not monospace'); - test.done(); - }, - 'Test width and height Properties and null and empty strings': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(9); - style.height = 6; - test.ok('' === style.height, 'height does not remain unset'); - style.width = 0; - test.ok('0px' === style.width, 'width is not 0px'); - style.height = '34%'; - test.ok('34%' === style.height, 'height is not 34%'); - style.height = '100vh'; - test.ok('100vh' === style.height, 'height is not 100vh'); - style.height = '100vw'; - test.ok('100vw' === style.height, 'height is not 100vw'); - style.height = ''; - test.ok(style.length === 1, 'length is not 1'); - test.ok('width: 0px;' === style.cssText, 'cssText is not "width: 0px;"'); - style.width = null; - test.ok(style.length === 0, 'length is not 0'); - test.ok('' === style.cssText, 'cssText is not empty string'); - test.done(); - }, - 'Test Implicit Properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(7); - style.borderWidth = 0; - test.ok(1 === style.length, 'length is not 1'); - test.ok('0px' === style.borderWidth, 'borderWidth is not 0px'); - test.ok('0px' === style.borderTopWidth, 'borderTopWidth is not 0px'); - test.ok('0px' === style.borderBottomWidth, 'borderBottomWidth is not 0px'); - test.ok('0px' === style.borderLeftWidth, 'borderLeftWidth is not 0px'); - test.ok('0px' === style.borderRightWidth, 'borderRightWidth is not 0px'); - test.ok( - 'border-width: 0px;' === style.cssText, - 'cssText is not "border-width: 0px", "' + style.cssText + '"' - ); - test.done(); - }, - 'Test Top, Left, Right, Bottom Properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(6); - style.top = 0; - style.left = '0%'; - style.right = '5em'; - style.bottom = '12pt'; - test.ok('0px' === style.top, 'top is not 0px'); - test.ok('0%' === style.left, 'left is not 0%'); - test.ok('5em' === style.right, 'right is not 5em'); - test.ok('12pt' === style.bottom, 'bottom is not 12pt'); - test.ok(4 === style.length, 'length is not 4'); - test.ok( - 'top: 0px; left: 0%; right: 5em; bottom: 12pt;' === style.cssText, - 'text is not "top: 0px; left: 0%; right: 5em; bottom: 12pt;"' - ); - test.done(); - }, - 'Test Clear and Clip Properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(10); - style.clear = 'none'; - test.ok('none' === style.clear, 'clear is not none'); - style.clear = 'lfet'; // intentionally wrong - test.ok('none' === style.clear, 'clear is not still none'); - style.clear = 'left'; - test.ok('left' === style.clear, 'clear is not left'); - style.clear = 'right'; - test.ok('right' === style.clear, 'clear is not right'); - style.clear = 'both'; - test.ok('both' === style.clear, 'clear is not both'); - style.clip = 'elipse(5px, 10px)'; - test.ok('' === style.clip, 'clip should not be set'); - test.ok(1 === style.length, 'length is not 1'); - style.clip = 'rect(0, 3Em, 2pt, 50%)'; - test.ok( - 'rect(0px, 3em, 2pt, 50%)' === style.clip, - 'clip is not "rect(0px, 3em, 2pt, 50%)", "' + style.clip + '"' - ); - test.ok(2 === style.length, 'length is not 2'); - test.ok( - 'clear: both; clip: rect(0px, 3em, 2pt, 50%);' === style.cssText, - 'cssText is not "clear: both; clip: rect(0px, 3em, 2pt, 50%);"' - ); - test.done(); - }, - 'Test colors': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(9); - style.color = 'rgba(0,0,0,0)'; - test.ok('rgba(0, 0, 0, 0)' === style.color, 'color is not rgba(0, 0, 0, 0)'); - style.color = 'rgba(5%, 10%, 20%, 0.4)'; - test.ok('rgba(12, 25, 51, 0.4)' === style.color, 'color is not rgba(12, 25, 51, 0.4)'); - style.color = 'rgb(33%, 34%, 33%)'; - test.ok('rgb(84, 86, 84)' === style.color, 'color is not rgb(84, 86, 84)'); - style.color = 'rgba(300, 200, 100, 1.5)'; - test.ok('rgb(255, 200, 100)' === style.color, 'color is not rgb(255, 200, 100) ' + style.color); - style.color = 'hsla(0, 1%, 2%, 0.5)'; - test.ok( - 'hsla(0, 1%, 2%, 0.5)' === style.color, - 'color is not hsla(0, 1%, 2%, 0.5) ' + style.color - ); - style.color = 'hsl(0, 1%, 2%)'; - test.ok('hsl(0, 1%, 2%)' === style.color, 'color is not hsl(0, 1%, 2%) ' + style.color); - style.color = 'rebeccapurple'; - test.ok('rebeccapurple' === style.color, 'color is not rebeccapurple ' + style.color); - style.color = 'transparent'; - test.ok('transparent' === style.color, 'color is not transparent ' + style.color); - style.color = 'currentcolor'; - test.ok('currentcolor' === style.color, 'color is not currentcolor ' + style.color); - test.done(); - }, - 'Test short hand properties with embedded spaces': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(4); - style.background = 'rgb(0, 0, 0) url(/something/somewhere.jpg)'; - test.ok( - 'rgb(0, 0, 0)' === style.backgroundColor, - 'backgroundColor is not rgb(0, 0, 0): ' + style.backgroundColor - ); - test.ok( - 'url(/something/somewhere.jpg)' === style.backgroundImage, - 'backgroundImage is not url(/something/somewhere.jpg): ' + style.backgroundImage - ); - test.ok( - 'background: rgb(0, 0, 0) url(/something/somewhere.jpg);' === style.cssText, - 'cssText is not correct: ' + style.cssText - ); - style = new cssstyle.CSSStyleDeclaration(); - style.border = ' 1px solid black '; - test.ok( - '1px solid black' === style.border, - 'multiple spaces not properly parsed: ' + style.border - ); - test.done(); - }, - 'Setting shorthand properties to an empty string should clear all dependent properties': function( - test - ) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.borderWidth = '1px'; - test.ok( - 'border-width: 1px;' === style.cssText, - 'cssText is not "border-width: 1px;": ' + style.cssText - ); - style.border = ''; - test.ok('' === style.cssText, 'cssText is not "": ' + style.cssText); - test.done(); - }, - 'Setting implicit properties to an empty string should clear all dependent properties': function( - test - ) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.borderTopWidth = '1px'; - test.ok( - 'border-top-width: 1px;' === style.cssText, - 'cssText is not "border-top-width: 1px;": ' + style.cssText - ); - style.borderWidth = ''; - test.ok('' === style.cssText, 'cssText is not "": ' + style.cssText); - test.done(); - }, - 'Setting a shorthand property, whose shorthands are implicit properties, to an empty string should clear all dependent properties': function( - test - ) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(4); - style.borderTopWidth = '1px'; - test.ok( - 'border-top-width: 1px;' === style.cssText, - 'cssText is not "border-top-width: 1px;": ' + style.cssText - ); - style.border = ''; - test.ok('' === style.cssText, 'cssText is not "": ' + style.cssText); - style.borderTop = '1px solid black'; - test.ok( - 'border-top: 1px solid black;' === style.cssText, - 'cssText is not "border-top: 1px solid black;": ' + style.cssText - ); - style.border = ''; - test.ok('' === style.cssText, 'cssText is not "": ' + style.cssText); - test.done(); - }, - 'Setting border values to "none" should clear dependent values': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(8); - style.borderTopWidth = '1px'; - test.ok( - 'border-top-width: 1px;' === style.cssText, - 'cssText is not "border-top-width: 1px;": ' + style.cssText - ); - style.border = 'none'; - test.ok('' === style.cssText, 'cssText is not "": ' + style.cssText); - style.borderTopWidth = '1px'; - test.ok( - 'border-top-width: 1px;' === style.cssText, - 'cssText is not "border-top-width: 1px;": ' + style.cssText - ); - style.borderTopStyle = 'none'; - test.ok('' === style.cssText, 'cssText is not "": ' + style.cssText); - style.borderTopWidth = '1px'; - test.ok( - 'border-top-width: 1px;' === style.cssText, - 'cssText is not "border-top-width: 1px;": ' + style.cssText - ); - style.borderTop = 'none'; - test.ok('' === style.cssText, 'cssText is not "": ' + style.cssText); - style.borderTopWidth = '1px'; - style.borderLeftWidth = '1px'; - test.ok( - 'border-top-width: 1px; border-left-width: 1px;' === style.cssText, - 'cssText is not "border-top-width: 1px; border-left-width: 1px;": ' + style.cssText - ); - style.borderTop = 'none'; - test.ok( - 'border-left-width: 1px;' === style.cssText, - 'cssText is not "border-left-width: 1px;": ' + style.cssText - ); - test.done(); - }, - 'Setting border to 0 should be okay': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(1); - style.border = 0; - test.ok('border: 0px;' === style.cssText, 'cssText is not "border: 0px;": ' + style.cssText); - test.done(); - }, - 'Setting values implicit and shorthand properties via cssText and setProperty should propagate to dependent properties': function( - test - ) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(4); - style.cssText = 'border: 1px solid black;'; - test.ok( - 'border: 1px solid black;' === style.cssText, - 'cssText is not "border: 1px solid black;": ' + style.cssText - ); - test.ok( - '1px solid black' === style.borderTop, - 'borderTop is not "1px solid black": ' + style.borderTop - ); - style.border = ''; - test.ok('' === style.cssText, 'cssText is not "": ' + style.cssText); - style.setProperty('border', '1px solid black'); - test.ok( - 'border: 1px solid black;' === style.cssText, - 'cssText is not "border: 1px solid black;": ' + style.cssText - ); - test.done(); - }, - 'Setting opacity should work': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(3); - style.setProperty('opacity', 0.75); - test.ok( - 'opacity: 0.75;' === style.cssText, - 'cssText is not "opacity: 0.75;": ' + style.cssText - ); - style.opacity = '0.50'; - test.ok('opacity: 0.5;' === style.cssText, 'cssText is not "opacity: 0.5;": ' + style.cssText); - style.opacity = 1.0; - test.ok('opacity: 1;' === style.cssText, 'cssText is not "opacity: 1;": ' + style.cssText); - test.done(); - }, - 'Width and height of auto should work': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(4); - style.width = 'auto'; - test.equal(style.cssText, 'width: auto;', 'cssText is not "width: auto;": ' + style.cssText); - test.equal(style.width, 'auto', 'width is not "auto": ' + style.width); - style = new cssstyle.CSSStyleDeclaration(); - style.height = 'auto'; - test.equal(style.cssText, 'height: auto;', 'cssText is not "height: auto;": ' + style.cssText); - test.equal(style.height, 'auto', 'height is not "auto": ' + style.height); - test.done(); - }, - 'Padding and margin should set/clear shorthand properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - var parts = ['Top', 'Right', 'Bottom', 'Left']; - var testParts = function(name, v, V) { - style[name] = v; - for (var i = 0; i < 4; i++) { - var part = name + parts[i]; - test.equal(V[i], style[part], part + ' is not "' + V[i] + '": "' + style[part] + '"'); - } - test.equal(v, style[name], name + ' is not "' + v + '": "' + style[name] + '"'); - style[name] = ''; - }; - test.expect(50); - testParts('padding', '1px', ['1px', '1px', '1px', '1px']); - testParts('padding', '1px 2%', ['1px', '2%', '1px', '2%']); - testParts('padding', '1px 2px 3px', ['1px', '2px', '3px', '2px']); - testParts('padding', '1px 2px 3px 4px', ['1px', '2px', '3px', '4px']); - style.paddingTop = style.paddingRight = style.paddingBottom = style.paddingLeft = '1px'; - testParts('padding', '', ['', '', '', '']); - testParts('margin', '1px', ['1px', '1px', '1px', '1px']); - testParts('margin', '1px auto', ['1px', 'auto', '1px', 'auto']); - testParts('margin', '1px 2% 3px', ['1px', '2%', '3px', '2%']); - testParts('margin', '1px 2px 3px 4px', ['1px', '2px', '3px', '4px']); - style.marginTop = style.marginRight = style.marginBottom = style.marginLeft = '1px'; - testParts('margin', '', ['', '', '', '']); - test.done(); - }, - 'Padding and margin shorthands should set main properties': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - var parts = ['Top', 'Right', 'Bottom', 'Left']; - var testParts = function(name, v, V) { - var expect; - for (var i = 0; i < 4; i++) { - style[name] = v; - style[name + parts[i]] = V; - expect = v.split(/ /); - expect[i] = V; - expect = expect.join(' '); - test.equal(expect, style[name], name + ' is not "' + expect + '": "' + style[name] + '"'); - } - }; - test.expect(12); - testParts('padding', '1px 2px 3px 4px', '10px'); - testParts('margin', '1px 2px 3px 4px', '10px'); - testParts('margin', '1px 2px 3px 4px', 'auto'); - test.done(); - }, - 'Setting a value to 0 should return the string value': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(1); - style.setProperty('fill-opacity', 0); - test.ok('0' === style.fillOpacity, 'fillOpacity is not "0": ' + style.fillOpacity); - test.done(); - }, - 'onChange callback should be called when the cssText changes': function(test) { - var style = new cssstyle.CSSStyleDeclaration(function(cssText) { - test.ok('opacity: 0;' === cssText, 'cssText is not "opacity: 0;": ' + cssText); - test.done(); - }); - test.expect(1); - style.setProperty('opacity', 0); - }, - 'Setting float should work the same as cssFloat': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(1); - style.float = 'left'; - test.ok('left' === style.cssFloat, 'cssFloat is not "left": ' + style.cssFloat); - test.done(); - }, - 'Setting improper css to cssText should not throw': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.cssText = 'color: '; - test.ok('' === style.cssText, "cssText wasn't cleared: " + style.cssText); - style.color = 'black'; - style.cssText = 'float: '; - test.ok('' === style.cssText, "cssText wasn't cleared: " + style.cssText); - test.done(); - }, - 'Make sure url parsing works with quotes': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(3); - style.backgroundImage = 'url(http://some/url/here1.png)'; - test.ok( - 'url(http://some/url/here1.png)' === style.backgroundImage, - "background-image wasn't url(http://some/url/here1.png): " + style.backgroundImage - ); - style.backgroundImage = "url('http://some/url/here2.png')"; - test.ok( - 'url(http://some/url/here2.png)' === style.backgroundImage, - "background-image wasn't url(http://some/url/here2.png): " + style.backgroundImage - ); - style.backgroundImage = 'url("http://some/url/here3.png")'; - test.ok( - 'url(http://some/url/here3.png)' === style.backgroundImage, - "background-image wasn't url(http://some/url/here3.png): " + style.backgroundImage - ); - test.done(); - }, - 'Make sure setting 0 to a padding or margin works': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.padding = 0; - test.equal(style.cssText, 'padding: 0px;', 'padding is not 0px'); - style.margin = '1em'; - style.marginTop = '0'; - test.equal(style.marginTop, '0px', 'margin-top is not 0px'); - test.done(); - }, - 'Make sure setting ex units to a padding or margin works': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.padding = '1ex'; - test.equal(style.cssText, 'padding: 1ex;', 'padding is not 1ex'); - style.margin = '1em'; - style.marginTop = '0.5ex'; - test.equal(style.marginTop, '0.5ex', 'margin-top is not 0.5ex'); - test.done(); - }, - 'Make sure setting null to background works': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.background = 'red'; - test.equal(style.cssText, 'background: red;', 'background is not red'); - style.background = null; - test.equal(style.cssText, '', 'cssText is not empty'); - test.done(); - }, - 'Flex properties should keep their values': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.flexDirection = 'column'; - test.equal(style.cssText, 'flex-direction: column;', 'flex-direction is not column'); - style.flexDirection = 'row'; - test.equal(style.cssText, 'flex-direction: row;', 'flex-direction is not column'); - test.done(); - }, - 'Make sure camelCase properties are not assigned with `.setProperty()`': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(1); - style.setProperty('fontSize', '12px'); - test.equal(style.cssText, '', 'cssText is not empty'); - test.done(); - }, - 'Make sure casing is ignored in `.setProperty()`': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.setProperty('FoNt-SiZe', '12px'); - test.equal(style.fontSize, '12px', 'font-size: 12px'); - test.equal(style.getPropertyValue('font-size'), '12px', 'font-size: 12px'); - test.done(); - }, - 'Support non string entries in border-spacing': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(1); - style.borderSpacing = 0; - test.equal(style.cssText, 'border-spacing: 0px;', 'border-spacing is not 0'); - test.done(); - }, - 'Float should be valid property for `.setProperty()`': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.setProperty('float', 'left'); - test.equal(style.float, 'left'); - test.equal(style.getPropertyValue('float'), 'left', 'float: left'); - test.done(); - }, - 'Make sure flex-shrink works': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(3); - style.setProperty('flex-shrink', 0); - test.equal(style.getPropertyValue('flex-shrink'), '0', 'flex-shrink is not 0'); - style.setProperty('flex-shrink', 1); - test.equal(style.getPropertyValue('flex-shrink'), '1', 'flex-shrink is not 1'); - test.equal(style.cssText, 'flex-shrink: 1;', 'flex-shrink cssText is incorrect'); - test.done(); - }, - 'Make sure flex-grow works': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(2); - style.setProperty('flex-grow', 2); - test.equal(style.getPropertyValue('flex-grow'), '2', 'flex-grow is not 2'); - test.equal(style.cssText, 'flex-grow: 2;', 'flex-grow cssText is incorrect'); - test.done(); - }, - 'Make sure flex-basis works': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(5); - - style.setProperty('flex-basis', 0); - test.equal(style.getPropertyValue('flex-basis'), '0px', 'flex-basis is not 0px'); - - style.setProperty('flex-basis', '250px'); - test.equal(style.getPropertyValue('flex-basis'), '250px', 'flex-basis is not 250px'); - - style.setProperty('flex-basis', '10em'); - test.equal(style.getPropertyValue('flex-basis'), '10em', 'flex-basis is not 10em'); - - style.setProperty('flex-basis', '30%'); - test.equal(style.getPropertyValue('flex-basis'), '30%', 'flex-basis is not 30%'); - - test.equal(style.cssText, 'flex-basis: 30%;', 'flex-basis cssText is incorrect'); - - test.done(); - }, - 'Make sure shorthand flex works': function(test) { - var style = new cssstyle.CSSStyleDeclaration(); - test.expect(19); - - style.setProperty('flex', 'none'); - test.equal(style.getPropertyValue('flex-grow'), '0', 'flex-grow is not 0 if flex: none;'); - test.equal(style.getPropertyValue('flex-shrink'), '0', 'flex-shrink is not 0 if flex: none;'); - test.equal( - style.getPropertyValue('flex-basis'), - 'auto', - 'flex-basis is not `auto` if flex: none;' - ); - style.removeProperty('flex'); - style.removeProperty('flex-basis'); - - style.setProperty('flex', 'auto'); - test.equal(style.getPropertyValue('flex-grow'), '', 'flex-grow is not empty if flex: auto;'); - test.equal( - style.getPropertyValue('flex-shrink'), - '', - 'flex-shrink is not empty if flex: auto;' - ); - test.equal( - style.getPropertyValue('flex-basis'), - 'auto', - 'flex-basis is not `auto` if flex: auto;' - ); - style.removeProperty('flex'); - - style.setProperty('flex', '0 1 250px'); - test.equal(style.getPropertyValue('flex'), '0 1 250px', 'flex value is not `0 1 250px`'); - test.equal(style.getPropertyValue('flex-grow'), '0', 'flex-grow is not 0'); - test.equal(style.getPropertyValue('flex-shrink'), '1', 'flex-shrink is not 1'); - test.equal(style.getPropertyValue('flex-basis'), '250px', 'flex-basis is not 250px'); - style.removeProperty('flex'); - - style.setProperty('flex', '2'); - test.equal(style.getPropertyValue('flex-grow'), '2', 'flex-grow is not 2'); - test.equal(style.getPropertyValue('flex-shrink'), '', 'flex-shrink is not empty'); - test.equal(style.getPropertyValue('flex-basis'), '', 'flex-basis is not empty'); - style.removeProperty('flex'); - - style.setProperty('flex', '20%'); - test.equal(style.getPropertyValue('flex-grow'), '', 'flex-grow is not empty'); - test.equal(style.getPropertyValue('flex-shrink'), '', 'flex-shrink is not empty'); - test.equal(style.getPropertyValue('flex-basis'), '20%', 'flex-basis is not 20%'); - style.removeProperty('flex'); - - style.setProperty('flex', '2 2'); - test.equal(style.getPropertyValue('flex-grow'), '2', 'flex-grow is not 2'); - test.equal(style.getPropertyValue('flex-shrink'), '2', 'flex-shrink is not 2'); - test.equal(style.getPropertyValue('flex-basis'), '', 'flex-basis is not empty'); - style.removeProperty('flex'); - - test.done(); - }, -}; diff --git a/node_modules/data-urls/LICENSE.txt b/node_modules/data-urls/LICENSE.txt index ce2be0a..d394616 100644 --- a/node_modules/data-urls/LICENSE.txt +++ b/node_modules/data-urls/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright © 2017–2018 Domenic Denicola +Copyright © 2017–2020 Domenic Denicola 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: diff --git a/node_modules/data-urls/README.md b/node_modules/data-urls/README.md index fdbf544..2e7fac7 100644 --- a/node_modules/data-urls/README.md +++ b/node_modules/data-urls/README.md @@ -3,7 +3,7 @@ This package helps you parse `data:` URLs [according to the WHATWG Fetch Standard](https://fetch.spec.whatwg.org/#data-urls): ```js -const parseDataURL = require("data-url"); +const parseDataURL = require("data-urls"); const textExample = parseDataURL("data:,Hello%2C%20World!"); console.log(textExample.mimeType.toString()); // "text/plain;charset=US-ASCII" @@ -37,7 +37,7 @@ Because Node.js's `Buffer.prototype.toString()` assumes a UTF-8 encoding, simply A more complete decoding example would use the [whatwg-encoding](https://www.npmjs.com/package/whatwg-encoding) package as follows: ```js -const parseDataURL = require("data-url"); +const parseDataURL = require("data-urls"); const { labelToName, decode } = require("whatwg-encoding"); const dataURL = parseDataURL(arbitraryString); @@ -55,7 +55,7 @@ If you are using the [whatwg-url](https://github.com/jsdom/whatwg-url) package, ```js const { parseURL } = require("whatwg-url"); -const dataURLFromURLRecord = require("data-url").fromURLRecord; +const dataURLFromURLRecord = require("data-urls").fromURLRecord; const urlRecord = parseURL("data:,Hello%2C%20World!"); const dataURL = dataURLFromURLRecord(urlRecord); diff --git a/node_modules/data-urls/package.json b/node_modules/data-urls/package.json index bc31b4f..ccc31a6 100644 --- a/node_modules/data-urls/package.json +++ b/node_modules/data-urls/package.json @@ -1,33 +1,27 @@ { - "_args": [ - [ - "data-urls@1.1.0", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "data-urls@1.1.0", - "_id": "data-urls@1.1.0", + "_from": "data-urls@^2.0.0", + "_id": "data-urls@2.0.0", "_inBundle": false, - "_integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "_integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", "_location": "/data-urls", "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "data-urls@1.1.0", + "raw": "data-urls@^2.0.0", "name": "data-urls", "escapedName": "data-urls", - "rawSpec": "1.1.0", + "rawSpec": "^2.0.0", "saveSpec": null, - "fetchSpec": "1.1.0" + "fetchSpec": "^2.0.0" }, "_requiredBy": [ "/jsdom" ], - "_resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "_spec": "1.1.0", - "_where": "D:\\Projects\\vanillajs-seed", + "_resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "_shasum": "156485a72963a970f5d5821aaf642bef2bf2db9b", + "_spec": "data-urls@^2.0.0", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\jsdom", "author": { "name": "Domenic Denicola", "email": "d@domenic.me", @@ -36,17 +30,22 @@ "bugs": { "url": "https://github.com/jsdom/data-urls/issues" }, + "bundleDependencies": false, "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" }, + "deprecated": false, "description": "Parses data: URLs", "devDependencies": { - "eslint": "^5.7.0", - "jest": "^23.6.0", + "eslint": "^6.8.0", + "jest": "^24.9.0", "request": "^2.88.0" }, + "engines": { + "node": ">=10" + }, "files": [ "lib/" ], @@ -86,5 +85,5 @@ "pretest": "node scripts/get-latest-platform-tests.js", "test": "jest" }, - "version": "1.1.0" + "version": "2.0.0" } diff --git a/node_modules/debug/CHANGELOG.md b/node_modules/debug/CHANGELOG.md deleted file mode 100644 index 820d21e..0000000 --- a/node_modules/debug/CHANGELOG.md +++ /dev/null @@ -1,395 +0,0 @@ - -3.1.0 / 2017-09-26 -================== - - * Add `DEBUG_HIDE_DATE` env var (#486) - * Remove ReDoS regexp in %o formatter (#504) - * Remove "component" from package.json - * Remove `component.json` - * Ignore package-lock.json - * Examples: fix colors printout - * Fix: browser detection - * Fix: spelling mistake (#496, @EdwardBetts) - -3.0.1 / 2017-08-24 -================== - - * Fix: Disable colors in Edge and Internet Explorer (#489) - -3.0.0 / 2017-08-08 -================== - - * Breaking: Remove DEBUG_FD (#406) - * Breaking: Use `Date#toISOString()` instead to `Date#toUTCString()` when output is not a TTY (#418) - * Breaking: Make millisecond timer namespace specific and allow 'always enabled' output (#408) - * Addition: document `enabled` flag (#465) - * Addition: add 256 colors mode (#481) - * Addition: `enabled()` updates existing debug instances, add `destroy()` function (#440) - * Update: component: update "ms" to v2.0.0 - * Update: separate the Node and Browser tests in Travis-CI - * Update: refactor Readme, fixed documentation, added "Namespace Colors" section, redid screenshots - * Update: separate Node.js and web browser examples for organization - * Update: update "browserify" to v14.4.0 - * Fix: fix Readme typo (#473) - -2.6.9 / 2017-09-22 -================== - - * remove ReDoS regexp in %o formatter (#504) - -2.6.8 / 2017-05-18 -================== - - * Fix: Check for undefined on browser globals (#462, @marbemac) - -2.6.7 / 2017-05-16 -================== - - * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom) - * Fix: Inline extend function in node implementation (#452, @dougwilson) - * Docs: Fix typo (#455, @msasad) - -2.6.5 / 2017-04-27 -================== - - * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek) - * Misc: clean up browser reference checks (#447, @thebigredgeek) - * Misc: add npm-debug.log to .gitignore (@thebigredgeek) - - -2.6.4 / 2017-04-20 -================== - - * Fix: bug that would occur if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo) - * Chore: ignore bower.json in npm installations. (#437, @joaovieira) - * Misc: update "ms" to v0.7.3 (@tootallnate) - -2.6.3 / 2017-03-13 -================== - - * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts) - * Docs: Changelog fix (@thebigredgeek) - -2.6.2 / 2017-03-10 -================== - - * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin) - * Docs: Add backers and sponsors from Open Collective (#422, @piamancini) - * Docs: Add Slackin invite badge (@tootallnate) - -2.6.1 / 2017-02-10 -================== - - * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error - * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0) - * Fix: IE8 "Expected identifier" error (#414, @vgoma) - * Fix: Namespaces would not disable once enabled (#409, @musikov) - -2.6.0 / 2016-12-28 -================== - - * Fix: added better null pointer checks for browser useColors (@thebigredgeek) - * Improvement: removed explicit `window.debug` export (#404, @tootallnate) - * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate) - -2.5.2 / 2016-12-25 -================== - - * Fix: reference error on window within webworkers (#393, @KlausTrainer) - * Docs: fixed README typo (#391, @lurch) - * Docs: added notice about v3 api discussion (@thebigredgeek) - -2.5.1 / 2016-12-20 -================== - - * Fix: babel-core compatibility - -2.5.0 / 2016-12-20 -================== - - * Fix: wrong reference in bower file (@thebigredgeek) - * Fix: webworker compatibility (@thebigredgeek) - * Fix: output formatting issue (#388, @kribblo) - * Fix: babel-loader compatibility (#383, @escwald) - * Misc: removed built asset from repo and publications (@thebigredgeek) - * Misc: moved source files to /src (#378, @yamikuronue) - * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue) - * Test: coveralls integration (#378, @yamikuronue) - * Docs: simplified language in the opening paragraph (#373, @yamikuronue) - -2.4.5 / 2016-12-17 -================== - - * Fix: `navigator` undefined in Rhino (#376, @jochenberger) - * Fix: custom log function (#379, @hsiliev) - * Improvement: bit of cleanup + linting fixes (@thebigredgeek) - * Improvement: rm non-maintainted `dist/` dir (#375, @freewil) - * Docs: simplified language in the opening paragraph. (#373, @yamikuronue) - -2.4.4 / 2016-12-14 -================== - - * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts) - -2.4.3 / 2016-12-14 -================== - - * Fix: navigation.userAgent error for react native (#364, @escwald) - -2.4.2 / 2016-12-14 -================== - - * Fix: browser colors (#367, @tootallnate) - * Misc: travis ci integration (@thebigredgeek) - * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek) - -2.4.1 / 2016-12-13 -================== - - * Fix: typo that broke the package (#356) - -2.4.0 / 2016-12-13 -================== - - * Fix: bower.json references unbuilt src entry point (#342, @justmatt) - * Fix: revert "handle regex special characters" (@tootallnate) - * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate) - * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate) - * Improvement: allow colors in workers (#335, @botverse) - * Improvement: use same color for same namespace. (#338, @lchenay) - -2.3.3 / 2016-11-09 -================== - - * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne) - * Fix: Returning `localStorage` saved values (#331, Levi Thomason) - * Improvement: Don't create an empty object when no `process` (Nathan Rajlich) - -2.3.2 / 2016-11-09 -================== - - * Fix: be super-safe in index.js as well (@TooTallNate) - * Fix: should check whether process exists (Tom Newby) - -2.3.1 / 2016-11-09 -================== - - * Fix: Added electron compatibility (#324, @paulcbetts) - * Improvement: Added performance optimizations (@tootallnate) - * Readme: Corrected PowerShell environment variable example (#252, @gimre) - * Misc: Removed yarn lock file from source control (#321, @fengmk2) - -2.3.0 / 2016-11-07 -================== - - * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic) - * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos) - * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15) - * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran) - * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom) - * Package: Update "ms" to 0.7.2 (#315, @DevSide) - * Package: removed superfluous version property from bower.json (#207 @kkirsche) - * Readme: fix USE_COLORS to DEBUG_COLORS - * Readme: Doc fixes for format string sugar (#269, @mlucool) - * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0) - * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable) - * Readme: better docs for browser support (#224, @matthewmueller) - * Tooling: Added yarn integration for development (#317, @thebigredgeek) - * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek) - * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman) - * Misc: Updated contributors (@thebigredgeek) - -2.2.0 / 2015-05-09 -================== - - * package: update "ms" to v0.7.1 (#202, @dougwilson) - * README: add logging to file example (#193, @DanielOchoa) - * README: fixed a typo (#191, @amir-s) - * browser: expose `storage` (#190, @stephenmathieson) - * Makefile: add a `distclean` target (#189, @stephenmathieson) - -2.1.3 / 2015-03-13 -================== - - * Updated stdout/stderr example (#186) - * Updated example/stdout.js to match debug current behaviour - * Renamed example/stderr.js to stdout.js - * Update Readme.md (#184) - * replace high intensity foreground color for bold (#182, #183) - -2.1.2 / 2015-03-01 -================== - - * dist: recompile - * update "ms" to v0.7.0 - * package: update "browserify" to v9.0.3 - * component: fix "ms.js" repo location - * changed bower package name - * updated documentation about using debug in a browser - * fix: security error on safari (#167, #168, @yields) - -2.1.1 / 2014-12-29 -================== - - * browser: use `typeof` to check for `console` existence - * browser: check for `console.log` truthiness (fix IE 8/9) - * browser: add support for Chrome apps - * Readme: added Windows usage remarks - * Add `bower.json` to properly support bower install - -2.1.0 / 2014-10-15 -================== - - * node: implement `DEBUG_FD` env variable support - * package: update "browserify" to v6.1.0 - * package: add "license" field to package.json (#135, @panuhorsmalahti) - -2.0.0 / 2014-09-01 -================== - - * package: update "browserify" to v5.11.0 - * node: use stderr rather than stdout for logging (#29, @stephenmathieson) - -1.0.4 / 2014-07-15 -================== - - * dist: recompile - * example: remove `console.info()` log usage - * example: add "Content-Type" UTF-8 header to browser example - * browser: place %c marker after the space character - * browser: reset the "content" color via `color: inherit` - * browser: add colors support for Firefox >= v31 - * debug: prefer an instance `log()` function over the global one (#119) - * Readme: update documentation about styled console logs for FF v31 (#116, @wryk) - -1.0.3 / 2014-07-09 -================== - - * Add support for multiple wildcards in namespaces (#122, @seegno) - * browser: fix lint - -1.0.2 / 2014-06-10 -================== - - * browser: update color palette (#113, @gscottolson) - * common: make console logging function configurable (#108, @timoxley) - * node: fix %o colors on old node <= 0.8.x - * Makefile: find node path using shell/which (#109, @timoxley) - -1.0.1 / 2014-06-06 -================== - - * browser: use `removeItem()` to clear localStorage - * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777) - * package: add "contributors" section - * node: fix comment typo - * README: list authors - -1.0.0 / 2014-06-04 -================== - - * make ms diff be global, not be scope - * debug: ignore empty strings in enable() - * node: make DEBUG_COLORS able to disable coloring - * *: export the `colors` array - * npmignore: don't publish the `dist` dir - * Makefile: refactor to use browserify - * package: add "browserify" as a dev dependency - * Readme: add Web Inspector Colors section - * node: reset terminal color for the debug content - * node: map "%o" to `util.inspect()` - * browser: map "%j" to `JSON.stringify()` - * debug: add custom "formatters" - * debug: use "ms" module for humanizing the diff - * Readme: add "bash" syntax highlighting - * browser: add Firebug color support - * browser: add colors for WebKit browsers - * node: apply log to `console` - * rewrite: abstract common logic for Node & browsers - * add .jshintrc file - -0.8.1 / 2014-04-14 -================== - - * package: re-add the "component" section - -0.8.0 / 2014-03-30 -================== - - * add `enable()` method for nodejs. Closes #27 - * change from stderr to stdout - * remove unnecessary index.js file - -0.7.4 / 2013-11-13 -================== - - * remove "browserify" key from package.json (fixes something in browserify) - -0.7.3 / 2013-10-30 -================== - - * fix: catch localStorage security error when cookies are blocked (Chrome) - * add debug(err) support. Closes #46 - * add .browser prop to package.json. Closes #42 - -0.7.2 / 2013-02-06 -================== - - * fix package.json - * fix: Mobile Safari (private mode) is broken with debug - * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript - -0.7.1 / 2013-02-05 -================== - - * add repository URL to package.json - * add DEBUG_COLORED to force colored output - * add browserify support - * fix component. Closes #24 - -0.7.0 / 2012-05-04 -================== - - * Added .component to package.json - * Added debug.component.js build - -0.6.0 / 2012-03-16 -================== - - * Added support for "-" prefix in DEBUG [Vinay Pulim] - * Added `.enabled` flag to the node version [TooTallNate] - -0.5.0 / 2012-02-02 -================== - - * Added: humanize diffs. Closes #8 - * Added `debug.disable()` to the CS variant - * Removed padding. Closes #10 - * Fixed: persist client-side variant again. Closes #9 - -0.4.0 / 2012-02-01 -================== - - * Added browser variant support for older browsers [TooTallNate] - * Added `debug.enable('project:*')` to browser variant [TooTallNate] - * Added padding to diff (moved it to the right) - -0.3.0 / 2012-01-26 -================== - - * Added millisecond diff when isatty, otherwise UTC string - -0.2.0 / 2012-01-22 -================== - - * Added wildcard support - -0.1.0 / 2011-12-02 -================== - - * Added: remove colors unless stderr isatty [TooTallNate] - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/debug/LICENSE b/node_modules/debug/LICENSE deleted file mode 100644 index 658c933..0000000 --- a/node_modules/debug/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -(The MIT License) - -Copyright (c) 2014 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/debug/README.md b/node_modules/debug/README.md deleted file mode 100644 index 88dae35..0000000 --- a/node_modules/debug/README.md +++ /dev/null @@ -1,455 +0,0 @@ -# debug -[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug) [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master) [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) -[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors) - - - -A tiny JavaScript debugging utility modelled after Node.js core's debugging -technique. Works in Node.js and web browsers. - -## Installation - -```bash -$ npm install debug -``` - -## Usage - -`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole. - -Example [_app.js_](./examples/node/app.js): - -```js -var debug = require('debug')('http') - , http = require('http') - , name = 'My App'; - -// fake app - -debug('booting %o', name); - -http.createServer(function(req, res){ - debug(req.method + ' ' + req.url); - res.end('hello\n'); -}).listen(3000, function(){ - debug('listening'); -}); - -// fake worker of some kind - -require('./worker'); -``` - -Example [_worker.js_](./examples/node/worker.js): - -```js -var a = require('debug')('worker:a') - , b = require('debug')('worker:b'); - -function work() { - a('doing lots of uninteresting work'); - setTimeout(work, Math.random() * 1000); -} - -work(); - -function workb() { - b('doing some work'); - setTimeout(workb, Math.random() * 2000); -} - -workb(); -``` - -The `DEBUG` environment variable is then used to enable these based on space or -comma-delimited names. - -Here are some examples: - -screen shot 2017-08-08 at 12 53 04 pm -screen shot 2017-08-08 at 12 53 38 pm -screen shot 2017-08-08 at 12 53 25 pm - -#### Windows command prompt notes - -##### CMD - -On Windows the environment variable is set using the `set` command. - -```cmd -set DEBUG=*,-not_this -``` - -Example: - -```cmd -set DEBUG=* & node app.js -``` - -##### PowerShell (VS Code default) - -PowerShell uses different syntax to set environment variables. - -```cmd -$env:DEBUG = "*,-not_this" -``` - -Example: - -```cmd -$env:DEBUG='app';node app.js -``` - -Then, run the program to be debugged as usual. - -npm script example: -```js - "windowsDebug": "@powershell -Command $env:DEBUG='*';node app.js", -``` - -## Namespace Colors - -Every debug instance has a color generated for it based on its namespace name. -This helps when visually parsing the debug output to identify which debug instance -a debug line belongs to. - -#### Node.js - -In Node.js, colors are enabled when stderr is a TTY. You also _should_ install -the [`supports-color`](https://npmjs.org/supports-color) module alongside debug, -otherwise debug will only use a small handful of basic colors. - - - -#### Web Browser - -Colors are also enabled on "Web Inspectors" that understand the `%c` formatting -option. These are WebKit web inspectors, Firefox ([since version -31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/)) -and the Firebug plugin for Firefox (any version). - - - - -## Millisecond diff - -When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls. - - - -When stdout is not a TTY, `Date#toISOString()` is used, making it more useful for logging the debug information as shown below: - - - - -## Conventions - -If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser". If you append a "*" to the end of your name, it will always be enabled regardless of the setting of the DEBUG environment variable. You can then use it for normal output as well as debug output. - -## Wildcards - -The `*` character may be used as a wildcard. Suppose for example your library has -debuggers named "connect:bodyParser", "connect:compress", "connect:session", -instead of listing all three with -`DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do -`DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`. - -You can also exclude specific debuggers by prefixing them with a "-" character. -For example, `DEBUG=*,-connect:*` would include all debuggers except those -starting with "connect:". - -## Environment Variables - -When running through Node.js, you can set a few environment variables that will -change the behavior of the debug logging: - -| Name | Purpose | -|-----------|-------------------------------------------------| -| `DEBUG` | Enables/disables specific debugging namespaces. | -| `DEBUG_HIDE_DATE` | Hide date from debug output (non-TTY). | -| `DEBUG_COLORS`| Whether or not to use colors in the debug output. | -| `DEBUG_DEPTH` | Object inspection depth. | -| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. | - - -__Note:__ The environment variables beginning with `DEBUG_` end up being -converted into an Options object that gets used with `%o`/`%O` formatters. -See the Node.js documentation for -[`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options) -for the complete list. - -## Formatters - -Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. -Below are the officially supported formatters: - -| Formatter | Representation | -|-----------|----------------| -| `%O` | Pretty-print an Object on multiple lines. | -| `%o` | Pretty-print an Object all on a single line. | -| `%s` | String. | -| `%d` | Number (both integer and float). | -| `%j` | JSON. Replaced with the string '[Circular]' if the argument contains circular references. | -| `%%` | Single percent sign ('%'). This does not consume an argument. | - - -### Custom formatters - -You can add custom formatters by extending the `debug.formatters` object. -For example, if you wanted to add support for rendering a Buffer as hex with -`%h`, you could do something like: - -```js -const createDebug = require('debug') -createDebug.formatters.h = (v) => { - return v.toString('hex') -} - -// …elsewhere -const debug = createDebug('foo') -debug('this is hex: %h', new Buffer('hello world')) -// foo this is hex: 68656c6c6f20776f726c6421 +0ms -``` - - -## Browser Support - -You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify), -or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest), -if you don't want to build it yourself. - -Debug's enable state is currently persisted by `localStorage`. -Consider the situation shown below where you have `worker:a` and `worker:b`, -and wish to debug both. You can enable this using `localStorage.debug`: - -```js -localStorage.debug = 'worker:*' -``` - -And then refresh the page. - -```js -a = debug('worker:a'); -b = debug('worker:b'); - -setInterval(function(){ - a('doing some work'); -}, 1000); - -setInterval(function(){ - b('doing some work'); -}, 1200); -``` - - -## Output streams - - By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method: - -Example [_stdout.js_](./examples/node/stdout.js): - -```js -var debug = require('debug'); -var error = debug('app:error'); - -// by default stderr is used -error('goes to stderr!'); - -var log = debug('app:log'); -// set this namespace to log via console.log -log.log = console.log.bind(console); // don't forget to bind to console! -log('goes to stdout'); -error('still goes to stderr!'); - -// set all output to go via console.info -// overrides all per-namespace log settings -debug.log = console.info.bind(console); -error('now goes to stdout via console.info'); -log('still goes to stdout, but via console.info now'); -``` - -## Extend -You can simply extend debugger -```js -const log = require('debug')('auth'); - -//creates new debug instance with extended namespace -const logSign = log.extend('sign'); -const logLogin = log.extend('login'); - -log('hello'); // auth hello -logSign('hello'); //auth:sign hello -logLogin('hello'); //auth:login hello -``` - -## Set dynamically - -You can also enable debug dynamically by calling the `enable()` method : - -```js -let debug = require('debug'); - -console.log(1, debug.enabled('test')); - -debug.enable('test'); -console.log(2, debug.enabled('test')); - -debug.disable(); -console.log(3, debug.enabled('test')); - -``` - -print : -``` -1 false -2 true -3 false -``` - -Usage : -`enable(namespaces)` -`namespaces` can include modes separated by a colon and wildcards. - -Note that calling `enable()` completely overrides previously set DEBUG variable : - -``` -$ DEBUG=foo node -e 'var dbg = require("debug"); dbg.enable("bar"); console.log(dbg.enabled("foo"))' -=> false -``` - -`disable()` - -Will disable all namespaces. The functions returns the namespaces currently -enabled (and skipped). This can be useful if you want to disable debugging -temporarily without knowing what was enabled to begin with. - -For example: - -```js -let debug = require('debug'); -debug.enable('foo:*,-foo:bar'); -let namespaces = debug.disable(); -debug.enable(namespaces); -``` - -Note: There is no guarantee that the string will be identical to the initial -enable string, but semantically they will be identical. - -## Checking whether a debug target is enabled - -After you've created a debug instance, you can determine whether or not it is -enabled by checking the `enabled` property: - -```javascript -const debug = require('debug')('http'); - -if (debug.enabled) { - // do stuff... -} -``` - -You can also manually toggle this property to force the debug instance to be -enabled or disabled. - - -## Authors - - - TJ Holowaychuk - - Nathan Rajlich - - Andrew Rhyne - -## Backers - -Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## Sponsors - -Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -## License - -(The MIT License) - -Copyright (c) 2014-2017 TJ Holowaychuk <tj@vision-media.ca> - -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/debug/dist/debug.js b/node_modules/debug/dist/debug.js deleted file mode 100644 index 89ad0c2..0000000 --- a/node_modules/debug/dist/debug.js +++ /dev/null @@ -1,912 +0,0 @@ -"use strict"; - -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } - -function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } - -function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -(function (f) { - if ((typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined") { - module.exports = f(); - } else if (typeof define === "function" && define.amd) { - define([], f); - } else { - var g; - - if (typeof window !== "undefined") { - g = window; - } else if (typeof global !== "undefined") { - g = global; - } else if (typeof self !== "undefined") { - g = self; - } else { - g = this; - } - - g.debug = f(); - } -})(function () { - var define, module, exports; - return function () { - function r(e, n, t) { - function o(i, f) { - if (!n[i]) { - if (!e[i]) { - var c = "function" == typeof require && require; - if (!f && c) return c(i, !0); - if (u) return u(i, !0); - var a = new Error("Cannot find module '" + i + "'"); - throw a.code = "MODULE_NOT_FOUND", a; - } - - var p = n[i] = { - exports: {} - }; - e[i][0].call(p.exports, function (r) { - var n = e[i][1][r]; - return o(n || r); - }, p, p.exports, r, e, n, t); - } - - return n[i].exports; - } - - for (var u = "function" == typeof require && require, i = 0; i < t.length; i++) { - o(t[i]); - } - - return o; - } - - return r; - }()({ - 1: [function (require, module, exports) { - /** - * Helpers. - */ - var s = 1000; - var m = s * 60; - var h = m * 60; - var d = h * 24; - var w = d * 7; - var y = d * 365.25; - /** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - - module.exports = function (val, options) { - options = options || {}; - - var type = _typeof(val); - - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isNaN(val) === false) { - return options.long ? fmtLong(val) : fmtShort(val); - } - - throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val)); - }; - /** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - - - function parse(str) { - str = String(str); - - if (str.length > 100) { - return; - } - - var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str); - - if (!match) { - return; - } - - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - - case 'weeks': - case 'week': - case 'w': - return n * w; - - case 'days': - case 'day': - case 'd': - return n * d; - - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - - default: - return undefined; - } - } - /** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - - - function fmtShort(ms) { - var msAbs = Math.abs(ms); - - if (msAbs >= d) { - return Math.round(ms / d) + 'd'; - } - - if (msAbs >= h) { - return Math.round(ms / h) + 'h'; - } - - if (msAbs >= m) { - return Math.round(ms / m) + 'm'; - } - - if (msAbs >= s) { - return Math.round(ms / s) + 's'; - } - - return ms + 'ms'; - } - /** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - - - function fmtLong(ms) { - var msAbs = Math.abs(ms); - - if (msAbs >= d) { - return plural(ms, msAbs, d, 'day'); - } - - if (msAbs >= h) { - return plural(ms, msAbs, h, 'hour'); - } - - if (msAbs >= m) { - return plural(ms, msAbs, m, 'minute'); - } - - if (msAbs >= s) { - return plural(ms, msAbs, s, 'second'); - } - - return ms + ' ms'; - } - /** - * Pluralization helper. - */ - - - function plural(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); - } - }, {}], - 2: [function (require, module, exports) { - // shim for using process in browser - var process = module.exports = {}; // cached from whatever global is present so that test runners that stub it - // don't break things. But we need to wrap it in a try catch in case it is - // wrapped in strict mode code which doesn't define any globals. It's inside a - // function because try/catches deoptimize in certain engines. - - var cachedSetTimeout; - var cachedClearTimeout; - - function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); - } - - function defaultClearTimeout() { - throw new Error('clearTimeout has not been defined'); - } - - (function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } - })(); - - function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } // if setTimeout wasn't available but was latter defined - - - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch (e) { - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch (e) { - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - } - - function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } // if clearTimeout wasn't available but was latter defined - - - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e) { - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e) { - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - } - - var queue = []; - var draining = false; - var currentQueue; - var queueIndex = -1; - - function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - - draining = false; - - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - - if (queue.length) { - drainQueue(); - } - } - - function drainQueue() { - if (draining) { - return; - } - - var timeout = runTimeout(cleanUpNextTick); - draining = true; - var len = queue.length; - - while (len) { - currentQueue = queue; - queue = []; - - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - - queueIndex = -1; - len = queue.length; - } - - currentQueue = null; - draining = false; - runClearTimeout(timeout); - } - - process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - - queue.push(new Item(fun, args)); - - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } - }; // v8 likes predictible objects - - - function Item(fun, array) { - this.fun = fun; - this.array = array; - } - - Item.prototype.run = function () { - this.fun.apply(null, this.array); - }; - - process.title = 'browser'; - process.browser = true; - process.env = {}; - process.argv = []; - process.version = ''; // empty string to avoid regexp issues - - process.versions = {}; - - function noop() {} - - process.on = noop; - process.addListener = noop; - process.once = noop; - process.off = noop; - process.removeListener = noop; - process.removeAllListeners = noop; - process.emit = noop; - process.prependListener = noop; - process.prependOnceListener = noop; - - process.listeners = function (name) { - return []; - }; - - process.binding = function (name) { - throw new Error('process.binding is not supported'); - }; - - process.cwd = function () { - return '/'; - }; - - process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); - }; - - process.umask = function () { - return 0; - }; - }, {}], - 3: [function (require, module, exports) { - /** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - */ - function setup(env) { - createDebug.debug = createDebug; - createDebug.default = createDebug; - createDebug.coerce = coerce; - createDebug.disable = disable; - createDebug.enable = enable; - createDebug.enabled = enabled; - createDebug.humanize = require('ms'); - Object.keys(env).forEach(function (key) { - createDebug[key] = env[key]; - }); - /** - * Active `debug` instances. - */ - - createDebug.instances = []; - /** - * The currently active debug mode names, and names to skip. - */ - - createDebug.names = []; - createDebug.skips = []; - /** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - - createDebug.formatters = {}; - /** - * Selects a color for a debug namespace - * @param {String} namespace The namespace string for the for the debug instance to be colored - * @return {Number|String} An ANSI color code for the given namespace - * @api private - */ - - function selectColor(namespace) { - var hash = 0; - - for (var i = 0; i < namespace.length; i++) { - hash = (hash << 5) - hash + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; - } - - createDebug.selectColor = selectColor; - /** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - - function createDebug(namespace) { - var prevTime; - - function debug() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - // Disabled? - if (!debug.enabled) { - return; - } - - var self = debug; // Set `diff` timestamp - - var curr = Number(new Date()); - var ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - args[0] = createDebug.coerce(args[0]); - - if (typeof args[0] !== 'string') { - // Anything else let's inspect with %O - args.unshift('%O'); - } // Apply any `formatters` transformations - - - var index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) { - // If we encounter an escaped % then don't increase the array index - if (match === '%%') { - return match; - } - - index++; - var formatter = createDebug.formatters[format]; - - if (typeof formatter === 'function') { - var val = args[index]; - match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format` - - args.splice(index, 1); - index--; - } - - return match; - }); // Apply env-specific formatting (colors, etc.) - - createDebug.formatArgs.call(self, args); - var logFn = self.log || createDebug.log; - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = createDebug.enabled(namespace); - debug.useColors = createDebug.useColors(); - debug.color = selectColor(namespace); - debug.destroy = destroy; - debug.extend = extend; // Debug.formatArgs = formatArgs; - // debug.rawLog = rawLog; - // env-specific initialization logic for debug instances - - if (typeof createDebug.init === 'function') { - createDebug.init(debug); - } - - createDebug.instances.push(debug); - return debug; - } - - function destroy() { - var index = createDebug.instances.indexOf(this); - - if (index !== -1) { - createDebug.instances.splice(index, 1); - return true; - } - - return false; - } - - function extend(namespace, delimiter) { - var newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); - newDebug.log = this.log; - return newDebug; - } - /** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - - - function enable(namespaces) { - createDebug.save(namespaces); - createDebug.names = []; - createDebug.skips = []; - var i; - var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - var len = split.length; - - for (i = 0; i < len; i++) { - if (!split[i]) { - // ignore empty strings - continue; - } - - namespaces = split[i].replace(/\*/g, '.*?'); - - if (namespaces[0] === '-') { - createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - createDebug.names.push(new RegExp('^' + namespaces + '$')); - } - } - - for (i = 0; i < createDebug.instances.length; i++) { - var instance = createDebug.instances[i]; - instance.enabled = createDebug.enabled(instance.namespace); - } - } - /** - * Disable debug output. - * - * @return {String} namespaces - * @api public - */ - - - function disable() { - var namespaces = [].concat(_toConsumableArray(createDebug.names.map(toNamespace)), _toConsumableArray(createDebug.skips.map(toNamespace).map(function (namespace) { - return '-' + namespace; - }))).join(','); - createDebug.enable(''); - return namespaces; - } - /** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - - - function enabled(name) { - if (name[name.length - 1] === '*') { - return true; - } - - var i; - var len; - - for (i = 0, len = createDebug.skips.length; i < len; i++) { - if (createDebug.skips[i].test(name)) { - return false; - } - } - - for (i = 0, len = createDebug.names.length; i < len; i++) { - if (createDebug.names[i].test(name)) { - return true; - } - } - - return false; - } - /** - * Convert regexp to namespace - * - * @param {RegExp} regxep - * @return {String} namespace - * @api private - */ - - - function toNamespace(regexp) { - return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, '*'); - } - /** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - - - function coerce(val) { - if (val instanceof Error) { - return val.stack || val.message; - } - - return val; - } - - createDebug.enable(createDebug.load()); - return createDebug; - } - - module.exports = setup; - }, { - "ms": 1 - }], - 4: [function (require, module, exports) { - (function (process) { - /* eslint-env browser */ - - /** - * This is the web browser implementation of `debug()`. - */ - exports.log = log; - exports.formatArgs = formatArgs; - exports.save = save; - exports.load = load; - exports.useColors = useColors; - exports.storage = localstorage(); - /** - * Colors. - */ - - exports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33']; - /** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - // eslint-disable-next-line complexity - - function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { - return true; - } // Internet Explorer and Edge do not support colors. - - - if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; - } // Is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - - - return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 - typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker - typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); - } - /** - * Colorize log arguments if enabled. - * - * @api public - */ - - - function formatArgs(args) { - args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff); - - if (!this.useColors) { - return; - } - - var c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - - var index = 0; - var lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, function (match) { - if (match === '%%') { - return; - } - - index++; - - if (match === '%c') { - // We only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - args.splice(lastC, 0, c); - } - /** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ - - - function log() { - var _console; - - // This hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return (typeof console === "undefined" ? "undefined" : _typeof(console)) === 'object' && console.log && (_console = console).log.apply(_console, arguments); - } - /** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ - - - function save(namespaces) { - try { - if (namespaces) { - exports.storage.setItem('debug', namespaces); - } else { - exports.storage.removeItem('debug'); - } - } catch (error) {// Swallow - // XXX (@Qix-) should we be logging these? - } - } - /** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - - - function load() { - var r; - - try { - r = exports.storage.getItem('debug'); - } catch (error) {} // Swallow - // XXX (@Qix-) should we be logging these? - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - - - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; - } - /** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - - - function localstorage() { - try { - // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context - // The Browser also has localStorage in the global context. - return localStorage; - } catch (error) {// Swallow - // XXX (@Qix-) should we be logging these? - } - } - - module.exports = require('./common')(exports); - var formatters = module.exports.formatters; - /** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - - formatters.j = function (v) { - try { - return JSON.stringify(v); - } catch (error) { - return '[UnexpectedJSONParseError]: ' + error.message; - } - }; - }).call(this, require('_process')); - }, { - "./common": 3, - "_process": 2 - }] - }, {}, [4])(4); -}); diff --git a/node_modules/debug/package.json b/node_modules/debug/package.json deleted file mode 100644 index d2a0492..0000000 --- a/node_modules/debug/package.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "_args": [ - [ - "debug@4.1.1", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "debug@4.1.1", - "_id": "debug@4.1.1", - "_inBundle": false, - "_integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "_location": "/debug", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "debug@4.1.1", - "name": "debug", - "escapedName": "debug", - "rawSpec": "4.1.1", - "saveSpec": null, - "fetchSpec": "4.1.1" - }, - "_requiredBy": [ - "/minify" - ], - "_resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "_spec": "4.1.1", - "_where": "D:\\Projects\\vanillajs-seed", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "browser": "./src/browser.js", - "bugs": { - "url": "https://github.com/visionmedia/debug/issues" - }, - "contributors": [ - { - "name": "Nathan Rajlich", - "email": "nathan@tootallnate.net", - "url": "http://n8.io" - }, - { - "name": "Andrew Rhyne", - "email": "rhyneandrew@gmail.com" - } - ], - "dependencies": { - "ms": "^2.1.1" - }, - "description": "small debugging utility", - "devDependencies": { - "@babel/cli": "^7.0.0", - "@babel/core": "^7.0.0", - "@babel/preset-env": "^7.0.0", - "browserify": "14.4.0", - "chai": "^3.5.0", - "concurrently": "^3.1.0", - "coveralls": "^3.0.2", - "istanbul": "^0.4.5", - "karma": "^3.0.0", - "karma-chai": "^0.1.0", - "karma-mocha": "^1.3.0", - "karma-phantomjs-launcher": "^1.0.2", - "mocha": "^5.2.0", - "mocha-lcov-reporter": "^1.2.0", - "rimraf": "^2.5.4", - "xo": "^0.23.0" - }, - "files": [ - "src", - "dist/debug.js", - "LICENSE", - "README.md" - ], - "homepage": "https://github.com/visionmedia/debug#readme", - "keywords": [ - "debug", - "log", - "debugger" - ], - "license": "MIT", - "main": "./src/index.js", - "name": "debug", - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/debug.git" - }, - "scripts": { - "build": "npm run build:debug && npm run build:test", - "build:debug": "babel -o dist/debug.js dist/debug.es6.js > dist/debug.js", - "build:test": "babel -d dist test.js", - "clean": "rimraf dist coverage", - "lint": "xo", - "prebuild:debug": "mkdir -p dist && browserify --standalone debug -o dist/debug.es6.js .", - "pretest:browser": "npm run build", - "test": "npm run test:node && npm run test:browser", - "test:browser": "karma start --single-run", - "test:coverage": "cat ./coverage/lcov.info | coveralls", - "test:node": "istanbul cover _mocha -- test.js" - }, - "unpkg": "./dist/debug.js", - "version": "4.1.1" -} diff --git a/node_modules/debug/src/browser.js b/node_modules/debug/src/browser.js deleted file mode 100644 index 5f34c0d..0000000 --- a/node_modules/debug/src/browser.js +++ /dev/null @@ -1,264 +0,0 @@ -/* eslint-env browser */ - -/** - * This is the web browser implementation of `debug()`. - */ - -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; -exports.storage = localstorage(); - -/** - * Colors. - */ - -exports.colors = [ - '#0000CC', - '#0000FF', - '#0033CC', - '#0033FF', - '#0066CC', - '#0066FF', - '#0099CC', - '#0099FF', - '#00CC00', - '#00CC33', - '#00CC66', - '#00CC99', - '#00CCCC', - '#00CCFF', - '#3300CC', - '#3300FF', - '#3333CC', - '#3333FF', - '#3366CC', - '#3366FF', - '#3399CC', - '#3399FF', - '#33CC00', - '#33CC33', - '#33CC66', - '#33CC99', - '#33CCCC', - '#33CCFF', - '#6600CC', - '#6600FF', - '#6633CC', - '#6633FF', - '#66CC00', - '#66CC33', - '#9900CC', - '#9900FF', - '#9933CC', - '#9933FF', - '#99CC00', - '#99CC33', - '#CC0000', - '#CC0033', - '#CC0066', - '#CC0099', - '#CC00CC', - '#CC00FF', - '#CC3300', - '#CC3333', - '#CC3366', - '#CC3399', - '#CC33CC', - '#CC33FF', - '#CC6600', - '#CC6633', - '#CC9900', - '#CC9933', - '#CCCC00', - '#CCCC33', - '#FF0000', - '#FF0033', - '#FF0066', - '#FF0099', - '#FF00CC', - '#FF00FF', - '#FF3300', - '#FF3333', - '#FF3366', - '#FF3399', - '#FF33CC', - '#FF33FF', - '#FF6600', - '#FF6633', - '#FF9900', - '#FF9933', - '#FFCC00', - '#FFCC33' -]; - -/** - * Currently only WebKit-based Web Inspectors, Firefox >= v31, - * and the Firebug extension (any Firefox version) are known - * to support "%c" CSS customizations. - * - * TODO: add a `localStorage` variable to explicitly enable/disable colors - */ - -// eslint-disable-next-line complexity -function useColors() { - // NB: In an Electron preload script, document will be defined but not fully - // initialized. Since we know we're in Chrome, we'll just detect this case - // explicitly - if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { - return true; - } - - // Internet Explorer and Edge do not support colors. - if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; - } - - // Is webkit? http://stackoverflow.com/a/16459606/376773 - // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 - return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || - // Is firebug? http://stackoverflow.com/a/398120/376773 - (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || - // Is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || - // Double check webkit in userAgent just in case we are in a worker - (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); -} - -/** - * Colorize log arguments if enabled. - * - * @api public - */ - -function formatArgs(args) { - args[0] = (this.useColors ? '%c' : '') + - this.namespace + - (this.useColors ? ' %c' : ' ') + - args[0] + - (this.useColors ? '%c ' : ' ') + - '+' + module.exports.humanize(this.diff); - - if (!this.useColors) { - return; - } - - const c = 'color: ' + this.color; - args.splice(1, 0, c, 'color: inherit'); - - // The final "%c" is somewhat tricky, because there could be other - // arguments passed either before or after the %c, so we need to - // figure out the correct index to insert the CSS into - let index = 0; - let lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, match => { - if (match === '%%') { - return; - } - index++; - if (match === '%c') { - // We only are interested in the *last* %c - // (the user may have provided their own) - lastC = index; - } - }); - - args.splice(lastC, 0, c); -} - -/** - * Invokes `console.log()` when available. - * No-op when `console.log` is not a "function". - * - * @api public - */ -function log(...args) { - // This hackery is required for IE8/9, where - // the `console.log` function doesn't have 'apply' - return typeof console === 'object' && - console.log && - console.log(...args); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ -function save(namespaces) { - try { - if (namespaces) { - exports.storage.setItem('debug', namespaces); - } else { - exports.storage.removeItem('debug'); - } - } catch (error) { - // Swallow - // XXX (@Qix-) should we be logging these? - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ -function load() { - let r; - try { - r = exports.storage.getItem('debug'); - } catch (error) { - // Swallow - // XXX (@Qix-) should we be logging these? - } - - // If debug isn't set in LS, and we're in Electron, try to load $DEBUG - if (!r && typeof process !== 'undefined' && 'env' in process) { - r = process.env.DEBUG; - } - - return r; -} - -/** - * Localstorage attempts to return the localstorage. - * - * This is necessary because safari throws - * when a user disables cookies/localstorage - * and you attempt to access it. - * - * @return {LocalStorage} - * @api private - */ - -function localstorage() { - try { - // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context - // The Browser also has localStorage in the global context. - return localStorage; - } catch (error) { - // Swallow - // XXX (@Qix-) should we be logging these? - } -} - -module.exports = require('./common')(exports); - -const {formatters} = module.exports; - -/** - * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. - */ - -formatters.j = function (v) { - try { - return JSON.stringify(v); - } catch (error) { - return '[UnexpectedJSONParseError]: ' + error.message; - } -}; diff --git a/node_modules/debug/src/common.js b/node_modules/debug/src/common.js deleted file mode 100644 index 2f82b8d..0000000 --- a/node_modules/debug/src/common.js +++ /dev/null @@ -1,266 +0,0 @@ - -/** - * This is the common logic for both the Node.js and web browser - * implementations of `debug()`. - */ - -function setup(env) { - createDebug.debug = createDebug; - createDebug.default = createDebug; - createDebug.coerce = coerce; - createDebug.disable = disable; - createDebug.enable = enable; - createDebug.enabled = enabled; - createDebug.humanize = require('ms'); - - Object.keys(env).forEach(key => { - createDebug[key] = env[key]; - }); - - /** - * Active `debug` instances. - */ - createDebug.instances = []; - - /** - * The currently active debug mode names, and names to skip. - */ - - createDebug.names = []; - createDebug.skips = []; - - /** - * Map of special "%n" handling functions, for the debug "format" argument. - * - * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". - */ - createDebug.formatters = {}; - - /** - * Selects a color for a debug namespace - * @param {String} namespace The namespace string for the for the debug instance to be colored - * @return {Number|String} An ANSI color code for the given namespace - * @api private - */ - function selectColor(namespace) { - let hash = 0; - - for (let i = 0; i < namespace.length; i++) { - hash = ((hash << 5) - hash) + namespace.charCodeAt(i); - hash |= 0; // Convert to 32bit integer - } - - return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; - } - createDebug.selectColor = selectColor; - - /** - * Create a debugger with the given `namespace`. - * - * @param {String} namespace - * @return {Function} - * @api public - */ - function createDebug(namespace) { - let prevTime; - - function debug(...args) { - // Disabled? - if (!debug.enabled) { - return; - } - - const self = debug; - - // Set `diff` timestamp - const curr = Number(new Date()); - const ms = curr - (prevTime || curr); - self.diff = ms; - self.prev = prevTime; - self.curr = curr; - prevTime = curr; - - args[0] = createDebug.coerce(args[0]); - - if (typeof args[0] !== 'string') { - // Anything else let's inspect with %O - args.unshift('%O'); - } - - // Apply any `formatters` transformations - let index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { - // If we encounter an escaped % then don't increase the array index - if (match === '%%') { - return match; - } - index++; - const formatter = createDebug.formatters[format]; - if (typeof formatter === 'function') { - const val = args[index]; - match = formatter.call(self, val); - - // Now we need to remove `args[index]` since it's inlined in the `format` - args.splice(index, 1); - index--; - } - return match; - }); - - // Apply env-specific formatting (colors, etc.) - createDebug.formatArgs.call(self, args); - - const logFn = self.log || createDebug.log; - logFn.apply(self, args); - } - - debug.namespace = namespace; - debug.enabled = createDebug.enabled(namespace); - debug.useColors = createDebug.useColors(); - debug.color = selectColor(namespace); - debug.destroy = destroy; - debug.extend = extend; - // Debug.formatArgs = formatArgs; - // debug.rawLog = rawLog; - - // env-specific initialization logic for debug instances - if (typeof createDebug.init === 'function') { - createDebug.init(debug); - } - - createDebug.instances.push(debug); - - return debug; - } - - function destroy() { - const index = createDebug.instances.indexOf(this); - if (index !== -1) { - createDebug.instances.splice(index, 1); - return true; - } - return false; - } - - function extend(namespace, delimiter) { - const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); - newDebug.log = this.log; - return newDebug; - } - - /** - * Enables a debug mode by namespaces. This can include modes - * separated by a colon and wildcards. - * - * @param {String} namespaces - * @api public - */ - function enable(namespaces) { - createDebug.save(namespaces); - - createDebug.names = []; - createDebug.skips = []; - - let i; - const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); - const len = split.length; - - for (i = 0; i < len; i++) { - if (!split[i]) { - // ignore empty strings - continue; - } - - namespaces = split[i].replace(/\*/g, '.*?'); - - if (namespaces[0] === '-') { - createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); - } else { - createDebug.names.push(new RegExp('^' + namespaces + '$')); - } - } - - for (i = 0; i < createDebug.instances.length; i++) { - const instance = createDebug.instances[i]; - instance.enabled = createDebug.enabled(instance.namespace); - } - } - - /** - * Disable debug output. - * - * @return {String} namespaces - * @api public - */ - function disable() { - const namespaces = [ - ...createDebug.names.map(toNamespace), - ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) - ].join(','); - createDebug.enable(''); - return namespaces; - } - - /** - * Returns true if the given mode name is enabled, false otherwise. - * - * @param {String} name - * @return {Boolean} - * @api public - */ - function enabled(name) { - if (name[name.length - 1] === '*') { - return true; - } - - let i; - let len; - - for (i = 0, len = createDebug.skips.length; i < len; i++) { - if (createDebug.skips[i].test(name)) { - return false; - } - } - - for (i = 0, len = createDebug.names.length; i < len; i++) { - if (createDebug.names[i].test(name)) { - return true; - } - } - - return false; - } - - /** - * Convert regexp to namespace - * - * @param {RegExp} regxep - * @return {String} namespace - * @api private - */ - function toNamespace(regexp) { - return regexp.toString() - .substring(2, regexp.toString().length - 2) - .replace(/\.\*\?$/, '*'); - } - - /** - * Coerce `val`. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - function coerce(val) { - if (val instanceof Error) { - return val.stack || val.message; - } - return val; - } - - createDebug.enable(createDebug.load()); - - return createDebug; -} - -module.exports = setup; diff --git a/node_modules/debug/src/index.js b/node_modules/debug/src/index.js deleted file mode 100644 index bf4c57f..0000000 --- a/node_modules/debug/src/index.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Detect Electron renderer / nwjs process, which is node, but we should - * treat as a browser. - */ - -if (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) { - module.exports = require('./browser.js'); -} else { - module.exports = require('./node.js'); -} diff --git a/node_modules/debug/src/node.js b/node_modules/debug/src/node.js deleted file mode 100644 index 5e1f154..0000000 --- a/node_modules/debug/src/node.js +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Module dependencies. - */ - -const tty = require('tty'); -const util = require('util'); - -/** - * This is the Node.js implementation of `debug()`. - */ - -exports.init = init; -exports.log = log; -exports.formatArgs = formatArgs; -exports.save = save; -exports.load = load; -exports.useColors = useColors; - -/** - * Colors. - */ - -exports.colors = [6, 2, 3, 4, 5, 1]; - -try { - // Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json) - // eslint-disable-next-line import/no-extraneous-dependencies - const supportsColor = require('supports-color'); - - if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { - exports.colors = [ - 20, - 21, - 26, - 27, - 32, - 33, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 56, - 57, - 62, - 63, - 68, - 69, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 92, - 93, - 98, - 99, - 112, - 113, - 128, - 129, - 134, - 135, - 148, - 149, - 160, - 161, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 171, - 172, - 173, - 178, - 179, - 184, - 185, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 203, - 204, - 205, - 206, - 207, - 208, - 209, - 214, - 215, - 220, - 221 - ]; - } -} catch (error) { - // Swallow - we only care if `supports-color` is available; it doesn't have to be. -} - -/** - * Build up the default `inspectOpts` object from the environment variables. - * - * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js - */ - -exports.inspectOpts = Object.keys(process.env).filter(key => { - return /^debug_/i.test(key); -}).reduce((obj, key) => { - // Camel-case - const prop = key - .substring(6) - .toLowerCase() - .replace(/_([a-z])/g, (_, k) => { - return k.toUpperCase(); - }); - - // Coerce string value into JS value - let val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) { - val = true; - } else if (/^(no|off|false|disabled)$/i.test(val)) { - val = false; - } else if (val === 'null') { - val = null; - } else { - val = Number(val); - } - - obj[prop] = val; - return obj; -}, {}); - -/** - * Is stdout a TTY? Colored output is enabled when `true`. - */ - -function useColors() { - return 'colors' in exports.inspectOpts ? - Boolean(exports.inspectOpts.colors) : - tty.isatty(process.stderr.fd); -} - -/** - * Adds ANSI color escape codes if enabled. - * - * @api public - */ - -function formatArgs(args) { - const {namespace: name, useColors} = this; - - if (useColors) { - const c = this.color; - const colorCode = '\u001B[3' + (c < 8 ? c : '8;5;' + c); - const prefix = ` ${colorCode};1m${name} \u001B[0m`; - - args[0] = prefix + args[0].split('\n').join('\n' + prefix); - args.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\u001B[0m'); - } else { - args[0] = getDate() + name + ' ' + args[0]; - } -} - -function getDate() { - if (exports.inspectOpts.hideDate) { - return ''; - } - return new Date().toISOString() + ' '; -} - -/** - * Invokes `util.format()` with the specified arguments and writes to stderr. - */ - -function log(...args) { - return process.stderr.write(util.format(...args) + '\n'); -} - -/** - * Save `namespaces`. - * - * @param {String} namespaces - * @api private - */ -function save(namespaces) { - if (namespaces) { - process.env.DEBUG = namespaces; - } else { - // If you set a process.env field to null or undefined, it gets cast to the - // string 'null' or 'undefined'. Just delete instead. - delete process.env.DEBUG; - } -} - -/** - * Load `namespaces`. - * - * @return {String} returns the previously persisted debug modes - * @api private - */ - -function load() { - return process.env.DEBUG; -} - -/** - * Init logic for `debug` instances. - * - * Create a new `inspectOpts` object in case `useColors` is set - * differently for a particular `debug` instance. - */ - -function init(debug) { - debug.inspectOpts = {}; - - const keys = Object.keys(exports.inspectOpts); - for (let i = 0; i < keys.length; i++) { - debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]]; - } -} - -module.exports = require('./common')(exports); - -const {formatters} = module.exports; - -/** - * Map %o to `util.inspect()`, all on a single line. - */ - -formatters.o = function (v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts) - .replace(/\s*\n\s*/g, ' '); -}; - -/** - * Map %O to `util.inspect()`, allowing multiple lines if needed. - */ - -formatters.O = function (v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); -}; diff --git a/node_modules/decimal.js/CHANGELOG.md b/node_modules/decimal.js/CHANGELOG.md new file mode 100644 index 0000000..0fec6e9 --- /dev/null +++ b/node_modules/decimal.js/CHANGELOG.md @@ -0,0 +1,209 @@ +#### 10.2.0 +* 08/05/2019 +* #128 Workaround V8 `Math.pow` change. +* #93 Accept `+` prefix when parsing string values. +* #129 Fix typo. + +#### 10.1.1 +* 27/02/2019 +* Check `Symbol` properly. + +#### 10.1.0 +* 26/02/2019 +* #122 Add custom `util.inspect()` function. +* Add `Symbol.toStringTag`. +* #121 Constructor: add range check for arguments of type number and Decimal. +* Remove premable from uglifyjs build script. +* Move *decimal.min.js.map* to root directory. + +#### 10.0.2 +* 13/12/2018 +* #114 Remove soureMappingURL from *decimal.min.js*. +* Remove *bower.json*. + +#### 10.0.1 +* 24/05/2018 +* Add `browser` field to *package.json*. + +#### 10.0.0 +* 10/03/2018 +* #88 `toNearest` to return the nearest multiple in the direction of the rounding mode. +* #82 #91 `const` to `var`. +* Add trigonometric precision limit explanantion to documentation. +* Put global ts definitions in separate file (see *bignumber.js* #143). + +#### 9.0.1 +* 15/12/2017 +* #80 Typings: correct return type. + +#### 9.0.0 +* 14/12/2017 +* #78 Typings: remove `toFormat`. + +#### 8.0.0 +* 10/12/2017 +* Correct typings: `toFraction` returns `Decimal[]`. +* Type-checking: add `Decimal.isDecimal` method. +* Enable configuration reset with `defaults: true`. +* Add named export, Decimal, to *decimal.mjs*. + +#### 7.5.1 +* 03/12/2017 +* Remove typo. + +#### 7.5.0 +* 03/12/2017 +* Use TypeScript declarations outside modules. + +#### 7.4.0 +* 25/11/2017 +* Add TypeScript typings. + +#### 7.3.0 +* 26/09/2017 +* Rename *decimal.es6.js* to *decimal.mjs*. +* Amend *.travis.yml*. + +#### 7.2.4 +* 09/09/2017 +* Update docs regarding `global.crypto`. +* Fix `import` issues. + +#### 7.2.3 +* 27/06/2017 +* Bugfix: #58 `pow` sometimes throws when result is `Infinity`. + +#### 7.2.2 +* 25/06/2017 +* Bugfix: #57 Powers of -1 for integers over `Number.MAX_SAFE_INTEGER`. + +#### 7.2.1 +* 04/05/2017 +* Fix *README* badges. + +#### 7.2.0 +* 09/04/2017 +* Add *decimal.es6.js* + +#### 7.1.2 +* 05/04/2017 +* `Decimal.default` to `Decimal['default']` IE8 issue + +#### 7.1.1 +* 10/01/2017 +* Remove duplicated for-loop +* Minor refactoring + +#### 7.1.0 +* 09/11/2016 +* Support ES6 imports. + +#### 7.0.0 +* 09/11/2016 +* Remove `require('crypto')` - leave it to the user +* Default `Decimal.crypto` to `false` +* Add `Decimal.set` as `Decimal.config` alias + +#### 6.0.0 +* 30/06/2016 +* Removed base-88 serialization format +* Amended `toJSON` and removed `Decimal.fromJSON` accordingly + +#### 5.0.8 +* 09/03/2016 +* Add newline to single test results +* Correct year + +#### 5.0.7 +* 29/02/2016 +* Add decimal.js-light link +* Remove outdated example from docs + +#### 5.0.6 +* 22/02/2016 +* Add bower.json + +#### 5.0.5 +* 20/02/2016 +* Bugfix: #26 wrong precision applied + +#### 5.0.4 +* 14/02/2016 +* Bugfix: #26 clone + +#### 5.0.3 +* 06/02/2016 +* Refactor tests + +#### 5.0.2 +* 05/02/2016 +* Added immutability tests +* Minor *decimal.js* clean-up + +#### 5.0.1 +* 28/01/2016 +* Bugfix: #20 cos mutates value +* Add pi info to docs + +#### 5.0.0 +* 25/01/2016 +* Added trigonometric functions and `cubeRoot` method +* Added most of JavaScript's `Math` object methods as Decimal methods +* Added `toBinary`, `toHexadecimal` and `toOctal` methods +* Added `isPositive` method +* Removed the 15 significant digit limit for numbers +* `toFraction` now returns an array of two Decimals, not two strings +* String values containing whitespace or a plus sign are no longer accepted +* `valueOf` now returns `'-0'` for minus zero +* `comparedTo` now returns `NaN` not `null` for comparisons with `NaN` +* `Decimal.max` and `Decimal.min` no longer accept an array +* The Decimal constructor and `toString` no longer accept a base argument +* Binary, hexadecimal and octal prefixes are now recognised for string values +* Removed `Decimal.errors` configuration property +* Removed `toFormat` method +* Removed `Decimal.ONE` +* Renamed `exponential` method to `naturalExponential` +* Renamed `Decimal.constructor` method to `Decimal.clone` +* Simplified error handling and amended error messages +* Refactored the test suite +* `Decimal.crypto` is now `undefined` by default, and the `crypto` object will be used if available +* Major internal refactoring +* Removed *bower.json* + +#### 4.0.2 +* 20/02/2015 Add bower.json. Add source map. Amend travis CI. Amend doc/comments + +#### 4.0.1 +* 11/12/2014 Assign correct constructor when duplicating a Decimal + +#### 4.0.0 +* 10/11/2014 `toFormat` amended to use `Decimal.format` object for more flexible configuration + +#### 3.0.1 +* 8/06/2014 Surround crypto require in try catch. See issue #5 + +#### 3.0.0 +* 4/06/2014 `random` simplified. Major internal changes mean the properties of a Decimal must now be considered read-only + +#### 2.1.0 +* 4/06/2014 Amend UMD + +#### 2.0.3 +* 8/05/2014 Fix NaN toNumber + +#### 2.0.2 +* 30/04/2014 Correct doc links + +#### 2.0.1 +* 10/04/2014 Update npmignore + +#### 2.0.0 +* 10/04/2014 Add `toSignificantDigits` +* Remove `toInteger` +* No arguments to `ceil`, `floor`, `round` and `trunc` + +#### 1.0.1 +* 07/04/2014 Minor documentation clean-up + +#### 1.0.0 +* 02/04/2014 Initial release diff --git a/node_modules/decimal.js/LICENCE.md b/node_modules/decimal.js/LICENCE.md new file mode 100644 index 0000000..3c39f85 --- /dev/null +++ b/node_modules/decimal.js/LICENCE.md @@ -0,0 +1,23 @@ +The MIT Licence. + +Copyright (c) 2019 Michael Mclaughlin + +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/decimal.js/README.md b/node_modules/decimal.js/README.md new file mode 100644 index 0000000..34189e9 --- /dev/null +++ b/node_modules/decimal.js/README.md @@ -0,0 +1,235 @@ +![decimal.js](https://raw.githubusercontent.com/MikeMcl/decimal.js/gh-pages/decimaljs.png) + +An arbitrary-precision Decimal type for JavaScript. + +[![Build Status](https://travis-ci.org/MikeMcl/decimal.js.svg)](https://travis-ci.org/MikeMcl/decimal.js) +[![CDNJS](https://img.shields.io/cdnjs/v/decimal.js.svg)](https://cdnjs.com/libraries/decimal.js) + +
+ +## Features + + - Integers and floats + - Simple but full-featured API + - Replicates many of the methods of JavaScript's `Number.prototype` and `Math` objects + - Also handles hexadecimal, binary and octal values + - Faster, smaller, and perhaps easier to use than JavaScript versions of Java's BigDecimal + - No dependencies + - Wide platform compatibility: uses JavaScript 1.5 (ECMAScript 3) features only + - Comprehensive [documentation](http://mikemcl.github.io/decimal.js/) and test set + - Includes a TypeScript declaration file: *decimal.d.ts* + +![API](https://raw.githubusercontent.com/MikeMcl/decimal.js/gh-pages/API.png) + +The library is similar to [bignumber.js](https://github.com/MikeMcl/bignumber.js/), but here +precision is specified in terms of significant digits rather than decimal places, and all +calculations are rounded to the precision (similar to Python's decimal module) rather than just +those involving division. + +This library also adds the trigonometric functions, among others, and supports non-integer powers, +which makes it a significantly larger library than *bignumber.js* and the even smaller +[big.js](https://github.com/MikeMcl/big.js/). + +For a lighter version of this library without the trigonometric functions see [decimal.js-light](https://github.com/MikeMcl/decimal.js-light/). + +## Load + +The library is the single JavaScript file *decimal.js* (or minified, *decimal.min.js*). + +Browser: + +```html + +``` + +[Node.js](http://nodejs.org): + +```bash +$ npm install --save decimal.js +``` + +```js +var Decimal = require('decimal.js'); +``` + +ES6 module (*decimal.mjs*): + +```js +//import Decimal from 'decimal.js'; +import {Decimal} from 'decimal.js'; +``` + +AMD loader libraries such as [requireJS](http://requirejs.org/): + +```js +require(['decimal'], function(Decimal) { + // Use Decimal here in local scope. No global Decimal. +}); +``` + +## Use + +*In all examples below, `var`, semicolons and `toString` calls are not shown. +If a commented-out value is in quotes it means `toString` has been called on the preceding expression.* + +The library exports a single function object, `Decimal`, the constructor of Decimal instances. + +It accepts a value of type number, string or Decimal. + +```js +x = new Decimal(123.4567) +y = new Decimal('123456.7e-3') +z = new Decimal(x) +x.equals(y) && y.equals(z) && x.equals(z) // true +``` + +A value can also be in binary, hexadecimal or octal if the appropriate prefix is included. + +```js +x = new Decimal('0xff.f') // '255.9375' +y = new Decimal('0b10101100') // '172' +z = x.plus(y) // '427.9375' + +z.toBinary() // '0b110101011.1111' +z.toBinary(13) // '0b1.101010111111p+8' +``` + +Using binary exponential notation to create a Decimal with the value of `Number.MAX_VALUE`: + +```js +x = new Decimal('0b1.1111111111111111111111111111111111111111111111111111p+1023') +``` + +A Decimal is immutable in the sense that it is not changed by its methods. + +```js +0.3 - 0.1 // 0.19999999999999998 +x = new Decimal(0.3) +x.minus(0.1) // '0.2' +x // '0.3' +``` + +The methods that return a Decimal can be chained. + +```js +x.dividedBy(y).plus(z).times(9).floor() +x.times('1.23456780123456789e+9').plus(9876.5432321).dividedBy('4444562598.111772').ceil() +``` + +Many method names have a shorter alias. + +```js +x.squareRoot().dividedBy(y).toPower(3).equals(x.sqrt().div(y).pow(3)) // true +x.cmp(y.mod(z).neg()) == 1 && x.comparedTo(y.modulo(z).negated()) == 1 // true +``` + +Like JavaScript's Number type, there are `toExponential`, `toFixed` and `toPrecision` methods, + +```js +x = new Decimal(255.5) +x.toExponential(5) // '2.55500e+2' +x.toFixed(5) // '255.50000' +x.toPrecision(5) // '255.50' +``` + +and almost all of the methods of JavaScript's Math object are also replicated. + +```js +Decimal.sqrt('6.98372465832e+9823') // '8.3568682281821340204e+4911' +Decimal.pow(2, 0.0979843) // '1.0702770511687781839' +``` + +There are `isNaN` and `isFinite` methods, as `NaN` and `Infinity` are valid `Decimal` values, + +```js +x = new Decimal(NaN) // 'NaN' +y = new Decimal(Infinity) // 'Infinity' +x.isNaN() && !y.isNaN() && !x.isFinite() && !y.isFinite() // true +``` + +and a `toFraction` method with an optional *maximum denominator* argument + +```js +z = new Decimal(355) +pi = z.dividedBy(113) // '3.1415929204' +pi.toFraction() // [ '7853982301', '2500000000' ] +pi.toFraction(1000) // [ '355', '113' ] +``` + +All calculations are rounded according to the number of significant digits and rounding mode +specified by the `precision` and `rounding` properties of the Decimal constructor. + +For advanced usage, multiple Decimal constructors can be created, each with their own independent configuration which +applies to all Decimal numbers created from it. + +```js +// Set the precision and rounding of the default Decimal constructor +Decimal.set({ precision: 5, rounding: 4 }) + +// Create another Decimal constructor, optionally passing in a configuration object +Decimal9 = Decimal.clone({ precision: 9, rounding: 1 }) + +x = new Decimal(5) +y = new Decimal9(5) + +x.div(3) // '1.6667' +y.div(3) // '1.66666666' +``` + +The value of a Decimal is stored in a floating point format in terms of its digits, exponent and sign. + +```js +x = new Decimal(-12345.67); +x.d // [ 12345, 6700000 ] digits (base 10000000) +x.e // 4 exponent (base 10) +x.s // -1 sign +``` + +For further information see the [API](http://mikemcl.github.io/decimal.js/) reference in the *doc* directory. + +## Test + +The library can be tested using Node.js or a browser. + +The *test* directory contains the file *test.js* which runs all the tests when executed by Node, +and the file *test.html* which runs all the tests when opened in a browser. + +To run all the tests, from a command-line at the root directory using npm + +```bash +$ npm test +``` + +or at the *test* directory using Node + +```bash +$ node test +``` + +Each separate test module can also be executed individually, for example, at the *test/modules* directory + +```bash +$ node toFraction +``` + +## Build + +For Node, if [uglify-js](https://github.com/mishoo/UglifyJS2) is installed + +```bash +npm install uglify-js -g +``` + +then + +```bash +npm run build +``` + +will create *decimal.min.js*, and a source map will also be added to the *doc* directory. + +## Licence + +MIT. + +See *LICENCE.md* diff --git a/node_modules/decimal.js/decimal.d.ts b/node_modules/decimal.js/decimal.d.ts new file mode 100644 index 0000000..428089d --- /dev/null +++ b/node_modules/decimal.js/decimal.d.ts @@ -0,0 +1,295 @@ +// Type definitions for decimal.js >=7.0.0 +// Project: https://github.com/MikeMcl/decimal.js +// Definitions by: Michael Mclaughlin +// Definitions: https://github.com/MikeMcl/decimal.js +// +// Documentation: http://mikemcl.github.io/decimal.js/ +// +// Exports: +// +// class Decimal (default export) +// type Decimal.Constructor +// type Decimal.Instance +// type Decimal.Modulo +// type Decimal.Rounding +// type Decimal.Value +// interface Decimal.Config +// +// Example (alternative syntax commented-out): +// +// import {Decimal} from "decimal.js" +// //import Decimal from "decimal.js" +// +// let r: Decimal.Rounding = Decimal.ROUND_UP; +// let c: Decimal.Configuration = {precision: 4, rounding: r}; +// Decimal.set(c); +// let v: Decimal.Value = '12345.6789'; +// let d: Decimal = new Decimal(v); +// //let d: Decimal.Instance = new Decimal(v); +// +// The use of compiler option `--strictNullChecks` is recommended. + +export default Decimal; + +export namespace Decimal { + export type Constructor = typeof Decimal; + export type Instance = Decimal; + export type Rounding = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8; + export type Modulo = Rounding | 9; + export type Value = string | number | Decimal; + + // http://mikemcl.github.io/decimal.js/#constructor-properties + export interface Config { + precision?: number; + rounding?: Rounding; + toExpNeg?: number; + toExpPos?: number; + minE?: number; + maxE?: number; + crypto?: boolean; + modulo?: Modulo; + defaults?: boolean; + } +} + +export declare class Decimal { + readonly d: number[]; + readonly e: number; + readonly s: number; + private readonly name: string; + + constructor(n: Decimal.Value); + + absoluteValue(): Decimal; + abs(): Decimal; + + ceil(): Decimal; + + comparedTo(n: Decimal.Value): number; + cmp(n: Decimal.Value): number; + + cosine(): Decimal; + cos(): Decimal; + + cubeRoot(): Decimal; + cbrt(): Decimal; + + decimalPlaces(): number; + dp(): number; + + dividedBy(n: Decimal.Value): Decimal; + div(n: Decimal.Value): Decimal; + + dividedToIntegerBy(n: Decimal.Value): Decimal; + divToInt(n: Decimal.Value): Decimal; + + equals(n: Decimal.Value): boolean; + eq(n: Decimal.Value): boolean; + + floor(): Decimal; + + greaterThan(n: Decimal.Value): boolean; + gt(n: Decimal.Value): boolean; + + greaterThanOrEqualTo(n: Decimal.Value): boolean; + gte(n: Decimal.Value): boolean; + + hyperbolicCosine(): Decimal; + cosh(): Decimal; + + hyperbolicSine(): Decimal; + sinh(): Decimal; + + hyperbolicTangent(): Decimal; + tanh(): Decimal; + + inverseCosine(): Decimal; + acos(): Decimal; + + inverseHyperbolicCosine(): Decimal; + acosh(): Decimal; + + inverseHyperbolicSine(): Decimal; + asinh(): Decimal; + + inverseHyperbolicTangent(): Decimal; + atanh(): Decimal; + + inverseSine(): Decimal; + asin(): Decimal; + + inverseTangent(): Decimal; + atan(): Decimal; + + isFinite(): boolean; + + isInteger(): boolean; + isInt(): boolean; + + isNaN(): boolean; + + isNegative(): boolean; + isNeg(): boolean; + + isPositive(): boolean; + isPos(): boolean; + + isZero(): boolean; + + lessThan(n: Decimal.Value): boolean; + lt(n: Decimal.Value): boolean; + + lessThanOrEqualTo(n: Decimal.Value): boolean; + lte(n: Decimal.Value): boolean; + + logarithm(n?: Decimal.Value): Decimal; + log(n?: Decimal.Value): Decimal; + + minus(n: Decimal.Value): Decimal; + sub(n: Decimal.Value): Decimal; + + modulo(n: Decimal.Value): Decimal; + mod(n: Decimal.Value): Decimal; + + naturalExponential(): Decimal; + exp(): Decimal; + + naturalLogarithm(): Decimal; + ln(): Decimal; + + negated(): Decimal; + neg(): Decimal; + + plus(n: Decimal.Value): Decimal; + add(n: Decimal.Value): Decimal; + + precision(includeZeros?: boolean): number; + sd(includeZeros?: boolean): number; + + round(): Decimal; + + sine() : Decimal; + sin() : Decimal; + + squareRoot(): Decimal; + sqrt(): Decimal; + + tangent() : Decimal; + tan() : Decimal; + + times(n: Decimal.Value): Decimal; + mul(n: Decimal.Value) : Decimal; + + toBinary(significantDigits?: number): string; + toBinary(significantDigits: number, rounding: Decimal.Rounding): string; + + toDecimalPlaces(decimalPlaces?: number): Decimal; + toDecimalPlaces(decimalPlaces: number, rounding: Decimal.Rounding): Decimal; + toDP(decimalPlaces?: number): Decimal; + toDP(decimalPlaces: number, rounding: Decimal.Rounding): Decimal; + + toExponential(decimalPlaces?: number): string; + toExponential(decimalPlaces: number, rounding: Decimal.Rounding): string; + + toFixed(decimalPlaces?: number): string; + toFixed(decimalPlaces: number, rounding: Decimal.Rounding): string; + + toFraction(max_denominator?: Decimal.Value): Decimal[]; + + toHexadecimal(significantDigits?: number): string; + toHexadecimal(significantDigits: number, rounding: Decimal.Rounding): string; + toHex(significantDigits?: number): string; + toHex(significantDigits: number, rounding?: Decimal.Rounding): string; + + toJSON(): string; + + toNearest(n: Decimal.Value, rounding?: Decimal.Rounding): Decimal; + + toNumber(): number; + + toOctal(significantDigits?: number): string; + toOctal(significantDigits: number, rounding: Decimal.Rounding): string; + + toPower(n: Decimal.Value): Decimal; + pow(n: Decimal.Value): Decimal; + + toPrecision(significantDigits?: number): string; + toPrecision(significantDigits: number, rounding: Decimal.Rounding): string; + + toSignificantDigits(significantDigits?: number): Decimal; + toSignificantDigits(significantDigits: number, rounding: Decimal.Rounding): Decimal; + toSD(significantDigits?: number): Decimal; + toSD(significantDigits: number, rounding: Decimal.Rounding): Decimal; + + toString(): string; + + truncated(): Decimal; + trunc(): Decimal; + + valueOf(): string; + + static abs(n: Decimal.Value): Decimal; + static acos(n: Decimal.Value): Decimal; + static acosh(n: Decimal.Value): Decimal; + static add(x: Decimal.Value, y: Decimal.Value): Decimal; + static asin(n: Decimal.Value): Decimal; + static asinh(n: Decimal.Value): Decimal; + static atan(n: Decimal.Value): Decimal; + static atanh(n: Decimal.Value): Decimal; + static atan2(y: Decimal.Value, x: Decimal.Value): Decimal; + static cbrt(n: Decimal.Value): Decimal; + static ceil(n: Decimal.Value): Decimal; + static clone(object?: Decimal.Config): Decimal.Constructor; + static config(object: Decimal.Config): Decimal.Constructor; + static cos(n: Decimal.Value): Decimal; + static cosh(n: Decimal.Value): Decimal; + static div(x: Decimal.Value, y: Decimal.Value): Decimal; + static exp(n: Decimal.Value): Decimal; + static floor(n: Decimal.Value): Decimal; + static hypot(...n: Decimal.Value[]): Decimal; + static isDecimal(object: any): boolean + static ln(n: Decimal.Value): Decimal; + static log(n: Decimal.Value, base?: Decimal.Value): Decimal; + static log2(n: Decimal.Value): Decimal; + static log10(n: Decimal.Value): Decimal; + static max(...n: Decimal.Value[]): Decimal; + static min(...n: Decimal.Value[]): Decimal; + static mod(x: Decimal.Value, y: Decimal.Value): Decimal; + static mul(x: Decimal.Value, y: Decimal.Value): Decimal; + static noConflict(): Decimal.Constructor; // Browser only + static pow(base: Decimal.Value, exponent: Decimal.Value): Decimal; + static random(significantDigits?: number): Decimal; + static round(n: Decimal.Value): Decimal; + static set(object: Decimal.Config): Decimal.Constructor; + static sign(n: Decimal.Value): Decimal; + static sin(n: Decimal.Value): Decimal; + static sinh(n: Decimal.Value): Decimal; + static sqrt(n: Decimal.Value): Decimal; + static sub(x: Decimal.Value, y: Decimal.Value): Decimal; + static tan(n: Decimal.Value): Decimal; + static tanh(n: Decimal.Value): Decimal; + static trunc(n: Decimal.Value): Decimal; + + static readonly default?: Decimal.Constructor; + static readonly Decimal?: Decimal.Constructor; + + static readonly precision: number; + static readonly rounding: Decimal.Rounding; + static readonly toExpNeg: number; + static readonly toExpPos: number; + static readonly minE: number; + static readonly maxE: number; + static readonly crypto: boolean; + static readonly modulo: Decimal.Modulo; + + static readonly ROUND_UP: 0; + static readonly ROUND_DOWN: 1; + static readonly ROUND_CEIL: 2; + static readonly ROUND_FLOOR: 3; + static readonly ROUND_HALF_UP: 4; + static readonly ROUND_HALF_DOWN: 5; + static readonly ROUND_HALF_EVEN: 6; + static readonly ROUND_HALF_CEIL: 7; + static readonly ROUND_HALF_FLOOR: 8; + static readonly EUCLID: 9; +} diff --git a/node_modules/decimal.js/decimal.global.d.ts b/node_modules/decimal.js/decimal.global.d.ts new file mode 100644 index 0000000..0b0446b --- /dev/null +++ b/node_modules/decimal.js/decimal.global.d.ts @@ -0,0 +1,316 @@ +// Type definitions for decimal.js >=7.0.0 +// Project: https://github.com/MikeMcl/decimal.js +// Definitions by: Michael Mclaughlin +// Definitions: https://github.com/MikeMcl/decimal.js +// +// Documentation: http://mikemcl.github.io/decimal.js/ +// +// Exports (available globally or when using import): +// +// class Decimal (default export) +// type Decimal.Constructor +// type Decimal.Instance +// type Decimal.Modulo +// type Decimal.Rounding +// type Decimal.Value +// interface Decimal.Config +// +// Example (alternative syntax commented-out): +// +// import {Decimal} from "decimal.js" +// //import Decimal from "decimal.js" +// +// let r: Decimal.Rounding = Decimal.ROUND_UP; +// let c: Decimal.Configuration = {precision: 4, rounding: r}; +// Decimal.set(c); +// let v: Decimal.Value = '12345.6789'; +// let d: Decimal = new Decimal(v); +// //let d: Decimal.Instance = new Decimal(v); +// +// The use of compiler option `--strictNullChecks` is recommended. + +export default Decimal; + +export namespace Decimal { + export type Config = DecimalConfig; + export type Constructor = DecimalConstructor; + export type Instance = DecimalInstance; + export type Modulo = DecimalModulo; + export type Rounding = DecimalRounding; + export type Value = DecimalValue; +} + +declare global { + const Decimal: DecimalConstructor; + type Decimal = DecimalInstance; + + namespace Decimal { + type Config = DecimalConfig; + type Constructor = DecimalConstructor; + type Instance = DecimalInstance; + type Modulo = DecimalModulo; + type Rounding = DecimalRounding; + type Value = DecimalValue; + } +} + +type DecimalInstance = Decimal; +type DecimalConstructor = typeof Decimal; +type DecimalValue = string | number | Decimal; +type DecimalRounding = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8; +type DecimalModulo = DecimalRounding | 9; + +// http://mikemcl.github.io/decimal.js/#constructor-properties +interface DecimalConfig { + precision?: number; + rounding?: DecimalRounding; + toExpNeg?: number; + toExpPos?: number; + minE?: number; + maxE?: number; + crypto?: boolean; + modulo?: DecimalModulo; + defaults?: boolean; +} + +export declare class Decimal { + readonly d: number[]; + readonly e: number; + readonly s: number; + private readonly name: string; + + constructor(n: DecimalValue); + + absoluteValue(): Decimal; + abs(): Decimal; + + ceil(): Decimal; + + comparedTo(n: DecimalValue): number; + cmp(n: DecimalValue): number; + + cosine(): Decimal; + cos(): Decimal; + + cubeRoot(): Decimal; + cbrt(): Decimal; + + decimalPlaces(): number; + dp(): number; + + dividedBy(n: DecimalValue): Decimal; + div(n: DecimalValue): Decimal; + + dividedToIntegerBy(n: DecimalValue): Decimal; + divToInt(n: DecimalValue): Decimal; + + equals(n: DecimalValue): boolean; + eq(n: DecimalValue): boolean; + + floor(): Decimal; + + greaterThan(n: DecimalValue): boolean; + gt(n: DecimalValue): boolean; + + greaterThanOrEqualTo(n: DecimalValue): boolean; + gte(n: DecimalValue): boolean; + + hyperbolicCosine(): Decimal; + cosh(): Decimal; + + hyperbolicSine(): Decimal; + sinh(): Decimal; + + hyperbolicTangent(): Decimal; + tanh(): Decimal; + + inverseCosine(): Decimal; + acos(): Decimal; + + inverseHyperbolicCosine(): Decimal; + acosh(): Decimal; + + inverseHyperbolicSine(): Decimal; + asinh(): Decimal; + + inverseHyperbolicTangent(): Decimal; + atanh(): Decimal; + + inverseSine(): Decimal; + asin(): Decimal; + + inverseTangent(): Decimal; + atan(): Decimal; + + isFinite(): boolean; + + isInteger(): boolean; + isInt(): boolean; + + isNaN(): boolean; + + isNegative(): boolean; + isNeg(): boolean; + + isPositive(): boolean; + isPos(): boolean; + + isZero(): boolean; + + lessThan(n: DecimalValue): boolean; + lt(n: DecimalValue): boolean; + + lessThanOrEqualTo(n: DecimalValue): boolean; + lte(n: DecimalValue): boolean; + + logarithm(n?: DecimalValue): Decimal; + log(n?: DecimalValue): Decimal; + + minus(n: DecimalValue): Decimal; + sub(n: DecimalValue): Decimal; + + modulo(n: DecimalValue): Decimal; + mod(n: DecimalValue): Decimal; + + naturalExponential(): Decimal; + exp(): Decimal; + + naturalLogarithm(): Decimal; + ln(): Decimal; + + negated(): Decimal; + neg(): Decimal; + + plus(n: DecimalValue): Decimal; + add(n: DecimalValue): Decimal; + + precision(includeZeros?: boolean): number; + sd(includeZeros?: boolean): number; + + round(): Decimal; + + sine() : Decimal; + sin() : Decimal; + + squareRoot(): Decimal; + sqrt(): Decimal; + + tangent() : Decimal; + tan() : Decimal; + + times(n: DecimalValue): Decimal; + mul(n: DecimalValue) : Decimal; + + toBinary(significantDigits?: number): string; + toBinary(significantDigits: number, rounding: DecimalRounding): string; + + toDecimalPlaces(decimalPlaces?: number): Decimal; + toDecimalPlaces(decimalPlaces: number, rounding: DecimalRounding): Decimal; + toDP(decimalPlaces?: number): Decimal; + toDP(decimalPlaces: number, rounding: DecimalRounding): Decimal; + + toExponential(decimalPlaces?: number): string; + toExponential(decimalPlaces: number, rounding: DecimalRounding): string; + + toFixed(decimalPlaces?: number): string; + toFixed(decimalPlaces: number, rounding: DecimalRounding): string; + + toFraction(max_denominator?: DecimalValue): Decimal[]; + + toHexadecimal(significantDigits?: number): string; + toHexadecimal(significantDigits: number, rounding: DecimalRounding): string; + toHex(significantDigits?: number): string; + toHex(significantDigits: number, rounding?: DecimalRounding): string; + + toJSON(): string; + + toNearest(n: DecimalValue, rounding?: DecimalRounding): Decimal; + + toNumber(): number; + + toOctal(significantDigits?: number): string; + toOctal(significantDigits: number, rounding: DecimalRounding): string; + + toPower(n: DecimalValue): Decimal; + pow(n: DecimalValue): Decimal; + + toPrecision(significantDigits?: number): string; + toPrecision(significantDigits: number, rounding: DecimalRounding): string; + + toSignificantDigits(significantDigits?: number): Decimal; + toSignificantDigits(significantDigits: number, rounding: DecimalRounding): Decimal; + toSD(significantDigits?: number): Decimal; + toSD(significantDigits: number, rounding: DecimalRounding): Decimal; + + toString(): string; + + truncated(): Decimal; + trunc(): Decimal; + + valueOf(): string; + + static abs(n: DecimalValue): Decimal; + static acos(n: DecimalValue): Decimal; + static acosh(n: DecimalValue): Decimal; + static add(x: DecimalValue, y: DecimalValue): Decimal; + static asin(n: DecimalValue): Decimal; + static asinh(n: DecimalValue): Decimal; + static atan(n: DecimalValue): Decimal; + static atanh(n: DecimalValue): Decimal; + static atan2(y: DecimalValue, x: DecimalValue): Decimal; + static cbrt(n: DecimalValue): Decimal; + static ceil(n: DecimalValue): Decimal; + static clone(object?: DecimalConfig): DecimalConstructor; + static config(object: DecimalConfig): DecimalConstructor; + static cos(n: DecimalValue): Decimal; + static cosh(n: DecimalValue): Decimal; + static div(x: DecimalValue, y: DecimalValue): Decimal; + static exp(n: DecimalValue): Decimal; + static floor(n: DecimalValue): Decimal; + static hypot(...n: DecimalValue[]): Decimal; + static isDecimal(object: any): boolean + static ln(n: DecimalValue): Decimal; + static log(n: DecimalValue, base?: DecimalValue): Decimal; + static log2(n: DecimalValue): Decimal; + static log10(n: DecimalValue): Decimal; + static max(...n: DecimalValue[]): Decimal; + static min(...n: DecimalValue[]): Decimal; + static mod(x: DecimalValue, y: DecimalValue): Decimal; + static mul(x: DecimalValue, y: DecimalValue): Decimal; + static noConflict(): DecimalConstructor; // Browser only + static pow(base: DecimalValue, exponent: DecimalValue): Decimal; + static random(significantDigits?: number): Decimal; + static round(n: DecimalValue): Decimal; + static set(object: DecimalConfig): DecimalConstructor; + static sign(n: DecimalValue): Decimal; + static sin(n: DecimalValue): Decimal; + static sinh(n: DecimalValue): Decimal; + static sqrt(n: DecimalValue): Decimal; + static sub(x: DecimalValue, y: DecimalValue): Decimal; + static tan(n: DecimalValue): Decimal; + static tanh(n: DecimalValue): Decimal; + static trunc(n: DecimalValue): Decimal; + + static readonly default?: DecimalConstructor; + static readonly Decimal?: DecimalConstructor; + + static readonly precision: number; + static readonly rounding: DecimalRounding; + static readonly toExpNeg: number; + static readonly toExpPos: number; + static readonly minE: number; + static readonly maxE: number; + static readonly crypto: boolean; + static readonly modulo: DecimalModulo; + + static readonly ROUND_UP: 0; + static readonly ROUND_DOWN: 1; + static readonly ROUND_CEIL: 2; + static readonly ROUND_FLOOR: 3; + static readonly ROUND_HALF_UP: 4; + static readonly ROUND_HALF_DOWN: 5; + static readonly ROUND_HALF_EVEN: 6; + static readonly ROUND_HALF_CEIL: 7; + static readonly ROUND_HALF_FLOOR: 8; + static readonly EUCLID: 9; +} diff --git a/node_modules/decimal.js/decimal.js b/node_modules/decimal.js/decimal.js new file mode 100644 index 0000000..23cc2d3 --- /dev/null +++ b/node_modules/decimal.js/decimal.js @@ -0,0 +1,4877 @@ +;(function (globalScope) { + 'use strict'; + + + /* + * decimal.js v10.2.0 + * An arbitrary-precision Decimal type for JavaScript. + * https://github.com/MikeMcl/decimal.js + * Copyright (c) 2019 Michael Mclaughlin + * MIT Licence + */ + + + // ----------------------------------- EDITABLE DEFAULTS ------------------------------------ // + + + // The maximum exponent magnitude. + // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`. + var EXP_LIMIT = 9e15, // 0 to 9e15 + + // The limit on the value of `precision`, and on the value of the first argument to + // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`. + MAX_DIGITS = 1e9, // 0 to 1e9 + + // Base conversion alphabet. + NUMERALS = '0123456789abcdef', + + // The natural logarithm of 10 (1025 digits). + LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058', + + // Pi (1025 digits). + PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789', + + + // The initial configuration properties of the Decimal constructor. + DEFAULTS = { + + // These values must be integers within the stated ranges (inclusive). + // Most of these values can be changed at run-time using the `Decimal.config` method. + + // The maximum number of significant digits of the result of a calculation or base conversion. + // E.g. `Decimal.config({ precision: 20 });` + precision: 20, // 1 to MAX_DIGITS + + // The rounding mode used when rounding to `precision`. + // + // ROUND_UP 0 Away from zero. + // ROUND_DOWN 1 Towards zero. + // ROUND_CEIL 2 Towards +Infinity. + // ROUND_FLOOR 3 Towards -Infinity. + // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up. + // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + // + // E.g. + // `Decimal.rounding = 4;` + // `Decimal.rounding = Decimal.ROUND_HALF_UP;` + rounding: 4, // 0 to 8 + + // The modulo mode used when calculating the modulus: a mod n. + // The quotient (q = a / n) is calculated according to the corresponding rounding mode. + // The remainder (r) is calculated as: r = a - n * q. + // + // UP 0 The remainder is positive if the dividend is negative, else is negative. + // DOWN 1 The remainder has the same sign as the dividend (JavaScript %). + // FLOOR 3 The remainder has the same sign as the divisor (Python %). + // HALF_EVEN 6 The IEEE 754 remainder function. + // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive. + // + // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian + // division (9) are commonly used for the modulus operation. The other rounding modes can also + // be used, but they may not give useful results. + modulo: 1, // 0 to 9 + + // The exponent value at and beneath which `toString` returns exponential notation. + // JavaScript numbers: -7 + toExpNeg: -7, // 0 to -EXP_LIMIT + + // The exponent value at and above which `toString` returns exponential notation. + // JavaScript numbers: 21 + toExpPos: 21, // 0 to EXP_LIMIT + + // The minimum exponent value, beneath which underflow to zero occurs. + // JavaScript numbers: -324 (5e-324) + minE: -EXP_LIMIT, // -1 to -EXP_LIMIT + + // The maximum exponent value, above which overflow to Infinity occurs. + // JavaScript numbers: 308 (1.7976931348623157e+308) + maxE: EXP_LIMIT, // 1 to EXP_LIMIT + + // Whether to use cryptographically-secure random number generation, if available. + crypto: false // true/false + }, + + + // ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- // + + + Decimal, inexact, noConflict, quadrant, + external = true, + + decimalError = '[DecimalError] ', + invalidArgument = decimalError + 'Invalid argument: ', + precisionLimitExceeded = decimalError + 'Precision limit exceeded', + cryptoUnavailable = decimalError + 'crypto unavailable', + + mathfloor = Math.floor, + mathpow = Math.pow, + + isBinary = /^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i, + isHex = /^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i, + isOctal = /^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i, + isDecimal = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, + + BASE = 1e7, + LOG_BASE = 7, + MAX_SAFE_INTEGER = 9007199254740991, + + LN10_PRECISION = LN10.length - 1, + PI_PRECISION = PI.length - 1, + + // Decimal.prototype object + P = { name: '[object Decimal]' }; + + + // Decimal prototype methods + + + /* + * absoluteValue abs + * ceil + * comparedTo cmp + * cosine cos + * cubeRoot cbrt + * decimalPlaces dp + * dividedBy div + * dividedToIntegerBy divToInt + * equals eq + * floor + * greaterThan gt + * greaterThanOrEqualTo gte + * hyperbolicCosine cosh + * hyperbolicSine sinh + * hyperbolicTangent tanh + * inverseCosine acos + * inverseHyperbolicCosine acosh + * inverseHyperbolicSine asinh + * inverseHyperbolicTangent atanh + * inverseSine asin + * inverseTangent atan + * isFinite + * isInteger isInt + * isNaN + * isNegative isNeg + * isPositive isPos + * isZero + * lessThan lt + * lessThanOrEqualTo lte + * logarithm log + * [maximum] [max] + * [minimum] [min] + * minus sub + * modulo mod + * naturalExponential exp + * naturalLogarithm ln + * negated neg + * plus add + * precision sd + * round + * sine sin + * squareRoot sqrt + * tangent tan + * times mul + * toBinary + * toDecimalPlaces toDP + * toExponential + * toFixed + * toFraction + * toHexadecimal toHex + * toNearest + * toNumber + * toOctal + * toPower pow + * toPrecision + * toSignificantDigits toSD + * toString + * truncated trunc + * valueOf toJSON + */ + + + /* + * Return a new Decimal whose value is the absolute value of this Decimal. + * + */ + P.absoluteValue = P.abs = function () { + var x = new this.constructor(this); + if (x.s < 0) x.s = 1; + return finalise(x); + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the + * direction of positive Infinity. + * + */ + P.ceil = function () { + return finalise(new this.constructor(this), this.e + 1, 2); + }; + + + /* + * Return + * 1 if the value of this Decimal is greater than the value of `y`, + * -1 if the value of this Decimal is less than the value of `y`, + * 0 if they have the same value, + * NaN if the value of either Decimal is NaN. + * + */ + P.comparedTo = P.cmp = function (y) { + var i, j, xdL, ydL, + x = this, + xd = x.d, + yd = (y = new x.constructor(y)).d, + xs = x.s, + ys = y.s; + + // Either NaN or ±Infinity? + if (!xd || !yd) { + return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1; + } + + // Either zero? + if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0; + + // Signs differ? + if (xs !== ys) return xs; + + // Compare exponents. + if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1; + + xdL = xd.length; + ydL = yd.length; + + // Compare digit by digit. + for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) { + if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1; + } + + // Compare lengths. + return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1; + }; + + + /* + * Return a new Decimal whose value is the cosine of the value in radians of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-1, 1] + * + * cos(0) = 1 + * cos(-0) = 1 + * cos(Infinity) = NaN + * cos(-Infinity) = NaN + * cos(NaN) = NaN + * + */ + P.cosine = P.cos = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.d) return new Ctor(NaN); + + // cos(0) = cos(-0) = 1 + if (!x.d[0]) return new Ctor(1); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + + x = cosine(Ctor, toLessThanHalfPi(Ctor, x)); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true); + }; + + + /* + * + * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * cbrt(0) = 0 + * cbrt(-0) = -0 + * cbrt(1) = 1 + * cbrt(-1) = -1 + * cbrt(N) = N + * cbrt(-I) = -I + * cbrt(I) = I + * + * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3)) + * + */ + P.cubeRoot = P.cbrt = function () { + var e, m, n, r, rep, s, sd, t, t3, t3plusx, + x = this, + Ctor = x.constructor; + + if (!x.isFinite() || x.isZero()) return new Ctor(x); + external = false; + + // Initial estimate. + s = x.s * mathpow(x.s * x, 1 / 3); + + // Math.cbrt underflow/overflow? + // Pass x to Math.pow as integer, then adjust the exponent of the result. + if (!s || Math.abs(s) == 1 / 0) { + n = digitsToString(x.d); + e = x.e; + + // Adjust n exponent so it is a multiple of 3 away from x exponent. + if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00'); + s = mathpow(n, 1 / 3); + + // Rarely, e may be one less than the result exponent value. + e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2)); + + if (s == 1 / 0) { + n = '5e' + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf('e') + 1) + e; + } + + r = new Ctor(n); + r.s = x.s; + } else { + r = new Ctor(s.toString()); + } + + sd = (e = Ctor.precision) + 3; + + // Halley's method. + // TODO? Compare Newton's method. + for (;;) { + t = r; + t3 = t.times(t).times(t); + t3plusx = t3.plus(x); + r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1); + + // TODO? Replace with for-loop and checkRoundingDigits. + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999 + // , i.e. approaching a rounding boundary, continue the iteration. + if (n == '9999' || !rep && n == '4999') { + + // On the first iteration only, check to see if rounding up gives the exact result as the + // nines may infinitely repeat. + if (!rep) { + finalise(t, e + 1, 0); + + if (t.times(t).times(t).eq(x)) { + r = t; + break; + } + } + + sd += 4; + rep = 1; + } else { + + // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result. + // If not, then there are further digits and m will be truthy. + if (!+n || !+n.slice(1) && n.charAt(0) == '5') { + + // Truncate to the first rounding digit. + finalise(r, e + 1, 1); + m = !r.times(r).times(r).eq(x); + } + + break; + } + } + } + + external = true; + + return finalise(r, e, Ctor.rounding, m); + }; + + + /* + * Return the number of decimal places of the value of this Decimal. + * + */ + P.decimalPlaces = P.dp = function () { + var w, + d = this.d, + n = NaN; + + if (d) { + w = d.length - 1; + n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE; + + // Subtract the number of trailing zeros of the last word. + w = d[w]; + if (w) for (; w % 10 == 0; w /= 10) n--; + if (n < 0) n = 0; + } + + return n; + }; + + + /* + * n / 0 = I + * n / N = N + * n / I = 0 + * 0 / n = 0 + * 0 / 0 = N + * 0 / N = N + * 0 / I = 0 + * N / n = N + * N / 0 = N + * N / N = N + * N / I = N + * I / n = I + * I / 0 = I + * I / N = N + * I / I = N + * + * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + */ + P.dividedBy = P.div = function (y) { + return divide(this, new this.constructor(y)); + }; + + + /* + * Return a new Decimal whose value is the integer part of dividing the value of this Decimal + * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`. + * + */ + P.dividedToIntegerBy = P.divToInt = function (y) { + var x = this, + Ctor = x.constructor; + return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding); + }; + + + /* + * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false. + * + */ + P.equals = P.eq = function (y) { + return this.cmp(y) === 0; + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the + * direction of negative Infinity. + * + */ + P.floor = function () { + return finalise(new this.constructor(this), this.e + 1, 3); + }; + + + /* + * Return true if the value of this Decimal is greater than the value of `y`, otherwise return + * false. + * + */ + P.greaterThan = P.gt = function (y) { + return this.cmp(y) > 0; + }; + + + /* + * Return true if the value of this Decimal is greater than or equal to the value of `y`, + * otherwise return false. + * + */ + P.greaterThanOrEqualTo = P.gte = function (y) { + var k = this.cmp(y); + return k == 1 || k === 0; + }; + + + /* + * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [1, Infinity] + * + * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ... + * + * cosh(0) = 1 + * cosh(-0) = 1 + * cosh(Infinity) = Infinity + * cosh(-Infinity) = Infinity + * cosh(NaN) = NaN + * + * x time taken (ms) result + * 1000 9 9.8503555700852349694e+433 + * 10000 25 4.4034091128314607936e+4342 + * 100000 171 1.4033316802130615897e+43429 + * 1000000 3817 1.5166076984010437725e+434294 + * 10000000 abandoned after 2 minute wait + * + * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x)) + * + */ + P.hyperbolicCosine = P.cosh = function () { + var k, n, pr, rm, len, + x = this, + Ctor = x.constructor, + one = new Ctor(1); + + if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN); + if (x.isZero()) return one; + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + + // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1 + // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4)) + + // Estimate the optimum number of times to use the argument reduction. + // TODO? Estimation reused from cosine() and may not be optimal here. + if (len < 32) { + k = Math.ceil(len / 3); + n = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + n = '2.3283064365386962890625e-10'; + } + + x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true); + + // Reverse argument reduction + var cosh2_x, + i = k, + d8 = new Ctor(8); + for (; i--;) { + cosh2_x = x.times(x); + x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8)))); + } + + return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true); + }; + + + /* + * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-Infinity, Infinity] + * + * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ... + * + * sinh(0) = 0 + * sinh(-0) = -0 + * sinh(Infinity) = Infinity + * sinh(-Infinity) = -Infinity + * sinh(NaN) = NaN + * + * x time taken (ms) + * 10 2 ms + * 100 5 ms + * 1000 14 ms + * 10000 82 ms + * 100000 886 ms 1.4033316802130615897e+43429 + * 200000 2613 ms + * 300000 5407 ms + * 400000 8824 ms + * 500000 13026 ms 8.7080643612718084129e+217146 + * 1000000 48543 ms + * + * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x)) + * + */ + P.hyperbolicSine = P.sinh = function () { + var k, pr, rm, len, + x = this, + Ctor = x.constructor; + + if (!x.isFinite() || x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + + if (len < 3) { + x = taylorSeries(Ctor, 2, x, x, true); + } else { + + // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x)) + // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3)) + // 3 multiplications and 1 addition + + // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x))) + // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5))) + // 4 multiplications and 2 additions + + // Estimate the optimum number of times to use the argument reduction. + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x, true); + + // Reverse argument reduction + var sinh2_x, + d5 = new Ctor(5), + d16 = new Ctor(16), + d20 = new Ctor(20); + for (; k--;) { + sinh2_x = x.times(x); + x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20)))); + } + } + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(x, pr, rm, true); + }; + + + /* + * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-1, 1] + * + * tanh(x) = sinh(x) / cosh(x) + * + * tanh(0) = 0 + * tanh(-0) = -0 + * tanh(Infinity) = 1 + * tanh(-Infinity) = -1 + * tanh(NaN) = NaN + * + */ + P.hyperbolicTangent = P.tanh = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(x.s); + if (x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 7; + Ctor.rounding = 1; + + return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm); + }; + + + /* + * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of + * this Decimal. + * + * Domain: [-1, 1] + * Range: [0, pi] + * + * acos(x) = pi/2 - asin(x) + * + * acos(0) = pi/2 + * acos(-0) = pi/2 + * acos(1) = 0 + * acos(-1) = pi + * acos(1/2) = pi/3 + * acos(-1/2) = 2*pi/3 + * acos(|x| > 1) = NaN + * acos(NaN) = NaN + * + */ + P.inverseCosine = P.acos = function () { + var halfPi, + x = this, + Ctor = x.constructor, + k = x.abs().cmp(1), + pr = Ctor.precision, + rm = Ctor.rounding; + + if (k !== -1) { + return k === 0 + // |x| is 1 + ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) + // |x| > 1 or x is NaN + : new Ctor(NaN); + } + + if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5); + + // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3 + + Ctor.precision = pr + 6; + Ctor.rounding = 1; + + x = x.asin(); + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return halfPi.minus(x); + }; + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the + * value of this Decimal. + * + * Domain: [1, Infinity] + * Range: [0, Infinity] + * + * acosh(x) = ln(x + sqrt(x^2 - 1)) + * + * acosh(x < 1) = NaN + * acosh(NaN) = NaN + * acosh(Infinity) = Infinity + * acosh(-Infinity) = NaN + * acosh(0) = NaN + * acosh(-0) = NaN + * acosh(1) = 0 + * acosh(-1) = NaN + * + */ + P.inverseHyperbolicCosine = P.acosh = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN); + if (!x.isFinite()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4; + Ctor.rounding = 1; + external = false; + + x = x.times(x).minus(1).sqrt().plus(x); + + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.ln(); + }; + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value + * of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-Infinity, Infinity] + * + * asinh(x) = ln(x + sqrt(x^2 + 1)) + * + * asinh(NaN) = NaN + * asinh(Infinity) = Infinity + * asinh(-Infinity) = -Infinity + * asinh(0) = 0 + * asinh(-0) = -0 + * + */ + P.inverseHyperbolicSine = P.asinh = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite() || x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6; + Ctor.rounding = 1; + external = false; + + x = x.times(x).plus(1).sqrt().plus(x); + + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.ln(); + }; + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the + * value of this Decimal. + * + * Domain: [-1, 1] + * Range: [-Infinity, Infinity] + * + * atanh(x) = 0.5 * ln((1 + x) / (1 - x)) + * + * atanh(|x| > 1) = NaN + * atanh(NaN) = NaN + * atanh(Infinity) = NaN + * atanh(-Infinity) = NaN + * atanh(0) = 0 + * atanh(-0) = -0 + * atanh(1) = Infinity + * atanh(-1) = -Infinity + * + */ + P.inverseHyperbolicTangent = P.atanh = function () { + var pr, rm, wpr, xsd, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(NaN); + if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN); + + pr = Ctor.precision; + rm = Ctor.rounding; + xsd = x.sd(); + + if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true); + + Ctor.precision = wpr = xsd - x.e; + + x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1); + + Ctor.precision = pr + 4; + Ctor.rounding = 1; + + x = x.ln(); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.times(0.5); + }; + + + /* + * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-pi/2, pi/2] + * + * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2))) + * + * asin(0) = 0 + * asin(-0) = -0 + * asin(1/2) = pi/6 + * asin(-1/2) = -pi/6 + * asin(1) = pi/2 + * asin(-1) = -pi/2 + * asin(|x| > 1) = NaN + * asin(NaN) = NaN + * + * TODO? Compare performance of Taylor series. + * + */ + P.inverseSine = P.asin = function () { + var halfPi, k, + pr, rm, + x = this, + Ctor = x.constructor; + + if (x.isZero()) return new Ctor(x); + + k = x.abs().cmp(1); + pr = Ctor.precision; + rm = Ctor.rounding; + + if (k !== -1) { + + // |x| is 1 + if (k === 0) { + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + halfPi.s = x.s; + return halfPi; + } + + // |x| > 1 or x is NaN + return new Ctor(NaN); + } + + // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6 + + Ctor.precision = pr + 6; + Ctor.rounding = 1; + + x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan(); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.times(2); + }; + + + /* + * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value + * of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-pi/2, pi/2] + * + * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... + * + * atan(0) = 0 + * atan(-0) = -0 + * atan(1) = pi/4 + * atan(-1) = -pi/4 + * atan(Infinity) = pi/2 + * atan(-Infinity) = -pi/2 + * atan(NaN) = NaN + * + */ + P.inverseTangent = P.atan = function () { + var i, j, k, n, px, t, r, wpr, x2, + x = this, + Ctor = x.constructor, + pr = Ctor.precision, + rm = Ctor.rounding; + + if (!x.isFinite()) { + if (!x.s) return new Ctor(NaN); + if (pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.5); + r.s = x.s; + return r; + } + } else if (x.isZero()) { + return new Ctor(x); + } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.25); + r.s = x.s; + return r; + } + + Ctor.precision = wpr = pr + 10; + Ctor.rounding = 1; + + // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x); + + // Argument reduction + // Ensure |x| < 0.42 + // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2))) + + k = Math.min(28, wpr / LOG_BASE + 2 | 0); + + for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1)); + + external = false; + + j = Math.ceil(wpr / LOG_BASE); + n = 1; + x2 = x.times(x); + r = new Ctor(x); + px = x; + + // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... + for (; i !== -1;) { + px = px.times(x2); + t = r.minus(px.div(n += 2)); + + px = px.times(x2); + r = t.plus(px.div(n += 2)); + + if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;); + } + + if (k) r = r.times(2 << (k - 1)); + + external = true; + + return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true); + }; + + + /* + * Return true if the value of this Decimal is a finite number, otherwise return false. + * + */ + P.isFinite = function () { + return !!this.d; + }; + + + /* + * Return true if the value of this Decimal is an integer, otherwise return false. + * + */ + P.isInteger = P.isInt = function () { + return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2; + }; + + + /* + * Return true if the value of this Decimal is NaN, otherwise return false. + * + */ + P.isNaN = function () { + return !this.s; + }; + + + /* + * Return true if the value of this Decimal is negative, otherwise return false. + * + */ + P.isNegative = P.isNeg = function () { + return this.s < 0; + }; + + + /* + * Return true if the value of this Decimal is positive, otherwise return false. + * + */ + P.isPositive = P.isPos = function () { + return this.s > 0; + }; + + + /* + * Return true if the value of this Decimal is 0 or -0, otherwise return false. + * + */ + P.isZero = function () { + return !!this.d && this.d[0] === 0; + }; + + + /* + * Return true if the value of this Decimal is less than `y`, otherwise return false. + * + */ + P.lessThan = P.lt = function (y) { + return this.cmp(y) < 0; + }; + + + /* + * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false. + * + */ + P.lessThanOrEqualTo = P.lte = function (y) { + return this.cmp(y) < 1; + }; + + + /* + * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * If no base is specified, return log[10](arg). + * + * log[base](arg) = ln(arg) / ln(base) + * + * The result will always be correctly rounded if the base of the log is 10, and 'almost always' + * otherwise: + * + * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen + * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error + * between the result and the correctly rounded result will be one ulp (unit in the last place). + * + * log[-b](a) = NaN + * log[0](a) = NaN + * log[1](a) = NaN + * log[NaN](a) = NaN + * log[Infinity](a) = NaN + * log[b](0) = -Infinity + * log[b](-0) = -Infinity + * log[b](-a) = NaN + * log[b](1) = 0 + * log[b](Infinity) = Infinity + * log[b](NaN) = NaN + * + * [base] {number|string|Decimal} The base of the logarithm. + * + */ + P.logarithm = P.log = function (base) { + var isBase10, d, denominator, k, inf, num, sd, r, + arg = this, + Ctor = arg.constructor, + pr = Ctor.precision, + rm = Ctor.rounding, + guard = 5; + + // Default base is 10. + if (base == null) { + base = new Ctor(10); + isBase10 = true; + } else { + base = new Ctor(base); + d = base.d; + + // Return NaN if base is negative, or non-finite, or is 0 or 1. + if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN); + + isBase10 = base.eq(10); + } + + d = arg.d; + + // Is arg negative, non-finite, 0 or 1? + if (arg.s < 0 || !d || !d[0] || arg.eq(1)) { + return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0); + } + + // The result will have a non-terminating decimal expansion if base is 10 and arg is not an + // integer power of 10. + if (isBase10) { + if (d.length > 1) { + inf = true; + } else { + for (k = d[0]; k % 10 === 0;) k /= 10; + inf = k !== 1; + } + } + + external = false; + sd = pr + guard; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + + // The result will have 5 rounding digits. + r = divide(num, denominator, sd, 1); + + // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000, + // calculate 10 further digits. + // + // If the result is known to have an infinite decimal expansion, repeat this until it is clear + // that the result is above or below the boundary. Otherwise, if after calculating the 10 + // further digits, the last 14 are nines, round up and assume the result is exact. + // Also assume the result is exact if the last 14 are zero. + // + // Example of a result that will be incorrectly rounded: + // log[1048576](4503599627370502) = 2.60000000000000009610279511444746... + // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it + // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so + // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal + // place is still 2.6. + if (checkRoundingDigits(r.d, k = pr, rm)) { + + do { + sd += 10; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + r = divide(num, denominator, sd, 1); + + if (!inf) { + + // Check for 14 nines from the 2nd rounding digit, as the first may be 4. + if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + + break; + } + } while (checkRoundingDigits(r.d, k += 10, rm)); + } + + external = true; + + return finalise(r, pr, rm); + }; + + + /* + * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal. + * + * arguments {number|string|Decimal} + * + P.max = function () { + Array.prototype.push.call(arguments, this); + return maxOrMin(this.constructor, arguments, 'lt'); + }; + */ + + + /* + * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal. + * + * arguments {number|string|Decimal} + * + P.min = function () { + Array.prototype.push.call(arguments, this); + return maxOrMin(this.constructor, arguments, 'gt'); + }; + */ + + + /* + * n - 0 = n + * n - N = N + * n - I = -I + * 0 - n = -n + * 0 - 0 = 0 + * 0 - N = N + * 0 - I = -I + * N - n = N + * N - 0 = N + * N - N = N + * N - I = N + * I - n = I + * I - 0 = I + * I - N = N + * I - I = N + * + * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + */ + P.minus = P.sub = function (y) { + var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd, + x = this, + Ctor = x.constructor; + + y = new Ctor(y); + + // If either is not finite... + if (!x.d || !y.d) { + + // Return NaN if either is NaN. + if (!x.s || !y.s) y = new Ctor(NaN); + + // Return y negated if x is finite and y is ±Infinity. + else if (x.d) y.s = -y.s; + + // Return x if y is finite and x is ±Infinity. + // Return x if both are ±Infinity with different signs. + // Return NaN if both are ±Infinity with the same sign. + else y = new Ctor(y.d || x.s !== y.s ? x : NaN); + + return y; + } + + // If signs differ... + if (x.s != y.s) { + y.s = -y.s; + return x.plus(y); + } + + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + + // If either is zero... + if (!xd[0] || !yd[0]) { + + // Return y negated if x is zero and y is non-zero. + if (yd[0]) y.s = -y.s; + + // Return x if y is zero and x is non-zero. + else if (xd[0]) y = new Ctor(x); + + // Return zero if both are zero. + // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity. + else return new Ctor(rm === 3 ? -0 : 0); + + return external ? finalise(y, pr, rm) : y; + } + + // x and y are finite, non-zero numbers with the same sign. + + // Calculate base 1e7 exponents. + e = mathfloor(y.e / LOG_BASE); + xe = mathfloor(x.e / LOG_BASE); + + xd = xd.slice(); + k = xe - e; + + // If base 1e7 exponents differ... + if (k) { + xLTy = k < 0; + + if (xLTy) { + d = xd; + k = -k; + len = yd.length; + } else { + d = yd; + e = xe; + len = xd.length; + } + + // Numbers with massively different exponents would result in a very high number of + // zeros needing to be prepended, but this can be avoided while still ensuring correct + // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`. + i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2; + + if (k > i) { + k = i; + d.length = 1; + } + + // Prepend zeros to equalise exponents. + d.reverse(); + for (i = k; i--;) d.push(0); + d.reverse(); + + // Base 1e7 exponents equal. + } else { + + // Check digits to determine which is the bigger number. + + i = xd.length; + len = yd.length; + xLTy = i < len; + if (xLTy) len = i; + + for (i = 0; i < len; i++) { + if (xd[i] != yd[i]) { + xLTy = xd[i] < yd[i]; + break; + } + } + + k = 0; + } + + if (xLTy) { + d = xd; + xd = yd; + yd = d; + y.s = -y.s; + } + + len = xd.length; + + // Append zeros to `xd` if shorter. + // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length. + for (i = yd.length - len; i > 0; --i) xd[len++] = 0; + + // Subtract yd from xd. + for (i = yd.length; i > k;) { + + if (xd[--i] < yd[i]) { + for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1; + --xd[j]; + xd[i] += BASE; + } + + xd[i] -= yd[i]; + } + + // Remove trailing zeros. + for (; xd[--len] === 0;) xd.pop(); + + // Remove leading zeros and adjust exponent accordingly. + for (; xd[0] === 0; xd.shift()) --e; + + // Zero? + if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0); + + y.d = xd; + y.e = getBase10Exponent(xd, e); + + return external ? finalise(y, pr, rm) : y; + }; + + + /* + * n % 0 = N + * n % N = N + * n % I = n + * 0 % n = 0 + * -0 % n = -0 + * 0 % 0 = N + * 0 % N = N + * 0 % I = 0 + * N % n = N + * N % 0 = N + * N % N = N + * N % I = N + * I % n = N + * I % 0 = N + * I % N = N + * I % I = N + * + * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * The result depends on the modulo mode. + * + */ + P.modulo = P.mod = function (y) { + var q, + x = this, + Ctor = x.constructor; + + y = new Ctor(y); + + // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0. + if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN); + + // Return x if y is ±Infinity or x is ±0. + if (!y.d || x.d && !x.d[0]) { + return finalise(new Ctor(x), Ctor.precision, Ctor.rounding); + } + + // Prevent rounding of intermediate calculations. + external = false; + + if (Ctor.modulo == 9) { + + // Euclidian division: q = sign(y) * floor(x / abs(y)) + // result = x - q * y where 0 <= result < abs(y) + q = divide(x, y.abs(), 0, 3, 1); + q.s *= y.s; + } else { + q = divide(x, y, 0, Ctor.modulo, 1); + } + + q = q.times(y); + + external = true; + + return x.minus(q); + }; + + + /* + * Return a new Decimal whose value is the natural exponential of the value of this Decimal, + * i.e. the base e raised to the power the value of this Decimal, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + */ + P.naturalExponential = P.exp = function () { + return naturalExponential(this); + }; + + + /* + * Return a new Decimal whose value is the natural logarithm of the value of this Decimal, + * rounded to `precision` significant digits using rounding mode `rounding`. + * + */ + P.naturalLogarithm = P.ln = function () { + return naturalLogarithm(this); + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by + * -1. + * + */ + P.negated = P.neg = function () { + var x = new this.constructor(this); + x.s = -x.s; + return finalise(x); + }; + + + /* + * n + 0 = n + * n + N = N + * n + I = I + * 0 + n = n + * 0 + 0 = 0 + * 0 + N = N + * 0 + I = I + * N + n = N + * N + 0 = N + * N + N = N + * N + I = N + * I + n = I + * I + 0 = I + * I + N = N + * I + I = I + * + * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + */ + P.plus = P.add = function (y) { + var carry, d, e, i, k, len, pr, rm, xd, yd, + x = this, + Ctor = x.constructor; + + y = new Ctor(y); + + // If either is not finite... + if (!x.d || !y.d) { + + // Return NaN if either is NaN. + if (!x.s || !y.s) y = new Ctor(NaN); + + // Return x if y is finite and x is ±Infinity. + // Return x if both are ±Infinity with the same sign. + // Return NaN if both are ±Infinity with different signs. + // Return y if x is finite and y is ±Infinity. + else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN); + + return y; + } + + // If signs differ... + if (x.s != y.s) { + y.s = -y.s; + return x.minus(y); + } + + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + + // If either is zero... + if (!xd[0] || !yd[0]) { + + // Return x if y is zero. + // Return y if y is non-zero. + if (!yd[0]) y = new Ctor(x); + + return external ? finalise(y, pr, rm) : y; + } + + // x and y are finite, non-zero numbers with the same sign. + + // Calculate base 1e7 exponents. + k = mathfloor(x.e / LOG_BASE); + e = mathfloor(y.e / LOG_BASE); + + xd = xd.slice(); + i = k - e; + + // If base 1e7 exponents differ... + if (i) { + + if (i < 0) { + d = xd; + i = -i; + len = yd.length; + } else { + d = yd; + e = k; + len = xd.length; + } + + // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1. + k = Math.ceil(pr / LOG_BASE); + len = k > len ? k + 1 : len + 1; + + if (i > len) { + i = len; + d.length = 1; + } + + // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts. + d.reverse(); + for (; i--;) d.push(0); + d.reverse(); + } + + len = xd.length; + i = yd.length; + + // If yd is longer than xd, swap xd and yd so xd points to the longer array. + if (len - i < 0) { + i = len; + d = yd; + yd = xd; + xd = d; + } + + // Only start adding at yd.length - 1 as the further digits of xd can be left as they are. + for (carry = 0; i;) { + carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0; + xd[i] %= BASE; + } + + if (carry) { + xd.unshift(carry); + ++e; + } + + // Remove trailing zeros. + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + for (len = xd.length; xd[--len] == 0;) xd.pop(); + + y.d = xd; + y.e = getBase10Exponent(xd, e); + + return external ? finalise(y, pr, rm) : y; + }; + + + /* + * Return the number of significant digits of the value of this Decimal. + * + * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0. + * + */ + P.precision = P.sd = function (z) { + var k, + x = this; + + if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z); + + if (x.d) { + k = getPrecision(x.d); + if (z && x.e + 1 > k) k = x.e + 1; + } else { + k = NaN; + } + + return k; + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using + * rounding mode `rounding`. + * + */ + P.round = function () { + var x = this, + Ctor = x.constructor; + + return finalise(new Ctor(x), x.e + 1, Ctor.rounding); + }; + + + /* + * Return a new Decimal whose value is the sine of the value in radians of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-1, 1] + * + * sin(x) = x - x^3/3! + x^5/5! - ... + * + * sin(0) = 0 + * sin(-0) = -0 + * sin(Infinity) = NaN + * sin(-Infinity) = NaN + * sin(NaN) = NaN + * + */ + P.sine = P.sin = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(NaN); + if (x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + + x = sine(Ctor, toLessThanHalfPi(Ctor, x)); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true); + }; + + + /* + * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * sqrt(-n) = N + * sqrt(N) = N + * sqrt(-I) = N + * sqrt(I) = I + * sqrt(0) = 0 + * sqrt(-0) = -0 + * + */ + P.squareRoot = P.sqrt = function () { + var m, n, sd, r, rep, t, + x = this, + d = x.d, + e = x.e, + s = x.s, + Ctor = x.constructor; + + // Negative/NaN/Infinity/zero? + if (s !== 1 || !d || !d[0]) { + return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0); + } + + external = false; + + // Initial estimate. + s = Math.sqrt(+x); + + // Math.sqrt underflow/overflow? + // Pass x to Math.sqrt as integer, then adjust the exponent of the result. + if (s == 0 || s == 1 / 0) { + n = digitsToString(d); + + if ((n.length + e) % 2 == 0) n += '0'; + s = Math.sqrt(n); + e = mathfloor((e + 1) / 2) - (e < 0 || e % 2); + + if (s == 1 / 0) { + n = '1e' + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf('e') + 1) + e; + } + + r = new Ctor(n); + } else { + r = new Ctor(s.toString()); + } + + sd = (e = Ctor.precision) + 3; + + // Newton-Raphson iteration. + for (;;) { + t = r; + r = t.plus(divide(x, t, sd + 2, 1)).times(0.5); + + // TODO? Replace with for-loop and checkRoundingDigits. + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or + // 4999, i.e. approaching a rounding boundary, continue the iteration. + if (n == '9999' || !rep && n == '4999') { + + // On the first iteration only, check to see if rounding up gives the exact result as the + // nines may infinitely repeat. + if (!rep) { + finalise(t, e + 1, 0); + + if (t.times(t).eq(x)) { + r = t; + break; + } + } + + sd += 4; + rep = 1; + } else { + + // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result. + // If not, then there are further digits and m will be truthy. + if (!+n || !+n.slice(1) && n.charAt(0) == '5') { + + // Truncate to the first rounding digit. + finalise(r, e + 1, 1); + m = !r.times(r).eq(x); + } + + break; + } + } + } + + external = true; + + return finalise(r, e, Ctor.rounding, m); + }; + + + /* + * Return a new Decimal whose value is the tangent of the value in radians of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-Infinity, Infinity] + * + * tan(0) = 0 + * tan(-0) = -0 + * tan(Infinity) = NaN + * tan(-Infinity) = NaN + * tan(NaN) = NaN + * + */ + P.tangent = P.tan = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(NaN); + if (x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 10; + Ctor.rounding = 1; + + x = x.sin(); + x.s = 1; + x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true); + }; + + + /* + * n * 0 = 0 + * n * N = N + * n * I = I + * 0 * n = 0 + * 0 * 0 = 0 + * 0 * N = N + * 0 * I = N + * N * n = N + * N * 0 = N + * N * N = N + * N * I = N + * I * n = I + * I * 0 = N + * I * N = N + * I * I = I + * + * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + */ + P.times = P.mul = function (y) { + var carry, e, i, k, r, rL, t, xdL, ydL, + x = this, + Ctor = x.constructor, + xd = x.d, + yd = (y = new Ctor(y)).d; + + y.s *= x.s; + + // If either is NaN, ±Infinity or ±0... + if (!xd || !xd[0] || !yd || !yd[0]) { + + return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd + + // Return NaN if either is NaN. + // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity. + ? NaN + + // Return ±Infinity if either is ±Infinity. + // Return ±0 if either is ±0. + : !xd || !yd ? y.s / 0 : y.s * 0); + } + + e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE); + xdL = xd.length; + ydL = yd.length; + + // Ensure xd points to the longer array. + if (xdL < ydL) { + r = xd; + xd = yd; + yd = r; + rL = xdL; + xdL = ydL; + ydL = rL; + } + + // Initialise the result array with zeros. + r = []; + rL = xdL + ydL; + for (i = rL; i--;) r.push(0); + + // Multiply! + for (i = ydL; --i >= 0;) { + carry = 0; + for (k = xdL + i; k > i;) { + t = r[k] + yd[i] * xd[k - i - 1] + carry; + r[k--] = t % BASE | 0; + carry = t / BASE | 0; + } + + r[k] = (r[k] + carry) % BASE | 0; + } + + // Remove trailing zeros. + for (; !r[--rL];) r.pop(); + + if (carry) ++e; + else r.shift(); + + y.d = r; + y.e = getBase10Exponent(r, e); + + return external ? finalise(y, Ctor.precision, Ctor.rounding) : y; + }; + + + /* + * Return a string representing the value of this Decimal in base 2, round to `sd` significant + * digits using rounding mode `rm`. + * + * If the optional `sd` argument is present then return binary exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toBinary = function (sd, rm) { + return toStringBinary(this, 2, sd, rm); + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp` + * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted. + * + * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal. + * + * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toDecimalPlaces = P.toDP = function (dp, rm) { + var x = this, + Ctor = x.constructor; + + x = new Ctor(x); + if (dp === void 0) return x; + + checkInt32(dp, 0, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + return finalise(x, dp + x.e + 1, rm); + }; + + + /* + * Return a string representing the value of this Decimal in exponential notation rounded to + * `dp` fixed decimal places using rounding mode `rounding`. + * + * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toExponential = function (dp, rm) { + var str, + x = this, + Ctor = x.constructor; + + if (dp === void 0) { + str = finiteToString(x, true); + } else { + checkInt32(dp, 0, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + x = finalise(new Ctor(x), dp + 1, rm); + str = finiteToString(x, true, dp + 1); + } + + return x.isNeg() && !x.isZero() ? '-' + str : str; + }; + + + /* + * Return a string representing the value of this Decimal in normal (fixed-point) notation to + * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is + * omitted. + * + * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'. + * + * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'. + * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'. + * (-0).toFixed(3) is '0.000'. + * (-0.5).toFixed(0) is '-0'. + * + */ + P.toFixed = function (dp, rm) { + var str, y, + x = this, + Ctor = x.constructor; + + if (dp === void 0) { + str = finiteToString(x); + } else { + checkInt32(dp, 0, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + y = finalise(new Ctor(x), dp + x.e + 1, rm); + str = finiteToString(y, false, dp + y.e + 1); + } + + // To determine whether to add the minus sign look at the value before it was rounded, + // i.e. look at `x` rather than `y`. + return x.isNeg() && !x.isZero() ? '-' + str : str; + }; + + + /* + * Return an array representing the value of this Decimal as a simple fraction with an integer + * numerator and an integer denominator. + * + * The denominator will be a positive non-zero value less than or equal to the specified maximum + * denominator. If a maximum denominator is not specified, the denominator will be the lowest + * value necessary to represent the number exactly. + * + * [maxD] {number|string|Decimal} Maximum denominator. Integer >= 1 and < Infinity. + * + */ + P.toFraction = function (maxD) { + var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r, + x = this, + xd = x.d, + Ctor = x.constructor; + + if (!xd) return new Ctor(x); + + n1 = d0 = new Ctor(1); + d1 = n0 = new Ctor(0); + + d = new Ctor(d1); + e = d.e = getPrecision(xd) - x.e - 1; + k = e % LOG_BASE; + d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k); + + if (maxD == null) { + + // d is 10**e, the minimum max-denominator needed. + maxD = e > 0 ? d : n1; + } else { + n = new Ctor(maxD); + if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n); + maxD = n.gt(d) ? (e > 0 ? d : n1) : n; + } + + external = false; + n = new Ctor(digitsToString(xd)); + pr = Ctor.precision; + Ctor.precision = e = xd.length * LOG_BASE * 2; + + for (;;) { + q = divide(n, d, 0, 1, 1); + d2 = d0.plus(q.times(d1)); + if (d2.cmp(maxD) == 1) break; + d0 = d1; + d1 = d2; + d2 = n1; + n1 = n0.plus(q.times(d2)); + n0 = d2; + d2 = d; + d = n.minus(q.times(d2)); + n = d2; + } + + d2 = divide(maxD.minus(d0), d1, 0, 1, 1); + n0 = n0.plus(d2.times(n1)); + d0 = d0.plus(d2.times(d1)); + n0.s = n1.s = x.s; + + // Determine which fraction is closer to x, n0/d0 or n1/d1? + r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1 + ? [n1, d1] : [n0, d0]; + + Ctor.precision = pr; + external = true; + + return r; + }; + + + /* + * Return a string representing the value of this Decimal in base 16, round to `sd` significant + * digits using rounding mode `rm`. + * + * If the optional `sd` argument is present then return binary exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toHexadecimal = P.toHex = function (sd, rm) { + return toStringBinary(this, 16, sd, rm); + }; + + + /* + * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding + * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal. + * + * The return value will always have the same sign as this Decimal, unless either this Decimal + * or `y` is NaN, in which case the return value will be also be NaN. + * + * The return value is not affected by the value of `precision`. + * + * y {number|string|Decimal} The magnitude to round to a multiple of. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toNearest() rounding mode not an integer: {rm}' + * 'toNearest() rounding mode out of range: {rm}' + * + */ + P.toNearest = function (y, rm) { + var x = this, + Ctor = x.constructor; + + x = new Ctor(x); + + if (y == null) { + + // If x is not finite, return x. + if (!x.d) return x; + + y = new Ctor(1); + rm = Ctor.rounding; + } else { + y = new Ctor(y); + if (rm === void 0) { + rm = Ctor.rounding; + } else { + checkInt32(rm, 0, 8); + } + + // If x is not finite, return x if y is not NaN, else NaN. + if (!x.d) return y.s ? x : y; + + // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN. + if (!y.d) { + if (y.s) y.s = x.s; + return y; + } + } + + // If y is not zero, calculate the nearest multiple of y to x. + if (y.d[0]) { + external = false; + x = divide(x, y, 0, rm, 1).times(y); + external = true; + finalise(x); + + // If y is zero, return zero with the sign of x. + } else { + y.s = x.s; + x = y; + } + + return x; + }; + + + /* + * Return the value of this Decimal converted to a number primitive. + * Zero keeps its sign. + * + */ + P.toNumber = function () { + return +this; + }; + + + /* + * Return a string representing the value of this Decimal in base 8, round to `sd` significant + * digits using rounding mode `rm`. + * + * If the optional `sd` argument is present then return binary exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toOctal = function (sd, rm) { + return toStringBinary(this, 8, sd, rm); + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded + * to `precision` significant digits using rounding mode `rounding`. + * + * ECMAScript compliant. + * + * pow(x, NaN) = NaN + * pow(x, ±0) = 1 + + * pow(NaN, non-zero) = NaN + * pow(abs(x) > 1, +Infinity) = +Infinity + * pow(abs(x) > 1, -Infinity) = +0 + * pow(abs(x) == 1, ±Infinity) = NaN + * pow(abs(x) < 1, +Infinity) = +0 + * pow(abs(x) < 1, -Infinity) = +Infinity + * pow(+Infinity, y > 0) = +Infinity + * pow(+Infinity, y < 0) = +0 + * pow(-Infinity, odd integer > 0) = -Infinity + * pow(-Infinity, even integer > 0) = +Infinity + * pow(-Infinity, odd integer < 0) = -0 + * pow(-Infinity, even integer < 0) = +0 + * pow(+0, y > 0) = +0 + * pow(+0, y < 0) = +Infinity + * pow(-0, odd integer > 0) = -0 + * pow(-0, even integer > 0) = +0 + * pow(-0, odd integer < 0) = -Infinity + * pow(-0, even integer < 0) = +Infinity + * pow(finite x < 0, finite non-integer) = NaN + * + * For non-integer or very large exponents pow(x, y) is calculated using + * + * x^y = exp(y*ln(x)) + * + * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the + * probability of an incorrectly rounded result + * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14 + * i.e. 1 in 250,000,000,000,000 + * + * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place). + * + * y {number|string|Decimal} The power to which to raise this Decimal. + * + */ + P.toPower = P.pow = function (y) { + var e, k, pr, r, rm, s, + x = this, + Ctor = x.constructor, + yn = +(y = new Ctor(y)); + + // Either ±Infinity, NaN or ±0? + if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn)); + + x = new Ctor(x); + + if (x.eq(1)) return x; + + pr = Ctor.precision; + rm = Ctor.rounding; + + if (y.eq(1)) return finalise(x, pr, rm); + + // y exponent + e = mathfloor(y.e / LOG_BASE); + + // If y is a small integer use the 'exponentiation by squaring' algorithm. + if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) { + r = intPow(Ctor, x, k, pr); + return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm); + } + + s = x.s; + + // if x is negative + if (s < 0) { + + // if y is not an integer + if (e < y.d.length - 1) return new Ctor(NaN); + + // Result is positive if x is negative and the last digit of integer y is even. + if ((y.d[e] & 1) == 0) s = 1; + + // if x.eq(-1) + if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) { + x.s = s; + return x; + } + } + + // Estimate result exponent. + // x^y = 10^e, where e = y * log10(x) + // log10(x) = log10(x_significand) + x_exponent + // log10(x_significand) = ln(x_significand) / ln(10) + k = mathpow(+x, yn); + e = k == 0 || !isFinite(k) + ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1)) + : new Ctor(k + '').e; + + // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1. + + // Overflow/underflow? + if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0); + + external = false; + Ctor.rounding = x.s = 1; + + // Estimate the extra guard digits needed to ensure five correct rounding digits from + // naturalLogarithm(x). Example of failure without these extra digits (precision: 10): + // new Decimal(2.32456).pow('2087987436534566.46411') + // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815 + k = Math.min(12, (e + '').length); + + // r = x^y = exp(y*ln(x)) + r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr); + + // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40) + if (r.d) { + + // Truncate to the required precision plus five rounding digits. + r = finalise(r, pr + 5, 1); + + // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate + // the result. + if (checkRoundingDigits(r.d, pr, rm)) { + e = pr + 10; + + // Truncate to the increased precision plus five rounding digits. + r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1); + + // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9). + if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + } + } + + r.s = s; + external = true; + Ctor.rounding = rm; + + return finalise(r, pr, rm); + }; + + + /* + * Return a string representing the value of this Decimal rounded to `sd` significant digits + * using rounding mode `rounding`. + * + * Return exponential notation if `sd` is less than the number of digits necessary to represent + * the integer part of the value in normal notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ + P.toPrecision = function (sd, rm) { + var str, + x = this, + Ctor = x.constructor; + + if (sd === void 0) { + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + } else { + checkInt32(sd, 1, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + x = finalise(new Ctor(x), sd, rm); + str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd); + } + + return x.isNeg() && !x.isZero() ? '-' + str : str; + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd` + * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if + * omitted. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toSD() digits out of range: {sd}' + * 'toSD() digits not an integer: {sd}' + * 'toSD() rounding mode not an integer: {rm}' + * 'toSD() rounding mode out of range: {rm}' + * + */ + P.toSignificantDigits = P.toSD = function (sd, rm) { + var x = this, + Ctor = x.constructor; + + if (sd === void 0) { + sd = Ctor.precision; + rm = Ctor.rounding; + } else { + checkInt32(sd, 1, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + } + + return finalise(new Ctor(x), sd, rm); + }; + + + /* + * Return a string representing the value of this Decimal. + * + * Return exponential notation if this Decimal has a positive exponent equal to or greater than + * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`. + * + */ + P.toString = function () { + var x = this, + Ctor = x.constructor, + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + + return x.isNeg() && !x.isZero() ? '-' + str : str; + }; + + + /* + * Return a new Decimal whose value is the value of this Decimal truncated to a whole number. + * + */ + P.truncated = P.trunc = function () { + return finalise(new this.constructor(this), this.e + 1, 1); + }; + + + /* + * Return a string representing the value of this Decimal. + * Unlike `toString`, negative zero will include the minus sign. + * + */ + P.valueOf = P.toJSON = function () { + var x = this, + Ctor = x.constructor, + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + + return x.isNeg() ? '-' + str : str; + }; + + + /* + // Add aliases to match BigDecimal method names. + // P.add = P.plus; + P.subtract = P.minus; + P.multiply = P.times; + P.divide = P.div; + P.remainder = P.mod; + P.compareTo = P.cmp; + P.negate = P.neg; + */ + + + // Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers. + + + /* + * digitsToString P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower, + * finiteToString, naturalExponential, naturalLogarithm + * checkInt32 P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest, + * P.toPrecision, P.toSignificantDigits, toStringBinary, random + * checkRoundingDigits P.logarithm, P.toPower, naturalExponential, naturalLogarithm + * convertBase toStringBinary, parseOther + * cos P.cos + * divide P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy, + * P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction, + * P.toNearest, toStringBinary, naturalExponential, naturalLogarithm, + * taylorSeries, atan2, parseOther + * finalise P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh, + * P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus, + * P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot, + * P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed, + * P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits, + * P.truncated, divide, getLn10, getPi, naturalExponential, + * naturalLogarithm, ceil, floor, round, trunc + * finiteToString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf, + * toStringBinary + * getBase10Exponent P.minus, P.plus, P.times, parseOther + * getLn10 P.logarithm, naturalLogarithm + * getPi P.acos, P.asin, P.atan, toLessThanHalfPi, atan2 + * getPrecision P.precision, P.toFraction + * getZeroString digitsToString, finiteToString + * intPow P.toPower, parseOther + * isOdd toLessThanHalfPi + * maxOrMin max, min + * naturalExponential P.naturalExponential, P.toPower + * naturalLogarithm P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm, + * P.toPower, naturalExponential + * nonFiniteToString finiteToString, toStringBinary + * parseDecimal Decimal + * parseOther Decimal + * sin P.sin + * taylorSeries P.cosh, P.sinh, cos, sin + * toLessThanHalfPi P.cos, P.sin + * toStringBinary P.toBinary, P.toHexadecimal, P.toOctal + * truncate intPow + * + * Throws: P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi, + * naturalLogarithm, config, parseOther, random, Decimal + */ + + + function digitsToString(d) { + var i, k, ws, + indexOfLastWord = d.length - 1, + str = '', + w = d[0]; + + if (indexOfLastWord > 0) { + str += w; + for (i = 1; i < indexOfLastWord; i++) { + ws = d[i] + ''; + k = LOG_BASE - ws.length; + if (k) str += getZeroString(k); + str += ws; + } + + w = d[i]; + ws = w + ''; + k = LOG_BASE - ws.length; + if (k) str += getZeroString(k); + } else if (w === 0) { + return '0'; + } + + // Remove trailing zeros of last w. + for (; w % 10 === 0;) w /= 10; + + return str + w; + } + + + function checkInt32(i, min, max) { + if (i !== ~~i || i < min || i > max) { + throw Error(invalidArgument + i); + } + } + + + /* + * Check 5 rounding digits if `repeating` is null, 4 otherwise. + * `repeating == null` if caller is `log` or `pow`, + * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`. + */ + function checkRoundingDigits(d, i, rm, repeating) { + var di, k, r, rd; + + // Get the length of the first word of the array d. + for (k = d[0]; k >= 10; k /= 10) --i; + + // Is the rounding digit in the first word of d? + if (--i < 0) { + i += LOG_BASE; + di = 0; + } else { + di = Math.ceil((i + 1) / LOG_BASE); + i %= LOG_BASE; + } + + // i is the index (0 - 6) of the rounding digit. + // E.g. if within the word 3487563 the first rounding digit is 5, + // then i = 4, k = 1000, rd = 3487563 % 1000 = 563 + k = mathpow(10, LOG_BASE - i); + rd = d[di] % k | 0; + + if (repeating == null) { + if (i < 3) { + if (i == 0) rd = rd / 100 | 0; + else if (i == 1) rd = rd / 10 | 0; + r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0; + } else { + r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) && + (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 || + (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0; + } + } else { + if (i < 4) { + if (i == 0) rd = rd / 1000 | 0; + else if (i == 1) rd = rd / 100 | 0; + else if (i == 2) rd = rd / 10 | 0; + r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999; + } else { + r = ((repeating || rm < 4) && rd + 1 == k || + (!repeating && rm > 3) && rd + 1 == k / 2) && + (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1; + } + } + + return r; + } + + + // Convert string of `baseIn` to an array of numbers of `baseOut`. + // Eg. convertBase('255', 10, 16) returns [15, 15]. + // Eg. convertBase('ff', 16, 10) returns [2, 5, 5]. + function convertBase(str, baseIn, baseOut) { + var j, + arr = [0], + arrL, + i = 0, + strL = str.length; + + for (; i < strL;) { + for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn; + arr[0] += NUMERALS.indexOf(str.charAt(i++)); + for (j = 0; j < arr.length; j++) { + if (arr[j] > baseOut - 1) { + if (arr[j + 1] === void 0) arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + + return arr.reverse(); + } + + + /* + * cos(x) = 1 - x^2/2! + x^4/4! - ... + * |x| < pi/2 + * + */ + function cosine(Ctor, x) { + var k, y, + len = x.d.length; + + // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1 + // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1 + + // Estimate the optimum number of times to use the argument reduction. + if (len < 32) { + k = Math.ceil(len / 3); + y = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + y = '2.3283064365386962890625e-10'; + } + + Ctor.precision += k; + + x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1)); + + // Reverse argument reduction + for (var i = k; i--;) { + var cos2x = x.times(x); + x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1); + } + + Ctor.precision -= k; + + return x; + } + + + /* + * Perform division in the specified base. + */ + var divide = (function () { + + // Assumes non-zero x and k, and hence non-zero result. + function multiplyInteger(x, k, base) { + var temp, + carry = 0, + i = x.length; + + for (x = x.slice(); i--;) { + temp = x[i] * k + carry; + x[i] = temp % base | 0; + carry = temp / base | 0; + } + + if (carry) x.unshift(carry); + + return x; + } + + function compare(a, b, aL, bL) { + var i, r; + + if (aL != bL) { + r = aL > bL ? 1 : -1; + } else { + for (i = r = 0; i < aL; i++) { + if (a[i] != b[i]) { + r = a[i] > b[i] ? 1 : -1; + break; + } + } + } + + return r; + } + + function subtract(a, b, aL, base) { + var i = 0; + + // Subtract b from a. + for (; aL--;) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + + // Remove leading zeros. + for (; !a[0] && a.length > 1;) a.shift(); + } + + return function (x, y, pr, rm, dp, base) { + var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, + yL, yz, + Ctor = x.constructor, + sign = x.s == y.s ? 1 : -1, + xd = x.d, + yd = y.d; + + // Either NaN, Infinity or 0? + if (!xd || !xd[0] || !yd || !yd[0]) { + + return new Ctor(// Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN : + + // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0. + xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0); + } + + if (base) { + logBase = 1; + e = x.e - y.e; + } else { + base = BASE; + logBase = LOG_BASE; + e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase); + } + + yL = yd.length; + xL = xd.length; + q = new Ctor(sign); + qd = q.d = []; + + // Result exponent may be one less than e. + // The digit array of a Decimal from toStringBinary may have trailing zeros. + for (i = 0; yd[i] == (xd[i] || 0); i++); + + if (yd[i] > (xd[i] || 0)) e--; + + if (pr == null) { + sd = pr = Ctor.precision; + rm = Ctor.rounding; + } else if (dp) { + sd = pr + (x.e - y.e) + 1; + } else { + sd = pr; + } + + if (sd < 0) { + qd.push(1); + more = true; + } else { + + // Convert precision in number of base 10 digits to base 1e7 digits. + sd = sd / logBase + 2 | 0; + i = 0; + + // divisor < 1e7 + if (yL == 1) { + k = 0; + yd = yd[0]; + sd++; + + // k is the carry. + for (; (i < xL || k) && sd--; i++) { + t = k * base + (xd[i] || 0); + qd[i] = t / yd | 0; + k = t % yd | 0; + } + + more = k || i < xL; + + // divisor >= 1e7 + } else { + + // Normalise xd and yd so highest order digit of yd is >= base/2 + k = base / (yd[0] + 1) | 0; + + if (k > 1) { + yd = multiplyInteger(yd, k, base); + xd = multiplyInteger(xd, k, base); + yL = yd.length; + xL = xd.length; + } + + xi = yL; + rem = xd.slice(0, yL); + remL = rem.length; + + // Add zeros to make remainder as long as divisor. + for (; remL < yL;) rem[remL++] = 0; + + yz = yd.slice(); + yz.unshift(0); + yd0 = yd[0]; + + if (yd[1] >= base / 2) ++yd0; + + do { + k = 0; + + // Compare divisor and remainder. + cmp = compare(yd, rem, yL, remL); + + // If divisor < remainder. + if (cmp < 0) { + + // Calculate trial digit, k. + rem0 = rem[0]; + if (yL != remL) rem0 = rem0 * base + (rem[1] || 0); + + // k will be how many times the divisor goes into the current remainder. + k = rem0 / yd0 | 0; + + // Algorithm: + // 1. product = divisor * trial digit (k) + // 2. if product > remainder: product -= divisor, k-- + // 3. remainder -= product + // 4. if product was < remainder at 2: + // 5. compare new remainder and divisor + // 6. If remainder > divisor: remainder -= divisor, k++ + + if (k > 1) { + if (k >= base) k = base - 1; + + // product = divisor * trial digit. + prod = multiplyInteger(yd, k, base); + prodL = prod.length; + remL = rem.length; + + // Compare product and remainder. + cmp = compare(prod, rem, prodL, remL); + + // product > remainder. + if (cmp == 1) { + k--; + + // Subtract divisor from product. + subtract(prod, yL < prodL ? yz : yd, prodL, base); + } + } else { + + // cmp is -1. + // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1 + // to avoid it. If k is 1 there is a need to compare yd and rem again below. + if (k == 0) cmp = k = 1; + prod = yd.slice(); + } + + prodL = prod.length; + if (prodL < remL) prod.unshift(0); + + // Subtract product from remainder. + subtract(rem, prod, remL, base); + + // If product was < previous remainder. + if (cmp == -1) { + remL = rem.length; + + // Compare divisor and new remainder. + cmp = compare(yd, rem, yL, remL); + + // If divisor < new remainder, subtract divisor from remainder. + if (cmp < 1) { + k++; + + // Subtract divisor from remainder. + subtract(rem, yL < remL ? yz : yd, remL, base); + } + } + + remL = rem.length; + } else if (cmp === 0) { + k++; + rem = [0]; + } // if cmp === 1, k will be 0 + + // Add the next digit, k, to the result array. + qd[i++] = k; + + // Update the remainder. + if (cmp && rem[0]) { + rem[remL++] = xd[xi] || 0; + } else { + rem = [xd[xi]]; + remL = 1; + } + + } while ((xi++ < xL || rem[0] !== void 0) && sd--); + + more = rem[0] !== void 0; + } + + // Leading zero? + if (!qd[0]) qd.shift(); + } + + // logBase is 1 when divide is being used for base conversion. + if (logBase == 1) { + q.e = e; + inexact = more; + } else { + + // To calculate q.e, first get the number of digits of qd[0]. + for (i = 1, k = qd[0]; k >= 10; k /= 10) i++; + q.e = i + e * logBase - 1; + + finalise(q, dp ? pr + q.e + 1 : pr, rm, more); + } + + return q; + }; + })(); + + + /* + * Round `x` to `sd` significant digits using rounding mode `rm`. + * Check for over/under-flow. + */ + function finalise(x, sd, rm, isTruncated) { + var digits, i, j, k, rd, roundUp, w, xd, xdi, + Ctor = x.constructor; + + // Don't round if sd is null or undefined. + out: if (sd != null) { + xd = x.d; + + // Infinity/NaN. + if (!xd) return x; + + // rd: the rounding digit, i.e. the digit after the digit that may be rounded up. + // w: the word of xd containing rd, a base 1e7 number. + // xdi: the index of w within xd. + // digits: the number of digits of w. + // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if + // they had leading zeros) + // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero). + + // Get the length of the first word of the digits array xd. + for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++; + i = sd - digits; + + // Is the rounding digit in the first word of xd? + if (i < 0) { + i += LOG_BASE; + j = sd; + w = xd[xdi = 0]; + + // Get the rounding digit at index j of w. + rd = w / mathpow(10, digits - j - 1) % 10 | 0; + } else { + xdi = Math.ceil((i + 1) / LOG_BASE); + k = xd.length; + if (xdi >= k) { + if (isTruncated) { + + // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`. + for (; k++ <= xdi;) xd.push(0); + w = rd = 0; + digits = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + w = k = xd[xdi]; + + // Get the number of digits of w. + for (digits = 1; k >= 10; k /= 10) digits++; + + // Get the index of rd within w. + i %= LOG_BASE; + + // Get the index of rd within w, adjusted for leading zeros. + // The number of leading zeros of w is given by LOG_BASE - digits. + j = i - LOG_BASE + digits; + + // Get the rounding digit at index j of w. + rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0; + } + } + + // Are there any non-zero digits after the rounding digit? + isTruncated = isTruncated || sd < 0 || + xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1)); + + // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right + // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression + // will give 714. + + roundUp = rm < 4 + ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) + : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 && + + // Check whether the digit to the left of the rounding digit is odd. + ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 || + rm == (x.s < 0 ? 8 : 7)); + + if (sd < 1 || !xd[0]) { + xd.length = 0; + if (roundUp) { + + // Convert sd to decimal places. + sd -= x.e + 1; + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE); + x.e = -sd || 0; + } else { + + // Zero. + xd[0] = x.e = 0; + } + + return x; + } + + // Remove excess digits. + if (i == 0) { + xd.length = xdi; + k = 1; + xdi--; + } else { + xd.length = xdi + 1; + k = mathpow(10, LOG_BASE - i); + + // E.g. 56700 becomes 56000 if 7 is the rounding digit. + // j > 0 means i > number of leading zeros of w. + xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0; + } + + if (roundUp) { + for (;;) { + + // Is the digit to be rounded up in the first word of xd? + if (xdi == 0) { + + // i will be the length of xd[0] before k is added. + for (i = 1, j = xd[0]; j >= 10; j /= 10) i++; + j = xd[0] += k; + for (k = 1; j >= 10; j /= 10) k++; + + // if i != k the length has increased. + if (i != k) { + x.e++; + if (xd[0] == BASE) xd[0] = 1; + } + + break; + } else { + xd[xdi] += k; + if (xd[xdi] != BASE) break; + xd[xdi--] = 0; + k = 1; + } + } + } + + // Remove trailing zeros. + for (i = xd.length; xd[--i] === 0;) xd.pop(); + } + + if (external) { + + // Overflow? + if (x.e > Ctor.maxE) { + + // Infinity. + x.d = null; + x.e = NaN; + + // Underflow? + } else if (x.e < Ctor.minE) { + + // Zero. + x.e = 0; + x.d = [0]; + // Ctor.underflow = true; + } // else Ctor.underflow = false; + } + + return x; + } + + + function finiteToString(x, isExp, sd) { + if (!x.isFinite()) return nonFiniteToString(x); + var k, + e = x.e, + str = digitsToString(x.d), + len = str.length; + + if (isExp) { + if (sd && (k = sd - len) > 0) { + str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k); + } else if (len > 1) { + str = str.charAt(0) + '.' + str.slice(1); + } + + str = str + (x.e < 0 ? 'e' : 'e+') + x.e; + } else if (e < 0) { + str = '0.' + getZeroString(-e - 1) + str; + if (sd && (k = sd - len) > 0) str += getZeroString(k); + } else if (e >= len) { + str += getZeroString(e + 1 - len); + if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k); + } else { + if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k); + if (sd && (k = sd - len) > 0) { + if (e + 1 === len) str += '.'; + str += getZeroString(k); + } + } + + return str; + } + + + // Calculate the base 10 exponent from the base 1e7 exponent. + function getBase10Exponent(digits, e) { + var w = digits[0]; + + // Add the number of digits of the first word of the digits array. + for ( e *= LOG_BASE; w >= 10; w /= 10) e++; + return e; + } + + + function getLn10(Ctor, sd, pr) { + if (sd > LN10_PRECISION) { + + // Reset global state in case the exception is caught. + external = true; + if (pr) Ctor.precision = pr; + throw Error(precisionLimitExceeded); + } + return finalise(new Ctor(LN10), sd, 1, true); + } + + + function getPi(Ctor, sd, rm) { + if (sd > PI_PRECISION) throw Error(precisionLimitExceeded); + return finalise(new Ctor(PI), sd, rm, true); + } + + + function getPrecision(digits) { + var w = digits.length - 1, + len = w * LOG_BASE + 1; + + w = digits[w]; + + // If non-zero... + if (w) { + + // Subtract the number of trailing zeros of the last word. + for (; w % 10 == 0; w /= 10) len--; + + // Add the number of digits of the first word. + for (w = digits[0]; w >= 10; w /= 10) len++; + } + + return len; + } + + + function getZeroString(k) { + var zs = ''; + for (; k--;) zs += '0'; + return zs; + } + + + /* + * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an + * integer of type number. + * + * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`. + * + */ + function intPow(Ctor, x, n, pr) { + var isTruncated, + r = new Ctor(1), + + // Max n of 9007199254740991 takes 53 loop iterations. + // Maximum digits array length; leaves [28, 34] guard digits. + k = Math.ceil(pr / LOG_BASE + 4); + + external = false; + + for (;;) { + if (n % 2) { + r = r.times(x); + if (truncate(r.d, k)) isTruncated = true; + } + + n = mathfloor(n / 2); + if (n === 0) { + + // To ensure correct rounding when r.d is truncated, increment the last word if it is zero. + n = r.d.length - 1; + if (isTruncated && r.d[n] === 0) ++r.d[n]; + break; + } + + x = x.times(x); + truncate(x.d, k); + } + + external = true; + + return r; + } + + + function isOdd(n) { + return n.d[n.d.length - 1] & 1; + } + + + /* + * Handle `max` and `min`. `ltgt` is 'lt' or 'gt'. + */ + function maxOrMin(Ctor, args, ltgt) { + var y, + x = new Ctor(args[0]), + i = 0; + + for (; ++i < args.length;) { + y = new Ctor(args[i]); + if (!y.s) { + x = y; + break; + } else if (x[ltgt](y)) { + x = y; + } + } + + return x; + } + + + /* + * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant + * digits. + * + * Taylor/Maclaurin series. + * + * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ... + * + * Argument reduction: + * Repeat x = x / 32, k += 5, until |x| < 0.1 + * exp(x) = exp(x / 2^k)^(2^k) + * + * Previously, the argument was initially reduced by + * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10) + * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was + * found to be slower than just dividing repeatedly by 32 as above. + * + * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000 + * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000 + * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324) + * + * exp(Infinity) = Infinity + * exp(-Infinity) = 0 + * exp(NaN) = NaN + * exp(±0) = 1 + * + * exp(x) is non-terminating for any finite, non-zero x. + * + * The result will always be correctly rounded. + * + */ + function naturalExponential(x, sd) { + var denominator, guard, j, pow, sum, t, wpr, + rep = 0, + i = 0, + k = 0, + Ctor = x.constructor, + rm = Ctor.rounding, + pr = Ctor.precision; + + // 0/NaN/Infinity? + if (!x.d || !x.d[0] || x.e > 17) { + + return new Ctor(x.d + ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0 + : x.s ? x.s < 0 ? 0 : x : 0 / 0); + } + + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + + t = new Ctor(0.03125); + + // while abs(x) >= 0.1 + while (x.e > -2) { + + // x = x / 2^5 + x = x.times(t); + k += 5; + } + + // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision + // necessary to ensure the first 4 rounding digits are correct. + guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0; + wpr += guard; + denominator = pow = sum = new Ctor(1); + Ctor.precision = wpr; + + for (;;) { + pow = finalise(pow.times(x), wpr, 1); + denominator = denominator.times(++i); + t = sum.plus(divide(pow, denominator, wpr, 1)); + + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) { + j = k; + while (j--) sum = finalise(sum.times(sum), wpr, 1); + + // Check to see if the first 4 rounding digits are [49]999. + // If so, repeat the summation with a higher precision, otherwise + // e.g. with precision: 18, rounding: 1 + // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123) + // `wpr - guard` is the index of first rounding digit. + if (sd == null) { + + if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += 10; + denominator = pow = t = new Ctor(1); + i = 0; + rep++; + } else { + return finalise(sum, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum; + } + } + + sum = t; + } + } + + + /* + * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant + * digits. + * + * ln(-n) = NaN + * ln(0) = -Infinity + * ln(-0) = -Infinity + * ln(1) = 0 + * ln(Infinity) = Infinity + * ln(-Infinity) = NaN + * ln(NaN) = NaN + * + * ln(n) (n != 1) is non-terminating. + * + */ + function naturalLogarithm(y, sd) { + var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2, + n = 1, + guard = 10, + x = y, + xd = x.d, + Ctor = x.constructor, + rm = Ctor.rounding, + pr = Ctor.precision; + + // Is x negative or Infinity, NaN, 0 or 1? + if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) { + return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x); + } + + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + + Ctor.precision = wpr += guard; + c = digitsToString(xd); + c0 = c.charAt(0); + + if (Math.abs(e = x.e) < 1.5e15) { + + // Argument reduction. + // The series converges faster the closer the argument is to 1, so using + // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b + // multiply the argument by itself until the leading digits of the significand are 7, 8, 9, + // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can + // later be divided by this number, then separate out the power of 10 using + // ln(a*10^b) = ln(a) + b*ln(10). + + // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14). + //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) { + // max n is 6 (gives 0.7 - 1.3) + while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) { + x = x.times(y); + c = digitsToString(x.d); + c0 = c.charAt(0); + n++; + } + + e = x.e; + + if (c0 > 1) { + x = new Ctor('0.' + c); + e++; + } else { + x = new Ctor(c0 + '.' + c.slice(1)); + } + } else { + + // The argument reduction method above may result in overflow if the argument y is a massive + // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this + // function using ln(x*10^e) = ln(x) + e*ln(10). + t = getLn10(Ctor, wpr + 2, pr).times(e + ''); + x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t); + Ctor.precision = pr; + + return sd == null ? finalise(x, pr, rm, external = true) : x; + } + + // x1 is x reduced to a value near 1. + x1 = x; + + // Taylor series. + // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...) + // where x = (y - 1)/(y + 1) (|x| < 1) + sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = 3; + + for (;;) { + numerator = finalise(numerator.times(x2), wpr, 1); + t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1)); + + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) { + sum = sum.times(2); + + // Reverse the argument reduction. Check that e is not 0 because, besides preventing an + // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0. + if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + '')); + sum = divide(sum, new Ctor(n), wpr, 1); + + // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has + // been repeated previously) and the first 4 rounding digits 9999? + // If so, restart the summation with a higher precision, otherwise + // e.g. with precision: 12, rounding: 1 + // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463. + // `wpr - guard` is the index of first rounding digit. + if (sd == null) { + if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += guard; + t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = rep = 1; + } else { + return finalise(sum, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum; + } + } + + sum = t; + denominator += 2; + } + } + + + // ±Infinity, NaN. + function nonFiniteToString(x) { + // Unsigned. + return String(x.s * x.s / 0); + } + + + /* + * Parse the value of a new Decimal `x` from string `str`. + */ + function parseDecimal(x, str) { + var e, i, len; + + // Decimal point? + if ((e = str.indexOf('.')) > -1) str = str.replace('.', ''); + + // Exponential form? + if ((i = str.search(/e/i)) > 0) { + + // Determine exponent. + if (e < 0) e = i; + e += +str.slice(i + 1); + str = str.substring(0, i); + } else if (e < 0) { + + // Integer. + e = str.length; + } + + // Determine leading zeros. + for (i = 0; str.charCodeAt(i) === 48; i++); + + // Determine trailing zeros. + for (len = str.length; str.charCodeAt(len - 1) === 48; --len); + str = str.slice(i, len); + + if (str) { + len -= i; + x.e = e = e - i - 1; + x.d = []; + + // Transform base + + // e is the base 10 exponent. + // i is where to slice str to get the first word of the digits array. + i = (e + 1) % LOG_BASE; + if (e < 0) i += LOG_BASE; + + if (i < len) { + if (i) x.d.push(+str.slice(0, i)); + for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE)); + str = str.slice(i); + i = LOG_BASE - str.length; + } else { + i -= len; + } + + for (; i--;) str += '0'; + x.d.push(+str); + + if (external) { + + // Overflow? + if (x.e > x.constructor.maxE) { + + // Infinity. + x.d = null; + x.e = NaN; + + // Underflow? + } else if (x.e < x.constructor.minE) { + + // Zero. + x.e = 0; + x.d = [0]; + // x.constructor.underflow = true; + } // else x.constructor.underflow = false; + } + } else { + + // Zero. + x.e = 0; + x.d = [0]; + } + + return x; + } + + + /* + * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value. + */ + function parseOther(x, str) { + var base, Ctor, divisor, i, isFloat, len, p, xd, xe; + + if (str === 'Infinity' || str === 'NaN') { + if (!+str) x.s = NaN; + x.e = NaN; + x.d = null; + return x; + } + + if (isHex.test(str)) { + base = 16; + str = str.toLowerCase(); + } else if (isBinary.test(str)) { + base = 2; + } else if (isOctal.test(str)) { + base = 8; + } else { + throw Error(invalidArgument + str); + } + + // Is there a binary exponent part? + i = str.search(/p/i); + + if (i > 0) { + p = +str.slice(i + 1); + str = str.substring(2, i); + } else { + str = str.slice(2); + } + + // Convert `str` as an integer then divide the result by `base` raised to a power such that the + // fraction part will be restored. + i = str.indexOf('.'); + isFloat = i >= 0; + Ctor = x.constructor; + + if (isFloat) { + str = str.replace('.', ''); + len = str.length; + i = len - i; + + // log[10](16) = 1.2041... , log[10](88) = 1.9444.... + divisor = intPow(Ctor, new Ctor(base), i, i * 2); + } + + xd = convertBase(str, base, BASE); + xe = xd.length - 1; + + // Remove trailing zeros. + for (i = xe; xd[i] === 0; --i) xd.pop(); + if (i < 0) return new Ctor(x.s * 0); + x.e = getBase10Exponent(xd, xe); + x.d = xd; + external = false; + + // At what precision to perform the division to ensure exact conversion? + // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount) + // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412 + // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits. + // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount + // Therefore using 4 * the number of digits of str will always be enough. + if (isFloat) x = divide(x, divisor, len * 4); + + // Multiply by the binary exponent part if present. + if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p)); + external = true; + + return x; + } + + + /* + * sin(x) = x - x^3/3! + x^5/5! - ... + * |x| < pi/2 + * + */ + function sine(Ctor, x) { + var k, + len = x.d.length; + + if (len < 3) return taylorSeries(Ctor, 2, x, x); + + // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x) + // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5) + // and sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20)) + + // Estimate the optimum number of times to use the argument reduction. + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x); + + // Reverse argument reduction + var sin2_x, + d5 = new Ctor(5), + d16 = new Ctor(16), + d20 = new Ctor(20); + for (; k--;) { + sin2_x = x.times(x); + x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20)))); + } + + return x; + } + + + // Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`. + function taylorSeries(Ctor, n, x, y, isHyperbolic) { + var j, t, u, x2, + i = 1, + pr = Ctor.precision, + k = Math.ceil(pr / LOG_BASE); + + external = false; + x2 = x.times(x); + u = new Ctor(y); + + for (;;) { + t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1); + u = isHyperbolic ? y.plus(t) : y.minus(t); + y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1); + t = u.plus(y); + + if (t.d[k] !== void 0) { + for (j = k; t.d[j] === u.d[j] && j--;); + if (j == -1) break; + } + + j = u; + u = y; + y = t; + t = j; + i++; + } + + external = true; + t.d.length = k + 1; + + return t; + } + + + // Exponent e must be positive and non-zero. + function tinyPow(b, e) { + var n = b; + while (--e) n *= b; + return n; + } + + + // Return the absolute value of `x` reduced to less than or equal to half pi. + function toLessThanHalfPi(Ctor, x) { + var t, + isNeg = x.s < 0, + pi = getPi(Ctor, Ctor.precision, 1), + halfPi = pi.times(0.5); + + x = x.abs(); + + if (x.lte(halfPi)) { + quadrant = isNeg ? 4 : 1; + return x; + } + + t = x.divToInt(pi); + + if (t.isZero()) { + quadrant = isNeg ? 3 : 2; + } else { + x = x.minus(t.times(pi)); + + // 0 <= x < pi + if (x.lte(halfPi)) { + quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1); + return x; + } + + quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2); + } + + return x.minus(pi).abs(); + } + + + /* + * Return the value of Decimal `x` as a string in base `baseOut`. + * + * If the optional `sd` argument is present include a binary exponent suffix. + */ + function toStringBinary(x, baseOut, sd, rm) { + var base, e, i, k, len, roundUp, str, xd, y, + Ctor = x.constructor, + isExp = sd !== void 0; + + if (isExp) { + checkInt32(sd, 1, MAX_DIGITS); + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + } else { + sd = Ctor.precision; + rm = Ctor.rounding; + } + + if (!x.isFinite()) { + str = nonFiniteToString(x); + } else { + str = finiteToString(x); + i = str.indexOf('.'); + + // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required: + // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10)) + // minBinaryExponent = floor(decimalExponent * log[2](10)) + // log[2](10) = 3.321928094887362347870319429489390175864 + + if (isExp) { + base = 2; + if (baseOut == 16) { + sd = sd * 4 - 3; + } else if (baseOut == 8) { + sd = sd * 3 - 2; + } + } else { + base = baseOut; + } + + // Convert the number as an integer then divide the result by its base raised to a power such + // that the fraction part will be restored. + + // Non-integer. + if (i >= 0) { + str = str.replace('.', ''); + y = new Ctor(1); + y.e = str.length - i; + y.d = convertBase(finiteToString(y), 10, base); + y.e = y.d.length; + } + + xd = convertBase(str, 10, base); + e = len = xd.length; + + // Remove trailing zeros. + for (; xd[--len] == 0;) xd.pop(); + + if (!xd[0]) { + str = isExp ? '0p+0' : '0'; + } else { + if (i < 0) { + e--; + } else { + x = new Ctor(x); + x.d = xd; + x.e = e; + x = divide(x, y, sd, rm, 0, base); + xd = x.d; + e = x.e; + roundUp = inexact; + } + + // The rounding digit, i.e. the digit after the digit that may be rounded up. + i = xd[sd]; + k = base / 2; + roundUp = roundUp || xd[sd + 1] !== void 0; + + roundUp = rm < 4 + ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2)) + : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 || + rm === (x.s < 0 ? 8 : 7)); + + xd.length = sd; + + if (roundUp) { + + // Rounding up may mean the previous digit has to be rounded up and so on. + for (; ++xd[--sd] > base - 1;) { + xd[sd] = 0; + if (!sd) { + ++e; + xd.unshift(1); + } + } + } + + // Determine trailing zeros. + for (len = xd.length; !xd[len - 1]; --len); + + // E.g. [4, 11, 15] becomes 4bf. + for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]); + + // Add binary exponent suffix? + if (isExp) { + if (len > 1) { + if (baseOut == 16 || baseOut == 8) { + i = baseOut == 16 ? 4 : 3; + for (--len; len % i; len++) str += '0'; + xd = convertBase(str, base, baseOut); + for (len = xd.length; !xd[len - 1]; --len); + + // xd[0] will always be be 1 + for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]); + } else { + str = str.charAt(0) + '.' + str.slice(1); + } + } + + str = str + (e < 0 ? 'p' : 'p+') + e; + } else if (e < 0) { + for (; ++e;) str = '0' + str; + str = '0.' + str; + } else { + if (++e > len) for (e -= len; e-- ;) str += '0'; + else if (e < len) str = str.slice(0, e) + '.' + str.slice(e); + } + } + + str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str; + } + + return x.s < 0 ? '-' + str : str; + } + + + // Does not strip trailing zeros. + function truncate(arr, len) { + if (arr.length > len) { + arr.length = len; + return true; + } + } + + + // Decimal methods + + + /* + * abs + * acos + * acosh + * add + * asin + * asinh + * atan + * atanh + * atan2 + * cbrt + * ceil + * clone + * config + * cos + * cosh + * div + * exp + * floor + * hypot + * ln + * log + * log2 + * log10 + * max + * min + * mod + * mul + * pow + * random + * round + * set + * sign + * sin + * sinh + * sqrt + * sub + * tan + * tanh + * trunc + */ + + + /* + * Return a new Decimal whose value is the absolute value of `x`. + * + * x {number|string|Decimal} + * + */ + function abs(x) { + return new this(x).abs(); + } + + + /* + * Return a new Decimal whose value is the arccosine in radians of `x`. + * + * x {number|string|Decimal} + * + */ + function acos(x) { + return new this(x).acos(); + } + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function acosh(x) { + return new this(x).acosh(); + } + + + /* + * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function add(x, y) { + return new this(x).plus(y); + } + + + /* + * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function asin(x) { + return new this(x).asin(); + } + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function asinh(x) { + return new this(x).asinh(); + } + + + /* + * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function atan(x) { + return new this(x).atan(); + } + + + /* + * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function atanh(x) { + return new this(x).atanh(); + } + + + /* + * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi + * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`. + * + * Domain: [-Infinity, Infinity] + * Range: [-pi, pi] + * + * y {number|string|Decimal} The y-coordinate. + * x {number|string|Decimal} The x-coordinate. + * + * atan2(±0, -0) = ±pi + * atan2(±0, +0) = ±0 + * atan2(±0, -x) = ±pi for x > 0 + * atan2(±0, x) = ±0 for x > 0 + * atan2(-y, ±0) = -pi/2 for y > 0 + * atan2(y, ±0) = pi/2 for y > 0 + * atan2(±y, -Infinity) = ±pi for finite y > 0 + * atan2(±y, +Infinity) = ±0 for finite y > 0 + * atan2(±Infinity, x) = ±pi/2 for finite x + * atan2(±Infinity, -Infinity) = ±3*pi/4 + * atan2(±Infinity, +Infinity) = ±pi/4 + * atan2(NaN, x) = NaN + * atan2(y, NaN) = NaN + * + */ + function atan2(y, x) { + y = new this(y); + x = new this(x); + var r, + pr = this.precision, + rm = this.rounding, + wpr = pr + 4; + + // Either NaN + if (!y.s || !x.s) { + r = new this(NaN); + + // Both ±Infinity + } else if (!y.d && !x.d) { + r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75); + r.s = y.s; + + // x is ±Infinity or y is ±0 + } else if (!x.d || y.isZero()) { + r = x.s < 0 ? getPi(this, pr, rm) : new this(0); + r.s = y.s; + + // y is ±Infinity or x is ±0 + } else if (!y.d || x.isZero()) { + r = getPi(this, wpr, 1).times(0.5); + r.s = y.s; + + // Both non-zero and finite + } else if (x.s < 0) { + this.precision = wpr; + this.rounding = 1; + r = this.atan(divide(y, x, wpr, 1)); + x = getPi(this, wpr, 1); + this.precision = pr; + this.rounding = rm; + r = y.s < 0 ? r.minus(x) : r.plus(x); + } else { + r = this.atan(divide(y, x, wpr, 1)); + } + + return r; + } + + + /* + * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function cbrt(x) { + return new this(x).cbrt(); + } + + + /* + * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`. + * + * x {number|string|Decimal} + * + */ + function ceil(x) { + return finalise(x = new this(x), x.e + 1, 2); + } + + + /* + * Configure global settings for a Decimal constructor. + * + * `obj` is an object with one or more of the following properties, + * + * precision {number} + * rounding {number} + * toExpNeg {number} + * toExpPos {number} + * maxE {number} + * minE {number} + * modulo {number} + * crypto {boolean|number} + * defaults {true} + * + * E.g. Decimal.config({ precision: 20, rounding: 4 }) + * + */ + function config(obj) { + if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected'); + var i, p, v, + useDefaults = obj.defaults === true, + ps = [ + 'precision', 1, MAX_DIGITS, + 'rounding', 0, 8, + 'toExpNeg', -EXP_LIMIT, 0, + 'toExpPos', 0, EXP_LIMIT, + 'maxE', 0, EXP_LIMIT, + 'minE', -EXP_LIMIT, 0, + 'modulo', 0, 9 + ]; + + for (i = 0; i < ps.length; i += 3) { + if (p = ps[i], useDefaults) this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v; + else throw Error(invalidArgument + p + ': ' + v); + } + } + + if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (v === true || v === false || v === 0 || v === 1) { + if (v) { + if (typeof crypto != 'undefined' && crypto && + (crypto.getRandomValues || crypto.randomBytes)) { + this[p] = true; + } else { + throw Error(cryptoUnavailable); + } + } else { + this[p] = false; + } + } else { + throw Error(invalidArgument + p + ': ' + v); + } + } + + return this; + } + + + /* + * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function cos(x) { + return new this(x).cos(); + } + + + /* + * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function cosh(x) { + return new this(x).cosh(); + } + + + /* + * Create and return a Decimal constructor with the same configuration properties as this Decimal + * constructor. + * + */ + function clone(obj) { + var i, p, ps; + + /* + * The Decimal constructor and exported function. + * Return a new Decimal instance. + * + * v {number|string|Decimal} A numeric value. + * + */ + function Decimal(v) { + var e, i, t, + x = this; + + // Decimal called without new. + if (!(x instanceof Decimal)) return new Decimal(v); + + // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor + // which points to Object. + x.constructor = Decimal; + + // Duplicate. + if (v instanceof Decimal) { + x.s = v.s; + + if (external) { + if (!v.d || v.e > Decimal.maxE) { + + // Infinity. + x.e = NaN; + x.d = null; + } else if (v.e < Decimal.minE) { + + // Zero. + x.e = 0; + x.d = [0]; + } else { + x.e = v.e; + x.d = v.d.slice(); + } + } else { + x.e = v.e; + x.d = v.d ? v.d.slice() : v.d; + } + + return; + } + + t = typeof v; + + if (t === 'number') { + if (v === 0) { + x.s = 1 / v < 0 ? -1 : 1; + x.e = 0; + x.d = [0]; + return; + } + + if (v < 0) { + v = -v; + x.s = -1; + } else { + x.s = 1; + } + + // Fast path for small integers. + if (v === ~~v && v < 1e7) { + for (e = 0, i = v; i >= 10; i /= 10) e++; + + if (external) { + if (e > Decimal.maxE) { + x.e = NaN; + x.d = null; + } else if (e < Decimal.minE) { + x.e = 0; + x.d = [0]; + } else { + x.e = e; + x.d = [v]; + } + } else { + x.e = e; + x.d = [v]; + } + + return; + + // Infinity, NaN. + } else if (v * 0 !== 0) { + if (!v) x.s = NaN; + x.e = NaN; + x.d = null; + return; + } + + return parseDecimal(x, v.toString()); + + } else if (t !== 'string') { + throw Error(invalidArgument + v); + } + + // Minus sign? + if ((i = v.charCodeAt(0)) === 45) { + v = v.slice(1); + x.s = -1; + } else { + // Plus sign? + if (i === 43) v = v.slice(1); + x.s = 1; + } + + return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v); + } + + Decimal.prototype = P; + + Decimal.ROUND_UP = 0; + Decimal.ROUND_DOWN = 1; + Decimal.ROUND_CEIL = 2; + Decimal.ROUND_FLOOR = 3; + Decimal.ROUND_HALF_UP = 4; + Decimal.ROUND_HALF_DOWN = 5; + Decimal.ROUND_HALF_EVEN = 6; + Decimal.ROUND_HALF_CEIL = 7; + Decimal.ROUND_HALF_FLOOR = 8; + Decimal.EUCLID = 9; + + Decimal.config = Decimal.set = config; + Decimal.clone = clone; + Decimal.isDecimal = isDecimalInstance; + + Decimal.abs = abs; + Decimal.acos = acos; + Decimal.acosh = acosh; // ES6 + Decimal.add = add; + Decimal.asin = asin; + Decimal.asinh = asinh; // ES6 + Decimal.atan = atan; + Decimal.atanh = atanh; // ES6 + Decimal.atan2 = atan2; + Decimal.cbrt = cbrt; // ES6 + Decimal.ceil = ceil; + Decimal.cos = cos; + Decimal.cosh = cosh; // ES6 + Decimal.div = div; + Decimal.exp = exp; + Decimal.floor = floor; + Decimal.hypot = hypot; // ES6 + Decimal.ln = ln; + Decimal.log = log; + Decimal.log10 = log10; // ES6 + Decimal.log2 = log2; // ES6 + Decimal.max = max; + Decimal.min = min; + Decimal.mod = mod; + Decimal.mul = mul; + Decimal.pow = pow; + Decimal.random = random; + Decimal.round = round; + Decimal.sign = sign; // ES6 + Decimal.sin = sin; + Decimal.sinh = sinh; // ES6 + Decimal.sqrt = sqrt; + Decimal.sub = sub; + Decimal.tan = tan; + Decimal.tanh = tanh; // ES6 + Decimal.trunc = trunc; // ES6 + + if (obj === void 0) obj = {}; + if (obj) { + if (obj.defaults !== true) { + ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto']; + for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p]; + } + } + + Decimal.config(obj); + + return Decimal; + } + + + /* + * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function div(x, y) { + return new this(x).div(y); + } + + + /* + * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} The power to which to raise the base of the natural log. + * + */ + function exp(x) { + return new this(x).exp(); + } + + + /* + * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`. + * + * x {number|string|Decimal} + * + */ + function floor(x) { + return finalise(x = new this(x), x.e + 1, 3); + } + + + /* + * Return a new Decimal whose value is the square root of the sum of the squares of the arguments, + * rounded to `precision` significant digits using rounding mode `rounding`. + * + * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...) + * + * arguments {number|string|Decimal} + * + */ + function hypot() { + var i, n, + t = new this(0); + + external = false; + + for (i = 0; i < arguments.length;) { + n = new this(arguments[i++]); + if (!n.d) { + if (n.s) { + external = true; + return new this(1 / 0); + } + t = n; + } else if (t.d) { + t = t.plus(n.times(n)); + } + } + + external = true; + + return t.sqrt(); + } + + + /* + * Return true if object is a Decimal instance (where Decimal is any Decimal constructor), + * otherwise return false. + * + */ + function isDecimalInstance(obj) { + return obj instanceof Decimal || obj && obj.name === '[object Decimal]' || false; + } + + + /* + * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function ln(x) { + return new this(x).ln(); + } + + + /* + * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base + * is specified, rounded to `precision` significant digits using rounding mode `rounding`. + * + * log[y](x) + * + * x {number|string|Decimal} The argument of the logarithm. + * y {number|string|Decimal} The base of the logarithm. + * + */ + function log(x, y) { + return new this(x).log(y); + } + + + /* + * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function log2(x) { + return new this(x).log(2); + } + + + /* + * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function log10(x) { + return new this(x).log(10); + } + + + /* + * Return a new Decimal whose value is the maximum of the arguments. + * + * arguments {number|string|Decimal} + * + */ + function max() { + return maxOrMin(this, arguments, 'lt'); + } + + + /* + * Return a new Decimal whose value is the minimum of the arguments. + * + * arguments {number|string|Decimal} + * + */ + function min() { + return maxOrMin(this, arguments, 'gt'); + } + + + /* + * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits + * using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function mod(x, y) { + return new this(x).mod(y); + } + + + /* + * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function mul(x, y) { + return new this(x).mul(y); + } + + + /* + * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} The base. + * y {number|string|Decimal} The exponent. + * + */ + function pow(x, y) { + return new this(x).pow(y); + } + + + /* + * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with + * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros + * are produced). + * + * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive. + * + */ + function random(sd) { + var d, e, k, n, + i = 0, + r = new this(1), + rd = []; + + if (sd === void 0) sd = this.precision; + else checkInt32(sd, 1, MAX_DIGITS); + + k = Math.ceil(sd / LOG_BASE); + + if (!this.crypto) { + for (; i < k;) rd[i++] = Math.random() * 1e7 | 0; + + // Browsers supporting crypto.getRandomValues. + } else if (crypto.getRandomValues) { + d = crypto.getRandomValues(new Uint32Array(k)); + + for (; i < k;) { + n = d[i]; + + // 0 <= n < 4294967296 + // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865). + if (n >= 4.29e9) { + d[i] = crypto.getRandomValues(new Uint32Array(1))[0]; + } else { + + // 0 <= n <= 4289999999 + // 0 <= (n % 1e7) <= 9999999 + rd[i++] = n % 1e7; + } + } + + // Node.js supporting crypto.randomBytes. + } else if (crypto.randomBytes) { + + // buffer + d = crypto.randomBytes(k *= 4); + + for (; i < k;) { + + // 0 <= n < 2147483648 + n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24); + + // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286). + if (n >= 2.14e9) { + crypto.randomBytes(4).copy(d, i); + } else { + + // 0 <= n <= 2139999999 + // 0 <= (n % 1e7) <= 9999999 + rd.push(n % 1e7); + i += 4; + } + } + + i = k / 4; + } else { + throw Error(cryptoUnavailable); + } + + k = rd[--i]; + sd %= LOG_BASE; + + // Convert trailing digits to zeros according to sd. + if (k && sd) { + n = mathpow(10, LOG_BASE - sd); + rd[i] = (k / n | 0) * n; + } + + // Remove trailing words which are zero. + for (; rd[i] === 0; i--) rd.pop(); + + // Zero? + if (i < 0) { + e = 0; + rd = [0]; + } else { + e = -1; + + // Remove leading words which are zero and adjust exponent accordingly. + for (; rd[0] === 0; e -= LOG_BASE) rd.shift(); + + // Count the digits of the first word of rd to determine leading zeros. + for (k = 1, n = rd[0]; n >= 10; n /= 10) k++; + + // Adjust the exponent for leading zeros of the first word of rd. + if (k < LOG_BASE) e -= LOG_BASE - k; + } + + r.e = e; + r.d = rd; + + return r; + } + + + /* + * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`. + * + * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL). + * + * x {number|string|Decimal} + * + */ + function round(x) { + return finalise(x = new this(x), x.e + 1, this.rounding); + } + + + /* + * Return + * 1 if x > 0, + * -1 if x < 0, + * 0 if x is 0, + * -0 if x is -0, + * NaN otherwise + * + * x {number|string|Decimal} + * + */ + function sign(x) { + x = new this(x); + return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN; + } + + + /* + * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits + * using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function sin(x) { + return new this(x).sin(); + } + + + /* + * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function sinh(x) { + return new this(x).sinh(); + } + + + /* + * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ + function sqrt(x) { + return new this(x).sqrt(); + } + + + /* + * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits + * using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ + function sub(x, y) { + return new this(x).sub(y); + } + + + /* + * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function tan(x) { + return new this(x).tan(); + } + + + /* + * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ + function tanh(x) { + return new this(x).tanh(); + } + + + /* + * Return a new Decimal whose value is `x` truncated to an integer. + * + * x {number|string|Decimal} + * + */ + function trunc(x) { + return finalise(x = new this(x), x.e + 1, 1); + } + + + // Create and configure initial Decimal constructor. + Decimal = clone(DEFAULTS); + + Decimal['default'] = Decimal.Decimal = Decimal; + + // Create the internal constants from their string values. + LN10 = new Decimal(LN10); + PI = new Decimal(PI); + + + // Export. + + + // AMD. + if (typeof define == 'function' && define.amd) { + define(function () { + return Decimal; + }); + + // Node and other environments that support module.exports. + } else if (typeof module != 'undefined' && module.exports) { + if (typeof Symbol == 'function' && typeof Symbol.iterator == 'symbol') { + P[Symbol.for('nodejs.util.inspect.custom')] = P.toString; + P[Symbol.toStringTag] = 'Decimal'; + } + + module.exports = Decimal; + + // Browser. + } else { + if (!globalScope) { + globalScope = typeof self != 'undefined' && self && self.self == self ? self : window; + } + + noConflict = globalScope.Decimal; + Decimal.noConflict = function () { + globalScope.Decimal = noConflict; + return Decimal; + }; + + globalScope.Decimal = Decimal; + } +})(this); diff --git a/node_modules/decimal.js/decimal.min.js b/node_modules/decimal.js/decimal.min.js new file mode 100644 index 0000000..98a5552 --- /dev/null +++ b/node_modules/decimal.js/decimal.min.js @@ -0,0 +1,3 @@ +/* decimal.js v10.2.0 https://github.com/MikeMcl/decimal.js/LICENCE */ +!function(n){"use strict";var h,R,e,o,u=9e15,g=1e9,m="0123456789abcdef",t="2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058",r="3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789",c={precision:20,rounding:4,modulo:1,toExpNeg:-7,toExpPos:21,minE:-u,maxE:u,crypto:!1},N=!0,f="[DecimalError] ",w=f+"Invalid argument: ",s=f+"Precision limit exceeded",a=f+"crypto unavailable",L=Math.floor,v=Math.pow,l=/^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i,d=/^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i,p=/^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i,b=/^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,T=1e7,U=7,E=t.length-1,x=r.length-1,y={name:"[object Decimal]"};function M(n){var e,i,t,r=n.length-1,s="",o=n[0];if(0i-1&&(void 0===s[t+1]&&(s[t+1]=0),s[t+1]+=s[t]/i|0,s[t]%=i)}return s.reverse()}y.absoluteValue=y.abs=function(){var n=new this.constructor(this);return n.s<0&&(n.s=1),_(n)},y.ceil=function(){return _(new this.constructor(this),this.e+1,2)},y.comparedTo=y.cmp=function(n){var e,i,t,r,s=this,o=s.d,u=(n=new s.constructor(n)).d,c=s.s,f=n.s;if(!o||!u)return c&&f?c!==f?c:o===u?0:!o^c<0?1:-1:NaN;if(!o[0]||!u[0])return o[0]?c:u[0]?-f:0;if(c!==f)return c;if(s.e!==n.e)return s.e>n.e^c<0?1:-1;for(e=0,i=(t=o.length)<(r=u.length)?t:r;eu[e]^c<0?1:-1;return t===r?0:rthis.d.length-2},y.isNaN=function(){return!this.s},y.isNegative=y.isNeg=function(){return this.s<0},y.isPositive=y.isPos=function(){return 0e&&(e=this.e+1)):e=NaN,e},y.round=function(){var n=this.constructor;return _(new n(this),this.e+1,n.rounding)},y.sine=y.sin=function(){var n,e,i=this,t=i.constructor;return i.isFinite()?i.isZero()?new t(i):(n=t.precision,e=t.rounding,t.precision=n+Math.max(i.e,i.sd())+U,t.rounding=1,i=function(n,e){var i,t=e.d.length;if(t<3)return W(n,2,e,e);i=16<(i=1.4*Math.sqrt(t))?16:0|i,e=e.times(1/J(5,i)),e=W(n,2,e,e);for(var r,s=new n(5),o=new n(16),u=new n(20);i--;)r=e.times(e),e=e.times(s.plus(r.times(o.times(r).minus(u))));return e}(t,z(t,i)),t.precision=n,t.rounding=e,_(2=n.d.length-1&&(i=f<0?-f:f)<=9007199254740991)return r=I(c,u,i,t),n.s<0?new c(1).div(r):_(r,t,s);if((o=u.s)<0){if(ec.maxE+1||e=r.toExpPos):(q(n,1,g),void 0===e?e=r.rounding:q(e,0,8),A(t=_(new r(t),n,e),n<=t.e||t.e<=r.toExpNeg,n)),t.isNeg()&&!t.isZero()?"-"+i:i},y.toSignificantDigits=y.toSD=function(n,e){var i=this.constructor;return void 0===n?(n=i.precision,e=i.rounding):(q(n,1,g),void 0===e?e=i.rounding:q(e,0,8)),_(new i(this),n,e)},y.toString=function(){var n=this,e=n.constructor,i=A(n,n.e<=e.toExpNeg||n.e>=e.toExpPos);return n.isNeg()&&!n.isZero()?"-"+i:i},y.truncated=y.trunc=function(){return _(new this.constructor(this),this.e+1,1)},y.valueOf=y.toJSON=function(){var n=this,e=n.constructor,i=A(n,n.e<=e.toExpNeg||n.e>=e.toExpPos);return n.isNeg()?"-"+i:i};var F=function(){function S(n,e,i){var t,r=0,s=n.length;for(n=n.slice();s--;)t=n[s]*e+r,n[s]=t%i|0,r=t/i|0;return r&&n.unshift(r),n}function Z(n,e,i,t){var r,s;if(i!=t)s=te[r]?1:-1;break}return s}function P(n,e,i,t){for(var r=0;i--;)n[i]-=r,r=n[i](F[c]||0)&&u--,null==i?(N=i=O.precision,t=O.rounding):N=r?i+(n.e-e.e)+1:i,N<0)g.push(1),h=!0;else{if(N=N/a+2|0,c=0,1==M){for(A=A[f=0],N++;(c=s/2&&++y;f=0,(o=Z(A,m,M,w))<0?(v=m[0],M!=w&&(v=v*s+(m[1]||0)),1<(f=v/y|0)?(s<=f&&(f=s-1),1==(o=Z(l=S(A,f,s),m,d=l.length,w=m.length))&&(f--,P(l,Md.maxE?(n.d=null,n.e=NaN):n.en.constructor.maxE?(n.d=null,n.e=NaN):n.er-1;)h[i]=0,i||(++s,h.unshift(1));for(c=h.length;!h[c-1];--c);for(o=0,a="";oc)for(s-=c;s--;)a+="0";else se)return n.length=e,!0}function Q(n){return new this(n).abs()}function X(n){return new this(n).acos()}function Y(n){return new this(n).acosh()}function nn(n,e){return new this(n).plus(e)}function en(n){return new this(n).asin()}function tn(n){return new this(n).asinh()}function rn(n){return new this(n).atan()}function sn(n){return new this(n).atanh()}function on(n,e){n=new this(n),e=new this(e);var i,t=this.precision,r=this.rounding,s=t+4;return n.s&&e.s?n.d||e.d?!e.d||n.isZero()?(i=e.s<0?P(this,t,r):new this(0)).s=n.s:!n.d||e.isZero()?(i=P(this,s,1).times(.5)).s=n.s:i=e.s<0?(this.precision=s,this.rounding=1,i=this.atan(F(n,e,s,1)),e=P(this,s,1),this.precision=t,this.rounding=r,n.s<0?i.minus(e):i.plus(e)):this.atan(F(n,e,s,1)):(i=P(this,s,1).times(0s.maxE?(r.e=NaN,r.d=null):n.e + * MIT Licence + */ + + +// ----------------------------------- EDITABLE DEFAULTS ------------------------------------ // + + + // The maximum exponent magnitude. + // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`. +var EXP_LIMIT = 9e15, // 0 to 9e15 + + // The limit on the value of `precision`, and on the value of the first argument to + // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`. + MAX_DIGITS = 1e9, // 0 to 1e9 + + // Base conversion alphabet. + NUMERALS = '0123456789abcdef', + + // The natural logarithm of 10 (1025 digits). + LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058', + + // Pi (1025 digits). + PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789', + + + // The initial configuration properties of the Decimal constructor. + DEFAULTS = { + + // These values must be integers within the stated ranges (inclusive). + // Most of these values can be changed at run-time using the `Decimal.config` method. + + // The maximum number of significant digits of the result of a calculation or base conversion. + // E.g. `Decimal.config({ precision: 20 });` + precision: 20, // 1 to MAX_DIGITS + + // The rounding mode used when rounding to `precision`. + // + // ROUND_UP 0 Away from zero. + // ROUND_DOWN 1 Towards zero. + // ROUND_CEIL 2 Towards +Infinity. + // ROUND_FLOOR 3 Towards -Infinity. + // ROUND_HALF_UP 4 Towards nearest neighbour. If equidistant, up. + // ROUND_HALF_DOWN 5 Towards nearest neighbour. If equidistant, down. + // ROUND_HALF_EVEN 6 Towards nearest neighbour. If equidistant, towards even neighbour. + // ROUND_HALF_CEIL 7 Towards nearest neighbour. If equidistant, towards +Infinity. + // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity. + // + // E.g. + // `Decimal.rounding = 4;` + // `Decimal.rounding = Decimal.ROUND_HALF_UP;` + rounding: 4, // 0 to 8 + + // The modulo mode used when calculating the modulus: a mod n. + // The quotient (q = a / n) is calculated according to the corresponding rounding mode. + // The remainder (r) is calculated as: r = a - n * q. + // + // UP 0 The remainder is positive if the dividend is negative, else is negative. + // DOWN 1 The remainder has the same sign as the dividend (JavaScript %). + // FLOOR 3 The remainder has the same sign as the divisor (Python %). + // HALF_EVEN 6 The IEEE 754 remainder function. + // EUCLID 9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive. + // + // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian + // division (9) are commonly used for the modulus operation. The other rounding modes can also + // be used, but they may not give useful results. + modulo: 1, // 0 to 9 + + // The exponent value at and beneath which `toString` returns exponential notation. + // JavaScript numbers: -7 + toExpNeg: -7, // 0 to -EXP_LIMIT + + // The exponent value at and above which `toString` returns exponential notation. + // JavaScript numbers: 21 + toExpPos: 21, // 0 to EXP_LIMIT + + // The minimum exponent value, beneath which underflow to zero occurs. + // JavaScript numbers: -324 (5e-324) + minE: -EXP_LIMIT, // -1 to -EXP_LIMIT + + // The maximum exponent value, above which overflow to Infinity occurs. + // JavaScript numbers: 308 (1.7976931348623157e+308) + maxE: EXP_LIMIT, // 1 to EXP_LIMIT + + // Whether to use cryptographically-secure random number generation, if available. + crypto: false // true/false + }, + + +// ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- // + + + inexact, quadrant, + external = true, + + decimalError = '[DecimalError] ', + invalidArgument = decimalError + 'Invalid argument: ', + precisionLimitExceeded = decimalError + 'Precision limit exceeded', + cryptoUnavailable = decimalError + 'crypto unavailable', + + mathfloor = Math.floor, + mathpow = Math.pow, + + isBinary = /^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i, + isHex = /^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i, + isOctal = /^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i, + isDecimal = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i, + + BASE = 1e7, + LOG_BASE = 7, + MAX_SAFE_INTEGER = 9007199254740991, + + LN10_PRECISION = LN10.length - 1, + PI_PRECISION = PI.length - 1, + + // Decimal.prototype object + P = { name: '[object Decimal]' }; + + +// Decimal prototype methods + + +/* + * absoluteValue abs + * ceil + * comparedTo cmp + * cosine cos + * cubeRoot cbrt + * decimalPlaces dp + * dividedBy div + * dividedToIntegerBy divToInt + * equals eq + * floor + * greaterThan gt + * greaterThanOrEqualTo gte + * hyperbolicCosine cosh + * hyperbolicSine sinh + * hyperbolicTangent tanh + * inverseCosine acos + * inverseHyperbolicCosine acosh + * inverseHyperbolicSine asinh + * inverseHyperbolicTangent atanh + * inverseSine asin + * inverseTangent atan + * isFinite + * isInteger isInt + * isNaN + * isNegative isNeg + * isPositive isPos + * isZero + * lessThan lt + * lessThanOrEqualTo lte + * logarithm log + * [maximum] [max] + * [minimum] [min] + * minus sub + * modulo mod + * naturalExponential exp + * naturalLogarithm ln + * negated neg + * plus add + * precision sd + * round + * sine sin + * squareRoot sqrt + * tangent tan + * times mul + * toBinary + * toDecimalPlaces toDP + * toExponential + * toFixed + * toFraction + * toHexadecimal toHex + * toNearest + * toNumber + * toOctal + * toPower pow + * toPrecision + * toSignificantDigits toSD + * toString + * truncated trunc + * valueOf toJSON + */ + + +/* + * Return a new Decimal whose value is the absolute value of this Decimal. + * + */ +P.absoluteValue = P.abs = function () { + var x = new this.constructor(this); + if (x.s < 0) x.s = 1; + return finalise(x); +}; + + +/* + * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the + * direction of positive Infinity. + * + */ +P.ceil = function () { + return finalise(new this.constructor(this), this.e + 1, 2); +}; + + +/* + * Return + * 1 if the value of this Decimal is greater than the value of `y`, + * -1 if the value of this Decimal is less than the value of `y`, + * 0 if they have the same value, + * NaN if the value of either Decimal is NaN. + * + */ +P.comparedTo = P.cmp = function (y) { + var i, j, xdL, ydL, + x = this, + xd = x.d, + yd = (y = new x.constructor(y)).d, + xs = x.s, + ys = y.s; + + // Either NaN or ±Infinity? + if (!xd || !yd) { + return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1; + } + + // Either zero? + if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0; + + // Signs differ? + if (xs !== ys) return xs; + + // Compare exponents. + if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1; + + xdL = xd.length; + ydL = yd.length; + + // Compare digit by digit. + for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) { + if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1; + } + + // Compare lengths. + return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1; +}; + + +/* + * Return a new Decimal whose value is the cosine of the value in radians of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-1, 1] + * + * cos(0) = 1 + * cos(-0) = 1 + * cos(Infinity) = NaN + * cos(-Infinity) = NaN + * cos(NaN) = NaN + * + */ +P.cosine = P.cos = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.d) return new Ctor(NaN); + + // cos(0) = cos(-0) = 1 + if (!x.d[0]) return new Ctor(1); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + + x = cosine(Ctor, toLessThanHalfPi(Ctor, x)); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true); +}; + + +/* + * + * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * cbrt(0) = 0 + * cbrt(-0) = -0 + * cbrt(1) = 1 + * cbrt(-1) = -1 + * cbrt(N) = N + * cbrt(-I) = -I + * cbrt(I) = I + * + * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3)) + * + */ +P.cubeRoot = P.cbrt = function () { + var e, m, n, r, rep, s, sd, t, t3, t3plusx, + x = this, + Ctor = x.constructor; + + if (!x.isFinite() || x.isZero()) return new Ctor(x); + external = false; + + // Initial estimate. + s = x.s * mathpow(x.s * x, 1 / 3); + + // Math.cbrt underflow/overflow? + // Pass x to Math.pow as integer, then adjust the exponent of the result. + if (!s || Math.abs(s) == 1 / 0) { + n = digitsToString(x.d); + e = x.e; + + // Adjust n exponent so it is a multiple of 3 away from x exponent. + if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00'); + s = mathpow(n, 1 / 3); + + // Rarely, e may be one less than the result exponent value. + e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2)); + + if (s == 1 / 0) { + n = '5e' + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf('e') + 1) + e; + } + + r = new Ctor(n); + r.s = x.s; + } else { + r = new Ctor(s.toString()); + } + + sd = (e = Ctor.precision) + 3; + + // Halley's method. + // TODO? Compare Newton's method. + for (;;) { + t = r; + t3 = t.times(t).times(t); + t3plusx = t3.plus(x); + r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1); + + // TODO? Replace with for-loop and checkRoundingDigits. + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999 + // , i.e. approaching a rounding boundary, continue the iteration. + if (n == '9999' || !rep && n == '4999') { + + // On the first iteration only, check to see if rounding up gives the exact result as the + // nines may infinitely repeat. + if (!rep) { + finalise(t, e + 1, 0); + + if (t.times(t).times(t).eq(x)) { + r = t; + break; + } + } + + sd += 4; + rep = 1; + } else { + + // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result. + // If not, then there are further digits and m will be truthy. + if (!+n || !+n.slice(1) && n.charAt(0) == '5') { + + // Truncate to the first rounding digit. + finalise(r, e + 1, 1); + m = !r.times(r).times(r).eq(x); + } + + break; + } + } + } + + external = true; + + return finalise(r, e, Ctor.rounding, m); +}; + + +/* + * Return the number of decimal places of the value of this Decimal. + * + */ +P.decimalPlaces = P.dp = function () { + var w, + d = this.d, + n = NaN; + + if (d) { + w = d.length - 1; + n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE; + + // Subtract the number of trailing zeros of the last word. + w = d[w]; + if (w) for (; w % 10 == 0; w /= 10) n--; + if (n < 0) n = 0; + } + + return n; +}; + + +/* + * n / 0 = I + * n / N = N + * n / I = 0 + * 0 / n = 0 + * 0 / 0 = N + * 0 / N = N + * 0 / I = 0 + * N / n = N + * N / 0 = N + * N / N = N + * N / I = N + * I / n = I + * I / 0 = I + * I / N = N + * I / I = N + * + * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + */ +P.dividedBy = P.div = function (y) { + return divide(this, new this.constructor(y)); +}; + + +/* + * Return a new Decimal whose value is the integer part of dividing the value of this Decimal + * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`. + * + */ +P.dividedToIntegerBy = P.divToInt = function (y) { + var x = this, + Ctor = x.constructor; + return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding); +}; + + +/* + * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false. + * + */ +P.equals = P.eq = function (y) { + return this.cmp(y) === 0; +}; + + +/* + * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the + * direction of negative Infinity. + * + */ +P.floor = function () { + return finalise(new this.constructor(this), this.e + 1, 3); +}; + + +/* + * Return true if the value of this Decimal is greater than the value of `y`, otherwise return + * false. + * + */ +P.greaterThan = P.gt = function (y) { + return this.cmp(y) > 0; +}; + + +/* + * Return true if the value of this Decimal is greater than or equal to the value of `y`, + * otherwise return false. + * + */ +P.greaterThanOrEqualTo = P.gte = function (y) { + var k = this.cmp(y); + return k == 1 || k === 0; +}; + + +/* + * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [1, Infinity] + * + * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ... + * + * cosh(0) = 1 + * cosh(-0) = 1 + * cosh(Infinity) = Infinity + * cosh(-Infinity) = Infinity + * cosh(NaN) = NaN + * + * x time taken (ms) result + * 1000 9 9.8503555700852349694e+433 + * 10000 25 4.4034091128314607936e+4342 + * 100000 171 1.4033316802130615897e+43429 + * 1000000 3817 1.5166076984010437725e+434294 + * 10000000 abandoned after 2 minute wait + * + * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x)) + * + */ +P.hyperbolicCosine = P.cosh = function () { + var k, n, pr, rm, len, + x = this, + Ctor = x.constructor, + one = new Ctor(1); + + if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN); + if (x.isZero()) return one; + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + + // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1 + // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4)) + + // Estimate the optimum number of times to use the argument reduction. + // TODO? Estimation reused from cosine() and may not be optimal here. + if (len < 32) { + k = Math.ceil(len / 3); + n = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + n = '2.3283064365386962890625e-10'; + } + + x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true); + + // Reverse argument reduction + var cosh2_x, + i = k, + d8 = new Ctor(8); + for (; i--;) { + cosh2_x = x.times(x); + x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8)))); + } + + return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true); +}; + + +/* + * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-Infinity, Infinity] + * + * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ... + * + * sinh(0) = 0 + * sinh(-0) = -0 + * sinh(Infinity) = Infinity + * sinh(-Infinity) = -Infinity + * sinh(NaN) = NaN + * + * x time taken (ms) + * 10 2 ms + * 100 5 ms + * 1000 14 ms + * 10000 82 ms + * 100000 886 ms 1.4033316802130615897e+43429 + * 200000 2613 ms + * 300000 5407 ms + * 400000 8824 ms + * 500000 13026 ms 8.7080643612718084129e+217146 + * 1000000 48543 ms + * + * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x)) + * + */ +P.hyperbolicSine = P.sinh = function () { + var k, pr, rm, len, + x = this, + Ctor = x.constructor; + + if (!x.isFinite() || x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + 4; + Ctor.rounding = 1; + len = x.d.length; + + if (len < 3) { + x = taylorSeries(Ctor, 2, x, x, true); + } else { + + // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x)) + // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3)) + // 3 multiplications and 1 addition + + // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x))) + // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5))) + // 4 multiplications and 2 additions + + // Estimate the optimum number of times to use the argument reduction. + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x, true); + + // Reverse argument reduction + var sinh2_x, + d5 = new Ctor(5), + d16 = new Ctor(16), + d20 = new Ctor(20); + for (; k--;) { + sinh2_x = x.times(x); + x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20)))); + } + } + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(x, pr, rm, true); +}; + + +/* + * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-1, 1] + * + * tanh(x) = sinh(x) / cosh(x) + * + * tanh(0) = 0 + * tanh(-0) = -0 + * tanh(Infinity) = 1 + * tanh(-Infinity) = -1 + * tanh(NaN) = NaN + * + */ +P.hyperbolicTangent = P.tanh = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(x.s); + if (x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 7; + Ctor.rounding = 1; + + return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm); +}; + + +/* + * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of + * this Decimal. + * + * Domain: [-1, 1] + * Range: [0, pi] + * + * acos(x) = pi/2 - asin(x) + * + * acos(0) = pi/2 + * acos(-0) = pi/2 + * acos(1) = 0 + * acos(-1) = pi + * acos(1/2) = pi/3 + * acos(-1/2) = 2*pi/3 + * acos(|x| > 1) = NaN + * acos(NaN) = NaN + * + */ +P.inverseCosine = P.acos = function () { + var halfPi, + x = this, + Ctor = x.constructor, + k = x.abs().cmp(1), + pr = Ctor.precision, + rm = Ctor.rounding; + + if (k !== -1) { + return k === 0 + // |x| is 1 + ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0) + // |x| > 1 or x is NaN + : new Ctor(NaN); + } + + if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5); + + // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3 + + Ctor.precision = pr + 6; + Ctor.rounding = 1; + + x = x.asin(); + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return halfPi.minus(x); +}; + + +/* + * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the + * value of this Decimal. + * + * Domain: [1, Infinity] + * Range: [0, Infinity] + * + * acosh(x) = ln(x + sqrt(x^2 - 1)) + * + * acosh(x < 1) = NaN + * acosh(NaN) = NaN + * acosh(Infinity) = Infinity + * acosh(-Infinity) = NaN + * acosh(0) = NaN + * acosh(-0) = NaN + * acosh(1) = 0 + * acosh(-1) = NaN + * + */ +P.inverseHyperbolicCosine = P.acosh = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN); + if (!x.isFinite()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4; + Ctor.rounding = 1; + external = false; + + x = x.times(x).minus(1).sqrt().plus(x); + + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.ln(); +}; + + +/* + * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value + * of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-Infinity, Infinity] + * + * asinh(x) = ln(x + sqrt(x^2 + 1)) + * + * asinh(NaN) = NaN + * asinh(Infinity) = Infinity + * asinh(-Infinity) = -Infinity + * asinh(0) = 0 + * asinh(-0) = -0 + * + */ +P.inverseHyperbolicSine = P.asinh = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite() || x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6; + Ctor.rounding = 1; + external = false; + + x = x.times(x).plus(1).sqrt().plus(x); + + external = true; + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.ln(); +}; + + +/* + * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the + * value of this Decimal. + * + * Domain: [-1, 1] + * Range: [-Infinity, Infinity] + * + * atanh(x) = 0.5 * ln((1 + x) / (1 - x)) + * + * atanh(|x| > 1) = NaN + * atanh(NaN) = NaN + * atanh(Infinity) = NaN + * atanh(-Infinity) = NaN + * atanh(0) = 0 + * atanh(-0) = -0 + * atanh(1) = Infinity + * atanh(-1) = -Infinity + * + */ +P.inverseHyperbolicTangent = P.atanh = function () { + var pr, rm, wpr, xsd, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(NaN); + if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN); + + pr = Ctor.precision; + rm = Ctor.rounding; + xsd = x.sd(); + + if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true); + + Ctor.precision = wpr = xsd - x.e; + + x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1); + + Ctor.precision = pr + 4; + Ctor.rounding = 1; + + x = x.ln(); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.times(0.5); +}; + + +/* + * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this + * Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-pi/2, pi/2] + * + * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2))) + * + * asin(0) = 0 + * asin(-0) = -0 + * asin(1/2) = pi/6 + * asin(-1/2) = -pi/6 + * asin(1) = pi/2 + * asin(-1) = -pi/2 + * asin(|x| > 1) = NaN + * asin(NaN) = NaN + * + * TODO? Compare performance of Taylor series. + * + */ +P.inverseSine = P.asin = function () { + var halfPi, k, + pr, rm, + x = this, + Ctor = x.constructor; + + if (x.isZero()) return new Ctor(x); + + k = x.abs().cmp(1); + pr = Ctor.precision; + rm = Ctor.rounding; + + if (k !== -1) { + + // |x| is 1 + if (k === 0) { + halfPi = getPi(Ctor, pr + 4, rm).times(0.5); + halfPi.s = x.s; + return halfPi; + } + + // |x| > 1 or x is NaN + return new Ctor(NaN); + } + + // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6 + + Ctor.precision = pr + 6; + Ctor.rounding = 1; + + x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan(); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return x.times(2); +}; + + +/* + * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value + * of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-pi/2, pi/2] + * + * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... + * + * atan(0) = 0 + * atan(-0) = -0 + * atan(1) = pi/4 + * atan(-1) = -pi/4 + * atan(Infinity) = pi/2 + * atan(-Infinity) = -pi/2 + * atan(NaN) = NaN + * + */ +P.inverseTangent = P.atan = function () { + var i, j, k, n, px, t, r, wpr, x2, + x = this, + Ctor = x.constructor, + pr = Ctor.precision, + rm = Ctor.rounding; + + if (!x.isFinite()) { + if (!x.s) return new Ctor(NaN); + if (pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.5); + r.s = x.s; + return r; + } + } else if (x.isZero()) { + return new Ctor(x); + } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) { + r = getPi(Ctor, pr + 4, rm).times(0.25); + r.s = x.s; + return r; + } + + Ctor.precision = wpr = pr + 10; + Ctor.rounding = 1; + + // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x); + + // Argument reduction + // Ensure |x| < 0.42 + // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2))) + + k = Math.min(28, wpr / LOG_BASE + 2 | 0); + + for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1)); + + external = false; + + j = Math.ceil(wpr / LOG_BASE); + n = 1; + x2 = x.times(x); + r = new Ctor(x); + px = x; + + // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... + for (; i !== -1;) { + px = px.times(x2); + t = r.minus(px.div(n += 2)); + + px = px.times(x2); + r = t.plus(px.div(n += 2)); + + if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;); + } + + if (k) r = r.times(2 << (k - 1)); + + external = true; + + return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true); +}; + + +/* + * Return true if the value of this Decimal is a finite number, otherwise return false. + * + */ +P.isFinite = function () { + return !!this.d; +}; + + +/* + * Return true if the value of this Decimal is an integer, otherwise return false. + * + */ +P.isInteger = P.isInt = function () { + return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2; +}; + + +/* + * Return true if the value of this Decimal is NaN, otherwise return false. + * + */ +P.isNaN = function () { + return !this.s; +}; + + +/* + * Return true if the value of this Decimal is negative, otherwise return false. + * + */ +P.isNegative = P.isNeg = function () { + return this.s < 0; +}; + + +/* + * Return true if the value of this Decimal is positive, otherwise return false. + * + */ +P.isPositive = P.isPos = function () { + return this.s > 0; +}; + + +/* + * Return true if the value of this Decimal is 0 or -0, otherwise return false. + * + */ +P.isZero = function () { + return !!this.d && this.d[0] === 0; +}; + + +/* + * Return true if the value of this Decimal is less than `y`, otherwise return false. + * + */ +P.lessThan = P.lt = function (y) { + return this.cmp(y) < 0; +}; + + +/* + * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false. + * + */ +P.lessThanOrEqualTo = P.lte = function (y) { + return this.cmp(y) < 1; +}; + + +/* + * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * If no base is specified, return log[10](arg). + * + * log[base](arg) = ln(arg) / ln(base) + * + * The result will always be correctly rounded if the base of the log is 10, and 'almost always' + * otherwise: + * + * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen + * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error + * between the result and the correctly rounded result will be one ulp (unit in the last place). + * + * log[-b](a) = NaN + * log[0](a) = NaN + * log[1](a) = NaN + * log[NaN](a) = NaN + * log[Infinity](a) = NaN + * log[b](0) = -Infinity + * log[b](-0) = -Infinity + * log[b](-a) = NaN + * log[b](1) = 0 + * log[b](Infinity) = Infinity + * log[b](NaN) = NaN + * + * [base] {number|string|Decimal} The base of the logarithm. + * + */ +P.logarithm = P.log = function (base) { + var isBase10, d, denominator, k, inf, num, sd, r, + arg = this, + Ctor = arg.constructor, + pr = Ctor.precision, + rm = Ctor.rounding, + guard = 5; + + // Default base is 10. + if (base == null) { + base = new Ctor(10); + isBase10 = true; + } else { + base = new Ctor(base); + d = base.d; + + // Return NaN if base is negative, or non-finite, or is 0 or 1. + if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN); + + isBase10 = base.eq(10); + } + + d = arg.d; + + // Is arg negative, non-finite, 0 or 1? + if (arg.s < 0 || !d || !d[0] || arg.eq(1)) { + return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0); + } + + // The result will have a non-terminating decimal expansion if base is 10 and arg is not an + // integer power of 10. + if (isBase10) { + if (d.length > 1) { + inf = true; + } else { + for (k = d[0]; k % 10 === 0;) k /= 10; + inf = k !== 1; + } + } + + external = false; + sd = pr + guard; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + + // The result will have 5 rounding digits. + r = divide(num, denominator, sd, 1); + + // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000, + // calculate 10 further digits. + // + // If the result is known to have an infinite decimal expansion, repeat this until it is clear + // that the result is above or below the boundary. Otherwise, if after calculating the 10 + // further digits, the last 14 are nines, round up and assume the result is exact. + // Also assume the result is exact if the last 14 are zero. + // + // Example of a result that will be incorrectly rounded: + // log[1048576](4503599627370502) = 2.60000000000000009610279511444746... + // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it + // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so + // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal + // place is still 2.6. + if (checkRoundingDigits(r.d, k = pr, rm)) { + + do { + sd += 10; + num = naturalLogarithm(arg, sd); + denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd); + r = divide(num, denominator, sd, 1); + + if (!inf) { + + // Check for 14 nines from the 2nd rounding digit, as the first may be 4. + if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + + break; + } + } while (checkRoundingDigits(r.d, k += 10, rm)); + } + + external = true; + + return finalise(r, pr, rm); +}; + + +/* + * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal. + * + * arguments {number|string|Decimal} + * +P.max = function () { + Array.prototype.push.call(arguments, this); + return maxOrMin(this.constructor, arguments, 'lt'); +}; + */ + + +/* + * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal. + * + * arguments {number|string|Decimal} + * +P.min = function () { + Array.prototype.push.call(arguments, this); + return maxOrMin(this.constructor, arguments, 'gt'); +}; + */ + + +/* + * n - 0 = n + * n - N = N + * n - I = -I + * 0 - n = -n + * 0 - 0 = 0 + * 0 - N = N + * 0 - I = -I + * N - n = N + * N - 0 = N + * N - N = N + * N - I = N + * I - n = I + * I - 0 = I + * I - N = N + * I - I = N + * + * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + */ +P.minus = P.sub = function (y) { + var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd, + x = this, + Ctor = x.constructor; + + y = new Ctor(y); + + // If either is not finite... + if (!x.d || !y.d) { + + // Return NaN if either is NaN. + if (!x.s || !y.s) y = new Ctor(NaN); + + // Return y negated if x is finite and y is ±Infinity. + else if (x.d) y.s = -y.s; + + // Return x if y is finite and x is ±Infinity. + // Return x if both are ±Infinity with different signs. + // Return NaN if both are ±Infinity with the same sign. + else y = new Ctor(y.d || x.s !== y.s ? x : NaN); + + return y; + } + + // If signs differ... + if (x.s != y.s) { + y.s = -y.s; + return x.plus(y); + } + + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + + // If either is zero... + if (!xd[0] || !yd[0]) { + + // Return y negated if x is zero and y is non-zero. + if (yd[0]) y.s = -y.s; + + // Return x if y is zero and x is non-zero. + else if (xd[0]) y = new Ctor(x); + + // Return zero if both are zero. + // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity. + else return new Ctor(rm === 3 ? -0 : 0); + + return external ? finalise(y, pr, rm) : y; + } + + // x and y are finite, non-zero numbers with the same sign. + + // Calculate base 1e7 exponents. + e = mathfloor(y.e / LOG_BASE); + xe = mathfloor(x.e / LOG_BASE); + + xd = xd.slice(); + k = xe - e; + + // If base 1e7 exponents differ... + if (k) { + xLTy = k < 0; + + if (xLTy) { + d = xd; + k = -k; + len = yd.length; + } else { + d = yd; + e = xe; + len = xd.length; + } + + // Numbers with massively different exponents would result in a very high number of + // zeros needing to be prepended, but this can be avoided while still ensuring correct + // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`. + i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2; + + if (k > i) { + k = i; + d.length = 1; + } + + // Prepend zeros to equalise exponents. + d.reverse(); + for (i = k; i--;) d.push(0); + d.reverse(); + + // Base 1e7 exponents equal. + } else { + + // Check digits to determine which is the bigger number. + + i = xd.length; + len = yd.length; + xLTy = i < len; + if (xLTy) len = i; + + for (i = 0; i < len; i++) { + if (xd[i] != yd[i]) { + xLTy = xd[i] < yd[i]; + break; + } + } + + k = 0; + } + + if (xLTy) { + d = xd; + xd = yd; + yd = d; + y.s = -y.s; + } + + len = xd.length; + + // Append zeros to `xd` if shorter. + // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length. + for (i = yd.length - len; i > 0; --i) xd[len++] = 0; + + // Subtract yd from xd. + for (i = yd.length; i > k;) { + + if (xd[--i] < yd[i]) { + for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1; + --xd[j]; + xd[i] += BASE; + } + + xd[i] -= yd[i]; + } + + // Remove trailing zeros. + for (; xd[--len] === 0;) xd.pop(); + + // Remove leading zeros and adjust exponent accordingly. + for (; xd[0] === 0; xd.shift()) --e; + + // Zero? + if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0); + + y.d = xd; + y.e = getBase10Exponent(xd, e); + + return external ? finalise(y, pr, rm) : y; +}; + + +/* + * n % 0 = N + * n % N = N + * n % I = n + * 0 % n = 0 + * -0 % n = -0 + * 0 % 0 = N + * 0 % N = N + * 0 % I = 0 + * N % n = N + * N % 0 = N + * N % N = N + * N % I = N + * I % n = N + * I % 0 = N + * I % N = N + * I % I = N + * + * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * The result depends on the modulo mode. + * + */ +P.modulo = P.mod = function (y) { + var q, + x = this, + Ctor = x.constructor; + + y = new Ctor(y); + + // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0. + if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN); + + // Return x if y is ±Infinity or x is ±0. + if (!y.d || x.d && !x.d[0]) { + return finalise(new Ctor(x), Ctor.precision, Ctor.rounding); + } + + // Prevent rounding of intermediate calculations. + external = false; + + if (Ctor.modulo == 9) { + + // Euclidian division: q = sign(y) * floor(x / abs(y)) + // result = x - q * y where 0 <= result < abs(y) + q = divide(x, y.abs(), 0, 3, 1); + q.s *= y.s; + } else { + q = divide(x, y, 0, Ctor.modulo, 1); + } + + q = q.times(y); + + external = true; + + return x.minus(q); +}; + + +/* + * Return a new Decimal whose value is the natural exponential of the value of this Decimal, + * i.e. the base e raised to the power the value of this Decimal, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + */ +P.naturalExponential = P.exp = function () { + return naturalExponential(this); +}; + + +/* + * Return a new Decimal whose value is the natural logarithm of the value of this Decimal, + * rounded to `precision` significant digits using rounding mode `rounding`. + * + */ +P.naturalLogarithm = P.ln = function () { + return naturalLogarithm(this); +}; + + +/* + * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by + * -1. + * + */ +P.negated = P.neg = function () { + var x = new this.constructor(this); + x.s = -x.s; + return finalise(x); +}; + + +/* + * n + 0 = n + * n + N = N + * n + I = I + * 0 + n = n + * 0 + 0 = 0 + * 0 + N = N + * 0 + I = I + * N + n = N + * N + 0 = N + * N + N = N + * N + I = N + * I + n = I + * I + 0 = I + * I + N = N + * I + I = I + * + * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + */ +P.plus = P.add = function (y) { + var carry, d, e, i, k, len, pr, rm, xd, yd, + x = this, + Ctor = x.constructor; + + y = new Ctor(y); + + // If either is not finite... + if (!x.d || !y.d) { + + // Return NaN if either is NaN. + if (!x.s || !y.s) y = new Ctor(NaN); + + // Return x if y is finite and x is ±Infinity. + // Return x if both are ±Infinity with the same sign. + // Return NaN if both are ±Infinity with different signs. + // Return y if x is finite and y is ±Infinity. + else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN); + + return y; + } + + // If signs differ... + if (x.s != y.s) { + y.s = -y.s; + return x.minus(y); + } + + xd = x.d; + yd = y.d; + pr = Ctor.precision; + rm = Ctor.rounding; + + // If either is zero... + if (!xd[0] || !yd[0]) { + + // Return x if y is zero. + // Return y if y is non-zero. + if (!yd[0]) y = new Ctor(x); + + return external ? finalise(y, pr, rm) : y; + } + + // x and y are finite, non-zero numbers with the same sign. + + // Calculate base 1e7 exponents. + k = mathfloor(x.e / LOG_BASE); + e = mathfloor(y.e / LOG_BASE); + + xd = xd.slice(); + i = k - e; + + // If base 1e7 exponents differ... + if (i) { + + if (i < 0) { + d = xd; + i = -i; + len = yd.length; + } else { + d = yd; + e = k; + len = xd.length; + } + + // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1. + k = Math.ceil(pr / LOG_BASE); + len = k > len ? k + 1 : len + 1; + + if (i > len) { + i = len; + d.length = 1; + } + + // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts. + d.reverse(); + for (; i--;) d.push(0); + d.reverse(); + } + + len = xd.length; + i = yd.length; + + // If yd is longer than xd, swap xd and yd so xd points to the longer array. + if (len - i < 0) { + i = len; + d = yd; + yd = xd; + xd = d; + } + + // Only start adding at yd.length - 1 as the further digits of xd can be left as they are. + for (carry = 0; i;) { + carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0; + xd[i] %= BASE; + } + + if (carry) { + xd.unshift(carry); + ++e; + } + + // Remove trailing zeros. + // No need to check for zero, as +x + +y != 0 && -x + -y != 0 + for (len = xd.length; xd[--len] == 0;) xd.pop(); + + y.d = xd; + y.e = getBase10Exponent(xd, e); + + return external ? finalise(y, pr, rm) : y; +}; + + +/* + * Return the number of significant digits of the value of this Decimal. + * + * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0. + * + */ +P.precision = P.sd = function (z) { + var k, + x = this; + + if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z); + + if (x.d) { + k = getPrecision(x.d); + if (z && x.e + 1 > k) k = x.e + 1; + } else { + k = NaN; + } + + return k; +}; + + +/* + * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using + * rounding mode `rounding`. + * + */ +P.round = function () { + var x = this, + Ctor = x.constructor; + + return finalise(new Ctor(x), x.e + 1, Ctor.rounding); +}; + + +/* + * Return a new Decimal whose value is the sine of the value in radians of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-1, 1] + * + * sin(x) = x - x^3/3! + x^5/5! - ... + * + * sin(0) = 0 + * sin(-0) = -0 + * sin(Infinity) = NaN + * sin(-Infinity) = NaN + * sin(NaN) = NaN + * + */ +P.sine = P.sin = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(NaN); + if (x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE; + Ctor.rounding = 1; + + x = sine(Ctor, toLessThanHalfPi(Ctor, x)); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true); +}; + + +/* + * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * sqrt(-n) = N + * sqrt(N) = N + * sqrt(-I) = N + * sqrt(I) = I + * sqrt(0) = 0 + * sqrt(-0) = -0 + * + */ +P.squareRoot = P.sqrt = function () { + var m, n, sd, r, rep, t, + x = this, + d = x.d, + e = x.e, + s = x.s, + Ctor = x.constructor; + + // Negative/NaN/Infinity/zero? + if (s !== 1 || !d || !d[0]) { + return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0); + } + + external = false; + + // Initial estimate. + s = Math.sqrt(+x); + + // Math.sqrt underflow/overflow? + // Pass x to Math.sqrt as integer, then adjust the exponent of the result. + if (s == 0 || s == 1 / 0) { + n = digitsToString(d); + + if ((n.length + e) % 2 == 0) n += '0'; + s = Math.sqrt(n); + e = mathfloor((e + 1) / 2) - (e < 0 || e % 2); + + if (s == 1 / 0) { + n = '1e' + e; + } else { + n = s.toExponential(); + n = n.slice(0, n.indexOf('e') + 1) + e; + } + + r = new Ctor(n); + } else { + r = new Ctor(s.toString()); + } + + sd = (e = Ctor.precision) + 3; + + // Newton-Raphson iteration. + for (;;) { + t = r; + r = t.plus(divide(x, t, sd + 2, 1)).times(0.5); + + // TODO? Replace with for-loop and checkRoundingDigits. + if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) { + n = n.slice(sd - 3, sd + 1); + + // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or + // 4999, i.e. approaching a rounding boundary, continue the iteration. + if (n == '9999' || !rep && n == '4999') { + + // On the first iteration only, check to see if rounding up gives the exact result as the + // nines may infinitely repeat. + if (!rep) { + finalise(t, e + 1, 0); + + if (t.times(t).eq(x)) { + r = t; + break; + } + } + + sd += 4; + rep = 1; + } else { + + // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result. + // If not, then there are further digits and m will be truthy. + if (!+n || !+n.slice(1) && n.charAt(0) == '5') { + + // Truncate to the first rounding digit. + finalise(r, e + 1, 1); + m = !r.times(r).eq(x); + } + + break; + } + } + } + + external = true; + + return finalise(r, e, Ctor.rounding, m); +}; + + +/* + * Return a new Decimal whose value is the tangent of the value in radians of this Decimal. + * + * Domain: [-Infinity, Infinity] + * Range: [-Infinity, Infinity] + * + * tan(0) = 0 + * tan(-0) = -0 + * tan(Infinity) = NaN + * tan(-Infinity) = NaN + * tan(NaN) = NaN + * + */ +P.tangent = P.tan = function () { + var pr, rm, + x = this, + Ctor = x.constructor; + + if (!x.isFinite()) return new Ctor(NaN); + if (x.isZero()) return new Ctor(x); + + pr = Ctor.precision; + rm = Ctor.rounding; + Ctor.precision = pr + 10; + Ctor.rounding = 1; + + x = x.sin(); + x.s = 1; + x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0); + + Ctor.precision = pr; + Ctor.rounding = rm; + + return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true); +}; + + +/* + * n * 0 = 0 + * n * N = N + * n * I = I + * 0 * n = 0 + * 0 * 0 = 0 + * 0 * N = N + * 0 * I = N + * N * n = N + * N * 0 = N + * N * N = N + * N * I = N + * I * n = I + * I * 0 = N + * I * N = N + * I * I = I + * + * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + */ +P.times = P.mul = function (y) { + var carry, e, i, k, r, rL, t, xdL, ydL, + x = this, + Ctor = x.constructor, + xd = x.d, + yd = (y = new Ctor(y)).d; + + y.s *= x.s; + + // If either is NaN, ±Infinity or ±0... + if (!xd || !xd[0] || !yd || !yd[0]) { + + return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd + + // Return NaN if either is NaN. + // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity. + ? NaN + + // Return ±Infinity if either is ±Infinity. + // Return ±0 if either is ±0. + : !xd || !yd ? y.s / 0 : y.s * 0); + } + + e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE); + xdL = xd.length; + ydL = yd.length; + + // Ensure xd points to the longer array. + if (xdL < ydL) { + r = xd; + xd = yd; + yd = r; + rL = xdL; + xdL = ydL; + ydL = rL; + } + + // Initialise the result array with zeros. + r = []; + rL = xdL + ydL; + for (i = rL; i--;) r.push(0); + + // Multiply! + for (i = ydL; --i >= 0;) { + carry = 0; + for (k = xdL + i; k > i;) { + t = r[k] + yd[i] * xd[k - i - 1] + carry; + r[k--] = t % BASE | 0; + carry = t / BASE | 0; + } + + r[k] = (r[k] + carry) % BASE | 0; + } + + // Remove trailing zeros. + for (; !r[--rL];) r.pop(); + + if (carry) ++e; + else r.shift(); + + y.d = r; + y.e = getBase10Exponent(r, e); + + return external ? finalise(y, Ctor.precision, Ctor.rounding) : y; +}; + + +/* + * Return a string representing the value of this Decimal in base 2, round to `sd` significant + * digits using rounding mode `rm`. + * + * If the optional `sd` argument is present then return binary exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ +P.toBinary = function (sd, rm) { + return toStringBinary(this, 2, sd, rm); +}; + + +/* + * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp` + * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted. + * + * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal. + * + * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ +P.toDecimalPlaces = P.toDP = function (dp, rm) { + var x = this, + Ctor = x.constructor; + + x = new Ctor(x); + if (dp === void 0) return x; + + checkInt32(dp, 0, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + return finalise(x, dp + x.e + 1, rm); +}; + + +/* + * Return a string representing the value of this Decimal in exponential notation rounded to + * `dp` fixed decimal places using rounding mode `rounding`. + * + * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ +P.toExponential = function (dp, rm) { + var str, + x = this, + Ctor = x.constructor; + + if (dp === void 0) { + str = finiteToString(x, true); + } else { + checkInt32(dp, 0, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + x = finalise(new Ctor(x), dp + 1, rm); + str = finiteToString(x, true, dp + 1); + } + + return x.isNeg() && !x.isZero() ? '-' + str : str; +}; + + +/* + * Return a string representing the value of this Decimal in normal (fixed-point) notation to + * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is + * omitted. + * + * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'. + * + * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'. + * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'. + * (-0).toFixed(3) is '0.000'. + * (-0.5).toFixed(0) is '-0'. + * + */ +P.toFixed = function (dp, rm) { + var str, y, + x = this, + Ctor = x.constructor; + + if (dp === void 0) { + str = finiteToString(x); + } else { + checkInt32(dp, 0, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + y = finalise(new Ctor(x), dp + x.e + 1, rm); + str = finiteToString(y, false, dp + y.e + 1); + } + + // To determine whether to add the minus sign look at the value before it was rounded, + // i.e. look at `x` rather than `y`. + return x.isNeg() && !x.isZero() ? '-' + str : str; +}; + + +/* + * Return an array representing the value of this Decimal as a simple fraction with an integer + * numerator and an integer denominator. + * + * The denominator will be a positive non-zero value less than or equal to the specified maximum + * denominator. If a maximum denominator is not specified, the denominator will be the lowest + * value necessary to represent the number exactly. + * + * [maxD] {number|string|Decimal} Maximum denominator. Integer >= 1 and < Infinity. + * + */ +P.toFraction = function (maxD) { + var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r, + x = this, + xd = x.d, + Ctor = x.constructor; + + if (!xd) return new Ctor(x); + + n1 = d0 = new Ctor(1); + d1 = n0 = new Ctor(0); + + d = new Ctor(d1); + e = d.e = getPrecision(xd) - x.e - 1; + k = e % LOG_BASE; + d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k); + + if (maxD == null) { + + // d is 10**e, the minimum max-denominator needed. + maxD = e > 0 ? d : n1; + } else { + n = new Ctor(maxD); + if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n); + maxD = n.gt(d) ? (e > 0 ? d : n1) : n; + } + + external = false; + n = new Ctor(digitsToString(xd)); + pr = Ctor.precision; + Ctor.precision = e = xd.length * LOG_BASE * 2; + + for (;;) { + q = divide(n, d, 0, 1, 1); + d2 = d0.plus(q.times(d1)); + if (d2.cmp(maxD) == 1) break; + d0 = d1; + d1 = d2; + d2 = n1; + n1 = n0.plus(q.times(d2)); + n0 = d2; + d2 = d; + d = n.minus(q.times(d2)); + n = d2; + } + + d2 = divide(maxD.minus(d0), d1, 0, 1, 1); + n0 = n0.plus(d2.times(n1)); + d0 = d0.plus(d2.times(d1)); + n0.s = n1.s = x.s; + + // Determine which fraction is closer to x, n0/d0 or n1/d1? + r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1 + ? [n1, d1] : [n0, d0]; + + Ctor.precision = pr; + external = true; + + return r; +}; + + +/* + * Return a string representing the value of this Decimal in base 16, round to `sd` significant + * digits using rounding mode `rm`. + * + * If the optional `sd` argument is present then return binary exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ +P.toHexadecimal = P.toHex = function (sd, rm) { + return toStringBinary(this, 16, sd, rm); +}; + + +/* + * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding + * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal. + * + * The return value will always have the same sign as this Decimal, unless either this Decimal + * or `y` is NaN, in which case the return value will be also be NaN. + * + * The return value is not affected by the value of `precision`. + * + * y {number|string|Decimal} The magnitude to round to a multiple of. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toNearest() rounding mode not an integer: {rm}' + * 'toNearest() rounding mode out of range: {rm}' + * + */ +P.toNearest = function (y, rm) { + var x = this, + Ctor = x.constructor; + + x = new Ctor(x); + + if (y == null) { + + // If x is not finite, return x. + if (!x.d) return x; + + y = new Ctor(1); + rm = Ctor.rounding; + } else { + y = new Ctor(y); + if (rm === void 0) { + rm = Ctor.rounding; + } else { + checkInt32(rm, 0, 8); + } + + // If x is not finite, return x if y is not NaN, else NaN. + if (!x.d) return y.s ? x : y; + + // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN. + if (!y.d) { + if (y.s) y.s = x.s; + return y; + } + } + + // If y is not zero, calculate the nearest multiple of y to x. + if (y.d[0]) { + external = false; + x = divide(x, y, 0, rm, 1).times(y); + external = true; + finalise(x); + + // If y is zero, return zero with the sign of x. + } else { + y.s = x.s; + x = y; + } + + return x; +}; + + +/* + * Return the value of this Decimal converted to a number primitive. + * Zero keeps its sign. + * + */ +P.toNumber = function () { + return +this; +}; + + +/* + * Return a string representing the value of this Decimal in base 8, round to `sd` significant + * digits using rounding mode `rm`. + * + * If the optional `sd` argument is present then return binary exponential notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ +P.toOctal = function (sd, rm) { + return toStringBinary(this, 8, sd, rm); +}; + + +/* + * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded + * to `precision` significant digits using rounding mode `rounding`. + * + * ECMAScript compliant. + * + * pow(x, NaN) = NaN + * pow(x, ±0) = 1 + + * pow(NaN, non-zero) = NaN + * pow(abs(x) > 1, +Infinity) = +Infinity + * pow(abs(x) > 1, -Infinity) = +0 + * pow(abs(x) == 1, ±Infinity) = NaN + * pow(abs(x) < 1, +Infinity) = +0 + * pow(abs(x) < 1, -Infinity) = +Infinity + * pow(+Infinity, y > 0) = +Infinity + * pow(+Infinity, y < 0) = +0 + * pow(-Infinity, odd integer > 0) = -Infinity + * pow(-Infinity, even integer > 0) = +Infinity + * pow(-Infinity, odd integer < 0) = -0 + * pow(-Infinity, even integer < 0) = +0 + * pow(+0, y > 0) = +0 + * pow(+0, y < 0) = +Infinity + * pow(-0, odd integer > 0) = -0 + * pow(-0, even integer > 0) = +0 + * pow(-0, odd integer < 0) = -Infinity + * pow(-0, even integer < 0) = +Infinity + * pow(finite x < 0, finite non-integer) = NaN + * + * For non-integer or very large exponents pow(x, y) is calculated using + * + * x^y = exp(y*ln(x)) + * + * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the + * probability of an incorrectly rounded result + * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14 + * i.e. 1 in 250,000,000,000,000 + * + * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place). + * + * y {number|string|Decimal} The power to which to raise this Decimal. + * + */ +P.toPower = P.pow = function (y) { + var e, k, pr, r, rm, s, + x = this, + Ctor = x.constructor, + yn = +(y = new Ctor(y)); + + // Either ±Infinity, NaN or ±0? + if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn)); + + x = new Ctor(x); + + if (x.eq(1)) return x; + + pr = Ctor.precision; + rm = Ctor.rounding; + + if (y.eq(1)) return finalise(x, pr, rm); + + // y exponent + e = mathfloor(y.e / LOG_BASE); + + // If y is a small integer use the 'exponentiation by squaring' algorithm. + if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) { + r = intPow(Ctor, x, k, pr); + return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm); + } + + s = x.s; + + // if x is negative + if (s < 0) { + + // if y is not an integer + if (e < y.d.length - 1) return new Ctor(NaN); + + // Result is positive if x is negative and the last digit of integer y is even. + if ((y.d[e] & 1) == 0) s = 1; + + // if x.eq(-1) + if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) { + x.s = s; + return x; + } + } + + // Estimate result exponent. + // x^y = 10^e, where e = y * log10(x) + // log10(x) = log10(x_significand) + x_exponent + // log10(x_significand) = ln(x_significand) / ln(10) + k = mathpow(+x, yn); + e = k == 0 || !isFinite(k) + ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1)) + : new Ctor(k + '').e; + + // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1. + + // Overflow/underflow? + if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0); + + external = false; + Ctor.rounding = x.s = 1; + + // Estimate the extra guard digits needed to ensure five correct rounding digits from + // naturalLogarithm(x). Example of failure without these extra digits (precision: 10): + // new Decimal(2.32456).pow('2087987436534566.46411') + // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815 + k = Math.min(12, (e + '').length); + + // r = x^y = exp(y*ln(x)) + r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr); + + // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40) + if (r.d) { + + // Truncate to the required precision plus five rounding digits. + r = finalise(r, pr + 5, 1); + + // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate + // the result. + if (checkRoundingDigits(r.d, pr, rm)) { + e = pr + 10; + + // Truncate to the increased precision plus five rounding digits. + r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1); + + // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9). + if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) { + r = finalise(r, pr + 1, 0); + } + } + } + + r.s = s; + external = true; + Ctor.rounding = rm; + + return finalise(r, pr, rm); +}; + + +/* + * Return a string representing the value of this Decimal rounded to `sd` significant digits + * using rounding mode `rounding`. + * + * Return exponential notation if `sd` is less than the number of digits necessary to represent + * the integer part of the value in normal notation. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + */ +P.toPrecision = function (sd, rm) { + var str, + x = this, + Ctor = x.constructor; + + if (sd === void 0) { + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + } else { + checkInt32(sd, 1, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + + x = finalise(new Ctor(x), sd, rm); + str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd); + } + + return x.isNeg() && !x.isZero() ? '-' + str : str; +}; + + +/* + * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd` + * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if + * omitted. + * + * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive. + * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive. + * + * 'toSD() digits out of range: {sd}' + * 'toSD() digits not an integer: {sd}' + * 'toSD() rounding mode not an integer: {rm}' + * 'toSD() rounding mode out of range: {rm}' + * + */ +P.toSignificantDigits = P.toSD = function (sd, rm) { + var x = this, + Ctor = x.constructor; + + if (sd === void 0) { + sd = Ctor.precision; + rm = Ctor.rounding; + } else { + checkInt32(sd, 1, MAX_DIGITS); + + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + } + + return finalise(new Ctor(x), sd, rm); +}; + + +/* + * Return a string representing the value of this Decimal. + * + * Return exponential notation if this Decimal has a positive exponent equal to or greater than + * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`. + * + */ +P.toString = function () { + var x = this, + Ctor = x.constructor, + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + + return x.isNeg() && !x.isZero() ? '-' + str : str; +}; + + +/* + * Return a new Decimal whose value is the value of this Decimal truncated to a whole number. + * + */ +P.truncated = P.trunc = function () { + return finalise(new this.constructor(this), this.e + 1, 1); +}; + + +/* + * Return a string representing the value of this Decimal. + * Unlike `toString`, negative zero will include the minus sign. + * + */ +P.valueOf = P.toJSON = function () { + var x = this, + Ctor = x.constructor, + str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos); + + return x.isNeg() ? '-' + str : str; +}; + + +/* +// Add aliases to match BigDecimal method names. +// P.add = P.plus; +P.subtract = P.minus; +P.multiply = P.times; +P.divide = P.div; +P.remainder = P.mod; +P.compareTo = P.cmp; +P.negate = P.neg; + */ + + +// Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers. + + +/* + * digitsToString P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower, + * finiteToString, naturalExponential, naturalLogarithm + * checkInt32 P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest, + * P.toPrecision, P.toSignificantDigits, toStringBinary, random + * checkRoundingDigits P.logarithm, P.toPower, naturalExponential, naturalLogarithm + * convertBase toStringBinary, parseOther + * cos P.cos + * divide P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy, + * P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction, + * P.toNearest, toStringBinary, naturalExponential, naturalLogarithm, + * taylorSeries, atan2, parseOther + * finalise P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh, + * P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus, + * P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot, + * P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed, + * P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits, + * P.truncated, divide, getLn10, getPi, naturalExponential, + * naturalLogarithm, ceil, floor, round, trunc + * finiteToString P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf, + * toStringBinary + * getBase10Exponent P.minus, P.plus, P.times, parseOther + * getLn10 P.logarithm, naturalLogarithm + * getPi P.acos, P.asin, P.atan, toLessThanHalfPi, atan2 + * getPrecision P.precision, P.toFraction + * getZeroString digitsToString, finiteToString + * intPow P.toPower, parseOther + * isOdd toLessThanHalfPi + * maxOrMin max, min + * naturalExponential P.naturalExponential, P.toPower + * naturalLogarithm P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm, + * P.toPower, naturalExponential + * nonFiniteToString finiteToString, toStringBinary + * parseDecimal Decimal + * parseOther Decimal + * sin P.sin + * taylorSeries P.cosh, P.sinh, cos, sin + * toLessThanHalfPi P.cos, P.sin + * toStringBinary P.toBinary, P.toHexadecimal, P.toOctal + * truncate intPow + * + * Throws: P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi, + * naturalLogarithm, config, parseOther, random, Decimal + */ + + +function digitsToString(d) { + var i, k, ws, + indexOfLastWord = d.length - 1, + str = '', + w = d[0]; + + if (indexOfLastWord > 0) { + str += w; + for (i = 1; i < indexOfLastWord; i++) { + ws = d[i] + ''; + k = LOG_BASE - ws.length; + if (k) str += getZeroString(k); + str += ws; + } + + w = d[i]; + ws = w + ''; + k = LOG_BASE - ws.length; + if (k) str += getZeroString(k); + } else if (w === 0) { + return '0'; + } + + // Remove trailing zeros of last w. + for (; w % 10 === 0;) w /= 10; + + return str + w; +} + + +function checkInt32(i, min, max) { + if (i !== ~~i || i < min || i > max) { + throw Error(invalidArgument + i); + } +} + + +/* + * Check 5 rounding digits if `repeating` is null, 4 otherwise. + * `repeating == null` if caller is `log` or `pow`, + * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`. + */ +function checkRoundingDigits(d, i, rm, repeating) { + var di, k, r, rd; + + // Get the length of the first word of the array d. + for (k = d[0]; k >= 10; k /= 10) --i; + + // Is the rounding digit in the first word of d? + if (--i < 0) { + i += LOG_BASE; + di = 0; + } else { + di = Math.ceil((i + 1) / LOG_BASE); + i %= LOG_BASE; + } + + // i is the index (0 - 6) of the rounding digit. + // E.g. if within the word 3487563 the first rounding digit is 5, + // then i = 4, k = 1000, rd = 3487563 % 1000 = 563 + k = mathpow(10, LOG_BASE - i); + rd = d[di] % k | 0; + + if (repeating == null) { + if (i < 3) { + if (i == 0) rd = rd / 100 | 0; + else if (i == 1) rd = rd / 10 | 0; + r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0; + } else { + r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) && + (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 || + (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0; + } + } else { + if (i < 4) { + if (i == 0) rd = rd / 1000 | 0; + else if (i == 1) rd = rd / 100 | 0; + else if (i == 2) rd = rd / 10 | 0; + r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999; + } else { + r = ((repeating || rm < 4) && rd + 1 == k || + (!repeating && rm > 3) && rd + 1 == k / 2) && + (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1; + } + } + + return r; +} + + +// Convert string of `baseIn` to an array of numbers of `baseOut`. +// Eg. convertBase('255', 10, 16) returns [15, 15]. +// Eg. convertBase('ff', 16, 10) returns [2, 5, 5]. +function convertBase(str, baseIn, baseOut) { + var j, + arr = [0], + arrL, + i = 0, + strL = str.length; + + for (; i < strL;) { + for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn; + arr[0] += NUMERALS.indexOf(str.charAt(i++)); + for (j = 0; j < arr.length; j++) { + if (arr[j] > baseOut - 1) { + if (arr[j + 1] === void 0) arr[j + 1] = 0; + arr[j + 1] += arr[j] / baseOut | 0; + arr[j] %= baseOut; + } + } + } + + return arr.reverse(); +} + + +/* + * cos(x) = 1 - x^2/2! + x^4/4! - ... + * |x| < pi/2 + * + */ +function cosine(Ctor, x) { + var k, y, + len = x.d.length; + + // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1 + // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1 + + // Estimate the optimum number of times to use the argument reduction. + if (len < 32) { + k = Math.ceil(len / 3); + y = (1 / tinyPow(4, k)).toString(); + } else { + k = 16; + y = '2.3283064365386962890625e-10'; + } + + Ctor.precision += k; + + x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1)); + + // Reverse argument reduction + for (var i = k; i--;) { + var cos2x = x.times(x); + x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1); + } + + Ctor.precision -= k; + + return x; +} + + +/* + * Perform division in the specified base. + */ +var divide = (function () { + + // Assumes non-zero x and k, and hence non-zero result. + function multiplyInteger(x, k, base) { + var temp, + carry = 0, + i = x.length; + + for (x = x.slice(); i--;) { + temp = x[i] * k + carry; + x[i] = temp % base | 0; + carry = temp / base | 0; + } + + if (carry) x.unshift(carry); + + return x; + } + + function compare(a, b, aL, bL) { + var i, r; + + if (aL != bL) { + r = aL > bL ? 1 : -1; + } else { + for (i = r = 0; i < aL; i++) { + if (a[i] != b[i]) { + r = a[i] > b[i] ? 1 : -1; + break; + } + } + } + + return r; + } + + function subtract(a, b, aL, base) { + var i = 0; + + // Subtract b from a. + for (; aL--;) { + a[aL] -= i; + i = a[aL] < b[aL] ? 1 : 0; + a[aL] = i * base + a[aL] - b[aL]; + } + + // Remove leading zeros. + for (; !a[0] && a.length > 1;) a.shift(); + } + + return function (x, y, pr, rm, dp, base) { + var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0, + yL, yz, + Ctor = x.constructor, + sign = x.s == y.s ? 1 : -1, + xd = x.d, + yd = y.d; + + // Either NaN, Infinity or 0? + if (!xd || !xd[0] || !yd || !yd[0]) { + + return new Ctor(// Return NaN if either NaN, or both Infinity or 0. + !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN : + + // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0. + xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0); + } + + if (base) { + logBase = 1; + e = x.e - y.e; + } else { + base = BASE; + logBase = LOG_BASE; + e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase); + } + + yL = yd.length; + xL = xd.length; + q = new Ctor(sign); + qd = q.d = []; + + // Result exponent may be one less than e. + // The digit array of a Decimal from toStringBinary may have trailing zeros. + for (i = 0; yd[i] == (xd[i] || 0); i++); + + if (yd[i] > (xd[i] || 0)) e--; + + if (pr == null) { + sd = pr = Ctor.precision; + rm = Ctor.rounding; + } else if (dp) { + sd = pr + (x.e - y.e) + 1; + } else { + sd = pr; + } + + if (sd < 0) { + qd.push(1); + more = true; + } else { + + // Convert precision in number of base 10 digits to base 1e7 digits. + sd = sd / logBase + 2 | 0; + i = 0; + + // divisor < 1e7 + if (yL == 1) { + k = 0; + yd = yd[0]; + sd++; + + // k is the carry. + for (; (i < xL || k) && sd--; i++) { + t = k * base + (xd[i] || 0); + qd[i] = t / yd | 0; + k = t % yd | 0; + } + + more = k || i < xL; + + // divisor >= 1e7 + } else { + + // Normalise xd and yd so highest order digit of yd is >= base/2 + k = base / (yd[0] + 1) | 0; + + if (k > 1) { + yd = multiplyInteger(yd, k, base); + xd = multiplyInteger(xd, k, base); + yL = yd.length; + xL = xd.length; + } + + xi = yL; + rem = xd.slice(0, yL); + remL = rem.length; + + // Add zeros to make remainder as long as divisor. + for (; remL < yL;) rem[remL++] = 0; + + yz = yd.slice(); + yz.unshift(0); + yd0 = yd[0]; + + if (yd[1] >= base / 2) ++yd0; + + do { + k = 0; + + // Compare divisor and remainder. + cmp = compare(yd, rem, yL, remL); + + // If divisor < remainder. + if (cmp < 0) { + + // Calculate trial digit, k. + rem0 = rem[0]; + if (yL != remL) rem0 = rem0 * base + (rem[1] || 0); + + // k will be how many times the divisor goes into the current remainder. + k = rem0 / yd0 | 0; + + // Algorithm: + // 1. product = divisor * trial digit (k) + // 2. if product > remainder: product -= divisor, k-- + // 3. remainder -= product + // 4. if product was < remainder at 2: + // 5. compare new remainder and divisor + // 6. If remainder > divisor: remainder -= divisor, k++ + + if (k > 1) { + if (k >= base) k = base - 1; + + // product = divisor * trial digit. + prod = multiplyInteger(yd, k, base); + prodL = prod.length; + remL = rem.length; + + // Compare product and remainder. + cmp = compare(prod, rem, prodL, remL); + + // product > remainder. + if (cmp == 1) { + k--; + + // Subtract divisor from product. + subtract(prod, yL < prodL ? yz : yd, prodL, base); + } + } else { + + // cmp is -1. + // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1 + // to avoid it. If k is 1 there is a need to compare yd and rem again below. + if (k == 0) cmp = k = 1; + prod = yd.slice(); + } + + prodL = prod.length; + if (prodL < remL) prod.unshift(0); + + // Subtract product from remainder. + subtract(rem, prod, remL, base); + + // If product was < previous remainder. + if (cmp == -1) { + remL = rem.length; + + // Compare divisor and new remainder. + cmp = compare(yd, rem, yL, remL); + + // If divisor < new remainder, subtract divisor from remainder. + if (cmp < 1) { + k++; + + // Subtract divisor from remainder. + subtract(rem, yL < remL ? yz : yd, remL, base); + } + } + + remL = rem.length; + } else if (cmp === 0) { + k++; + rem = [0]; + } // if cmp === 1, k will be 0 + + // Add the next digit, k, to the result array. + qd[i++] = k; + + // Update the remainder. + if (cmp && rem[0]) { + rem[remL++] = xd[xi] || 0; + } else { + rem = [xd[xi]]; + remL = 1; + } + + } while ((xi++ < xL || rem[0] !== void 0) && sd--); + + more = rem[0] !== void 0; + } + + // Leading zero? + if (!qd[0]) qd.shift(); + } + + // logBase is 1 when divide is being used for base conversion. + if (logBase == 1) { + q.e = e; + inexact = more; + } else { + + // To calculate q.e, first get the number of digits of qd[0]. + for (i = 1, k = qd[0]; k >= 10; k /= 10) i++; + q.e = i + e * logBase - 1; + + finalise(q, dp ? pr + q.e + 1 : pr, rm, more); + } + + return q; + }; +})(); + + +/* + * Round `x` to `sd` significant digits using rounding mode `rm`. + * Check for over/under-flow. + */ + function finalise(x, sd, rm, isTruncated) { + var digits, i, j, k, rd, roundUp, w, xd, xdi, + Ctor = x.constructor; + + // Don't round if sd is null or undefined. + out: if (sd != null) { + xd = x.d; + + // Infinity/NaN. + if (!xd) return x; + + // rd: the rounding digit, i.e. the digit after the digit that may be rounded up. + // w: the word of xd containing rd, a base 1e7 number. + // xdi: the index of w within xd. + // digits: the number of digits of w. + // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if + // they had leading zeros) + // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero). + + // Get the length of the first word of the digits array xd. + for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++; + i = sd - digits; + + // Is the rounding digit in the first word of xd? + if (i < 0) { + i += LOG_BASE; + j = sd; + w = xd[xdi = 0]; + + // Get the rounding digit at index j of w. + rd = w / mathpow(10, digits - j - 1) % 10 | 0; + } else { + xdi = Math.ceil((i + 1) / LOG_BASE); + k = xd.length; + if (xdi >= k) { + if (isTruncated) { + + // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`. + for (; k++ <= xdi;) xd.push(0); + w = rd = 0; + digits = 1; + i %= LOG_BASE; + j = i - LOG_BASE + 1; + } else { + break out; + } + } else { + w = k = xd[xdi]; + + // Get the number of digits of w. + for (digits = 1; k >= 10; k /= 10) digits++; + + // Get the index of rd within w. + i %= LOG_BASE; + + // Get the index of rd within w, adjusted for leading zeros. + // The number of leading zeros of w is given by LOG_BASE - digits. + j = i - LOG_BASE + digits; + + // Get the rounding digit at index j of w. + rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0; + } + } + + // Are there any non-zero digits after the rounding digit? + isTruncated = isTruncated || sd < 0 || + xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1)); + + // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right + // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression + // will give 714. + + roundUp = rm < 4 + ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2)) + : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 && + + // Check whether the digit to the left of the rounding digit is odd. + ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 || + rm == (x.s < 0 ? 8 : 7)); + + if (sd < 1 || !xd[0]) { + xd.length = 0; + if (roundUp) { + + // Convert sd to decimal places. + sd -= x.e + 1; + + // 1, 0.1, 0.01, 0.001, 0.0001 etc. + xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE); + x.e = -sd || 0; + } else { + + // Zero. + xd[0] = x.e = 0; + } + + return x; + } + + // Remove excess digits. + if (i == 0) { + xd.length = xdi; + k = 1; + xdi--; + } else { + xd.length = xdi + 1; + k = mathpow(10, LOG_BASE - i); + + // E.g. 56700 becomes 56000 if 7 is the rounding digit. + // j > 0 means i > number of leading zeros of w. + xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0; + } + + if (roundUp) { + for (;;) { + + // Is the digit to be rounded up in the first word of xd? + if (xdi == 0) { + + // i will be the length of xd[0] before k is added. + for (i = 1, j = xd[0]; j >= 10; j /= 10) i++; + j = xd[0] += k; + for (k = 1; j >= 10; j /= 10) k++; + + // if i != k the length has increased. + if (i != k) { + x.e++; + if (xd[0] == BASE) xd[0] = 1; + } + + break; + } else { + xd[xdi] += k; + if (xd[xdi] != BASE) break; + xd[xdi--] = 0; + k = 1; + } + } + } + + // Remove trailing zeros. + for (i = xd.length; xd[--i] === 0;) xd.pop(); + } + + if (external) { + + // Overflow? + if (x.e > Ctor.maxE) { + + // Infinity. + x.d = null; + x.e = NaN; + + // Underflow? + } else if (x.e < Ctor.minE) { + + // Zero. + x.e = 0; + x.d = [0]; + // Ctor.underflow = true; + } // else Ctor.underflow = false; + } + + return x; +} + + +function finiteToString(x, isExp, sd) { + if (!x.isFinite()) return nonFiniteToString(x); + var k, + e = x.e, + str = digitsToString(x.d), + len = str.length; + + if (isExp) { + if (sd && (k = sd - len) > 0) { + str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k); + } else if (len > 1) { + str = str.charAt(0) + '.' + str.slice(1); + } + + str = str + (x.e < 0 ? 'e' : 'e+') + x.e; + } else if (e < 0) { + str = '0.' + getZeroString(-e - 1) + str; + if (sd && (k = sd - len) > 0) str += getZeroString(k); + } else if (e >= len) { + str += getZeroString(e + 1 - len); + if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k); + } else { + if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k); + if (sd && (k = sd - len) > 0) { + if (e + 1 === len) str += '.'; + str += getZeroString(k); + } + } + + return str; +} + + +// Calculate the base 10 exponent from the base 1e7 exponent. +function getBase10Exponent(digits, e) { + var w = digits[0]; + + // Add the number of digits of the first word of the digits array. + for ( e *= LOG_BASE; w >= 10; w /= 10) e++; + return e; +} + + +function getLn10(Ctor, sd, pr) { + if (sd > LN10_PRECISION) { + + // Reset global state in case the exception is caught. + external = true; + if (pr) Ctor.precision = pr; + throw Error(precisionLimitExceeded); + } + return finalise(new Ctor(LN10), sd, 1, true); +} + + +function getPi(Ctor, sd, rm) { + if (sd > PI_PRECISION) throw Error(precisionLimitExceeded); + return finalise(new Ctor(PI), sd, rm, true); +} + + +function getPrecision(digits) { + var w = digits.length - 1, + len = w * LOG_BASE + 1; + + w = digits[w]; + + // If non-zero... + if (w) { + + // Subtract the number of trailing zeros of the last word. + for (; w % 10 == 0; w /= 10) len--; + + // Add the number of digits of the first word. + for (w = digits[0]; w >= 10; w /= 10) len++; + } + + return len; +} + + +function getZeroString(k) { + var zs = ''; + for (; k--;) zs += '0'; + return zs; +} + + +/* + * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an + * integer of type number. + * + * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`. + * + */ +function intPow(Ctor, x, n, pr) { + var isTruncated, + r = new Ctor(1), + + // Max n of 9007199254740991 takes 53 loop iterations. + // Maximum digits array length; leaves [28, 34] guard digits. + k = Math.ceil(pr / LOG_BASE + 4); + + external = false; + + for (;;) { + if (n % 2) { + r = r.times(x); + if (truncate(r.d, k)) isTruncated = true; + } + + n = mathfloor(n / 2); + if (n === 0) { + + // To ensure correct rounding when r.d is truncated, increment the last word if it is zero. + n = r.d.length - 1; + if (isTruncated && r.d[n] === 0) ++r.d[n]; + break; + } + + x = x.times(x); + truncate(x.d, k); + } + + external = true; + + return r; +} + + +function isOdd(n) { + return n.d[n.d.length - 1] & 1; +} + + +/* + * Handle `max` and `min`. `ltgt` is 'lt' or 'gt'. + */ +function maxOrMin(Ctor, args, ltgt) { + var y, + x = new Ctor(args[0]), + i = 0; + + for (; ++i < args.length;) { + y = new Ctor(args[i]); + if (!y.s) { + x = y; + break; + } else if (x[ltgt](y)) { + x = y; + } + } + + return x; +} + + +/* + * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant + * digits. + * + * Taylor/Maclaurin series. + * + * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ... + * + * Argument reduction: + * Repeat x = x / 32, k += 5, until |x| < 0.1 + * exp(x) = exp(x / 2^k)^(2^k) + * + * Previously, the argument was initially reduced by + * exp(x) = exp(r) * 10^k where r = x - k * ln10, k = floor(x / ln10) + * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was + * found to be slower than just dividing repeatedly by 32 as above. + * + * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000 + * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000 + * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324) + * + * exp(Infinity) = Infinity + * exp(-Infinity) = 0 + * exp(NaN) = NaN + * exp(±0) = 1 + * + * exp(x) is non-terminating for any finite, non-zero x. + * + * The result will always be correctly rounded. + * + */ +function naturalExponential(x, sd) { + var denominator, guard, j, pow, sum, t, wpr, + rep = 0, + i = 0, + k = 0, + Ctor = x.constructor, + rm = Ctor.rounding, + pr = Ctor.precision; + + // 0/NaN/Infinity? + if (!x.d || !x.d[0] || x.e > 17) { + + return new Ctor(x.d + ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0 + : x.s ? x.s < 0 ? 0 : x : 0 / 0); + } + + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + + t = new Ctor(0.03125); + + // while abs(x) >= 0.1 + while (x.e > -2) { + + // x = x / 2^5 + x = x.times(t); + k += 5; + } + + // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision + // necessary to ensure the first 4 rounding digits are correct. + guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0; + wpr += guard; + denominator = pow = sum = new Ctor(1); + Ctor.precision = wpr; + + for (;;) { + pow = finalise(pow.times(x), wpr, 1); + denominator = denominator.times(++i); + t = sum.plus(divide(pow, denominator, wpr, 1)); + + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) { + j = k; + while (j--) sum = finalise(sum.times(sum), wpr, 1); + + // Check to see if the first 4 rounding digits are [49]999. + // If so, repeat the summation with a higher precision, otherwise + // e.g. with precision: 18, rounding: 1 + // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123) + // `wpr - guard` is the index of first rounding digit. + if (sd == null) { + + if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += 10; + denominator = pow = t = new Ctor(1); + i = 0; + rep++; + } else { + return finalise(sum, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum; + } + } + + sum = t; + } +} + + +/* + * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant + * digits. + * + * ln(-n) = NaN + * ln(0) = -Infinity + * ln(-0) = -Infinity + * ln(1) = 0 + * ln(Infinity) = Infinity + * ln(-Infinity) = NaN + * ln(NaN) = NaN + * + * ln(n) (n != 1) is non-terminating. + * + */ +function naturalLogarithm(y, sd) { + var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2, + n = 1, + guard = 10, + x = y, + xd = x.d, + Ctor = x.constructor, + rm = Ctor.rounding, + pr = Ctor.precision; + + // Is x negative or Infinity, NaN, 0 or 1? + if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) { + return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x); + } + + if (sd == null) { + external = false; + wpr = pr; + } else { + wpr = sd; + } + + Ctor.precision = wpr += guard; + c = digitsToString(xd); + c0 = c.charAt(0); + + if (Math.abs(e = x.e) < 1.5e15) { + + // Argument reduction. + // The series converges faster the closer the argument is to 1, so using + // ln(a^b) = b * ln(a), ln(a) = ln(a^b) / b + // multiply the argument by itself until the leading digits of the significand are 7, 8, 9, + // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can + // later be divided by this number, then separate out the power of 10 using + // ln(a*10^b) = ln(a) + b*ln(10). + + // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14). + //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) { + // max n is 6 (gives 0.7 - 1.3) + while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) { + x = x.times(y); + c = digitsToString(x.d); + c0 = c.charAt(0); + n++; + } + + e = x.e; + + if (c0 > 1) { + x = new Ctor('0.' + c); + e++; + } else { + x = new Ctor(c0 + '.' + c.slice(1)); + } + } else { + + // The argument reduction method above may result in overflow if the argument y is a massive + // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this + // function using ln(x*10^e) = ln(x) + e*ln(10). + t = getLn10(Ctor, wpr + 2, pr).times(e + ''); + x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t); + Ctor.precision = pr; + + return sd == null ? finalise(x, pr, rm, external = true) : x; + } + + // x1 is x reduced to a value near 1. + x1 = x; + + // Taylor series. + // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...) + // where x = (y - 1)/(y + 1) (|x| < 1) + sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = 3; + + for (;;) { + numerator = finalise(numerator.times(x2), wpr, 1); + t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1)); + + if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) { + sum = sum.times(2); + + // Reverse the argument reduction. Check that e is not 0 because, besides preventing an + // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0. + if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + '')); + sum = divide(sum, new Ctor(n), wpr, 1); + + // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has + // been repeated previously) and the first 4 rounding digits 9999? + // If so, restart the summation with a higher precision, otherwise + // e.g. with precision: 12, rounding: 1 + // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463. + // `wpr - guard` is the index of first rounding digit. + if (sd == null) { + if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) { + Ctor.precision = wpr += guard; + t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1); + x2 = finalise(x.times(x), wpr, 1); + denominator = rep = 1; + } else { + return finalise(sum, Ctor.precision = pr, rm, external = true); + } + } else { + Ctor.precision = pr; + return sum; + } + } + + sum = t; + denominator += 2; + } +} + + +// ±Infinity, NaN. +function nonFiniteToString(x) { + // Unsigned. + return String(x.s * x.s / 0); +} + + +/* + * Parse the value of a new Decimal `x` from string `str`. + */ +function parseDecimal(x, str) { + var e, i, len; + + // Decimal point? + if ((e = str.indexOf('.')) > -1) str = str.replace('.', ''); + + // Exponential form? + if ((i = str.search(/e/i)) > 0) { + + // Determine exponent. + if (e < 0) e = i; + e += +str.slice(i + 1); + str = str.substring(0, i); + } else if (e < 0) { + + // Integer. + e = str.length; + } + + // Determine leading zeros. + for (i = 0; str.charCodeAt(i) === 48; i++); + + // Determine trailing zeros. + for (len = str.length; str.charCodeAt(len - 1) === 48; --len); + str = str.slice(i, len); + + if (str) { + len -= i; + x.e = e = e - i - 1; + x.d = []; + + // Transform base + + // e is the base 10 exponent. + // i is where to slice str to get the first word of the digits array. + i = (e + 1) % LOG_BASE; + if (e < 0) i += LOG_BASE; + + if (i < len) { + if (i) x.d.push(+str.slice(0, i)); + for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE)); + str = str.slice(i); + i = LOG_BASE - str.length; + } else { + i -= len; + } + + for (; i--;) str += '0'; + x.d.push(+str); + + if (external) { + + // Overflow? + if (x.e > x.constructor.maxE) { + + // Infinity. + x.d = null; + x.e = NaN; + + // Underflow? + } else if (x.e < x.constructor.minE) { + + // Zero. + x.e = 0; + x.d = [0]; + // x.constructor.underflow = true; + } // else x.constructor.underflow = false; + } + } else { + + // Zero. + x.e = 0; + x.d = [0]; + } + + return x; +} + + +/* + * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value. + */ +function parseOther(x, str) { + var base, Ctor, divisor, i, isFloat, len, p, xd, xe; + + if (str === 'Infinity' || str === 'NaN') { + if (!+str) x.s = NaN; + x.e = NaN; + x.d = null; + return x; + } + + if (isHex.test(str)) { + base = 16; + str = str.toLowerCase(); + } else if (isBinary.test(str)) { + base = 2; + } else if (isOctal.test(str)) { + base = 8; + } else { + throw Error(invalidArgument + str); + } + + // Is there a binary exponent part? + i = str.search(/p/i); + + if (i > 0) { + p = +str.slice(i + 1); + str = str.substring(2, i); + } else { + str = str.slice(2); + } + + // Convert `str` as an integer then divide the result by `base` raised to a power such that the + // fraction part will be restored. + i = str.indexOf('.'); + isFloat = i >= 0; + Ctor = x.constructor; + + if (isFloat) { + str = str.replace('.', ''); + len = str.length; + i = len - i; + + // log[10](16) = 1.2041... , log[10](88) = 1.9444.... + divisor = intPow(Ctor, new Ctor(base), i, i * 2); + } + + xd = convertBase(str, base, BASE); + xe = xd.length - 1; + + // Remove trailing zeros. + for (i = xe; xd[i] === 0; --i) xd.pop(); + if (i < 0) return new Ctor(x.s * 0); + x.e = getBase10Exponent(xd, xe); + x.d = xd; + external = false; + + // At what precision to perform the division to ensure exact conversion? + // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount) + // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412 + // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits. + // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount + // Therefore using 4 * the number of digits of str will always be enough. + if (isFloat) x = divide(x, divisor, len * 4); + + // Multiply by the binary exponent part if present. + if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p)); + external = true; + + return x; +} + + +/* + * sin(x) = x - x^3/3! + x^5/5! - ... + * |x| < pi/2 + * + */ +function sine(Ctor, x) { + var k, + len = x.d.length; + + if (len < 3) return taylorSeries(Ctor, 2, x, x); + + // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x) + // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5) + // and sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20)) + + // Estimate the optimum number of times to use the argument reduction. + k = 1.4 * Math.sqrt(len); + k = k > 16 ? 16 : k | 0; + + x = x.times(1 / tinyPow(5, k)); + x = taylorSeries(Ctor, 2, x, x); + + // Reverse argument reduction + var sin2_x, + d5 = new Ctor(5), + d16 = new Ctor(16), + d20 = new Ctor(20); + for (; k--;) { + sin2_x = x.times(x); + x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20)))); + } + + return x; +} + + +// Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`. +function taylorSeries(Ctor, n, x, y, isHyperbolic) { + var j, t, u, x2, + i = 1, + pr = Ctor.precision, + k = Math.ceil(pr / LOG_BASE); + + external = false; + x2 = x.times(x); + u = new Ctor(y); + + for (;;) { + t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1); + u = isHyperbolic ? y.plus(t) : y.minus(t); + y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1); + t = u.plus(y); + + if (t.d[k] !== void 0) { + for (j = k; t.d[j] === u.d[j] && j--;); + if (j == -1) break; + } + + j = u; + u = y; + y = t; + t = j; + i++; + } + + external = true; + t.d.length = k + 1; + + return t; +} + + +// Exponent e must be positive and non-zero. +function tinyPow(b, e) { + var n = b; + while (--e) n *= b; + return n; +} + + +// Return the absolute value of `x` reduced to less than or equal to half pi. +function toLessThanHalfPi(Ctor, x) { + var t, + isNeg = x.s < 0, + pi = getPi(Ctor, Ctor.precision, 1), + halfPi = pi.times(0.5); + + x = x.abs(); + + if (x.lte(halfPi)) { + quadrant = isNeg ? 4 : 1; + return x; + } + + t = x.divToInt(pi); + + if (t.isZero()) { + quadrant = isNeg ? 3 : 2; + } else { + x = x.minus(t.times(pi)); + + // 0 <= x < pi + if (x.lte(halfPi)) { + quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1); + return x; + } + + quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2); + } + + return x.minus(pi).abs(); +} + + +/* + * Return the value of Decimal `x` as a string in base `baseOut`. + * + * If the optional `sd` argument is present include a binary exponent suffix. + */ +function toStringBinary(x, baseOut, sd, rm) { + var base, e, i, k, len, roundUp, str, xd, y, + Ctor = x.constructor, + isExp = sd !== void 0; + + if (isExp) { + checkInt32(sd, 1, MAX_DIGITS); + if (rm === void 0) rm = Ctor.rounding; + else checkInt32(rm, 0, 8); + } else { + sd = Ctor.precision; + rm = Ctor.rounding; + } + + if (!x.isFinite()) { + str = nonFiniteToString(x); + } else { + str = finiteToString(x); + i = str.indexOf('.'); + + // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required: + // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10)) + // minBinaryExponent = floor(decimalExponent * log[2](10)) + // log[2](10) = 3.321928094887362347870319429489390175864 + + if (isExp) { + base = 2; + if (baseOut == 16) { + sd = sd * 4 - 3; + } else if (baseOut == 8) { + sd = sd * 3 - 2; + } + } else { + base = baseOut; + } + + // Convert the number as an integer then divide the result by its base raised to a power such + // that the fraction part will be restored. + + // Non-integer. + if (i >= 0) { + str = str.replace('.', ''); + y = new Ctor(1); + y.e = str.length - i; + y.d = convertBase(finiteToString(y), 10, base); + y.e = y.d.length; + } + + xd = convertBase(str, 10, base); + e = len = xd.length; + + // Remove trailing zeros. + for (; xd[--len] == 0;) xd.pop(); + + if (!xd[0]) { + str = isExp ? '0p+0' : '0'; + } else { + if (i < 0) { + e--; + } else { + x = new Ctor(x); + x.d = xd; + x.e = e; + x = divide(x, y, sd, rm, 0, base); + xd = x.d; + e = x.e; + roundUp = inexact; + } + + // The rounding digit, i.e. the digit after the digit that may be rounded up. + i = xd[sd]; + k = base / 2; + roundUp = roundUp || xd[sd + 1] !== void 0; + + roundUp = rm < 4 + ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2)) + : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 || + rm === (x.s < 0 ? 8 : 7)); + + xd.length = sd; + + if (roundUp) { + + // Rounding up may mean the previous digit has to be rounded up and so on. + for (; ++xd[--sd] > base - 1;) { + xd[sd] = 0; + if (!sd) { + ++e; + xd.unshift(1); + } + } + } + + // Determine trailing zeros. + for (len = xd.length; !xd[len - 1]; --len); + + // E.g. [4, 11, 15] becomes 4bf. + for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]); + + // Add binary exponent suffix? + if (isExp) { + if (len > 1) { + if (baseOut == 16 || baseOut == 8) { + i = baseOut == 16 ? 4 : 3; + for (--len; len % i; len++) str += '0'; + xd = convertBase(str, base, baseOut); + for (len = xd.length; !xd[len - 1]; --len); + + // xd[0] will always be be 1 + for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]); + } else { + str = str.charAt(0) + '.' + str.slice(1); + } + } + + str = str + (e < 0 ? 'p' : 'p+') + e; + } else if (e < 0) { + for (; ++e;) str = '0' + str; + str = '0.' + str; + } else { + if (++e > len) for (e -= len; e-- ;) str += '0'; + else if (e < len) str = str.slice(0, e) + '.' + str.slice(e); + } + } + + str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str; + } + + return x.s < 0 ? '-' + str : str; +} + + +// Does not strip trailing zeros. +function truncate(arr, len) { + if (arr.length > len) { + arr.length = len; + return true; + } +} + + +// Decimal methods + + +/* + * abs + * acos + * acosh + * add + * asin + * asinh + * atan + * atanh + * atan2 + * cbrt + * ceil + * clone + * config + * cos + * cosh + * div + * exp + * floor + * hypot + * ln + * log + * log2 + * log10 + * max + * min + * mod + * mul + * pow + * random + * round + * set + * sign + * sin + * sinh + * sqrt + * sub + * tan + * tanh + * trunc + */ + + +/* + * Return a new Decimal whose value is the absolute value of `x`. + * + * x {number|string|Decimal} + * + */ +function abs(x) { + return new this(x).abs(); +} + + +/* + * Return a new Decimal whose value is the arccosine in radians of `x`. + * + * x {number|string|Decimal} + * + */ +function acos(x) { + return new this(x).acos(); +} + + +/* + * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ +function acosh(x) { + return new this(x).acosh(); +} + + +/* + * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ +function add(x, y) { + return new this(x).plus(y); +} + + +/* + * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ +function asin(x) { + return new this(x).asin(); +} + + +/* + * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ +function asinh(x) { + return new this(x).asinh(); +} + + +/* + * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ +function atan(x) { + return new this(x).atan(); +} + + +/* + * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to + * `precision` significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ +function atanh(x) { + return new this(x).atanh(); +} + + +/* + * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi + * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`. + * + * Domain: [-Infinity, Infinity] + * Range: [-pi, pi] + * + * y {number|string|Decimal} The y-coordinate. + * x {number|string|Decimal} The x-coordinate. + * + * atan2(±0, -0) = ±pi + * atan2(±0, +0) = ±0 + * atan2(±0, -x) = ±pi for x > 0 + * atan2(±0, x) = ±0 for x > 0 + * atan2(-y, ±0) = -pi/2 for y > 0 + * atan2(y, ±0) = pi/2 for y > 0 + * atan2(±y, -Infinity) = ±pi for finite y > 0 + * atan2(±y, +Infinity) = ±0 for finite y > 0 + * atan2(±Infinity, x) = ±pi/2 for finite x + * atan2(±Infinity, -Infinity) = ±3*pi/4 + * atan2(±Infinity, +Infinity) = ±pi/4 + * atan2(NaN, x) = NaN + * atan2(y, NaN) = NaN + * + */ +function atan2(y, x) { + y = new this(y); + x = new this(x); + var r, + pr = this.precision, + rm = this.rounding, + wpr = pr + 4; + + // Either NaN + if (!y.s || !x.s) { + r = new this(NaN); + + // Both ±Infinity + } else if (!y.d && !x.d) { + r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75); + r.s = y.s; + + // x is ±Infinity or y is ±0 + } else if (!x.d || y.isZero()) { + r = x.s < 0 ? getPi(this, pr, rm) : new this(0); + r.s = y.s; + + // y is ±Infinity or x is ±0 + } else if (!y.d || x.isZero()) { + r = getPi(this, wpr, 1).times(0.5); + r.s = y.s; + + // Both non-zero and finite + } else if (x.s < 0) { + this.precision = wpr; + this.rounding = 1; + r = this.atan(divide(y, x, wpr, 1)); + x = getPi(this, wpr, 1); + this.precision = pr; + this.rounding = rm; + r = y.s < 0 ? r.minus(x) : r.plus(x); + } else { + r = this.atan(divide(y, x, wpr, 1)); + } + + return r; +} + + +/* + * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ +function cbrt(x) { + return new this(x).cbrt(); +} + + +/* + * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`. + * + * x {number|string|Decimal} + * + */ +function ceil(x) { + return finalise(x = new this(x), x.e + 1, 2); +} + + +/* + * Configure global settings for a Decimal constructor. + * + * `obj` is an object with one or more of the following properties, + * + * precision {number} + * rounding {number} + * toExpNeg {number} + * toExpPos {number} + * maxE {number} + * minE {number} + * modulo {number} + * crypto {boolean|number} + * defaults {true} + * + * E.g. Decimal.config({ precision: 20, rounding: 4 }) + * + */ +function config(obj) { + if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected'); + var i, p, v, + useDefaults = obj.defaults === true, + ps = [ + 'precision', 1, MAX_DIGITS, + 'rounding', 0, 8, + 'toExpNeg', -EXP_LIMIT, 0, + 'toExpPos', 0, EXP_LIMIT, + 'maxE', 0, EXP_LIMIT, + 'minE', -EXP_LIMIT, 0, + 'modulo', 0, 9 + ]; + + for (i = 0; i < ps.length; i += 3) { + if (p = ps[i], useDefaults) this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v; + else throw Error(invalidArgument + p + ': ' + v); + } + } + + if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p]; + if ((v = obj[p]) !== void 0) { + if (v === true || v === false || v === 0 || v === 1) { + if (v) { + if (typeof crypto != 'undefined' && crypto && + (crypto.getRandomValues || crypto.randomBytes)) { + this[p] = true; + } else { + throw Error(cryptoUnavailable); + } + } else { + this[p] = false; + } + } else { + throw Error(invalidArgument + p + ': ' + v); + } + } + + return this; +} + + +/* + * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ +function cos(x) { + return new this(x).cos(); +} + + +/* + * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ +function cosh(x) { + return new this(x).cosh(); +} + + +/* + * Create and return a Decimal constructor with the same configuration properties as this Decimal + * constructor. + * + */ +function clone(obj) { + var i, p, ps; + + /* + * The Decimal constructor and exported function. + * Return a new Decimal instance. + * + * v {number|string|Decimal} A numeric value. + * + */ + function Decimal(v) { + var e, i, t, + x = this; + + // Decimal called without new. + if (!(x instanceof Decimal)) return new Decimal(v); + + // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor + // which points to Object. + x.constructor = Decimal; + + // Duplicate. + if (v instanceof Decimal) { + x.s = v.s; + + if (external) { + if (!v.d || v.e > Decimal.maxE) { + + // Infinity. + x.e = NaN; + x.d = null; + } else if (v.e < Decimal.minE) { + + // Zero. + x.e = 0; + x.d = [0]; + } else { + x.e = v.e; + x.d = v.d.slice(); + } + } else { + x.e = v.e; + x.d = v.d ? v.d.slice() : v.d; + } + + return; + } + + t = typeof v; + + if (t === 'number') { + if (v === 0) { + x.s = 1 / v < 0 ? -1 : 1; + x.e = 0; + x.d = [0]; + return; + } + + if (v < 0) { + v = -v; + x.s = -1; + } else { + x.s = 1; + } + + // Fast path for small integers. + if (v === ~~v && v < 1e7) { + for (e = 0, i = v; i >= 10; i /= 10) e++; + + if (external) { + if (e > Decimal.maxE) { + x.e = NaN; + x.d = null; + } else if (e < Decimal.minE) { + x.e = 0; + x.d = [0]; + } else { + x.e = e; + x.d = [v]; + } + } else { + x.e = e; + x.d = [v]; + } + + return; + + // Infinity, NaN. + } else if (v * 0 !== 0) { + if (!v) x.s = NaN; + x.e = NaN; + x.d = null; + return; + } + + return parseDecimal(x, v.toString()); + + } else if (t !== 'string') { + throw Error(invalidArgument + v); + } + + // Minus sign? + if ((i = v.charCodeAt(0)) === 45) { + v = v.slice(1); + x.s = -1; + } else { + // Plus sign? + if (i === 43) v = v.slice(1); + x.s = 1; + } + + return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v); + } + + Decimal.prototype = P; + + Decimal.ROUND_UP = 0; + Decimal.ROUND_DOWN = 1; + Decimal.ROUND_CEIL = 2; + Decimal.ROUND_FLOOR = 3; + Decimal.ROUND_HALF_UP = 4; + Decimal.ROUND_HALF_DOWN = 5; + Decimal.ROUND_HALF_EVEN = 6; + Decimal.ROUND_HALF_CEIL = 7; + Decimal.ROUND_HALF_FLOOR = 8; + Decimal.EUCLID = 9; + + Decimal.config = Decimal.set = config; + Decimal.clone = clone; + Decimal.isDecimal = isDecimalInstance; + + Decimal.abs = abs; + Decimal.acos = acos; + Decimal.acosh = acosh; // ES6 + Decimal.add = add; + Decimal.asin = asin; + Decimal.asinh = asinh; // ES6 + Decimal.atan = atan; + Decimal.atanh = atanh; // ES6 + Decimal.atan2 = atan2; + Decimal.cbrt = cbrt; // ES6 + Decimal.ceil = ceil; + Decimal.cos = cos; + Decimal.cosh = cosh; // ES6 + Decimal.div = div; + Decimal.exp = exp; + Decimal.floor = floor; + Decimal.hypot = hypot; // ES6 + Decimal.ln = ln; + Decimal.log = log; + Decimal.log10 = log10; // ES6 + Decimal.log2 = log2; // ES6 + Decimal.max = max; + Decimal.min = min; + Decimal.mod = mod; + Decimal.mul = mul; + Decimal.pow = pow; + Decimal.random = random; + Decimal.round = round; + Decimal.sign = sign; // ES6 + Decimal.sin = sin; + Decimal.sinh = sinh; // ES6 + Decimal.sqrt = sqrt; + Decimal.sub = sub; + Decimal.tan = tan; + Decimal.tanh = tanh; // ES6 + Decimal.trunc = trunc; // ES6 + + if (obj === void 0) obj = {}; + if (obj) { + if (obj.defaults !== true) { + ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto']; + for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p]; + } + } + + Decimal.config(obj); + + return Decimal; +} + + +/* + * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ +function div(x, y) { + return new this(x).div(y); +} + + +/* + * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} The power to which to raise the base of the natural log. + * + */ +function exp(x) { + return new this(x).exp(); +} + + +/* + * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`. + * + * x {number|string|Decimal} + * + */ +function floor(x) { + return finalise(x = new this(x), x.e + 1, 3); +} + + +/* + * Return a new Decimal whose value is the square root of the sum of the squares of the arguments, + * rounded to `precision` significant digits using rounding mode `rounding`. + * + * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...) + * + * arguments {number|string|Decimal} + * + */ +function hypot() { + var i, n, + t = new this(0); + + external = false; + + for (i = 0; i < arguments.length;) { + n = new this(arguments[i++]); + if (!n.d) { + if (n.s) { + external = true; + return new this(1 / 0); + } + t = n; + } else if (t.d) { + t = t.plus(n.times(n)); + } + } + + external = true; + + return t.sqrt(); +} + + +/* + * Return true if object is a Decimal instance (where Decimal is any Decimal constructor), + * otherwise return false. + * + */ +function isDecimalInstance(obj) { + return obj instanceof Decimal || obj && obj.name === '[object Decimal]' || false; +} + + +/* + * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ +function ln(x) { + return new this(x).ln(); +} + + +/* + * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base + * is specified, rounded to `precision` significant digits using rounding mode `rounding`. + * + * log[y](x) + * + * x {number|string|Decimal} The argument of the logarithm. + * y {number|string|Decimal} The base of the logarithm. + * + */ +function log(x, y) { + return new this(x).log(y); +} + + +/* + * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ +function log2(x) { + return new this(x).log(2); +} + + +/* + * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ +function log10(x) { + return new this(x).log(10); +} + + +/* + * Return a new Decimal whose value is the maximum of the arguments. + * + * arguments {number|string|Decimal} + * + */ +function max() { + return maxOrMin(this, arguments, 'lt'); +} + + +/* + * Return a new Decimal whose value is the minimum of the arguments. + * + * arguments {number|string|Decimal} + * + */ +function min() { + return maxOrMin(this, arguments, 'gt'); +} + + +/* + * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits + * using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ +function mod(x, y) { + return new this(x).mod(y); +} + + +/* + * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ +function mul(x, y) { + return new this(x).mul(y); +} + + +/* + * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} The base. + * y {number|string|Decimal} The exponent. + * + */ +function pow(x, y) { + return new this(x).pow(y); +} + + +/* + * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with + * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros + * are produced). + * + * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive. + * + */ +function random(sd) { + var d, e, k, n, + i = 0, + r = new this(1), + rd = []; + + if (sd === void 0) sd = this.precision; + else checkInt32(sd, 1, MAX_DIGITS); + + k = Math.ceil(sd / LOG_BASE); + + if (!this.crypto) { + for (; i < k;) rd[i++] = Math.random() * 1e7 | 0; + + // Browsers supporting crypto.getRandomValues. + } else if (crypto.getRandomValues) { + d = crypto.getRandomValues(new Uint32Array(k)); + + for (; i < k;) { + n = d[i]; + + // 0 <= n < 4294967296 + // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865). + if (n >= 4.29e9) { + d[i] = crypto.getRandomValues(new Uint32Array(1))[0]; + } else { + + // 0 <= n <= 4289999999 + // 0 <= (n % 1e7) <= 9999999 + rd[i++] = n % 1e7; + } + } + + // Node.js supporting crypto.randomBytes. + } else if (crypto.randomBytes) { + + // buffer + d = crypto.randomBytes(k *= 4); + + for (; i < k;) { + + // 0 <= n < 2147483648 + n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24); + + // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286). + if (n >= 2.14e9) { + crypto.randomBytes(4).copy(d, i); + } else { + + // 0 <= n <= 2139999999 + // 0 <= (n % 1e7) <= 9999999 + rd.push(n % 1e7); + i += 4; + } + } + + i = k / 4; + } else { + throw Error(cryptoUnavailable); + } + + k = rd[--i]; + sd %= LOG_BASE; + + // Convert trailing digits to zeros according to sd. + if (k && sd) { + n = mathpow(10, LOG_BASE - sd); + rd[i] = (k / n | 0) * n; + } + + // Remove trailing words which are zero. + for (; rd[i] === 0; i--) rd.pop(); + + // Zero? + if (i < 0) { + e = 0; + rd = [0]; + } else { + e = -1; + + // Remove leading words which are zero and adjust exponent accordingly. + for (; rd[0] === 0; e -= LOG_BASE) rd.shift(); + + // Count the digits of the first word of rd to determine leading zeros. + for (k = 1, n = rd[0]; n >= 10; n /= 10) k++; + + // Adjust the exponent for leading zeros of the first word of rd. + if (k < LOG_BASE) e -= LOG_BASE - k; + } + + r.e = e; + r.d = rd; + + return r; +} + + +/* + * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `rounding`. + * + * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL). + * + * x {number|string|Decimal} + * + */ +function round(x) { + return finalise(x = new this(x), x.e + 1, this.rounding); +} + + +/* + * Return + * 1 if x > 0, + * -1 if x < 0, + * 0 if x is 0, + * -0 if x is -0, + * NaN otherwise + * + * x {number|string|Decimal} + * + */ +function sign(x) { + x = new this(x); + return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN; +} + + +/* + * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits + * using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ +function sin(x) { + return new this(x).sin(); +} + + +/* + * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ +function sinh(x) { + return new this(x).sinh(); +} + + +/* + * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} + * + */ +function sqrt(x) { + return new this(x).sqrt(); +} + + +/* + * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits + * using rounding mode `rounding`. + * + * x {number|string|Decimal} + * y {number|string|Decimal} + * + */ +function sub(x, y) { + return new this(x).sub(y); +} + + +/* + * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant + * digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ +function tan(x) { + return new this(x).tan(); +} + + +/* + * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision` + * significant digits using rounding mode `rounding`. + * + * x {number|string|Decimal} A value in radians. + * + */ +function tanh(x) { + return new this(x).tanh(); +} + + +/* + * Return a new Decimal whose value is `x` truncated to an integer. + * + * x {number|string|Decimal} + * + */ +function trunc(x) { + return finalise(x = new this(x), x.e + 1, 1); +} + + +P[Symbol.for('nodejs.util.inspect.custom')] = P.toString; +P[Symbol.toStringTag] = 'Decimal'; + +// Create and configure initial Decimal constructor. +export var Decimal = clone(DEFAULTS); + +// Create the internal constants from their string values. +LN10 = new Decimal(LN10); +PI = new Decimal(PI); + +export default Decimal; diff --git a/node_modules/decimal.js/doc/API.html b/node_modules/decimal.js/doc/API.html new file mode 100644 index 0000000..cfdb617 --- /dev/null +++ b/node_modules/decimal.js/doc/API.html @@ -0,0 +1,2678 @@ + + + + + + + decimal.js API + + + + +

+ +
+ +

decimal.js

+ +

An arbitrary-precision Decimal type for JavaScript.

+

Hosted on GitHub.

+ +

API

+ +

+ See the README on GitHub for a quick-start + introduction. +

+

+ In all examples below, var and semicolons are not shown, and if a commented-out + value is in quotes it means toString has been called on the preceding expression. +


+

+ When the library is loaded, it defines a single function object, + Decimal, the constructor of Decimal instances. +

+

+ + If necessary, multiple Decimal constructors can be created, each with their own independent + configuration, e.g. precision and range, which applies to all Decimal instances created from + it. + +

+

+ + A new Decimal constructor is created by calling the clone + method of an already existing Decimal constructor. + +

+ + + +

CONSTRUCTOR

+ +
+ DecimalDecimal(value) ⇒ Decimal +
+
+
value: number|string|Decimal
+
+ A legitimate value is an integer or float, including ±0, or + is ±Infinity, or NaN. +
+
+ The number of digits of value is not limited, except by JavaScript's maximum + array size and, in practice, the processing time required. +
+
+ The allowable range of value is defined in terms of a maximum exponent, see + maxE, and a minimum exponent, see minE. +
+
+ As well as in decimal, a string value may be expressed in binary, hexadecimal + or octal, if the appropriate prefix is included: 0x or 0X for + hexadecimal, 0b or 0B for binary, and 0o or + 0O for octal. +
+
+ Both decimal and non-decimal string values may use exponential (floating-point), as well as + normal (fixed-point) notation. +
+
+ In exponential notation, e or E defines a power-of-ten exponent + for decimal values, and p or P defines a power-of-two exponent for + non-decimal values, i.e. binary, hexadecimal or octal. +
+
+

Returns a new Decimal object instance.

+

Throws on an invalid value.

+
+x = new Decimal(9)                       // '9'
+y = new Decimal(x)                       // '9'
+
+new Decimal('5032485723458348569331745.33434346346912144534543')
+new Decimal('4.321e+4')                  // '43210'
+new Decimal('-735.0918e-430')            // '-7.350918e-428'
+new Decimal('5.6700000')                 // '5.67'
+new Decimal(Infinity)                    // 'Infinity'
+new Decimal(NaN)                         // 'NaN'
+new Decimal('.5')                        // '0.5'
+new Decimal('-0b10110100.1')             // '-180.5'
+new Decimal('0xff.8')                    // '255.5'
+
+new Decimal(0.046875)                    // '0.046875'
+new Decimal('0.046875000000')            // '0.046875'
+
+new Decimal(4.6875e-2)                   // '0.046875'
+new Decimal('468.75e-4')                 // '0.046875'
+
+new Decimal('0b0.000011')                // '0.046875'
+new Decimal('0o0.03')                    // '0.046875'
+new Decimal('0x0.0c')                    // '0.046875'
+
+new Decimal('0b1.1p-5')                  // '0.046875'
+new Decimal('0o1.4p-5')                  // '0.046875'
+new Decimal('0x1.8p-5')                  // '0.046875'
+ + + +

Methods

+

The methods of a Decimal constructor.

+ + + +
abs.abs(x) ⇒ Decimal
+

x: number|string|Decimal

+

See absoluteValue.

+
a = Decimal.abs(x)
+b = new Decimal(x).abs()
+a.equals(b)                    // true
+ + + +
acos.acos(x) ⇒ Decimal
+

x: number|string|Decimal

+

See inverseCosine.

+
a = Decimal.acos(x)
+b = new Decimal(x).acos()
+a.equals(b)                    // true
+ + + +
acosh.acosh(x) ⇒ Decimal
+

x: number|string|Decimal

+

See inverseHyperbolicCosine.

+
a = Decimal.acosh(x)
+b = new Decimal(x).acosh()
+a.equals(b)                    // true
+ + + +
add.add(x, y) ⇒ Decimal
+

+ x: number|string|Decimal
+ y: number|string|Decimal +

+

See plus.

+
a = Decimal.add(x, y)
+b = new Decimal(x).plus(y)
+a.equals(b)                    // true
+ + + +
asin.asin(x) ⇒ Decimal
+

x: number|string|Decimal

+

See inverseSine.

+
a = Decimal.asin(x)
+b = new Decimal(x).asin()
+a.equals(b)                    // true
+ + + +
asinh.asinh(x) ⇒ Decimal
+

x: number|string|Decimal

+

See inverseHyperbolicSine.

+
a = Decimal.asinh(x)
+b = new Decimal(x).asinh()
+a.equals(b)                    // true
+ + + +
atan.atan(x) ⇒ Decimal
+

x: number|string|Decimal

+

See inverseTangent.

+
a = Decimal.atan(x)
+b = new Decimal(x).atan()
+a.equals(b)                    // true
+ + + +
atanh.atanh(x) ⇒ Decimal
+

x: number|string|Decimal

+

See inverseHyperbolicTangent.

+
a = Decimal.atanh(x)
+b = new Decimal(x).atanh()
+a.equals(b)                    // true
+ + + +
atan2.atan2(y, x) ⇒ Decimal
+

+ y: number|string|Decimal
+ x: number|string|Decimal +

+

+ Returns a new Decimal whose value is the inverse tangent in radians of the quotient of + y and x, rounded to precision + significant digits using rounding mode rounding. +

+

+ The signs of y and x are used to determine the quadrant of the + result. +

+

+ Domain: [-Infinity, Infinity]
+ Range: [-pi, pi] +

+

+ See Pi and + Math.atan2(). +

+
r = Decimal.atan2(y, x)
+ + + +
cbrt.cbrt(x) ⇒ Decimal
+

x: number|string|Decimal

+

See cubeRoot.

+
a = Decimal.cbrt(x)
+b = new Decimal(x).cbrt()
+a.equals(b)                    // true
+ + + +
ceil.ceil(x) ⇒ Decimal
+

x: number|string|Decimal

+

See ceil.

+
a = Decimal.ceil(x)
+b = new Decimal(x).ceil()
+a.equals(b)                    // true
+ + + +
+ clone + .clone([object]) ⇒ Decimal constructor +
+

object: object

+

+ Returns a new independent Decimal constructor with configuration settings as described by + object (see set), or with the same + settings as this Decimal constructor if object is omitted. +

+
Decimal.set({ precision: 5 })
+Decimal9 = Decimal.clone({ precision: 9 })
+
+a = new Decimal(1)
+b = new Decimal9(1)
+
+a.div(3)                           // 0.33333
+b.div(3)                           // 0.333333333
+
+// Decimal9 = Decimal.clone({ precision: 9 }) is equivalent to:
+Decimal9 = Decimal.clone()
+Decimal9.set({ precision: 9 })
+

+ If object has a 'defaults' property with value true + then the new constructor will use the default configuration. +

+
+D1 = Decimal.clone({ defaults: true })
+
+// Use the defaults except for precision
+D2 = Decimal.clone({ defaults: true, precision: 50 })
+

+ It is not inefficient in terms of memory usage to use multiple Decimal constructors as + functions are shared between them. +

+ + +
cos.cos(x) ⇒ Decimal
+

x: number|string|Decimal

+

See cosine.

+
a = Decimal.cos(x)
+b = new Decimal(x).cos()
+a.equals(b)                    // true
+ + + +
cosh.cosh(x) ⇒ Decimal
+

x: number|string|Decimal

+

See hyperbolicCosine.

+
a = Decimal.cosh(x)
+b = new Decimal(x).cosh()
+a.equals(b)                    // true
+ + + +
div.div(x, y) ⇒ Decimal
+

+ x: number|string|Decimal
+ y: number|string|Decimal +

+

See dividedBy.

+
a = Decimal.div(x, y)
+b = new Decimal(x).div(y)
+a.equals(b)                    // true
+ + + +
exp.exp(x) ⇒ Decimal
+

x: number|string|Decimal

+

See naturalExponential.

+
a = Decimal.exp(x)
+b = new Decimal(x).exp()
+a.equals(b)                    // true
+ + + +
floor.floor(x) ⇒ Decimal
+

x: number|string|Decimal

+

See floor.

+
a = Decimal.floor(x)
+b = new Decimal(x).floor()
+a.equals(b)                    // true
+ + + +
+ hypot.hypot([x [, y, ...]]) ⇒ Decimal +
+

+ x: number|string|Decimal
+ y: number|string|Decimal +

+

+ Returns a new Decimal whose value is the square root of the sum of the squares of the + arguments, rounded to precision significant digits using + rounding mode rounding. +

+
r = Decimal.hypot(x, y)
+ + + +
ln.ln(x) ⇒ Decimal
+

x: number|string|Decimal

+

See naturalLogarithm.

+
a = Decimal.ln(x)
+b = new Decimal(x).ln()
+a.equals(b)                    // true
+ + + +
+ isDecimal.isDecimal(object) ⇒ boolean +
+

object: any

+

+ Returns true if object is a Decimal instance (where Decimal is any + Decimal constructor), or false if it is not. +

+
a = new Decimal(1)
+b = {}
+a instanceof Decimal           // true
+Decimal.isDecimal(a)           // true
+Decimal.isDecimal(b)           // false
+ + + +
log.log(x [, base]) ⇒ Decimal
+

+ x: number|string|Decimal
+ base: number|string|Decimal +

+

See logarithm.

+

+ The default base is 10, which is not the same as JavaScript's + Math.log(), which returns the natural logarithm (base e). +

+
a = Decimal.log(x, y)
+b = new Decimal(x).log(y)
+a.equals(b)                    // true
+ + + +
log2.log2(x) ⇒ Decimal
+

x: number|string|Decimal

+

+ Returns a new Decimal whose value is the base 2 logarithm of x, + rounded to precision significant digits using rounding + mode rounding. +

+
r = Decimal.log2(x)
+ + + +
log10.log10(x) ⇒ Decimal
+

x: number|string|Decimal

+

+ Returns a new Decimal whose value is the base 10 logarithm of x, + rounded to precision significant digits using rounding + mode rounding. +

+
r = Decimal.log10(x)
+ + + +
+ max.max([x [, y, ...]]) ⇒ Decimal +
+

+ x: number|string|Decimal
+ y: number|string|Decimal +

+

Returns a new Decimal whose value is the maximum of the arguments.

+
r = Decimal.max(x, y, z)
+ + + +
+ min.min([x [, y, ...]]) ⇒ Decimal +
+

+ x: number|string|Decimal
+ y: number|string|Decimal +

+

Returns a new Decimal whose value is the minimum of the arguments.

+
r = Decimal.min(x, y, z)
+ + + +
mod.mod(x, y) ⇒ Decimal
+

+ x: number|string|Decimal
+ y: number|string|Decimal +

+

See modulo.

+
a = Decimal.mod(x, y)
+b = new Decimal(x).mod(y)
+a.equals(b)                    // true
+ + + +
mul.mul(x, y) ⇒ Decimal
+

+ x: number|string|Decimal
+ y: number|string|Decimal +

+

See times.

+
a = Decimal.mul(x, y)
+b = new Decimal(x).mul(y)
+a.equals(b)                    // true
+ + + +
+ noConflict.noConflict() ⇒ Decimal constructor +
+

Browsers only.

+

+ Reverts the Decimal variable to the value it had before this library was loaded + and returns a reference to the original Decimal constructor so it can be assigned to a + variable with a different name. +

+
+<script> Decimal = 1 </script>
+<script src='/path/to/decimal.js'></script>
+<script>
+  a = new Decimal(2)      // '2'
+  D = Decimal.noConflict()
+  Decimal                 // 1
+  b = new D(3)            // '3'
+</script>
+ + + +
pow.pow(base, exponent) ⇒ Decimal
+

+ base: number|string|Decimal
+ exponent: number|string|Decimal +

+

See toPower.

+
a = Decimal.pow(x, y)
+b = new Decimal(x).pow(y)
+a.equals(b)                    // true
+ + + +
+ random.random([dp]) ⇒ Decimal +
+

dp: number: integer, 0 to 1e+9 inclusive

+

+ Returns a new Decimal with a pseudo-random value equal to or greater than 0 and + less than 1. +

+

+ The return value will have dp decimal places (or less if trailing zeros are + produced). If dp is omitted then the number of decimal places will + default to the current precision setting. +

+

+ If the value of this Decimal constructor's + crypto property is true, and the + crypto object is available globally in the host environment, the random digits of + the return value are generated by either crypto.getRandomValues (Web Cryptography + API in modern browsers) or crypto.randomBytes (Node.js), otherwise, if the the + value of the property is false the return value is generated by + Math.random (fastest). +

+

To make the crypto object available globally in Node.js use

+
global.crypto = require('crypto')
+

+ If the value of this Decimal constructor's + crypto property is set true and the + crypto object and associated method are not available, an exception will be + thrown. +

+

+ If one of the crypto methods is used, the value of the returned Decimal should be + cryptographically-secure and statistically indistinguishable from a random value. +

+
Decimal.set({ precision: 10 })
+Decimal.random()                    // '0.4117936847'
+Decimal.random(20)                  // '0.78193327636914089009'
+ + +
round.round(x) ⇒ Decimal
+

x: number|string|Decimal

+

See round.

+
a = Decimal.round(x)
+b = new Decimal(x).round()
+a.equals(b)                    // true
+ + + +
set.set(object) ⇒ Decimal constructor
+

object: object

+

+ Configures the 'global' settings for this particular Decimal constructor, i.e. + the settings which apply to operations performed on the Decimal instances created by it. +

+

Returns this Decimal constructor.

+

+ The configuration object, object, can contain some or all of the properties + described in detail at Properties and shown in the + example below. +

+

+ The values of the configuration object properties are checked for validity and then stored as + equivalently-named properties of this Decimal constructor. +

+

+ If object has a 'defaults' property with value true + then any unspecified properties will be reset to their default values. +

+

Throws on an invalid object or configuration property value.

+
+// Defaults
+Decimal.set({
+    precision: 20,
+    rounding: 4,
+    toExpNeg: -7,
+    toExpPos: 21,
+    maxE: 9e15,
+    minE: -9e15,
+    modulo: 1,
+    crypto: false
+})
+
+// Reset all properties to their default values
+Decimal.set({ defaults: true })
+
+// Set precision to 50 and all other properties to their default values
+Decimal.set({ precision: 50, defaults: true })
+

+ The properties of a Decimal constructor can also be set by direct assignment, but that will + by-pass the validity checking that this method performs - this is not a problem if the user + knows that the assignment is valid. +

+
Decimal.precision = 40
+ + + +
sign.sign(x) ⇒ number
+

x: number|string|Decimal

+ + + + + + + + + + + + + + + + + + + + + + +
Returns 
1if the value of x is non-zero and its sign is positive
-1if the value of x is non-zero and its sign is negative
0if the value of x is positive zero
-0if the value of x is negative zero
NaNif the value of x is NaN
+
r = Decimal.sign(x)
+ + + +
sin.sin(x) ⇒ Decimal
+

x: number|string|Decimal

+

See sine.

+
a = Decimal.sin(x)
+b = new Decimal(x).sin()
+a.equals(b)                    // true
+ + + +
sinh.sinh(x) ⇒ Decimal
+

x: number|string|Decimal

+

See hyperbolicSine.

+
a = Decimal.sinh(x)
+b = new Decimal(x).sinh()
+a.equals(b)                    // true
+ + + +
sqrt.sqrt(x) ⇒ Decimal
+

x: number|string|Decimal

+

See squareRoot.

+
a = Decimal.sqrt(x)
+b = new Decimal(x).sqrt()
+a.equals(b)                    // true
+ + + +
sub.sub(x, y) ⇒ Decimal
+

+ x: number|string|Decimal
+ y: number|string|Decimal +

+

See minus.

+
a = Decimal.sub(x, y)
+b = new Decimal(x).sub(y)
+a.equals(b)                    // true
+ + + +
tan.tan(x) ⇒ Decimal
+

x: number|string|Decimal

+

See tangent.

+
a = Decimal.tan(x)
+b = new Decimal(x).tan()
+a.equals(b)                    // true
+ + + +
tanh.tanh(x) ⇒ Decimal
+

x: number|string|Decimal

+

See hyperbolicTangent.

+
a = Decimal.tanh(x)
+b = new Decimal(x).tanh()
+a.equals(b)                    // true
+ + + +
trunc.trunc(x) ⇒ Decimal
+

x: number|string|Decimal

+

See truncated.

+
a = Decimal.trunc(x)
+b = new Decimal(x).trunc()
+a.equals(b)                    // true
+ + + + +

Properties

+

The properties of a Decimal constructor.

+ + + +
Configuration properties
+

+ The values of the configuration properties precision, + rounding, minE, + maxE, toExpNeg, + toExpPos, modulo, and + crypto are set using the + set method. +

+

+ As simple object properties they can be set directly without using + set, and it is fine to do so, but the values assigned + will not then be checked for validity. For example: +

+
Decimal.set({ precision: 0 })
+// '[DecimalError] Invalid argument: precision: 0'
+
+Decimal.precision = 0
+// No error is thrown and the results of calculations are unreliable
+ + + +
precision
+

+ number: integer, 1 to 1e+9 inclusive
+ Default value: 20 +

+

The maximum number of significant digits of the result of an operation.

+

+ All functions which return a Decimal will round the return value to precision + significant digits except Decimal, + absoluteValue, + ceil, floor, + negated, round, + toDecimalPlaces, + toNearest and + truncated. +

+

+ See Pi for the precision limit of the trigonometric methods. +

+
Decimal.set({ precision: 5 })
+Decimal.precision                  // 5
+ + + +
rounding
+

+ number: integer, 0 to 8 inclusive
+ Default value: 4 (ROUND_HALF_UP) +

+

+ The default rounding mode used when rounding the result of an operation to + precision significant digits, and when rounding the + return value of the round, + toBinary, + toDecimalPlaces, + toExponential, + toFixed, + toHexadecimal, + toNearest, + toOctal, + toPrecision and + toSignificantDigits methods. +

+

+ The rounding modes are available as enumerated properties of the + constructor. +

+
Decimal.set({ rounding: Decimal.ROUND_UP })
+Decimal.set({ rounding: 0 })       // equivalent
+Decimal.rounding                   // 0
+ + + +
minE
+

+ number: integer, -9e15 to 0 inclusive
+ Default value: -9e15 +

+

+ The negative exponent limit, i.e. the exponent value below which underflow to zero occurs. +

+

+ If the Decimal to be returned by a calculation would have an exponent lower than + minE then the value of that Decimal becomes zero. +

+ JavaScript numbers underflow to zero for exponents below -324. +

+
Decimal.set({ minE: -500 })
+Decimal.minE                       // -500
+new Decimal('1e-500')              // '1e-500'
+new Decimal('9.9e-501')            // '0'
+
+Decimal.set({ minE: -3 })
+new Decimal(0.001)                 // '0.01'       e is -3
+new Decimal(0.0001)                // '0'          e is -4
+

+ The smallest possible magnitude of a non-zero Decimal is 1e-9000000000000000 +

+ + + +
maxE
+

+ number: integer, 0 to 9e15 inclusive
+ Default value: 9e15 +

+

+ The positive exponent limit, i.e. the exponent value above which overflow to + Infinity occurs. +

+

+ If the Decimal to be returned by a calculation would have an exponent higher than + maxE then the value of that Decimal becomes Infinity. +

+ JavaScript numbers overflow to Infinity for exponents above 308. +

+
Decimal.set({ maxE: 500 })
+Decimal.maxE                       // 500
+new Decimal('9.999e500')           // '9.999e+500'
+new Decimal('1e501')               // 'Infinity'
+
+Decimal.set({ maxE: 4 })
+new Decimal(99999)                 // '99999'      e is 4
+new Decimal(100000)                // 'Infinity'
+

+ The largest possible magnitude of a finite Decimal is 9.999...e+9000000000000000 +

+ + + +
toExpNeg
+

+ number: integer, -9e15 to 0 inclusive
+ Default value: -7 +

+

+ The negative exponent value at and below which toString + returns exponential notation. +

+
Decimal.set({ toExpNeg: -7 })
+Decimal.toExpNeg                   // -7
+new Decimal(0.00000123)            // '0.00000123'       e is -6
+new Decimal(0.000000123)           // '1.23e-7'
+
+// Always return exponential notation:
+Decimal.set({ toExpNeg: 0 })
+

+ JavaScript numbers use exponential notation for negative exponents of -7 and + below. +

+

+ Regardless of the value of toExpNeg, the + toFixed method will always return a value in normal + notation and the toExponential method will always + return a value in exponential form. +

+ + + +
toExpPos
+

+ number: integer, 0 to 9e15 inclusive
+ Default value: 20 +

+

+ The positive exponent value at and above which toString + returns exponential notation. +

+
Decimal.set({ toExpPos: 2 })
+Decimal.toExpPos                   // 2
+new Decimal(12.3)                  // '12.3'        e is 1
+new Decimal(123)                   // '1.23e+2'
+
+// Always return exponential notation:
+Decimal.set({ toExpPos: 0 })
+

+ JavaScript numbers use exponential notation for positive exponents of 20 and + above. +

+

+ Regardless of the value of toExpPos, the + toFixed method will always return a value in normal + notation and the toExponential method will always + return a value in exponential form. +

+ + + +
modulo
+

+ number: integer, 0 to 9 inclusive
+ Default value: 1 (ROUND_DOWN) +

+

The modulo mode used when calculating the modulus: a mod n.

+

+ The quotient, q = a / n, is calculated according to the + rounding mode that corresponds to the chosen + modulo mode. +

+

The remainder, r, is calculated as: r = a - n * q.

+

+ The modes that are most commonly used for the modulus/remainder operation are shown in the + following table. Although the other rounding modes can + be used, they may not give useful results. +

+ + + + + + + + + + + + + + + + + + + + + + +
PropertyValueDescription
ROUND_UP0The remainder is positive if the dividend is negative, else is negative
ROUND_DOWN1 + The remainder has the same sign as the dividend.
+ This uses truncating division and matches the behaviour of JavaScript's remainder + operator %. +
ROUND_FLOOR3 + The remainder has the same sign as the divisor.
+ (This matches Python's % operator) +
ROUND_HALF_EVEN6The IEEE 754 remainder function
EUCLID9 + The remainder is always positive.
+ Euclidian division: q = sign(x) * floor(a / abs(x)). +
+

+ The rounding/modulo modes are available as enumerated properties of the Decimal constructor. +

+
Decimal.set({ modulo: Decimal.EUCLID })
+Decimal.set({ modulo: 9 })         // equivalent
+Decimal.modulo                     // 9
+ + + +
crypto
+

+ boolean: true/false
Default value: false +

+

+ The value that determines whether cryptographically-secure pseudo-random number generation is + used. +

+

See random.

+
+// Node.js
+global.crypto = require('crypto')
+
+Decimal.crypto                     // false
+Decimal.set({ crypto: true })
+Decimal.crypto                     // true
+ + + +
Rounding modes
+

+ The library's enumerated rounding modes are stored as properties of the Decimal constructor. +
They are not referenced internally by the library itself. +

+

Rounding modes 0 to 6 (inclusive) are the same as those of Java's BigDecimal class.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyValueDescription
ROUND_UP0Rounds away from zero
ROUND_DOWN1Rounds towards zero
ROUND_CEIL2Rounds towards Infinity
ROUND_FLOOR3Rounds towards -Infinity
ROUND_HALF_UP4Rounds towards nearest neighbour.
If equidistant, rounds away from zero
ROUND_HALF_DOWN5Rounds towards nearest neighbour.
If equidistant, rounds towards zero
ROUND_HALF_EVEN6 + Rounds towards nearest neighbour.
If equidistant, rounds towards even neighbour +
ROUND_HALF_CEIL7Rounds towards nearest neighbour.
If equidistant, rounds towards Infinity
ROUND_HALF_FLOOR8Rounds towards nearest neighbour.
If equidistant, rounds towards -Infinity
EUCLID9Not a rounding mode, see modulo
+
Decimal.set({ rounding: Decimal.ROUND_CEIL })
+Decimal.set({ rounding: 2 })       // equivalent
+Decimal.rounding                   // 2
+ + + + +

INSTANCE

+ +

Methods

+

The methods inherited by a Decimal instance from its constructor's prototype object.

+

A Decimal instance is immutable in the sense that it is not changed by its methods.

+

Methods that return a Decimal can be chained:

+
x = new Decimal(2).times('999.999999999999999').dividedBy(4).ceil()
+

Methods do not round their arguments before execution.

+

+ The treatment of ±0, ±Infinity and NaN + is consistent with how JavaScript treats these values. +

+

+ Many method names have a shorter alias. (Internally, the library always uses the shorter + method names.) +

+ + + +
absoluteValue.abs() ⇒ Decimal
+

+ Returns a new Decimal whose value is the absolute value, i.e. the magnitude, of the value of + this Decimal. +

+

+ The return value is not affected by the value of the + precision setting. +

+
+x = new Decimal(-0.8)
+y = x.absoluteValue()         // '0.8'
+z = y.abs()                   // '0.8'
+ + + +
ceil.ceil() ⇒ Decimal
+

+ Returns a new Decimal whose value is the value of this Decimal rounded to a whole number in + the direction of positive Infinity. +

+

+ The return value is not affected by the value of the + precision setting. +

+
+x = new Decimal(1.3)
+x.ceil()                      // '2'
+y = new Decimal(-1.8)
+y.ceil()                      // '-1'
+ + + +
comparedTo.cmp(x) ⇒ number
+

x: number|string|Decimal

+ + + + + + + + + + + + + + + + + + +
Returns 
1if the value of this Decimal is greater than the value of x
-1if the value of this Decimal is less than the value of x
0if this Decimal and x have the same value
NaNif the value of either this Decimal or x is NaN
+
+x = new Decimal(Infinity)
+y = new Decimal(5)
+x.comparedTo(y)                // 1
+x.comparedTo(x.minus(1))       // 0
+y.cmp(NaN)                     // NaN
+ + + +
cosine.cos() ⇒ Decimal
+

+ Returns a new Decimal whose value is the cosine of the value in radians of this Decimal, + rounded to precision significant digits using rounding + mode rounding. +

+

+ Domain: [-Infinity, Infinity]
+ Range: [-1, 1] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(0.25)
+x.cosine()                      // '0.96891242171064478414'
+y = new Decimal(-0.25)
+y.cos()                         // '0.96891242171064478414'
+ + + +
cubeRoot.cbrt() ⇒ Decimal
+

+ Returns a new Decimal whose value is the cube root of this Decimal, rounded to + precision significant digits using rounding mode + rounding. +

+

+ The return value will be correctly rounded, i.e. rounded as if the result was first calculated + to an infinite number of correct digits before rounding. +

+
+x = new Decimal(125)
+x.cubeRoot()                    // '5'
+y = new Decimal(3)
+y.cbrt()                        // '1.4422495703074083823'
+ + + +
decimalPlaces.dp() ⇒ number
+

+ Returns the number of decimal places, i.e. the number of digits after the decimal point, of + the value of this Decimal. +

+
+x = new Decimal(1.234)
+x.decimalPlaces()              // '3'
+y = new Decimal(987.654321)
+y.dp()                         // '6'
+ + + +
dividedBy.div(x) ⇒ Decimal
+

x: number|string|Decimal

+

+ Returns a new Decimal whose value is the value of this Decimal divided by x, + rounded to precision significant digits using rounding + mode rounding. +

+
+x = new Decimal(355)
+y = new Decimal(113)
+x.dividedBy(y)             // '3.14159292035398230088'
+x.div(5)                   // '71'
+ + + +
+ dividedToIntegerBy.divToInt(x) ⇒ Decimal +
+

x: number|string|Decimal

+

+ Return a new Decimal whose value is the integer part of dividing this Decimal by + x, rounded to precision significant digits + using rounding mode rounding. +

+
+x = new Decimal(5)
+y = new Decimal(3)
+x.dividedToIntegerBy(y)     // '1'
+x.divToInt(0.7)             // '7'
+ + + +
equals.eq(x) ⇒ boolean
+

x: number|string|Decimal

+

+ Returns true if the value of this Decimal equals the value of x, + otherwise returns false.
As with JavaScript, NaN does not + equal NaN. +

+

Note: This method uses the cmp method internally.

+
+0 === 1e-324                     // true
+x = new Decimal(0)
+x.equals('1e-324')               // false
+new Decimal(-0).eq(x)            // true  ( -0 === 0 )
+
+y = new Decimal(NaN)
+y.equals(NaN)                    // false
+ + + +
floor.floor() ⇒ Decimal
+

+ Returns a new Decimal whose value is the value of this Decimal rounded to a whole number in + the direction of negative Infinity. +

+

+ The return value is not affected by the value of the + precision setting. +

+
+x = new Decimal(1.8)
+x.floor()                   // '1'
+y = new Decimal(-1.3)
+y.floor()                   // '-2'
+ + + +
greaterThan.gt(x) ⇒ boolean
+

x: number|string|Decimal

+

+ Returns true if the value of this Decimal is greater than the value of + x, otherwise returns false. +

+

Note: This method uses the cmp method internally.

+
+0.1 > (0.3 - 0.2)                            // true
+x = new Decimal(0.1)
+x.greaterThan(Decimal(0.3).minus(0.2))       // false
+new Decimal(0).gt(x)                         // false
+ + + +
+ greaterThanOrEqualTo.gte(x) ⇒ boolean +
+

x: number|string|Decimal

+

+ Returns true if the value of this Decimal is greater than or equal to the value + of x, otherwise returns false. +

+

Note: This method uses the cmp method internally.

+
+(0.3 - 0.2) >= 0.1                       // false
+x = new Decimal(0.3).minus(0.2)
+x.greaterThanOrEqualTo(0.1)              // true
+new Decimal(1).gte(x)                    // true
+ + + +
hyperbolicCosine.cosh() ⇒ Decimal
+

+ Returns a new Decimal whose value is the hyperbolic cosine of the value in radians of this + Decimal, rounded to precision significant digits using + rounding mode rounding. +

+

+ Domain: [-Infinity, Infinity]
+ Range: [1, Infinity] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(1)
+x.hyperbolicCosine()                     // '1.5430806348152437785'
+y = new Decimal(0.5)
+y.cosh()                                 // '1.1276259652063807852'
+ + + +
hyperbolicSine.sinh() ⇒ Decimal
+

+ Returns a new Decimal whose value is the hyperbolic sine of the value in radians of this + Decimal, rounded to precision significant digits using + rounding mode rounding. +

+

+ Domain: [-Infinity, Infinity]
+ Range: [-Infinity, Infinity] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(1)
+x.hyperbolicSine()                       // '1.1752011936438014569'
+y = new Decimal(0.5)
+y.sinh()                                 // '0.52109530549374736162'
+ + + +
hyperbolicTangent.tanh() ⇒ Decimal
+

+ Returns a new Decimal whose value is the hyperbolic tangent of the value in radians of this + Decimal, rounded to precision significant digits using + rounding mode rounding. +

+

+ Domain: [-Infinity, Infinity]
+ Range: [-1, 1] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(1)
+x.hyperbolicTangent()                    // '0.76159415595576488812'
+y = new Decimal(0.5)
+y.tanh()                                 // '0.4621171572600097585'
+ + + +
inverseCosine.acos() ⇒ Decimal
+

+ Returns a new Decimal whose value is the inverse cosine in radians of the value of this + Decimal, rounded to precision significant digits using + rounding mode rounding. +

+

+ Domain: [-1, 1]
+ Range: [0, pi] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(0)
+x.inverseCosine()                        // '1.5707963267948966192'
+y = new Decimal(0.5)
+y.acos()                                 // '1.0471975511965977462'
+ + + +
+ inverseHyperbolicCosine.acosh() ⇒ Decimal +
+

+ Returns a new Decimal whose value is the inverse hyperbolic cosine in radians of the value of + this Decimal, rounded to precision significant + digits using rounding mode rounding. +

+

+ Domain: [1, Infinity]
+ Range: [0, Infinity] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(5)
+x.inverseHyperbolicCosine()              // '2.2924316695611776878'
+y = new Decimal(50)
+y.acosh()                                // '4.6050701709847571595'
+ + + +
+ inverseHyperbolicSine.asinh() ⇒ Decimal +
+

+ Returns a new Decimal whose value is the inverse hyperbolic sine in radians of the value of + this Decimal, rounded to precision significant digits + using rounding mode rounding. +

+

+ Domain: [-Infinity, Infinity]
+ Range: [-Infinity, Infinity] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(5)
+x.inverseHyperbolicSine()                // '2.3124383412727526203'
+y = new Decimal(50)
+y.asinh()                                // '4.6052701709914238266'
+ + + +
+ inverseHyperbolicTangent.atanh() ⇒ Decimal +
+

+ Returns a new Decimal whose value is the inverse hyperbolic tangent in radians of the value of + this Decimal, rounded to precision significant + digits using rounding mode rounding. +

+

+ Domain: [-1, 1]
+ Range: [-Infinity, Infinity] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(0.5)
+x.inverseHyperbolicTangent()             // '0.5493061443340548457'
+y = new Decimal(0.75)
+y.atanh()                                // '0.97295507452765665255'
+ + + +
inverseSine.asin() ⇒ Decimal
+

+ Returns a new Decimal whose value is the inverse sine in radians of the value of this Decimal, + rounded to precision significant digits using rounding + mode rounding. +

+

+ Domain: [-1, 1]
+ Range: [-pi/2, pi/2] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(0.5)
+x.inverseSine()                          // '0.52359877559829887308'
+y = new Decimal(0.75)
+y.asin()                                 // '0.84806207898148100805'
+ + + +
inverseTangent.atan() ⇒ Decimal
+

+ Returns a new Decimal whose value is the inverse tangent in radians of the value of this + Decimal, rounded to precision significant digits using + rounding mode rounding. +

+

+ Domain: [-Infinity, Infinity]
+ Range: [-pi/2, pi/2] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(0.5)
+x.inverseTangent()                       // '0.46364760900080611621'
+y = new Decimal(0.75)
+y.atan()                                 // '0.6435011087932843868'
+ + + +
isFinite.isFinite() ⇒ boolean
+

+ Returns true if the value of this Decimal is a finite number, otherwise returns + false.
+ The only possible non-finite values of a Decimal are NaN, Infinity + and -Infinity. +

+
+x = new Decimal(1)
+x.isFinite()                             // true
+y = new Decimal(Infinity)
+y.isFinite()                             // false
+

+ Note: The native method isFinite() can be used if + n <= Number.MAX_VALUE. +

+ + + +
isInteger.isInt() ⇒ boolean
+

+ Returns true if the value of this Decimal is a whole number, otherwise returns + false. +

+
+x = new Decimal(1)
+x.isInteger()                            // true
+y = new Decimal(123.456)
+y.isInt()                                // false
+ + + +
isNaN.isNaN() ⇒ boolean
+

+ Returns true if the value of this Decimal is NaN, otherwise returns + false. +

+
+x = new Decimal(NaN)
+x.isNaN()                                // true
+y = new Decimal('Infinity')
+y.isNaN()                                // false
+

Note: The native method isNaN() can also be used.

+ + + +
isNegative.isNeg() ⇒ boolean
+

+ Returns true if the value of this Decimal is negative, otherwise returns + false. +

+
+x = new Decimal(-0)
+x.isNegative()                           // true
+y = new Decimal(2)
+y.isNeg                                  // false
+

Note: n < 0 can be used if n <= -Number.MIN_VALUE.

+ + + +
isPositive.isPos() ⇒ boolean
+

+ Returns true if the value of this Decimal is positive, otherwise returns + false. +

+
+x = new Decimal(0)
+x.isPositive()                           // true
+y = new Decimal(-2)
+y.isPos                                  // false
+

Note: n < 0 can be used if n <= -Number.MIN_VALUE.

+ + + +
isZero.isZero() ⇒ boolean
+

+ Returns true if the value of this Decimal is zero or minus zero, otherwise + returns false. +

+
+x = new Decimal(-0)
+x.isZero() && x.isNeg()                  // true
+y = new Decimal(Infinity)
+y.isZero()                               // false
+

Note: n == 0 can be used if n >= Number.MIN_VALUE.

+ + + +
lessThan.lt(x) ⇒ boolean
+

x: number|string|Decimal

+

+ Returns true if the value of this Decimal is less than the value of + x, otherwise returns false. +

+

Note: This method uses the cmp method internally.

+
+(0.3 - 0.2) < 0.1                        // true
+x = new Decimal(0.3).minus(0.2)
+x.lessThan(0.1)                          // false
+new Decimal(0).lt(x)                     // true
+ + + +
lessThanOrEqualTo.lte(x) ⇒ boolean
+

x: number|string|Decimal

+

+ Returns true if the value of this Decimal is less than or equal to the value of + x, otherwise returns false. +

+

Note: This method uses the cmp method internally.

+
+0.1 <= (0.3 - 0.2)                              // false
+x = new Decimal(0.1)
+x.lessThanOrEqualTo(Decimal(0.3).minus(0.2))    // true
+new Decimal(-1).lte(x)                          // true
+ + + +
logarithm.log(x) ⇒ Decimal
+

x: number|string|Decimal

+

+ Returns a new Decimal whose value is the base x logarithm of the value of this + Decimal, rounded to precision significant digits using + rounding mode rounding. +

+

+ If x is omitted, the base 10 logarithm of the value of this Decimal will be + returned. +

+
+x = new Decimal(1000)
+x.logarithm()                            // '3'
+y = new Decimal(256)
+y.log(2)                                 // '8'
+

+ The return value will almost always be correctly rounded, i.e. rounded as if the result + was first calculated to an infinite number of correct digits before rounding. If a result is + incorrectly rounded the maximum error will be 1 ulp (unit in the last + place). +

+

Logarithms to base 2 or 10 will always be correctly rounded.

+

+ See toPower for the circumstances in which this method may + return an incorrectly rounded result, and see naturalLogarithm + for the precision limit. +

+

The performance of this method degrades exponentially with increasing digits.

+ + + +
minus.minus(x) ⇒ Decimal
+

x: number|string|Decimal

+

+ Returns a new Decimal whose value is the value of this Decimal minus x, rounded + to precision significant digits using rounding mode + rounding. +

+
+0.3 - 0.1                                // 0.19999999999999998
+x = new Decimal(0.3)
+x.minus(0.1)                             // '0.2'
+ + + +
modulo.mod(x) ⇒ Decimal
+

x: number|string|Decimal

+

+ Returns a new Decimal whose value is the value of this Decimal modulo x, + rounded to precision significant digits using rounding + mode rounding. +

+

+ The value returned, and in particular its sign, is dependent on the value of the + modulo property of this Decimal's constructor. If it is + 1 (default value), the result will have the same sign as this Decimal, and it + will match that of Javascript's % operator (within the limits of double + precision) and BigDecimal's remainder method. +

+

+ See modulo for a description of the other modulo modes. +

+
+1 % 0.9                                  // 0.09999999999999998
+x = new Decimal(1)
+x.modulo(0.9)                            // '0.1'
+
+y = new Decimal(8)
+z = new Decimal(-3)
+Decimal.modulo = 1
+y.mod(z)                                 // '2'
+Decimal.modulo = 3
+y.mod(z)                                 // '-1'
+ + + +
naturalExponential.exp() ⇒ Decimal
+

+ Returns a new Decimal whose value is the base e (Euler's number, the base of the + natural logarithm) exponential of the value of this Decimal, rounded to + precision significant digits using rounding mode + rounding. +

+

+ The naturalLogarithm function is the inverse of this function. +

+
+x = new Decimal(1)
+x.naturalExponential()                   // '2.7182818284590452354'
+y = new Decimal(2)
+y.exp()                                  // '7.3890560989306502272'
+

+ The return value will be correctly rounded, i.e. rounded as if the result was first calculated + to an infinite number of correct digits before rounding. (The mathematical result of the + exponential function is non-terminating, unless its argument is 0). +

+

The performance of this method degrades exponentially with increasing digits.

+ + + +
naturalLogarithm.ln() ⇒ Decimal
+

+ Returns a new Decimal whose value is the natural logarithm of the value of this Decimal, + rounded to precision significant digits using rounding + mode rounding. +

+

+ The natural logarithm is the inverse of the naturalExponential + function. +

+
+x = new Decimal(10)
+x.naturalLogarithm()                     // '2.3026'
+y = new Decimal('1.23e+30')
+y.ln()                                   // '69.28'
+

+ The return value will be correctly rounded, i.e. rounded as if the result was first calculated + to an infinite number of correct digits before rounding. (The mathematical result of the + natural logarithm function is non-terminating, unless its argument is 1). +

+

+ Internally, this method is dependent on a constant whose value is the natural logarithm of + 10. This LN10 variable in the source code currently has a precision + of 1025 digits, meaning that this method can accurately calculate up to + 1000 digits. +

+

+ If more than 1000 digits is required then the precision of LN10 + will need to be increased to 25 digits more than is required - though, as the + time-taken by this method increases exponentially with increasing digits, it is unlikely to be + viable to calculate over 1000 digits anyway. +

+ + + +
negated.neg() ⇒ Decimal
+

+ Returns a new Decimal whose value is the value of this Decimal negated, i.e. multiplied by + -1. +

+

+ The return value is not affected by the value of the + precision setting. +

+
+x = new Decimal(1.8)
+x.negated()                              // '-1.8'
+y = new Decimal(-1.3)
+y.neg()                                  // '1.3'
+ + + +
plus.plus(x) ⇒ Decimal
+

x: number|string|Decimal

+

+ Returns a new Decimal whose value is the value of this Decimal plus x, rounded to + precision significant digits using rounding mode + rounding. +

+
+0.1 + 0.2                                // 0.30000000000000004
+x = new Decimal(0.1)
+y = x.plus(0.2)                          // '0.3'
+new Decimal(0.7).plus(x).plus(y)         // '1.1'
+ + + +
precision.sd([include_zeros]) ⇒ number
+

Returns the number of significant digits of the value of this Decimal.

+

+ If include_zeros is true or 1 then any trailing zeros + of the integer part of a number are counted as significant digits, otherwise they are not. +

+
+x = new Decimal(1.234)
+x.precision()                            // '4'
+y = new Decimal(987000)
+y.sd()                                   // '3'
+y.sd(true)                               // '6'
+ + + +
round.round() ⇒ Decimal
+

+ Returns a new Decimal whose value is the value of this Decimal rounded to a whole number using + rounding mode rounding. +

+

+ To emulate Math.round, set rounding to + 7, i.e. ROUND_HALF_CEIL. +

+
+Decimal.set({ rounding: 4 })
+x = 1234.5
+x.round()                                // '1235'
+
+Decimal.rounding = Decimal.ROUND_DOWN
+x.round()                                // '1234'
+x                                        // '1234.5'
+ + + +
sine.sin() ⇒ Decimal
+

+ Returns a new Decimal whose value is the sine of the value in radians of this Decimal, + rounded to precision significant digits using rounding + mode rounding. +

+

+ Domain: [-Infinity, Infinity]
+ Range: [-1, 1] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(0.5)
+x.sine()                                 // '0.47942553860420300027'
+y = new Decimal(0.75)
+y.sin()                                  // '0.68163876002333416673'
+ + + +
squareRoot.sqrt() ⇒ Decimal
+

+ Returns a new Decimal whose value is the square root of this Decimal, rounded to + precision significant digits using rounding mode + rounding. +

+

+ The return value will be correctly rounded, i.e. rounded as if the result was first calculated + to an infinite number of correct digits before rounding. +

+

+ This method is much faster than using the toPower method with + an exponent of 0.5. +

+
+x = new Decimal(16)
+x.squareRoot()                           // '4'
+y = new Decimal(3)
+y.sqrt()                                 // '1.73205080756887729353'
+y.sqrt().eq( y.pow(0.5) )                // true
+ + + +
tangent.tan() ⇒ Decimal
+

+ Returns a new Decimal whose value is the tangent of the value in radians of this Decimal, + rounded to precision significant digits using rounding + mode rounding. +

+

+ Domain: [-Infinity, Infinity]
+ Range: [-Infinity, Infinity] +

+

See Pi for the precision limit of this method.

+
+x = new Decimal(0.5)
+x.tangent()                              // '0.54630248984379051326'
+y = new Decimal(0.75)
+y.tan()                                  // '0.93159645994407246117'
+ + + +
times.times(x) ⇒ Decimal
+

x: number|string|Decimal

+

+ Returns a new Decimal whose value is the value of this Decimal times x, + rounded to precision significant digits using rounding + mode rounding. +

+
+0.6 * 3                                  // 1.7999999999999998
+x = new Decimal(0.6)
+y = x.times(3)                           // '1.8'
+new Decimal('7e+500').times(y)           // '1.26e+501'
+ + + +
+ toBinary.toBinary([sd [, rm]]) ⇒ string +
+

+ sd: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a string representing the value of this Decimal in binary, rounded to sd + significant digits using rounding mode rm. +

+

+ If sd is defined, the return value will use binary exponential notation. +

+

+ If sd is omitted, the return value will be rounded to + precision significant digits. +

+

+ If rm is omitted, rounding mode rounding + will be used. +

+

Throws on an invalid sd or rm value.

+
+x = new Decimal(256)
+x.toBinary()                             // '0b100000000'
+x.toBinary(1)                            // '0b1p+8'
+ + + +
+ toDecimalPlaces.toDP([dp [, rm]]) ⇒ Decimal +
+

+ dp: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive. +

+

+ Returns a new Decimal whose value is the value of this Decimal rounded to dp + decimal places using rounding mode rm. +

+

+ If dp is omitted, the return value will have the same value as this Decimal. +

+

+ If rm is omitted, rounding mode rounding + is used. +

+

Throws on an invalid dp or rm value.

+
+x = new Decimal(12.34567)
+x.toDecimalPlaces(0)                      // '12'
+x.toDecimalPlaces(1, Decimal.ROUND_UP)    // '12.4'
+
+y = new Decimal(9876.54321)
+y.toDP(3)                           // '9876.543'
+y.toDP(1, 0)                        // '9876.6'
+y.toDP(1, Decimal.ROUND_DOWN)       // '9876.5'
+ + + +
+ toExponential.toExponential([dp [, rm]]) ⇒ string +
+

+ dp: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a string representing the value of this Decimal in exponential notation rounded + using rounding mode rm to dp decimal places, i.e with one digit + before the decimal point and dp digits after it. +

+

+ If the value of this Decimal in exponential notation has fewer than dp fraction + digits, the return value will be appended with zeros accordingly. +

+

+ If dp is omitted, the number of digits after the decimal point defaults to the + minimum number of digits necessary to represent the value exactly. +

+

+ If rm is omitted, rounding mode rounding is + used. +

+

Throws on an invalid dp or rm value.

+
+x = 45.6
+y = new Decimal(x)
+x.toExponential()                        // '4.56e+1'
+y.toExponential()                        // '4.56e+1'
+x.toExponential(0)                       // '5e+1'
+y.toExponential(0)                       // '5e+1'
+x.toExponential(1)                       // '4.6e+1'
+y.toExponential(1)                       // '4.6e+1'
+y.toExponential(1, Decimal.ROUND_DOWN)   // '4.5e+1'
+x.toExponential(3)                       // '4.560e+1'
+y.toExponential(3)                       // '4.560e+1'
+ + + +
+ toFixed.toFixed([dp [, rm]]) ⇒ string +
+

+ dp: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a string representing the value of this Decimal in normal (fixed-point) notation + rounded to dp decimal places using rounding mode rm. +

+

+ If the value of this Decimal in normal notation has fewer than dp fraction + digits, the return value will be appended with zeros accordingly. +

+

+ Unlike Number.prototype.toFixed, which returns exponential notation if a number + is greater or equal to 1021, this method will always return normal + notation. +

+

+ If dp is omitted, the return value will be unrounded and in normal notation. This + is unlike Number.prototype.toFixed, which returns the value to zero decimal + places, but is useful when because of the current + toExpNeg or + toExpNeg values, + toString returns exponential notation. +

+

+ If rm is omitted, rounding mode rounding is + used. +

+

Throws on an invalid dp or rm value.

+
+x = 3.456
+y = new Decimal(x)
+x.toFixed()                       // '3'
+y.toFixed()                       // '3.456'
+y.toFixed(0)                      // '3'
+x.toFixed(2)                      // '3.46'
+y.toFixed(2)                      // '3.46'
+y.toFixed(2, Decimal.ROUND_DOWN)  // '3.45'
+x.toFixed(5)                      // '3.45600'
+y.toFixed(5)                      // '3.45600'
+ + + +
+ toFraction + .toFraction([max_denominator]) ⇒ [Decimal, Decimal] +
+

+ max_denominator: number|string|Decimal: 1 >= integer < + Infinity +

+

+ Returns an array of two Decimals representing the value of this Decimal as a simple fraction + with an integer numerator and an integer denominator. The denominator will be a positive + non-zero value less than or equal to max_denominator. +

+

+ If a maximum denominator is omitted, the denominator will be the lowest value necessary to + represent the number exactly. +

+

Throws on an invalid max_denominator value.

+
+x = new Decimal(1.75)
+x.toFraction()                       // '7, 4'
+
+pi = new Decimal('3.14159265358')
+pi.toFraction()                      // '157079632679,50000000000'
+pi.toFraction(100000)                // '312689, 99532'
+pi.toFraction(10000)                 // '355, 113'
+pi.toFraction(100)                   // '311, 99'
+pi.toFraction(10)                    // '22, 7'
+pi.toFraction(1)                     // '3, 1'
+ + + +
+ toHexadecimal.toHex([sd [, rm]]) ⇒ string +
+

+ sd: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a string representing the value of this Decimal in hexadecimal, rounded to + sd significant digits using rounding mode rm. +

+

+ If sd is defined, the return value will use binary exponential notation. +

+

+ If sd is omitted, the return value will be rounded to + precision significant digits. +

+

+ If rm is omitted, rounding mode rounding + will be used. +

+

Throws on an invalid sd or rm value.

+
+x = new Decimal(256)
+x.toHexadecimal()                        // '0x100'
+x.toHex(1)                               // '0x1p+8'
+ + + +
toJSON.toJSON() ⇒ string
+

As valueOf.

+ + + +
+ toNearest.toNearest(x [, rm]) ⇒ Decimal +
+

+ x: number|string|Decimal
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a new Decimal whose value is the nearest multiple of x in the direction + of rounding mode rm, or rounding if + rm is omitted, to the value of this Decimal. +

+

+ The return value will always have the same sign as this Decimal, unless either this Decimal + or x is NaN, in which case the return value will be also be + NaN. +

+

+ The return value is not affected by the value of the + precision setting. +

+
+x = new Decimal(1.39)
+x.toNearest(0.25)                        // '1.5'
+
+y = new Decimal(9.499)
+y.toNearest(0.5, Decimal.ROUND_UP)       // '9.5'
+y.toNearest(0.5, Decimal.ROUND_DOWN)     // '9'
+ + + +
toNumber.toNumber() ⇒ number
+

Returns the value of this Decimal converted to a primitive number.

+

+ Type coercion with, for example, JavaScript's unary plus operator will also work, except that + a Decimal with the value minus zero will convert to positive zero. +

+
+x = new Decimal(456.789)
+x.toNumber()                   // 456.789
++x                             // 456.789
+
+y = new Decimal('45987349857634085409857349856430985')
+y.toNumber()                   // 4.598734985763409e+34
+
+z = new Decimal(-0)
+1 / +z                         // Infinity
+1 / z.toNumber()               // -Infinity
+ + + +
+ toOctal.toOctal([sd [, rm]]) ⇒ string +
+

+ sd: number: integer, 0 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a string representing the value of this Decimal in octal, rounded to sd + significant digits using rounding mode rm. +

+

+ If sd is defined, the return value will use binary exponential notation. +

+

+ If sd is omitted, the return value will be rounded to + precision significant digits. +

+

+ If rm is omitted, rounding mode rounding + will be used. +

+

Throws on an invalid sd or rm value.

+
+x = new Decimal(256)
+x.toOctal()                              // '0o400'
+x.toOctal(1)                             // '0o1p+8'
+ + + +
toPower.pow(x) ⇒ Decimal
+

x: number|string|Decimal: integer or non-integer

+

+ Returns a new Decimal whose value is the value of this Decimal raised to the power + x, rounded to precision significant digits + using rounding mode rounding. +

+

+ The performance of this method degrades exponentially with increasing digits. For + non-integer exponents in particular, the performance of this method may not be adequate. +

+
+Math.pow(0.7, 2)               // 0.48999999999999994
+x = new Decimal(0.7)
+x.toPower(2)                   // '0.49'
+new Decimal(3).pow(-2)         // '0.11111111111111111111'
+
+new Decimal(1217652.23).pow('98765.489305603941')
+// '4.8227010515242461181e+601039'
+

Is the pow function guaranteed to be correctly rounded?

+

+ The return value will almost always be correctly rounded, i.e. rounded as if the result + was first calculated to an infinite number of correct digits before rounding. If a result is + incorrectly rounded the maximum error will be 1 ulp (unit in the last + place). +

+

For non-integer and larger exponents this method uses the formula

+
xy = exp(y*ln(x))
+

+ As the mathematical return values of the exp and + ln functions are both non-terminating (excluding arguments of + 0 or 1), the values of the Decimals returned by the functions as + implemented by this library will necessarily be rounded approximations, which means that there + can be no guarantee of correct rounding when they are combined in the above formula. +

+

+ The return value may, depending on the rounding mode, be incorrectly rounded only if the first + 15 rounding digits are 15 zeros (and there are non-zero digits + following at some point), or 15 nines, or a 5 or 4 + followed by 14 nines. +

+

+ Therefore, assuming the first 15 rounding digits are each equally likely to be + any digit, 0-9, the probability of an incorrectly rounded result is less than + 1 in 250,000,000,000,000. +

+

+ An example of incorrect rounding: +

+
+Decimal.set({ precision: 20, rounding: 1 })
+new Decimal(28).pow('6.166675020000903537297764507632802193308677149')
+// 839756321.64088511
+

As the exact mathematical result begins

+
839756321.6408851099999999999999999999999999998969466049426031167...
+

+ and the rounding mode is set to ROUND_DOWN, the correct + return value should be +

+
839756321.64088510999
+ + + +
+ toPrecision.toPrecision([sd [, rm]]) ⇒ string +
+

+ sd: number: integer, 1 to 1e+9 inclusive
+ rm: number: integer, 0 to 8 inclusive +

+

+ Returns a string representing the value of this Decimal rounded to sd significant + digits using rounding mode rm. +

+

+ If sd is less than the number of digits necessary to represent the integer part + of the value in normal (fixed-point) notation, then exponential notation is used. +

+

+ If sd is omitted, the return value is the same as + toString. +

+

+ If rm is omitted, rounding mode rounding is + used. +

+

Throws on an invalid sd or rm value.

+
+x = 45.6
+y = new Decimal(x)
+x.toPrecision()                          // '45.6'
+y.toPrecision()                          // '45.6'
+x.toPrecision(1)                         // '5e+1'
+y.toPrecision(1)                         // '5e+1'
+y.toPrecision(2, Decimal.ROUND_UP)       // '4.6e+1'
+y.toPrecision(2, Decimal.DOWN)           // '4.5e+1'
+x.toPrecision(5)                         // '45.600'
+y.toPrecision(5)                         // '45.600'
+ + + +
+ toSignificantDigits.toSD([sd [, rm]]) ⇒ Decimal +
+

+ sd: number: integer, 1 to 1e+9 inclusive.
+ rm: number: integer, 0 to 8 inclusive. +

+

+ Returns a new Decimal whose value is the value of this Decimal rounded to sd + significant digits using rounding mode rm. +

+

+ If sd is omitted, the return value will be rounded to + precision significant digits. +

+

+ If rm is omitted, rounding mode rounding + will be used. +

+

Throws on an invalid sd or rm value.

+
+Decimal.set({ precision: 5, rounding: 4 })
+x = new Decimal(9876.54321)
+
+x.toSignificantDigits()                          // '9876.5'
+x.toSignificantDigits(6)                         // '9876.54'
+x.toSignificantDigits(6, Decimal.ROUND_UP)       // '9876.55'
+x.toSD(2)                                        // '9900'
+x.toSD(2, 1)                                     // '9800'
+x                                                // '9876.54321'
+ + + +
toString.toString() ⇒ string
+

Returns a string representing the value of this Decimal.

+

+ If this Decimal has a positive exponent that is equal to or greater than + toExpPos, or a negative exponent equal to or less than + toExpNeg, then exponential notation will be returned. +

+
+x = new Decimal(750000)
+x.toString()                             // '750000'
+Decimal.set({ toExpPos: 5 })
+x.toString()                             // '7.5e+5'
+
+Decimal.set({ precision: 4 })
+y = new Decimal('1.23456789')
+y.toString()                             // '1.23456789'
+ + + +
truncated.trunc() ⇒ Decimal
+

+ Returns a new Decimal whose value is the value of this Decimal truncated to a whole number. +

+

+ The return value is not affected by the value of the + precision setting. +

+
+x = new Decimal(123.456)
+x.truncated()                            // '123'
+y = new Decimal(-12.3)
+y.trunc()                                // '-12'
+ + + +
valueOf.valueOf() ⇒ string
+

As toString, but zero is signed.

+
+x = new Decimal(-0)
+x.valueOf()                              // '-0'
+ + + + + + +

Properties

+

+ The value of a Decimal is stored in a normalised base 10000000 floating point + format. +

+

+ A Decimal instance is an object with three properties: +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
PropertyDescriptionTypeValue
ddigitsnumber[] Array of integers, each 0 - 1e7, or null
eexponentnumberInteger, -9e15 to 9e15 inclusive, or NaN
ssignnumber-1, 1, or NaN
+

All the properties are best considered to be read-only.

+

+ As with JavaScript numbers, the original exponent and fractional trailing zeros of a value + are not preserved. +

+
+x = new Decimal(0.123)                   // '0.123'
+x.toExponential()                        // '1.23e-1'
+x.d                                      // [ 1230000 ]
+x.e                                      // -1
+x.s                                      // 1
+
+y = new Number(-123.4567000e+2)          // '-12345.67'
+y.toExponential()                        // '-1.234567e+4'
+z = new Decimal('-123.4567000e+2')       // '-12345.67'
+z.toExponential()                        // '-1.234567e+4'
+z.d                                      // [ 12345, 6700000 ]
+z.e                                      // 4
+z.s                                      // -1
+ + + +

Zero, NaN and Infinity

+

+ The table below shows how ±0, NaN and + ±Infinity are stored. +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
±0NaN±Infinity
 d [0]nullnull
 e 0NaNNaN
 s ±1NaN±1
+
+x = new Number(-0)                       // 0
+1 / x == -Infinity                       // true
+
+y = new Decimal(-0)
+y.d                                      // '0' ( [0].toString() )
+y.e                                      //  0
+y.s                                      // -1
+y.toString()                             // '0'
+y.valueOf()                              // '-0'
+ + + +

Errors

+

+ The errors that are thrown are generic Error objects whose message + property begins with "[DecimalError]". +

+

To determine if an exception is a Decimal Error:

+
+try {
+    // ...
+} catch (e) {
+    if ( e instanceof Error && /DecimalError/.test(e.message) ) {
+        // ...
+    }
+}
+ + + +

Pi

+

+ The maximum precision of the trigonometric methods is dependent on the internal value of the + constant pi, which is defined as the string PI near the top of the source file. +

+

+ It has a precision of 1025 digits, meaning that the trigonometric methods + can calculate up to just over 1000 digits, but the actual figure depends on the + precision of the argument passed to them. To calculate the actual figure use: +

+

maximum_result_precision = 1000 - argument_precision

+ For example, the following both work fine: +
+Decimal.set({precision: 991}).tan(123456789)
+Decimal.set({precision: 9}).tan(991_digit_number)
+

+ as, for each, the result precision plus the argument precision, i.e. 991 + 9 and + 9 + 991, is less than or equal to 1000. +

+

+ If greater precision is required then the value of PI will need to be extended to + about 25 digits more than the precision required. The time taken by the methods + will then be the limiting factor. +

+

+ The value can also be shortened to reduce the size of the source file if such high precision + is not required. +

+

To get the value of pi:

+
+pi = Decimal.acos(-1)
+ + + +

FAQ

+
Why are trailing fractional zeros removed from Decimals?
+

+ Some arbitrary-precision libraries retain trailing fractional zeros as they can indicate the + precision of a value. This can be useful but the results of arithmetic operations can be + misleading. +

+
+x = new BigDecimal("1.0")
+y = new BigDecimal("1.1000")
+z = x.add(y)                      // 2.1000
+
+x = new BigDecimal("1.20")
+y = new BigDecimal("3.45000")
+z = x.multiply(y)                 // 4.1400000
+

+ To specify the precision of a value is to specify that the value lies + within a certain range. +

+

+ In the first example, x has a value of 1.0. The trailing zero shows + the precision of the value, implying that it is in the range 0.95 to + 1.05. Similarly, the precision indicated by the trailing zeros of y + indicates that the value is in the range 1.09995 to 1.10005. +

+

+ If we add the two lowest values in the ranges we have, 0.95 + 1.09995 = 2.04995, + and if we add the two highest values we have, 1.05 + 1.10005 = 2.15005, so the + range of the result of the addition implied by the precision of its operands is + 2.04995 to 2.15005. +

+

+ The result given by BigDecimal of 2.1000 however, indicates that the value is in + the range 2.09995 to 2.10005 and therefore the precision implied by + its trailing zeros may be misleading. +

+

+ In the second example, the true range is 4.122744 to 4.157256 yet + the BigDecimal answer of 4.1400000 indicates a range of 4.13999995 + to 4.14000005. Again, the precision implied by the trailing zeros may be + misleading. +

+

+ This library, like binary floating point and most calculators, does not retain trailing + fractional zeros. Instead, the toExponential, toFixed and + toPrecision methods enable trailing zeros to be added if and when required.
+

+
+ + + diff --git a/node_modules/decimal.js/package.json b/node_modules/decimal.js/package.json new file mode 100644 index 0000000..fade88d --- /dev/null +++ b/node_modules/decimal.js/package.json @@ -0,0 +1,65 @@ +{ + "_from": "decimal.js@^10.2.0", + "_id": "decimal.js@10.2.0", + "_inBundle": false, + "_integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", + "_location": "/decimal.js", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "decimal.js@^10.2.0", + "name": "decimal.js", + "escapedName": "decimal.js", + "rawSpec": "^10.2.0", + "saveSpec": null, + "fetchSpec": "^10.2.0" + }, + "_requiredBy": [ + "/jsdom" + ], + "_resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.0.tgz", + "_shasum": "39466113a9e036111d02f82489b5fd6b0b5ed231", + "_spec": "decimal.js@^10.2.0", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\jsdom", + "author": { + "name": "Michael Mclaughlin", + "email": "M8ch88l@gmail.com" + }, + "browser": "decimal.js", + "bugs": { + "url": "https://github.com/MikeMcl/decimal.js/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "An arbitrary-precision Decimal type for JavaScript.", + "homepage": "https://github.com/MikeMcl/decimal.js#readme", + "keywords": [ + "arbitrary", + "precision", + "arithmetic", + "big", + "number", + "decimal", + "float", + "biginteger", + "bigdecimal", + "bignumber", + "bigint", + "bignum" + ], + "license": "MIT", + "main": "decimal", + "module": "decimal.mjs", + "name": "decimal.js", + "repository": { + "type": "git", + "url": "git+https://github.com/MikeMcl/decimal.js.git" + }, + "scripts": { + "build": "uglifyjs decimal.js --source-map url=decimal.min.js.map -c -m -o decimal.min.js", + "test": "node ./test/test.js" + }, + "types": "decimal.d.ts", + "version": "10.2.0" +} diff --git a/node_modules/domexception/README.md b/node_modules/domexception/README.md index 0e9eef3..fc1ef59 100644 --- a/node_modules/domexception/README.md +++ b/node_modules/domexception/README.md @@ -17,3 +17,15 @@ console.assert(e2.code === 7); console.assert(DOMException.INUSE_ATTRIBUTE_ERR === 10); ``` + +## APIs + +This package exposes two flavors of the `DOMException` interface depending on the imported module. + +### `domexception` module + +This module default-exports the `DOMException` interface constructor. + +### `domexception/webidl2js-wrapper` module + +This module exports the `DOMException` [interface wrapper API](https://github.com/jsdom/webidl2js#for-interfaces) generated by [webidl2js](https://github.com/jsdom/webidl2js). diff --git a/node_modules/domexception/index.js b/node_modules/domexception/index.js new file mode 100644 index 0000000..6651596 --- /dev/null +++ b/node_modules/domexception/index.js @@ -0,0 +1,7 @@ +"use strict"; +const DOMException = require("./webidl2js-wrapper.js"); + +const sharedGlobalObject = { Error }; +DOMException.install(sharedGlobalObject); + +module.exports = sharedGlobalObject.DOMException; diff --git a/node_modules/domexception/lib/DOMException-impl.js b/node_modules/domexception/lib/DOMException-impl.js index 7852f92..7395751 100644 --- a/node_modules/domexception/lib/DOMException-impl.js +++ b/node_modules/domexception/lib/DOMException-impl.js @@ -3,7 +3,7 @@ const legacyErrorCodes = require("./legacy-error-codes.json"); const idlUtils = require("./utils.js"); exports.implementation = class DOMExceptionImpl { - constructor([message, name]) { + constructor(globalObject, [message, name]) { this.name = name; this.message = message; } diff --git a/node_modules/domexception/lib/DOMException.js b/node_modules/domexception/lib/DOMException.js index 768ad24..b63c31d 100644 --- a/node_modules/domexception/lib/DOMException.js +++ b/node_modules/domexception/lib/DOMException.js @@ -4,303 +4,20 @@ const conversions = require("webidl-conversions"); const utils = require("./utils.js"); const impl = utils.implSymbol; - -function DOMException() { - const args = []; - for (let i = 0; i < arguments.length && i < 2; ++i) { - args[i] = arguments[i]; - } - - if (args[0] !== undefined) { - args[0] = conversions["DOMString"](args[0], { context: "Failed to construct 'DOMException': parameter 1" }); - } else { - args[0] = ""; - } - - if (args[1] !== undefined) { - args[1] = conversions["DOMString"](args[1], { context: "Failed to construct 'DOMException': parameter 2" }); - } else { - args[1] = "Error"; - } - - iface.setup(this, args); -} - -Object.defineProperty(DOMException, "prototype", { - value: DOMException.prototype, - writable: false, - enumerable: false, - configurable: false -}); - -Object.defineProperty(DOMException.prototype, "name", { - get() { - return this[impl]["name"]; - }, - - enumerable: true, - configurable: true -}); - -Object.defineProperty(DOMException.prototype, "message", { - get() { - return this[impl]["message"]; - }, - - enumerable: true, - configurable: true -}); - -Object.defineProperty(DOMException.prototype, "code", { - get() { - return this[impl]["code"]; - }, - - enumerable: true, - configurable: true -}); - -Object.defineProperty(DOMException, "INDEX_SIZE_ERR", { - value: 1, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "INDEX_SIZE_ERR", { - value: 1, - enumerable: true -}); - -Object.defineProperty(DOMException, "DOMSTRING_SIZE_ERR", { - value: 2, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "DOMSTRING_SIZE_ERR", { - value: 2, - enumerable: true -}); - -Object.defineProperty(DOMException, "HIERARCHY_REQUEST_ERR", { - value: 3, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "HIERARCHY_REQUEST_ERR", { - value: 3, - enumerable: true -}); - -Object.defineProperty(DOMException, "WRONG_DOCUMENT_ERR", { - value: 4, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "WRONG_DOCUMENT_ERR", { - value: 4, - enumerable: true -}); - -Object.defineProperty(DOMException, "INVALID_CHARACTER_ERR", { - value: 5, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "INVALID_CHARACTER_ERR", { - value: 5, - enumerable: true -}); - -Object.defineProperty(DOMException, "NO_DATA_ALLOWED_ERR", { - value: 6, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "NO_DATA_ALLOWED_ERR", { - value: 6, - enumerable: true -}); - -Object.defineProperty(DOMException, "NO_MODIFICATION_ALLOWED_ERR", { - value: 7, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "NO_MODIFICATION_ALLOWED_ERR", { - value: 7, - enumerable: true -}); - -Object.defineProperty(DOMException, "NOT_FOUND_ERR", { - value: 8, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "NOT_FOUND_ERR", { - value: 8, - enumerable: true -}); - -Object.defineProperty(DOMException, "NOT_SUPPORTED_ERR", { - value: 9, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "NOT_SUPPORTED_ERR", { - value: 9, - enumerable: true -}); - -Object.defineProperty(DOMException, "INUSE_ATTRIBUTE_ERR", { - value: 10, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "INUSE_ATTRIBUTE_ERR", { - value: 10, - enumerable: true -}); - -Object.defineProperty(DOMException, "INVALID_STATE_ERR", { - value: 11, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "INVALID_STATE_ERR", { - value: 11, - enumerable: true -}); - -Object.defineProperty(DOMException, "SYNTAX_ERR", { - value: 12, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "SYNTAX_ERR", { - value: 12, - enumerable: true -}); - -Object.defineProperty(DOMException, "INVALID_MODIFICATION_ERR", { - value: 13, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "INVALID_MODIFICATION_ERR", { - value: 13, - enumerable: true -}); - -Object.defineProperty(DOMException, "NAMESPACE_ERR", { - value: 14, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "NAMESPACE_ERR", { - value: 14, - enumerable: true -}); - -Object.defineProperty(DOMException, "INVALID_ACCESS_ERR", { - value: 15, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "INVALID_ACCESS_ERR", { - value: 15, - enumerable: true -}); - -Object.defineProperty(DOMException, "VALIDATION_ERR", { - value: 16, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "VALIDATION_ERR", { - value: 16, - enumerable: true -}); - -Object.defineProperty(DOMException, "TYPE_MISMATCH_ERR", { - value: 17, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "TYPE_MISMATCH_ERR", { - value: 17, - enumerable: true -}); - -Object.defineProperty(DOMException, "SECURITY_ERR", { - value: 18, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "SECURITY_ERR", { - value: 18, - enumerable: true -}); - -Object.defineProperty(DOMException, "NETWORK_ERR", { - value: 19, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "NETWORK_ERR", { - value: 19, - enumerable: true -}); - -Object.defineProperty(DOMException, "ABORT_ERR", { - value: 20, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "ABORT_ERR", { - value: 20, - enumerable: true -}); - -Object.defineProperty(DOMException, "URL_MISMATCH_ERR", { - value: 21, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "URL_MISMATCH_ERR", { - value: 21, - enumerable: true -}); - -Object.defineProperty(DOMException, "QUOTA_EXCEEDED_ERR", { - value: 22, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "QUOTA_EXCEEDED_ERR", { - value: 22, - enumerable: true -}); - -Object.defineProperty(DOMException, "TIMEOUT_ERR", { - value: 23, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "TIMEOUT_ERR", { - value: 23, - enumerable: true -}); - -Object.defineProperty(DOMException, "INVALID_NODE_TYPE_ERR", { - value: 24, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "INVALID_NODE_TYPE_ERR", { - value: 24, - enumerable: true -}); - -Object.defineProperty(DOMException, "DATA_CLONE_ERR", { - value: 25, - enumerable: true -}); -Object.defineProperty(DOMException.prototype, "DATA_CLONE_ERR", { - value: 25, - enumerable: true -}); - -Object.defineProperty(DOMException.prototype, Symbol.toStringTag, { - value: "DOMException", - writable: false, - enumerable: false, - configurable: true -}); +const ctorRegistry = utils.ctorRegistrySymbol; const iface = { - mixedInto: [], + // When an interface-module that implements this interface as a mixin is loaded, it will append its own `.is()` + // method into this array. It allows objects that directly implements *those* interfaces to be recognized as + // implementing this mixin interface. + _mixedIntoPredicates: [], is(obj) { if (obj) { - if (obj[impl] instanceof Impl.implementation) { + if (utils.hasOwn(obj, impl) && obj[impl] instanceof Impl.implementation) { return true; } - for (let i = 0; i < module.exports.mixedInto.length; ++i) { - if (obj instanceof module.exports.mixedInto[i]) { + for (const isMixedInto of module.exports._mixedIntoPredicates) { + if (isMixedInto(obj)) { return true; } } @@ -314,8 +31,8 @@ const iface = { } const wrapper = utils.wrapperForImpl(obj); - for (let i = 0; i < module.exports.mixedInto.length; ++i) { - if (wrapper instanceof module.exports.mixedInto[i]) { + for (const isMixedInto of module.exports._mixedIntoPredicates) { + if (isMixedInto(wrapper)) { return true; } } @@ -329,40 +46,160 @@ const iface = { throw new TypeError(`${context} is not of type 'DOMException'.`); }, - create(constructorArgs, privateData) { - let obj = Object.create(DOMException.prototype); - this.setup(obj, constructorArgs, privateData); + create(globalObject, constructorArgs, privateData) { + if (globalObject[ctorRegistry] === undefined) { + throw new Error("Internal error: invalid global object"); + } + + const ctor = globalObject[ctorRegistry]["DOMException"]; + if (ctor === undefined) { + throw new Error("Internal error: constructor DOMException is not installed on the passed global object"); + } + + let obj = Object.create(ctor.prototype); + obj = iface.setup(obj, globalObject, constructorArgs, privateData); return obj; }, - createImpl(constructorArgs, privateData) { - let obj = Object.create(DOMException.prototype); - this.setup(obj, constructorArgs, privateData); + createImpl(globalObject, constructorArgs, privateData) { + const obj = iface.create(globalObject, constructorArgs, privateData); return utils.implForWrapper(obj); }, _internalSetup(obj) {}, - setup(obj, constructorArgs, privateData) { - if (!privateData) privateData = {}; - + setup(obj, globalObject, constructorArgs = [], privateData = {}) { privateData.wrapper = obj; - this._internalSetup(obj); + iface._internalSetup(obj); Object.defineProperty(obj, impl, { - value: new Impl.implementation(constructorArgs, privateData), - writable: false, - enumerable: false, + value: new Impl.implementation(globalObject, constructorArgs, privateData), configurable: true }); + obj[impl][utils.wrapperSymbol] = obj; if (Impl.init) { Impl.init(obj[impl], privateData); } + return obj; }, - interface: DOMException, - expose: { - Window: { DOMException }, - Worker: { DOMException } + + install(globalObject) { + class DOMException { + constructor() { + const args = []; + { + let curArg = arguments[0]; + if (curArg !== undefined) { + curArg = conversions["DOMString"](curArg, { context: "Failed to construct 'DOMException': parameter 1" }); + } else { + curArg = ""; + } + args.push(curArg); + } + { + let curArg = arguments[1]; + if (curArg !== undefined) { + curArg = conversions["DOMString"](curArg, { context: "Failed to construct 'DOMException': parameter 2" }); + } else { + curArg = "Error"; + } + args.push(curArg); + } + return iface.setup(Object.create(new.target.prototype), globalObject, args); + } + + get name() { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + + return this[impl]["name"]; + } + + get message() { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + + return this[impl]["message"]; + } + + get code() { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + + return this[impl]["code"]; + } + } + Object.defineProperties(DOMException.prototype, { + name: { enumerable: true }, + message: { enumerable: true }, + code: { enumerable: true }, + [Symbol.toStringTag]: { value: "DOMException", configurable: true }, + INDEX_SIZE_ERR: { value: 1, enumerable: true }, + DOMSTRING_SIZE_ERR: { value: 2, enumerable: true }, + HIERARCHY_REQUEST_ERR: { value: 3, enumerable: true }, + WRONG_DOCUMENT_ERR: { value: 4, enumerable: true }, + INVALID_CHARACTER_ERR: { value: 5, enumerable: true }, + NO_DATA_ALLOWED_ERR: { value: 6, enumerable: true }, + NO_MODIFICATION_ALLOWED_ERR: { value: 7, enumerable: true }, + NOT_FOUND_ERR: { value: 8, enumerable: true }, + NOT_SUPPORTED_ERR: { value: 9, enumerable: true }, + INUSE_ATTRIBUTE_ERR: { value: 10, enumerable: true }, + INVALID_STATE_ERR: { value: 11, enumerable: true }, + SYNTAX_ERR: { value: 12, enumerable: true }, + INVALID_MODIFICATION_ERR: { value: 13, enumerable: true }, + NAMESPACE_ERR: { value: 14, enumerable: true }, + INVALID_ACCESS_ERR: { value: 15, enumerable: true }, + VALIDATION_ERR: { value: 16, enumerable: true }, + TYPE_MISMATCH_ERR: { value: 17, enumerable: true }, + SECURITY_ERR: { value: 18, enumerable: true }, + NETWORK_ERR: { value: 19, enumerable: true }, + ABORT_ERR: { value: 20, enumerable: true }, + URL_MISMATCH_ERR: { value: 21, enumerable: true }, + QUOTA_EXCEEDED_ERR: { value: 22, enumerable: true }, + TIMEOUT_ERR: { value: 23, enumerable: true }, + INVALID_NODE_TYPE_ERR: { value: 24, enumerable: true }, + DATA_CLONE_ERR: { value: 25, enumerable: true } + }); + Object.defineProperties(DOMException, { + INDEX_SIZE_ERR: { value: 1, enumerable: true }, + DOMSTRING_SIZE_ERR: { value: 2, enumerable: true }, + HIERARCHY_REQUEST_ERR: { value: 3, enumerable: true }, + WRONG_DOCUMENT_ERR: { value: 4, enumerable: true }, + INVALID_CHARACTER_ERR: { value: 5, enumerable: true }, + NO_DATA_ALLOWED_ERR: { value: 6, enumerable: true }, + NO_MODIFICATION_ALLOWED_ERR: { value: 7, enumerable: true }, + NOT_FOUND_ERR: { value: 8, enumerable: true }, + NOT_SUPPORTED_ERR: { value: 9, enumerable: true }, + INUSE_ATTRIBUTE_ERR: { value: 10, enumerable: true }, + INVALID_STATE_ERR: { value: 11, enumerable: true }, + SYNTAX_ERR: { value: 12, enumerable: true }, + INVALID_MODIFICATION_ERR: { value: 13, enumerable: true }, + NAMESPACE_ERR: { value: 14, enumerable: true }, + INVALID_ACCESS_ERR: { value: 15, enumerable: true }, + VALIDATION_ERR: { value: 16, enumerable: true }, + TYPE_MISMATCH_ERR: { value: 17, enumerable: true }, + SECURITY_ERR: { value: 18, enumerable: true }, + NETWORK_ERR: { value: 19, enumerable: true }, + ABORT_ERR: { value: 20, enumerable: true }, + URL_MISMATCH_ERR: { value: 21, enumerable: true }, + QUOTA_EXCEEDED_ERR: { value: 22, enumerable: true }, + TIMEOUT_ERR: { value: 23, enumerable: true }, + INVALID_NODE_TYPE_ERR: { value: 24, enumerable: true }, + DATA_CLONE_ERR: { value: 25, enumerable: true } + }); + if (globalObject[ctorRegistry] === undefined) { + globalObject[ctorRegistry] = Object.create(null); + } + globalObject[ctorRegistry]["DOMException"] = DOMException; + + Object.defineProperty(globalObject, "DOMException", { + configurable: true, + writable: true, + value: DOMException + }); } }; // iface module.exports = iface; -const Impl = require(".//DOMException-impl.js"); +const Impl = require("./DOMException-impl.js"); diff --git a/node_modules/domexception/lib/public-api.js b/node_modules/domexception/lib/public-api.js deleted file mode 100644 index 6c434fd..0000000 --- a/node_modules/domexception/lib/public-api.js +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; - -module.exports = require("./DOMException").interface; - -Object.setPrototypeOf(module.exports.prototype, Error.prototype); diff --git a/node_modules/domexception/lib/utils.js b/node_modules/domexception/lib/utils.js index b505596..c020d0b 100644 --- a/node_modules/domexception/lib/utils.js +++ b/node_modules/domexception/lib/utils.js @@ -5,35 +5,14 @@ function isObject(value) { return typeof value === "object" && value !== null || typeof value === "function"; } -function getReferenceToBytes(bufferSource) { - // Node.js' Buffer does not allow subclassing for now, so we can get away with a prototype object check for perf. - if (Object.getPrototypeOf(bufferSource) === Buffer.prototype) { - return bufferSource; - } - if (bufferSource instanceof ArrayBuffer) { - return Buffer.from(bufferSource); - } - return Buffer.from(bufferSource.buffer, bufferSource.byteOffset, bufferSource.byteLength); -} - -function getCopyToBytes(bufferSource) { - return Buffer.from(getReferenceToBytes(bufferSource)); -} - -function mixin(target, source) { - const keys = Object.getOwnPropertyNames(source); - for (let i = 0; i < keys.length; ++i) { - if (keys[i] in target) { - continue; - } - - Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); - } +function hasOwn(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); } const wrapperSymbol = Symbol("wrapper"); const implSymbol = Symbol("impl"); const sameObjectCaches = Symbol("SameObject caches"); +const ctorRegistrySymbol = Symbol.for("[webidl2js] constructor registry"); function getSameObject(wrapper, prop, creator) { if (!wrapper[sameObjectCaches]) { @@ -69,18 +48,68 @@ function tryImplForWrapper(wrapper) { const iterInternalSymbol = Symbol("internal"); const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); +function isArrayIndexPropName(P) { + if (typeof P !== "string") { + return false; + } + const i = P >>> 0; + if (i === Math.pow(2, 32) - 1) { + return false; + } + const s = `${i}`; + if (P !== s) { + return false; + } + return true; +} + +const byteLengthGetter = + Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, "byteLength").get; +function isArrayBuffer(value) { + try { + byteLengthGetter.call(value); + return true; + } catch (e) { + return false; + } +} + +const supportsPropertyIndex = Symbol("supports property index"); +const supportedPropertyIndices = Symbol("supported property indices"); +const supportsPropertyName = Symbol("supports property name"); +const supportedPropertyNames = Symbol("supported property names"); +const indexedGet = Symbol("indexed property get"); +const indexedSetNew = Symbol("indexed property set new"); +const indexedSetExisting = Symbol("indexed property set existing"); +const namedGet = Symbol("named property get"); +const namedSetNew = Symbol("named property set new"); +const namedSetExisting = Symbol("named property set existing"); +const namedDelete = Symbol("named property delete"); + module.exports = exports = { isObject, - getReferenceToBytes, - getCopyToBytes, - mixin, + hasOwn, wrapperSymbol, implSymbol, getSameObject, + ctorRegistrySymbol, wrapperForImpl, implForWrapper, tryWrapperForImpl, tryImplForWrapper, iterInternalSymbol, - IteratorPrototype + IteratorPrototype, + isArrayBuffer, + isArrayIndexPropName, + supportsPropertyIndex, + supportedPropertyIndices, + supportsPropertyName, + supportedPropertyNames, + indexedGet, + indexedSetNew, + indexedSetExisting, + namedGet, + namedSetNew, + namedSetExisting, + namedDelete }; diff --git a/node_modules/domexception/node_modules/webidl-conversions/LICENSE.md b/node_modules/domexception/node_modules/webidl-conversions/LICENSE.md new file mode 100644 index 0000000..d4a994f --- /dev/null +++ b/node_modules/domexception/node_modules/webidl-conversions/LICENSE.md @@ -0,0 +1,12 @@ +# The BSD 2-Clause License + +Copyright (c) 2014, Domenic Denicola +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. + +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/domexception/node_modules/webidl-conversions/README.md b/node_modules/domexception/node_modules/webidl-conversions/README.md new file mode 100644 index 0000000..b2905df --- /dev/null +++ b/node_modules/domexception/node_modules/webidl-conversions/README.md @@ -0,0 +1,79 @@ +# Web IDL Type Conversions on JavaScript Values + +This package implements, in JavaScript, the algorithms to convert a given JavaScript value according to a given [Web IDL](http://heycam.github.io/webidl/) [type](http://heycam.github.io/webidl/#idl-types). + +The goal is that you should be able to write code like + +```js +"use strict"; +const conversions = require("webidl-conversions"); + +function doStuff(x, y) { + x = conversions["boolean"](x); + y = conversions["unsigned long"](y); + // actual algorithm code here +} +``` + +and your function `doStuff` will behave the same as a Web IDL operation declared as + +```webidl +void doStuff(boolean x, unsigned long y); +``` + +## API + +This package's main module's default export is an object with a variety of methods, each corresponding to a different Web IDL type. Each method, when invoked on a JavaScript value, will give back the new JavaScript value that results after passing through the Web IDL conversion rules. (See below for more details on what that means.) Alternately, the method could throw an error, if the Web IDL algorithm is specified to do so: for example `conversions["float"](NaN)` [will throw a `TypeError`](http://heycam.github.io/webidl/#es-float). + +Each method also accepts a second, optional, parameter for miscellaneous options. For conversion methods that throw errors, a string option `{ context }` may be provided to provide more information in the error message. (For example, `conversions["float"](NaN, { context: "Argument 1 of Interface's operation" })` will throw an error with message `"Argument 1 of Interface's operation is not a finite floating-point value."`) Specific conversions may also accept other options, the details of which can be found below. + +## Conversions implemented + +Conversions for all of the basic types from the Web IDL specification are implemented: + +- [`any`](https://heycam.github.io/webidl/#es-any) +- [`void`](https://heycam.github.io/webidl/#es-void) +- [`boolean`](https://heycam.github.io/webidl/#es-boolean) +- [Integer types](https://heycam.github.io/webidl/#es-integer-types), which can additionally be provided the boolean options `{ clamp, enforceRange }` as a second parameter +- [`float`](https://heycam.github.io/webidl/#es-float), [`unrestricted float`](https://heycam.github.io/webidl/#es-unrestricted-float) +- [`double`](https://heycam.github.io/webidl/#es-double), [`unrestricted double`](https://heycam.github.io/webidl/#es-unrestricted-double) +- [`DOMString`](https://heycam.github.io/webidl/#es-DOMString), which can additionally be provided the boolean option `{ treatNullAsEmptyString }` as a second parameter +- [`ByteString`](https://heycam.github.io/webidl/#es-ByteString), [`USVString`](https://heycam.github.io/webidl/#es-USVString) +- [`object`](https://heycam.github.io/webidl/#es-object) +- [Buffer source types](https://heycam.github.io/webidl/#es-buffer-source-types) + +Additionally, for convenience, the following derived type definitions are implemented: + +- [`ArrayBufferView`](https://heycam.github.io/webidl/#ArrayBufferView) +- [`BufferSource`](https://heycam.github.io/webidl/#BufferSource) +- [`DOMTimeStamp`](https://heycam.github.io/webidl/#DOMTimeStamp) +- [`Function`](https://heycam.github.io/webidl/#Function) +- [`VoidFunction`](https://heycam.github.io/webidl/#VoidFunction) (although it will not censor the return type) + +Derived types, such as nullable types, promise types, sequences, records, etc. are not handled by this library. You may wish to investigate the [webidl2js](https://github.com/jsdom/webidl2js) project. + +### A note on the `long long` types + +The `long long` and `unsigned long long` Web IDL types can hold values that cannot be stored in JavaScript numbers, so the conversion is imperfect. For example, converting the JavaScript number `18446744073709552000` to a Web IDL `long long` is supposed to produce the Web IDL value `-18446744073709551232`. Since we are representing our Web IDL values in JavaScript, we can't represent `-18446744073709551232`, so we instead the best we could do is `-18446744073709552000` as the output. + +This library actually doesn't even get that far. Producing those results would require doing accurate modular arithmetic on 64-bit intermediate values, but JavaScript does not make this easy. We could pull in a big-integer library as a dependency, but in lieu of that, we for now have decided to just produce inaccurate results if you pass in numbers that are not strictly between `Number.MIN_SAFE_INTEGER` and `Number.MAX_SAFE_INTEGER`. + +## Background + +What's actually going on here, conceptually, is pretty weird. Let's try to explain. + +Web IDL, as part of its madness-inducing design, has its own type system. When people write algorithms in web platform specs, they usually operate on Web IDL values, i.e. instances of Web IDL types. For example, if they were specifying the algorithm for our `doStuff` operation above, they would treat `x` as a Web IDL value of [Web IDL type `boolean`](http://heycam.github.io/webidl/#idl-boolean). Crucially, they would _not_ treat `x` as a JavaScript variable whose value is either the JavaScript `true` or `false`. They're instead working in a different type system altogether, with its own rules. + +Separately from its type system, Web IDL defines a ["binding"](http://heycam.github.io/webidl/#ecmascript-binding) of the type system into JavaScript. This contains rules like: when you pass a JavaScript value to the JavaScript method that manifests a given Web IDL operation, how does that get converted into a Web IDL value? For example, a JavaScript `true` passed in the position of a Web IDL `boolean` argument becomes a Web IDL `true`. But, a JavaScript `true` passed in the position of a [Web IDL `unsigned long`](http://heycam.github.io/webidl/#idl-unsigned-long) becomes a Web IDL `1`. And so on. + +Finally, we have the actual implementation code. This is usually C++, although these days [some smart people are using Rust](https://github.com/servo/servo). The implementation, of course, has its own type system. So when they implement the Web IDL algorithms, they don't actually use Web IDL values, since those aren't "real" outside of specs. Instead, implementations apply the Web IDL binding rules in such a way as to convert incoming JavaScript values into C++ values. For example, if code in the browser called `doStuff(true, true)`, then the implementation code would eventually receive a C++ `bool` containing `true` and a C++ `uint32_t` containing `1`. + +The upside of all this is that implementations can abstract all the conversion logic away, letting Web IDL handle it, and focus on implementing the relevant methods in C++ with values of the correct type already provided. That is payoff of Web IDL, in a nutshell. + +And getting to that payoff is the goal of _this_ project—but for JavaScript implementations, instead of C++ ones. That is, this library is designed to make it easier for JavaScript developers to write functions that behave like a given Web IDL operation. So conceptually, the conversion pipeline, which in its general form is JavaScript values ↦ Web IDL values ↦ implementation-language values, in this case becomes JavaScript values ↦ Web IDL values ↦ JavaScript values. And that intermediate step is where all the logic is performed: a JavaScript `true` becomes a Web IDL `1` in an unsigned long context, which then becomes a JavaScript `1`. + +## Don't use this + +Seriously, why would you ever use this? You really shouldn't. Web IDL is … strange, and you shouldn't be emulating its semantics. If you're looking for a generic argument-processing library, you should find one with better rules than those from Web IDL. In general, your JavaScript should not be trying to become more like Web IDL; if anything, we should fix Web IDL to make it more like JavaScript. + +The _only_ people who should use this are those trying to create faithful implementations (or polyfills) of web platform interfaces defined in Web IDL. Its main consumer is the [jsdom](https://github.com/jsdom/jsdom) project. diff --git a/node_modules/domexception/node_modules/webidl-conversions/lib/index.js b/node_modules/domexception/node_modules/webidl-conversions/lib/index.js new file mode 100644 index 0000000..bae66dc --- /dev/null +++ b/node_modules/domexception/node_modules/webidl-conversions/lib/index.js @@ -0,0 +1,361 @@ +"use strict"; + +function _(message, opts) { + return `${opts && opts.context ? opts.context : "Value"} ${message}.`; +} + +function type(V) { + if (V === null) { + return "Null"; + } + switch (typeof V) { + case "undefined": + return "Undefined"; + case "boolean": + return "Boolean"; + case "number": + return "Number"; + case "string": + return "String"; + case "symbol": + return "Symbol"; + case "object": + // Falls through + case "function": + // Falls through + default: + // Per ES spec, typeof returns an implemention-defined value that is not any of the existing ones for + // uncallable non-standard exotic objects. Yet Type() which the Web IDL spec depends on returns Object for + // such cases. So treat the default case as an object. + return "Object"; + } +} + +// Round x to the nearest integer, choosing the even integer if it lies halfway between two. +function evenRound(x) { + // There are four cases for numbers with fractional part being .5: + // + // case | x | floor(x) | round(x) | expected | x <> 0 | x % 1 | x & 1 | example + // 1 | 2n + 0.5 | 2n | 2n + 1 | 2n | > | 0.5 | 0 | 0.5 -> 0 + // 2 | 2n + 1.5 | 2n + 1 | 2n + 2 | 2n + 2 | > | 0.5 | 1 | 1.5 -> 2 + // 3 | -2n - 0.5 | -2n - 1 | -2n | -2n | < | -0.5 | 0 | -0.5 -> 0 + // 4 | -2n - 1.5 | -2n - 2 | -2n - 1 | -2n - 2 | < | -0.5 | 1 | -1.5 -> -2 + // (where n is a non-negative integer) + // + // Branch here for cases 1 and 4 + if ((x > 0 && (x % 1) === +0.5 && (x & 1) === 0) || + (x < 0 && (x % 1) === -0.5 && (x & 1) === 1)) { + return censorNegativeZero(Math.floor(x)); + } + + return censorNegativeZero(Math.round(x)); +} + +function integerPart(n) { + return censorNegativeZero(Math.trunc(n)); +} + +function sign(x) { + return x < 0 ? -1 : 1; +} + +function modulo(x, y) { + // https://tc39.github.io/ecma262/#eqn-modulo + // Note that http://stackoverflow.com/a/4467559/3191 does NOT work for large modulos + const signMightNotMatch = x % y; + if (sign(y) !== sign(signMightNotMatch)) { + return signMightNotMatch + y; + } + return signMightNotMatch; +} + +function censorNegativeZero(x) { + return x === 0 ? 0 : x; +} + +function createIntegerConversion(bitLength, typeOpts) { + const isSigned = !typeOpts.unsigned; + + let lowerBound; + let upperBound; + if (bitLength === 64) { + upperBound = Math.pow(2, 53) - 1; + lowerBound = !isSigned ? 0 : -Math.pow(2, 53) + 1; + } else if (!isSigned) { + lowerBound = 0; + upperBound = Math.pow(2, bitLength) - 1; + } else { + lowerBound = -Math.pow(2, bitLength - 1); + upperBound = Math.pow(2, bitLength - 1) - 1; + } + + const twoToTheBitLength = Math.pow(2, bitLength); + const twoToOneLessThanTheBitLength = Math.pow(2, bitLength - 1); + + return (V, opts) => { + if (opts === undefined) { + opts = {}; + } + + let x = +V; + x = censorNegativeZero(x); // Spec discussion ongoing: https://github.com/heycam/webidl/issues/306 + + if (opts.enforceRange) { + if (!Number.isFinite(x)) { + throw new TypeError(_("is not a finite number", opts)); + } + + x = integerPart(x); + + if (x < lowerBound || x > upperBound) { + throw new TypeError(_( + `is outside the accepted range of ${lowerBound} to ${upperBound}, inclusive`, opts)); + } + + return x; + } + + if (!Number.isNaN(x) && opts.clamp) { + x = Math.min(Math.max(x, lowerBound), upperBound); + x = evenRound(x); + return x; + } + + if (!Number.isFinite(x) || x === 0) { + return 0; + } + x = integerPart(x); + + // Math.pow(2, 64) is not accurately representable in JavaScript, so try to avoid these per-spec operations if + // possible. Hopefully it's an optimization for the non-64-bitLength cases too. + if (x >= lowerBound && x <= upperBound) { + return x; + } + + // These will not work great for bitLength of 64, but oh well. See the README for more details. + x = modulo(x, twoToTheBitLength); + if (isSigned && x >= twoToOneLessThanTheBitLength) { + return x - twoToTheBitLength; + } + return x; + }; +} + +exports.any = V => { + return V; +}; + +exports.void = function () { + return undefined; +}; + +exports.boolean = function (val) { + return !!val; +}; + +exports.byte = createIntegerConversion(8, { unsigned: false }); +exports.octet = createIntegerConversion(8, { unsigned: true }); + +exports.short = createIntegerConversion(16, { unsigned: false }); +exports["unsigned short"] = createIntegerConversion(16, { unsigned: true }); + +exports.long = createIntegerConversion(32, { unsigned: false }); +exports["unsigned long"] = createIntegerConversion(32, { unsigned: true }); + +exports["long long"] = createIntegerConversion(64, { unsigned: false }); +exports["unsigned long long"] = createIntegerConversion(64, { unsigned: true }); + +exports.double = (V, opts) => { + const x = +V; + + if (!Number.isFinite(x)) { + throw new TypeError(_("is not a finite floating-point value", opts)); + } + + return x; +}; + +exports["unrestricted double"] = V => { + const x = +V; + + return x; +}; + +exports.float = (V, opts) => { + const x = +V; + + if (!Number.isFinite(x)) { + throw new TypeError(_("is not a finite floating-point value", opts)); + } + + if (Object.is(x, -0)) { + return x; + } + + const y = Math.fround(x); + + if (!Number.isFinite(y)) { + throw new TypeError(_("is outside the range of a single-precision floating-point value", opts)); + } + + return y; +}; + +exports["unrestricted float"] = V => { + const x = +V; + + if (isNaN(x)) { + return x; + } + + if (Object.is(x, -0)) { + return x; + } + + return Math.fround(x); +}; + +exports.DOMString = function (V, opts) { + if (opts === undefined) { + opts = {}; + } + + if (opts.treatNullAsEmptyString && V === null) { + return ""; + } + + if (typeof V === "symbol") { + throw new TypeError(_("is a symbol, which cannot be converted to a string", opts)); + } + + return String(V); +}; + +exports.ByteString = (V, opts) => { + const x = exports.DOMString(V, opts); + let c; + for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) { + if (c > 255) { + throw new TypeError(_("is not a valid ByteString", opts)); + } + } + + return x; +}; + +exports.USVString = (V, opts) => { + const S = exports.DOMString(V, opts); + const n = S.length; + const U = []; + for (let i = 0; i < n; ++i) { + const c = S.charCodeAt(i); + if (c < 0xD800 || c > 0xDFFF) { + U.push(String.fromCodePoint(c)); + } else if (0xDC00 <= c && c <= 0xDFFF) { + U.push(String.fromCodePoint(0xFFFD)); + } else if (i === n - 1) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + const d = S.charCodeAt(i + 1); + if (0xDC00 <= d && d <= 0xDFFF) { + const a = c & 0x3FF; + const b = d & 0x3FF; + U.push(String.fromCodePoint((2 << 15) + ((2 << 9) * a) + b)); + ++i; + } else { + U.push(String.fromCodePoint(0xFFFD)); + } + } + } + + return U.join(""); +}; + +exports.object = (V, opts) => { + if (type(V) !== "Object") { + throw new TypeError(_("is not an object", opts)); + } + + return V; +}; + +// Not exported, but used in Function and VoidFunction. + +// Neither Function nor VoidFunction is defined with [TreatNonObjectAsNull], so +// handling for that is omitted. +function convertCallbackFunction(V, opts) { + if (typeof V !== "function") { + throw new TypeError(_("is not a function", opts)); + } + return V; +} + +const abByteLengthGetter = + Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, "byteLength").get; + +function isArrayBuffer(V) { + try { + abByteLengthGetter.call(V); + return true; + } catch (e) { + return false; + } +} + +// I don't think we can reliably detect detached ArrayBuffers. +exports.ArrayBuffer = (V, opts) => { + if (!isArrayBuffer(V)) { + throw new TypeError(_("is not a view on an ArrayBuffer object", opts)); + } + return V; +}; + +const dvByteLengthGetter = + Object.getOwnPropertyDescriptor(DataView.prototype, "byteLength").get; +exports.DataView = (V, opts) => { + try { + dvByteLengthGetter.call(V); + return V; + } catch (e) { + throw new TypeError(_("is not a view on an DataView object", opts)); + } +}; + +[ + Int8Array, Int16Array, Int32Array, Uint8Array, + Uint16Array, Uint32Array, Uint8ClampedArray, Float32Array, Float64Array +].forEach(func => { + const name = func.name; + const article = /^[AEIOU]/.test(name) ? "an" : "a"; + exports[name] = (V, opts) => { + if (!ArrayBuffer.isView(V) || V.constructor.name !== name) { + throw new TypeError(_(`is not ${article} ${name} object`, opts)); + } + + return V; + }; +}); + +// Common definitions + +exports.ArrayBufferView = (V, opts) => { + if (!ArrayBuffer.isView(V)) { + throw new TypeError(_("is not a view on an ArrayBuffer object", opts)); + } + + return V; +}; + +exports.BufferSource = (V, opts) => { + if (!ArrayBuffer.isView(V) && !isArrayBuffer(V)) { + throw new TypeError(_("is not an ArrayBuffer object or a view on one", opts)); + } + + return V; +}; + +exports.DOMTimeStamp = exports["unsigned long long"]; + +exports.Function = convertCallbackFunction; + +exports.VoidFunction = convertCallbackFunction; diff --git a/node_modules/domexception/node_modules/webidl-conversions/package.json b/node_modules/domexception/node_modules/webidl-conversions/package.json new file mode 100644 index 0000000..238bdc6 --- /dev/null +++ b/node_modules/domexception/node_modules/webidl-conversions/package.json @@ -0,0 +1,66 @@ +{ + "_from": "webidl-conversions@^5.0.0", + "_id": "webidl-conversions@5.0.0", + "_inBundle": false, + "_integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "_location": "/domexception/webidl-conversions", + "_phantomChildren": {}, + "_requested": { + "type": "range", + "registry": true, + "raw": "webidl-conversions@^5.0.0", + "name": "webidl-conversions", + "escapedName": "webidl-conversions", + "rawSpec": "^5.0.0", + "saveSpec": null, + "fetchSpec": "^5.0.0" + }, + "_requiredBy": [ + "/domexception" + ], + "_resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "_shasum": "ae59c8a00b121543a2acc65c0434f57b0fc11aff", + "_spec": "webidl-conversions@^5.0.0", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\domexception", + "author": { + "name": "Domenic Denicola", + "email": "d@domenic.me", + "url": "https://domenic.me/" + }, + "bugs": { + "url": "https://github.com/jsdom/webidl-conversions/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "Implements the WebIDL algorithms for converting to and from JavaScript values", + "devDependencies": { + "eslint": "^6.7.2", + "mocha": "^6.2.2", + "nyc": "^14.1.1" + }, + "engines": { + "node": ">=8" + }, + "files": [ + "lib/" + ], + "homepage": "https://github.com/jsdom/webidl-conversions#readme", + "keywords": [ + "webidl", + "web", + "types" + ], + "license": "BSD-2-Clause", + "main": "lib/index.js", + "name": "webidl-conversions", + "repository": { + "type": "git", + "url": "git+https://github.com/jsdom/webidl-conversions.git" + }, + "scripts": { + "coverage": "nyc mocha test/*.js", + "lint": "eslint .", + "test": "mocha test/*.js" + }, + "version": "5.0.0" +} diff --git a/node_modules/domexception/package.json b/node_modules/domexception/package.json index 39c47bd..9256721 100644 --- a/node_modules/domexception/package.json +++ b/node_modules/domexception/package.json @@ -1,34 +1,27 @@ { - "_args": [ - [ - "domexception@1.0.1", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "domexception@1.0.1", - "_id": "domexception@1.0.1", + "_from": "domexception@^2.0.1", + "_id": "domexception@2.0.1", "_inBundle": false, - "_integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "_integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", "_location": "/domexception", "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "domexception@1.0.1", + "raw": "domexception@^2.0.1", "name": "domexception", "escapedName": "domexception", - "rawSpec": "1.0.1", + "rawSpec": "^2.0.1", "saveSpec": null, - "fetchSpec": "1.0.1" + "fetchSpec": "^2.0.1" }, "_requiredBy": [ - "/jsdom", - "/w3c-xmlserializer" + "/jsdom" ], - "_resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "_spec": "1.0.1", - "_where": "D:\\Projects\\vanillajs-seed", + "_resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "_shasum": "fb44aefba793e1574b0af6aed2801d057529f304", + "_spec": "domexception@^2.0.1", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\jsdom", "author": { "name": "Domenic Denicola", "email": "d@domenic.me", @@ -37,18 +30,25 @@ "bugs": { "url": "https://github.com/jsdom/domexception/issues" }, + "bundleDependencies": false, "dependencies": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^5.0.0" }, + "deprecated": false, "description": "An implementation of the DOMException class from browsers", "devDependencies": { - "eslint": "^4.3.0", + "eslint": "^6.7.2", "mkdirp": "^0.5.1", - "mocha": "^3.5.0", - "request": "^2.81.0", - "webidl2js": "^7.2.0" + "mocha": "^6.2.2", + "request": "^2.88.0", + "webidl2js": "^12.0.0" + }, + "engines": { + "node": ">=8" }, "files": [ + "index.js", + "webidl2js-wrapper.js", "lib/" ], "homepage": "https://github.com/jsdom/domexception#readme", @@ -61,17 +61,18 @@ "exception" ], "license": "MIT", - "main": "lib/public-api.js", + "main": "index.js", "name": "domexception", "repository": { "type": "git", "url": "git+https://github.com/jsdom/domexception.git" }, "scripts": { + "init-wpt": "node scripts/get-latest-platform-tests.js", "lint": "eslint lib", - "prepublish": "node scripts/generate.js", - "pretest": "npm run prepublish", + "prepare": "node scripts/generate.js", + "pretest": "npm run prepare && npm run init-wpt", "test": "mocha" }, - "version": "1.0.1" + "version": "2.0.1" } diff --git a/node_modules/domexception/webidl2js-wrapper.js b/node_modules/domexception/webidl2js-wrapper.js new file mode 100644 index 0000000..05d3470 --- /dev/null +++ b/node_modules/domexception/webidl2js-wrapper.js @@ -0,0 +1,15 @@ +"use strict"; +const DOMException = require("./lib/DOMException.js"); + +// Special install function to make the DOMException inherit from Error. +// https://heycam.github.io/webidl/#es-DOMException-specialness +function installOverride(globalObject) { + if (typeof globalObject.Error !== "function") { + throw new Error("Internal error: Error constructor is not present on the given global object."); + } + + DOMException.install(globalObject); + Object.setPrototypeOf(globalObject.DOMException.prototype, globalObject.Error.prototype); +} + +module.exports = {...DOMException, install: installOverride }; diff --git a/node_modules/escodegen/LICENSE.BSD b/node_modules/escodegen/LICENSE.BSD index 3e580c3..426019d 100644 --- a/node_modules/escodegen/LICENSE.BSD +++ b/node_modules/escodegen/LICENSE.BSD @@ -1,3 +1,5 @@ +Copyright (C) 2012 Yusuke Suzuki (twitter: @Constellation) and other contributors. + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/node_modules/escodegen/escodegen.js b/node_modules/escodegen/escodegen.js index 6fe6646..4c055b8 100644 --- a/node_modules/escodegen/escodegen.js +++ b/node_modules/escodegen/escodegen.js @@ -983,7 +983,7 @@ result.push('['); } - result.push(this.generateExpression(expr, Precedence.Sequence, E_TTT)); + result.push(this.generateExpression(expr, Precedence.Assignment, E_TTT)); if (computed) { result.push(']'); @@ -2223,13 +2223,19 @@ multiline = false; if (expr.properties.length === 1) { property = expr.properties[0]; - if (property.value.type !== Syntax.Identifier) { + if ( + property.type === Syntax.Property + && property.value.type !== Syntax.Identifier + ) { multiline = true; } } else { for (i = 0, iz = expr.properties.length; i < iz; ++i) { property = expr.properties[i]; - if (!property.shorthand) { + if ( + property.type === Syntax.Property + && !property.shorthand + ) { multiline = true; break; } diff --git a/node_modules/escodegen/package.json b/node_modules/escodegen/package.json index 72dc94d..b1d2e72 100644 --- a/node_modules/escodegen/package.json +++ b/node_modules/escodegen/package.json @@ -1,33 +1,27 @@ { - "_args": [ - [ - "escodegen@1.14.1", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "escodegen@1.14.1", - "_id": "escodegen@1.14.1", + "_from": "escodegen@^1.14.1", + "_id": "escodegen@1.14.3", "_inBundle": false, - "_integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "_integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "_location": "/escodegen", "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "escodegen@1.14.1", + "raw": "escodegen@^1.14.1", "name": "escodegen", "escapedName": "escodegen", - "rawSpec": "1.14.1", + "rawSpec": "^1.14.1", "saveSpec": null, - "fetchSpec": "1.14.1" + "fetchSpec": "^1.14.1" }, "_requiredBy": [ "/jsdom" ], - "_resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", - "_spec": "1.14.1", - "_where": "D:\\Projects\\vanillajs-seed", + "_resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "_shasum": "4e7b81fba61581dc97582ed78cab7f0e8d63f503", + "_spec": "escodegen@^1.14.1", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\jsdom", "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" @@ -35,6 +29,7 @@ "bugs": { "url": "https://github.com/estools/escodegen/issues" }, + "bundleDependencies": false, "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", @@ -42,6 +37,7 @@ "optionator": "^0.8.1", "source-map": "~0.6.1" }, + "deprecated": false, "description": "ECMAScript code generator", "devDependencies": { "acorn": "^7.1.0", @@ -90,5 +86,5 @@ "test": "gulp travis", "unit-test": "gulp test" }, - "version": "1.14.1" + "version": "1.14.3" } diff --git a/node_modules/fast-deep-equal/es6/index.d.ts b/node_modules/fast-deep-equal/es6/index.d.ts index 0fc8d3b..c7eb9c7 100644 --- a/node_modules/fast-deep-equal/es6/index.d.ts +++ b/node_modules/fast-deep-equal/es6/index.d.ts @@ -1,2 +1,2 @@ -const equal: (a: any, b: any) => boolean; +declare const equal: (a: any, b: any) => boolean; export = equal; diff --git a/node_modules/fast-deep-equal/es6/react.d.ts b/node_modules/fast-deep-equal/es6/react.d.ts index 0fc8d3b..c7eb9c7 100644 --- a/node_modules/fast-deep-equal/es6/react.d.ts +++ b/node_modules/fast-deep-equal/es6/react.d.ts @@ -1,2 +1,2 @@ -const equal: (a: any, b: any) => boolean; +declare const equal: (a: any, b: any) => boolean; export = equal; diff --git a/node_modules/fast-deep-equal/package.json b/node_modules/fast-deep-equal/package.json index 22077ee..e5e59ba 100644 --- a/node_modules/fast-deep-equal/package.json +++ b/node_modules/fast-deep-equal/package.json @@ -1,51 +1,47 @@ { - "_args": [ - [ - "fast-deep-equal@3.1.1", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "fast-deep-equal@3.1.1", - "_id": "fast-deep-equal@3.1.1", + "_from": "fast-deep-equal@^3.1.1", + "_id": "fast-deep-equal@3.1.3", "_inBundle": false, - "_integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "_integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "_location": "/fast-deep-equal", "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "fast-deep-equal@3.1.1", + "raw": "fast-deep-equal@^3.1.1", "name": "fast-deep-equal", "escapedName": "fast-deep-equal", - "rawSpec": "3.1.1", + "rawSpec": "^3.1.1", "saveSpec": null, - "fetchSpec": "3.1.1" + "fetchSpec": "^3.1.1" }, "_requiredBy": [ "/ajv" ], - "_resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "_spec": "3.1.1", - "_where": "D:\\Projects\\vanillajs-seed", + "_resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "_shasum": "3a7d56b559d6cbc3eb512325244e619a65c6c525", + "_spec": "fast-deep-equal@^3.1.1", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\ajv", "author": { "name": "Evgeny Poberezkin" }, "bugs": { "url": "https://github.com/epoberezkin/fast-deep-equal/issues" }, + "bundleDependencies": false, + "deprecated": false, "description": "Fast deep equal", "devDependencies": { - "coveralls": "^2.13.1", + "coveralls": "^3.1.0", "dot": "^1.1.2", - "eslint": "^4.0.0", - "mocha": "^3.4.2", - "nyc": "^11.0.2", + "eslint": "^7.2.0", + "mocha": "^7.2.0", + "nyc": "^15.1.0", "pre-commit": "^1.2.2", "react": "^16.12.0", "react-test-renderer": "^16.12.0", - "sinon": "^7.5.0", - "typescript": "^2.6.1" + "sinon": "^9.0.2", + "typescript": "^3.9.5" }, "files": [ "index.js", @@ -88,5 +84,5 @@ "test-ts": "tsc --target ES5 --noImplicitAny index.d.ts" }, "types": "index.d.ts", - "version": "3.1.1" + "version": "3.1.3" } diff --git a/node_modules/fast-deep-equal/react.d.ts b/node_modules/fast-deep-equal/react.d.ts index 0fc8d3b..c7eb9c7 100644 --- a/node_modules/fast-deep-equal/react.d.ts +++ b/node_modules/fast-deep-equal/react.d.ts @@ -1,2 +1,2 @@ -const equal: (a: any, b: any) => boolean; +declare const equal: (a: any, b: any) => boolean; export = equal; diff --git a/node_modules/he/README.md b/node_modules/he/README.md deleted file mode 100644 index b2223a9..0000000 --- a/node_modules/he/README.md +++ /dev/null @@ -1,379 +0,0 @@ -# he [![Build status](https://travis-ci.org/mathiasbynens/he.svg?branch=master)](https://travis-ci.org/mathiasbynens/he) [![Code coverage status](https://codecov.io/github/mathiasbynens/he/coverage.svg?branch=master)](https://codecov.io/github/mathiasbynens/he?branch=master) [![Dependency status](https://gemnasium.com/mathiasbynens/he.svg)](https://gemnasium.com/mathiasbynens/he) - -_he_ (for “HTML entities”) is a robust HTML entity encoder/decoder written in JavaScript. It supports [all standardized named character references as per HTML](https://html.spec.whatwg.org/multipage/syntax.html#named-character-references), handles [ambiguous ampersands](https://mathiasbynens.be/notes/ambiguous-ampersands) and other edge cases [just like a browser would](https://html.spec.whatwg.org/multipage/syntax.html#tokenizing-character-references), has an extensive test suite, and — contrary to many other JavaScript solutions — _he_ handles astral Unicode symbols just fine. [An online demo is available.](https://mothereff.in/html-entities) - -## Installation - -Via [npm](https://www.npmjs.com/): - -```bash -npm install he -``` - -Via [Bower](http://bower.io/): - -```bash -bower install he -``` - -Via [Component](https://github.com/component/component): - -```bash -component install mathiasbynens/he -``` - -In a browser: - -```html - -``` - -In [Node.js](https://nodejs.org/), [io.js](https://iojs.org/), [Narwhal](http://narwhaljs.org/), and [RingoJS](http://ringojs.org/): - -```js -var he = require('he'); -``` - -In [Rhino](http://www.mozilla.org/rhino/): - -```js -load('he.js'); -``` - -Using an AMD loader like [RequireJS](http://requirejs.org/): - -```js -require( - { - 'paths': { - 'he': 'path/to/he' - } - }, - ['he'], - function(he) { - console.log(he); - } -); -``` - -## API - -### `he.version` - -A string representing the semantic version number. - -### `he.encode(text, options)` - -This function takes a string of text and encodes (by default) any symbols that aren’t printable ASCII symbols and `&`, `<`, `>`, `"`, `'`, and `` ` ``, replacing them with character references. - -```js -he.encode('foo © bar ≠ baz 𝌆 qux'); -// → 'foo © bar ≠ baz 𝌆 qux' -``` - -As long as the input string contains [allowed code points](https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream) only, the return value of this function is always valid HTML. Any [(invalid) code points that cannot be represented using a character reference](https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides) in the input are not encoded: - -```js -he.encode('foo \0 bar'); -// → 'foo \0 bar' -``` - -However, enabling [the `strict` option](https://github.com/mathiasbynens/he#strict) causes invalid code points to throw an exception. With `strict` enabled, `he.encode` either throws (if the input contains invalid code points) or returns a string of valid HTML. - -The `options` object is optional. It recognizes the following properties: - -#### `useNamedReferences` - -The default value for the `useNamedReferences` option is `false`. This means that `encode()` will not use any named character references (e.g. `©`) in the output — hexadecimal escapes (e.g. `©`) will be used instead. Set it to `true` to enable the use of named references. - -**Note that if compatibility with older browsers is a concern, this option should remain disabled.** - -```js -// Using the global default setting (defaults to `false`): -he.encode('foo © bar ≠ baz 𝌆 qux'); -// → 'foo © bar ≠ baz 𝌆 qux' - -// Passing an `options` object to `encode`, to explicitly disallow named references: -he.encode('foo © bar ≠ baz 𝌆 qux', { - 'useNamedReferences': false -}); -// → 'foo © bar ≠ baz 𝌆 qux' - -// Passing an `options` object to `encode`, to explicitly allow named references: -he.encode('foo © bar ≠ baz 𝌆 qux', { - 'useNamedReferences': true -}); -// → 'foo © bar ≠ baz 𝌆 qux' -``` - -#### `decimal` - -The default value for the `decimal` option is `false`. If the option is enabled, `encode` will generally use decimal escapes (e.g. `©`) rather than hexadecimal escapes (e.g. `©`). Beside of this replacement, the basic behavior remains the same when combined with other options. For example: if both options `useNamedReferences` and `decimal` are enabled, named references (e.g. `©`) are used over decimal escapes. HTML entities without a named reference are encoded using decimal escapes. - -```js -// Using the global default setting (defaults to `false`): -he.encode('foo © bar ≠ baz 𝌆 qux'); -// → 'foo © bar ≠ baz 𝌆 qux' - -// Passing an `options` object to `encode`, to explicitly disable decimal escapes: -he.encode('foo © bar ≠ baz 𝌆 qux', { - 'decimal': false -}); -// → 'foo © bar ≠ baz 𝌆 qux' - -// Passing an `options` object to `encode`, to explicitly enable decimal escapes: -he.encode('foo © bar ≠ baz 𝌆 qux', { - 'decimal': true -}); -// → 'foo © bar ≠ baz 𝌆 qux' - -// Passing an `options` object to `encode`, to explicitly allow named references and decimal escapes: -he.encode('foo © bar ≠ baz 𝌆 qux', { - 'useNamedReferences': true, - 'decimal': true -}); -// → 'foo © bar ≠ baz 𝌆 qux' -``` - -#### `encodeEverything` - -The default value for the `encodeEverything` option is `false`. This means that `encode()` will not use any character references for printable ASCII symbols that don’t need escaping. Set it to `true` to encode every symbol in the input string. When set to `true`, this option takes precedence over `allowUnsafeSymbols` (i.e. setting the latter to `true` in such a case has no effect). - -```js -// Using the global default setting (defaults to `false`): -he.encode('foo © bar ≠ baz 𝌆 qux'); -// → 'foo © bar ≠ baz 𝌆 qux' - -// Passing an `options` object to `encode`, to explicitly encode all symbols: -he.encode('foo © bar ≠ baz 𝌆 qux', { - 'encodeEverything': true -}); -// → 'foo © bar ≠ baz 𝌆 qux' - -// This setting can be combined with the `useNamedReferences` option: -he.encode('foo © bar ≠ baz 𝌆 qux', { - 'encodeEverything': true, - 'useNamedReferences': true -}); -// → 'foo © bar ≠ baz 𝌆 qux' -``` - -#### `strict` - -The default value for the `strict` option is `false`. This means that `encode()` will encode any HTML text content you feed it, even if it contains any symbols that cause [parse errors](https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream). To throw an error when such invalid HTML is encountered, set the `strict` option to `true`. This option makes it possible to use _he_ as part of HTML parsers and HTML validators. - -```js -// Using the global default setting (defaults to `false`, i.e. error-tolerant mode): -he.encode('\x01'); -// → '' - -// Passing an `options` object to `encode`, to explicitly enable error-tolerant mode: -he.encode('\x01', { - 'strict': false -}); -// → '' - -// Passing an `options` object to `encode`, to explicitly enable strict mode: -he.encode('\x01', { - 'strict': true -}); -// → Parse error -``` - -#### `allowUnsafeSymbols` - -The default value for the `allowUnsafeSymbols` option is `false`. This means that characters that are unsafe for use in HTML content (`&`, `<`, `>`, `"`, `'`, and `` ` ``) will be encoded. When set to `true`, only non-ASCII characters will be encoded. If the `encodeEverything` option is set to `true`, this option will be ignored. - -```js -he.encode('foo © and & ampersand', { - 'allowUnsafeSymbols': true -}); -// → 'foo © and & ampersand' -``` - -#### Overriding default `encode` options globally - -The global default setting can be overridden by modifying the `he.encode.options` object. This saves you from passing in an `options` object for every call to `encode` if you want to use the non-default setting. - -```js -// Read the global default setting: -he.encode.options.useNamedReferences; -// → `false` by default - -// Override the global default setting: -he.encode.options.useNamedReferences = true; - -// Using the global default setting, which is now `true`: -he.encode('foo © bar ≠ baz 𝌆 qux'); -// → 'foo © bar ≠ baz 𝌆 qux' -``` - -### `he.decode(html, options)` - -This function takes a string of HTML and decodes any named and numerical character references in it using [the algorithm described in section 12.2.4.69 of the HTML spec](https://html.spec.whatwg.org/multipage/syntax.html#tokenizing-character-references). - -```js -he.decode('foo © bar ≠ baz 𝌆 qux'); -// → 'foo © bar ≠ baz 𝌆 qux' -``` - -The `options` object is optional. It recognizes the following properties: - -#### `isAttributeValue` - -The default value for the `isAttributeValue` option is `false`. This means that `decode()` will decode the string as if it were used in [a text context in an HTML document](https://html.spec.whatwg.org/multipage/syntax.html#data-state). HTML has different rules for [parsing character references in attribute values](https://html.spec.whatwg.org/multipage/syntax.html#character-reference-in-attribute-value-state) — set this option to `true` to treat the input string as if it were used as an attribute value. - -```js -// Using the global default setting (defaults to `false`, i.e. HTML text context): -he.decode('foo&bar'); -// → 'foo&bar' - -// Passing an `options` object to `decode`, to explicitly assume an HTML text context: -he.decode('foo&bar', { - 'isAttributeValue': false -}); -// → 'foo&bar' - -// Passing an `options` object to `decode`, to explicitly assume an HTML attribute value context: -he.decode('foo&bar', { - 'isAttributeValue': true -}); -// → 'foo&bar' -``` - -#### `strict` - -The default value for the `strict` option is `false`. This means that `decode()` will decode any HTML text content you feed it, even if it contains any entities that cause [parse errors](https://html.spec.whatwg.org/multipage/syntax.html#tokenizing-character-references). To throw an error when such invalid HTML is encountered, set the `strict` option to `true`. This option makes it possible to use _he_ as part of HTML parsers and HTML validators. - -```js -// Using the global default setting (defaults to `false`, i.e. error-tolerant mode): -he.decode('foo&bar'); -// → 'foo&bar' - -// Passing an `options` object to `decode`, to explicitly enable error-tolerant mode: -he.decode('foo&bar', { - 'strict': false -}); -// → 'foo&bar' - -// Passing an `options` object to `decode`, to explicitly enable strict mode: -he.decode('foo&bar', { - 'strict': true -}); -// → Parse error -``` - -#### Overriding default `decode` options globally - -The global default settings for the `decode` function can be overridden by modifying the `he.decode.options` object. This saves you from passing in an `options` object for every call to `decode` if you want to use a non-default setting. - -```js -// Read the global default setting: -he.decode.options.isAttributeValue; -// → `false` by default - -// Override the global default setting: -he.decode.options.isAttributeValue = true; - -// Using the global default setting, which is now `true`: -he.decode('foo&bar'); -// → 'foo&bar' -``` - -### `he.escape(text)` - -This function takes a string of text and escapes it for use in text contexts in XML or HTML documents. Only the following characters are escaped: `&`, `<`, `>`, `"`, `'`, and `` ` ``. - -```js -he.escape(''); -// → '<img src='x' onerror="prompt(1)">' -``` - -### `he.unescape(html, options)` - -`he.unescape` is an alias for `he.decode`. It takes a string of HTML and decodes any named and numerical character references in it. - -### Using the `he` binary - -To use the `he` binary in your shell, simply install _he_ globally using npm: - -```bash -npm install -g he -``` - -After that you will be able to encode/decode HTML entities from the command line: - -```bash -$ he --encode 'föo ♥ bår 𝌆 baz' -föo ♥ bår 𝌆 baz - -$ he --encode --use-named-refs 'föo ♥ bår 𝌆 baz' -föo ♥ bår 𝌆 baz - -$ he --decode 'föo ♥ bår 𝌆 baz' -föo ♥ bår 𝌆 baz -``` - -Read a local text file, encode it for use in an HTML text context, and save the result to a new file: - -```bash -$ he --encode < foo.txt > foo-escaped.html -``` - -Or do the same with an online text file: - -```bash -$ curl -sL "http://git.io/HnfEaw" | he --encode > escaped.html -``` - -Or, the opposite — read a local file containing a snippet of HTML in a text context, decode it back to plain text, and save the result to a new file: - -```bash -$ he --decode < foo-escaped.html > foo.txt -``` - -Or do the same with an online HTML snippet: - -```bash -$ curl -sL "http://git.io/HnfEaw" | he --decode > decoded.txt -``` - -See `he --help` for the full list of options. - -## Support - -_he_ has been tested in at least: - -* Chrome 27-50 -* Firefox 3-45 -* Safari 4-9 -* Opera 10-12, 15–37 -* IE 6–11 -* Edge -* Narwhal 0.3.2 -* Node.js v0.10, v0.12, v4, v5 -* PhantomJS 1.9.0 -* Rhino 1.7RC4 -* RingoJS 0.8-0.11 - -## Unit tests & code coverage - -After cloning this repository, run `npm install` to install the dependencies needed for he 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, and web browsers as well, use `grunt test`. - -To generate the code coverage report, use `grunt cover`. - -## Acknowledgements - -Thanks to [Simon Pieters](https://simon.html5.org/) ([@zcorpan](https://twitter.com/zcorpan)) for the many suggestions. - -## Author - -| [![twitter/mathias](https://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter") | -|---| -| [Mathias Bynens](https://mathiasbynens.be/) | - -## License - -_he_ is available under the [MIT](https://mths.be/mit) license. diff --git a/node_modules/he/bin/he b/node_modules/he/bin/he deleted file mode 100644 index cfdfd6c..0000000 --- a/node_modules/he/bin/he +++ /dev/null @@ -1,148 +0,0 @@ -#!/usr/bin/env node -(function() { - - var fs = require('fs'); - var he = require('../he.js'); - var strings = process.argv.splice(2); - var stdin = process.stdin; - var data; - var timeout; - var action; - var options = {}; - var log = console.log; - - var main = function() { - var option = strings[0]; - var count = 0; - - if (/^(?:-h|--help|undefined)$/.test(option)) { - log( - 'he v%s - https://mths.be/he', - he.version - ); - log([ - '\nUsage:\n', - '\the [--escape] string', - '\the [--encode] [--use-named-refs] [--everything] [--allow-unsafe] [--decimal] string', - '\the [--decode] [--attribute] [--strict] string', - '\the [-v | --version]', - '\the [-h | --help]', - '\nExamples:\n', - '\the --escape \\', - '\techo \'© 𝌆\' | he --decode' - ].join('\n')); - return process.exit(option ? 0 : 1); - } - - if (/^(?:-v|--version)$/.test(option)) { - log('v%s', he.version); - return process.exit(0); - } - - strings.forEach(function(string) { - // Process options - if (string == '--escape') { - action = 'escape'; - return; - } - if (string == '--encode') { - action = 'encode'; - return; - } - if (string == '--use-named-refs') { - action = 'encode'; - options.useNamedReferences = true; - return; - } - if (string == '--everything') { - action = 'encode'; - options.encodeEverything = true; - return; - } - if (string == '--allow-unsafe') { - action = 'encode'; - options.allowUnsafeSymbols = true; - return; - } - if (string == '--decimal') { - action = 'encode'; - options.decimal = true; - return; - } - if (string == '--decode') { - action = 'decode'; - return; - } - if (string == '--attribute') { - action = 'decode'; - options.isAttributeValue = true; - return; - } - if (string == '--strict') { - action = 'decode'; - options.strict = true; - return; - } - // Process string(s) - var result; - if (!action) { - log('Error: he requires at least one option and a string argument.'); - log('Try `he --help` for more information.'); - return process.exit(1); - } - try { - result = he[action](string, options); - log(result); - count++; - } catch(error) { - log(error.message + '\n'); - log('Error: failed to %s.', action); - log('If you think this is a bug in he, please report it:'); - log('https://github.com/mathiasbynens/he/issues/new'); - log( - '\nStack trace using he@%s:\n', - he.version - ); - log(error.stack); - return process.exit(1); - } - }); - if (!count) { - log('Error: he requires a string argument.'); - log('Try `he --help` for more information.'); - return process.exit(1); - } - // Return with exit status 0 outside of the `forEach` loop, in case - // multiple strings were passed in. - return process.exit(0); - }; - - if (stdin.isTTY) { - // handle shell arguments - main(); - } else { - // Either the script is called from within a non-TTY context, or `stdin` - // content is being piped in. - if (!process.stdout.isTTY) { - // The script was called from a non-TTY context. This is a rather uncommon - // use case we don’t actively support. However, we don’t want the script - // to wait forever in such cases, so… - timeout = setTimeout(function() { - // …if no piped data arrived after a whole minute, handle shell - // arguments instead. - main(); - }, 60000); - } - data = ''; - stdin.on('data', function(chunk) { - clearTimeout(timeout); - data += chunk; - }); - stdin.on('end', function() { - strings.push(data.trim()); - main(); - }); - stdin.resume(); - } - -}()); diff --git a/node_modules/he/he.js b/node_modules/he/he.js deleted file mode 100644 index 14a58e9..0000000 --- a/node_modules/he/he.js +++ /dev/null @@ -1,345 +0,0 @@ -/*! https://mths.be/he v1.2.0 by @mathias | MIT license */ -;(function(root) { - - // Detect free variables `exports`. - var freeExports = typeof exports == 'object' && exports; - - // Detect free variable `module`. - var freeModule = typeof module == 'object' && module && - module.exports == freeExports && module; - - // Detect free variable `global`, from Node.js or Browserified code, - // and use it as `root`. - var freeGlobal = typeof global == 'object' && global; - if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { - root = freeGlobal; - } - - /*--------------------------------------------------------------------------*/ - - // All astral symbols. - var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; - // All ASCII symbols (not just printable ASCII) except those listed in the - // first column of the overrides table. - // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides - var regexAsciiWhitelist = /[\x01-\x7F]/g; - // All BMP symbols that are not ASCII newlines, printable ASCII symbols, or - // code points listed in the first column of the overrides table on - // https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides. - var regexBmpWhitelist = /[\x01-\t\x0B\f\x0E-\x1F\x7F\x81\x8D\x8F\x90\x9D\xA0-\uFFFF]/g; - - var regexEncodeNonAscii = /<\u20D2|=\u20E5|>\u20D2|\u205F\u200A|\u219D\u0338|\u2202\u0338|\u2220\u20D2|\u2229\uFE00|\u222A\uFE00|\u223C\u20D2|\u223D\u0331|\u223E\u0333|\u2242\u0338|\u224B\u0338|\u224D\u20D2|\u224E\u0338|\u224F\u0338|\u2250\u0338|\u2261\u20E5|\u2264\u20D2|\u2265\u20D2|\u2266\u0338|\u2267\u0338|\u2268\uFE00|\u2269\uFE00|\u226A\u0338|\u226A\u20D2|\u226B\u0338|\u226B\u20D2|\u227F\u0338|\u2282\u20D2|\u2283\u20D2|\u228A\uFE00|\u228B\uFE00|\u228F\u0338|\u2290\u0338|\u2293\uFE00|\u2294\uFE00|\u22B4\u20D2|\u22B5\u20D2|\u22D8\u0338|\u22D9\u0338|\u22DA\uFE00|\u22DB\uFE00|\u22F5\u0338|\u22F9\u0338|\u2933\u0338|\u29CF\u0338|\u29D0\u0338|\u2A6D\u0338|\u2A70\u0338|\u2A7D\u0338|\u2A7E\u0338|\u2AA1\u0338|\u2AA2\u0338|\u2AAC\uFE00|\u2AAD\uFE00|\u2AAF\u0338|\u2AB0\u0338|\u2AC5\u0338|\u2AC6\u0338|\u2ACB\uFE00|\u2ACC\uFE00|\u2AFD\u20E5|[\xA0-\u0113\u0116-\u0122\u0124-\u012B\u012E-\u014D\u0150-\u017E\u0192\u01B5\u01F5\u0237\u02C6\u02C7\u02D8-\u02DD\u0311\u0391-\u03A1\u03A3-\u03A9\u03B1-\u03C9\u03D1\u03D2\u03D5\u03D6\u03DC\u03DD\u03F0\u03F1\u03F5\u03F6\u0401-\u040C\u040E-\u044F\u0451-\u045C\u045E\u045F\u2002-\u2005\u2007-\u2010\u2013-\u2016\u2018-\u201A\u201C-\u201E\u2020-\u2022\u2025\u2026\u2030-\u2035\u2039\u203A\u203E\u2041\u2043\u2044\u204F\u2057\u205F-\u2063\u20AC\u20DB\u20DC\u2102\u2105\u210A-\u2113\u2115-\u211E\u2122\u2124\u2127-\u2129\u212C\u212D\u212F-\u2131\u2133-\u2138\u2145-\u2148\u2153-\u215E\u2190-\u219B\u219D-\u21A7\u21A9-\u21AE\u21B0-\u21B3\u21B5-\u21B7\u21BA-\u21DB\u21DD\u21E4\u21E5\u21F5\u21FD-\u2205\u2207-\u2209\u220B\u220C\u220F-\u2214\u2216-\u2218\u221A\u221D-\u2238\u223A-\u2257\u2259\u225A\u225C\u225F-\u2262\u2264-\u228B\u228D-\u229B\u229D-\u22A5\u22A7-\u22B0\u22B2-\u22BB\u22BD-\u22DB\u22DE-\u22E3\u22E6-\u22F7\u22F9-\u22FE\u2305\u2306\u2308-\u2310\u2312\u2313\u2315\u2316\u231C-\u231F\u2322\u2323\u232D\u232E\u2336\u233D\u233F\u237C\u23B0\u23B1\u23B4-\u23B6\u23DC-\u23DF\u23E2\u23E7\u2423\u24C8\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2550-\u256C\u2580\u2584\u2588\u2591-\u2593\u25A1\u25AA\u25AB\u25AD\u25AE\u25B1\u25B3-\u25B5\u25B8\u25B9\u25BD-\u25BF\u25C2\u25C3\u25CA\u25CB\u25EC\u25EF\u25F8-\u25FC\u2605\u2606\u260E\u2640\u2642\u2660\u2663\u2665\u2666\u266A\u266D-\u266F\u2713\u2717\u2720\u2736\u2758\u2772\u2773\u27C8\u27C9\u27E6-\u27ED\u27F5-\u27FA\u27FC\u27FF\u2902-\u2905\u290C-\u2913\u2916\u2919-\u2920\u2923-\u292A\u2933\u2935-\u2939\u293C\u293D\u2945\u2948-\u294B\u294E-\u2976\u2978\u2979\u297B-\u297F\u2985\u2986\u298B-\u2996\u299A\u299C\u299D\u29A4-\u29B7\u29B9\u29BB\u29BC\u29BE-\u29C5\u29C9\u29CD-\u29D0\u29DC-\u29DE\u29E3-\u29E5\u29EB\u29F4\u29F6\u2A00-\u2A02\u2A04\u2A06\u2A0C\u2A0D\u2A10-\u2A17\u2A22-\u2A27\u2A29\u2A2A\u2A2D-\u2A31\u2A33-\u2A3C\u2A3F\u2A40\u2A42-\u2A4D\u2A50\u2A53-\u2A58\u2A5A-\u2A5D\u2A5F\u2A66\u2A6A\u2A6D-\u2A75\u2A77-\u2A9A\u2A9D-\u2AA2\u2AA4-\u2AB0\u2AB3-\u2AC8\u2ACB\u2ACC\u2ACF-\u2ADB\u2AE4\u2AE6-\u2AE9\u2AEB-\u2AF3\u2AFD\uFB00-\uFB04]|\uD835[\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDCCF\uDD04\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDD6B]/g; - var encodeMap = {'\xAD':'shy','\u200C':'zwnj','\u200D':'zwj','\u200E':'lrm','\u2063':'ic','\u2062':'it','\u2061':'af','\u200F':'rlm','\u200B':'ZeroWidthSpace','\u2060':'NoBreak','\u0311':'DownBreve','\u20DB':'tdot','\u20DC':'DotDot','\t':'Tab','\n':'NewLine','\u2008':'puncsp','\u205F':'MediumSpace','\u2009':'thinsp','\u200A':'hairsp','\u2004':'emsp13','\u2002':'ensp','\u2005':'emsp14','\u2003':'emsp','\u2007':'numsp','\xA0':'nbsp','\u205F\u200A':'ThickSpace','\u203E':'oline','_':'lowbar','\u2010':'dash','\u2013':'ndash','\u2014':'mdash','\u2015':'horbar',',':'comma',';':'semi','\u204F':'bsemi',':':'colon','\u2A74':'Colone','!':'excl','\xA1':'iexcl','?':'quest','\xBF':'iquest','.':'period','\u2025':'nldr','\u2026':'mldr','\xB7':'middot','\'':'apos','\u2018':'lsquo','\u2019':'rsquo','\u201A':'sbquo','\u2039':'lsaquo','\u203A':'rsaquo','"':'quot','\u201C':'ldquo','\u201D':'rdquo','\u201E':'bdquo','\xAB':'laquo','\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\u2308':'lceil','\u2309':'rceil','\u230A':'lfloor','\u230B':'rfloor','\u2985':'lopar','\u2986':'ropar','\u298B':'lbrke','\u298C':'rbrke','\u298D':'lbrkslu','\u298E':'rbrksld','\u298F':'lbrksld','\u2990':'rbrkslu','\u2991':'langd','\u2992':'rangd','\u2993':'lparlt','\u2994':'rpargt','\u2995':'gtlPar','\u2996':'ltrPar','\u27E6':'lobrk','\u27E7':'robrk','\u27E8':'lang','\u27E9':'rang','\u27EA':'Lang','\u27EB':'Rang','\u27EC':'loang','\u27ED':'roang','\u2772':'lbbrk','\u2773':'rbbrk','\u2016':'Vert','\xA7':'sect','\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\u2030':'permil','\u2031':'pertenk','\u2020':'dagger','\u2021':'Dagger','\u2022':'bull','\u2043':'hybull','\u2032':'prime','\u2033':'Prime','\u2034':'tprime','\u2057':'qprime','\u2035':'bprime','\u2041':'caret','`':'grave','\xB4':'acute','\u02DC':'tilde','^':'Hat','\xAF':'macr','\u02D8':'breve','\u02D9':'dot','\xA8':'die','\u02DA':'ring','\u02DD':'dblac','\xB8':'cedil','\u02DB':'ogon','\u02C6':'circ','\u02C7':'caron','\xB0':'deg','\xA9':'copy','\xAE':'reg','\u2117':'copysr','\u2118':'wp','\u211E':'rx','\u2127':'mho','\u2129':'iiota','\u2190':'larr','\u219A':'nlarr','\u2192':'rarr','\u219B':'nrarr','\u2191':'uarr','\u2193':'darr','\u2194':'harr','\u21AE':'nharr','\u2195':'varr','\u2196':'nwarr','\u2197':'nearr','\u2198':'searr','\u2199':'swarr','\u219D':'rarrw','\u219D\u0338':'nrarrw','\u219E':'Larr','\u219F':'Uarr','\u21A0':'Rarr','\u21A1':'Darr','\u21A2':'larrtl','\u21A3':'rarrtl','\u21A4':'mapstoleft','\u21A5':'mapstoup','\u21A6':'map','\u21A7':'mapstodown','\u21A9':'larrhk','\u21AA':'rarrhk','\u21AB':'larrlp','\u21AC':'rarrlp','\u21AD':'harrw','\u21B0':'lsh','\u21B1':'rsh','\u21B2':'ldsh','\u21B3':'rdsh','\u21B5':'crarr','\u21B6':'cularr','\u21B7':'curarr','\u21BA':'olarr','\u21BB':'orarr','\u21BC':'lharu','\u21BD':'lhard','\u21BE':'uharr','\u21BF':'uharl','\u21C0':'rharu','\u21C1':'rhard','\u21C2':'dharr','\u21C3':'dharl','\u21C4':'rlarr','\u21C5':'udarr','\u21C6':'lrarr','\u21C7':'llarr','\u21C8':'uuarr','\u21C9':'rrarr','\u21CA':'ddarr','\u21CB':'lrhar','\u21CC':'rlhar','\u21D0':'lArr','\u21CD':'nlArr','\u21D1':'uArr','\u21D2':'rArr','\u21CF':'nrArr','\u21D3':'dArr','\u21D4':'iff','\u21CE':'nhArr','\u21D5':'vArr','\u21D6':'nwArr','\u21D7':'neArr','\u21D8':'seArr','\u21D9':'swArr','\u21DA':'lAarr','\u21DB':'rAarr','\u21DD':'zigrarr','\u21E4':'larrb','\u21E5':'rarrb','\u21F5':'duarr','\u21FD':'loarr','\u21FE':'roarr','\u21FF':'hoarr','\u2200':'forall','\u2201':'comp','\u2202':'part','\u2202\u0338':'npart','\u2203':'exist','\u2204':'nexist','\u2205':'empty','\u2207':'Del','\u2208':'in','\u2209':'notin','\u220B':'ni','\u220C':'notni','\u03F6':'bepsi','\u220F':'prod','\u2210':'coprod','\u2211':'sum','+':'plus','\xB1':'pm','\xF7':'div','\xD7':'times','<':'lt','\u226E':'nlt','<\u20D2':'nvlt','=':'equals','\u2260':'ne','=\u20E5':'bne','\u2A75':'Equal','>':'gt','\u226F':'ngt','>\u20D2':'nvgt','\xAC':'not','|':'vert','\xA6':'brvbar','\u2212':'minus','\u2213':'mp','\u2214':'plusdo','\u2044':'frasl','\u2216':'setmn','\u2217':'lowast','\u2218':'compfn','\u221A':'Sqrt','\u221D':'prop','\u221E':'infin','\u221F':'angrt','\u2220':'ang','\u2220\u20D2':'nang','\u2221':'angmsd','\u2222':'angsph','\u2223':'mid','\u2224':'nmid','\u2225':'par','\u2226':'npar','\u2227':'and','\u2228':'or','\u2229':'cap','\u2229\uFE00':'caps','\u222A':'cup','\u222A\uFE00':'cups','\u222B':'int','\u222C':'Int','\u222D':'tint','\u2A0C':'qint','\u222E':'oint','\u222F':'Conint','\u2230':'Cconint','\u2231':'cwint','\u2232':'cwconint','\u2233':'awconint','\u2234':'there4','\u2235':'becaus','\u2236':'ratio','\u2237':'Colon','\u2238':'minusd','\u223A':'mDDot','\u223B':'homtht','\u223C':'sim','\u2241':'nsim','\u223C\u20D2':'nvsim','\u223D':'bsim','\u223D\u0331':'race','\u223E':'ac','\u223E\u0333':'acE','\u223F':'acd','\u2240':'wr','\u2242':'esim','\u2242\u0338':'nesim','\u2243':'sime','\u2244':'nsime','\u2245':'cong','\u2247':'ncong','\u2246':'simne','\u2248':'ap','\u2249':'nap','\u224A':'ape','\u224B':'apid','\u224B\u0338':'napid','\u224C':'bcong','\u224D':'CupCap','\u226D':'NotCupCap','\u224D\u20D2':'nvap','\u224E':'bump','\u224E\u0338':'nbump','\u224F':'bumpe','\u224F\u0338':'nbumpe','\u2250':'doteq','\u2250\u0338':'nedot','\u2251':'eDot','\u2252':'efDot','\u2253':'erDot','\u2254':'colone','\u2255':'ecolon','\u2256':'ecir','\u2257':'cire','\u2259':'wedgeq','\u225A':'veeeq','\u225C':'trie','\u225F':'equest','\u2261':'equiv','\u2262':'nequiv','\u2261\u20E5':'bnequiv','\u2264':'le','\u2270':'nle','\u2264\u20D2':'nvle','\u2265':'ge','\u2271':'nge','\u2265\u20D2':'nvge','\u2266':'lE','\u2266\u0338':'nlE','\u2267':'gE','\u2267\u0338':'ngE','\u2268\uFE00':'lvnE','\u2268':'lnE','\u2269':'gnE','\u2269\uFE00':'gvnE','\u226A':'ll','\u226A\u0338':'nLtv','\u226A\u20D2':'nLt','\u226B':'gg','\u226B\u0338':'nGtv','\u226B\u20D2':'nGt','\u226C':'twixt','\u2272':'lsim','\u2274':'nlsim','\u2273':'gsim','\u2275':'ngsim','\u2276':'lg','\u2278':'ntlg','\u2277':'gl','\u2279':'ntgl','\u227A':'pr','\u2280':'npr','\u227B':'sc','\u2281':'nsc','\u227C':'prcue','\u22E0':'nprcue','\u227D':'sccue','\u22E1':'nsccue','\u227E':'prsim','\u227F':'scsim','\u227F\u0338':'NotSucceedsTilde','\u2282':'sub','\u2284':'nsub','\u2282\u20D2':'vnsub','\u2283':'sup','\u2285':'nsup','\u2283\u20D2':'vnsup','\u2286':'sube','\u2288':'nsube','\u2287':'supe','\u2289':'nsupe','\u228A\uFE00':'vsubne','\u228A':'subne','\u228B\uFE00':'vsupne','\u228B':'supne','\u228D':'cupdot','\u228E':'uplus','\u228F':'sqsub','\u228F\u0338':'NotSquareSubset','\u2290':'sqsup','\u2290\u0338':'NotSquareSuperset','\u2291':'sqsube','\u22E2':'nsqsube','\u2292':'sqsupe','\u22E3':'nsqsupe','\u2293':'sqcap','\u2293\uFE00':'sqcaps','\u2294':'sqcup','\u2294\uFE00':'sqcups','\u2295':'oplus','\u2296':'ominus','\u2297':'otimes','\u2298':'osol','\u2299':'odot','\u229A':'ocir','\u229B':'oast','\u229D':'odash','\u229E':'plusb','\u229F':'minusb','\u22A0':'timesb','\u22A1':'sdotb','\u22A2':'vdash','\u22AC':'nvdash','\u22A3':'dashv','\u22A4':'top','\u22A5':'bot','\u22A7':'models','\u22A8':'vDash','\u22AD':'nvDash','\u22A9':'Vdash','\u22AE':'nVdash','\u22AA':'Vvdash','\u22AB':'VDash','\u22AF':'nVDash','\u22B0':'prurel','\u22B2':'vltri','\u22EA':'nltri','\u22B3':'vrtri','\u22EB':'nrtri','\u22B4':'ltrie','\u22EC':'nltrie','\u22B4\u20D2':'nvltrie','\u22B5':'rtrie','\u22ED':'nrtrie','\u22B5\u20D2':'nvrtrie','\u22B6':'origof','\u22B7':'imof','\u22B8':'mumap','\u22B9':'hercon','\u22BA':'intcal','\u22BB':'veebar','\u22BD':'barvee','\u22BE':'angrtvb','\u22BF':'lrtri','\u22C0':'Wedge','\u22C1':'Vee','\u22C2':'xcap','\u22C3':'xcup','\u22C4':'diam','\u22C5':'sdot','\u22C6':'Star','\u22C7':'divonx','\u22C8':'bowtie','\u22C9':'ltimes','\u22CA':'rtimes','\u22CB':'lthree','\u22CC':'rthree','\u22CD':'bsime','\u22CE':'cuvee','\u22CF':'cuwed','\u22D0':'Sub','\u22D1':'Sup','\u22D2':'Cap','\u22D3':'Cup','\u22D4':'fork','\u22D5':'epar','\u22D6':'ltdot','\u22D7':'gtdot','\u22D8':'Ll','\u22D8\u0338':'nLl','\u22D9':'Gg','\u22D9\u0338':'nGg','\u22DA\uFE00':'lesg','\u22DA':'leg','\u22DB':'gel','\u22DB\uFE00':'gesl','\u22DE':'cuepr','\u22DF':'cuesc','\u22E6':'lnsim','\u22E7':'gnsim','\u22E8':'prnsim','\u22E9':'scnsim','\u22EE':'vellip','\u22EF':'ctdot','\u22F0':'utdot','\u22F1':'dtdot','\u22F2':'disin','\u22F3':'isinsv','\u22F4':'isins','\u22F5':'isindot','\u22F5\u0338':'notindot','\u22F6':'notinvc','\u22F7':'notinvb','\u22F9':'isinE','\u22F9\u0338':'notinE','\u22FA':'nisd','\u22FB':'xnis','\u22FC':'nis','\u22FD':'notnivc','\u22FE':'notnivb','\u2305':'barwed','\u2306':'Barwed','\u230C':'drcrop','\u230D':'dlcrop','\u230E':'urcrop','\u230F':'ulcrop','\u2310':'bnot','\u2312':'profline','\u2313':'profsurf','\u2315':'telrec','\u2316':'target','\u231C':'ulcorn','\u231D':'urcorn','\u231E':'dlcorn','\u231F':'drcorn','\u2322':'frown','\u2323':'smile','\u232D':'cylcty','\u232E':'profalar','\u2336':'topbot','\u233D':'ovbar','\u233F':'solbar','\u237C':'angzarr','\u23B0':'lmoust','\u23B1':'rmoust','\u23B4':'tbrk','\u23B5':'bbrk','\u23B6':'bbrktbrk','\u23DC':'OverParenthesis','\u23DD':'UnderParenthesis','\u23DE':'OverBrace','\u23DF':'UnderBrace','\u23E2':'trpezium','\u23E7':'elinters','\u2423':'blank','\u2500':'boxh','\u2502':'boxv','\u250C':'boxdr','\u2510':'boxdl','\u2514':'boxur','\u2518':'boxul','\u251C':'boxvr','\u2524':'boxvl','\u252C':'boxhd','\u2534':'boxhu','\u253C':'boxvh','\u2550':'boxH','\u2551':'boxV','\u2552':'boxdR','\u2553':'boxDr','\u2554':'boxDR','\u2555':'boxdL','\u2556':'boxDl','\u2557':'boxDL','\u2558':'boxuR','\u2559':'boxUr','\u255A':'boxUR','\u255B':'boxuL','\u255C':'boxUl','\u255D':'boxUL','\u255E':'boxvR','\u255F':'boxVr','\u2560':'boxVR','\u2561':'boxvL','\u2562':'boxVl','\u2563':'boxVL','\u2564':'boxHd','\u2565':'boxhD','\u2566':'boxHD','\u2567':'boxHu','\u2568':'boxhU','\u2569':'boxHU','\u256A':'boxvH','\u256B':'boxVh','\u256C':'boxVH','\u2580':'uhblk','\u2584':'lhblk','\u2588':'block','\u2591':'blk14','\u2592':'blk12','\u2593':'blk34','\u25A1':'squ','\u25AA':'squf','\u25AB':'EmptyVerySmallSquare','\u25AD':'rect','\u25AE':'marker','\u25B1':'fltns','\u25B3':'xutri','\u25B4':'utrif','\u25B5':'utri','\u25B8':'rtrif','\u25B9':'rtri','\u25BD':'xdtri','\u25BE':'dtrif','\u25BF':'dtri','\u25C2':'ltrif','\u25C3':'ltri','\u25CA':'loz','\u25CB':'cir','\u25EC':'tridot','\u25EF':'xcirc','\u25F8':'ultri','\u25F9':'urtri','\u25FA':'lltri','\u25FB':'EmptySmallSquare','\u25FC':'FilledSmallSquare','\u2605':'starf','\u2606':'star','\u260E':'phone','\u2640':'female','\u2642':'male','\u2660':'spades','\u2663':'clubs','\u2665':'hearts','\u2666':'diams','\u266A':'sung','\u2713':'check','\u2717':'cross','\u2720':'malt','\u2736':'sext','\u2758':'VerticalSeparator','\u27C8':'bsolhsub','\u27C9':'suphsol','\u27F5':'xlarr','\u27F6':'xrarr','\u27F7':'xharr','\u27F8':'xlArr','\u27F9':'xrArr','\u27FA':'xhArr','\u27FC':'xmap','\u27FF':'dzigrarr','\u2902':'nvlArr','\u2903':'nvrArr','\u2904':'nvHarr','\u2905':'Map','\u290C':'lbarr','\u290D':'rbarr','\u290E':'lBarr','\u290F':'rBarr','\u2910':'RBarr','\u2911':'DDotrahd','\u2912':'UpArrowBar','\u2913':'DownArrowBar','\u2916':'Rarrtl','\u2919':'latail','\u291A':'ratail','\u291B':'lAtail','\u291C':'rAtail','\u291D':'larrfs','\u291E':'rarrfs','\u291F':'larrbfs','\u2920':'rarrbfs','\u2923':'nwarhk','\u2924':'nearhk','\u2925':'searhk','\u2926':'swarhk','\u2927':'nwnear','\u2928':'toea','\u2929':'tosa','\u292A':'swnwar','\u2933':'rarrc','\u2933\u0338':'nrarrc','\u2935':'cudarrr','\u2936':'ldca','\u2937':'rdca','\u2938':'cudarrl','\u2939':'larrpl','\u293C':'curarrm','\u293D':'cularrp','\u2945':'rarrpl','\u2948':'harrcir','\u2949':'Uarrocir','\u294A':'lurdshar','\u294B':'ldrushar','\u294E':'LeftRightVector','\u294F':'RightUpDownVector','\u2950':'DownLeftRightVector','\u2951':'LeftUpDownVector','\u2952':'LeftVectorBar','\u2953':'RightVectorBar','\u2954':'RightUpVectorBar','\u2955':'RightDownVectorBar','\u2956':'DownLeftVectorBar','\u2957':'DownRightVectorBar','\u2958':'LeftUpVectorBar','\u2959':'LeftDownVectorBar','\u295A':'LeftTeeVector','\u295B':'RightTeeVector','\u295C':'RightUpTeeVector','\u295D':'RightDownTeeVector','\u295E':'DownLeftTeeVector','\u295F':'DownRightTeeVector','\u2960':'LeftUpTeeVector','\u2961':'LeftDownTeeVector','\u2962':'lHar','\u2963':'uHar','\u2964':'rHar','\u2965':'dHar','\u2966':'luruhar','\u2967':'ldrdhar','\u2968':'ruluhar','\u2969':'rdldhar','\u296A':'lharul','\u296B':'llhard','\u296C':'rharul','\u296D':'lrhard','\u296E':'udhar','\u296F':'duhar','\u2970':'RoundImplies','\u2971':'erarr','\u2972':'simrarr','\u2973':'larrsim','\u2974':'rarrsim','\u2975':'rarrap','\u2976':'ltlarr','\u2978':'gtrarr','\u2979':'subrarr','\u297B':'suplarr','\u297C':'lfisht','\u297D':'rfisht','\u297E':'ufisht','\u297F':'dfisht','\u299A':'vzigzag','\u299C':'vangrt','\u299D':'angrtvbd','\u29A4':'ange','\u29A5':'range','\u29A6':'dwangle','\u29A7':'uwangle','\u29A8':'angmsdaa','\u29A9':'angmsdab','\u29AA':'angmsdac','\u29AB':'angmsdad','\u29AC':'angmsdae','\u29AD':'angmsdaf','\u29AE':'angmsdag','\u29AF':'angmsdah','\u29B0':'bemptyv','\u29B1':'demptyv','\u29B2':'cemptyv','\u29B3':'raemptyv','\u29B4':'laemptyv','\u29B5':'ohbar','\u29B6':'omid','\u29B7':'opar','\u29B9':'operp','\u29BB':'olcross','\u29BC':'odsold','\u29BE':'olcir','\u29BF':'ofcir','\u29C0':'olt','\u29C1':'ogt','\u29C2':'cirscir','\u29C3':'cirE','\u29C4':'solb','\u29C5':'bsolb','\u29C9':'boxbox','\u29CD':'trisb','\u29CE':'rtriltri','\u29CF':'LeftTriangleBar','\u29CF\u0338':'NotLeftTriangleBar','\u29D0':'RightTriangleBar','\u29D0\u0338':'NotRightTriangleBar','\u29DC':'iinfin','\u29DD':'infintie','\u29DE':'nvinfin','\u29E3':'eparsl','\u29E4':'smeparsl','\u29E5':'eqvparsl','\u29EB':'lozf','\u29F4':'RuleDelayed','\u29F6':'dsol','\u2A00':'xodot','\u2A01':'xoplus','\u2A02':'xotime','\u2A04':'xuplus','\u2A06':'xsqcup','\u2A0D':'fpartint','\u2A10':'cirfnint','\u2A11':'awint','\u2A12':'rppolint','\u2A13':'scpolint','\u2A14':'npolint','\u2A15':'pointint','\u2A16':'quatint','\u2A17':'intlarhk','\u2A22':'pluscir','\u2A23':'plusacir','\u2A24':'simplus','\u2A25':'plusdu','\u2A26':'plussim','\u2A27':'plustwo','\u2A29':'mcomma','\u2A2A':'minusdu','\u2A2D':'loplus','\u2A2E':'roplus','\u2A2F':'Cross','\u2A30':'timesd','\u2A31':'timesbar','\u2A33':'smashp','\u2A34':'lotimes','\u2A35':'rotimes','\u2A36':'otimesas','\u2A37':'Otimes','\u2A38':'odiv','\u2A39':'triplus','\u2A3A':'triminus','\u2A3B':'tritime','\u2A3C':'iprod','\u2A3F':'amalg','\u2A40':'capdot','\u2A42':'ncup','\u2A43':'ncap','\u2A44':'capand','\u2A45':'cupor','\u2A46':'cupcap','\u2A47':'capcup','\u2A48':'cupbrcap','\u2A49':'capbrcup','\u2A4A':'cupcup','\u2A4B':'capcap','\u2A4C':'ccups','\u2A4D':'ccaps','\u2A50':'ccupssm','\u2A53':'And','\u2A54':'Or','\u2A55':'andand','\u2A56':'oror','\u2A57':'orslope','\u2A58':'andslope','\u2A5A':'andv','\u2A5B':'orv','\u2A5C':'andd','\u2A5D':'ord','\u2A5F':'wedbar','\u2A66':'sdote','\u2A6A':'simdot','\u2A6D':'congdot','\u2A6D\u0338':'ncongdot','\u2A6E':'easter','\u2A6F':'apacir','\u2A70':'apE','\u2A70\u0338':'napE','\u2A71':'eplus','\u2A72':'pluse','\u2A73':'Esim','\u2A77':'eDDot','\u2A78':'equivDD','\u2A79':'ltcir','\u2A7A':'gtcir','\u2A7B':'ltquest','\u2A7C':'gtquest','\u2A7D':'les','\u2A7D\u0338':'nles','\u2A7E':'ges','\u2A7E\u0338':'nges','\u2A7F':'lesdot','\u2A80':'gesdot','\u2A81':'lesdoto','\u2A82':'gesdoto','\u2A83':'lesdotor','\u2A84':'gesdotol','\u2A85':'lap','\u2A86':'gap','\u2A87':'lne','\u2A88':'gne','\u2A89':'lnap','\u2A8A':'gnap','\u2A8B':'lEg','\u2A8C':'gEl','\u2A8D':'lsime','\u2A8E':'gsime','\u2A8F':'lsimg','\u2A90':'gsiml','\u2A91':'lgE','\u2A92':'glE','\u2A93':'lesges','\u2A94':'gesles','\u2A95':'els','\u2A96':'egs','\u2A97':'elsdot','\u2A98':'egsdot','\u2A99':'el','\u2A9A':'eg','\u2A9D':'siml','\u2A9E':'simg','\u2A9F':'simlE','\u2AA0':'simgE','\u2AA1':'LessLess','\u2AA1\u0338':'NotNestedLessLess','\u2AA2':'GreaterGreater','\u2AA2\u0338':'NotNestedGreaterGreater','\u2AA4':'glj','\u2AA5':'gla','\u2AA6':'ltcc','\u2AA7':'gtcc','\u2AA8':'lescc','\u2AA9':'gescc','\u2AAA':'smt','\u2AAB':'lat','\u2AAC':'smte','\u2AAC\uFE00':'smtes','\u2AAD':'late','\u2AAD\uFE00':'lates','\u2AAE':'bumpE','\u2AAF':'pre','\u2AAF\u0338':'npre','\u2AB0':'sce','\u2AB0\u0338':'nsce','\u2AB3':'prE','\u2AB4':'scE','\u2AB5':'prnE','\u2AB6':'scnE','\u2AB7':'prap','\u2AB8':'scap','\u2AB9':'prnap','\u2ABA':'scnap','\u2ABB':'Pr','\u2ABC':'Sc','\u2ABD':'subdot','\u2ABE':'supdot','\u2ABF':'subplus','\u2AC0':'supplus','\u2AC1':'submult','\u2AC2':'supmult','\u2AC3':'subedot','\u2AC4':'supedot','\u2AC5':'subE','\u2AC5\u0338':'nsubE','\u2AC6':'supE','\u2AC6\u0338':'nsupE','\u2AC7':'subsim','\u2AC8':'supsim','\u2ACB\uFE00':'vsubnE','\u2ACB':'subnE','\u2ACC\uFE00':'vsupnE','\u2ACC':'supnE','\u2ACF':'csub','\u2AD0':'csup','\u2AD1':'csube','\u2AD2':'csupe','\u2AD3':'subsup','\u2AD4':'supsub','\u2AD5':'subsub','\u2AD6':'supsup','\u2AD7':'suphsub','\u2AD8':'supdsub','\u2AD9':'forkv','\u2ADA':'topfork','\u2ADB':'mlcp','\u2AE4':'Dashv','\u2AE6':'Vdashl','\u2AE7':'Barv','\u2AE8':'vBar','\u2AE9':'vBarv','\u2AEB':'Vbar','\u2AEC':'Not','\u2AED':'bNot','\u2AEE':'rnmid','\u2AEF':'cirmid','\u2AF0':'midcir','\u2AF1':'topcir','\u2AF2':'nhpar','\u2AF3':'parsim','\u2AFD':'parsl','\u2AFD\u20E5':'nparsl','\u266D':'flat','\u266E':'natur','\u266F':'sharp','\xA4':'curren','\xA2':'cent','$':'dollar','\xA3':'pound','\xA5':'yen','\u20AC':'euro','\xB9':'sup1','\xBD':'half','\u2153':'frac13','\xBC':'frac14','\u2155':'frac15','\u2159':'frac16','\u215B':'frac18','\xB2':'sup2','\u2154':'frac23','\u2156':'frac25','\xB3':'sup3','\xBE':'frac34','\u2157':'frac35','\u215C':'frac38','\u2158':'frac45','\u215A':'frac56','\u215D':'frac58','\u215E':'frac78','\uD835\uDCB6':'ascr','\uD835\uDD52':'aopf','\uD835\uDD1E':'afr','\uD835\uDD38':'Aopf','\uD835\uDD04':'Afr','\uD835\uDC9C':'Ascr','\xAA':'ordf','\xE1':'aacute','\xC1':'Aacute','\xE0':'agrave','\xC0':'Agrave','\u0103':'abreve','\u0102':'Abreve','\xE2':'acirc','\xC2':'Acirc','\xE5':'aring','\xC5':'angst','\xE4':'auml','\xC4':'Auml','\xE3':'atilde','\xC3':'Atilde','\u0105':'aogon','\u0104':'Aogon','\u0101':'amacr','\u0100':'Amacr','\xE6':'aelig','\xC6':'AElig','\uD835\uDCB7':'bscr','\uD835\uDD53':'bopf','\uD835\uDD1F':'bfr','\uD835\uDD39':'Bopf','\u212C':'Bscr','\uD835\uDD05':'Bfr','\uD835\uDD20':'cfr','\uD835\uDCB8':'cscr','\uD835\uDD54':'copf','\u212D':'Cfr','\uD835\uDC9E':'Cscr','\u2102':'Copf','\u0107':'cacute','\u0106':'Cacute','\u0109':'ccirc','\u0108':'Ccirc','\u010D':'ccaron','\u010C':'Ccaron','\u010B':'cdot','\u010A':'Cdot','\xE7':'ccedil','\xC7':'Ccedil','\u2105':'incare','\uD835\uDD21':'dfr','\u2146':'dd','\uD835\uDD55':'dopf','\uD835\uDCB9':'dscr','\uD835\uDC9F':'Dscr','\uD835\uDD07':'Dfr','\u2145':'DD','\uD835\uDD3B':'Dopf','\u010F':'dcaron','\u010E':'Dcaron','\u0111':'dstrok','\u0110':'Dstrok','\xF0':'eth','\xD0':'ETH','\u2147':'ee','\u212F':'escr','\uD835\uDD22':'efr','\uD835\uDD56':'eopf','\u2130':'Escr','\uD835\uDD08':'Efr','\uD835\uDD3C':'Eopf','\xE9':'eacute','\xC9':'Eacute','\xE8':'egrave','\xC8':'Egrave','\xEA':'ecirc','\xCA':'Ecirc','\u011B':'ecaron','\u011A':'Ecaron','\xEB':'euml','\xCB':'Euml','\u0117':'edot','\u0116':'Edot','\u0119':'eogon','\u0118':'Eogon','\u0113':'emacr','\u0112':'Emacr','\uD835\uDD23':'ffr','\uD835\uDD57':'fopf','\uD835\uDCBB':'fscr','\uD835\uDD09':'Ffr','\uD835\uDD3D':'Fopf','\u2131':'Fscr','\uFB00':'fflig','\uFB03':'ffilig','\uFB04':'ffllig','\uFB01':'filig','fj':'fjlig','\uFB02':'fllig','\u0192':'fnof','\u210A':'gscr','\uD835\uDD58':'gopf','\uD835\uDD24':'gfr','\uD835\uDCA2':'Gscr','\uD835\uDD3E':'Gopf','\uD835\uDD0A':'Gfr','\u01F5':'gacute','\u011F':'gbreve','\u011E':'Gbreve','\u011D':'gcirc','\u011C':'Gcirc','\u0121':'gdot','\u0120':'Gdot','\u0122':'Gcedil','\uD835\uDD25':'hfr','\u210E':'planckh','\uD835\uDCBD':'hscr','\uD835\uDD59':'hopf','\u210B':'Hscr','\u210C':'Hfr','\u210D':'Hopf','\u0125':'hcirc','\u0124':'Hcirc','\u210F':'hbar','\u0127':'hstrok','\u0126':'Hstrok','\uD835\uDD5A':'iopf','\uD835\uDD26':'ifr','\uD835\uDCBE':'iscr','\u2148':'ii','\uD835\uDD40':'Iopf','\u2110':'Iscr','\u2111':'Im','\xED':'iacute','\xCD':'Iacute','\xEC':'igrave','\xCC':'Igrave','\xEE':'icirc','\xCE':'Icirc','\xEF':'iuml','\xCF':'Iuml','\u0129':'itilde','\u0128':'Itilde','\u0130':'Idot','\u012F':'iogon','\u012E':'Iogon','\u012B':'imacr','\u012A':'Imacr','\u0133':'ijlig','\u0132':'IJlig','\u0131':'imath','\uD835\uDCBF':'jscr','\uD835\uDD5B':'jopf','\uD835\uDD27':'jfr','\uD835\uDCA5':'Jscr','\uD835\uDD0D':'Jfr','\uD835\uDD41':'Jopf','\u0135':'jcirc','\u0134':'Jcirc','\u0237':'jmath','\uD835\uDD5C':'kopf','\uD835\uDCC0':'kscr','\uD835\uDD28':'kfr','\uD835\uDCA6':'Kscr','\uD835\uDD42':'Kopf','\uD835\uDD0E':'Kfr','\u0137':'kcedil','\u0136':'Kcedil','\uD835\uDD29':'lfr','\uD835\uDCC1':'lscr','\u2113':'ell','\uD835\uDD5D':'lopf','\u2112':'Lscr','\uD835\uDD0F':'Lfr','\uD835\uDD43':'Lopf','\u013A':'lacute','\u0139':'Lacute','\u013E':'lcaron','\u013D':'Lcaron','\u013C':'lcedil','\u013B':'Lcedil','\u0142':'lstrok','\u0141':'Lstrok','\u0140':'lmidot','\u013F':'Lmidot','\uD835\uDD2A':'mfr','\uD835\uDD5E':'mopf','\uD835\uDCC2':'mscr','\uD835\uDD10':'Mfr','\uD835\uDD44':'Mopf','\u2133':'Mscr','\uD835\uDD2B':'nfr','\uD835\uDD5F':'nopf','\uD835\uDCC3':'nscr','\u2115':'Nopf','\uD835\uDCA9':'Nscr','\uD835\uDD11':'Nfr','\u0144':'nacute','\u0143':'Nacute','\u0148':'ncaron','\u0147':'Ncaron','\xF1':'ntilde','\xD1':'Ntilde','\u0146':'ncedil','\u0145':'Ncedil','\u2116':'numero','\u014B':'eng','\u014A':'ENG','\uD835\uDD60':'oopf','\uD835\uDD2C':'ofr','\u2134':'oscr','\uD835\uDCAA':'Oscr','\uD835\uDD12':'Ofr','\uD835\uDD46':'Oopf','\xBA':'ordm','\xF3':'oacute','\xD3':'Oacute','\xF2':'ograve','\xD2':'Ograve','\xF4':'ocirc','\xD4':'Ocirc','\xF6':'ouml','\xD6':'Ouml','\u0151':'odblac','\u0150':'Odblac','\xF5':'otilde','\xD5':'Otilde','\xF8':'oslash','\xD8':'Oslash','\u014D':'omacr','\u014C':'Omacr','\u0153':'oelig','\u0152':'OElig','\uD835\uDD2D':'pfr','\uD835\uDCC5':'pscr','\uD835\uDD61':'popf','\u2119':'Popf','\uD835\uDD13':'Pfr','\uD835\uDCAB':'Pscr','\uD835\uDD62':'qopf','\uD835\uDD2E':'qfr','\uD835\uDCC6':'qscr','\uD835\uDCAC':'Qscr','\uD835\uDD14':'Qfr','\u211A':'Qopf','\u0138':'kgreen','\uD835\uDD2F':'rfr','\uD835\uDD63':'ropf','\uD835\uDCC7':'rscr','\u211B':'Rscr','\u211C':'Re','\u211D':'Ropf','\u0155':'racute','\u0154':'Racute','\u0159':'rcaron','\u0158':'Rcaron','\u0157':'rcedil','\u0156':'Rcedil','\uD835\uDD64':'sopf','\uD835\uDCC8':'sscr','\uD835\uDD30':'sfr','\uD835\uDD4A':'Sopf','\uD835\uDD16':'Sfr','\uD835\uDCAE':'Sscr','\u24C8':'oS','\u015B':'sacute','\u015A':'Sacute','\u015D':'scirc','\u015C':'Scirc','\u0161':'scaron','\u0160':'Scaron','\u015F':'scedil','\u015E':'Scedil','\xDF':'szlig','\uD835\uDD31':'tfr','\uD835\uDCC9':'tscr','\uD835\uDD65':'topf','\uD835\uDCAF':'Tscr','\uD835\uDD17':'Tfr','\uD835\uDD4B':'Topf','\u0165':'tcaron','\u0164':'Tcaron','\u0163':'tcedil','\u0162':'Tcedil','\u2122':'trade','\u0167':'tstrok','\u0166':'Tstrok','\uD835\uDCCA':'uscr','\uD835\uDD66':'uopf','\uD835\uDD32':'ufr','\uD835\uDD4C':'Uopf','\uD835\uDD18':'Ufr','\uD835\uDCB0':'Uscr','\xFA':'uacute','\xDA':'Uacute','\xF9':'ugrave','\xD9':'Ugrave','\u016D':'ubreve','\u016C':'Ubreve','\xFB':'ucirc','\xDB':'Ucirc','\u016F':'uring','\u016E':'Uring','\xFC':'uuml','\xDC':'Uuml','\u0171':'udblac','\u0170':'Udblac','\u0169':'utilde','\u0168':'Utilde','\u0173':'uogon','\u0172':'Uogon','\u016B':'umacr','\u016A':'Umacr','\uD835\uDD33':'vfr','\uD835\uDD67':'vopf','\uD835\uDCCB':'vscr','\uD835\uDD19':'Vfr','\uD835\uDD4D':'Vopf','\uD835\uDCB1':'Vscr','\uD835\uDD68':'wopf','\uD835\uDCCC':'wscr','\uD835\uDD34':'wfr','\uD835\uDCB2':'Wscr','\uD835\uDD4E':'Wopf','\uD835\uDD1A':'Wfr','\u0175':'wcirc','\u0174':'Wcirc','\uD835\uDD35':'xfr','\uD835\uDCCD':'xscr','\uD835\uDD69':'xopf','\uD835\uDD4F':'Xopf','\uD835\uDD1B':'Xfr','\uD835\uDCB3':'Xscr','\uD835\uDD36':'yfr','\uD835\uDCCE':'yscr','\uD835\uDD6A':'yopf','\uD835\uDCB4':'Yscr','\uD835\uDD1C':'Yfr','\uD835\uDD50':'Yopf','\xFD':'yacute','\xDD':'Yacute','\u0177':'ycirc','\u0176':'Ycirc','\xFF':'yuml','\u0178':'Yuml','\uD835\uDCCF':'zscr','\uD835\uDD37':'zfr','\uD835\uDD6B':'zopf','\u2128':'Zfr','\u2124':'Zopf','\uD835\uDCB5':'Zscr','\u017A':'zacute','\u0179':'Zacute','\u017E':'zcaron','\u017D':'Zcaron','\u017C':'zdot','\u017B':'Zdot','\u01B5':'imped','\xFE':'thorn','\xDE':'THORN','\u0149':'napos','\u03B1':'alpha','\u0391':'Alpha','\u03B2':'beta','\u0392':'Beta','\u03B3':'gamma','\u0393':'Gamma','\u03B4':'delta','\u0394':'Delta','\u03B5':'epsi','\u03F5':'epsiv','\u0395':'Epsilon','\u03DD':'gammad','\u03DC':'Gammad','\u03B6':'zeta','\u0396':'Zeta','\u03B7':'eta','\u0397':'Eta','\u03B8':'theta','\u03D1':'thetav','\u0398':'Theta','\u03B9':'iota','\u0399':'Iota','\u03BA':'kappa','\u03F0':'kappav','\u039A':'Kappa','\u03BB':'lambda','\u039B':'Lambda','\u03BC':'mu','\xB5':'micro','\u039C':'Mu','\u03BD':'nu','\u039D':'Nu','\u03BE':'xi','\u039E':'Xi','\u03BF':'omicron','\u039F':'Omicron','\u03C0':'pi','\u03D6':'piv','\u03A0':'Pi','\u03C1':'rho','\u03F1':'rhov','\u03A1':'Rho','\u03C3':'sigma','\u03A3':'Sigma','\u03C2':'sigmaf','\u03C4':'tau','\u03A4':'Tau','\u03C5':'upsi','\u03A5':'Upsilon','\u03D2':'Upsi','\u03C6':'phi','\u03D5':'phiv','\u03A6':'Phi','\u03C7':'chi','\u03A7':'Chi','\u03C8':'psi','\u03A8':'Psi','\u03C9':'omega','\u03A9':'ohm','\u0430':'acy','\u0410':'Acy','\u0431':'bcy','\u0411':'Bcy','\u0432':'vcy','\u0412':'Vcy','\u0433':'gcy','\u0413':'Gcy','\u0453':'gjcy','\u0403':'GJcy','\u0434':'dcy','\u0414':'Dcy','\u0452':'djcy','\u0402':'DJcy','\u0435':'iecy','\u0415':'IEcy','\u0451':'iocy','\u0401':'IOcy','\u0454':'jukcy','\u0404':'Jukcy','\u0436':'zhcy','\u0416':'ZHcy','\u0437':'zcy','\u0417':'Zcy','\u0455':'dscy','\u0405':'DScy','\u0438':'icy','\u0418':'Icy','\u0456':'iukcy','\u0406':'Iukcy','\u0457':'yicy','\u0407':'YIcy','\u0439':'jcy','\u0419':'Jcy','\u0458':'jsercy','\u0408':'Jsercy','\u043A':'kcy','\u041A':'Kcy','\u045C':'kjcy','\u040C':'KJcy','\u043B':'lcy','\u041B':'Lcy','\u0459':'ljcy','\u0409':'LJcy','\u043C':'mcy','\u041C':'Mcy','\u043D':'ncy','\u041D':'Ncy','\u045A':'njcy','\u040A':'NJcy','\u043E':'ocy','\u041E':'Ocy','\u043F':'pcy','\u041F':'Pcy','\u0440':'rcy','\u0420':'Rcy','\u0441':'scy','\u0421':'Scy','\u0442':'tcy','\u0422':'Tcy','\u045B':'tshcy','\u040B':'TSHcy','\u0443':'ucy','\u0423':'Ucy','\u045E':'ubrcy','\u040E':'Ubrcy','\u0444':'fcy','\u0424':'Fcy','\u0445':'khcy','\u0425':'KHcy','\u0446':'tscy','\u0426':'TScy','\u0447':'chcy','\u0427':'CHcy','\u045F':'dzcy','\u040F':'DZcy','\u0448':'shcy','\u0428':'SHcy','\u0449':'shchcy','\u0429':'SHCHcy','\u044A':'hardcy','\u042A':'HARDcy','\u044B':'ycy','\u042B':'Ycy','\u044C':'softcy','\u042C':'SOFTcy','\u044D':'ecy','\u042D':'Ecy','\u044E':'yucy','\u042E':'YUcy','\u044F':'yacy','\u042F':'YAcy','\u2135':'aleph','\u2136':'beth','\u2137':'gimel','\u2138':'daleth'}; - - var regexEscape = /["&'<>`]/g; - var escapeMap = { - '"': '"', - '&': '&', - '\'': ''', - '<': '<', - // See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the - // following is not strictly necessary unless it’s part of a tag or an - // unquoted attribute value. We’re only escaping it to support those - // situations, and for XML support. - '>': '>', - // In Internet Explorer ≤ 8, the backtick character can be used - // to break out of (un)quoted attribute values or HTML comments. - // See http://html5sec.org/#102, http://html5sec.org/#108, and - // http://html5sec.org/#133. - '`': '`' - }; - - var regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/; - var regexInvalidRawCodePoint = /[\0-\x08\x0B\x0E-\x1F\x7F-\x9F\uFDD0-\uFDEF\uFFFE\uFFFF]|[\uD83F\uD87F\uD8BF\uD8FF\uD93F\uD97F\uD9BF\uD9FF\uDA3F\uDA7F\uDABF\uDAFF\uDB3F\uDB7F\uDBBF\uDBFF][\uDFFE\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; - var regexDecode = /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g; - var decodeMap = {'aacute':'\xE1','Aacute':'\xC1','abreve':'\u0103','Abreve':'\u0102','ac':'\u223E','acd':'\u223F','acE':'\u223E\u0333','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','acy':'\u0430','Acy':'\u0410','aelig':'\xE6','AElig':'\xC6','af':'\u2061','afr':'\uD835\uDD1E','Afr':'\uD835\uDD04','agrave':'\xE0','Agrave':'\xC0','alefsym':'\u2135','aleph':'\u2135','alpha':'\u03B1','Alpha':'\u0391','amacr':'\u0101','Amacr':'\u0100','amalg':'\u2A3F','amp':'&','AMP':'&','and':'\u2227','And':'\u2A53','andand':'\u2A55','andd':'\u2A5C','andslope':'\u2A58','andv':'\u2A5A','ang':'\u2220','ange':'\u29A4','angle':'\u2220','angmsd':'\u2221','angmsdaa':'\u29A8','angmsdab':'\u29A9','angmsdac':'\u29AA','angmsdad':'\u29AB','angmsdae':'\u29AC','angmsdaf':'\u29AD','angmsdag':'\u29AE','angmsdah':'\u29AF','angrt':'\u221F','angrtvb':'\u22BE','angrtvbd':'\u299D','angsph':'\u2222','angst':'\xC5','angzarr':'\u237C','aogon':'\u0105','Aogon':'\u0104','aopf':'\uD835\uDD52','Aopf':'\uD835\uDD38','ap':'\u2248','apacir':'\u2A6F','ape':'\u224A','apE':'\u2A70','apid':'\u224B','apos':'\'','ApplyFunction':'\u2061','approx':'\u2248','approxeq':'\u224A','aring':'\xE5','Aring':'\xC5','ascr':'\uD835\uDCB6','Ascr':'\uD835\uDC9C','Assign':'\u2254','ast':'*','asymp':'\u2248','asympeq':'\u224D','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','awconint':'\u2233','awint':'\u2A11','backcong':'\u224C','backepsilon':'\u03F6','backprime':'\u2035','backsim':'\u223D','backsimeq':'\u22CD','Backslash':'\u2216','Barv':'\u2AE7','barvee':'\u22BD','barwed':'\u2305','Barwed':'\u2306','barwedge':'\u2305','bbrk':'\u23B5','bbrktbrk':'\u23B6','bcong':'\u224C','bcy':'\u0431','Bcy':'\u0411','bdquo':'\u201E','becaus':'\u2235','because':'\u2235','Because':'\u2235','bemptyv':'\u29B0','bepsi':'\u03F6','bernou':'\u212C','Bernoullis':'\u212C','beta':'\u03B2','Beta':'\u0392','beth':'\u2136','between':'\u226C','bfr':'\uD835\uDD1F','Bfr':'\uD835\uDD05','bigcap':'\u22C2','bigcirc':'\u25EF','bigcup':'\u22C3','bigodot':'\u2A00','bigoplus':'\u2A01','bigotimes':'\u2A02','bigsqcup':'\u2A06','bigstar':'\u2605','bigtriangledown':'\u25BD','bigtriangleup':'\u25B3','biguplus':'\u2A04','bigvee':'\u22C1','bigwedge':'\u22C0','bkarow':'\u290D','blacklozenge':'\u29EB','blacksquare':'\u25AA','blacktriangle':'\u25B4','blacktriangledown':'\u25BE','blacktriangleleft':'\u25C2','blacktriangleright':'\u25B8','blank':'\u2423','blk12':'\u2592','blk14':'\u2591','blk34':'\u2593','block':'\u2588','bne':'=\u20E5','bnequiv':'\u2261\u20E5','bnot':'\u2310','bNot':'\u2AED','bopf':'\uD835\uDD53','Bopf':'\uD835\uDD39','bot':'\u22A5','bottom':'\u22A5','bowtie':'\u22C8','boxbox':'\u29C9','boxdl':'\u2510','boxdL':'\u2555','boxDl':'\u2556','boxDL':'\u2557','boxdr':'\u250C','boxdR':'\u2552','boxDr':'\u2553','boxDR':'\u2554','boxh':'\u2500','boxH':'\u2550','boxhd':'\u252C','boxhD':'\u2565','boxHd':'\u2564','boxHD':'\u2566','boxhu':'\u2534','boxhU':'\u2568','boxHu':'\u2567','boxHU':'\u2569','boxminus':'\u229F','boxplus':'\u229E','boxtimes':'\u22A0','boxul':'\u2518','boxuL':'\u255B','boxUl':'\u255C','boxUL':'\u255D','boxur':'\u2514','boxuR':'\u2558','boxUr':'\u2559','boxUR':'\u255A','boxv':'\u2502','boxV':'\u2551','boxvh':'\u253C','boxvH':'\u256A','boxVh':'\u256B','boxVH':'\u256C','boxvl':'\u2524','boxvL':'\u2561','boxVl':'\u2562','boxVL':'\u2563','boxvr':'\u251C','boxvR':'\u255E','boxVr':'\u255F','boxVR':'\u2560','bprime':'\u2035','breve':'\u02D8','Breve':'\u02D8','brvbar':'\xA6','bscr':'\uD835\uDCB7','Bscr':'\u212C','bsemi':'\u204F','bsim':'\u223D','bsime':'\u22CD','bsol':'\\','bsolb':'\u29C5','bsolhsub':'\u27C8','bull':'\u2022','bullet':'\u2022','bump':'\u224E','bumpe':'\u224F','bumpE':'\u2AAE','bumpeq':'\u224F','Bumpeq':'\u224E','cacute':'\u0107','Cacute':'\u0106','cap':'\u2229','Cap':'\u22D2','capand':'\u2A44','capbrcup':'\u2A49','capcap':'\u2A4B','capcup':'\u2A47','capdot':'\u2A40','CapitalDifferentialD':'\u2145','caps':'\u2229\uFE00','caret':'\u2041','caron':'\u02C7','Cayleys':'\u212D','ccaps':'\u2A4D','ccaron':'\u010D','Ccaron':'\u010C','ccedil':'\xE7','Ccedil':'\xC7','ccirc':'\u0109','Ccirc':'\u0108','Cconint':'\u2230','ccups':'\u2A4C','ccupssm':'\u2A50','cdot':'\u010B','Cdot':'\u010A','cedil':'\xB8','Cedilla':'\xB8','cemptyv':'\u29B2','cent':'\xA2','centerdot':'\xB7','CenterDot':'\xB7','cfr':'\uD835\uDD20','Cfr':'\u212D','chcy':'\u0447','CHcy':'\u0427','check':'\u2713','checkmark':'\u2713','chi':'\u03C7','Chi':'\u03A7','cir':'\u25CB','circ':'\u02C6','circeq':'\u2257','circlearrowleft':'\u21BA','circlearrowright':'\u21BB','circledast':'\u229B','circledcirc':'\u229A','circleddash':'\u229D','CircleDot':'\u2299','circledR':'\xAE','circledS':'\u24C8','CircleMinus':'\u2296','CirclePlus':'\u2295','CircleTimes':'\u2297','cire':'\u2257','cirE':'\u29C3','cirfnint':'\u2A10','cirmid':'\u2AEF','cirscir':'\u29C2','ClockwiseContourIntegral':'\u2232','CloseCurlyDoubleQuote':'\u201D','CloseCurlyQuote':'\u2019','clubs':'\u2663','clubsuit':'\u2663','colon':':','Colon':'\u2237','colone':'\u2254','Colone':'\u2A74','coloneq':'\u2254','comma':',','commat':'@','comp':'\u2201','compfn':'\u2218','complement':'\u2201','complexes':'\u2102','cong':'\u2245','congdot':'\u2A6D','Congruent':'\u2261','conint':'\u222E','Conint':'\u222F','ContourIntegral':'\u222E','copf':'\uD835\uDD54','Copf':'\u2102','coprod':'\u2210','Coproduct':'\u2210','copy':'\xA9','COPY':'\xA9','copysr':'\u2117','CounterClockwiseContourIntegral':'\u2233','crarr':'\u21B5','cross':'\u2717','Cross':'\u2A2F','cscr':'\uD835\uDCB8','Cscr':'\uD835\uDC9E','csub':'\u2ACF','csube':'\u2AD1','csup':'\u2AD0','csupe':'\u2AD2','ctdot':'\u22EF','cudarrl':'\u2938','cudarrr':'\u2935','cuepr':'\u22DE','cuesc':'\u22DF','cularr':'\u21B6','cularrp':'\u293D','cup':'\u222A','Cup':'\u22D3','cupbrcap':'\u2A48','cupcap':'\u2A46','CupCap':'\u224D','cupcup':'\u2A4A','cupdot':'\u228D','cupor':'\u2A45','cups':'\u222A\uFE00','curarr':'\u21B7','curarrm':'\u293C','curlyeqprec':'\u22DE','curlyeqsucc':'\u22DF','curlyvee':'\u22CE','curlywedge':'\u22CF','curren':'\xA4','curvearrowleft':'\u21B6','curvearrowright':'\u21B7','cuvee':'\u22CE','cuwed':'\u22CF','cwconint':'\u2232','cwint':'\u2231','cylcty':'\u232D','dagger':'\u2020','Dagger':'\u2021','daleth':'\u2138','darr':'\u2193','dArr':'\u21D3','Darr':'\u21A1','dash':'\u2010','dashv':'\u22A3','Dashv':'\u2AE4','dbkarow':'\u290F','dblac':'\u02DD','dcaron':'\u010F','Dcaron':'\u010E','dcy':'\u0434','Dcy':'\u0414','dd':'\u2146','DD':'\u2145','ddagger':'\u2021','ddarr':'\u21CA','DDotrahd':'\u2911','ddotseq':'\u2A77','deg':'\xB0','Del':'\u2207','delta':'\u03B4','Delta':'\u0394','demptyv':'\u29B1','dfisht':'\u297F','dfr':'\uD835\uDD21','Dfr':'\uD835\uDD07','dHar':'\u2965','dharl':'\u21C3','dharr':'\u21C2','DiacriticalAcute':'\xB4','DiacriticalDot':'\u02D9','DiacriticalDoubleAcute':'\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\u02DC','diam':'\u22C4','diamond':'\u22C4','Diamond':'\u22C4','diamondsuit':'\u2666','diams':'\u2666','die':'\xA8','DifferentialD':'\u2146','digamma':'\u03DD','disin':'\u22F2','div':'\xF7','divide':'\xF7','divideontimes':'\u22C7','divonx':'\u22C7','djcy':'\u0452','DJcy':'\u0402','dlcorn':'\u231E','dlcrop':'\u230D','dollar':'$','dopf':'\uD835\uDD55','Dopf':'\uD835\uDD3B','dot':'\u02D9','Dot':'\xA8','DotDot':'\u20DC','doteq':'\u2250','doteqdot':'\u2251','DotEqual':'\u2250','dotminus':'\u2238','dotplus':'\u2214','dotsquare':'\u22A1','doublebarwedge':'\u2306','DoubleContourIntegral':'\u222F','DoubleDot':'\xA8','DoubleDownArrow':'\u21D3','DoubleLeftArrow':'\u21D0','DoubleLeftRightArrow':'\u21D4','DoubleLeftTee':'\u2AE4','DoubleLongLeftArrow':'\u27F8','DoubleLongLeftRightArrow':'\u27FA','DoubleLongRightArrow':'\u27F9','DoubleRightArrow':'\u21D2','DoubleRightTee':'\u22A8','DoubleUpArrow':'\u21D1','DoubleUpDownArrow':'\u21D5','DoubleVerticalBar':'\u2225','downarrow':'\u2193','Downarrow':'\u21D3','DownArrow':'\u2193','DownArrowBar':'\u2913','DownArrowUpArrow':'\u21F5','DownBreve':'\u0311','downdownarrows':'\u21CA','downharpoonleft':'\u21C3','downharpoonright':'\u21C2','DownLeftRightVector':'\u2950','DownLeftTeeVector':'\u295E','DownLeftVector':'\u21BD','DownLeftVectorBar':'\u2956','DownRightTeeVector':'\u295F','DownRightVector':'\u21C1','DownRightVectorBar':'\u2957','DownTee':'\u22A4','DownTeeArrow':'\u21A7','drbkarow':'\u2910','drcorn':'\u231F','drcrop':'\u230C','dscr':'\uD835\uDCB9','Dscr':'\uD835\uDC9F','dscy':'\u0455','DScy':'\u0405','dsol':'\u29F6','dstrok':'\u0111','Dstrok':'\u0110','dtdot':'\u22F1','dtri':'\u25BF','dtrif':'\u25BE','duarr':'\u21F5','duhar':'\u296F','dwangle':'\u29A6','dzcy':'\u045F','DZcy':'\u040F','dzigrarr':'\u27FF','eacute':'\xE9','Eacute':'\xC9','easter':'\u2A6E','ecaron':'\u011B','Ecaron':'\u011A','ecir':'\u2256','ecirc':'\xEA','Ecirc':'\xCA','ecolon':'\u2255','ecy':'\u044D','Ecy':'\u042D','eDDot':'\u2A77','edot':'\u0117','eDot':'\u2251','Edot':'\u0116','ee':'\u2147','efDot':'\u2252','efr':'\uD835\uDD22','Efr':'\uD835\uDD08','eg':'\u2A9A','egrave':'\xE8','Egrave':'\xC8','egs':'\u2A96','egsdot':'\u2A98','el':'\u2A99','Element':'\u2208','elinters':'\u23E7','ell':'\u2113','els':'\u2A95','elsdot':'\u2A97','emacr':'\u0113','Emacr':'\u0112','empty':'\u2205','emptyset':'\u2205','EmptySmallSquare':'\u25FB','emptyv':'\u2205','EmptyVerySmallSquare':'\u25AB','emsp':'\u2003','emsp13':'\u2004','emsp14':'\u2005','eng':'\u014B','ENG':'\u014A','ensp':'\u2002','eogon':'\u0119','Eogon':'\u0118','eopf':'\uD835\uDD56','Eopf':'\uD835\uDD3C','epar':'\u22D5','eparsl':'\u29E3','eplus':'\u2A71','epsi':'\u03B5','epsilon':'\u03B5','Epsilon':'\u0395','epsiv':'\u03F5','eqcirc':'\u2256','eqcolon':'\u2255','eqsim':'\u2242','eqslantgtr':'\u2A96','eqslantless':'\u2A95','Equal':'\u2A75','equals':'=','EqualTilde':'\u2242','equest':'\u225F','Equilibrium':'\u21CC','equiv':'\u2261','equivDD':'\u2A78','eqvparsl':'\u29E5','erarr':'\u2971','erDot':'\u2253','escr':'\u212F','Escr':'\u2130','esdot':'\u2250','esim':'\u2242','Esim':'\u2A73','eta':'\u03B7','Eta':'\u0397','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','euro':'\u20AC','excl':'!','exist':'\u2203','Exists':'\u2203','expectation':'\u2130','exponentiale':'\u2147','ExponentialE':'\u2147','fallingdotseq':'\u2252','fcy':'\u0444','Fcy':'\u0424','female':'\u2640','ffilig':'\uFB03','fflig':'\uFB00','ffllig':'\uFB04','ffr':'\uD835\uDD23','Ffr':'\uD835\uDD09','filig':'\uFB01','FilledSmallSquare':'\u25FC','FilledVerySmallSquare':'\u25AA','fjlig':'fj','flat':'\u266D','fllig':'\uFB02','fltns':'\u25B1','fnof':'\u0192','fopf':'\uD835\uDD57','Fopf':'\uD835\uDD3D','forall':'\u2200','ForAll':'\u2200','fork':'\u22D4','forkv':'\u2AD9','Fouriertrf':'\u2131','fpartint':'\u2A0D','frac12':'\xBD','frac13':'\u2153','frac14':'\xBC','frac15':'\u2155','frac16':'\u2159','frac18':'\u215B','frac23':'\u2154','frac25':'\u2156','frac34':'\xBE','frac35':'\u2157','frac38':'\u215C','frac45':'\u2158','frac56':'\u215A','frac58':'\u215D','frac78':'\u215E','frasl':'\u2044','frown':'\u2322','fscr':'\uD835\uDCBB','Fscr':'\u2131','gacute':'\u01F5','gamma':'\u03B3','Gamma':'\u0393','gammad':'\u03DD','Gammad':'\u03DC','gap':'\u2A86','gbreve':'\u011F','Gbreve':'\u011E','Gcedil':'\u0122','gcirc':'\u011D','Gcirc':'\u011C','gcy':'\u0433','Gcy':'\u0413','gdot':'\u0121','Gdot':'\u0120','ge':'\u2265','gE':'\u2267','gel':'\u22DB','gEl':'\u2A8C','geq':'\u2265','geqq':'\u2267','geqslant':'\u2A7E','ges':'\u2A7E','gescc':'\u2AA9','gesdot':'\u2A80','gesdoto':'\u2A82','gesdotol':'\u2A84','gesl':'\u22DB\uFE00','gesles':'\u2A94','gfr':'\uD835\uDD24','Gfr':'\uD835\uDD0A','gg':'\u226B','Gg':'\u22D9','ggg':'\u22D9','gimel':'\u2137','gjcy':'\u0453','GJcy':'\u0403','gl':'\u2277','gla':'\u2AA5','glE':'\u2A92','glj':'\u2AA4','gnap':'\u2A8A','gnapprox':'\u2A8A','gne':'\u2A88','gnE':'\u2269','gneq':'\u2A88','gneqq':'\u2269','gnsim':'\u22E7','gopf':'\uD835\uDD58','Gopf':'\uD835\uDD3E','grave':'`','GreaterEqual':'\u2265','GreaterEqualLess':'\u22DB','GreaterFullEqual':'\u2267','GreaterGreater':'\u2AA2','GreaterLess':'\u2277','GreaterSlantEqual':'\u2A7E','GreaterTilde':'\u2273','gscr':'\u210A','Gscr':'\uD835\uDCA2','gsim':'\u2273','gsime':'\u2A8E','gsiml':'\u2A90','gt':'>','Gt':'\u226B','GT':'>','gtcc':'\u2AA7','gtcir':'\u2A7A','gtdot':'\u22D7','gtlPar':'\u2995','gtquest':'\u2A7C','gtrapprox':'\u2A86','gtrarr':'\u2978','gtrdot':'\u22D7','gtreqless':'\u22DB','gtreqqless':'\u2A8C','gtrless':'\u2277','gtrsim':'\u2273','gvertneqq':'\u2269\uFE00','gvnE':'\u2269\uFE00','Hacek':'\u02C7','hairsp':'\u200A','half':'\xBD','hamilt':'\u210B','hardcy':'\u044A','HARDcy':'\u042A','harr':'\u2194','hArr':'\u21D4','harrcir':'\u2948','harrw':'\u21AD','Hat':'^','hbar':'\u210F','hcirc':'\u0125','Hcirc':'\u0124','hearts':'\u2665','heartsuit':'\u2665','hellip':'\u2026','hercon':'\u22B9','hfr':'\uD835\uDD25','Hfr':'\u210C','HilbertSpace':'\u210B','hksearow':'\u2925','hkswarow':'\u2926','hoarr':'\u21FF','homtht':'\u223B','hookleftarrow':'\u21A9','hookrightarrow':'\u21AA','hopf':'\uD835\uDD59','Hopf':'\u210D','horbar':'\u2015','HorizontalLine':'\u2500','hscr':'\uD835\uDCBD','Hscr':'\u210B','hslash':'\u210F','hstrok':'\u0127','Hstrok':'\u0126','HumpDownHump':'\u224E','HumpEqual':'\u224F','hybull':'\u2043','hyphen':'\u2010','iacute':'\xED','Iacute':'\xCD','ic':'\u2063','icirc':'\xEE','Icirc':'\xCE','icy':'\u0438','Icy':'\u0418','Idot':'\u0130','iecy':'\u0435','IEcy':'\u0415','iexcl':'\xA1','iff':'\u21D4','ifr':'\uD835\uDD26','Ifr':'\u2111','igrave':'\xEC','Igrave':'\xCC','ii':'\u2148','iiiint':'\u2A0C','iiint':'\u222D','iinfin':'\u29DC','iiota':'\u2129','ijlig':'\u0133','IJlig':'\u0132','Im':'\u2111','imacr':'\u012B','Imacr':'\u012A','image':'\u2111','ImaginaryI':'\u2148','imagline':'\u2110','imagpart':'\u2111','imath':'\u0131','imof':'\u22B7','imped':'\u01B5','Implies':'\u21D2','in':'\u2208','incare':'\u2105','infin':'\u221E','infintie':'\u29DD','inodot':'\u0131','int':'\u222B','Int':'\u222C','intcal':'\u22BA','integers':'\u2124','Integral':'\u222B','intercal':'\u22BA','Intersection':'\u22C2','intlarhk':'\u2A17','intprod':'\u2A3C','InvisibleComma':'\u2063','InvisibleTimes':'\u2062','iocy':'\u0451','IOcy':'\u0401','iogon':'\u012F','Iogon':'\u012E','iopf':'\uD835\uDD5A','Iopf':'\uD835\uDD40','iota':'\u03B9','Iota':'\u0399','iprod':'\u2A3C','iquest':'\xBF','iscr':'\uD835\uDCBE','Iscr':'\u2110','isin':'\u2208','isindot':'\u22F5','isinE':'\u22F9','isins':'\u22F4','isinsv':'\u22F3','isinv':'\u2208','it':'\u2062','itilde':'\u0129','Itilde':'\u0128','iukcy':'\u0456','Iukcy':'\u0406','iuml':'\xEF','Iuml':'\xCF','jcirc':'\u0135','Jcirc':'\u0134','jcy':'\u0439','Jcy':'\u0419','jfr':'\uD835\uDD27','Jfr':'\uD835\uDD0D','jmath':'\u0237','jopf':'\uD835\uDD5B','Jopf':'\uD835\uDD41','jscr':'\uD835\uDCBF','Jscr':'\uD835\uDCA5','jsercy':'\u0458','Jsercy':'\u0408','jukcy':'\u0454','Jukcy':'\u0404','kappa':'\u03BA','Kappa':'\u039A','kappav':'\u03F0','kcedil':'\u0137','Kcedil':'\u0136','kcy':'\u043A','Kcy':'\u041A','kfr':'\uD835\uDD28','Kfr':'\uD835\uDD0E','kgreen':'\u0138','khcy':'\u0445','KHcy':'\u0425','kjcy':'\u045C','KJcy':'\u040C','kopf':'\uD835\uDD5C','Kopf':'\uD835\uDD42','kscr':'\uD835\uDCC0','Kscr':'\uD835\uDCA6','lAarr':'\u21DA','lacute':'\u013A','Lacute':'\u0139','laemptyv':'\u29B4','lagran':'\u2112','lambda':'\u03BB','Lambda':'\u039B','lang':'\u27E8','Lang':'\u27EA','langd':'\u2991','langle':'\u27E8','lap':'\u2A85','Laplacetrf':'\u2112','laquo':'\xAB','larr':'\u2190','lArr':'\u21D0','Larr':'\u219E','larrb':'\u21E4','larrbfs':'\u291F','larrfs':'\u291D','larrhk':'\u21A9','larrlp':'\u21AB','larrpl':'\u2939','larrsim':'\u2973','larrtl':'\u21A2','lat':'\u2AAB','latail':'\u2919','lAtail':'\u291B','late':'\u2AAD','lates':'\u2AAD\uFE00','lbarr':'\u290C','lBarr':'\u290E','lbbrk':'\u2772','lbrace':'{','lbrack':'[','lbrke':'\u298B','lbrksld':'\u298F','lbrkslu':'\u298D','lcaron':'\u013E','Lcaron':'\u013D','lcedil':'\u013C','Lcedil':'\u013B','lceil':'\u2308','lcub':'{','lcy':'\u043B','Lcy':'\u041B','ldca':'\u2936','ldquo':'\u201C','ldquor':'\u201E','ldrdhar':'\u2967','ldrushar':'\u294B','ldsh':'\u21B2','le':'\u2264','lE':'\u2266','LeftAngleBracket':'\u27E8','leftarrow':'\u2190','Leftarrow':'\u21D0','LeftArrow':'\u2190','LeftArrowBar':'\u21E4','LeftArrowRightArrow':'\u21C6','leftarrowtail':'\u21A2','LeftCeiling':'\u2308','LeftDoubleBracket':'\u27E6','LeftDownTeeVector':'\u2961','LeftDownVector':'\u21C3','LeftDownVectorBar':'\u2959','LeftFloor':'\u230A','leftharpoondown':'\u21BD','leftharpoonup':'\u21BC','leftleftarrows':'\u21C7','leftrightarrow':'\u2194','Leftrightarrow':'\u21D4','LeftRightArrow':'\u2194','leftrightarrows':'\u21C6','leftrightharpoons':'\u21CB','leftrightsquigarrow':'\u21AD','LeftRightVector':'\u294E','LeftTee':'\u22A3','LeftTeeArrow':'\u21A4','LeftTeeVector':'\u295A','leftthreetimes':'\u22CB','LeftTriangle':'\u22B2','LeftTriangleBar':'\u29CF','LeftTriangleEqual':'\u22B4','LeftUpDownVector':'\u2951','LeftUpTeeVector':'\u2960','LeftUpVector':'\u21BF','LeftUpVectorBar':'\u2958','LeftVector':'\u21BC','LeftVectorBar':'\u2952','leg':'\u22DA','lEg':'\u2A8B','leq':'\u2264','leqq':'\u2266','leqslant':'\u2A7D','les':'\u2A7D','lescc':'\u2AA8','lesdot':'\u2A7F','lesdoto':'\u2A81','lesdotor':'\u2A83','lesg':'\u22DA\uFE00','lesges':'\u2A93','lessapprox':'\u2A85','lessdot':'\u22D6','lesseqgtr':'\u22DA','lesseqqgtr':'\u2A8B','LessEqualGreater':'\u22DA','LessFullEqual':'\u2266','LessGreater':'\u2276','lessgtr':'\u2276','LessLess':'\u2AA1','lesssim':'\u2272','LessSlantEqual':'\u2A7D','LessTilde':'\u2272','lfisht':'\u297C','lfloor':'\u230A','lfr':'\uD835\uDD29','Lfr':'\uD835\uDD0F','lg':'\u2276','lgE':'\u2A91','lHar':'\u2962','lhard':'\u21BD','lharu':'\u21BC','lharul':'\u296A','lhblk':'\u2584','ljcy':'\u0459','LJcy':'\u0409','ll':'\u226A','Ll':'\u22D8','llarr':'\u21C7','llcorner':'\u231E','Lleftarrow':'\u21DA','llhard':'\u296B','lltri':'\u25FA','lmidot':'\u0140','Lmidot':'\u013F','lmoust':'\u23B0','lmoustache':'\u23B0','lnap':'\u2A89','lnapprox':'\u2A89','lne':'\u2A87','lnE':'\u2268','lneq':'\u2A87','lneqq':'\u2268','lnsim':'\u22E6','loang':'\u27EC','loarr':'\u21FD','lobrk':'\u27E6','longleftarrow':'\u27F5','Longleftarrow':'\u27F8','LongLeftArrow':'\u27F5','longleftrightarrow':'\u27F7','Longleftrightarrow':'\u27FA','LongLeftRightArrow':'\u27F7','longmapsto':'\u27FC','longrightarrow':'\u27F6','Longrightarrow':'\u27F9','LongRightArrow':'\u27F6','looparrowleft':'\u21AB','looparrowright':'\u21AC','lopar':'\u2985','lopf':'\uD835\uDD5D','Lopf':'\uD835\uDD43','loplus':'\u2A2D','lotimes':'\u2A34','lowast':'\u2217','lowbar':'_','LowerLeftArrow':'\u2199','LowerRightArrow':'\u2198','loz':'\u25CA','lozenge':'\u25CA','lozf':'\u29EB','lpar':'(','lparlt':'\u2993','lrarr':'\u21C6','lrcorner':'\u231F','lrhar':'\u21CB','lrhard':'\u296D','lrm':'\u200E','lrtri':'\u22BF','lsaquo':'\u2039','lscr':'\uD835\uDCC1','Lscr':'\u2112','lsh':'\u21B0','Lsh':'\u21B0','lsim':'\u2272','lsime':'\u2A8D','lsimg':'\u2A8F','lsqb':'[','lsquo':'\u2018','lsquor':'\u201A','lstrok':'\u0142','Lstrok':'\u0141','lt':'<','Lt':'\u226A','LT':'<','ltcc':'\u2AA6','ltcir':'\u2A79','ltdot':'\u22D6','lthree':'\u22CB','ltimes':'\u22C9','ltlarr':'\u2976','ltquest':'\u2A7B','ltri':'\u25C3','ltrie':'\u22B4','ltrif':'\u25C2','ltrPar':'\u2996','lurdshar':'\u294A','luruhar':'\u2966','lvertneqq':'\u2268\uFE00','lvnE':'\u2268\uFE00','macr':'\xAF','male':'\u2642','malt':'\u2720','maltese':'\u2720','map':'\u21A6','Map':'\u2905','mapsto':'\u21A6','mapstodown':'\u21A7','mapstoleft':'\u21A4','mapstoup':'\u21A5','marker':'\u25AE','mcomma':'\u2A29','mcy':'\u043C','Mcy':'\u041C','mdash':'\u2014','mDDot':'\u223A','measuredangle':'\u2221','MediumSpace':'\u205F','Mellintrf':'\u2133','mfr':'\uD835\uDD2A','Mfr':'\uD835\uDD10','mho':'\u2127','micro':'\xB5','mid':'\u2223','midast':'*','midcir':'\u2AF0','middot':'\xB7','minus':'\u2212','minusb':'\u229F','minusd':'\u2238','minusdu':'\u2A2A','MinusPlus':'\u2213','mlcp':'\u2ADB','mldr':'\u2026','mnplus':'\u2213','models':'\u22A7','mopf':'\uD835\uDD5E','Mopf':'\uD835\uDD44','mp':'\u2213','mscr':'\uD835\uDCC2','Mscr':'\u2133','mstpos':'\u223E','mu':'\u03BC','Mu':'\u039C','multimap':'\u22B8','mumap':'\u22B8','nabla':'\u2207','nacute':'\u0144','Nacute':'\u0143','nang':'\u2220\u20D2','nap':'\u2249','napE':'\u2A70\u0338','napid':'\u224B\u0338','napos':'\u0149','napprox':'\u2249','natur':'\u266E','natural':'\u266E','naturals':'\u2115','nbsp':'\xA0','nbump':'\u224E\u0338','nbumpe':'\u224F\u0338','ncap':'\u2A43','ncaron':'\u0148','Ncaron':'\u0147','ncedil':'\u0146','Ncedil':'\u0145','ncong':'\u2247','ncongdot':'\u2A6D\u0338','ncup':'\u2A42','ncy':'\u043D','Ncy':'\u041D','ndash':'\u2013','ne':'\u2260','nearhk':'\u2924','nearr':'\u2197','neArr':'\u21D7','nearrow':'\u2197','nedot':'\u2250\u0338','NegativeMediumSpace':'\u200B','NegativeThickSpace':'\u200B','NegativeThinSpace':'\u200B','NegativeVeryThinSpace':'\u200B','nequiv':'\u2262','nesear':'\u2928','nesim':'\u2242\u0338','NestedGreaterGreater':'\u226B','NestedLessLess':'\u226A','NewLine':'\n','nexist':'\u2204','nexists':'\u2204','nfr':'\uD835\uDD2B','Nfr':'\uD835\uDD11','nge':'\u2271','ngE':'\u2267\u0338','ngeq':'\u2271','ngeqq':'\u2267\u0338','ngeqslant':'\u2A7E\u0338','nges':'\u2A7E\u0338','nGg':'\u22D9\u0338','ngsim':'\u2275','ngt':'\u226F','nGt':'\u226B\u20D2','ngtr':'\u226F','nGtv':'\u226B\u0338','nharr':'\u21AE','nhArr':'\u21CE','nhpar':'\u2AF2','ni':'\u220B','nis':'\u22FC','nisd':'\u22FA','niv':'\u220B','njcy':'\u045A','NJcy':'\u040A','nlarr':'\u219A','nlArr':'\u21CD','nldr':'\u2025','nle':'\u2270','nlE':'\u2266\u0338','nleftarrow':'\u219A','nLeftarrow':'\u21CD','nleftrightarrow':'\u21AE','nLeftrightarrow':'\u21CE','nleq':'\u2270','nleqq':'\u2266\u0338','nleqslant':'\u2A7D\u0338','nles':'\u2A7D\u0338','nless':'\u226E','nLl':'\u22D8\u0338','nlsim':'\u2274','nlt':'\u226E','nLt':'\u226A\u20D2','nltri':'\u22EA','nltrie':'\u22EC','nLtv':'\u226A\u0338','nmid':'\u2224','NoBreak':'\u2060','NonBreakingSpace':'\xA0','nopf':'\uD835\uDD5F','Nopf':'\u2115','not':'\xAC','Not':'\u2AEC','NotCongruent':'\u2262','NotCupCap':'\u226D','NotDoubleVerticalBar':'\u2226','NotElement':'\u2209','NotEqual':'\u2260','NotEqualTilde':'\u2242\u0338','NotExists':'\u2204','NotGreater':'\u226F','NotGreaterEqual':'\u2271','NotGreaterFullEqual':'\u2267\u0338','NotGreaterGreater':'\u226B\u0338','NotGreaterLess':'\u2279','NotGreaterSlantEqual':'\u2A7E\u0338','NotGreaterTilde':'\u2275','NotHumpDownHump':'\u224E\u0338','NotHumpEqual':'\u224F\u0338','notin':'\u2209','notindot':'\u22F5\u0338','notinE':'\u22F9\u0338','notinva':'\u2209','notinvb':'\u22F7','notinvc':'\u22F6','NotLeftTriangle':'\u22EA','NotLeftTriangleBar':'\u29CF\u0338','NotLeftTriangleEqual':'\u22EC','NotLess':'\u226E','NotLessEqual':'\u2270','NotLessGreater':'\u2278','NotLessLess':'\u226A\u0338','NotLessSlantEqual':'\u2A7D\u0338','NotLessTilde':'\u2274','NotNestedGreaterGreater':'\u2AA2\u0338','NotNestedLessLess':'\u2AA1\u0338','notni':'\u220C','notniva':'\u220C','notnivb':'\u22FE','notnivc':'\u22FD','NotPrecedes':'\u2280','NotPrecedesEqual':'\u2AAF\u0338','NotPrecedesSlantEqual':'\u22E0','NotReverseElement':'\u220C','NotRightTriangle':'\u22EB','NotRightTriangleBar':'\u29D0\u0338','NotRightTriangleEqual':'\u22ED','NotSquareSubset':'\u228F\u0338','NotSquareSubsetEqual':'\u22E2','NotSquareSuperset':'\u2290\u0338','NotSquareSupersetEqual':'\u22E3','NotSubset':'\u2282\u20D2','NotSubsetEqual':'\u2288','NotSucceeds':'\u2281','NotSucceedsEqual':'\u2AB0\u0338','NotSucceedsSlantEqual':'\u22E1','NotSucceedsTilde':'\u227F\u0338','NotSuperset':'\u2283\u20D2','NotSupersetEqual':'\u2289','NotTilde':'\u2241','NotTildeEqual':'\u2244','NotTildeFullEqual':'\u2247','NotTildeTilde':'\u2249','NotVerticalBar':'\u2224','npar':'\u2226','nparallel':'\u2226','nparsl':'\u2AFD\u20E5','npart':'\u2202\u0338','npolint':'\u2A14','npr':'\u2280','nprcue':'\u22E0','npre':'\u2AAF\u0338','nprec':'\u2280','npreceq':'\u2AAF\u0338','nrarr':'\u219B','nrArr':'\u21CF','nrarrc':'\u2933\u0338','nrarrw':'\u219D\u0338','nrightarrow':'\u219B','nRightarrow':'\u21CF','nrtri':'\u22EB','nrtrie':'\u22ED','nsc':'\u2281','nsccue':'\u22E1','nsce':'\u2AB0\u0338','nscr':'\uD835\uDCC3','Nscr':'\uD835\uDCA9','nshortmid':'\u2224','nshortparallel':'\u2226','nsim':'\u2241','nsime':'\u2244','nsimeq':'\u2244','nsmid':'\u2224','nspar':'\u2226','nsqsube':'\u22E2','nsqsupe':'\u22E3','nsub':'\u2284','nsube':'\u2288','nsubE':'\u2AC5\u0338','nsubset':'\u2282\u20D2','nsubseteq':'\u2288','nsubseteqq':'\u2AC5\u0338','nsucc':'\u2281','nsucceq':'\u2AB0\u0338','nsup':'\u2285','nsupe':'\u2289','nsupE':'\u2AC6\u0338','nsupset':'\u2283\u20D2','nsupseteq':'\u2289','nsupseteqq':'\u2AC6\u0338','ntgl':'\u2279','ntilde':'\xF1','Ntilde':'\xD1','ntlg':'\u2278','ntriangleleft':'\u22EA','ntrianglelefteq':'\u22EC','ntriangleright':'\u22EB','ntrianglerighteq':'\u22ED','nu':'\u03BD','Nu':'\u039D','num':'#','numero':'\u2116','numsp':'\u2007','nvap':'\u224D\u20D2','nvdash':'\u22AC','nvDash':'\u22AD','nVdash':'\u22AE','nVDash':'\u22AF','nvge':'\u2265\u20D2','nvgt':'>\u20D2','nvHarr':'\u2904','nvinfin':'\u29DE','nvlArr':'\u2902','nvle':'\u2264\u20D2','nvlt':'<\u20D2','nvltrie':'\u22B4\u20D2','nvrArr':'\u2903','nvrtrie':'\u22B5\u20D2','nvsim':'\u223C\u20D2','nwarhk':'\u2923','nwarr':'\u2196','nwArr':'\u21D6','nwarrow':'\u2196','nwnear':'\u2927','oacute':'\xF3','Oacute':'\xD3','oast':'\u229B','ocir':'\u229A','ocirc':'\xF4','Ocirc':'\xD4','ocy':'\u043E','Ocy':'\u041E','odash':'\u229D','odblac':'\u0151','Odblac':'\u0150','odiv':'\u2A38','odot':'\u2299','odsold':'\u29BC','oelig':'\u0153','OElig':'\u0152','ofcir':'\u29BF','ofr':'\uD835\uDD2C','Ofr':'\uD835\uDD12','ogon':'\u02DB','ograve':'\xF2','Ograve':'\xD2','ogt':'\u29C1','ohbar':'\u29B5','ohm':'\u03A9','oint':'\u222E','olarr':'\u21BA','olcir':'\u29BE','olcross':'\u29BB','oline':'\u203E','olt':'\u29C0','omacr':'\u014D','Omacr':'\u014C','omega':'\u03C9','Omega':'\u03A9','omicron':'\u03BF','Omicron':'\u039F','omid':'\u29B6','ominus':'\u2296','oopf':'\uD835\uDD60','Oopf':'\uD835\uDD46','opar':'\u29B7','OpenCurlyDoubleQuote':'\u201C','OpenCurlyQuote':'\u2018','operp':'\u29B9','oplus':'\u2295','or':'\u2228','Or':'\u2A54','orarr':'\u21BB','ord':'\u2A5D','order':'\u2134','orderof':'\u2134','ordf':'\xAA','ordm':'\xBA','origof':'\u22B6','oror':'\u2A56','orslope':'\u2A57','orv':'\u2A5B','oS':'\u24C8','oscr':'\u2134','Oscr':'\uD835\uDCAA','oslash':'\xF8','Oslash':'\xD8','osol':'\u2298','otilde':'\xF5','Otilde':'\xD5','otimes':'\u2297','Otimes':'\u2A37','otimesas':'\u2A36','ouml':'\xF6','Ouml':'\xD6','ovbar':'\u233D','OverBar':'\u203E','OverBrace':'\u23DE','OverBracket':'\u23B4','OverParenthesis':'\u23DC','par':'\u2225','para':'\xB6','parallel':'\u2225','parsim':'\u2AF3','parsl':'\u2AFD','part':'\u2202','PartialD':'\u2202','pcy':'\u043F','Pcy':'\u041F','percnt':'%','period':'.','permil':'\u2030','perp':'\u22A5','pertenk':'\u2031','pfr':'\uD835\uDD2D','Pfr':'\uD835\uDD13','phi':'\u03C6','Phi':'\u03A6','phiv':'\u03D5','phmmat':'\u2133','phone':'\u260E','pi':'\u03C0','Pi':'\u03A0','pitchfork':'\u22D4','piv':'\u03D6','planck':'\u210F','planckh':'\u210E','plankv':'\u210F','plus':'+','plusacir':'\u2A23','plusb':'\u229E','pluscir':'\u2A22','plusdo':'\u2214','plusdu':'\u2A25','pluse':'\u2A72','PlusMinus':'\xB1','plusmn':'\xB1','plussim':'\u2A26','plustwo':'\u2A27','pm':'\xB1','Poincareplane':'\u210C','pointint':'\u2A15','popf':'\uD835\uDD61','Popf':'\u2119','pound':'\xA3','pr':'\u227A','Pr':'\u2ABB','prap':'\u2AB7','prcue':'\u227C','pre':'\u2AAF','prE':'\u2AB3','prec':'\u227A','precapprox':'\u2AB7','preccurlyeq':'\u227C','Precedes':'\u227A','PrecedesEqual':'\u2AAF','PrecedesSlantEqual':'\u227C','PrecedesTilde':'\u227E','preceq':'\u2AAF','precnapprox':'\u2AB9','precneqq':'\u2AB5','precnsim':'\u22E8','precsim':'\u227E','prime':'\u2032','Prime':'\u2033','primes':'\u2119','prnap':'\u2AB9','prnE':'\u2AB5','prnsim':'\u22E8','prod':'\u220F','Product':'\u220F','profalar':'\u232E','profline':'\u2312','profsurf':'\u2313','prop':'\u221D','Proportion':'\u2237','Proportional':'\u221D','propto':'\u221D','prsim':'\u227E','prurel':'\u22B0','pscr':'\uD835\uDCC5','Pscr':'\uD835\uDCAB','psi':'\u03C8','Psi':'\u03A8','puncsp':'\u2008','qfr':'\uD835\uDD2E','Qfr':'\uD835\uDD14','qint':'\u2A0C','qopf':'\uD835\uDD62','Qopf':'\u211A','qprime':'\u2057','qscr':'\uD835\uDCC6','Qscr':'\uD835\uDCAC','quaternions':'\u210D','quatint':'\u2A16','quest':'?','questeq':'\u225F','quot':'"','QUOT':'"','rAarr':'\u21DB','race':'\u223D\u0331','racute':'\u0155','Racute':'\u0154','radic':'\u221A','raemptyv':'\u29B3','rang':'\u27E9','Rang':'\u27EB','rangd':'\u2992','range':'\u29A5','rangle':'\u27E9','raquo':'\xBB','rarr':'\u2192','rArr':'\u21D2','Rarr':'\u21A0','rarrap':'\u2975','rarrb':'\u21E5','rarrbfs':'\u2920','rarrc':'\u2933','rarrfs':'\u291E','rarrhk':'\u21AA','rarrlp':'\u21AC','rarrpl':'\u2945','rarrsim':'\u2974','rarrtl':'\u21A3','Rarrtl':'\u2916','rarrw':'\u219D','ratail':'\u291A','rAtail':'\u291C','ratio':'\u2236','rationals':'\u211A','rbarr':'\u290D','rBarr':'\u290F','RBarr':'\u2910','rbbrk':'\u2773','rbrace':'}','rbrack':']','rbrke':'\u298C','rbrksld':'\u298E','rbrkslu':'\u2990','rcaron':'\u0159','Rcaron':'\u0158','rcedil':'\u0157','Rcedil':'\u0156','rceil':'\u2309','rcub':'}','rcy':'\u0440','Rcy':'\u0420','rdca':'\u2937','rdldhar':'\u2969','rdquo':'\u201D','rdquor':'\u201D','rdsh':'\u21B3','Re':'\u211C','real':'\u211C','realine':'\u211B','realpart':'\u211C','reals':'\u211D','rect':'\u25AD','reg':'\xAE','REG':'\xAE','ReverseElement':'\u220B','ReverseEquilibrium':'\u21CB','ReverseUpEquilibrium':'\u296F','rfisht':'\u297D','rfloor':'\u230B','rfr':'\uD835\uDD2F','Rfr':'\u211C','rHar':'\u2964','rhard':'\u21C1','rharu':'\u21C0','rharul':'\u296C','rho':'\u03C1','Rho':'\u03A1','rhov':'\u03F1','RightAngleBracket':'\u27E9','rightarrow':'\u2192','Rightarrow':'\u21D2','RightArrow':'\u2192','RightArrowBar':'\u21E5','RightArrowLeftArrow':'\u21C4','rightarrowtail':'\u21A3','RightCeiling':'\u2309','RightDoubleBracket':'\u27E7','RightDownTeeVector':'\u295D','RightDownVector':'\u21C2','RightDownVectorBar':'\u2955','RightFloor':'\u230B','rightharpoondown':'\u21C1','rightharpoonup':'\u21C0','rightleftarrows':'\u21C4','rightleftharpoons':'\u21CC','rightrightarrows':'\u21C9','rightsquigarrow':'\u219D','RightTee':'\u22A2','RightTeeArrow':'\u21A6','RightTeeVector':'\u295B','rightthreetimes':'\u22CC','RightTriangle':'\u22B3','RightTriangleBar':'\u29D0','RightTriangleEqual':'\u22B5','RightUpDownVector':'\u294F','RightUpTeeVector':'\u295C','RightUpVector':'\u21BE','RightUpVectorBar':'\u2954','RightVector':'\u21C0','RightVectorBar':'\u2953','ring':'\u02DA','risingdotseq':'\u2253','rlarr':'\u21C4','rlhar':'\u21CC','rlm':'\u200F','rmoust':'\u23B1','rmoustache':'\u23B1','rnmid':'\u2AEE','roang':'\u27ED','roarr':'\u21FE','robrk':'\u27E7','ropar':'\u2986','ropf':'\uD835\uDD63','Ropf':'\u211D','roplus':'\u2A2E','rotimes':'\u2A35','RoundImplies':'\u2970','rpar':')','rpargt':'\u2994','rppolint':'\u2A12','rrarr':'\u21C9','Rrightarrow':'\u21DB','rsaquo':'\u203A','rscr':'\uD835\uDCC7','Rscr':'\u211B','rsh':'\u21B1','Rsh':'\u21B1','rsqb':']','rsquo':'\u2019','rsquor':'\u2019','rthree':'\u22CC','rtimes':'\u22CA','rtri':'\u25B9','rtrie':'\u22B5','rtrif':'\u25B8','rtriltri':'\u29CE','RuleDelayed':'\u29F4','ruluhar':'\u2968','rx':'\u211E','sacute':'\u015B','Sacute':'\u015A','sbquo':'\u201A','sc':'\u227B','Sc':'\u2ABC','scap':'\u2AB8','scaron':'\u0161','Scaron':'\u0160','sccue':'\u227D','sce':'\u2AB0','scE':'\u2AB4','scedil':'\u015F','Scedil':'\u015E','scirc':'\u015D','Scirc':'\u015C','scnap':'\u2ABA','scnE':'\u2AB6','scnsim':'\u22E9','scpolint':'\u2A13','scsim':'\u227F','scy':'\u0441','Scy':'\u0421','sdot':'\u22C5','sdotb':'\u22A1','sdote':'\u2A66','searhk':'\u2925','searr':'\u2198','seArr':'\u21D8','searrow':'\u2198','sect':'\xA7','semi':';','seswar':'\u2929','setminus':'\u2216','setmn':'\u2216','sext':'\u2736','sfr':'\uD835\uDD30','Sfr':'\uD835\uDD16','sfrown':'\u2322','sharp':'\u266F','shchcy':'\u0449','SHCHcy':'\u0429','shcy':'\u0448','SHcy':'\u0428','ShortDownArrow':'\u2193','ShortLeftArrow':'\u2190','shortmid':'\u2223','shortparallel':'\u2225','ShortRightArrow':'\u2192','ShortUpArrow':'\u2191','shy':'\xAD','sigma':'\u03C3','Sigma':'\u03A3','sigmaf':'\u03C2','sigmav':'\u03C2','sim':'\u223C','simdot':'\u2A6A','sime':'\u2243','simeq':'\u2243','simg':'\u2A9E','simgE':'\u2AA0','siml':'\u2A9D','simlE':'\u2A9F','simne':'\u2246','simplus':'\u2A24','simrarr':'\u2972','slarr':'\u2190','SmallCircle':'\u2218','smallsetminus':'\u2216','smashp':'\u2A33','smeparsl':'\u29E4','smid':'\u2223','smile':'\u2323','smt':'\u2AAA','smte':'\u2AAC','smtes':'\u2AAC\uFE00','softcy':'\u044C','SOFTcy':'\u042C','sol':'/','solb':'\u29C4','solbar':'\u233F','sopf':'\uD835\uDD64','Sopf':'\uD835\uDD4A','spades':'\u2660','spadesuit':'\u2660','spar':'\u2225','sqcap':'\u2293','sqcaps':'\u2293\uFE00','sqcup':'\u2294','sqcups':'\u2294\uFE00','Sqrt':'\u221A','sqsub':'\u228F','sqsube':'\u2291','sqsubset':'\u228F','sqsubseteq':'\u2291','sqsup':'\u2290','sqsupe':'\u2292','sqsupset':'\u2290','sqsupseteq':'\u2292','squ':'\u25A1','square':'\u25A1','Square':'\u25A1','SquareIntersection':'\u2293','SquareSubset':'\u228F','SquareSubsetEqual':'\u2291','SquareSuperset':'\u2290','SquareSupersetEqual':'\u2292','SquareUnion':'\u2294','squarf':'\u25AA','squf':'\u25AA','srarr':'\u2192','sscr':'\uD835\uDCC8','Sscr':'\uD835\uDCAE','ssetmn':'\u2216','ssmile':'\u2323','sstarf':'\u22C6','star':'\u2606','Star':'\u22C6','starf':'\u2605','straightepsilon':'\u03F5','straightphi':'\u03D5','strns':'\xAF','sub':'\u2282','Sub':'\u22D0','subdot':'\u2ABD','sube':'\u2286','subE':'\u2AC5','subedot':'\u2AC3','submult':'\u2AC1','subne':'\u228A','subnE':'\u2ACB','subplus':'\u2ABF','subrarr':'\u2979','subset':'\u2282','Subset':'\u22D0','subseteq':'\u2286','subseteqq':'\u2AC5','SubsetEqual':'\u2286','subsetneq':'\u228A','subsetneqq':'\u2ACB','subsim':'\u2AC7','subsub':'\u2AD5','subsup':'\u2AD3','succ':'\u227B','succapprox':'\u2AB8','succcurlyeq':'\u227D','Succeeds':'\u227B','SucceedsEqual':'\u2AB0','SucceedsSlantEqual':'\u227D','SucceedsTilde':'\u227F','succeq':'\u2AB0','succnapprox':'\u2ABA','succneqq':'\u2AB6','succnsim':'\u22E9','succsim':'\u227F','SuchThat':'\u220B','sum':'\u2211','Sum':'\u2211','sung':'\u266A','sup':'\u2283','Sup':'\u22D1','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','supdot':'\u2ABE','supdsub':'\u2AD8','supe':'\u2287','supE':'\u2AC6','supedot':'\u2AC4','Superset':'\u2283','SupersetEqual':'\u2287','suphsol':'\u27C9','suphsub':'\u2AD7','suplarr':'\u297B','supmult':'\u2AC2','supne':'\u228B','supnE':'\u2ACC','supplus':'\u2AC0','supset':'\u2283','Supset':'\u22D1','supseteq':'\u2287','supseteqq':'\u2AC6','supsetneq':'\u228B','supsetneqq':'\u2ACC','supsim':'\u2AC8','supsub':'\u2AD4','supsup':'\u2AD6','swarhk':'\u2926','swarr':'\u2199','swArr':'\u21D9','swarrow':'\u2199','swnwar':'\u292A','szlig':'\xDF','Tab':'\t','target':'\u2316','tau':'\u03C4','Tau':'\u03A4','tbrk':'\u23B4','tcaron':'\u0165','Tcaron':'\u0164','tcedil':'\u0163','Tcedil':'\u0162','tcy':'\u0442','Tcy':'\u0422','tdot':'\u20DB','telrec':'\u2315','tfr':'\uD835\uDD31','Tfr':'\uD835\uDD17','there4':'\u2234','therefore':'\u2234','Therefore':'\u2234','theta':'\u03B8','Theta':'\u0398','thetasym':'\u03D1','thetav':'\u03D1','thickapprox':'\u2248','thicksim':'\u223C','ThickSpace':'\u205F\u200A','thinsp':'\u2009','ThinSpace':'\u2009','thkap':'\u2248','thksim':'\u223C','thorn':'\xFE','THORN':'\xDE','tilde':'\u02DC','Tilde':'\u223C','TildeEqual':'\u2243','TildeFullEqual':'\u2245','TildeTilde':'\u2248','times':'\xD7','timesb':'\u22A0','timesbar':'\u2A31','timesd':'\u2A30','tint':'\u222D','toea':'\u2928','top':'\u22A4','topbot':'\u2336','topcir':'\u2AF1','topf':'\uD835\uDD65','Topf':'\uD835\uDD4B','topfork':'\u2ADA','tosa':'\u2929','tprime':'\u2034','trade':'\u2122','TRADE':'\u2122','triangle':'\u25B5','triangledown':'\u25BF','triangleleft':'\u25C3','trianglelefteq':'\u22B4','triangleq':'\u225C','triangleright':'\u25B9','trianglerighteq':'\u22B5','tridot':'\u25EC','trie':'\u225C','triminus':'\u2A3A','TripleDot':'\u20DB','triplus':'\u2A39','trisb':'\u29CD','tritime':'\u2A3B','trpezium':'\u23E2','tscr':'\uD835\uDCC9','Tscr':'\uD835\uDCAF','tscy':'\u0446','TScy':'\u0426','tshcy':'\u045B','TSHcy':'\u040B','tstrok':'\u0167','Tstrok':'\u0166','twixt':'\u226C','twoheadleftarrow':'\u219E','twoheadrightarrow':'\u21A0','uacute':'\xFA','Uacute':'\xDA','uarr':'\u2191','uArr':'\u21D1','Uarr':'\u219F','Uarrocir':'\u2949','ubrcy':'\u045E','Ubrcy':'\u040E','ubreve':'\u016D','Ubreve':'\u016C','ucirc':'\xFB','Ucirc':'\xDB','ucy':'\u0443','Ucy':'\u0423','udarr':'\u21C5','udblac':'\u0171','Udblac':'\u0170','udhar':'\u296E','ufisht':'\u297E','ufr':'\uD835\uDD32','Ufr':'\uD835\uDD18','ugrave':'\xF9','Ugrave':'\xD9','uHar':'\u2963','uharl':'\u21BF','uharr':'\u21BE','uhblk':'\u2580','ulcorn':'\u231C','ulcorner':'\u231C','ulcrop':'\u230F','ultri':'\u25F8','umacr':'\u016B','Umacr':'\u016A','uml':'\xA8','UnderBar':'_','UnderBrace':'\u23DF','UnderBracket':'\u23B5','UnderParenthesis':'\u23DD','Union':'\u22C3','UnionPlus':'\u228E','uogon':'\u0173','Uogon':'\u0172','uopf':'\uD835\uDD66','Uopf':'\uD835\uDD4C','uparrow':'\u2191','Uparrow':'\u21D1','UpArrow':'\u2191','UpArrowBar':'\u2912','UpArrowDownArrow':'\u21C5','updownarrow':'\u2195','Updownarrow':'\u21D5','UpDownArrow':'\u2195','UpEquilibrium':'\u296E','upharpoonleft':'\u21BF','upharpoonright':'\u21BE','uplus':'\u228E','UpperLeftArrow':'\u2196','UpperRightArrow':'\u2197','upsi':'\u03C5','Upsi':'\u03D2','upsih':'\u03D2','upsilon':'\u03C5','Upsilon':'\u03A5','UpTee':'\u22A5','UpTeeArrow':'\u21A5','upuparrows':'\u21C8','urcorn':'\u231D','urcorner':'\u231D','urcrop':'\u230E','uring':'\u016F','Uring':'\u016E','urtri':'\u25F9','uscr':'\uD835\uDCCA','Uscr':'\uD835\uDCB0','utdot':'\u22F0','utilde':'\u0169','Utilde':'\u0168','utri':'\u25B5','utrif':'\u25B4','uuarr':'\u21C8','uuml':'\xFC','Uuml':'\xDC','uwangle':'\u29A7','vangrt':'\u299C','varepsilon':'\u03F5','varkappa':'\u03F0','varnothing':'\u2205','varphi':'\u03D5','varpi':'\u03D6','varpropto':'\u221D','varr':'\u2195','vArr':'\u21D5','varrho':'\u03F1','varsigma':'\u03C2','varsubsetneq':'\u228A\uFE00','varsubsetneqq':'\u2ACB\uFE00','varsupsetneq':'\u228B\uFE00','varsupsetneqq':'\u2ACC\uFE00','vartheta':'\u03D1','vartriangleleft':'\u22B2','vartriangleright':'\u22B3','vBar':'\u2AE8','Vbar':'\u2AEB','vBarv':'\u2AE9','vcy':'\u0432','Vcy':'\u0412','vdash':'\u22A2','vDash':'\u22A8','Vdash':'\u22A9','VDash':'\u22AB','Vdashl':'\u2AE6','vee':'\u2228','Vee':'\u22C1','veebar':'\u22BB','veeeq':'\u225A','vellip':'\u22EE','verbar':'|','Verbar':'\u2016','vert':'|','Vert':'\u2016','VerticalBar':'\u2223','VerticalLine':'|','VerticalSeparator':'\u2758','VerticalTilde':'\u2240','VeryThinSpace':'\u200A','vfr':'\uD835\uDD33','Vfr':'\uD835\uDD19','vltri':'\u22B2','vnsub':'\u2282\u20D2','vnsup':'\u2283\u20D2','vopf':'\uD835\uDD67','Vopf':'\uD835\uDD4D','vprop':'\u221D','vrtri':'\u22B3','vscr':'\uD835\uDCCB','Vscr':'\uD835\uDCB1','vsubne':'\u228A\uFE00','vsubnE':'\u2ACB\uFE00','vsupne':'\u228B\uFE00','vsupnE':'\u2ACC\uFE00','Vvdash':'\u22AA','vzigzag':'\u299A','wcirc':'\u0175','Wcirc':'\u0174','wedbar':'\u2A5F','wedge':'\u2227','Wedge':'\u22C0','wedgeq':'\u2259','weierp':'\u2118','wfr':'\uD835\uDD34','Wfr':'\uD835\uDD1A','wopf':'\uD835\uDD68','Wopf':'\uD835\uDD4E','wp':'\u2118','wr':'\u2240','wreath':'\u2240','wscr':'\uD835\uDCCC','Wscr':'\uD835\uDCB2','xcap':'\u22C2','xcirc':'\u25EF','xcup':'\u22C3','xdtri':'\u25BD','xfr':'\uD835\uDD35','Xfr':'\uD835\uDD1B','xharr':'\u27F7','xhArr':'\u27FA','xi':'\u03BE','Xi':'\u039E','xlarr':'\u27F5','xlArr':'\u27F8','xmap':'\u27FC','xnis':'\u22FB','xodot':'\u2A00','xopf':'\uD835\uDD69','Xopf':'\uD835\uDD4F','xoplus':'\u2A01','xotime':'\u2A02','xrarr':'\u27F6','xrArr':'\u27F9','xscr':'\uD835\uDCCD','Xscr':'\uD835\uDCB3','xsqcup':'\u2A06','xuplus':'\u2A04','xutri':'\u25B3','xvee':'\u22C1','xwedge':'\u22C0','yacute':'\xFD','Yacute':'\xDD','yacy':'\u044F','YAcy':'\u042F','ycirc':'\u0177','Ycirc':'\u0176','ycy':'\u044B','Ycy':'\u042B','yen':'\xA5','yfr':'\uD835\uDD36','Yfr':'\uD835\uDD1C','yicy':'\u0457','YIcy':'\u0407','yopf':'\uD835\uDD6A','Yopf':'\uD835\uDD50','yscr':'\uD835\uDCCE','Yscr':'\uD835\uDCB4','yucy':'\u044E','YUcy':'\u042E','yuml':'\xFF','Yuml':'\u0178','zacute':'\u017A','Zacute':'\u0179','zcaron':'\u017E','Zcaron':'\u017D','zcy':'\u0437','Zcy':'\u0417','zdot':'\u017C','Zdot':'\u017B','zeetrf':'\u2128','ZeroWidthSpace':'\u200B','zeta':'\u03B6','Zeta':'\u0396','zfr':'\uD835\uDD37','Zfr':'\u2128','zhcy':'\u0436','ZHcy':'\u0416','zigrarr':'\u21DD','zopf':'\uD835\uDD6B','Zopf':'\u2124','zscr':'\uD835\uDCCF','Zscr':'\uD835\uDCB5','zwj':'\u200D','zwnj':'\u200C'}; - var decodeMapLegacy = {'aacute':'\xE1','Aacute':'\xC1','acirc':'\xE2','Acirc':'\xC2','acute':'\xB4','aelig':'\xE6','AElig':'\xC6','agrave':'\xE0','Agrave':'\xC0','amp':'&','AMP':'&','aring':'\xE5','Aring':'\xC5','atilde':'\xE3','Atilde':'\xC3','auml':'\xE4','Auml':'\xC4','brvbar':'\xA6','ccedil':'\xE7','Ccedil':'\xC7','cedil':'\xB8','cent':'\xA2','copy':'\xA9','COPY':'\xA9','curren':'\xA4','deg':'\xB0','divide':'\xF7','eacute':'\xE9','Eacute':'\xC9','ecirc':'\xEA','Ecirc':'\xCA','egrave':'\xE8','Egrave':'\xC8','eth':'\xF0','ETH':'\xD0','euml':'\xEB','Euml':'\xCB','frac12':'\xBD','frac14':'\xBC','frac34':'\xBE','gt':'>','GT':'>','iacute':'\xED','Iacute':'\xCD','icirc':'\xEE','Icirc':'\xCE','iexcl':'\xA1','igrave':'\xEC','Igrave':'\xCC','iquest':'\xBF','iuml':'\xEF','Iuml':'\xCF','laquo':'\xAB','lt':'<','LT':'<','macr':'\xAF','micro':'\xB5','middot':'\xB7','nbsp':'\xA0','not':'\xAC','ntilde':'\xF1','Ntilde':'\xD1','oacute':'\xF3','Oacute':'\xD3','ocirc':'\xF4','Ocirc':'\xD4','ograve':'\xF2','Ograve':'\xD2','ordf':'\xAA','ordm':'\xBA','oslash':'\xF8','Oslash':'\xD8','otilde':'\xF5','Otilde':'\xD5','ouml':'\xF6','Ouml':'\xD6','para':'\xB6','plusmn':'\xB1','pound':'\xA3','quot':'"','QUOT':'"','raquo':'\xBB','reg':'\xAE','REG':'\xAE','sect':'\xA7','shy':'\xAD','sup1':'\xB9','sup2':'\xB2','sup3':'\xB3','szlig':'\xDF','thorn':'\xFE','THORN':'\xDE','times':'\xD7','uacute':'\xFA','Uacute':'\xDA','ucirc':'\xFB','Ucirc':'\xDB','ugrave':'\xF9','Ugrave':'\xD9','uml':'\xA8','uuml':'\xFC','Uuml':'\xDC','yacute':'\xFD','Yacute':'\xDD','yen':'\xA5','yuml':'\xFF'}; - var decodeMapNumeric = {'0':'\uFFFD','128':'\u20AC','130':'\u201A','131':'\u0192','132':'\u201E','133':'\u2026','134':'\u2020','135':'\u2021','136':'\u02C6','137':'\u2030','138':'\u0160','139':'\u2039','140':'\u0152','142':'\u017D','145':'\u2018','146':'\u2019','147':'\u201C','148':'\u201D','149':'\u2022','150':'\u2013','151':'\u2014','152':'\u02DC','153':'\u2122','154':'\u0161','155':'\u203A','156':'\u0153','158':'\u017E','159':'\u0178'}; - var invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111]; - - /*--------------------------------------------------------------------------*/ - - var stringFromCharCode = String.fromCharCode; - - var object = {}; - var hasOwnProperty = object.hasOwnProperty; - var has = function(object, propertyName) { - return hasOwnProperty.call(object, propertyName); - }; - - var contains = function(array, value) { - var index = -1; - var length = array.length; - while (++index < length) { - if (array[index] == value) { - return true; - } - } - return false; - }; - - var merge = function(options, defaults) { - if (!options) { - return defaults; - } - var result = {}; - var key; - for (key in defaults) { - // A `hasOwnProperty` check is not needed here, since only recognized - // option names are used anyway. Any others are ignored. - result[key] = has(options, key) ? options[key] : defaults[key]; - } - return result; - }; - - // Modified version of `ucs2encode`; see https://mths.be/punycode. - var codePointToSymbol = function(codePoint, strict) { - var output = ''; - if ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) { - // See issue #4: - // “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is - // greater than 0x10FFFF, then this is a parse error. Return a U+FFFD - // REPLACEMENT CHARACTER.” - if (strict) { - parseError('character reference outside the permissible Unicode range'); - } - return '\uFFFD'; - } - if (has(decodeMapNumeric, codePoint)) { - if (strict) { - parseError('disallowed character reference'); - } - return decodeMapNumeric[codePoint]; - } - if (strict && contains(invalidReferenceCodePoints, codePoint)) { - parseError('disallowed character reference'); - } - if (codePoint > 0xFFFF) { - codePoint -= 0x10000; - output += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800); - codePoint = 0xDC00 | codePoint & 0x3FF; - } - output += stringFromCharCode(codePoint); - return output; - }; - - var hexEscape = function(codePoint) { - return '&#x' + codePoint.toString(16).toUpperCase() + ';'; - }; - - var decEscape = function(codePoint) { - return '&#' + codePoint + ';'; - }; - - var parseError = function(message) { - throw Error('Parse error: ' + message); - }; - - /*--------------------------------------------------------------------------*/ - - var encode = function(string, options) { - options = merge(options, encode.options); - var strict = options.strict; - if (strict && regexInvalidRawCodePoint.test(string)) { - parseError('forbidden code point'); - } - var encodeEverything = options.encodeEverything; - var useNamedReferences = options.useNamedReferences; - var allowUnsafeSymbols = options.allowUnsafeSymbols; - var escapeCodePoint = options.decimal ? decEscape : hexEscape; - - var escapeBmpSymbol = function(symbol) { - return escapeCodePoint(symbol.charCodeAt(0)); - }; - - if (encodeEverything) { - // Encode ASCII symbols. - string = string.replace(regexAsciiWhitelist, function(symbol) { - // Use named references if requested & possible. - if (useNamedReferences && has(encodeMap, symbol)) { - return '&' + encodeMap[symbol] + ';'; - } - return escapeBmpSymbol(symbol); - }); - // Shorten a few escapes that represent two symbols, of which at least one - // is within the ASCII range. - if (useNamedReferences) { - string = string - .replace(/>\u20D2/g, '>⃒') - .replace(/<\u20D2/g, '<⃒') - .replace(/fj/g, 'fj'); - } - // Encode non-ASCII symbols. - if (useNamedReferences) { - // Encode non-ASCII symbols that can be replaced with a named reference. - string = string.replace(regexEncodeNonAscii, function(string) { - // Note: there is no need to check `has(encodeMap, string)` here. - return '&' + encodeMap[string] + ';'; - }); - } - // Note: any remaining non-ASCII symbols are handled outside of the `if`. - } else if (useNamedReferences) { - // Apply named character references. - // Encode `<>"'&` using named character references. - if (!allowUnsafeSymbols) { - string = string.replace(regexEscape, function(string) { - return '&' + encodeMap[string] + ';'; // no need to check `has()` here - }); - } - // Shorten escapes that represent two symbols, of which at least one is - // `<>"'&`. - string = string - .replace(/>\u20D2/g, '>⃒') - .replace(/<\u20D2/g, '<⃒'); - // Encode non-ASCII symbols that can be replaced with a named reference. - string = string.replace(regexEncodeNonAscii, function(string) { - // Note: there is no need to check `has(encodeMap, string)` here. - return '&' + encodeMap[string] + ';'; - }); - } else if (!allowUnsafeSymbols) { - // Encode `<>"'&` using hexadecimal escapes, now that they’re not handled - // using named character references. - string = string.replace(regexEscape, escapeBmpSymbol); - } - return string - // Encode astral symbols. - .replace(regexAstralSymbols, function($0) { - // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae - var high = $0.charCodeAt(0); - var low = $0.charCodeAt(1); - var codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000; - return escapeCodePoint(codePoint); - }) - // Encode any remaining BMP symbols that are not printable ASCII symbols - // using a hexadecimal escape. - .replace(regexBmpWhitelist, escapeBmpSymbol); - }; - // Expose default options (so they can be overridden globally). - encode.options = { - 'allowUnsafeSymbols': false, - 'encodeEverything': false, - 'strict': false, - 'useNamedReferences': false, - 'decimal' : false - }; - - var decode = function(html, options) { - options = merge(options, decode.options); - var strict = options.strict; - if (strict && regexInvalidEntity.test(html)) { - parseError('malformed character reference'); - } - return html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7, $8) { - var codePoint; - var semicolon; - var decDigits; - var hexDigits; - var reference; - var next; - - if ($1) { - reference = $1; - // Note: there is no need to check `has(decodeMap, reference)`. - return decodeMap[reference]; - } - - if ($2) { - // Decode named character references without trailing `;`, e.g. `&`. - // This is only a parse error if it gets converted to `&`, or if it is - // followed by `=` in an attribute context. - reference = $2; - next = $3; - if (next && options.isAttributeValue) { - if (strict && next == '=') { - parseError('`&` did not start a character reference'); - } - return $0; - } else { - if (strict) { - parseError( - 'named character reference was not terminated by a semicolon' - ); - } - // Note: there is no need to check `has(decodeMapLegacy, reference)`. - return decodeMapLegacy[reference] + (next || ''); - } - } - - if ($4) { - // Decode decimal escapes, e.g. `𝌆`. - decDigits = $4; - semicolon = $5; - if (strict && !semicolon) { - parseError('character reference was not terminated by a semicolon'); - } - codePoint = parseInt(decDigits, 10); - return codePointToSymbol(codePoint, strict); - } - - if ($6) { - // Decode hexadecimal escapes, e.g. `𝌆`. - hexDigits = $6; - semicolon = $7; - if (strict && !semicolon) { - parseError('character reference was not terminated by a semicolon'); - } - codePoint = parseInt(hexDigits, 16); - return codePointToSymbol(codePoint, strict); - } - - // If we’re still here, `if ($7)` is implied; it’s an ambiguous - // ampersand for sure. https://mths.be/notes/ambiguous-ampersands - if (strict) { - parseError( - 'named character reference was not terminated by a semicolon' - ); - } - return $0; - }); - }; - // Expose default options (so they can be overridden globally). - decode.options = { - 'isAttributeValue': false, - 'strict': false - }; - - var escape = function(string) { - return string.replace(regexEscape, function($0) { - // Note: there is no need to check `has(escapeMap, $0)` here. - return escapeMap[$0]; - }); - }; - - /*--------------------------------------------------------------------------*/ - - var he = { - 'version': '1.2.0', - 'encode': encode, - 'decode': decode, - 'escape': escape, - 'unescape': decode - }; - - // 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(function() { - return he; - }); - } else if (freeExports && !freeExports.nodeType) { - if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+ - freeModule.exports = he; - } else { // in Narwhal or RingoJS v0.7.0- - for (var key in he) { - has(he, key) && (freeExports[key] = he[key]); - } - } - } else { // in Rhino or a web browser - root.he = he; - } - -}(this)); diff --git a/node_modules/he/man/he.1 b/node_modules/he/man/he.1 deleted file mode 100644 index 7696628..0000000 --- a/node_modules/he/man/he.1 +++ /dev/null @@ -1,78 +0,0 @@ -.Dd April 5, 2016 -.Dt he 1 -.Sh NAME -.Nm he -.Nd encode/decode HTML entities just like a browser would -.Sh SYNOPSIS -.Nm -.Op Fl -escape Ar string -.br -.Op Fl -encode Ar string -.br -.Op Fl -encode Fl -use-named-refs Fl -everything Fl -allow-unsafe Ar string -.br -.Op Fl -decode Ar string -.br -.Op Fl -decode Fl -attribute Ar string -.br -.Op Fl -decode Fl -strict Ar string -.br -.Op Fl v | -version -.br -.Op Fl h | -help -.Sh DESCRIPTION -.Nm -encodes/decodes HTML entities in strings just like a browser would. -.Sh OPTIONS -.Bl -ohang -offset -.It Sy "--escape" -Take a string of text and escape it for use in text contexts in XML or HTML documents. Only the following characters are escaped: `&`, `<`, `>`, `"`, and `'`. -.It Sy "--encode" -Take a string of text and encode any symbols that aren't printable ASCII symbols and that can be replaced with character references. For example, it would turn `©` into `©`, but it wouldn't turn `+` into `+` since there is no point in doing so. Additionally, it replaces any remaining non-ASCII symbols with a hexadecimal escape sequence (e.g. `𝌆`). The return value of this function is always valid HTML. -.It Sy "--encode --use-named-refs" -Enable the use of named character references (like `©`) in the output. If compatibility with older browsers is a concern, don't use this option. -.It Sy "--encode --everything" -Encode every symbol in the input string, even safe printable ASCII symbols. -.It Sy "--encode --allow-unsafe" -Encode non-ASCII characters only. This leaves unsafe HTML/XML symbols like `&`, `<`, `>`, `"`, and `'` intact. -.It Sy "--encode --decimal" -Use decimal digits rather than hexadecimal digits for encoded character references, e.g. output `©` instead of `©`. -.It Sy "--decode" -Takes a string of HTML and decode any named and numerical character references in it using the algorithm described in the HTML spec. -.It Sy "--decode --attribute" -Parse the input as if it was an HTML attribute value rather than a string in an HTML text content. -.It Sy "--decode --strict" -Throw an error if an invalid character reference is encountered. -.It Sy "-v, --version" -Print he's version. -.It Sy "-h, --help" -Show the help screen. -.El -.Sh EXIT STATUS -The -.Nm he -utility exits with one of the following values: -.Pp -.Bl -tag -width flag -compact -.It Li 0 -.Nm -did what it was instructed to do successfully; either it encoded/decoded the input and printed the result, or it printed the version or usage message. -.It Li 1 -.Nm -encountered an error. -.El -.Sh EXAMPLES -.Bl -ohang -offset -.It Sy "he --escape ''" -Print an escaped version of the given string that is safe for use in HTML text contexts, escaping only `&`, `<`, `>`, `"`, and `'`. -.It Sy "he --decode '©𝌆'" -Print the decoded version of the given HTML string. -.It Sy "echo\ '©𝌆'\ |\ he --decode" -Print the decoded version of the HTML string that gets piped in. -.El -.Sh BUGS -he's bug tracker is located at . -.Sh AUTHOR -Mathias Bynens -.Sh WWW - diff --git a/node_modules/he/package.json b/node_modules/he/package.json deleted file mode 100644 index 6f45669..0000000 --- a/node_modules/he/package.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "_args": [ - [ - "he@1.2.0", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "he@1.2.0", - "_id": "he@1.2.0", - "_inBundle": false, - "_integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "_location": "/he", - "_phantomChildren": {}, - "_requested": { - "type": "version", - "registry": true, - "raw": "he@1.2.0", - "name": "he", - "escapedName": "he", - "rawSpec": "1.2.0", - "saveSpec": null, - "fetchSpec": "1.2.0" - }, - "_requiredBy": [ - "/html-minifier" - ], - "_resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "_spec": "1.2.0", - "_where": "D:\\Projects\\vanillajs-seed", - "author": { - "name": "Mathias Bynens", - "url": "https://mathiasbynens.be/" - }, - "bin": { - "he": "bin/he" - }, - "bugs": { - "url": "https://github.com/mathiasbynens/he/issues" - }, - "description": "A robust HTML entities encoder/decoder with full Unicode support.", - "devDependencies": { - "codecov.io": "^0.1.6", - "grunt": "^0.4.5", - "grunt-cli": "^1.3.1", - "grunt-shell": "^1.1.1", - "grunt-template": "^0.2.3", - "istanbul": "^0.4.2", - "jsesc": "^1.0.0", - "lodash": "^4.8.2", - "qunit-extras": "^1.4.5", - "qunitjs": "~1.11.0", - "regenerate": "^1.2.1", - "regexgen": "^1.3.0", - "requirejs": "^2.1.22", - "sort-object": "^3.0.2" - }, - "directories": { - "bin": "bin", - "man": "man", - "test": "tests" - }, - "files": [ - "LICENSE-MIT.txt", - "he.js", - "bin/", - "man/" - ], - "homepage": "https://mths.be/he", - "keywords": [ - "string", - "entities", - "entity", - "html", - "encode", - "decode", - "unicode" - ], - "license": "MIT", - "main": "he.js", - "man": [ - "D:\\Projects\\vanillajs-seed\\node_modules\\he\\man\\he.1" - ], - "name": "he", - "repository": { - "type": "git", - "url": "git+https://github.com/mathiasbynens/he.git" - }, - "scripts": { - "build": "grunt build", - "test": "node tests/tests.js" - }, - "version": "1.2.0" -} diff --git a/node_modules/html-encoding-sniffer/LICENSE.txt b/node_modules/html-encoding-sniffer/LICENSE.txt index 82d5c89..6abf703 100644 --- a/node_modules/html-encoding-sniffer/LICENSE.txt +++ b/node_modules/html-encoding-sniffer/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright © 2016 Domenic Denicola +Copyright © 2016–2020 Domenic Denicola 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: diff --git a/node_modules/html-encoding-sniffer/lib/html-encoding-sniffer.js b/node_modules/html-encoding-sniffer/lib/html-encoding-sniffer.js index 851b9e2..25b7537 100644 --- a/node_modules/html-encoding-sniffer/lib/html-encoding-sniffer.js +++ b/node_modules/html-encoding-sniffer/lib/html-encoding-sniffer.js @@ -2,27 +2,19 @@ const whatwgEncoding = require("whatwg-encoding"); // https://html.spec.whatwg.org/#encoding-sniffing-algorithm -module.exports = function sniffHTMLEncoding(buffer, options) { +module.exports = (buffer, { transportLayerEncodingLabel, defaultEncoding = "windows-1252" } = {}) => { let encoding = whatwgEncoding.getBOMEncoding(buffer); // see https://github.com/whatwg/html/issues/1910 - if (options === undefined) { - options = {}; - } - - if (encoding === null && options.transportLayerEncodingLabel !== undefined) { - encoding = whatwgEncoding.labelToName(options.transportLayerEncodingLabel); + if (encoding === null && transportLayerEncodingLabel !== undefined) { + encoding = whatwgEncoding.labelToName(transportLayerEncodingLabel); } if (encoding === null) { encoding = prescanMetaCharset(buffer); } - if (encoding === null && options.defaultEncoding !== undefined) { - encoding = options.defaultEncoding; - } - if (encoding === null) { - encoding = "windows-1252"; + encoding = defaultEncoding; } return encoding; @@ -35,8 +27,8 @@ function prescanMetaCharset(buffer) { let c = buffer[i]; if (c === 0x3C) { // "<" - let c1 = buffer[i + 1]; - let c2 = buffer[i + 2]; + const c1 = buffer[i + 1]; + const c2 = buffer[i + 2]; const c3 = buffer[i + 3]; const c4 = buffer[i + 4]; const c5 = buffer[i + 5]; @@ -45,11 +37,10 @@ function prescanMetaCharset(buffer) { i += 4; for (; i < l; i++) { c = buffer[i]; - c1 = buffer[i + 1]; - c2 = buffer[i + 2]; + const cMinus1 = buffer[i - 1]; + const cMinus2 = buffer[i - 2]; // --> (comment end) - if (c === 0x2D && c1 === 0x2D && c2 === 0x3E) { - i += 2; + if (c === 0x3E && cMinus1 === 0x2D && cMinus2 === 0x2D) { break; } } @@ -60,6 +51,7 @@ function prescanMetaCharset(buffer) { (isSpaceCharacter(c5) || c5 === 0x2F)) { // "meta" + space or / i += 6; + const attributeList = new Set(); let gotPragma = false; let needPragma = null; let charset = null; @@ -67,7 +59,8 @@ function prescanMetaCharset(buffer) { let attrRes; do { attrRes = getAttribute(buffer, i, l); - if (attrRes.attr) { + if (attrRes.attr && !attributeList.has(attrRes.attr.name)) { + attributeList.add(attrRes.attr.name); if (attrRes.attr.name === "http-equiv") { gotPragma = attrRes.attr.value === "content-type"; } else if (attrRes.attr.name === "content" && !charset) { @@ -140,7 +133,6 @@ function getAttribute(buffer, i, l) { } // ">" if (c === 0x3E) { - i++; break; } let name = ""; @@ -249,12 +241,12 @@ function extractCharacterEncodingFromMeta(string) { let position = 0; while (true) { - let subPosition = string.substring(position).search(/charset/i); + const indexOfCharset = string.substring(position).search(/charset/i); - if (subPosition === -1) { + if (indexOfCharset === -1) { return null; } - subPosition += "charset".length; + let subPosition = position + indexOfCharset + "charset".length; while (isSpaceCharacter(string[subPosition].charCodeAt(0))) { ++subPosition; @@ -290,10 +282,11 @@ function extractCharacterEncodingFromMeta(string) { return null; } - let end = string.substring(position + 1).search(/\x09|\x0A|\x0C|\x0D|\x20|;/); - if (end === -1) { - end = string.length; - } + const indexOfASCIIWhitespaceOrSemicolon = string.substring(position + 1).search(/\x09|\x0A|\x0C|\x0D|\x20|;/); + const end = indexOfASCIIWhitespaceOrSemicolon === -1 ? + string.length : + position + indexOfASCIIWhitespaceOrSemicolon + 1; + return whatwgEncoding.labelToName(string.substring(position, end)); } diff --git a/node_modules/html-encoding-sniffer/package.json b/node_modules/html-encoding-sniffer/package.json index 8996c06..99fcb5b 100644 --- a/node_modules/html-encoding-sniffer/package.json +++ b/node_modules/html-encoding-sniffer/package.json @@ -1,33 +1,27 @@ { - "_args": [ - [ - "html-encoding-sniffer@1.0.2", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_from": "html-encoding-sniffer@1.0.2", - "_id": "html-encoding-sniffer@1.0.2", + "_from": "html-encoding-sniffer@^2.0.1", + "_id": "html-encoding-sniffer@2.0.1", "_inBundle": false, - "_integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "_integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", "_location": "/html-encoding-sniffer", "_phantomChildren": {}, "_requested": { - "type": "version", + "type": "range", "registry": true, - "raw": "html-encoding-sniffer@1.0.2", + "raw": "html-encoding-sniffer@^2.0.1", "name": "html-encoding-sniffer", "escapedName": "html-encoding-sniffer", - "rawSpec": "1.0.2", + "rawSpec": "^2.0.1", "saveSpec": null, - "fetchSpec": "1.0.2" + "fetchSpec": "^2.0.1" }, "_requiredBy": [ "/jsdom" ], - "_resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "_spec": "1.0.2", - "_where": "D:\\Projects\\vanillajs-seed", + "_resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "_shasum": "42a6dc4fd33f00281176e8b23759ca4e4fa185f3", + "_spec": "html-encoding-sniffer@^2.0.1", + "_where": "D:\\Projects\\vanillajs-seed\\node_modules\\jsdom", "author": { "name": "Domenic Denicola", "email": "d@domenic.me", @@ -36,13 +30,18 @@ "bugs": { "url": "https://github.com/jsdom/html-encoding-sniffer/issues" }, + "bundleDependencies": false, "dependencies": { - "whatwg-encoding": "^1.0.1" + "whatwg-encoding": "^1.0.5" }, + "deprecated": false, "description": "Sniff the encoding from a HTML byte stream", "devDependencies": { - "eslint": "^3.8.0", - "mocha": "^3.1.2" + "eslint": "^6.8.0", + "mocha": "^7.0.0" + }, + "engines": { + "node": ">=10" }, "files": [ "lib/" @@ -60,8 +59,8 @@ "url": "git+https://github.com/jsdom/html-encoding-sniffer.git" }, "scripts": { - "lint": "eslint lib test", + "lint": "eslint .", "test": "mocha" }, - "version": "1.0.2" + "version": "2.0.1" } diff --git a/node_modules/html-minifier/README.md b/node_modules/html-minifier/README.md deleted file mode 100644 index 3785563..0000000 --- a/node_modules/html-minifier/README.md +++ /dev/null @@ -1,160 +0,0 @@ -# HTMLMinifier - -[![NPM version](https://img.shields.io/npm/v/html-minifier.svg)](https://www.npmjs.com/package/html-minifier) -[![Build Status](https://img.shields.io/travis/kangax/html-minifier.svg)](https://travis-ci.org/kangax/html-minifier) -[![Dependency Status](https://img.shields.io/david/kangax/html-minifier.svg)](https://david-dm.org/kangax/html-minifier) - -[HTMLMinifier](https://kangax.github.io/html-minifier/) is a highly **configurable**, **well-tested**, JavaScript-based HTML minifier. - -See [corresponding blog post](http://perfectionkills.com/experimenting-with-html-minifier/) for all the gory details of [how it works](http://perfectionkills.com/experimenting-with-html-minifier/#how_it_works), [description of each option](http://perfectionkills.com/experimenting-with-html-minifier/#options), [testing results](http://perfectionkills.com/experimenting-with-html-minifier/#field_testing) and [conclusions](http://perfectionkills.com/experimenting-with-html-minifier/#cost_and_benefits). - -[Test suite is available online](https://kangax.github.io/html-minifier/tests/). - -Also see corresponding [Ruby wrapper](https://github.com/stereobooster/html_minifier), and for Node.js, [Grunt plugin](https://github.com/gruntjs/grunt-contrib-htmlmin), [Gulp module](https://github.com/jonschlinkert/gulp-htmlmin), [Koa middleware wrapper](https://github.com/koajs/html-minifier) and [Express middleware wrapper](https://github.com/melonmanchan/express-minify-html). - -For lint-like capabilities take a look at [HTMLLint](https://github.com/kangax/html-lint). - -## Minification comparison - -How does HTMLMinifier compare to other solutions — [HTML Minifier from Will Peavy](http://www.willpeavy.com/minifier/) (1st result in [Google search for "html minifier"](https://www.google.com/#q=html+minifier)) as well as [htmlcompressor.com](http://htmlcompressor.com) and [minimize](https://github.com/Swaagie/minimize)? - -| Site | Original size *(KB)* | HTMLMinifier | minimize | Will Peavy | htmlcompressor.com | -| ---------------------------------------------------------------------------- |:--------------------:| ------------:| --------:| ----------:| ------------------:| -| [Google](https://www.google.com/) | 46 | **42** | 46 | 48 | 46 | -| [HTMLMinifier](https://github.com/kangax/html-minifier) | 125 | **98** | 111 | 117 | 111 | -| [Twitter](https://twitter.com/) | 207 | **165** | 200 | 224 | 200 | -| [Stack Overflow](https://stackoverflow.com/) | 253 | **195** | 207 | 215 | 204 | -| [Bootstrap CSS](https://getbootstrap.com/docs/3.3/css/) | 271 | **260** | 269 | 228 | 269 | -| [BBC](https://www.bbc.co.uk/) | 298 | **239** | 290 | 291 | 280 | -| [Amazon](https://www.amazon.co.uk/) | 422 | **316** | 412 | 425 | n/a | -| [NBC](https://www.nbc.com/) | 553 | **530** | 552 | 553 | 534 | -| [Wikipedia](https://en.wikipedia.org/wiki/President_of_the_United_States) | 565 | **461** | 548 | 569 | 548 | -| [New York Times](https://www.nytimes.com/) | 678 | **606** | 675 | 670 | n/a | -| [Eloquent Javascript](https://eloquentjavascript.net/1st_edition/print.html) | 870 | **815** | 840 | 864 | n/a | -| [ES6 table](https://kangax.github.io/compat-table/es6/) | 5911 | **5051** | 5595 | n/a | n/a | -| [ES draft](https://tc39.github.io/ecma262/) | 6126 | **5495** | 5664 | n/a | n/a | - -## Options Quick Reference - -Most of the options are disabled by default. - -| Option | Description | Default | -|--------------------------------|-----------------|---------| -| `caseSensitive` | Treat attributes in case sensitive manner (useful for custom HTML tags) | `false` | -| `collapseBooleanAttributes` | [Omit attribute values from boolean attributes](http://perfectionkills.com/experimenting-with-html-minifier/#collapse_boolean_attributes) | `false` | -| `collapseInlineTagWhitespace` | Don't leave any spaces between `display:inline;` elements when collapsing. Must be used in conjunction with `collapseWhitespace=true` | `false` | -| `collapseWhitespace` | [Collapse white space that contributes to text nodes in a document tree](http://perfectionkills.com/experimenting-with-html-minifier/#collapse_whitespace) | `false` | -| `conservativeCollapse` | Always collapse to 1 space (never remove it entirely). Must be used in conjunction with `collapseWhitespace=true` | `false` | -| `continueOnParseError` | [Handle parse errors](https://html.spec.whatwg.org/multipage/parsing.html#parse-errors) instead of aborting. | `false` | -| `customAttrAssign` | Arrays of regex'es that allow to support custom attribute assign expressions (e.g. `'
'`) | `[ ]` | -| `customAttrCollapse` | Regex that specifies custom attribute to strip newlines from (e.g. `/ng-class/`) | | -| `customAttrSurround` | Arrays of regex'es that allow to support custom attribute surround expressions (e.g. ``) | `[ ]` | -| `customEventAttributes` | Arrays of regex'es that allow to support custom event attributes for `minifyJS` (e.g. `ng-click`) | `[ /^on[a-z]{3,}$/ ]` | -| `decodeEntities` | Use direct Unicode characters whenever possible | `false` | -| `html5` | Parse input according to HTML5 specifications | `true` | -| `ignoreCustomComments` | Array of regex'es that allow to ignore certain comments, when matched | `[ /^!/ ]` | -| `ignoreCustomFragments` | Array of regex'es that allow to ignore certain fragments, when matched (e.g. ``, `{{ ... }}`, etc.) | `[ /<%[\s\S]*?%>/, /<\?[\s\S]*?\?>/ ]` | -| `includeAutoGeneratedTags` | Insert tags generated by HTML parser | `true` | -| `keepClosingSlash` | Keep the trailing slash on singleton elements | `false` | -| `maxLineLength` | Specify a maximum line length. Compressed output will be split by newlines at valid HTML split-points | -| `minifyCSS` | Minify CSS in style elements and style attributes (uses [clean-css](https://github.com/jakubpawlowicz/clean-css)) | `false` (could be `true`, `Object`, `Function(text, type)`) | -| `minifyJS` | Minify JavaScript in script elements and event attributes (uses [UglifyJS](https://github.com/mishoo/UglifyJS2)) | `false` (could be `true`, `Object`, `Function(text, inline)`) | -| `minifyURLs` | Minify URLs in various attributes (uses [relateurl](https://github.com/stevenvachon/relateurl)) | `false` (could be `String`, `Object`, `Function(text)`) | -| `preserveLineBreaks` | Always collapse to 1 line break (never remove it entirely) when whitespace between tags include a line break. Must be used in conjunction with `collapseWhitespace=true` | `false` | -| `preventAttributesEscaping` | Prevents the escaping of the values of attributes | `false` | -| `processConditionalComments` | Process contents of conditional comments through minifier | `false` | -| `processScripts` | Array of strings corresponding to types of script elements to process through minifier (e.g. `text/ng-template`, `text/x-handlebars-template`, etc.) | `[ ]` | -| `quoteCharacter` | Type of quote to use for attribute values (' or ") | | -| `removeAttributeQuotes` | [Remove quotes around attributes when possible](http://perfectionkills.com/experimenting-with-html-minifier/#remove_attribute_quotes) | `false` | -| `removeComments` | [Strip HTML comments](http://perfectionkills.com/experimenting-with-html-minifier/#remove_comments) | `false` | -| `removeEmptyAttributes` | [Remove all attributes with whitespace-only values](http://perfectionkills.com/experimenting-with-html-minifier/#remove_empty_or_blank_attributes) | `false` (could be `true`, `Function(attrName, tag)`) | -| `removeEmptyElements` | [Remove all elements with empty contents](http://perfectionkills.com/experimenting-with-html-minifier/#remove_empty_elements) | `false` | -| `removeOptionalTags` | [Remove optional tags](http://perfectionkills.com/experimenting-with-html-minifier/#remove_optional_tags) | `false` | -| `removeRedundantAttributes` | [Remove attributes when value matches default.](http://perfectionkills.com/experimenting-with-html-minifier/#remove_redundant_attributes) | `false` | -| `removeScriptTypeAttributes` | Remove `type="text/javascript"` from `script` tags. Other `type` attribute values are left intact | `false` | -| `removeStyleLinkTypeAttributes`| Remove `type="text/css"` from `style` and `link` tags. Other `type` attribute values are left intact | `false` | -| `removeTagWhitespace` | Remove space between attributes whenever possible. **Note that this will result in invalid HTML!** | `false` | -| `sortAttributes` | [Sort attributes by frequency](#sorting-attributes--style-classes) | `false` | -| `sortClassName` | [Sort style classes by frequency](#sorting-attributes--style-classes) | `false` | -| `trimCustomFragments` | Trim white space around `ignoreCustomFragments`. | `false` | -| `useShortDoctype` | [Replaces the `doctype` with the short (HTML5) doctype](http://perfectionkills.com/experimenting-with-html-minifier/#use_short_doctype) | `false` | - -### Sorting attributes / style classes - -Minifier options like `sortAttributes` and `sortClassName` won't impact the plain-text size of the output. However, they form long repetitive chains of characters that should improve compression ratio of gzip used in HTTP compression. - -## Special cases - -### Ignoring chunks of markup - -If you have chunks of markup you would like preserved, you can wrap them ``. - -### 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 fbc2e2d..0000000 --- a/node_modules/html-minifier/package.json +++ /dev/null @@ -1,133 +0,0 @@ -{ - "_args": [ - [ - "html-minifier@4.0.0", - "D:\\Projects\\vanillajs-seed" - ] - ], - "_development": true, - "_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": "version", - "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", - "_spec": "4.0.0", - "_where": "D:\\Projects\\vanillajs-seed", - "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" - }, - "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" - }, - "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