From a794ea974b358887a82abe251b2a54036f5f5598 Mon Sep 17 00:00:00 2001 From: Brandon Casey <2381475+brandonocasey@users.noreply.github.com> Date: Thu, 30 Sep 2021 16:09:47 -0400 Subject: [PATCH] chore: update linter, run --fix on files, and manually lint when needed (#141) --- package-lock.json | 1078 +++++++++++++++++++++++++++++--------- package.json | 2 +- src/eme.js | 30 +- src/fairplay.js | 7 +- src/ms-prefixed.js | 26 +- src/playready.js | 8 +- test/eme.test.js | 156 ++++-- test/fairplay.test.js | 50 +- test/ms-prefixed.test.js | 120 +++-- test/playready.test.js | 3 +- test/plugin.test.js | 120 +++-- test/utils.test.js | 15 +- 12 files changed, 1174 insertions(+), 441 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d39e62..b2afdf0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -265,6 +265,12 @@ "@babel/types": "^7.4.4" } }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, "@babel/helper-wrap-function": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", @@ -841,6 +847,124 @@ "to-fast-properties": "^2.0.0" } }, + "@es-joy/jsdoccomment": { + "version": "0.9.0-alpha.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.9.0-alpha.1.tgz", + "integrity": "sha512-Clxxc0PwpISoYYBibA+1L2qFJ7gvFVhI2Hos87S06K+Q0cXdOhZQJNKWuaQGPAeHjZEuUB/YoWOfwjuF2wirqA==", + "dev": true, + "requires": { + "comment-parser": "1.1.6-beta.0", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "1.0.4" + }, + "dependencies": { + "jsdoc-type-pratt-parser": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.0.4.tgz", + "integrity": "sha512-jzmW9gokeq9+bHPDR1nCeidMyFUikdZlbOhKzh9+/nJqB75XhpNKec1/UuxW5c4+O+Pi31Gc/dCboyfSm/pSpQ==", + "dev": true + } + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@samverschueren/stream-to-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", @@ -921,6 +1045,15 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, "@types/node": { "version": "11.13.8", "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.8.tgz", @@ -936,6 +1069,12 @@ "@types/node": "*" } }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "dev": true + }, "@videojs/http-streaming": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-1.9.3.tgz", @@ -989,9 +1128,9 @@ "dev": true }, "acorn-jsx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz", - "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, "add-stream": { @@ -1026,12 +1165,12 @@ } }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" @@ -1059,6 +1198,12 @@ "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", "dev": true }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -1231,9 +1376,9 @@ "dev": true }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async": { @@ -1832,12 +1977,6 @@ "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", "dev": true }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "chokidar": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", @@ -1994,9 +2133,9 @@ "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" }, "comment-parser": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.5.4.tgz", - "integrity": "sha512-0h7W6Y1Kb6zKQMJqdX41C5qf9ITCVIsD2qP2RaqDF3GFkXFrmuAuv5zUOuo19YzyC9scjBNpqzuaRQ2Sy5pxMQ==", + "version": "1.1.6-beta.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.6-beta.0.tgz", + "integrity": "sha512-q3cA8TSMyqW7wcPSYWzbO/rMahnXgzs4SLG/UIWXdEsnXTFPZkEkWAdNgPiHig2OzxgpPLOh4WwsmClDxndwHw==", "dev": true }, "compare-func": { @@ -2742,6 +2881,15 @@ "has-binary2": "~1.0.2" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -2862,142 +3010,258 @@ } }, "eslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", - "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.9.1", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^4.0.3", - "eslint-utils": "^1.3.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^5.0.1", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.7.0", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^6.2.2", - "js-yaml": "^3.13.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.11", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^5.5.1", - "strip-ansi": "^4.0.0", - "strip-json-comments": "^2.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0" + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "is-glob": "^4.0.1" } }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "type-fest": "^0.20.2" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "import-fresh": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz", - "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, - "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", - "dev": true, - "requires": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.11", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "resolve-from": { @@ -3006,42 +3270,149 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "lru-cache": "^6.0.0" } }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.1" } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "eslint-config-videojs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-videojs/-/eslint-config-videojs-4.0.1.tgz", - "integrity": "sha512-CoMmZmPaEl4/dYXnyET1YIW76kc6Y0GEiSc4vzPhT8Y1k51gAE/nUiiQYBk70MQuQQGlfl6EnGWyFbq2oEChEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-videojs/-/eslint-config-videojs-6.0.0.tgz", + "integrity": "sha512-kD/A8QGdmHH7SOkEidJt1ICN0B5d3yvAxMUXCWWWtJVf1jgGAwcWL43VSeYYwp31Iby77QgOOWtnvzuNvVhHpQ==", "dev": true }, "eslint-plugin-jsdoc": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-3.15.1.tgz", - "integrity": "sha512-xIQ+ajO6M6zsu5XEn5+1QyE1/P1w/l3yAXPCToZjRcrsKsg5yLTsYnrkdoJZJegE70dTZZwQ5bYPCjEbPey6cw==", - "dev": true, - "requires": { - "comment-parser": "^0.5.1", - "jsdoctypeparser": "^2.0.0-alpha-8", - "lodash": "^4.17.11" + "version": "35.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-35.5.1.tgz", + "integrity": "sha512-pPYPWtsykwVEue1tYEyoppBj4dgF7XicF67tLLLraY6RQYBq7qMKjUHji19+hfiTtYKKBD0YfeK8hgjPAE5viw==", + "dev": true, + "requires": { + "@es-joy/jsdoccomment": "0.9.0-alpha.1", + "comment-parser": "1.1.6-beta.0", + "debug": "^4.3.2", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "^1.0.4", + "lodash": "^4.17.21", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "eslint-plugin-json-light": { @@ -3054,61 +3425,76 @@ } }, "eslint-plugin-markdown": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.0.tgz", - "integrity": "sha512-YIrClt3yLgyGov+rInjIoC/05zMxb/c6YXQZkyI9UKuBRFLgCrL37cxthj0JYWiTYtiHq0p8O0Nt0/HrvO48iQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz", + "integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==", "dev": true, "requires": { - "object-assign": "^4.0.1", - "remark-parse": "^5.0.0", - "unified": "^6.1.2" + "mdast-util-from-markdown": "^0.8.5" } }, "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "esrecurse": "^4.1.0", + "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "dependencies": { "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true } } }, "eslint-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz", - "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } }, "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", - "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "acorn": "^6.0.7", - "acorn-jsx": "^5.0.0", - "eslint-visitor-keys": "^1.0.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" }, "dependencies": { "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } @@ -3120,35 +3506,35 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" }, "dependencies": { "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } }, "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "^5.2.0" }, "dependencies": { "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", "dev": true } } @@ -3360,15 +3746,15 @@ "dev": true }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { @@ -3397,12 +3783,12 @@ } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "fill-range": { @@ -3462,14 +3848,30 @@ } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "flatted": { @@ -5580,10 +5982,10 @@ } } }, - "jsdoctypeparser": { - "version": "2.0.0-alpha-8", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-2.0.0-alpha-8.tgz", - "integrity": "sha1-uvE3+44qVYgQrc8Z0tKi9oDpCl8=", + "jsdoc-type-pratt-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz", + "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==", "dev": true }, "jsesc": { @@ -6252,6 +6654,12 @@ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", @@ -6319,6 +6727,12 @@ "lodash._reinterpolate": "~3.0.0" } }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -6499,6 +6913,50 @@ "resolve-dir": "^1.0.0" } }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "dependencies": { + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + } + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true + }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", @@ -6577,6 +7035,47 @@ } } }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + } + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -8285,9 +8784,9 @@ "dev": true }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "regexpu-core": { @@ -8304,6 +8803,12 @@ "unicode-match-property-value-ecmascript": "^1.1.0" } }, + "regextras": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", + "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", + "dev": true + }, "regjsgen": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", @@ -8393,6 +8898,12 @@ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -9434,64 +9945,108 @@ "dev": true }, "table": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz", - "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", "dev": true, "requires": { - "ajv": "^6.9.1", - "lodash": "^4.17.11", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" }, "dependencies": { + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -9792,6 +10347,12 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -10036,9 +10597,9 @@ "dev": true }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -10102,6 +10663,12 @@ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", "dev": true }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -10211,19 +10778,27 @@ } }, "videojs-standard": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/videojs-standard/-/videojs-standard-7.1.0.tgz", - "integrity": "sha512-TTdqfr0+0shIWIATkUFymI1paggThwPxCQaqF93BYzP759WvS0OL72blHWgUiPNuVfW2R+UDJ7jCE8+zo95/gQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/videojs-standard/-/videojs-standard-9.0.1.tgz", + "integrity": "sha512-klpkgUD8qgMNTP3nELWdJ41iNSBVSyN0lllambdcsZkEBnCIUoucv7DtL/um6rpSgaw2j+nQYQusTa0OoY/IEQ==", "dev": true, "requires": { - "commander": "^2.17.1", - "eslint": "^5.4.0", - "eslint-config-videojs": "^4.0.1", - "eslint-plugin-jsdoc": "^3.7.1", + "commander": "^7.2.0", + "eslint": "^7.28.0", + "eslint-config-videojs": "^6.0.0", + "eslint-plugin-jsdoc": "^35.3.0", "eslint-plugin-json-light": "^1.0.3", - "eslint-plugin-markdown": "^1.0.0-beta.8", - "find-root": "^1.0.0", + "eslint-plugin-markdown": "^2.2.0", + "find-root": "^1.1.0", "tsmlb": "^1.0.0" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } } }, "videojs-vtt.js": { @@ -10277,6 +10852,12 @@ } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", @@ -10326,15 +10907,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, "ws": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", diff --git a/package.json b/package.json index 4eb6437..2e8b119 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "videojs-generate-karma-config": "^5.1.0", "videojs-generate-rollup-config": "^3.1.0", "videojs-generator-verify": "^1.2.0", - "videojs-standard": "~7.1.0" + "videojs-standard": "~9.0.1" }, "generator-videojs-plugin": { "version": "7.3.2" diff --git a/src/eme.js b/src/eme.js index 8a8976b..2fca35d 100644 --- a/src/eme.js +++ b/src/eme.js @@ -30,7 +30,8 @@ export const getSupportedConfigurations = (keySystemOptions) => { if (audioContentType || audioRobustness) { supportedConfiguration.audioCapabilities = [ - Object.assign({}, + Object.assign( + {}, (audioContentType ? { contentType: audioContentType } : {}), (audioRobustness ? { robustness: audioRobustness } : {}) ) @@ -39,7 +40,8 @@ export const getSupportedConfigurations = (keySystemOptions) => { if (videoContentType || videoRobustness) { supportedConfiguration.videoCapabilities = [ - Object.assign({}, + Object.assign( + {}, (videoContentType ? { contentType: videoContentType } : {}), (videoRobustness ? { robustness: videoRobustness } : {}) ) @@ -126,11 +128,13 @@ export const makeNewRequest = (requestOptions) => { expired = true; break; case 'internal-error': + const message = + 'Key status reported as "internal-error." Leaving the session open since we ' + + 'don\'t have enough details to know if this error is fatal.'; + // "This value is not actionable by the application." // https://www.w3.org/TR/encrypted-media/#dom-mediakeystatus-internal-error - videojs.log.warn( - 'Key status reported as "internal-error." Leaving the session open since we ' + - 'don\'t have enough details to know if this error is fatal.', event); + videojs.log.warn(message, event); break; } }); @@ -285,8 +289,7 @@ export const defaultGetLicense = (keySystemOptions) => (emeOptions, keyMessage, responseType: 'arraybuffer', body: keyMessage, headers - }, httpResponseHandler(callback, true) - ); + }, httpResponseHandler(callback, true)); }; const promisifyGetLicense = (getLicenseFn, eventBus) => { @@ -352,7 +355,8 @@ export const standard5July2016 = ({ keySystemOptions = standardizeKeySystemOptions( keySystemAccess.keySystem, - options.keySystems[keySystemAccess.keySystem]); + options.keySystems[keySystemAccess.keySystem] + ); if (!keySystemOptions.getCertificate) { resolve(keySystemAccess); @@ -388,16 +392,18 @@ export const standard5July2016 = ({ } return keySystemPromise.then(() => { + const {getLicense} = standardizeKeySystemOptions( + video.keySystem, + options.keySystems[video.keySystem] + ); + return addSession({ video, initDataType, initData, options, // if key system has not been determined then addSession doesn't need getLicense - getLicense: video.keySystem ? - promisifyGetLicense(standardizeKeySystemOptions( - video.keySystem, - options.keySystems[video.keySystem]).getLicense, eventBus) : null, + getLicense: video.keySystem ? promisifyGetLicense(getLicense, eventBus) : null, removeSession, eventBus }); diff --git a/src/fairplay.js b/src/fairplay.js index 3ae97b7..4f0dfaa 100644 --- a/src/fairplay.js +++ b/src/fairplay.js @@ -2,6 +2,7 @@ * The W3C Working Draft of 22 October 2013 seems to be the best match for * the ms-prefixed API. However, it should only be used as a guide; it is * doubtful the spec is 100% implemented as described. + * * @see https://www.w3.org/TR/2013/WD-encrypted-media-20131022 */ import videojs from 'video.js'; @@ -23,8 +24,7 @@ const concatInitDataIdAndCertificate = ({initData, id, cert}) => { // [4 byte:certLength] // [certLength byte: cert] let offset = 0; - const buffer = new ArrayBuffer( - initData.byteLength + 4 + id.byteLength + 4 + cert.byteLength); + const buffer = new ArrayBuffer(initData.byteLength + 4 + id.byteLength + 4 + cert.byteLength); const dataView = new DataView(buffer); const initDataArray = new Uint8Array(buffer, offset, initData.byteLength); @@ -65,7 +65,8 @@ const addKey = ({video, contentId, initData, cert, options, getLicense, eventBus try { keySession = video.webkitKeys.createSession( 'video/mp4', - concatInitDataIdAndCertificate({id: contentId, initData, cert})); + concatInitDataIdAndCertificate({id: contentId, initData, cert}) + ); } catch (error) { reject('Could not create key session'); return; diff --git a/src/ms-prefixed.js b/src/ms-prefixed.js index 1b5c712..cd3f91e 100644 --- a/src/ms-prefixed.js +++ b/src/ms-prefixed.js @@ -2,6 +2,7 @@ * The W3C Working Draft of 22 October 2013 seems to be the best match for * the ms-prefixed API. However, it should only be used as a guide; it is * doubtful the spec is 100% implemented as described. + * * @see https://www.w3.org/TR/2013/WD-encrypted-media-20131022 * @see https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/compatibility/mt598601(v=vs.85) */ @@ -14,19 +15,18 @@ export const addKeyToSession = (options, session, event, eventBus) => { let playreadyOptions = options.keySystems[PLAYREADY_KEY_SYSTEM]; if (typeof playreadyOptions.getKey === 'function') { - playreadyOptions.getKey( - options, event.destinationURL, event.message.buffer, (err, key) => { - if (err) { - eventBus.trigger({ - message: 'Unable to get key: ' + err, - target: session, - type: 'mskeyerror' - }); - return; - } - - session.update(key); - }); + playreadyOptions.getKey(options, event.destinationURL, event.message.buffer, (err, key) => { + if (err) { + eventBus.trigger({ + message: 'Unable to get key: ' + err, + target: session, + type: 'mskeyerror' + }); + return; + } + + session.update(key); + }); return; } diff --git a/src/playready.js b/src/playready.js index 8dbfccd..7d0ea93 100644 --- a/src/playready.js +++ b/src/playready.js @@ -12,10 +12,10 @@ import {httpResponseHandler} from './http-handler.js'; * license request */ export const getMessageContents = (message) => { - const xml = (new window.DOMParser()).parseFromString( - // TODO do we want to support UTF-8? - String.fromCharCode.apply(null, new Uint16Array(message)), - 'application/xml'); + // TODO do we want to support UTF-8? + const xmlString = String.fromCharCode.apply(null, new Uint16Array(message)); + const xml = (new window.DOMParser()) + .parseFromString(xmlString, 'application/xml'); const headersElement = xml.getElementsByTagName('HttpHeaders')[0]; const headers = {}; diff --git a/test/eme.test.js b/test/eme.test.js index 23a2a8f..d6c3b79 100644 --- a/test/eme.test.js +++ b/test/eme.test.js @@ -78,9 +78,11 @@ QUnit.test('keystatuseschange triggers keystatuschange on eventBus for each key' }); assert.equal(mockSession.listeners.length, 2, 'added listeners'); - assert.equal(mockSession.listeners[1].type, + assert.equal( + mockSession.listeners[1].type, 'keystatuseschange', - 'added keystatuseschange listener'); + 'added keystatuseschange listener' + ); // no key statuses mockSession.listeners[1].listener(); @@ -94,32 +96,52 @@ QUnit.test('keystatuseschange triggers keystatuschange on eventBus for each key' mockSession.keyStatuses.set(5, 'output-restricted'); mockSession.listeners[1].listener(); - assert.equal(callCount[1].unrecognized, 1, - 'dispatched `unrecognized` key status for key 1'); - assert.equal(callCount[2].expired, 1, - 'dispatched `expired` key status for key 2'); - assert.equal(callCount[3]['internal-error'], 1, - 'dispatched `internal-error` key status for key 3'); - assert.equal(callCount[4]['output-restricted'], 1, - 'dispatched `output-restricted` key status for key 4'); - assert.equal(callCount[5]['output-restricted'], 1, - 'dispatched `output-restricted` key status for key 5'); + assert.equal( + callCount[1].unrecognized, 1, + 'dispatched `unrecognized` key status for key 1' + ); + assert.equal( + callCount[2].expired, 1, + 'dispatched `expired` key status for key 2' + ); + assert.equal( + callCount[3]['internal-error'], 1, + 'dispatched `internal-error` key status for key 3' + ); + assert.equal( + callCount[4]['output-restricted'], 1, + 'dispatched `output-restricted` key status for key 4' + ); + assert.equal( + callCount[5]['output-restricted'], 1, + 'dispatched `output-restricted` key status for key 5' + ); assert.equal(callCount.total, 5, '5 keystatuschange events received so far'); // Change a single key and check that it's triggered for all keys mockSession.keyStatuses.set(1, 'usable'); mockSession.listeners[1].listener(); - assert.equal(callCount[1].usable, 1, - 'dispatched `usable` key status for key 1'); - assert.equal(callCount[2].expired, 2, - 'dispatched `expired` key status for key 2'); - assert.equal(callCount[3]['internal-error'], 2, - 'dispatched `internal-error` key status for key 3'); - assert.equal(callCount[4]['output-restricted'], 2, - 'dispatched `output-restricted` key status for key 4'); - assert.equal(callCount[5]['output-restricted'], 2, - 'dispatched `output-restricted` key status for key 5'); + assert.equal( + callCount[1].usable, 1, + 'dispatched `usable` key status for key 1' + ); + assert.equal( + callCount[2].expired, 2, + 'dispatched `expired` key status for key 2' + ); + assert.equal( + callCount[3]['internal-error'], 2, + 'dispatched `internal-error` key status for key 3' + ); + assert.equal( + callCount[4]['output-restricted'], 2, + 'dispatched `output-restricted` key status for key 4' + ); + assert.equal( + callCount[5]['output-restricted'], 2, + 'dispatched `output-restricted` key status for key 5' + ); assert.equal(callCount.total, 10, '10 keystatuschange events received so far'); // Change the key statuses and recheck @@ -130,16 +152,26 @@ QUnit.test('keystatuseschange triggers keystatuschange on eventBus for each key' mockSession.keyStatuses.set(5, 'usable'); mockSession.listeners[1].listener(); - assert.equal(callCount[1]['output-downscaled'], 1, - 'dispatched `output-downscaled` key status for key 1'); - assert.equal(callCount[2].released, 1, - 'dispatched `released` key status for key 2'); - assert.equal(callCount[3].usable, 1, - 'dispatched `usable` key status for key 3'); - assert.equal(callCount[4]['status-pending'], 1, - 'dispatched `status-pending` key status for key 4'); - assert.equal(callCount[5].usable, 1, - 'dispatched `usable` key status for key 5'); + assert.equal( + callCount[1]['output-downscaled'], 1, + 'dispatched `output-downscaled` key status for key 1' + ); + assert.equal( + callCount[2].released, 1, + 'dispatched `released` key status for key 2' + ); + assert.equal( + callCount[3].usable, 1, + 'dispatched `usable` key status for key 3' + ); + assert.equal( + callCount[4]['status-pending'], 1, + 'dispatched `status-pending` key status for key 4' + ); + assert.equal( + callCount[5].usable, 1, + 'dispatched `usable` key status for key 5' + ); assert.equal(callCount.total, 15, '15 keystatuschange events received so far'); }); @@ -175,9 +207,11 @@ QUnit.test('keystatuseschange with expired key closes and recreates session', fu assert.equal(creates, 1, 'created session'); assert.equal(mockSession.listeners.length, 2, 'added listeners'); - assert.equal(mockSession.listeners[1].type, + assert.equal( + mockSession.listeners[1].type, 'keystatuseschange', - 'added keystatuseschange listener'); + 'added keystatuseschange listener' + ); assert.equal(mockSession.numCloses, 0, 'no session close calls'); assert.equal(removeSessionCalls.length, 0, 'no removeSession calls'); @@ -229,9 +263,11 @@ QUnit.test('keystatuseschange with internal-error logs a warning', function(asse }); assert.equal(mockSession.listeners.length, 2, 'added listeners'); - assert.equal(mockSession.listeners[1].type, + assert.equal( + mockSession.listeners[1].type, 'keystatuseschange', - 'added keystatuseschange listener'); + 'added keystatuseschange listener' + ); // no key statuses mockSession.listeners[1].listener(); @@ -245,10 +281,12 @@ QUnit.test('keystatuseschange with internal-error logs a warning', function(asse mockSession.listeners[1].listener(keyStatusChangeEvent); assert.equal(warnCalls.length, 1, 'one warn log'); - assert.equal(warnCalls[0][0], + assert.equal( + warnCalls[0][0], 'Key status reported as "internal-error." Leaving the session open ' + 'since we don\'t have enough details to know if this error is fatal.', - 'logged correct warning'); + 'logged correct warning' + ); assert.equal(warnCalls[0][1], keyStatusChangeEvent, 'logged event object'); videojs.log.warn = origWarn; @@ -465,8 +503,10 @@ QUnit.test('5 July 2016 lifecycle', function(assert) { assert.equal(callCounts.keySessionGenerateRequest, 0, 'key session request not made'); assert.equal(callCounts.getLicense, 0, 'license not requested'); assert.equal(callCounts.keySessionUpdate, 0, 'key session not updated'); - assert.equal(callCounts.licenseRequestAttempts, 0, - 'license request event not triggered (since no callback yet)'); + assert.equal( + callCounts.licenseRequestAttempts, 0, + 'license request event not triggered (since no callback yet)' + ); callbacks.getCertificate(null, ''); @@ -480,8 +520,10 @@ QUnit.test('5 July 2016 lifecycle', function(assert) { assert.equal(callCounts.keySessionGenerateRequest, 1, 'key session request made'); assert.equal(callCounts.getLicense, 0, 'license not requested'); assert.equal(callCounts.keySessionUpdate, 0, 'key session not updated'); - assert.equal(callCounts.licenseRequestAttempts, 0, - 'license request event not triggered (since no callback yet)'); + assert.equal( + callCounts.licenseRequestAttempts, 0, + 'license request event not triggered (since no callback yet)' + ); keySessionEventListeners.message({messageType: 'license-request'}); @@ -493,8 +535,10 @@ QUnit.test('5 July 2016 lifecycle', function(assert) { assert.equal(callCounts.keySessionGenerateRequest, 1, 'key session request made'); assert.equal(callCounts.getLicense, 1, 'license requested'); assert.equal(callCounts.keySessionUpdate, 0, 'key session not updated'); - assert.equal(callCounts.licenseRequestAttempts, 0, - 'license request event not triggered (since no callback yet)'); + assert.equal( + callCounts.licenseRequestAttempts, 0, + 'license request event not triggered (since no callback yet)' + ); callbacks.getLicense(); @@ -508,8 +552,10 @@ QUnit.test('5 July 2016 lifecycle', function(assert) { assert.equal(callCounts.keySessionGenerateRequest, 1, 'key session request made'); assert.equal(callCounts.getLicense, 1, 'license requested'); assert.equal(callCounts.keySessionUpdate, 1, 'key session updated'); - assert.equal(callCounts.licenseRequestAttempts, 1, - 'license request event triggered'); + assert.equal( + callCounts.licenseRequestAttempts, 1, + 'license request event triggered' + ); assert.equal(errors, 0, 'no errors occurred'); }); }); @@ -601,8 +647,10 @@ QUnit.test('rejects promise when createMediaKeys rejects', function(assert) { options, eventBus: getMockEventBus() }).catch((err) => { - assert.equal(err, 'Failed to create and initialize a MediaKeys object', - 'uses generic message'); + assert.equal( + err, 'Failed to create and initialize a MediaKeys object', + 'uses generic message' + ); done(); }); @@ -652,13 +700,17 @@ QUnit.test('rejects promise when addPendingSessions rejects', function(assert) { keySystem: 'com.widevine.alpha', createMediaKeys: () => { return Promise.resolve({ - setServerCertificate: () => resolveReject(rejectSetServerCertificate, - 'setServerCertificate failed'), + setServerCertificate: () => resolveReject( + rejectSetServerCertificate, + 'setServerCertificate failed' + ), createSession: () => { return { addEventListener: () => {}, - generateRequest: () => resolveReject(rejectGenerateRequest, - 'generateRequest failed') + generateRequest: () => resolveReject( + rejectGenerateRequest, + 'generateRequest failed' + ) }; } }); diff --git a/test/fairplay.test.js b/test/fairplay.test.js index 9e6e250..949c7e7 100644 --- a/test/fairplay.test.js +++ b/test/fairplay.test.js @@ -96,8 +96,10 @@ QUnit.test('lifecycle', function(assert) { assert.equal(callCounts.createSession, 0, 'a key session has not been created'); assert.equal(callCounts.getLicense, 0, 'getLicense has not been called'); assert.equal(callCounts.updateKeySession, 0, 'updateKeySession has not been called'); - assert.equal(callCounts.licenseRequestAttempts, 0, - 'license request event not triggered (since no callback yet)'); + assert.equal( + callCounts.licenseRequestAttempts, 0, + 'license request event not triggered (since no callback yet)' + ); callbacks.getCertificate(null, new Uint16Array([4, 5, 6, 7]).buffer); @@ -107,15 +109,23 @@ QUnit.test('lifecycle', function(assert) { assert.equal(callCounts.createSession, 1, 'a key session has been created'); assert.equal(callCounts.getLicense, 0, 'getLicense has not been called'); assert.equal(callCounts.updateKeySession, 0, 'updateKeySession has not been called'); - assert.equal(callCounts.licenseRequestAttempts, 0, - 'license request event not triggered (since no callback yet)'); - - assert.ok(keySessionEventListeners.webkitkeymessage, - 'added an event listener for webkitkeymessage'); - assert.ok(keySessionEventListeners.webkitkeyadded, - 'added an event listener for webkitkeyadded'); - assert.ok(keySessionEventListeners.webkitkeyerror, - 'added an event listener for webkitkeyerror'); + assert.equal( + callCounts.licenseRequestAttempts, 0, + 'license request event not triggered (since no callback yet)' + ); + + assert.ok( + keySessionEventListeners.webkitkeymessage, + 'added an event listener for webkitkeymessage' + ); + assert.ok( + keySessionEventListeners.webkitkeyadded, + 'added an event listener for webkitkeyadded' + ); + assert.ok( + keySessionEventListeners.webkitkeyerror, + 'added an event listener for webkitkeyerror' + ); keySessionEventListeners.webkitkeymessage({}); @@ -124,8 +134,10 @@ QUnit.test('lifecycle', function(assert) { assert.equal(callCounts.createSession, 1, 'a key session has been created'); assert.equal(callCounts.getLicense, 1, 'getLicense has been called'); assert.equal(callCounts.updateKeySession, 0, 'updateKeySession has not been called'); - assert.equal(callCounts.licenseRequestAttempts, 0, - 'license request event not triggered (since no callback yet)'); + assert.equal( + callCounts.licenseRequestAttempts, 0, + 'license request event not triggered (since no callback yet)' + ); callbacks.getLicense(null, []); @@ -134,8 +146,10 @@ QUnit.test('lifecycle', function(assert) { assert.equal(callCounts.createSession, 1, 'a key session has been created'); assert.equal(callCounts.getLicense, 1, 'getLicense has been called'); assert.equal(callCounts.updateKeySession, 1, 'updateKeySession has been called'); - assert.equal(callCounts.licenseRequestAttempts, 1, - 'license request event triggered'); + assert.equal( + callCounts.licenseRequestAttempts, 1, + 'license request event triggered' + ); keySessionEventListeners.webkitkeyadded(); }; @@ -234,8 +248,10 @@ QUnit.test('error in webkitKeys.createSession rejects promise', function(assert) options: {keySystems}, eventBus: getMockEventBus() }).catch(err => { - assert.equal(err, 'Could not create key session', - 'message is good'); + assert.equal( + err, 'Could not create key session', + 'message is good' + ); done(); }); diff --git a/test/ms-prefixed.test.js b/test/ms-prefixed.test.js index 09fe01e..36028e5 100644 --- a/test/ms-prefixed.test.js +++ b/test/ms-prefixed.test.js @@ -202,9 +202,11 @@ QUnit.test('calls getKey when provided on key message', function(assert) { } }); - assert.equal(errorMessage, + assert.equal( + errorMessage, 'Unable to get key: an error', - 'fires mskeyerror on eventBus when callback has an error'); + 'fires mskeyerror on eventBus when callback has an error' + ); assert.equal(this.session.keys.length, 1, 'did not add a new key'); }); @@ -240,21 +242,26 @@ QUnit.test('makes request when nothing provided on key message', function(assert }); assert.equal(xhrCalls.length, 1, 'one xhr request'); - assert.equal(xhrCalls[0].config.uri, + assert.equal( + xhrCalls[0].config.uri, 'destination-url', - 'made request to destinationURL'); + 'made request to destinationURL' + ); assert.deepEqual( xhrCalls[0].config.headers, { 'Content-Type': 'text/xml; charset=utf-8', 'SOAPAction': '"http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense"' }, - 'uses headers from message'); + 'uses headers from message' + ); assert.equal(xhrCalls[0].config.body, challengeElement, 'sends the challenge element'); assert.equal(xhrCalls[0].config.method, 'post', 'request is a post'); - assert.equal(xhrCalls[0].config.responseType, + assert.equal( + xhrCalls[0].config.responseType, 'arraybuffer', - 'responseType is an arraybuffer'); + 'responseType is an arraybuffer' + ); const response = { body: stringToArrayBuffer('key value') @@ -262,22 +269,27 @@ QUnit.test('makes request when nothing provided on key message', function(assert xhrCalls[0].callback('an error', response, response.body); - assert.equal(errorMessage, + assert.equal( + errorMessage, 'Unable to request key from url: destination-url', - 'triggers mskeyerror on event bus when callback has an error'); + 'triggers mskeyerror on event bus when callback has an error' + ); assert.equal(this.session.keys.length, 0, 'no key added to session'); xhrCalls[0].callback(null, response, response.body); assert.equal(this.session.keys.length, 1, 'key added to session'); - assert.deepEqual(this.session.keys[0], + assert.deepEqual( + this.session.keys[0], new Uint8Array(response.body), - 'correct key added to session'); + 'correct key added to session' + ); videojs.xhr = origXhr; }); -QUnit.test('makes request on key message when empty object provided in options', +QUnit.test( + 'makes request on key message when empty object provided in options', function(assert) { const origXhr = videojs.xhr; const xhrCalls = []; @@ -303,24 +315,30 @@ QUnit.test('makes request on key message when empty object provided in options', }); assert.equal(xhrCalls.length, 1, 'one xhr request'); - assert.equal(xhrCalls[0].config.uri, + assert.equal( + xhrCalls[0].config.uri, 'destination-url', - 'made request to destinationURL'); + 'made request to destinationURL' + ); assert.deepEqual( xhrCalls[0].config.headers, { 'Content-Type': 'text/xml; charset=utf-8', 'SOAPAction': '"http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense"' }, - 'uses headers from message'); + 'uses headers from message' + ); assert.equal(xhrCalls[0].config.body, challengeElement, 'sends the challenge element'); assert.equal(xhrCalls[0].config.method, 'post', 'request is a post'); - assert.equal(xhrCalls[0].config.responseType, + assert.equal( + xhrCalls[0].config.responseType, 'arraybuffer', - 'responseType is an arraybuffer'); + 'responseType is an arraybuffer' + ); videojs.xhr = origXhr; - }); + } +); QUnit.test('makes request with provided url string on key message', function(assert) { const origXhr = videojs.xhr; @@ -360,21 +378,26 @@ QUnit.test('makes request with provided url string on key message', function(ass }); assert.equal(xhrCalls.length, 1, 'one xhr request'); - assert.equal(xhrCalls[0].config.uri, + assert.equal( + xhrCalls[0].config.uri, 'provided-url', - 'made request to provided-url'); + 'made request to provided-url' + ); assert.deepEqual( xhrCalls[0].config.headers, { 'Content-Type': 'text/xml; charset=utf-8', 'SOAPAction': '"http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense"' }, - 'uses headers from message'); + 'uses headers from message' + ); assert.equal(xhrCalls[0].config.body, challengeElement, 'sends the challenge element'); assert.equal(xhrCalls[0].config.method, 'post', 'request is a post'); - assert.equal(xhrCalls[0].config.responseType, + assert.equal( + xhrCalls[0].config.responseType, 'arraybuffer', - 'responseType is an arraybuffer'); + 'responseType is an arraybuffer' + ); const response = { body: stringToArrayBuffer('key value') @@ -382,17 +405,21 @@ QUnit.test('makes request with provided url string on key message', function(ass xhrCalls[0].callback('an error', response, response.body); - assert.equal(errorMessage, + assert.equal( + errorMessage, 'Unable to request key from url: provided-url', - 'triggers mskeyerror on event bus when callback has an error'); + 'triggers mskeyerror on event bus when callback has an error' + ); assert.equal(this.session.keys.length, 0, 'no key added to session'); xhrCalls[0].callback(null, response, response.body); assert.equal(this.session.keys.length, 1, 'key added to session'); - assert.deepEqual(this.session.keys[0], + assert.deepEqual( + this.session.keys[0], new Uint8Array(response.body), - 'correct key added to session'); + 'correct key added to session' + ); videojs.xhr = origXhr; }); @@ -442,23 +469,30 @@ QUnit.test('makes request with provided url on key message', function(assert) { }); assert.equal(xhrCalls.length, 1, 'one xhr request'); - assert.equal(xhrCalls[0].config.uri, + assert.equal( + xhrCalls[0].config.uri, 'provided-url', - 'made request to provided-url'); + 'made request to provided-url' + ); assert.deepEqual( xhrCalls[0].config.headers, { 'Content-Type': 'text/xml; charset=utf-8', 'SOAPAction': '"http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense"' }, - 'uses headers from message'); + 'uses headers from message' + ); assert.equal(xhrCalls[0].config.body, challengeElement, 'sends the challenge element'); assert.equal(xhrCalls[0].config.method, 'post', 'request is a post'); - assert.equal(xhrCalls[0].config.responseType, + assert.equal( + xhrCalls[0].config.responseType, 'arraybuffer', - 'responseType is an arraybuffer'); - assert.equal(callCounts.licenseRequestAttempts, 0, - 'license request event not triggered (since no callback yet)'); + 'responseType is an arraybuffer' + ); + assert.equal( + callCounts.licenseRequestAttempts, 0, + 'license request event not triggered (since no callback yet)' + ); const response = { body: stringToArrayBuffer('key value') @@ -467,19 +501,25 @@ QUnit.test('makes request with provided url on key message', function(assert) { xhrCalls[0].callback('an error', response, response.body); assert.equal(callCounts.licenseRequestAttempts, 1, 'license request event triggered'); - assert.equal(errorMessage, + assert.equal( + errorMessage, 'Unable to request key from url: provided-url', - 'triggers mskeyerror on event bus when callback has an error'); + 'triggers mskeyerror on event bus when callback has an error' + ); assert.equal(this.session.keys.length, 0, 'no key added to session'); xhrCalls[0].callback(null, response, response.body); - assert.equal(callCounts.licenseRequestAttempts, 2, - 'second license request event triggered'); + assert.equal( + callCounts.licenseRequestAttempts, 2, + 'second license request event triggered' + ); assert.equal(this.session.keys.length, 1, 'key added to session'); - assert.deepEqual(this.session.keys[0], + assert.deepEqual( + this.session.keys[0], new Uint8Array(response.body), - 'correct key added to session'); + 'correct key added to session' + ); videojs.xhr = origXhr; }); diff --git a/test/playready.test.js b/test/playready.test.js index 6793879..7cc064a 100644 --- a/test/playready.test.js +++ b/test/playready.test.js @@ -20,7 +20,8 @@ QUnit.test('getMessageContents parses message contents', function(assert) { 'Content-Type': 'text/xml; charset=utf-8', 'SOAPAction': '"http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense"' }, - 'parses headers'); + 'parses headers' + ); assert.deepEqual(message, challengeElement, 'parses challenge element'); }); diff --git a/test/plugin.test.js b/test/plugin.test.js index 6b073cb..676965d 100644 --- a/test/plugin.test.js +++ b/test/plugin.test.js @@ -76,9 +76,11 @@ QUnit.test('exposes options', function(assert) { assert.notOk(this.player.eme.options, 'options is unavailable at start'); this.player.eme(); - assert.deepEqual(this.player.eme.options, + assert.deepEqual( + this.player.eme.options, {}, - 'options defaults to empty object once initialized'); + 'options defaults to empty object once initialized' + ); this.video = document.createElement('video'); this.video.setAttribute('data-setup', JSON.stringify({ @@ -93,12 +95,16 @@ QUnit.test('exposes options', function(assert) { this.player = videojs(this.video); assert.ok(this.player.eme.options, 'exposes options'); - assert.strictEqual(this.player.eme.options.applicationId, + assert.strictEqual( + this.player.eme.options.applicationId, 'application-id', - 'exposes applicationId'); - assert.strictEqual(this.player.eme.options.publisherId, + 'exposes applicationId' + ); + assert.strictEqual( + this.player.eme.options.publisherId, 'publisher-id', - 'exposes publisherId'); + 'exposes publisherId' + ); }); // skip test for Safari @@ -146,8 +152,10 @@ if (!window.WebKitMediaKeys) { this.player.eme.initializeMediaKeys(options, callback, true); setTimeout(() => { - assert.equal(this.player.error(), null, - 'no error called on player with suppressError = true'); + assert.equal( + this.player.error(), null, + 'no error called on player with suppressError = true' + ); done(); }); this.clock.tick(1); @@ -256,8 +264,10 @@ QUnit.test('initializeMediaKeys ms-prefix', function(assert) { // `error` will be called on the player 3 times, because a key session // error can't be suppressed on IE11 assert.equal(errors, 3, 'error called on player 3 times'); - assert.equal(this.player.error(), null, - 'no error called on player with suppressError = true'); + assert.equal( + this.player.error(), null, + 'no error called on player with suppressError = true' + ); window.MediaKeys = origMediaKeys; window.WebKitMediaKeys = origWebKitMediaKeys; done(); @@ -490,9 +500,11 @@ QUnit.test('handleMsNeedKeyEvent checks for required options', function(assert) options = { keySystems: { 'com.microsoft.notplayready': true } }; handleMsNeedKeyEvent(event, options, sessions, mockEventBus); - assert.equal(sessions.length, + assert.equal( + sessions.length, 0, - 'no session created when no proper PlayReady key system'); + 'no session created when no proper PlayReady key system' + ); options = { keySystems: { 'com.microsoft.playready': true } }; handleMsNeedKeyEvent(event, options, sessions, mockEventBus); @@ -538,15 +550,19 @@ QUnit.test('handleWebKitNeedKeyEvent checks for required options', function(asse options = { keySystems: {} }; handleWebKitNeedKeyEvent(event, options).then((val) => { - assert.equal(val, undefined, - 'resolves an empty promise when no FairPlay key system'); + assert.equal( + val, undefined, + 'resolves an empty promise when no FairPlay key system' + ); done(); }); options = { keySystems: { 'com.apple.notfps.1_0': {} } }; handleWebKitNeedKeyEvent(event, options).then((val) => { - assert.equal(val, undefined, - 'resolves an empty promise when no proper FairPlay key system'); + assert.equal( + val, undefined, + 'resolves an empty promise when no proper FairPlay key system' + ); done(); }); @@ -555,8 +571,10 @@ QUnit.test('handleWebKitNeedKeyEvent checks for required options', function(asse const promise = handleWebKitNeedKeyEvent(event, options); promise.catch((err) => { - assert.equal(err, 'Could not create key session', - 'expected error message'); + assert.equal( + err, 'Could not create key session', + 'expected error message' + ); done(); }); assert.ok(promise, 'returns promise when proper FairPlay key system'); @@ -582,28 +600,38 @@ QUnit.test('hasSession determines if a session exists', function(assert) { const initData = new Uint8Array([1, 2, 3]).buffer; assert.notOk(hasSession([], initData), 'false when no sessions'); - assert.ok(hasSession([{ initData }], initData), - 'true when initData is present in a session'); + assert.ok( + hasSession([{ initData }], initData), + 'true when initData is present in a session' + ); assert.ok( hasSession([ {}, { initData: new Uint8Array([1, 2, 3]).buffer } ], initData), - 'true when same initData contents present in a session'); - assert.notOk(hasSession([{ initData: new Uint8Array([1, 2]).buffer }], initData), - 'false when initData contents not present in a session'); + 'true when same initData contents present in a session' + ); + assert.notOk( + hasSession([{ initData: new Uint8Array([1, 2]).buffer }], initData), + 'false when initData contents not present in a session' + ); // cases outside of spec (where initData is not always an ArrayBuffer) assert.ok( hasSession([{ initData: new Uint8Array([1, 2, 3]) }], initData), - 'true even if session initData is a typed array and initData is an ArrayBuffer'); + 'true even if session initData is a typed array and initData is an ArrayBuffer' + ); assert.ok( - hasSession([{ initData: new Uint8Array([1, 2, 3]).buffer }], - new Uint8Array([1, 2, 3])), - 'true even if session initData is an ArrayBuffer and initData is a typed array'); + hasSession( + [{ initData: new Uint8Array([1, 2, 3]).buffer }], + new Uint8Array([1, 2, 3]) + ), + 'true even if session initData is an ArrayBuffer and initData is a typed array' + ); assert.ok( hasSession([{ initData: new Uint8Array([1, 2, 3]) }], new Uint8Array([1, 2, 3])), - 'true even if both session initData and initData are typed arrays'); + 'true even if both session initData and initData are typed arrays' + ); }); QUnit.test('setupSessions sets up sessions for new sources', function(assert) { @@ -613,8 +641,10 @@ QUnit.test('setupSessions sets up sessions for new sources', function(assert) { setupSessions(player); - assert.ok(Array.isArray(player.eme.sessions), - 'creates a sessions array when none exist'); + assert.ok( + Array.isArray(player.eme.sessions), + 'creates a sessions array when none exist' + ); assert.equal(player.eme.sessions.length, 0, 'sessions array is empty'); assert.equal(player.eme.activeSrc, 'some-src', 'set activeSrc property'); @@ -701,29 +731,39 @@ QUnit.test('removeSession removes sessions', function(assert) { }]; removeSession(sessions, initData2); - assert.deepEqual(sessions, + assert.deepEqual( + sessions, [{ initData: initData1 }, { initData: initData3 }], - 'removed session with initData'); + 'removed session with initData' + ); removeSession(sessions, null); - assert.deepEqual(sessions, + assert.deepEqual( + sessions, [{ initData: initData1 }, { initData: initData3 }], - 'does nothing when passed null'); + 'does nothing when passed null' + ); removeSession(sessions, new Uint8Array([6, 7, 8])); - assert.deepEqual(sessions, + assert.deepEqual( + sessions, [{ initData: initData1 }, { initData: initData3 }], - 'does nothing when passed non-matching initData'); + 'does nothing when passed non-matching initData' + ); removeSession(sessions, new Uint8Array([1, 2, 3])); - assert.deepEqual(sessions, + assert.deepEqual( + sessions, [{ initData: initData1 }, { initData: initData3 }], - 'did not remove session because initData is not the same reference'); + 'did not remove session because initData is not the same reference' + ); removeSession(sessions, initData1); - assert.deepEqual(sessions, + assert.deepEqual( + sessions, [{ initData: initData3 }], - 'removed session with initData'); + 'removed session with initData' + ); removeSession(sessions, initData3); assert.deepEqual(sessions, [], 'removed session with initData'); removeSession(sessions, initData2); diff --git a/test/utils.test.js b/test/utils.test.js index f6e0297..5e5d9aa 100644 --- a/test/utils.test.js +++ b/test/utils.test.js @@ -11,10 +11,12 @@ QUnit.module('utils'); QUnit.test('arrayBuffersEqual checks if two array buffers are equal', function(assert) { assert.ok( arrayBuffersEqual(new ArrayBuffer(3), new ArrayBuffer(3)), - 'same size empty array buffers are equal'); + 'same size empty array buffers are equal' + ); assert.notOk( arrayBuffersEqual(new ArrayBuffer(2), new ArrayBuffer(3)), - 'different size empty array buffers are not equal'); + 'different size empty array buffers are not equal' + ); const arrayBuffer = new ArrayBuffer(10); @@ -22,13 +24,16 @@ QUnit.test('arrayBuffersEqual checks if two array buffers are equal', function(a assert.ok( arrayBuffersEqual(new Uint8Array([1, 2, 3]).buffer, new Uint8Array([1, 2, 3]).buffer), - 'array buffers with same content are equal'); + 'array buffers with same content are equal' + ); assert.notOk( arrayBuffersEqual(new Uint8Array([1, 2, 3]).buffer, new Uint8Array([1, 2, 4]).buffer), - 'array buffers with different content are not equal'); + 'array buffers with different content are not equal' + ); assert.notOk( arrayBuffersEqual(new Uint8Array([1, 2, 3]).buffer, new Uint8Array([1, 2]).buffer), - 'array buffers with different content lengths are not equal'); + 'array buffers with different content lengths are not equal' + ); }); QUnit.test('arrayBufferFrom returns buffer from typed arrays', function(assert) {