diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..b94707787 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 000000000..c4229eede --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,130 @@ +{ + "env": { + "es6": true, + "browser": true, + "node": true, + "mocha": true +}, +"extends": [ + "google" +], + "rules": { + "no-with": 2, + "no-tabs": 0, + "camelcase": 0, + "max-len": 0, + "valid-jsdoc": 0, + "require-jsdoc": 0, + "no-invalid-this": 0, + "prefer-rest-params": 0, + "prefer-spread": 0, + "new-cap": 0, + "no-mixed-spaces-and-tabs": 2, + "no-multi-str": 2, + "no-multi-spaces": 2, + "one-var": [ + 2, + "never" + ], + "key-spacing": [ + 2, + { + "beforeColon": false, + "afterColon": true + } + ], + "space-unary-ops": [ + 2, + { + "words": false, + "nonwords": false + } + ], + "comma-spacing": [ + 2, + { + "before": false + } + ], + "semi-spacing": [ + 2, + { + "before": false, + "after": true + } + ], + "space-before-function-paren": [ + 2, + { + "anonymous": "ignore", + "named": "never" + } + ], + "space-in-parens": [ + 2, + "never" + ], + "comma-dangle": [ + 2, + "never" + ], + "no-trailing-spaces": 2, + "yoda": [ + 2, + "never" + ], + "comma-style": [ + 2, + "last" + ], + "curly": [ + 2, + "all" + ], + "brace-style": [ + 2, + "stroustrup", + { + "allowSingleLine": true + } + ], + "eol-last": 2, + "wrap-iife": 2, + "semi": [ + 2, + "always" + ], + "space-infix-ops": 2, + "keyword-spacing": [ + 2, + {} + ], + "spaced-comment": [ + 2, + "always" + ], + "space-before-blocks": [ + 2, + "always" + ], + "array-bracket-spacing": [ + 2, + "always" + ], + "consistent-this": [ + 2, + "self" + ], + "indent": [ + 2, + "tab", + { + "SwitchCase": 1 + } + ], + "linebreak-style": [ + 2, + "unix" + ] + } +} diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index f8731eb06..000000000 --- a/.jscsrc +++ /dev/null @@ -1,137 +0,0 @@ -{ - "disallowKeywords": [ - "eval", - "with" - ], - "disallowMixedSpacesAndTabs": true, - "disallowMultipleLineStrings": true, - "disallowMultipleSpaces": true, - "disallowMultipleVarDecl": true, - "disallowNewlineBeforeBlockStatements": true, - "disallowSpaceAfterObjectKeys": true, - "disallowSpaceAfterPrefixUnaryOperators": [ - "!", - "+", - "++", - "-", - "--", - "~" - ], - "disallowSpaceBeforeBinaryOperators": [ - "," - ], - "disallowSpaceBeforePostfixUnaryOperators": [ - "++", - "--", - ";" - ], - "disallowSpaceBeforeComma": true, - "disallowSpaceBeforeSemicolon": true, - "disallowSpacesInAnonymousFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInFunction": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInFunctionDeclaration": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInNamedFunctionExpression": { - "beforeOpeningRoundBrace": true - }, - "disallowSpacesInsideParentheses": true, - "disallowTrailingComma": true, - "disallowTrailingWhitespace": true, - "disallowYodaConditions": true, - "fileExtensions": [ - ".js" - ], - "requireBlocksOnNewline": true, - "requireCapitalizedConstructors": true, - "requireCommaBeforeLineBreak": true, - "requireCurlyBraces": [ - "catch", - "do", - "else", - "for", - "if", - "try", - "while" - ], - "requireKeywordsOnNewLine": [ - "else" - ], - "requireLineFeedAtFileEnd": true, - "requireLineBreakAfterVariableAssignment": true, - "requireParenthesesAroundIIFE": true, - "requireSemicolons": true, - "requireSpaceAfterBinaryOperators": [ - "!=", - "!==", - "*", - "+", - ",", - "-", - "/", - "=", - "==", - "===" - ], - "requireSpaceAfterKeywords": [ - "catch", - "do", - "else", - "for", - "if", - "return", - "switch", - "try", - "while" - ], - "requireSpaceAfterLineComment": true, - "requireSpaceBeforeBinaryOperators": [ - "!=", - "!==", - "*", - "+", - "-", - "/", - "=", - "==", - "===" - ], - "requireSpaceBeforeBlockStatements": true, - "requireSpacesInAnonymousFunctionExpression": { - "beforeOpeningCurlyBrace": true - }, - "requireSpacesInConditionalExpression": { - "afterConsequent": true, - "afterTest": true, - "beforeAlternate": true, - "beforeConsequent": true - }, - "requireSpacesInFunction": { - "beforeOpeningCurlyBrace": true - }, - "requireSpacesInFunctionDeclaration": { - "beforeOpeningCurlyBrace": true - }, - "requireSpacesInFunctionExpression": { - "beforeOpeningCurlyBrace": true - }, - "requireSpacesInNamedFunctionExpression": { - "beforeOpeningCurlyBrace": true - }, - "requireSpacesInsideArrayBrackets": "all", - "requireSpacesInsideObjectBrackets": "all", - "safeContextKeyword": [ - "self" - ], - "validateIndentation": "\t", - "validateLineBreaks": "LF", - "validateNewlineAfterArrayElements": true, - "validateParameterSeparator": ", " -} diff --git a/package-lock.json b/package-lock.json index 10d950c40..854474781 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,15 @@ "devDependencies": { "commitizen": "^4.3.0", "cz-customizable": "^7.0.0", + "eslint": "^8.47.0", + "eslint-closure": "^0.1.1", + "eslint-config-google": "^0.14.0", "falafel": "1.0.1", "google-closure-compiler": "^20230206.0.0", "google-closure-deps": "^20230103.0.0", "google-closure-library": "^20230103.0.0", "husky": "^8.0.0", "i": "^0.3.7", - "jscs": "2.0.0", "jsdom": "21.1.0", "jsdom-global": "3.0.2", "jshint": "^2.13.6", @@ -28,6 +30,15 @@ "sinon": "15.1.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", @@ -330,6 +341,190 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/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 + }, + "node_modules/@eslint/eslintrc/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/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 + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -443,6 +638,41 @@ "dev": true, "optional": true }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -642,47 +872,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/align-text/node_modules/longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/alter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", - "integrity": "sha512-Wuss6JIZ6h4j2+NgU2t+9mSwS7gBSZJbU4Dg8xETguAD2veJUSuCrvTIiC78QgZE7/zX7h6OnXw2PiiCBirEGw==", - "dev": true, - "dependencies": { - "stable": "~0.1.3" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -767,27 +956,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ast-traverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", - "integrity": "sha512-CPuE4BWIhJjsNMvFkrzjiBgOl56NJTuBPBkBqyRyfq/nZtx1Z1f5I+qx7G/Zt+FAOS+ABhghkEuWJrfW9Njjog==", - "dev": true - }, - "node_modules/ast-types": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", - "integrity": "sha512-rWhsoD0aHKpx+aKIP0Sf92bai1HC5iZcB1n/HCnkIMR8Bhx0gYRQySo062Y65ND4oRgcuxpLcPrcco09I1shpg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", - "dev": true - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -815,361 +983,83 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/babel-core": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", - "integrity": "sha512-aVoPuaEiJJ/vqFpYuGp3kHOrKeKciCkjDE/e9va3VoSPAe37Qc0+9AZ+gBgIMTu8V8reCt2lW809e8k1KJQdaQ==", - "dev": true, - "dependencies": { - "babel-plugin-constant-folding": "^1.0.1", - "babel-plugin-dead-code-elimination": "^1.0.2", - "babel-plugin-eval": "^1.0.1", - "babel-plugin-inline-environment-variables": "^1.0.1", - "babel-plugin-jscript": "^1.0.4", - "babel-plugin-member-expression-literals": "^1.0.1", - "babel-plugin-property-literals": "^1.0.1", - "babel-plugin-proto-to-assign": "^1.0.3", - "babel-plugin-react-constant-elements": "^1.0.3", - "babel-plugin-react-display-name": "^1.0.3", - "babel-plugin-remove-console": "^1.0.1", - "babel-plugin-remove-debugger": "^1.0.1", - "babel-plugin-runtime": "^1.0.7", - "babel-plugin-undeclared-variables-check": "^1.0.2", - "babel-plugin-undefined-to-void": "^1.1.6", - "babylon": "^5.8.38", - "bluebird": "^2.9.33", - "chalk": "^1.0.0", - "convert-source-map": "^1.1.0", - "core-js": "^1.0.0", - "debug": "^2.1.1", - "detect-indent": "^3.0.0", - "esutils": "^2.0.0", - "fs-readdir-recursive": "^0.1.0", - "globals": "^6.4.0", - "home-or-tmp": "^1.0.0", - "is-integer": "^1.0.4", - "js-tokens": "1.0.1", - "json5": "^0.4.0", - "lodash": "^3.10.0", - "minimatch": "^2.0.3", - "output-file-sync": "^1.1.0", - "path-exists": "^1.0.0", - "path-is-absolute": "^1.0.0", - "private": "^0.1.6", - "regenerator": "0.8.40", - "regexpu": "^1.3.0", - "repeating": "^1.1.2", - "resolve": "^1.1.6", - "shebang-regex": "^1.0.0", - "slash": "^1.0.0", - "source-map": "^0.5.0", - "source-map-support": "^0.2.10", - "to-fast-properties": "^1.0.0", - "trim-right": "^1.0.0", - "try-resolve": "^1.0.0" - } - }, - "node_modules/babel-core/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/babel-core/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/babel-core/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/babel-core/node_modules/detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha512-xo3WP66SNbr1Eim85s/qyH0ZL8PQUwp86HWm0S1l8WnJ/zjT6T3w1nwNA0yOZeuvOemupEYvpvF6BIdYRuERJQ==", + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - }, - "bin": { - "detect-indent": "cli.js" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/babel-core/node_modules/get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/babel-core/node_modules/lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", - "dev": true - }, - "node_modules/babel-core/node_modules/minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "brace-expansion": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/babel-core/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/babel-core/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/babel-jscs": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/babel-jscs/-/babel-jscs-2.0.5.tgz", - "integrity": "sha512-R0wGWn+Kbc10DVUCqSjKwjG0xJMGd3dIndw6p5teolBcndnohj5C3qgwwazsW6y5gAF2IkPMKSRwDK4sNh8BZA==", - "dev": true, - "dependencies": { - "babel-core": "~5.8.3", - "lodash.assign": "^3.2.0" - } - }, - "node_modules/babel-plugin-constant-folding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", - "integrity": "sha512-Rvhz9+o8/Bbqq6qTCO7FUPYxhrzqd/XkIY482DdYrXpFbhhqDu/xZZUd5/vYHV3oEE1poW+M10pjRZELDepwyQ==", - "dev": true - }, - "node_modules/babel-plugin-dead-code-elimination": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", - "integrity": "sha512-wbVXBByKqaaIL3+3a9bRSLAL0GYhQWYmQCWTaGTXOsqqe1Jhi+qaj8/H+yQ5GMiJhvYEQiawzOCjCS1dmjvE5g==", - "dev": true - }, - "node_modules/babel-plugin-eval": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", - "integrity": "sha512-Yu9H5PbQKGVp/O/BFXUUbHVIUzBeZtEL+Yk+Io8ND4NobQYW8eg/ztToMkn+1/dQrQjaOeFtiBKtkYBwWLvFhw==", - "dev": true - }, - "node_modules/babel-plugin-inline-environment-variables": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", - "integrity": "sha512-upNlt2GMmPkLMtJEQEqJB+Y1OeNs78W5+toLTYD/zotypPg0K2w79fFfmiee34ehvLwOZL7khxtkPU54IS1Kvw==", - "dev": true - }, - "node_modules/babel-plugin-jscript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", - "integrity": "sha512-eMT10ilWqWvBtGL70fFVciexOcjfPaeOHsyfp5OuumTFPSxla2kJTZuDzIpTbKspHVFyzCGxY6NpGJolfVywgQ==", - "dev": true - }, - "node_modules/babel-plugin-member-expression-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", - "integrity": "sha512-Ql/UCGOaA0nQP/9H0MfhFSn2U1m2mLsJFo76NDVBQry5uCDbF8++Uv4VyAtyQ8s6UHcoIKxepzRbZGl//X569w==", - "dev": true - }, - "node_modules/babel-plugin-property-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", - "integrity": "sha512-ZS1JuVJuo0j8IW2RRk8xA6MR/i14KIAhmDNHkipFn51uXe1S/hCH6u+V7TweF9aroT07F9PoxtENmuhFfVvq4g==", - "dev": true - }, - "node_modules/babel-plugin-proto-to-assign": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", - "integrity": "sha512-VY0VnODP15n5ORbJNFIQ0lzewhf+XqkcwbA5UpeeJ96/wIFmbvHK8fNAJoddHUuxl6b5hZtygVdSs3qwPAa/0A==", - "dev": true, - "dependencies": { - "lodash": "^3.9.3" - } - }, - "node_modules/babel-plugin-proto-to-assign/node_modules/lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", - "dev": true - }, - "node_modules/babel-plugin-react-constant-elements": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", - "integrity": "sha512-5vv5DJ8NB5kKzjD5tqnkbm0znmKBzDDKFz82zJKn4hFxs1Vwk3WolLN8RypRzlDsddNQPLuDS/0xHq/u/J6i7w==", - "dev": true - }, - "node_modules/babel-plugin-react-display-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", - "integrity": "sha512-IMO+IEvFKzZgLbmO+lGcoPKeD+pBg48T9p+ZgMbKkXyFvHk1pKeHsnhjV45GRxVBQC+SLYkmG7EHbXDWxfThOA==", - "dev": true - }, - "node_modules/babel-plugin-remove-console": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", - "integrity": "sha512-dNNqqYeRa0HpJbL+bXgSXeNnkgHbpLuU9o3040iyQjzHoTrIRUwltRWy1ZZgluuw/P0j1ukUOZsiudLLVRCmKw==", - "dev": true - }, - "node_modules/babel-plugin-remove-debugger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", - "integrity": "sha512-/rGQc8sgCVpTEeWQhHZShzQjANqWxpwxPlY3RkG9keK5+NKdA2U6ukfC/cySoSa1XmFwM6NBO67QWuOGR/DHrg==", - "dev": true - }, - "node_modules/babel-plugin-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", - "integrity": "sha512-tDVsSImhImOPIszO/6O4FhGW+o+PirMt53fkuBQ/plT41i2SRzTSnGvisrKtV/2jaAVSRnCiFwhN7v8dQ1Ymag==", - "dev": true - }, - "node_modules/babel-plugin-undeclared-variables-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", - "integrity": "sha512-NytRjvfh0DMsjUNaxOIROntf5c03PktIBQlTK6texdQZR7KhpeFxc2W8wGfF5LoJY13bHr2WnRY5xLZp6JXKOg==", - "dev": true, - "dependencies": { - "leven": "^1.0.2" - } - }, - "node_modules/babel-plugin-undefined-to-void": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", - "integrity": "sha512-YAi+mWX+Al08e6Isbv8g2UigZUoVnZuuF/JFmG5uAZKQ+6EYILBCFmS28BedM7Ts4QbAIpSqwXdMBzej+9tHUg==", - "dev": true - }, - "node_modules/babylon": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", - "integrity": "sha512-jtLAtIWCbI17buqCVN4/DtuHf3N1w9ZvbwrTWIae+EBSu2N3sVGCwSJeiZdAkTH4KRwinfMQIyoovP/xZtRwXQ==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -1184,12 +1074,6 @@ "node": ">=8" } }, - "node_modules/breakable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", - "integrity": "sha512-+ityJqcjhozQNrezzTd2dtH/lkIXmE52HL+FohK2TOLQDl3QURTNkim+2C0xcso4Zehq/HM4Wkumcdz7Ue+XmA==", - "dev": true - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -1247,24 +1131,10 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "optional": true, "engines": { "node": ">=6" } }, - "node_modules/center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "dev": true, - "dependencies": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1349,18 +1219,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", - "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", - "dev": true, - "dependencies": { - "colors": "1.0.3" - }, - "engines": { - "node": ">= 0.2.0" - } - }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -1467,15 +1325,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "node_modules/colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1488,24 +1337,6 @@ "node": ">= 0.8" } }, - "node_modules/commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", - "dev": true, - "dependencies": { - "graceful-readlink": ">= 1.0.0" - }, - "engines": { - "node": ">= 0.6.x" - } - }, - "node_modules/comment-parser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.0.tgz", - "integrity": "sha512-5uBGcGG2RfrzWY/22KPbxhr9tW4YMJHZ4U0JuAA71t0lQvh39uNvubkBeIH1J927nO30sbK6DwDe0D1Pqzlz+Q==", - "dev": true - }, "node_modules/commitizen": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz", @@ -1536,82 +1367,6 @@ "node": ">= 12" } }, - "node_modules/commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha512-3/qHkNMM6o/KGXHITA14y78PcfmXh4+AOCJpSoF73h4VY1JpdGv3CHMS5+JW6SwLhfJt4RhNmLAa7+RRX/62EQ==", - "dev": true, - "dependencies": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "bin": { - "commonize": "bin/commonize" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commoner/node_modules/ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commoner/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/commoner/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/commoner/node_modules/recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA==", - "dev": true, - "dependencies": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1633,19 +1388,6 @@ "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", "dev": true }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -1735,15 +1477,6 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, - "node_modules/cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/cz-conventional-changelog": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", @@ -1987,24 +1720,6 @@ "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", "dev": true }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", @@ -2017,41 +1732,6 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "node_modules/deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2095,76 +1775,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", - "integrity": "sha512-KgGV1vmSa2UPKeDXaWE5FiXjix8BOtYMgiPGpYhd/42wxiC6YGwtscj/zU9gD5/xk4K2iLDpyGhGA5puZxaeMg==", - "dev": true, - "dependencies": { - "alter": "~0.2.0", - "ast-traverse": "~0.1.1", - "breakable": "~1.0.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2", - "yargs": "~3.27.0" - }, - "bin": { - "defs": "build/es5/defs" - } - }, - "node_modules/defs/node_modules/camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defs/node_modules/cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "dev": true, - "dependencies": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "node_modules/defs/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "node_modules/defs/node_modules/yargs": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", - "integrity": "sha512-6atYjGACjX/OYWico7LwdBx9eiGlkMnIw6OwqfBb+uJQpaT82tQ7oI+BI6Dvq62qZvSbzGzQCVLQdMd59tR2eA==", - "dev": true, - "dependencies": { - "camelcase": "^1.2.1", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2192,28 +1802,6 @@ "node": ">=8" } }, - "node_modules/detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "dev": true, - "dependencies": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - } - }, - "node_modules/detective/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -2223,6 +1811,18 @@ "node": ">=0.3.1" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -2372,32 +1972,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -2501,193 +2075,640 @@ "node": ">=0.10.0" } }, - "node_modules/esprima": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.4.1.tgz", - "integrity": "sha512-oQ5niex1XEkpjZhmW1zsozCG515481U0s+A1n6xU9usjkLSy7ZDvfuaAR+CKAKujczvEy7sOPIiX/GO+MZPk8Q==", - "dev": true, + "node_modules/eslint": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=0.4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha512-m7OsYzocA8OQ3+9CxmhIv7NPHtyDR2ixaLCO7kLZ+YH+xQ/BpaZmll9EXmc+kBxzWA8BRBXbNEuEQqQ6vfsgDw==", + "node_modules/eslint-closure": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-closure/-/eslint-closure-0.1.1.tgz", + "integrity": "sha512-vJTqfW4Ox4NqwtnkYCOUaCIR9tkOjkxiaLAO47jtJgoCyYYoSEXSnUpEB+ZwVQ0DJ3QW8ZObzOZVC2DkWrbPsg==", + "dev": true + }, + "node_modules/eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { - "node": ">=0.4.0" + "node": ">=0.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=4.0" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">= 0.8.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { - "homedir-polyfill": "^1.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" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/eslint/node_modules/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, "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "> 0.1.90" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/falafel": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.0.1.tgz", - "integrity": "sha512-i4ivKUn2yygW8AY/6OJSg6RnkLLyJCCfqbZR3lfyqeekXipXhY6vD3geUW1REyWpFF8OM1FrvPbFdzIWBgOLcQ==", + "node_modules/eslint/node_modules/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, "dependencies": { - "acorn": "~0.11.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.4.0" + "node": ">=7.0.0" } }, - "node_modules/fast-deep-equal": { - "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, - "optional": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "node_modules/eslint/node_modules/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 }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/eslint/node_modules/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, "dependencies": { - "escape-string-regexp": "^1.0.5" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { - "to-regex-range": "^5.0.1" + "ms": "2.1.2" }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/find-config": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-config/-/find-config-1.0.0.tgz", - "integrity": "sha512-Z+suHH+7LSE40WfUeZPIxSxypCWvrzdVc60xAjUShZeT5eMWM0/FQUduq3HjluyfAHWvC/aOBkT1pTZktyF/jg==", + "node_modules/eslint/node_modules/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, - "dependencies": { - "user-home": "^2.0.0" - }, "engines": { - "node": ">= 0.12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-node-modules": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", - "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "dependencies": { - "findup-sync": "^4.0.0", - "merge": "^2.1.1" + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", - "dev": true - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/eslint/node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up/node_modules/path-exists": { + "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/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 + }, + "node_modules/eslint/node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "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, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/falafel": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.0.1.tgz", + "integrity": "sha512-i4ivKUn2yygW8AY/6OJSg6RnkLLyJCCfqbZR3lfyqeekXipXhY6vD3geUW1REyWpFF8OM1FrvPbFdzIWBgOLcQ==", + "dev": true, + "dependencies": { + "acorn": "~0.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fast-deep-equal": { + "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 + }, + "node_modules/fast-json-stable-stringify": { + "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 + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "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, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-config/-/find-config-1.0.0.tgz", + "integrity": "sha512-Z+suHH+7LSE40WfUeZPIxSxypCWvrzdVc60xAjUShZeT5eMWM0/FQUduq3HjluyfAHWvC/aOBkT1pTZktyF/jg==", + "dev": true, + "dependencies": { + "user-home": "^2.0.0" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/find-node-modules": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz", + "integrity": "sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==", + "dev": true, + "dependencies": { + "findup-sync": "^4.0.0", + "merge": "^2.1.1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { @@ -2718,6 +2739,41 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -2756,12 +2812,6 @@ "node": ">=10" } }, - "node_modules/fs-readdir-recursive": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", - "integrity": "sha512-//yfxmYAazrsyb/rgeYDNFXFTuPYTGYirp5QHFSH8h/LaNUoP5bQAa2ikstdK1PR/bFd1CIlQLpUq6/u6UVfSw==", - "dev": true - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2839,15 +2889,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stdin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-3.0.2.tgz", - "integrity": "sha512-jpAk+A3NUGL/O4N3pwG1Ld3PDqOxTkuAA/HoVHwutXsqW/qYcc4YSgccFpPlg/qbNhZ33ybFhJjbJqRZhryolQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -2939,15 +2980,6 @@ "node": ">=0.10.0" } }, - "node_modules/globals": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", - "integrity": "sha512-Lh7H0bYRNBMc2CapY+TYsCzcSM4HWHGFoQORuEcePk3y3IhpaZmFSJDirhNYSwq8QeHvaCqV/tHI2bdUhYryuw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", @@ -3144,10 +3176,10 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/has": { @@ -3162,27 +3194,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -3261,31 +3272,6 @@ "he": "bin/he" } }, - "node_modules/home-or-tmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", - "integrity": "sha512-6LKQZpR6gk8uJ3mXbBkyOumsA24BUk9CH/79ivZ8Kk1urzlXNGZBoAMuieC/YzwCyGBVqq+uCNUpA1JS6glrxg==", - "dev": true, - "dependencies": { - "os-tmpdir": "^1.0.1", - "user-home": "^1.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/home-or-tmp/node_modules/user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", - "dev": true, - "bin": { - "user-home": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -3458,12 +3444,20 @@ } ] }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/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, - "optional": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3480,11 +3474,19 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "optional": true, "engines": { "node": ">=4" } }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -3617,31 +3619,6 @@ "node": ">= 0.4" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -3702,12 +3679,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -3756,18 +3727,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -3789,15 +3748,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-integer": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", - "integrity": "sha512-RPQc/s9yBHSvpi+hs9dYiJ2cuFeU6x3TyyIp8O2H6SKEltIvJOzRj9ToyvcStDvPR/pS4rxgr1oBFajQjZ2Szg==", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -3807,15 +3757,6 @@ "node": ">=8" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -3852,6 +3793,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -3883,15 +3833,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -3971,15 +3912,6 @@ "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", "dev": true }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -3992,19 +3924,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -4026,12 +3945,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, "node_modules/jackspeak": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", @@ -4047,187 +3960,21 @@ "url": "https://github.com/sponsors/isaacs" }, "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/js-tokens": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", - "integrity": "sha512-WKqed1YxjsT7sGqM2IdbkJHnA3rXHqFqN+4xUy973UeYNjSXZCKM3G/zUmPNYut/6D9QCUbqegDmUCQRdm0lnQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jscs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jscs/-/jscs-2.0.0.tgz", - "integrity": "sha512-0hIzudZAsGi3Dq/Ni0xIqzvm58ivk8XMDwFQ0QnBoctTENHsjukDvYQk+yVWZxQiX173oyCHNFGZzQFkQAPANQ==", - "deprecated": "JSCS has merged with ESLint! See - https://medium.com/@markelog/jscs-end-of-the-line-bc9bf0b3fdb2", - "dev": true, - "dependencies": { - "babel-core": "^5.6.15", - "babel-jscs": "^2.0.0", - "chalk": "~1.1.0", - "cli-table": "~0.3.1", - "commander": "~2.8.1", - "esprima": "~2.4.0", - "estraverse": "^4.1.0", - "exit": "~0.1.2", - "glob": "^5.0.1", - "jscs-jsdoc": "1.1.0", - "lodash.assign": "~3.2.0", - "minimatch": "~2.0.1", - "pathval": "~0.1.1", - "prompt": "~0.2.14", - "reserved-words": "^0.1.1", - "strip-json-comments": "~1.0.2", - "to-double-quotes": "^1.0.0", - "to-single-quotes": "^1.0.2", - "vow": "~0.4.8", - "vow-fs": "~0.3.4", - "xmlbuilder": "^2.6.1" - }, - "bin": { - "jscs": "bin/jscs" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/jscs-jsdoc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-1.1.0.tgz", - "integrity": "sha512-UA+ZhX+no2AeqJGZU92tBnOVlsBACGopGzWR7MK3YI1l6ZZlGlWc4k5f5oUZ7xOQTrYdUZCbT0tki9I52B6/JQ==", - "dev": true, - "dependencies": { - "comment-parser": "0.3.0", - "jsdoctypeparser": "~1.2.0" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/jscs/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jscs/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jscs/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jscs/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jscs/node_modules/minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", - "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", - "dev": true, - "dependencies": { - "brace-expansion": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jscs/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jscs/node_modules/strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", - "dev": true, - "bin": { - "strip-json-comments": "cli.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jscs/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jsdoctypeparser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz", - "integrity": "sha512-osXm4Fr1o/Jc0YwUM7DHUliYtaunLQxh4ynZgtN02mTUN1VsNbMy75DFSkKRne8xE8jiGRV9NKVhYYYa8ZIHXQ==", + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "lodash": "^3.7.0" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdoctypeparser/node_modules/lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", - "dev": true - }, "node_modules/jsdom": { "version": "21.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz", @@ -4336,6 +4083,12 @@ "node": ">=0.8.0" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -4356,14 +4109,11 @@ "dev": true, "optional": true }, - "node_modules/json5": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha512-5EEuuI7oad0d6c2PcrTRLoLH2JNuI/aJxHsVT2hVFK6fKHu+MXONdhzzzNAlb3JXMeuN1o+kDU78fV1YH6VmKQ==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - } + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/jsonfile": { "version": "6.1.0", @@ -4383,49 +4133,13 @@ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/leven": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", - "integrity": "sha512-U3eIzC2mMAOMOuoJ25sA3eyraoBwndpQyYgBq5dyqrMTpvMg9l9X/ucFHxv622YcCg179WWqleoF7rSzfYrV+Q==", - "dev": true, - "bin": { - "leven": "cli.js" - }, - "engines": { - "node": ">=0.10.0" + "json-buffer": "3.0.1" } }, "node_modules/levn": { @@ -4506,80 +4220,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "node_modules/lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", - "dev": true, - "dependencies": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", - "dev": true - }, - "node_modules/lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", - "dev": true - }, - "node_modules/lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", - "dev": true, - "dependencies": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "dev": true - }, - "node_modules/lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", - "dev": true - }, - "node_modules/lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", - "dev": true, - "dependencies": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "dev": true - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -4587,17 +4233,6 @@ "dev": true, "optional": true }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", - "dev": true, - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", @@ -4608,8 +4243,7 @@ "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, - "optional": true + "dev": true }, "node_modules/lodash.mergewith": { "version": "4.6.2", @@ -4618,12 +4252,6 @@ "dev": true, "optional": true }, - "node_modules/lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", - "dev": true - }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -4991,12 +4619,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -5015,14 +4637,11 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha512-PfGU8jYWdRl4FqJfCy0IzbkGyFHntfWygZg46nFk/dJD/XRrk2cj0SsKSX9n5u5gE0E0YfEpKWrEkfjnlZSTXA==", - "dev": true, - "bin": { - "ncp": "bin/ncp" - } + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/nice-try": { "version": "1.0.5", @@ -5104,15 +4723,6 @@ "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", "dev": true }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -5122,22 +4732,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -5308,18 +4902,6 @@ "node": ">=0.10.0" } }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "dev": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -5329,17 +4911,6 @@ "node": ">=0.10.0" } }, - "node_modules/output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha512-uQLlclru4xpCi+tfs80l3QF24KL81X57ELNMy7W/dox+JTtxUf1bLyQ8968fFCmSqqbokjW0kn+WBIlO+rSkNg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -5375,7 +4946,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "optional": true, "dependencies": { "callsites": "^3.0.0" }, @@ -5435,15 +5005,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha512-BD2vrQBPFI3VkVKzTrOmaG2WtPQoduNXu1A5tLYMOW8RN6G9CdhdSkmw+ljxUkJcj4pbXQGw0lzl7MFLnhba9Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -5512,12 +5073,6 @@ "node": ">=8" } }, - "node_modules/pathval": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", - "integrity": "sha512-2AJyCGXy4VsZ2wa0TmMoL93KtWshxWQAMuuAG+7/Q3kth9uRDV38cMZTaSCsrTDJEwV8QbIHad+3E673s1ZY0A==", - "dev": true - }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -5551,15 +5106,6 @@ "node": ">=4" } }, - "node_modules/pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/precommit-hook": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/precommit-hook/-/precommit-hook-1.0.7.tgz", @@ -5584,37 +5130,12 @@ "node": ">= 0.8.0" } }, - "node_modules/private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "node_modules/prompt": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "integrity": "sha512-jDK5yEbAakJmNm+260gZG1+PuzX3jT5Jy0VZAUGrrW9RQ1JEWEDEVNnhO70mL3+U5r6bSJo02xsE34wOS/LnrA==", - "dev": true, - "dependencies": { - "pkginfo": "0.x.x", - "read": "1.0.x", - "revalidator": "0.1.x", - "utile": "0.2.x", - "winston": "0.8.x" - }, - "engines": { - "node": ">= 0.6.6" - } - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -5630,22 +5151,32 @@ "node": ">=6" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5655,18 +5186,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -5717,47 +5236,6 @@ "node": ">=8.10.0" } }, - "node_modules/recast": { - "version": "0.10.33", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", - "integrity": "sha512-RxAVgvgWGzfFYsdc3PB6TM4/cq8HMgBH8PC9r+SkO7j1MeHZvIMxLSVlUhin3sv9wbAy8CMAPXSGSGkWPovyKQ==", - "dev": true, - "dependencies": { - "ast-types": "0.8.12", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "source-map": "~0.5.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerator": { - "version": "0.8.40", - "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", - "integrity": "sha512-NsE91xz22nl5JsAwE5kZNmaMaK6g4HipZaGhrQJeVo8DsTwYYONx0TYEm8+7kFIODeuLNQpRsomV1CChmEY5Yg==", - "dev": true, - "dependencies": { - "commoner": "~0.10.3", - "defs": "~1.1.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "recast": "0.10.33", - "through": "~2.3.8" - }, - "bin": { - "regenerator": "bin/regenerator" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", @@ -5775,92 +5253,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpu": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", - "integrity": "sha512-OqpQCTCcVM6k9IbzxLjNN6TRj3NV7qF4L8zUqsNoeAmmIZp8wH1tdZnn0vNXE2tGNU4ho0xTZWk3FmahOtyMRA==", - "dev": true, - "dependencies": { - "esprima": "^2.6.0", - "recast": "^0.10.10", - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - }, - "bin": { - "regexpu": "bin/regexpu" - } - }, - "node_modules/regexpu/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha512-Nh30JLeMHdoI+AsQ5eblhZ7YlTsM9wiJQe/AHIunlK3KWzvXhXb36IJ7K1IOeRjIOtzMjdUHjwXUFxKJoPTSOg==", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "bin": { - "repeating": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/replace-ext": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", @@ -5895,12 +5293,6 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "node_modules/reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==", - "dev": true - }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", @@ -5967,24 +5359,13 @@ "node": ">=8" } }, - "node_modules/revalidator": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "dependencies": { - "align-text": "^0.1.1" - }, "engines": { + "iojs": ">=1.0.0", "node": ">=0.10.0" } }, @@ -6148,6 +5529,29 @@ "node": ">=0.12.0" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -6277,18 +5681,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/simple-fmt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", - "integrity": "sha512-9a3zTDDh9LXbTR37qBhACWIQ/mP/ry5xtmbE98BJM8GR02sanCkfMzp7AdCTqYhkBZggK/w7hJtc8Pb9nmo16A==", - "dev": true - }, - "node_modules/simple-is": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", - "integrity": "sha512-GJXhv3r5vdj5tGWO+rcrWgjU2azLB+fb7Ehh3SmZpXE0o4KrrFLti0w4mdDCbR29X/z0Ls20ApjZitlpAXhAeg==", - "dev": true - }, "node_modules/sinon": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.1.0.tgz", @@ -6337,15 +5729,6 @@ "node": ">=8" } }, - "node_modules/slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -6355,27 +5738,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha512-gGKOSat73z0V8wBKo9AGxZZyekczBireh1hHktbt+kb9acsCB5OfVCF2DCWlztcQ3r5oNN7f2BL0B2xOcoJ/DQ==", - "dev": true, - "dependencies": { - "source-map": "0.1.32" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==", - "dev": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -6408,34 +5770,6 @@ "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -6533,18 +5867,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stringmap": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", - "integrity": "sha512-mR1LEHDw6TsHa+LwJeeBc9ZqZqEOm7bHidgxMmDg8HB/rbA1HhDeT08gS67CCCG/xrgIfQx5tW42pd8vFpLUow==", - "dev": true - }, - "node_modules/stringset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", - "integrity": "sha512-km3jeiRpmySChl1oLiBE2ESdG5k/4+6tjENVL6BB3mdmKBiUikI5ks4paad2WAKsxzpNiBqBBbXCC12QqlpLWA==", - "dev": true - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -6646,6 +5968,12 @@ "rimraf": "bin.js" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -6664,30 +5992,6 @@ "node": ">=0.6.0" } }, - "node_modules/to-double-quotes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-1.0.2.tgz", - "integrity": "sha512-nNlLjQWahkAajfyrYpgN16a4/ujmBg9PGUn77yQi3Usz/GifqPte1yPpRHEE2KdkNelDOGOGC8Qb8EbLR7vUcQ==", - "dev": true, - "dependencies": { - "get-stdin": "^3.0.0" - }, - "bin": { - "to-double-quotes": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6700,21 +6004,6 @@ "node": ">=8.0" } }, - "node_modules/to-single-quotes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-1.0.4.tgz", - "integrity": "sha512-3TQ2QHI8HxTWZlXbux5osZIB4n/tbLQa5gxB7IB/iO8KYSGbhUrkWxZmDqB2V6yj2ePXSCiqUtU5viKu+x7P/Q==", - "dev": true, - "dependencies": { - "get-stdin": "^3.0.0" - }, - "bin": { - "to-single-quotes": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tough-cookie": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", @@ -6751,27 +6040,6 @@ "node": ">=12" } }, - "node_modules/trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/try-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", - "integrity": "sha512-yHeaPjCBzVaXwWl5IMUapTaTC2rn/eBYg2fsG2L+CvJd+ttFbk0ylDnpTO3wVhosmE1tQEvcebbBeKLCwScQSQ==", - "dev": true - }, - "node_modules/tryor": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", - "integrity": "sha512-2+ilNA00DGvbUYYbRrm3ux+snbo7I6uPXMw8I4p/QMl7HUOWBBZFbk+Mpr8/IAPDQE+LQ8vOdlI6xEzjc+e/BQ==", - "dev": true - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -6935,7 +6203,6 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "optional": true, "dependencies": { "punycode": "^2.1.0" } @@ -6968,35 +6235,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/utile": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "integrity": "sha512-ltfvuCJNa/JFOhKBBiQ9qDyyFwLstoMMO1ru0Yg/Mcl8dp1Z3IBaL7n+5dHpyma+d3lCogkgBQnWKtGxzNyqhg==", - "dev": true, - "dependencies": { - "async": "~0.2.9", - "deep-equal": "*", - "i": "0.3.x", - "mkdirp": "0.x.x", - "ncp": "0.4.x", - "rimraf": "2.x.x" - }, - "engines": { - "node": ">= 0.6.4" - } - }, - "node_modules/utile/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -7040,49 +6278,6 @@ "source-map": "^0.5.1" } }, - "node_modules/vow": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.20.tgz", - "integrity": "sha512-YYoSYXUYABqY08D/WrjcWJxJSErcILRRTQpcPyUc0SFfgIPKSUFzVt7u1HC3TXGJZM/qhsSjCLNQstxqf7asgQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vow-fs": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.6.tgz", - "integrity": "sha512-oK9rtqJSHy7ZQAhAtVU0HiF/oVhm0A4Qx2l2DyyFBUsXbTXUg258EsQGLLIXYZnE5MYaInZLgA6l/10je/EamA==", - "dev": true, - "dependencies": { - "glob": "^7.0.5", - "uuid": "^2.0.2", - "vow": "^0.4.7", - "vow-queue": "^0.4.1" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/vow-fs/node_modules/uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true - }, - "node_modules/vow-queue": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.3.tgz", - "integrity": "sha512-/poAKDTFL3zYbeQg7cl4BGcfP4sGgXKrHnRFSKj97dteUFu8oyXMwIcdwu8NSx/RmPGIuYx1Bik/y5vU4H/VKw==", - "dev": true, - "dependencies": { - "vow": "^0.4.17" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -7187,21 +6382,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", @@ -7222,54 +6402,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", - "dev": true, - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha512-fPoamsHq8leJ62D1M9V/f15mjQ1UHe4+7j1wpAT3fqgA5JqhJkk4aIfPEjfMTI9x6ZTjaLOpMAjluLtmgO5b6g==", - "dev": true, - "dependencies": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "pkginfo": "0.3.x", - "stack-trace": "0.0.x" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/winston/node_modules/colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/winston/node_modules/pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -7279,15 +6411,6 @@ "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -7431,24 +6554,6 @@ "node": ">=12" } }, - "node_modules/xmlbuilder": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-2.6.5.tgz", - "integrity": "sha512-Ehby0RBBPAQAef3zP1636SPzwcfepVu69dmyCMkFioYOw/a6CULZbkRn8MCsVFzakt3+Zv23hecYdEsps9fRBQ==", - "dev": true, - "dependencies": { - "lodash": "^3.5.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/xmlbuilder/node_modules/lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", - "dev": true - }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -7554,6 +6659,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@babel/code-frame": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", @@ -7795,6 +6906,134 @@ } } }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "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": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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 + }, + "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 + } + } + }, + "@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -7874,6 +7113,32 @@ "dev": true, "optional": true }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -8043,40 +7308,6 @@ "uri-js": "^4.2.2" } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", - "dev": true - } - } - }, - "alter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/alter/-/alter-0.2.0.tgz", - "integrity": "sha512-Wuss6JIZ6h4j2+NgU2t+9mSwS7gBSZJbU4Dg8xETguAD2veJUSuCrvTIiC78QgZE7/zX7h6OnXw2PiiCBirEGw==", - "dev": true, - "requires": { - "stable": "~0.1.3" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true - }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -8140,24 +7371,6 @@ "is-array-buffer": "^3.0.1" } }, - "ast-traverse": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", - "integrity": "sha512-CPuE4BWIhJjsNMvFkrzjiBgOl56NJTuBPBkBqyRyfq/nZtx1Z1f5I+qx7G/Zt+FAOS+ABhghkEuWJrfW9Njjog==", - "dev": true - }, - "ast-types": { - "version": "0.8.12", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", - "integrity": "sha512-rWhsoD0aHKpx+aKIP0Sf92bai1HC5iZcB1n/HCnkIMR8Bhx0gYRQySo062Y65ND4oRgcuxpLcPrcco09I1shpg==", - "dev": true - }, - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -8176,254 +7389,6 @@ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, - "babel-core": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", - "integrity": "sha512-aVoPuaEiJJ/vqFpYuGp3kHOrKeKciCkjDE/e9va3VoSPAe37Qc0+9AZ+gBgIMTu8V8reCt2lW809e8k1KJQdaQ==", - "dev": true, - "requires": { - "babel-plugin-constant-folding": "^1.0.1", - "babel-plugin-dead-code-elimination": "^1.0.2", - "babel-plugin-eval": "^1.0.1", - "babel-plugin-inline-environment-variables": "^1.0.1", - "babel-plugin-jscript": "^1.0.4", - "babel-plugin-member-expression-literals": "^1.0.1", - "babel-plugin-property-literals": "^1.0.1", - "babel-plugin-proto-to-assign": "^1.0.3", - "babel-plugin-react-constant-elements": "^1.0.3", - "babel-plugin-react-display-name": "^1.0.3", - "babel-plugin-remove-console": "^1.0.1", - "babel-plugin-remove-debugger": "^1.0.1", - "babel-plugin-runtime": "^1.0.7", - "babel-plugin-undeclared-variables-check": "^1.0.2", - "babel-plugin-undefined-to-void": "^1.1.6", - "babylon": "^5.8.38", - "bluebird": "^2.9.33", - "chalk": "^1.0.0", - "convert-source-map": "^1.1.0", - "core-js": "^1.0.0", - "debug": "^2.1.1", - "detect-indent": "^3.0.0", - "esutils": "^2.0.0", - "fs-readdir-recursive": "^0.1.0", - "globals": "^6.4.0", - "home-or-tmp": "^1.0.0", - "is-integer": "^1.0.4", - "js-tokens": "1.0.1", - "json5": "^0.4.0", - "lodash": "^3.10.0", - "minimatch": "^2.0.3", - "output-file-sync": "^1.1.0", - "path-exists": "^1.0.0", - "path-is-absolute": "^1.0.0", - "private": "^0.1.6", - "regenerator": "0.8.40", - "regexpu": "^1.3.0", - "repeating": "^1.1.2", - "resolve": "^1.1.6", - "shebang-regex": "^1.0.0", - "slash": "^1.0.0", - "source-map": "^0.5.0", - "source-map-support": "^0.2.10", - "to-fast-properties": "^1.0.0", - "trim-right": "^1.0.0", - "try-resolve": "^1.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "detect-indent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", - "integrity": "sha512-xo3WP66SNbr1Eim85s/qyH0ZL8PQUwp86HWm0S1l8WnJ/zjT6T3w1nwNA0yOZeuvOemupEYvpvF6BIdYRuERJQ==", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "minimist": "^1.1.0", - "repeating": "^1.1.0" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", - "dev": true - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - } - } - }, - "babel-jscs": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/babel-jscs/-/babel-jscs-2.0.5.tgz", - "integrity": "sha512-R0wGWn+Kbc10DVUCqSjKwjG0xJMGd3dIndw6p5teolBcndnohj5C3qgwwazsW6y5gAF2IkPMKSRwDK4sNh8BZA==", - "dev": true, - "requires": { - "babel-core": "~5.8.3", - "lodash.assign": "^3.2.0" - } - }, - "babel-plugin-constant-folding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", - "integrity": "sha512-Rvhz9+o8/Bbqq6qTCO7FUPYxhrzqd/XkIY482DdYrXpFbhhqDu/xZZUd5/vYHV3oEE1poW+M10pjRZELDepwyQ==", - "dev": true - }, - "babel-plugin-dead-code-elimination": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", - "integrity": "sha512-wbVXBByKqaaIL3+3a9bRSLAL0GYhQWYmQCWTaGTXOsqqe1Jhi+qaj8/H+yQ5GMiJhvYEQiawzOCjCS1dmjvE5g==", - "dev": true - }, - "babel-plugin-eval": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", - "integrity": "sha512-Yu9H5PbQKGVp/O/BFXUUbHVIUzBeZtEL+Yk+Io8ND4NobQYW8eg/ztToMkn+1/dQrQjaOeFtiBKtkYBwWLvFhw==", - "dev": true - }, - "babel-plugin-inline-environment-variables": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", - "integrity": "sha512-upNlt2GMmPkLMtJEQEqJB+Y1OeNs78W5+toLTYD/zotypPg0K2w79fFfmiee34ehvLwOZL7khxtkPU54IS1Kvw==", - "dev": true - }, - "babel-plugin-jscript": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", - "integrity": "sha512-eMT10ilWqWvBtGL70fFVciexOcjfPaeOHsyfp5OuumTFPSxla2kJTZuDzIpTbKspHVFyzCGxY6NpGJolfVywgQ==", - "dev": true - }, - "babel-plugin-member-expression-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", - "integrity": "sha512-Ql/UCGOaA0nQP/9H0MfhFSn2U1m2mLsJFo76NDVBQry5uCDbF8++Uv4VyAtyQ8s6UHcoIKxepzRbZGl//X569w==", - "dev": true - }, - "babel-plugin-property-literals": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", - "integrity": "sha512-ZS1JuVJuo0j8IW2RRk8xA6MR/i14KIAhmDNHkipFn51uXe1S/hCH6u+V7TweF9aroT07F9PoxtENmuhFfVvq4g==", - "dev": true - }, - "babel-plugin-proto-to-assign": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", - "integrity": "sha512-VY0VnODP15n5ORbJNFIQ0lzewhf+XqkcwbA5UpeeJ96/wIFmbvHK8fNAJoddHUuxl6b5hZtygVdSs3qwPAa/0A==", - "dev": true, - "requires": { - "lodash": "^3.9.3" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", - "dev": true - } - } - }, - "babel-plugin-react-constant-elements": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", - "integrity": "sha512-5vv5DJ8NB5kKzjD5tqnkbm0znmKBzDDKFz82zJKn4hFxs1Vwk3WolLN8RypRzlDsddNQPLuDS/0xHq/u/J6i7w==", - "dev": true - }, - "babel-plugin-react-display-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", - "integrity": "sha512-IMO+IEvFKzZgLbmO+lGcoPKeD+pBg48T9p+ZgMbKkXyFvHk1pKeHsnhjV45GRxVBQC+SLYkmG7EHbXDWxfThOA==", - "dev": true - }, - "babel-plugin-remove-console": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", - "integrity": "sha512-dNNqqYeRa0HpJbL+bXgSXeNnkgHbpLuU9o3040iyQjzHoTrIRUwltRWy1ZZgluuw/P0j1ukUOZsiudLLVRCmKw==", - "dev": true - }, - "babel-plugin-remove-debugger": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", - "integrity": "sha512-/rGQc8sgCVpTEeWQhHZShzQjANqWxpwxPlY3RkG9keK5+NKdA2U6ukfC/cySoSa1XmFwM6NBO67QWuOGR/DHrg==", - "dev": true - }, - "babel-plugin-runtime": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", - "integrity": "sha512-tDVsSImhImOPIszO/6O4FhGW+o+PirMt53fkuBQ/plT41i2SRzTSnGvisrKtV/2jaAVSRnCiFwhN7v8dQ1Ymag==", - "dev": true - }, - "babel-plugin-undeclared-variables-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", - "integrity": "sha512-NytRjvfh0DMsjUNaxOIROntf5c03PktIBQlTK6texdQZR7KhpeFxc2W8wGfF5LoJY13bHr2WnRY5xLZp6JXKOg==", - "dev": true, - "requires": { - "leven": "^1.0.2" - } - }, - "babel-plugin-undefined-to-void": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", - "integrity": "sha512-YAi+mWX+Al08e6Isbv8g2UigZUoVnZuuF/JFmG5uAZKQ+6EYILBCFmS28BedM7Ts4QbAIpSqwXdMBzej+9tHUg==", - "dev": true - }, - "babylon": { - "version": "5.8.38", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", - "integrity": "sha512-jtLAtIWCbI17buqCVN4/DtuHf3N1w9ZvbwrTWIae+EBSu2N3sVGCwSJeiZdAkTH4KRwinfMQIyoovP/xZtRwXQ==", - "dev": true - }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -8475,12 +7440,6 @@ } } }, - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8500,12 +7459,6 @@ "fill-range": "^7.0.1" } }, - "breakable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", - "integrity": "sha512-+ityJqcjhozQNrezzTd2dtH/lkIXmE52HL+FohK2TOLQDl3QURTNkim+2C0xcso4Zehq/HM4Wkumcdz7Ue+XmA==", - "dev": true - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -8542,18 +7495,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } + "dev": true }, "chalk": { "version": "2.4.2", @@ -8613,15 +7555,6 @@ "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true }, - "cli-table": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", - "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", - "dev": true, - "requires": { - "colors": "1.0.3" - } - }, "cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -8721,12 +7654,6 @@ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -8736,21 +7663,6 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "comment-parser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.3.0.tgz", - "integrity": "sha512-5uBGcGG2RfrzWY/22KPbxhr9tW4YMJHZ4U0JuAA71t0lQvh39uNvubkBeIH1J927nO30sbK6DwDe0D1Pqzlz+Q==", - "dev": true - }, "commitizen": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz", @@ -8773,62 +7685,6 @@ "strip-json-comments": "3.1.1" } }, - "commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha512-3/qHkNMM6o/KGXHITA14y78PcfmXh4+AOCJpSoF73h4VY1JpdGv3CHMS5+JW6SwLhfJt4RhNmLAa7+RRX/62EQ==", - "dev": true, - "requires": { - "commander": "^2.5.0", - "detective": "^4.3.1", - "glob": "^5.0.15", - "graceful-fs": "^4.1.2", - "iconv-lite": "^0.4.5", - "mkdirp": "^0.5.0", - "private": "^0.1.6", - "q": "^1.1.2", - "recast": "^0.11.17" - }, - "dependencies": { - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ==", - "dev": true - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA==", - "dev": true, - "requires": { - "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" - } - } - } - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -8850,18 +7706,6 @@ "integrity": "sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==", "dev": true }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==", - "dev": true - }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -8932,12 +7776,6 @@ } } }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", - "dev": true - }, "cz-conventional-changelog": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz", @@ -9131,21 +7969,6 @@ "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", "dev": true }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, "decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", @@ -9158,40 +7981,6 @@ "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, - "deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -9220,72 +8009,9 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true - }, - "defs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/defs/-/defs-1.1.1.tgz", - "integrity": "sha512-KgGV1vmSa2UPKeDXaWE5FiXjix8BOtYMgiPGpYhd/42wxiC6YGwtscj/zU9gD5/xk4K2iLDpyGhGA5puZxaeMg==", - "dev": true, - "requires": { - "alter": "~0.2.0", - "ast-traverse": "~0.1.1", - "breakable": "~1.0.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "simple-fmt": "~0.1.0", - "simple-is": "~0.2.0", - "stringmap": "~0.2.2", - "stringset": "~0.2.1", - "tryor": "~0.1.2", - "yargs": "~3.27.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", - "integrity": "sha512-6atYjGACjX/OYWico7LwdBx9eiGlkMnIw6OwqfBb+uJQpaT82tQ7oI+BI6Dvq62qZvSbzGzQCVLQdMd59tR2eA==", - "dev": true, - "requires": { - "camelcase": "^1.2.1", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "os-locale": "^1.4.0", - "window-size": "^0.1.2", - "y18n": "^3.2.0" - } - } + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "delayed-stream": { @@ -9306,30 +8032,21 @@ "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "dev": true, - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - } - } - }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -9463,31 +8180,6 @@ "which-typed-array": "^1.1.9" } }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -9522,58 +8214,376 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "eslint": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "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": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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" + } + }, + "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" + } + }, + "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.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "requires": { + "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 + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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" + } + }, + "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 + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "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 + }, + "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" + } + } + } + }, + "eslint-closure": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-closure/-/eslint-closure-0.1.1.tgz", + "integrity": "sha512-vJTqfW4Ox4NqwtnkYCOUaCIR9tkOjkxiaLAO47jtJgoCyYYoSEXSnUpEB+ZwVQ0DJ3QW8ZObzOZVC2DkWrbPsg==", + "dev": true + }, + "eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "dependencies": { + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + } + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "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": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" + "estraverse": "^5.2.0" }, "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true } } }, - "esprima": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.4.1.tgz", - "integrity": "sha512-oQ5niex1XEkpjZhmW1zsozCG515481U0s+A1n6xU9usjkLSy7ZDvfuaAR+CKAKujczvEy7sOPIiX/GO+MZPk8Q==", - "dev": true - }, - "esprima-fb": { - "version": "15001.1001.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", - "integrity": "sha512-m7OsYzocA8OQ3+9CxmhIv7NPHtyDR2ixaLCO7kLZ+YH+xQ/BpaZmll9EXmc+kBxzWA8BRBXbNEuEQqQ6vfsgDw==", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -9606,12 +8616,6 @@ "tmp": "^0.0.33" } }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", - "dev": true - }, "falafel": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.0.1.tgz", @@ -9625,8 +8629,13 @@ "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, - "optional": true + "dev": true + }, + "fast-json-stable-stringify": { + "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": { "version": "2.0.6", @@ -9634,6 +8643,15 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -9643,6 +8661,15 @@ "escape-string-regexp": "^1.0.5" } }, + "file-entry-cache": { + "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": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -9713,6 +8740,34 @@ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true }, + "flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "requires": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "dependencies": { + "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": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -9745,12 +8800,6 @@ "universalify": "^2.0.0" } }, - "fs-readdir-recursive": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", - "integrity": "sha512-//yfxmYAazrsyb/rgeYDNFXFTuPYTGYirp5QHFSH8h/LaNUoP5bQAa2ikstdK1PR/bFd1CIlQLpUq6/u6UVfSw==", - "dev": true - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -9806,12 +8855,6 @@ "has-symbols": "^1.0.3" } }, - "get-stdin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-3.0.2.tgz", - "integrity": "sha512-jpAk+A3NUGL/O4N3pwG1Ld3PDqOxTkuAA/HoVHwutXsqW/qYcc4YSgccFpPlg/qbNhZ33ybFhJjbJqRZhryolQ==", - "dev": true - }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -9879,12 +8922,6 @@ "which": "^1.2.14" } }, - "globals": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-6.4.1.tgz", - "integrity": "sha512-Lh7H0bYRNBMc2CapY+TYsCzcSM4HWHGFoQORuEcePk3y3IhpaZmFSJDirhNYSwq8QeHvaCqV/tHI2bdUhYryuw==", - "dev": true - }, "globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", @@ -10019,10 +9056,10 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "has": { @@ -10034,23 +9071,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - } - } - }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -10099,24 +9119,6 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "home-or-tmp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", - "integrity": "sha512-6LKQZpR6gk8uJ3mXbBkyOumsA24BUk9CH/79ivZ8Kk1urzlXNGZBoAMuieC/YzwCyGBVqq+uCNUpA1JS6glrxg==", - "dev": true, - "requires": { - "os-tmpdir": "^1.0.1", - "user-home": "^1.1.1" - }, - "dependencies": { - "user-home": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", - "dev": true - } - } - }, "homedir-polyfill": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -10236,12 +9238,17 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, "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, - "optional": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -10251,11 +9258,16 @@ "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, - "optional": true + "dev": true } } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -10363,22 +9375,6 @@ "side-channel": "^1.0.4" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, "is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -10424,12 +9420,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -10460,12 +9450,6 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -10481,27 +9465,12 @@ "is-extglob": "^2.1.1" } }, - "is-integer": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", - "integrity": "sha512-RPQc/s9yBHSvpi+hs9dYiJ2cuFeU6x3TyyIp8O2H6SKEltIvJOzRj9ToyvcStDvPR/pS4rxgr1oBFajQjZ2Szg==", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -10523,6 +9492,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -10545,12 +9520,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, "is-shared-array-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", @@ -10603,12 +9572,6 @@ "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", "dev": true }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -10618,16 +9581,6 @@ "call-bind": "^1.0.2" } }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -10646,12 +9599,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, "jackspeak": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", @@ -10662,12 +9609,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "js-tokens": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", - "integrity": "sha512-WKqed1YxjsT7sGqM2IdbkJHnA3rXHqFqN+4xUy973UeYNjSXZCKM3G/zUmPNYut/6D9QCUbqegDmUCQRdm0lnQ==", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -10677,132 +9618,6 @@ "argparse": "^2.0.1" } }, - "jscs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jscs/-/jscs-2.0.0.tgz", - "integrity": "sha512-0hIzudZAsGi3Dq/Ni0xIqzvm58ivk8XMDwFQ0QnBoctTENHsjukDvYQk+yVWZxQiX173oyCHNFGZzQFkQAPANQ==", - "dev": true, - "requires": { - "babel-core": "^5.6.15", - "babel-jscs": "^2.0.0", - "chalk": "~1.1.0", - "cli-table": "~0.3.1", - "commander": "~2.8.1", - "esprima": "~2.4.0", - "estraverse": "^4.1.0", - "exit": "~0.1.2", - "glob": "^5.0.1", - "jscs-jsdoc": "1.1.0", - "lodash.assign": "~3.2.0", - "minimatch": "~2.0.1", - "pathval": "~0.1.1", - "prompt": "~0.2.14", - "reserved-words": "^0.1.1", - "strip-json-comments": "~1.0.2", - "to-double-quotes": "^1.0.0", - "to-single-quotes": "^1.0.2", - "vow": "~0.4.8", - "vow-fs": "~0.3.4", - "xmlbuilder": "^2.6.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true - } - } - }, - "jscs-jsdoc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jscs-jsdoc/-/jscs-jsdoc-1.1.0.tgz", - "integrity": "sha512-UA+ZhX+no2AeqJGZU92tBnOVlsBACGopGzWR7MK3YI1l6ZZlGlWc4k5f5oUZ7xOQTrYdUZCbT0tki9I52B6/JQ==", - "dev": true, - "requires": { - "comment-parser": "0.3.0", - "jsdoctypeparser": "~1.2.0" - } - }, - "jsdoctypeparser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-1.2.0.tgz", - "integrity": "sha512-osXm4Fr1o/Jc0YwUM7DHUliYtaunLQxh4ynZgtN02mTUN1VsNbMy75DFSkKRne8xE8jiGRV9NKVhYYYa8ZIHXQ==", - "dev": true, - "requires": { - "lodash": "^3.7.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", - "dev": true - } - } - }, "jsdom": { "version": "21.1.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.0.tgz", @@ -10884,6 +9699,12 @@ } } }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -10904,10 +9725,10 @@ "dev": true, "optional": true }, - "json5": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz", - "integrity": "sha512-5EEuuI7oad0d6c2PcrTRLoLH2JNuI/aJxHsVT2hVFK6fKHu+MXONdhzzzNAlb3JXMeuN1o+kDU78fV1YH6VmKQ==", + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "jsonfile": { @@ -10926,36 +9747,15 @@ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "json-buffer": "3.0.1" } }, - "leven": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/leven/-/leven-1.0.2.tgz", - "integrity": "sha512-U3eIzC2mMAOMOuoJ25sA3eyraoBwndpQyYgBq5dyqrMTpvMg9l9X/ucFHxv622YcCg179WWqleoF7rSzfYrV+Q==", - "dev": true - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -10999,99 +9799,31 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", - "dev": true + "dev": true + } + } }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" + "p-locate": "^5.0.0" } }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, - "lodash.assign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "dev": true - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -11099,17 +9831,6 @@ "dev": true, "optional": true }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", @@ -11120,8 +9841,7 @@ "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, - "optional": true + "dev": true }, "lodash.mergewith": { "version": "4.6.2", @@ -11130,12 +9850,6 @@ "dev": true, "optional": true }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", - "dev": true - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -11410,12 +10124,6 @@ } } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", @@ -11428,10 +10136,10 @@ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, - "ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha512-PfGU8jYWdRl4FqJfCy0IzbkGyFHntfWygZg46nFk/dJD/XRrk2cj0SsKSX9n5u5gE0E0YfEpKWrEkfjnlZSTXA==", + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "nice-try": { @@ -11505,28 +10213,12 @@ "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, "object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -11651,32 +10343,12 @@ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, - "output-file-sync": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", - "integrity": "sha512-uQLlclru4xpCi+tfs80l3QF24KL81X57ELNMy7W/dox+JTtxUf1bLyQ8968fFCmSqqbokjW0kn+WBIlO+rSkNg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.4", - "mkdirp": "^0.5.1", - "object-assign": "^4.1.0" - } - }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -11700,7 +10372,6 @@ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "optional": true, "requires": { "callsites": "^3.0.0" } @@ -11741,12 +10412,6 @@ } } }, - "path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha512-BD2vrQBPFI3VkVKzTrOmaG2WtPQoduNXu1A5tLYMOW8RN6G9CdhdSkmw+ljxUkJcj4pbXQGw0lzl7MFLnhba9Q==", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -11799,12 +10464,6 @@ "dev": true, "optional": true }, - "pathval": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", - "integrity": "sha512-2AJyCGXy4VsZ2wa0TmMoL93KtWshxWQAMuuAG+7/Q3kth9uRDV38cMZTaSCsrTDJEwV8QbIHad+3E673s1ZY0A==", - "dev": true - }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -11823,12 +10482,6 @@ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true }, - "pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha512-8xCNE/aT/EXKenuMDZ+xTVwkT8gsoHN2z/Q29l80u0ppGEXVvsKRzNMbtKhg8LS8k1tJLAHHylf6p4VFmP6XUQ==", - "dev": true - }, "precommit-hook": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/precommit-hook/-/precommit-hook-1.0.7.tgz", @@ -11842,31 +10495,12 @@ "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "prompt": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "integrity": "sha512-jDK5yEbAakJmNm+260gZG1+PuzX3jT5Jy0VZAUGrrW9RQ1JEWEDEVNnhO70mL3+U5r6bSJo02xsE34wOS/LnrA==", - "dev": true, - "requires": { - "pkginfo": "0.x.x", - "read": "1.0.x", - "revalidator": "0.1.x", - "utile": "0.2.x", - "winston": "0.8.x" - } - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -11879,18 +10513,18 @@ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true - }, "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -11900,15 +10534,6 @@ "safe-buffer": "^5.1.0" } }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -11952,38 +10577,6 @@ "picomatch": "^2.2.1" } }, - "recast": { - "version": "0.10.33", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.10.33.tgz", - "integrity": "sha512-RxAVgvgWGzfFYsdc3PB6TM4/cq8HMgBH8PC9r+SkO7j1MeHZvIMxLSVlUhin3sv9wbAy8CMAPXSGSGkWPovyKQ==", - "dev": true, - "requires": { - "ast-types": "0.8.12", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "source-map": "~0.5.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerator": { - "version": "0.8.40", - "resolved": "https://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", - "integrity": "sha512-NsE91xz22nl5JsAwE5kZNmaMaK6g4HipZaGhrQJeVo8DsTwYYONx0TYEm8+7kFIODeuLNQpRsomV1CChmEY5Yg==", - "dev": true, - "requires": { - "commoner": "~0.10.3", - "defs": "~1.1.0", - "esprima-fb": "~15001.1001.0-dev-harmony-fb", - "private": "~0.1.5", - "recast": "0.10.33", - "through": "~2.3.8" - } - }, "regexp.prototype.flags": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", @@ -11995,71 +10588,12 @@ "functions-have-names": "^1.2.3" } }, - "regexpu": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", - "integrity": "sha512-OqpQCTCcVM6k9IbzxLjNN6TRj3NV7qF4L8zUqsNoeAmmIZp8wH1tdZnn0vNXE2tGNU4ho0xTZWk3FmahOtyMRA==", - "dev": true, - "requires": { - "esprima": "^2.6.0", - "recast": "^0.10.10", - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true - } - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==", - "dev": true - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "repeating": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha512-Nh30JLeMHdoI+AsQ5eblhZ7YlTsM9wiJQe/AHIunlK3KWzvXhXb36IJ7K1IOeRjIOtzMjdUHjwXUFxKJoPTSOg==", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "replace-ext": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", @@ -12085,12 +10619,6 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, - "reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==", - "dev": true - }, "resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", @@ -12139,21 +10667,12 @@ "signal-exit": "^3.0.2" } }, - "revalidator": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "integrity": "sha512-xcBILK2pA9oh4SiinPEZfhP8HfrB/ha+a2fTMyl7Om2WjlDVrOQy99N2MXXlUHqGJz4qEu2duXxHJjDWuK/0xg==", + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, "rimraf": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", @@ -12259,6 +10778,15 @@ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -12353,18 +10881,6 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "simple-fmt": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", - "integrity": "sha512-9a3zTDDh9LXbTR37qBhACWIQ/mP/ry5xtmbE98BJM8GR02sanCkfMzp7AdCTqYhkBZggK/w7hJtc8Pb9nmo16A==", - "dev": true - }, - "simple-is": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", - "integrity": "sha512-GJXhv3r5vdj5tGWO+rcrWgjU2azLB+fb7Ehh3SmZpXE0o4KrrFLti0w4mdDCbR29X/z0Ls20ApjZitlpAXhAeg==", - "dev": true - }, "sinon": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.1.0.tgz", @@ -12402,38 +10918,12 @@ } } }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", - "dev": true - }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true }, - "source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha512-gGKOSat73z0V8wBKo9AGxZZyekczBireh1hHktbt+kb9acsCB5OfVCF2DCWlztcQ3r5oNN7f2BL0B2xOcoJ/DQ==", - "dev": true, - "requires": { - "source-map": "0.1.32" - }, - "dependencies": { - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, "spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -12466,27 +10956,6 @@ "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true - }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "requires": { - "internal-slot": "^1.0.4" - } - }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", @@ -12559,18 +11028,6 @@ "es-abstract": "^1.20.4" } }, - "stringmap": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", - "integrity": "sha512-mR1LEHDw6TsHa+LwJeeBc9ZqZqEOm7bHidgxMmDg8HB/rbA1HhDeT08gS67CCCG/xrgIfQx5tW42pd8vFpLUow==", - "dev": true - }, - "stringset": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", - "integrity": "sha512-km3jeiRpmySChl1oLiBE2ESdG5k/4+6tjENVL6BB3mdmKBiUikI5ks4paad2WAKsxzpNiBqBBbXCC12QqlpLWA==", - "dev": true - }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -12643,6 +11100,12 @@ } } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -12658,21 +11121,6 @@ "os-tmpdir": "~1.0.2" } }, - "to-double-quotes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/to-double-quotes/-/to-double-quotes-1.0.2.tgz", - "integrity": "sha512-nNlLjQWahkAajfyrYpgN16a4/ujmBg9PGUn77yQi3Usz/GifqPte1yPpRHEE2KdkNelDOGOGC8Qb8EbLR7vUcQ==", - "dev": true, - "requires": { - "get-stdin": "^3.0.0" - } - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12682,15 +11130,6 @@ "is-number": "^7.0.0" } }, - "to-single-quotes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/to-single-quotes/-/to-single-quotes-1.0.4.tgz", - "integrity": "sha512-3TQ2QHI8HxTWZlXbux5osZIB4n/tbLQa5gxB7IB/iO8KYSGbhUrkWxZmDqB2V6yj2ePXSCiqUtU5viKu+x7P/Q==", - "dev": true, - "requires": { - "get-stdin": "^3.0.0" - } - }, "tough-cookie": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", @@ -12720,24 +11159,6 @@ "punycode": "^2.1.1" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", - "dev": true - }, - "try-resolve": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", - "integrity": "sha512-yHeaPjCBzVaXwWl5IMUapTaTC2rn/eBYg2fsG2L+CvJd+ttFbk0ylDnpTO3wVhosmE1tQEvcebbBeKLCwScQSQ==", - "dev": true - }, - "tryor": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", - "integrity": "sha512-2+ilNA00DGvbUYYbRrm3ux+snbo7I6uPXMw8I4p/QMl7HUOWBBZFbk+Mpr8/IAPDQE+LQ8vOdlI6xEzjc+e/BQ==", - "dev": true - }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -12844,7 +11265,6 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "optional": true, "requires": { "punycode": "^2.1.0" } @@ -12874,31 +11294,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "utile": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "integrity": "sha512-ltfvuCJNa/JFOhKBBiQ9qDyyFwLstoMMO1ru0Yg/Mcl8dp1Z3IBaL7n+5dHpyma+d3lCogkgBQnWKtGxzNyqhg==", - "dev": true, - "requires": { - "async": "~0.2.9", - "deep-equal": "*", - "i": "0.3.x", - "mkdirp": "0.x.x", - "ncp": "0.4.x", - "rimraf": "2.x.x" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -12939,41 +11334,6 @@ "source-map": "^0.5.1" } }, - "vow": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.20.tgz", - "integrity": "sha512-YYoSYXUYABqY08D/WrjcWJxJSErcILRRTQpcPyUc0SFfgIPKSUFzVt7u1HC3TXGJZM/qhsSjCLNQstxqf7asgQ==", - "dev": true - }, - "vow-fs": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.6.tgz", - "integrity": "sha512-oK9rtqJSHy7ZQAhAtVU0HiF/oVhm0A4Qx2l2DyyFBUsXbTXUg258EsQGLLIXYZnE5MYaInZLgA6l/10je/EamA==", - "dev": true, - "requires": { - "glob": "^7.0.5", - "uuid": "^2.0.2", - "vow": "^0.4.7", - "vow-queue": "^0.4.1" - }, - "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", - "dev": true - } - } - }, - "vow-queue": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.3.tgz", - "integrity": "sha512-/poAKDTFL3zYbeQg7cl4BGcfP4sGgXKrHnRFSKj97dteUFu8oyXMwIcdwu8NSx/RmPGIuYx1Bik/y5vU4H/VKw==", - "dev": true, - "requires": { - "vow": "^0.4.17" - } - }, "w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", @@ -13056,18 +11416,6 @@ "is-symbol": "^1.0.3" } }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, "which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", @@ -13082,53 +11430,12 @@ "is-typed-array": "^1.1.10" } }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", - "dev": true - }, - "winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha512-fPoamsHq8leJ62D1M9V/f15mjQ1UHe4+7j1wpAT3fqgA5JqhJkk4aIfPEjfMTI9x6ZTjaLOpMAjluLtmgO5b6g==", - "dev": true, - "requires": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "pkginfo": "0.3.x", - "stack-trace": "0.0.x" - }, - "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", - "dev": true - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", - "dev": true - } - } - }, "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.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", - "dev": true - }, "workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -13228,23 +11535,6 @@ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true }, - "xmlbuilder": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-2.6.5.tgz", - "integrity": "sha512-Ehby0RBBPAQAef3zP1636SPzwcfepVu69dmyCMkFioYOw/a6CULZbkRn8MCsVFzakt3+Zv23hecYdEsps9fRBQ==", - "dev": true, - "requires": { - "lodash": "^3.5.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", - "dev": true - } - } - }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index 548946e02..685c89b7f 100644 --- a/package.json +++ b/package.json @@ -17,8 +17,8 @@ "commit": "git-cz", "cover": "npm-run-all cover:*", "cover:clean": "npm run clean:coverage", - "cover:report": "npx nyc@latest mocha", - "lint": "./lint.sh", + "cover:report": "npx nyc@latest mocha", + "lint": "eslint src test", "test": "mocha", "test-report": "mocha --reporter json > test-results.json", "builddocs": "jsdox src/3_branch_web.js --output docs/web", @@ -41,13 +41,15 @@ "devDependencies": { "commitizen": "^4.3.0", "cz-customizable": "^7.0.0", + "eslint": "^8.47.0", + "eslint-closure": "^0.1.1", + "eslint-config-google": "^0.14.0", "falafel": "1.0.1", "google-closure-compiler": "^20230206.0.0", "google-closure-deps": "^20230103.0.0", "google-closure-library": "^20230103.0.0", "husky": "^8.0.0", "i": "^0.3.7", - "jscs": "2.0.0", "jsdom": "21.1.0", "jsdom-global": "3.0.2", "jshint": "^2.13.6", diff --git a/src/0_jsonparse.js b/src/0_jsonparse.js index 915781a45..34e725e0b 100644 --- a/src/0_jsonparse.js +++ b/src/0_jsonparse.js @@ -5,10 +5,10 @@ goog.provide('safejson'); -/*jshint unused:false*/ +/* jshint unused:false*/ goog.require('goog.json'); -safejson.parse = function(sJSON) { +safejson.parse = function (sJSON) { sJSON = String(sJSON); try { return JSON.parse(sJSON); @@ -17,7 +17,7 @@ safejson.parse = function(sJSON) { } - throw Error("Invalid JSON string: " + sJSON); + throw Error('Invalid JSON string: ' + sJSON); }; safejson.stringify = function(objJSON) { @@ -28,6 +28,6 @@ safejson.stringify = function(objJSON) { } - throw Error("Could not stringify object"); + throw Error('Could not stringify object'); }; diff --git a/src/0_queue.js b/src/0_queue.js index 7f24cd86c..7b99ac127 100644 --- a/src/0_queue.js +++ b/src/0_queue.js @@ -5,11 +5,11 @@ goog.provide('task_queue'); /** - * @returns {function(function(function()))} + * @return {function(function(function()))} */ -var task_queue = function() { - var queue = []; - var next = function() { +task_queue = function() { + const queue = []; + const next = function() { if (queue.length) { queue[0](function() { queue.shift(); diff --git a/src/1_utils.js b/src/1_utils.js index 544885ca0..603caf7fd 100644 --- a/src/1_utils.js +++ b/src/1_utils.js @@ -4,7 +4,7 @@ 'use strict'; goog.provide('utils'); -/*jshint unused:false*/ +/* jshint unused:false*/ goog.require('goog.json'); goog.require('config'); goog.require('safejson'); @@ -12,7 +12,9 @@ goog.require('safejson'); /* jshint ignore:start */ /** @typedef {string} */ +// eslint-disable-next-line no-var, no-unused-vars var message; + utils.debug = false; utils.retries = 2; // Value specifying the number of times that a Branch API call can be re-attempted. utils.retry_delay = 200; // Amount of time in milliseconds to wait before re-attempting a timed-out request to the Branch API. @@ -28,9 +30,9 @@ utils.timeSinceNavigationStart = function() { // in milliseconds return (Date.now() - window.performance.timing.navigationStart).toString(); }; -utils.currentRequestBrttTag = ""; +utils.currentRequestBrttTag = ''; utils.calculateBrtt = function(startTime) { - if (!startTime || typeof startTime !== "number") { + if (!startTime || typeof startTime !== 'number') { return null; } return (Date.now() - startTime).toString(); @@ -47,23 +49,23 @@ utils.userPreferences = { trackingDisabled: false, enableExtendedJourneysAssist: false, whiteListedEndpointsWithData: { - '/v1/open': { 'link_identifier':'\\d+' }, - '/v1/pageview': { 'event': 'pageview' }, - '/v1/dismiss': { 'event': 'dismiss' }, + '/v1/open': {'link_identifier': '\\d+'}, + '/v1/pageview': {'event': 'pageview'}, + '/v1/dismiss': {'event': 'dismiss'}, '/v1/url': { } }, allowErrorsInCallback: false, shouldBlockRequest: function(url, requestData) { // Used by 3_api.js to determine whether a request should be blocked - var urlParser = document.createElement('a'); + const urlParser = document.createElement('a'); urlParser.href = url; // INTENG-11512 // To allow SMS when tracking disabled, we must allow GET . // This precludes a filter on the path. Only apply the whitelist to // service endpoints. - var whiteListDomains = [ config.api_endpoint, config.app_service_endpoint, config.link_service_endpoint ]; - var urlOrigin = urlParser.origin; // Property origin is defined on Anchor https://www.w3schools.com/jsref/prop_anchor_origin.asp + const whiteListDomains = [ config.api_endpoint, config.app_service_endpoint, config.link_service_endpoint ]; + let urlOrigin = urlParser.origin; // Property origin is defined on Anchor https://www.w3schools.com/jsref/prop_anchor_origin.asp // Excess of caution: Make sure no trailing slash in urlOrigin. if (urlOrigin.endsWith('/')) { urlOrigin = urlOrigin.substring(0, urlOrigin.length - 1); @@ -72,7 +74,7 @@ utils.userPreferences = { return false; } - var urlPath = urlParser.pathname; + let urlPath = urlParser.pathname; // On Internet Explorer .pathname is returned without a leading '/' whereas on other browsers, // a leading slash is available eg. v1/open on IE vs. /v1/open in Chrome @@ -80,7 +82,7 @@ utils.userPreferences = { urlPath = '/' + urlPath; } - var whiteListedEndpointWithData = utils.userPreferences.whiteListedEndpointsWithData[urlPath]; + const whiteListedEndpointWithData = utils.userPreferences.whiteListedEndpointsWithData[urlPath]; if (!whiteListedEndpointWithData) { return true; @@ -90,10 +92,12 @@ utils.userPreferences = { return true; } // Ensures that required request parameters are available in request data - for (var key in whiteListedEndpointWithData) { - var requiredParameterRegex = new RegExp(whiteListedEndpointWithData[key]); - if (!requestData.hasOwnProperty(key) || !requiredParameterRegex.test(requestData[key])) { - return true; + for (const key in whiteListedEndpointWithData) { + if (whiteListedEndpointWithData.hasOwnProperty(key)) { + const requiredParameterRegex = new RegExp(whiteListedEndpointWithData[key]); + if (!requestData.hasOwnProperty(key) || !requiredParameterRegex.test(requestData[key])) { + return true; + } } } } @@ -105,26 +109,26 @@ utils.generateDynamicBNCLink = function(branchKey, data) { if (!branchKey && !data) { return; } - var addKeyAndValueToUrl = function(fallbackUrl, tagName, tagData) { - var first = fallbackUrl[fallbackUrl.length - 1] === "?"; - var modifiedFallbackURL = first ? fallbackUrl + tagName : fallbackUrl + "&" + tagName; - modifiedFallbackURL += "="; + const addKeyAndValueToUrl = function(fallbackUrl, tagName, tagData) { + const first = fallbackUrl[fallbackUrl.length - 1] === '?'; + let modifiedFallbackURL = first ? fallbackUrl + tagName : fallbackUrl + '&' + tagName; + modifiedFallbackURL += '='; return modifiedFallbackURL + encodeURIComponent(tagData); }; - var fallbackUrl = config.link_service_endpoint + '/a/' + branchKey + '?'; - var topLevelKeys = [ "tags", "alias", "channel", "feature", "stage", "campaign", "type", "duration", "sdk", "source", "data" ]; - for (var i = 0; i < topLevelKeys.length; i++) { - var key = topLevelKeys[i]; - var value = data[key]; + let fallbackUrl = config.link_service_endpoint + '/a/' + branchKey + '?'; + const topLevelKeys = [ 'tags', 'alias', 'channel', 'feature', 'stage', 'campaign', 'type', 'duration', 'sdk', 'source', 'data' ]; + for (let i = 0; i < topLevelKeys.length; i++) { + const key = topLevelKeys[i]; + let value = data[key]; if (value) { - if (key === "tags" && Array.isArray(value)) { - for (var index = 0; index < value.length; index++) { + if (key === 'tags' && Array.isArray(value)) { + for (let index = 0; index < value.length; index++) { fallbackUrl = addKeyAndValueToUrl(fallbackUrl, key, value[index]); } } - else if (typeof value === "string" && value.length > 0 || typeof value === "number") { - if (key === "data" && typeof value === "string") { + else if (typeof value === 'string' && value.length > 0 || typeof value === 'number') { + if (key === 'data' && typeof value === 'string') { value = utils.base64encode(value); } fallbackUrl = addKeyAndValueToUrl(fallbackUrl, key, value); @@ -152,7 +156,7 @@ utils.cleanApplicationAndSessionStorage = function(branch) { delete branch._deepviewRequestForReplay; } branch._storage.remove('branch_view_enabled'); - var data = {}; + const data = {}; // Sets an empty object for branch_session and branch_session_first in local/sessionStorage session.set(branch._storage, data, true); } @@ -211,8 +215,8 @@ utils.messages = { */ /** @type {Array} */ utils.bannerThemes = [ - "light", - "dark" + 'light', + 'dark' ]; /* @@ -234,7 +238,7 @@ utils.getLocationHash = function() { * @return {string} */ utils.message = function(message, params, failCode, failDetails) { - var msg = message.replace(/\$(\d)/g, function(_, place) { + let msg = message.replace(/\$(\d)/g, function(_, place) { return params[parseInt(place, 10) - 1]; }); if (failCode) { @@ -255,7 +259,7 @@ utils.message = function(message, params, failCode, failDetails) { */ utils.whiteListSessionData = function(data) { return { - 'data': data['data'] || "", + 'data': data['data'] || '', 'data_parsed': data['data_parsed'] || {}, 'has_app': utils.getBooleanOrNull(data['has_app']), 'identity': data['identity'] || null, @@ -270,9 +274,9 @@ utils.whiteListSessionData = function(data) { * @return {Object} retData */ utils.whiteListJourneysLanguageData = function(sessionData) { - var re = /^\$journeys_\S+$/; - var data = sessionData['data']; - var retData = {}; + const re = /^\$journeys_\S+$/; + let data = sessionData['data']; + const retData = {}; if (!data) { return {}; @@ -296,7 +300,7 @@ utils.whiteListJourneysLanguageData = function(sessionData) { } Object.keys(data).forEach(function(key) { - var found = re.test(key); + const found = re.test(key); if (found) { retData[key] = data[key]; } @@ -316,13 +320,10 @@ utils.getWindowLocation = function() { * Find debugging parameters */ utils.getParameterByName = function(name) { - var url; - var re; - var match; name = name.replace(/[\[\]]/g, '\\$&'); - url = utils.getWindowLocation(); - re = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'); - match = re.exec(url); + const url = utils.getWindowLocation(); + const re = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'); + const match = re.exec(url); if (!match || !match[2]) { return ''; } @@ -331,7 +332,7 @@ utils.getParameterByName = function(name) { utils.cleanLinkData = function(linkData) { linkData['source'] = 'web-sdk'; - var data = linkData['data']; + let data = linkData['data']; switch (typeof data) { case 'string': @@ -339,7 +340,7 @@ utils.cleanLinkData = function(linkData) { data = safejson.parse(data); } catch (e) { - data = { '_bncNoEval': true }; + data = {'_bncNoEval': true}; } break; case 'object': @@ -350,7 +351,7 @@ utils.cleanLinkData = function(linkData) { break; } - var hasOGRedirectOrFallback = data['$og_redirect'] || data['$fallback_url'] || data['$desktop_url']; + const hasOGRedirectOrFallback = data['$og_redirect'] || data['$fallback_url'] || data['$desktop_url']; if (!data['$canonical_url']) { data['$canonical_url'] = utils.getWindowLocation(); @@ -393,16 +394,16 @@ utils.cleanLinkData = function(linkData) { * @param {String} link */ utils.getClickIdAndSearchStringFromLink = function(link) { - if (!link || typeof link !== "string") { - return ""; + if (!link || typeof link !== 'string') { + return ''; } - var elem = document.createElement("a"); + const elem = document.createElement('a'); elem.href = link; function notEmpty(data) { - return data !== ""; + return data !== ''; } - var pathname = elem.pathname && elem.pathname.split('/').filter(notEmpty); - return Array.isArray(pathname) && pathname.length ? pathname[ pathname.length - 1 ] + elem.search : elem.search; + const pathname = elem.pathname && elem.pathname.split('/').filter(notEmpty); + return Array.isArray(pathname) && pathname.length ? pathname[pathname.length - 1] + elem.search : elem.search; }; /** @@ -425,9 +426,9 @@ utils.merge = function(to, from, removeNull) { return to; } - for (var attr in from) { + for (const attr in from) { if (from.hasOwnProperty(attr)) { - var fromAttr = from[attr]; + const fromAttr = from[attr]; /* Only remove null and undefined, not all falsy values. */ if (removeNull && (fromAttr === undefined || fromAttr === null)) { delete to[attr]; @@ -445,7 +446,7 @@ utils.merge = function(to, from, removeNull) { */ utils.hashValue = function(key) { try { - var match = utils.getLocationHash().match(new RegExp(key + ':([^&]*)')); + const match = utils.getLocationHash().match(new RegExp(key + ':([^&]*)')); if (match && match.length >= 1) { return match[1]; } @@ -485,14 +486,15 @@ function isMacintoshDesktop(ua) { function isGTEVersion(ua, v) { v = v || 11; - var match = /version\/([^ ]*)/i.exec(ua); + const match = /version\/([^ ]*)/i.exec(ua); if (match && match[1]) { try { - var version = parseFloat(match[1]); + const version = parseFloat(match[1]); if (version >= v) { return true; } - } catch (e) { + } + catch (e) { return false; } } @@ -512,7 +514,7 @@ function isIOS(ua) { } utils.mobileUserAgent = function() { - var ua = navigator.userAgent; + const ua = navigator.userAgent; if (ua.match(/android/i)) { return 'android'; } @@ -542,7 +544,7 @@ utils.mobileUserAgent = function() { ua.match(/KFAPWA/i) || ua.match(/KFAPWI/i) ) { - return "kindle"; + return 'kindle'; } return false; }; @@ -552,8 +554,8 @@ utils.mobileUserAgent = function() { * @return {boolean} */ utils.isSafari11OrGreater = function() { - var ua = navigator.userAgent; - var isSafari = isSafariBrowser(ua); + const ua = navigator.userAgent; + const isSafari = isSafariBrowser(ua); if (isSafari) { return isGTEVersion(ua, 11); @@ -571,7 +573,7 @@ utils.isWebKitBrowser = function() { }; utils.isIOSWKWebView = function() { - var ua = navigator.userAgent; + const ua = navigator.userAgent; return utils.isWebKitBrowser() && ua && isIOS(ua) && !isChromeBrowser(ua) && !isFirefoxBrowser(ua) && @@ -585,7 +587,7 @@ utils.isIOSWKWebView = function() { */ utils.getParamValue = function(key) { try { - var match = utils.getLocationSearch().substring(1).match(new RegExp(key + '=([^&]*)')); + const match = utils.getLocationSearch().substring(1).match(new RegExp(key + '=([^&]*)')); if (match && match.length >= 1) { return match[1]; } @@ -605,8 +607,8 @@ utils.isKey = function(key_or_id) { * @param {string} string */ utils.snakeToCamel = function(string) { - var find = /(\-\w)/g; - var convert = function(matches) { + const find = /(\-\w)/g; + const convert = function(matches) { return matches[1].toUpperCase(); }; return string.replace(find, convert); @@ -618,11 +620,11 @@ utils.snakeToCamel = function(string) { * @param {string} input */ utils.base64encode = function(input) { - var utf8_encode = function(string) { + const utf8_encode = function(string) { string = string.replace(/\r\n/g, '\n'); - var utftext = ''; - for (var n = 0; n < string.length; n++) { - var c = string.charCodeAt(n); + let utftext = ''; + for (let n = 0; n < string.length; n++) { + const c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } @@ -639,17 +641,17 @@ utils.base64encode = function(input) { return utftext; }; - var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; - - var output = ''; - var chr1; - var chr2; - var chr3; - var enc1; - var enc2; - var enc3; - var enc4; - var i = 0; + const keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + + let output = ''; + let chr1; + let chr2; + let chr3; + let enc1; + let enc2; + let enc3; + let enc4; + let i = 0; input = utf8_encode(input); while (i < input.length) { @@ -692,7 +694,7 @@ utils.base64Decode = function(str) { * @param {string} str */ utils.isBase64Encoded = function(str) { - if (typeof str !== "string") { + if (typeof str !== 'string') { return false; } if (str === '' || str.trim() === '') { @@ -712,13 +714,13 @@ utils.isBase64Encoded = function(str) { * @param {Object} data */ utils.encodeBFPs = function(data) { - if (data && data["browser_fingerprint_id"] && - !utils.isBase64Encoded(data["browser_fingerprint_id"])) { - data["browser_fingerprint_id"] = btoa(data["browser_fingerprint_id"]); + if (data && data['browser_fingerprint_id'] && + !utils.isBase64Encoded(data['browser_fingerprint_id'])) { + data['browser_fingerprint_id'] = btoa(data['browser_fingerprint_id']); } - if (data && data["alternative_browser_fingerprint_id"] && - !utils.isBase64Encoded(data["alternative_browser_fingerprint_id"])) { - data["alternative_browser_fingerprint_id"] = btoa(data["alternative_browser_fingerprint_id"]); + if (data && data['alternative_browser_fingerprint_id'] && + !utils.isBase64Encoded(data['alternative_browser_fingerprint_id'])) { + data['alternative_browser_fingerprint_id'] = btoa(data['alternative_browser_fingerprint_id']); } return data; }; @@ -729,11 +731,11 @@ utils.encodeBFPs = function(data) { * @param {Object} data */ utils.decodeBFPs = function(data) { - if (data && utils.isBase64Encoded(data["browser_fingerprint_id"])) { - data["browser_fingerprint_id"] = atob(data["browser_fingerprint_id"]); + if (data && utils.isBase64Encoded(data['browser_fingerprint_id'])) { + data['browser_fingerprint_id'] = atob(data['browser_fingerprint_id']); } - if (data && utils.isBase64Encoded(data["alternative_browser_fingerprint_id"])) { - data["alternative_browser_fingerprint_id"] = atob(data["alternative_browser_fingerprint_id"]); + if (data && utils.isBase64Encoded(data['alternative_browser_fingerprint_id'])) { + data['alternative_browser_fingerprint_id'] = atob(data['alternative_browser_fingerprint_id']); } return data; }; @@ -746,7 +748,7 @@ utils.decodeBFPs = function(data) { * @param {boolean=} useCapture */ utils.addEvent = function(el, eventType, callback, useCapture) { - var ret = 0; + let ret = 0; if (typeof el['addEventListener'] === 'function') { ret = el['addEventListener'](eventType, callback, useCapture); @@ -819,7 +821,7 @@ utils.getOpenGraphContent = function(property, content) { property = String(property); content = content || null; - var el = document.querySelector('meta[property="og:' + property + '"]'); + const el = document.querySelector('meta[property="og:' + property + '"]'); if (el && el.content) { content = el.content; } @@ -832,7 +834,7 @@ utils.getOpenGraphContent = function(property, content) { * Returned params may include $ios_deeplink_path, $android_deeplink_path and $deeplink_path. */ utils.prioritizeDeeplinkPaths = function(params, deeplinkPaths) { - if (!deeplinkPaths || typeof deeplinkPaths !== "object" || Object.keys(deeplinkPaths || {}).length === 0) { + if (!deeplinkPaths || typeof deeplinkPaths !== 'object' || Object.keys(deeplinkPaths || {}).length === 0) { return params; } @@ -868,11 +870,11 @@ utils.prioritizeDeeplinkPaths = function(params, deeplinkPaths) { * Used by utils.getHostedDeepLinkData() to process page metadata. */ utils.processHostedDeepLinkData = function(metadata) { - var params = {}; + const params = {}; if (!metadata || metadata.length === 0) { return params; } - var deeplinkPaths = { // keeps track of deeplink paths encountered when parsing page's meta tags + const deeplinkPaths = { // keeps track of deeplink paths encountered when parsing page's meta tags 'hostedIOS': null, 'hostedAndroid': null, 'applinksIOS': null, @@ -881,17 +883,17 @@ utils.processHostedDeepLinkData = function(metadata) { 'twitterAndroid': null }; - for (var i = 0; i < metadata.length; i++) { + for (let i = 0; i < metadata.length; i++) { if (!metadata[i].getAttribute('name') && !metadata[i].getAttribute('property') || !metadata[i].getAttribute('content')) { continue; } - var name = metadata[i].getAttribute('name'); - var property = metadata[i].getAttribute('property'); + const name = metadata[i].getAttribute('name'); + const property = metadata[i].getAttribute('property'); // name takes precedence over property - var nameOrProperty = name || property; + const nameOrProperty = name || property; - var split = nameOrProperty.split(':'); + const split = nameOrProperty.split(':'); if ((split.length === 3) && (split[0] === 'branch') && (split[1] === 'deeplink')) { if (split[2] === '$ios_deeplink_path') { // Deeplink path detected from hosted deep link data @@ -925,7 +927,7 @@ utils.processHostedDeepLinkData = function(metadata) { * Also searches for twitter and applinks tags, i.e. , . */ utils.getHostedDeepLinkData = function() { - var metadata = document.getElementsByTagName('meta'); + const metadata = document.getElementsByTagName('meta'); return utils.processHostedDeepLinkData(metadata); }; @@ -934,9 +936,9 @@ utils.getHostedDeepLinkData = function() { * Returns the user's preferred language */ utils.getBrowserLanguageCode = function() { - var code; + let code; try { - if (navigator.languages && navigator.languages.length>0) { + if (navigator.languages && navigator.languages.length > 0) { code = navigator.languages[0]; } else if (navigator.language) { @@ -955,7 +957,7 @@ utils.getBrowserLanguageCode = function() { * If there is no difference, an empty array will be returned. */ utils.calculateDiffBetweenArrays = function(original, toCheck) { - var diff = []; + const diff = []; toCheck.forEach(function(element) { if (original.indexOf(element) === -1) { diff.push(element); @@ -964,9 +966,9 @@ utils.calculateDiffBetweenArrays = function(original, toCheck) { return diff; }; -var validCommerceEvents = [ 'purchase' ]; +const validCommerceEvents = [ 'purchase' ]; -var commerceEventMessages = { +const commerceEventMessages = { 'missingPurchaseEvent': 'event name is either missing, of the wrong type or not valid. Please specify \'purchase\' as the event name.', 'missingCommerceData': 'commerce_data is either missing, of the wrong type or empty. Please ensure that commerce_data is constructed correctly.', 'invalidKeysForRoot': 'Please remove the following keys from the root of commerce_data: ', @@ -980,17 +982,17 @@ var commerceEventMessages = { * If there are invalid keys present then it will report back what those keys are. * Note: The keys below are optional. */ -var validateCommerceDataKeys = function(commerceData) { - var allowedInRoot = [ 'common', 'type', 'transaction_id', 'currency', 'revenue', 'revenue_in_usd', 'exchange_rate', 'shipping', 'tax', 'coupon', 'affiliation', 'persona', 'products' ]; - var allowedInProducts = [ 'sku', 'name', 'price', 'quantity', 'brand', 'category', 'variant' ]; +const validateCommerceDataKeys = function(commerceData) { + const allowedInRoot = [ 'common', 'type', 'transaction_id', 'currency', 'revenue', 'revenue_in_usd', 'exchange_rate', 'shipping', 'tax', 'coupon', 'affiliation', 'persona', 'products' ]; + const allowedInProducts = [ 'sku', 'name', 'price', 'quantity', 'brand', 'category', 'variant' ]; - var invalidKeysInRoot = utils.calculateDiffBetweenArrays(allowedInRoot, Object.keys(commerceData)); + const invalidKeysInRoot = utils.calculateDiffBetweenArrays(allowedInRoot, Object.keys(commerceData)); if (invalidKeysInRoot.length) { return commerceEventMessages['invalidKeysForRoot'] + invalidKeysInRoot.join(', '); } - var invalidKeysForProducts = []; - var invalidProductType; + let invalidKeysForProducts = []; + let invalidProductType; if (commerceData.hasOwnProperty('products')) { // make sure products is an array if (!Array.isArray(commerceData['products'])) { @@ -1028,7 +1030,7 @@ utils.validateCommerceEventParams = function(event, commerce_data) { return commerceEventMessages['missingCommerceData']; } - var invalidKeysMessage = validateCommerceDataKeys(commerce_data); + const invalidKeysMessage = validateCommerceDataKeys(commerce_data); if (invalidKeysMessage) { return invalidKeysMessage; } @@ -1041,27 +1043,27 @@ utils.cleanBannerText = function(string) { return null; } - return string.replace(//g, ">"); + return string.replace(//g, '>'); }; utils.getTitle = function() { - var tags = document.getElementsByTagName('title'); + const tags = document.getElementsByTagName('title'); return tags.length > 0 ? tags[0].innerText : null; }; utils.getDescription = function() { - var el = document.querySelector('meta[name="description"]'); + const el = document.querySelector('meta[name="description"]'); return el && el.content ? el.content : null; }; utils.getCanonicalURL = function() { - var el = document.querySelector('link[rel="canonical"]'); + const el = document.querySelector('link[rel="canonical"]'); return el && el.href ? el.href : null; }; utils.addPropertyIfNotNull = function(obj, key, value) { if (value !== null && value !== undefined) { - if (typeof value === "object" && Object.keys(value || {}).length === 0) { + if (typeof value === 'object' && Object.keys(value || {}).length === 0) { return obj; } obj[key] = value; @@ -1070,7 +1072,7 @@ utils.addPropertyIfNotNull = function(obj, key, value) { }; utils.openGraphDataAsObject = function() { - var ogData = {}; + let ogData = {}; ogData = utils.addPropertyIfNotNull(ogData, '$og_title', utils.getOpenGraphContent('title')); ogData = utils.addPropertyIfNotNull(ogData, '$og_description', utils.getOpenGraphContent('description')); ogData = utils.addPropertyIfNotNull(ogData, '$og_image_url', utils.getOpenGraphContent('image')); @@ -1081,20 +1083,20 @@ utils.openGraphDataAsObject = function() { utils.getAdditionalMetadata = function() { - var metadata = {}; - metadata = utils.addPropertyIfNotNull(metadata, "og_data", utils.openGraphDataAsObject()); - metadata = utils.addPropertyIfNotNull(metadata, "hosted_deeplink_data", utils.getHostedDeepLinkData()); - metadata = utils.addPropertyIfNotNull(metadata, "title", utils.getTitle()); - metadata = utils.addPropertyIfNotNull(metadata, "description", utils.getDescription()); - metadata = utils.addPropertyIfNotNull(metadata, "canonical_url", utils.getCanonicalURL()); + let metadata = {}; + metadata = utils.addPropertyIfNotNull(metadata, 'og_data', utils.openGraphDataAsObject()); + metadata = utils.addPropertyIfNotNull(metadata, 'hosted_deeplink_data', utils.getHostedDeepLinkData()); + metadata = utils.addPropertyIfNotNull(metadata, 'title', utils.getTitle()); + metadata = utils.addPropertyIfNotNull(metadata, 'description', utils.getDescription()); + metadata = utils.addPropertyIfNotNull(metadata, 'canonical_url', utils.getCanonicalURL()); return metadata && Object.keys(metadata).length > 0 ? metadata : {}; }; utils.removePropertiesFromObject = function(objectToModify, keysToRemove) { - if (objectToModify && typeof objectToModify === "object" && !Array.isArray(objectToModify) && + if (objectToModify && typeof objectToModify === 'object' && !Array.isArray(objectToModify) && Object.keys(objectToModify).length > 0 && keysToRemove && Array.isArray(keysToRemove) && keysToRemove.length > 0) { - for (var key in objectToModify) { + for (const key in objectToModify) { if (objectToModify.hasOwnProperty(key) && keysToRemove.indexOf(key) > -1) { delete objectToModify[key]; } @@ -1104,29 +1106,28 @@ utils.removePropertiesFromObject = function(objectToModify, keysToRemove) { // v2/event utility functions -var BRANCH_STANDARD_EVENTS = [ 'ADD_TO_CART', 'ADD_TO_WISHLIST', 'VIEW_CART', 'INITIATE_PURCHASE', 'ADD_PAYMENT_INFO', 'PURCHASE', 'SPEND_CREDITS', 'SEARCH', 'VIEW_ITEM', 'VIEW_ITEMS', 'RATE', 'SHARE', 'COMPLETE_REGISTRATION', 'COMPLETE_TUTORIAL', 'ACHIEVE_LEVEL', 'UNLOCK_ACHIEVEMENT', 'LOGIN', 'SUBSCRIBE', 'START_TRIAL', 'INVITE', 'RESERVE', 'VIEW_AD', 'CLICK_AD', 'INITIATE_STREAM', 'COMPLETE_STREAM' ]; -var BRANCH_STANDARD_EVENT_DATA = [ 'transaction_id', 'revenue', 'currency', 'shipping', 'tax', 'coupon', 'affiliation', 'search_query', 'description' ]; +const BRANCH_STANDARD_EVENTS = [ 'ADD_TO_CART', 'ADD_TO_WISHLIST', 'VIEW_CART', 'INITIATE_PURCHASE', 'ADD_PAYMENT_INFO', 'PURCHASE', 'SPEND_CREDITS', 'SEARCH', 'VIEW_ITEM', 'VIEW_ITEMS', 'RATE', 'SHARE', 'COMPLETE_REGISTRATION', 'COMPLETE_TUTORIAL', 'ACHIEVE_LEVEL', 'UNLOCK_ACHIEVEMENT', 'LOGIN', 'SUBSCRIBE', 'START_TRIAL', 'INVITE', 'RESERVE', 'VIEW_AD', 'CLICK_AD', 'INITIATE_STREAM', 'COMPLETE_STREAM' ]; +const BRANCH_STANDARD_EVENT_DATA = [ 'transaction_id', 'revenue', 'currency', 'shipping', 'tax', 'coupon', 'affiliation', 'search_query', 'description' ]; utils.isStandardEvent = function(eventName) { return eventName && BRANCH_STANDARD_EVENTS.indexOf(eventName) > -1; }; utils.separateEventAndCustomData = function(eventAndCustomData) { - if (!eventAndCustomData || Object.keys(eventAndCustomData).length === 0) { return null; } - var customDataKeys = utils.calculateDiffBetweenArrays(BRANCH_STANDARD_EVENT_DATA, Object.keys(eventAndCustomData)); - var customData = {}; + const customDataKeys = utils.calculateDiffBetweenArrays(BRANCH_STANDARD_EVENT_DATA, Object.keys(eventAndCustomData)); + const customData = {}; - for (var i = 0; i < customDataKeys.length; i++) { - var key = customDataKeys[i]; + for (let i = 0; i < customDataKeys.length; i++) { + const key = customDataKeys[i]; customData[key] = eventAndCustomData[key]; delete eventAndCustomData[key]; } return { - "custom_data": utils.convertObjectValuesToString(customData), - "event_data": eventAndCustomData + 'custom_data': utils.convertObjectValuesToString(customData), + 'event_data': eventAndCustomData }; }; @@ -1134,7 +1135,7 @@ utils.validateParameterType = function(parameter, type) { if (!type || (parameter === null && type === 'object')) { return false; } - if (type === "array") { + if (type === 'array') { return Array.isArray(parameter); } return typeof parameter === type && !Array.isArray(parameter); @@ -1151,20 +1152,20 @@ utils.getScreenWidth = function() { // Used by logEvent() to send fields related to user's visit and device to v2/event standard and custom // Requires a reference to the branch object to access information such as browser_fingerprint_id utils.getUserData = function(branch) { - var user_data = {}; - user_data = utils.addPropertyIfNotNull(user_data, "http_origin", document.URL); - user_data = utils.addPropertyIfNotNull(user_data, "user_agent", navigator.userAgent); - user_data = utils.addPropertyIfNotNull(user_data, "language", utils.getBrowserLanguageCode()); - user_data = utils.addPropertyIfNotNull(user_data, "screen_width", utils.getScreenWidth()); - user_data = utils.addPropertyIfNotNull(user_data, "screen_height", utils.getScreenHeight()); - user_data = utils.addPropertyIfNotNull(user_data, "http_referrer", document.referrer); - user_data = utils.addPropertyIfNotNull(user_data, "browser_fingerprint_id", branch.browser_fingerprint_id); - user_data = utils.addPropertyIfNotNull(user_data, "developer_identity", branch.identity); - user_data = utils.addPropertyIfNotNull(user_data, "identity", branch.identity); - user_data = utils.addPropertyIfNotNull(user_data, "sdk", "web"); - user_data = utils.addPropertyIfNotNull(user_data, "sdk_version", config.version); - user_data = utils.addPropertyIfNotNullorEmpty(user_data, "model", utils.userAgentData ? utils.userAgentData.model : ""); - user_data = utils.addPropertyIfNotNullorEmpty(user_data, "os_version", utils.userAgentData ? utils.userAgentData.platformVersion : ""); + let user_data = {}; + user_data = utils.addPropertyIfNotNull(user_data, 'http_origin', document.URL); + user_data = utils.addPropertyIfNotNull(user_data, 'user_agent', navigator.userAgent); + user_data = utils.addPropertyIfNotNull(user_data, 'language', utils.getBrowserLanguageCode()); + user_data = utils.addPropertyIfNotNull(user_data, 'screen_width', utils.getScreenWidth()); + user_data = utils.addPropertyIfNotNull(user_data, 'screen_height', utils.getScreenHeight()); + user_data = utils.addPropertyIfNotNull(user_data, 'http_referrer', document.referrer); + user_data = utils.addPropertyIfNotNull(user_data, 'browser_fingerprint_id', branch.browser_fingerprint_id); + user_data = utils.addPropertyIfNotNull(user_data, 'developer_identity', branch.identity); + user_data = utils.addPropertyIfNotNull(user_data, 'identity', branch.identity); + user_data = utils.addPropertyIfNotNull(user_data, 'sdk', 'web'); + user_data = utils.addPropertyIfNotNull(user_data, 'sdk_version', config.version); + user_data = utils.addPropertyIfNotNullorEmpty(user_data, 'model', utils.userAgentData ? utils.userAgentData.model : ''); + user_data = utils.addPropertyIfNotNullorEmpty(user_data, 'os_version', utils.userAgentData ? utils.userAgentData.platformVersion : ''); return user_data; }; @@ -1176,16 +1177,16 @@ utils.isIframe = function() { // Checks if page is on the same domain as its top most window // Will throw a cross-origin frame access error if it is not utils.isSameOriginFrame = function() { - var sameOriginTest = "true"; // without this minification of function doesn't work correctly + let sameOriginTest = 'true'; // without this minification of function doesn't work correctly try { if (window.top.location.search) { - sameOriginTest = "true"; // without this minification of function doesn't work correctly + sameOriginTest = 'true'; // without this minification of function doesn't work correctly } } catch (err) { return false; } - return (sameOriginTest === "true"); // without this minification of function doesn't work correctly + return (sameOriginTest === 'true'); // without this minification of function doesn't work correctly }; // Checks if page is in an iFrame and on the same domain as its top most window @@ -1198,7 +1199,7 @@ utils.getInitialReferrer = function(referringLink) { return referringLink; } if (utils.isIframe()) { - return utils.isSameOriginFrame() ? window.top.document.referrer : ""; + return utils.isSameOriginFrame() ? window.top.document.referrer : ''; } return document.referrer; }; @@ -1225,7 +1226,7 @@ utils.convertObjectValuesToString = function(objectToConvert) { if (!utils.validateParameterType(objectToConvert, 'object') || Object.keys(objectToConvert).length === 0) { return {}; } - for (var key in objectToConvert) { + for (const key in objectToConvert) { if (objectToConvert.hasOwnProperty(key)) { objectToConvert[key] = utils.convertValueToString(objectToConvert[key]); } @@ -1235,7 +1236,7 @@ utils.convertObjectValuesToString = function(objectToConvert) { // Merges user supplied metadata to hosted deep link data for additional Journeys user targeting utils.mergeHostedDeeplinkData = function(hostedDeepLinkData, metadata) { - var hostedDeepLinkDataClone = hostedDeepLinkData ? utils.merge({}, hostedDeepLinkData) : {}; + const hostedDeepLinkDataClone = hostedDeepLinkData ? utils.merge({}, hostedDeepLinkData) : {}; if (metadata && Object.keys(metadata).length > 0) { return Object.keys(hostedDeepLinkDataClone).length > 0 ? utils.merge(hostedDeepLinkDataClone, metadata) : utils.merge({}, metadata); } @@ -1279,12 +1280,12 @@ utils.delay = function(operation, delay) { */ utils.getClientHints = function() { if (navigator.userAgentData) { - var hints = [ + const hints = [ 'model', 'platformVersion' ]; navigator.userAgentData.getHighEntropyValues(hints).then(function(data) { - utils.userAgentData = { 'model': data.model, 'platformVersion': utils.removeTrailingDotZeros(data.platformVersion) }; + utils.userAgentData = {'model': data.model, 'platformVersion': utils.removeTrailingDotZeros(data.platformVersion)}; }); } else { @@ -1299,7 +1300,7 @@ utils.getClientHints = function() { * A utility function to add a property to an object only if its value is not null, empty */ utils.addPropertyIfNotNullorEmpty = function(obj, key, value) { - if (typeof value === "string" && !!value) { + if (typeof value === 'string' && !!value) { obj[key] = value; } return obj; @@ -1311,10 +1312,10 @@ utils.addPropertyIfNotNullorEmpty = function(obj, key, value) { */ utils.removeTrailingDotZeros = function(versionNumber) { if (!!versionNumber) { - var dotZeroRegex = /^([1-9]\d*)\.(0\d*)(\.[0]\d*){1,}$/; + const dotZeroRegex = /^([1-9]\d*)\.(0\d*)(\.[0]\d*){1,}$/; - if (versionNumber.indexOf(".") !== -1) { - var dotString = versionNumber.substring(0, versionNumber.indexOf(".")); + if (versionNumber.indexOf('.') !== -1) { + const dotString = versionNumber.substring(0, versionNumber.indexOf('.')); versionNumber = versionNumber.replace(dotZeroRegex, dotString); } } diff --git a/src/2_resources.js b/src/2_resources.js index 16a3501cb..9923d49f7 100644 --- a/src/2_resources.js +++ b/src/2_resources.js @@ -9,10 +9,10 @@ goog.provide('resources'); goog.require('utils'); goog.require('config'); -var resources = { }; +const resources = { }; /** @enum {number} */ -var validationTypes = { +const validationTypes = { OBJECT: 0, STRING: 1, NUMBER: 2, @@ -23,7 +23,8 @@ var validationTypes = { /* jshint ignore:start */ /** @typedef {function(string, string, *)} */ -var _validator; +// eslint-disable-next-line no-unused-vars +let _validator; /* jshint ignore:end */ @@ -81,120 +82,120 @@ function validator(required, type) { } function defaults(obj) { - var def = { - "browser_fingerprint_id": validator(true, validationTypes.STRING), - "identity_id": validator(true, validationTypes.STRING), - "sdk": validator(true, validationTypes.STRING), - "session_id": validator(true, validationTypes.STRING) + const def = { + 'browser_fingerprint_id': validator(true, validationTypes.STRING), + 'identity_id': validator(true, validationTypes.STRING), + 'sdk': validator(true, validationTypes.STRING), + 'session_id': validator(true, validationTypes.STRING) }; return utils.merge(obj, def); } resources.open = { destination: config.api_endpoint, - endpoint: "/v1/open", + endpoint: '/v1/open', method: utils.httpMethod.POST, params: { - "browser_fingerprint_id": validator(false, validationTypes.STRING), - "alternative_browser_fingerprint_id": validator(false, validationTypes.STRING), - "identity_id": validator(false, validationTypes.STRING), - "identity": validator(false, validationTypes.STRING), - "link_identifier": validator(false, validationTypes.STRING), - "sdk": validator(false, validationTypes.STRING), - "options": validator(false, validationTypes.OBJECT), - "initial_referrer": validator(false, validationTypes.STRING), - "tracking_disabled": validator(false, validationTypes.BOOLEAN), - "current_url": validator(false, validationTypes.STRING), - "screen_height": validator(false, validationTypes.NUMBER), - "screen_width": validator(false, validationTypes.NUMBER), - "model": validator(false, validationTypes.STRING), - "os_version": validator(false, validationTypes.STRING) + 'browser_fingerprint_id': validator(false, validationTypes.STRING), + 'alternative_browser_fingerprint_id': validator(false, validationTypes.STRING), + 'identity_id': validator(false, validationTypes.STRING), + 'identity': validator(false, validationTypes.STRING), + 'link_identifier': validator(false, validationTypes.STRING), + 'sdk': validator(false, validationTypes.STRING), + 'options': validator(false, validationTypes.OBJECT), + 'initial_referrer': validator(false, validationTypes.STRING), + 'tracking_disabled': validator(false, validationTypes.BOOLEAN), + 'current_url': validator(false, validationTypes.STRING), + 'screen_height': validator(false, validationTypes.NUMBER), + 'screen_width': validator(false, validationTypes.NUMBER), + 'model': validator(false, validationTypes.STRING), + 'os_version': validator(false, validationTypes.STRING) } }; resources._r = { destination: config.app_service_endpoint, - endpoint: "/_r", + endpoint: '/_r', method: utils.httpMethod.GET, jsonp: true, params: { - "sdk": validator(true, validationTypes.STRING), - "_t": validator(false, validationTypes.STRING), - "branch_key": validator(true, validationTypes.STRING) + 'sdk': validator(true, validationTypes.STRING), + '_t': validator(false, validationTypes.STRING), + 'branch_key': validator(true, validationTypes.STRING) } }; resources.linkClick = { - destination: "", - endpoint: "", + destination: '', + endpoint: '', method: utils.httpMethod.GET, queryPart: { - "link_url": validator(true, validationTypes.STRING) + 'link_url': validator(true, validationTypes.STRING) }, params: { - "click": validator(true, validationTypes.STRING) + 'click': validator(true, validationTypes.STRING) } }; resources.link = { destination: config.api_endpoint, - endpoint: "/v1/url", + endpoint: '/v1/url', method: utils.httpMethod.POST, - ref: "obj", + ref: 'obj', params: defaults({ - "alias": validator(false, validationTypes.STRING), - "campaign": validator(false, validationTypes.STRING), - "channel": validator(false, validationTypes.STRING), - "data": validator(false, validationTypes.STRING), - "feature": validator(false, validationTypes.STRING), - "identity_id": validator(true, validationTypes.STRING), - "stage": validator(false, validationTypes.STRING), - "tags": validator(false, validationTypes.ARRAY), - "type": validator(false, validationTypes.NUMBER), - "source": validator(false, validationTypes.STRING), - "instrumentation": validator(false, validationTypes.STRING) + 'alias': validator(false, validationTypes.STRING), + 'campaign': validator(false, validationTypes.STRING), + 'channel': validator(false, validationTypes.STRING), + 'data': validator(false, validationTypes.STRING), + 'feature': validator(false, validationTypes.STRING), + 'identity_id': validator(true, validationTypes.STRING), + 'stage': validator(false, validationTypes.STRING), + 'tags': validator(false, validationTypes.ARRAY), + 'type': validator(false, validationTypes.NUMBER), + 'source': validator(false, validationTypes.STRING), + 'instrumentation': validator(false, validationTypes.STRING) }) }; resources.qrCode = { destination: config.api_endpoint, - endpoint: "/v1/qr-code", + endpoint: '/v1/qr-code', method: utils.httpMethod.POST, - ref: "obj", + ref: 'obj', params: defaults({ - "alias": validator(false, validationTypes.STRING), - "campaign": validator(false, validationTypes.STRING), - "channel": validator(false, validationTypes.STRING), - "data": validator(false, validationTypes.STRING), - "qr_code_settings": validator(false, validationTypes.STRING), - "feature": validator(false, validationTypes.STRING), - "identity_id": validator(true, validationTypes.STRING), - "stage": validator(false, validationTypes.STRING), - "tags": validator(false, validationTypes.ARRAY), - "type": validator(false, validationTypes.NUMBER), - "source": validator(false, validationTypes.STRING) + 'alias': validator(false, validationTypes.STRING), + 'campaign': validator(false, validationTypes.STRING), + 'channel': validator(false, validationTypes.STRING), + 'data': validator(false, validationTypes.STRING), + 'qr_code_settings': validator(false, validationTypes.STRING), + 'feature': validator(false, validationTypes.STRING), + 'identity_id': validator(true, validationTypes.STRING), + 'stage': validator(false, validationTypes.STRING), + 'tags': validator(false, validationTypes.ARRAY), + 'type': validator(false, validationTypes.NUMBER), + 'source': validator(false, validationTypes.STRING) }) }; resources.deepview = { destination: config.api_endpoint, - endpoint: "/v1/deepview", + endpoint: '/v1/deepview', jsonp: true, method: utils.httpMethod.POST, params: defaults({ - "campaign": validator(false, validationTypes.STRING), - "_t": validator(false, validationTypes.STRING), - "channel": validator(false, validationTypes.STRING), - "data": validator(true, validationTypes.STRING), - "feature": validator(false, validationTypes.STRING), - "link_click_id": validator(false, validationTypes.STRING), - "open_app": validator(false, validationTypes.BOOLEAN), - "append_deeplink_path": validator(false, validationTypes.BOOLEAN), - "stage": validator(false, validationTypes.STRING), - "tags": validator(false, validationTypes.ARRAY), - "deepview_type": validator(true, validationTypes.STRING), - "source": validator(true, validationTypes.STRING) + 'campaign': validator(false, validationTypes.STRING), + '_t': validator(false, validationTypes.STRING), + 'channel': validator(false, validationTypes.STRING), + 'data': validator(true, validationTypes.STRING), + 'feature': validator(false, validationTypes.STRING), + 'link_click_id': validator(false, validationTypes.STRING), + 'open_app': validator(false, validationTypes.BOOLEAN), + 'append_deeplink_path': validator(false, validationTypes.BOOLEAN), + 'stage': validator(false, validationTypes.STRING), + 'tags': validator(false, validationTypes.ARRAY), + 'deepview_type': validator(true, validationTypes.STRING), + 'source': validator(true, validationTypes.STRING) }) }; @@ -202,101 +203,101 @@ resources.deepview = { resources.logStandardEvent = { destination: config.api_endpoint, - endpoint: "/v2/event/standard", + endpoint: '/v2/event/standard', method: utils.httpMethod.POST, params: { - "name": validator(true, validationTypes.STRING), - "user_data": validator(true, validationTypes.STRING), - "custom_data": validator(false, validationTypes.STRING), - "event_data": validator(false, validationTypes.STRING), - "content_items": validator(false, validationTypes.STRING), - "customer_event_alias": validator(false, validationTypes.STRING) + 'name': validator(true, validationTypes.STRING), + 'user_data': validator(true, validationTypes.STRING), + 'custom_data': validator(false, validationTypes.STRING), + 'event_data': validator(false, validationTypes.STRING), + 'content_items': validator(false, validationTypes.STRING), + 'customer_event_alias': validator(false, validationTypes.STRING) } }; resources.logCustomEvent = { destination: config.api_endpoint, - endpoint: "/v2/event/custom", + endpoint: '/v2/event/custom', method: utils.httpMethod.POST, params: { - "name": validator(true, validationTypes.STRING), - "user_data": validator(true, validationTypes.STRING), - "custom_data": validator(false, validationTypes.STRING), - "event_data": validator(false, validationTypes.STRING), - "content_items": validator(false, validationTypes.STRING), - "customer_event_alias": validator(false, validationTypes.STRING) + 'name': validator(true, validationTypes.STRING), + 'user_data': validator(true, validationTypes.STRING), + 'custom_data': validator(false, validationTypes.STRING), + 'event_data': validator(false, validationTypes.STRING), + 'content_items': validator(false, validationTypes.STRING), + 'customer_event_alias': validator(false, validationTypes.STRING) } }; resources.pageview = { destination: config.api_endpoint, - endpoint: "/v1/pageview", + endpoint: '/v1/pageview', method: utils.httpMethod.POST, params: defaults({ - "event": validator(true, validationTypes.STRING), - "metadata": validator(false, validationTypes.OBJECT), - "initial_referrer": validator(false, validationTypes.STRING), - "tracking_disabled": validator(false, validationTypes.BOOLEAN), - "branch_view_id": validator(false, validationTypes.STRING), - "no_journeys": validator(false, validationTypes.BOOLEAN), - "user_language": validator(false, validationTypes.STRING), - "open_app": validator(false, validationTypes.BOOLEAN), - "has_app_websdk": validator(false, validationTypes.BOOLEAN), - "source": validator(false, validationTypes.STRING), - "feature": validator(false, validationTypes.STRING), - "is_iframe": validator(false, validationTypes.BOOLEAN), - "data": validator(false, validationTypes.OBJECT), - "callback_string": validator(false, validationTypes.STRING), - "journey_displayed": validator(false, validationTypes.BOOLEAN), - "audience_rule_id": validator(false, validationTypes.STRING), - "journey_dismissals": validator(false, validationTypes.OBJECT), - "identity_id": validator(false, validationTypes.STRING), - "identity": validator(true, validationTypes.STRING), - "session_referring_link_data": validator(false, validationTypes.STRING), - "session_link_click_id": validator(false, validationTypes.STRING) + 'event': validator(true, validationTypes.STRING), + 'metadata': validator(false, validationTypes.OBJECT), + 'initial_referrer': validator(false, validationTypes.STRING), + 'tracking_disabled': validator(false, validationTypes.BOOLEAN), + 'branch_view_id': validator(false, validationTypes.STRING), + 'no_journeys': validator(false, validationTypes.BOOLEAN), + 'user_language': validator(false, validationTypes.STRING), + 'open_app': validator(false, validationTypes.BOOLEAN), + 'has_app_websdk': validator(false, validationTypes.BOOLEAN), + 'source': validator(false, validationTypes.STRING), + 'feature': validator(false, validationTypes.STRING), + 'is_iframe': validator(false, validationTypes.BOOLEAN), + 'data': validator(false, validationTypes.OBJECT), + 'callback_string': validator(false, validationTypes.STRING), + 'journey_displayed': validator(false, validationTypes.BOOLEAN), + 'audience_rule_id': validator(false, validationTypes.STRING), + 'journey_dismissals': validator(false, validationTypes.OBJECT), + 'identity_id': validator(false, validationTypes.STRING), + 'identity': validator(true, validationTypes.STRING), + 'session_referring_link_data': validator(false, validationTypes.STRING), + 'session_link_click_id': validator(false, validationTypes.STRING) }) }; resources.dismiss = { destination: config.api_endpoint, - endpoint: "/v1/dismiss", + endpoint: '/v1/dismiss', method: utils.httpMethod.POST, params: defaults({ - "event": validator(true, validationTypes.STRING), - "metadata": validator(false, validationTypes.OBJECT), - "initial_referrer": validator(false, validationTypes.STRING), - "tracking_disabled": validator(false, validationTypes.BOOLEAN), - "branch_view_id": validator(false, validationTypes.STRING), - "no_journeys": validator(false, validationTypes.BOOLEAN), - "user_language": validator(false, validationTypes.STRING), - "open_app": validator(false, validationTypes.BOOLEAN), - "has_app_websdk": validator(false, validationTypes.BOOLEAN), - "source": validator(false, validationTypes.STRING), - "feature": validator(false, validationTypes.STRING), - "is_iframe": validator(false, validationTypes.BOOLEAN), - "data": validator(false, validationTypes.OBJECT), - "callback_string": validator(false, validationTypes.STRING), - "journey_displayed": validator(false, validationTypes.BOOLEAN), - "audience_rule_id": validator(false, validationTypes.STRING), - "journey_dismissals": validator(false, validationTypes.OBJECT), - "dismissal_source": validator(false, validationTypes.STRING) + 'event': validator(true, validationTypes.STRING), + 'metadata': validator(false, validationTypes.OBJECT), + 'initial_referrer': validator(false, validationTypes.STRING), + 'tracking_disabled': validator(false, validationTypes.BOOLEAN), + 'branch_view_id': validator(false, validationTypes.STRING), + 'no_journeys': validator(false, validationTypes.BOOLEAN), + 'user_language': validator(false, validationTypes.STRING), + 'open_app': validator(false, validationTypes.BOOLEAN), + 'has_app_websdk': validator(false, validationTypes.BOOLEAN), + 'source': validator(false, validationTypes.STRING), + 'feature': validator(false, validationTypes.STRING), + 'is_iframe': validator(false, validationTypes.BOOLEAN), + 'data': validator(false, validationTypes.OBJECT), + 'callback_string': validator(false, validationTypes.STRING), + 'journey_displayed': validator(false, validationTypes.BOOLEAN), + 'audience_rule_id': validator(false, validationTypes.STRING), + 'journey_dismissals': validator(false, validationTypes.OBJECT), + 'dismissal_source': validator(false, validationTypes.STRING) }) }; resources.crossPlatformIds = { destination: config.api_endpoint, - endpoint: "/v1/cpid", + endpoint: '/v1/cpid', method: utils.httpMethod.POST, params: { - "user_data": validator(true, validationTypes.STRING) + 'user_data': validator(true, validationTypes.STRING) } }; resources.lastAttributedTouchData = { destination: config.api_endpoint, - endpoint: "/v1/cpid/latd", + endpoint: '/v1/cpid/latd', method: utils.httpMethod.POST, params: { - "user_data": validator(true, validationTypes.STRING) + 'user_data': validator(true, validationTypes.STRING) } }; diff --git a/src/2_session.js b/src/2_session.js index 2bbb19739..6f7d79319 100644 --- a/src/2_session.js +++ b/src/2_session.js @@ -1,7 +1,7 @@ 'use strict'; goog.provide('session'); -/*jshint unused:false*/ +/* jshint unused:false*/ goog.require('goog.json'); goog.require('utils'); goog.require('safejson'); @@ -13,9 +13,9 @@ goog.require('storage'); * @return {Object} */ session.get = function(storage, first) { - var sessionString = first ? 'branch_session_first' : 'branch_session'; + const sessionString = first ? 'branch_session_first' : 'branch_session'; try { - var data = safejson.parse(storage.get(sessionString, first)) || null; + const data = safejson.parse(storage.get(sessionString, first)) || null; return utils.decodeBFPs(data); } catch (e) { @@ -29,9 +29,8 @@ session.get = function(storage, first) { * @param {boolean=} first */ session.set = function(storage, data, first) { - if (first && data['referring_link'] && utils.userPreferences.enableExtendedJourneysAssist) { - var now = new Date(); + const now = new Date(); data['referringLinkExpiry'] = now.getTime() + utils.extendedJourneysAssistExpiryTime; } data = utils.encodeBFPs(data); @@ -49,8 +48,8 @@ session.update = function(storage, newData) { if (!newData) { return; } - var currentData = session.get(storage) || {}; - var data = goog.json.serialize(utils.encodeBFPs(utils.merge(currentData, newData))); + const currentData = session.get(storage) || {}; + const data = goog.json.serialize(utils.encodeBFPs(utils.merge(currentData, newData))); storage.set('branch_session', data); }; @@ -62,15 +61,15 @@ session.update = function(storage, newData) { * @param {boolean=} removeNull delete null or undefined entries instead of inserting */ session.patch = function(storage, data, updateLocalStorage, removeNull) { - var merge = function(source, patch) { + const merge = function(source, patch) { return utils.encodeBFPs(utils.merge(safejson.parse(source), patch, removeNull)); }; - var session = storage.get('branch_session', false) || {}; + const session = storage.get('branch_session', false) || {}; storage.set('branch_session', goog.json.serialize(merge(session, data))); if (updateLocalStorage) { - var sessionFirst = storage.get('branch_session_first', true) || {}; + const sessionFirst = storage.get('branch_session_first', true) || {}; storage.set('branch_session_first', goog.json.serialize(merge(sessionFirst, data)), true); } }; diff --git a/src/2_storage.js b/src/2_storage.js index 8652101d0..a5043b583 100644 --- a/src/2_storage.js +++ b/src/2_storage.js @@ -6,26 +6,22 @@ 'use strict'; goog.provide('storage'); -/*jshint unused:false*/ +/* jshint unused:false*/ goog.require('goog.json'); goog.require('utils'); -/*globals Ti */ - -var COOKIE_MS = 365 * 24 * 60 * 60 * 1000; -var BRANCH_KEY_PREFIX = 'BRANCH_WEBSDK_KEY'; +const BRANCH_KEY_PREFIX = 'BRANCH_WEBSDK_KEY'; /** @typedef {undefined|{get:function(string, boolean=), set:function(string, (string|boolean), boolean=), * remove:function(string), clear:function(), isEnabled:function()}} */ -var storage; /** * @class BranchStorage * @constructor */ -var BranchStorage = function(storageMethods) { - for (var i = 0; i < storageMethods.length; i++) { - var storageMethod = this[storageMethods[i]]; +const BranchStorage = function(storageMethods) { + for (let i = 0; i < storageMethods.length; i++) { + let storageMethod = this[storageMethods[i]]; storageMethod = (typeof storageMethod === 'function') ? storageMethod() : storageMethod; if (storageMethod.isEnabled()) { storageMethod._store = { }; @@ -34,17 +30,17 @@ var BranchStorage = function(storageMethods) { } }; -var prefix = function(key) { +const prefix = function(key) { return (key === 'branch_session' || key === 'branch_session_first') ? key : BRANCH_KEY_PREFIX + key; }; -var trimPrefix = function(key) { +const trimPrefix = function(key) { return key.replace(BRANCH_KEY_PREFIX, ''); }; -var retrieveValue = function(value) { +const retrieveValue = function(value) { if (value === 'true') { return true; } @@ -54,25 +50,25 @@ var retrieveValue = function(value) { return value; }; -var hasBranchPrefix = function(key) { +const hasBranchPrefix = function(key) { return key.indexOf(BRANCH_KEY_PREFIX) === 0; }; -var isBranchCookie = function(key) { +const isBranchCookie = function(key) { return key === 'branch_session' || key === 'branch_session_first' || hasBranchPrefix(key); }; -var processCookie = function(row) { - var cookie = row.trim(); - var firstEqualSign = cookie.indexOf("="); +const processCookie = function(row) { + const cookie = row.trim(); + const firstEqualSign = cookie.indexOf('='); return { name: cookie.substring(0, firstEqualSign), value: retrieveValue(cookie.substring(firstEqualSign + 1, cookie.length)) }; }; -var webStorage = function(perm) { - var storageMethod; +const webStorage = function(perm) { + let storageMethod; try { storageMethod = perm && localStorage ? localStorage : sessionStorage; } @@ -89,8 +85,8 @@ var webStorage = function(perm) { return null; } - var allKeyValues = null; - for (var key in storageMethod) { + let allKeyValues = null; + for (const key in storageMethod) { if (key.indexOf(BRANCH_KEY_PREFIX) === 0) { if (allKeyValues === null) { allKeyValues = { }; @@ -102,7 +98,7 @@ var webStorage = function(perm) { }, get: function(key, perm_override) { // Make sure that browser_fingerprint_id gets decoded every time it is accessed. - if (key === 'browser_fingerprint_id' || key === "alternative_browser_fingerprint_id") { + if (key === 'browser_fingerprint_id' || key === 'alternative_browser_fingerprint_id') { return perm_override && localStorage ? utils.base64Decode(localStorage.getItem(prefix(key))) : utils.base64Decode(storageMethod.getItem(prefix(key))); @@ -159,12 +155,12 @@ BranchStorage.prototype['session'] = function() { return webStorage(false); }; -var cookies = function() { - var setCookie = function(key, value) { +const cookies = function() { + const setCookie = function(key, value) { document.cookie = key + '=' + value + '; path=/'; }; - var removeCookie = function(key, addPrefix) { - var expires = 'Thu, 01 Jan 1970 00:00:01 GMT'; + const removeCookie = function(key, addPrefix) { + const expires = 'Thu, 01 Jan 1970 00:00:01 GMT'; if (addPrefix) { key = prefix(key); } @@ -172,10 +168,10 @@ var cookies = function() { }; return { getAll: function() { - var returnCookieObject = { }; - var cookieArray = document.cookie.split(';'); - for (var i = 0; i < cookieArray.length; i++) { - var cookie = processCookie(cookieArray[i]); + const returnCookieObject = { }; + const cookieArray = document.cookie.split(';'); + for (let i = 0; i < cookieArray.length; i++) { + const cookie = processCookie(cookieArray[i]); if (cookie && cookie.hasOwnProperty('name') && cookie.hasOwnProperty('value') && isBranchCookie(cookie['name'])) { returnCookieObject[trimPrefix(cookie['name'])] = cookie['value']; } @@ -184,9 +180,9 @@ var cookies = function() { }, get: function(key) { key = prefix(key); - var cookieArray = document.cookie.split(';'); - for (var i = 0; i < cookieArray.length; i++) { - var cookie = processCookie(cookieArray[i]); + const cookieArray = document.cookie.split(';'); + for (let i = 0; i < cookieArray.length; i++) { + const cookie = processCookie(cookieArray[i]); if (cookie && cookie.hasOwnProperty('name') && cookie.hasOwnProperty('value') && cookie['name'] === key) { return cookie['value']; } @@ -200,9 +196,9 @@ var cookies = function() { removeCookie(key, true); }, clear: function() { - var cookieArray = document.cookie.split(';'); - for (var i = 0; i < cookieArray.length; i++) { - var cookie = processCookie(cookieArray[i]); + const cookieArray = document.cookie.split(';'); + for (let i = 0; i < cookieArray.length; i++) { + const cookie = processCookie(cookieArray[i]); if (cookie && cookie.hasOwnProperty('name') && isBranchCookie(cookie['name'])) { removeCookie(cookie['name'], false); } diff --git a/src/3_api.js b/src/3_api.js index c30e5aaca..a51498a7b 100644 --- a/src/3_api.js +++ b/src/3_api.js @@ -2,40 +2,40 @@ * This provides the principal function to make a call to the API. Basically * a fancy wrapper around XHR/JSONP/etc. */ - 'use strict'; +'use strict'; - goog.provide('Server'); - goog.require('utils'); - goog.require('goog.json'); - goog.require('storage'); // jshint unused:false - goog.require('safejson'); +goog.provide('Server'); +goog.require('utils'); +goog.require('goog.json'); +goog.require('storage'); // jshint unused:false +goog.require('safejson'); - /** +/** * @class Server * @constructor */ - var Server = function() { }; +const Server = function() { }; - Server.prototype._jsonp_callback_index = 0; +Server.prototype._jsonp_callback_index = 0; - /** +/** * @param {Object} obj * @param {string} prefix */ - Server.prototype.serializeObject = function(obj, prefix) { +Server.prototype.serializeObject = function(obj, prefix) { if (typeof obj === 'undefined') { return ''; } - var pairs = [ ]; + const pairs = [ ]; if (obj instanceof Array) { - for (var i = 0; i < obj.length; i++) { + for (let i = 0; i < obj.length; i++) { pairs.push(encodeURIComponent(prefix) + '=' + encodeURIComponent(obj[i])); } return pairs.join('&'); } - for (var prop in obj) { + for (const prop in obj) { if (!obj.hasOwnProperty(prop)) { continue; } @@ -52,21 +52,21 @@ } } return pairs.join('&'); - }; +}; - /** +/** * @param {utils.resource} resource * @param {Object.} data */ - Server.prototype.getUrl = function(resource, data) { - var k; - var v; - var err; - var url = resource.destination + resource.endpoint; - var branch_id = /^[0-9]{15,20}$/; - var branch_key = /key_(live|test)_[A-Za-z0-9]{32}/; - - var appendKeyOrId = function(data, destinationObject) { +Server.prototype.getUrl = function(resource, data) { + let k; + let v; + let err; + let url = resource.destination + resource.endpoint; + const branch_id = /^[0-9]{15,20}$/; + const branch_key = /key_(live|test)_[A-Za-z0-9]{32}/; + + const appendKeyOrId = function(data, destinationObject) { if (typeof destinationObject === 'undefined') { destinationObject = { }; } @@ -101,13 +101,13 @@ resource.queryPart[k](resource.endpoint, k, data[k]) : err; if (err) { - return { error: err }; + return {error: err}; } url += '/' + data[k]; } } - var d = { }; + const d = { }; // TODO: Add validation for v1/pageview and v1/dismiss, move setBranchViewData into a separate location so that it is isolated if (typeof resource.params !== 'undefined' && resource.endpoint !== '/v1/pageview' && resource.endpoint !== '/v1/dismiss') { for (k in resource.params) { @@ -157,21 +157,21 @@ data: this.serializeObject(d, ''), url: url.replace(/^\//, '') }; - }; +}; - /** +/** * This function is standalone for easy mocking. * @param {string} src */ - Server.prototype.createScript = function(src, onError, onLoad) { - var script = document.createElement('script'); +Server.prototype.createScript = function(src, onError, onLoad) { + const script = document.createElement('script'); script.type = 'text/javascript'; script.async = true; script.src = src; utils.addNonceAttribute(script); - var heads = document.getElementsByTagName('head'); + const heads = document.getElementsByTagName('head'); if (!heads || heads.length < 1) { if (typeof onError === 'function') { onError(); @@ -186,17 +186,17 @@ if (typeof onLoad === 'function') { utils.addEvent(script, 'load', onLoad); } - }; +}; - /** +/** * @param {string} requestURL * @param {Object} requestData * @param {utils._httpMethod} requestMethod * @param {function(?Error,*=,?=)=} callback */ - Server.prototype.jsonpRequest = function(requestURL, requestData, requestMethod, callback) { - var brtt = Date.now(); - var brttTag = utils.currentRequestBrttTag; +Server.prototype.jsonpRequest = function(requestURL, requestData, requestMethod, callback) { + const brtt = Date.now(); + const brttTag = utils.currentRequestBrttTag; /* On iOS 11-Safari when a partner calls .deepview() and uses $uri_redirect_mode: 2, they will not get transported into the app (if installed) on pageload because callbackString will evaluate to branch_callback_0. The backend expects branch_callback_1 @@ -205,14 +205,14 @@ if (this._jsonp_callback_index === 0 && utils.isSafari11OrGreater()) { this._jsonp_callback_index++; } - var callbackString = 'branch_callback__' + (this._jsonp_callback_index++); + const callbackString = 'branch_callback__' + (this._jsonp_callback_index++); - var postPrefix = (requestURL.indexOf('branch.io') >= 0) ? '&data=' : '&post_data='; - var postData = (requestMethod === 'POST') ? + const postPrefix = (requestURL.indexOf('branch.io') >= 0) ? '&data=' : '&post_data='; + const postData = (requestMethod === 'POST') ? encodeURIComponent(utils.base64encode(goog.json.serialize(requestData))) : ''; - var timeoutTrigger = window.setTimeout( + const timeoutTrigger = window.setTimeout( function() { window[callbackString] = function() { }; utils.addPropertyIfNotNull(utils.instrumentation, brttTag, utils.calculateBrtt(brtt)); @@ -255,9 +255,9 @@ } delete window[callbackString]; }); - }; +}; - /** +/** * @param {string} url * @param {Object} data * @param {utils._httpMethod} method @@ -266,12 +266,12 @@ * @param {?boolean=} noParse - _optional_ - * @param {?string} responseType - _optional_ - */ - Server.prototype.XHRRequest = function(url, data, method, storage, callback, noParse, responseType) { - var brtt = Date.now(); - var brttTag = utils.currentRequestBrttTag; - var req = (window.XMLHttpRequest ? - new XMLHttpRequest() : - new ActiveXObject('Microsoft.XMLHTTP')); +Server.prototype.XHRRequest = function(url, data, method, storage, callback, noParse, responseType) { + const brtt = Date.now(); + const brttTag = utils.currentRequestBrttTag; + const req = (window.XMLHttpRequest ? + new XMLHttpRequest() : + new ActiveXObject('Microsoft.XMLHTTP')); if (responseType) { req.responseType = responseType; @@ -285,14 +285,14 @@ callback(new Error(e.error || ('Error in API: ' + req.status)), null, req.status); }; req.onreadystatechange = function() { - var data; + let data; if (req.readyState === 4) { utils.addPropertyIfNotNull(utils.instrumentation, brttTag, utils.calculateBrtt(brtt)); if (req.status === 200) { // Response value will be in "req.responseText" by default, unless // the "req.responseType" is "text" or null. // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest - if (req.responseType === "arraybuffer") { + if (req.responseType === 'arraybuffer') { data = req.response; } else if (noParse) { @@ -312,7 +312,7 @@ req.status.toString().substring(0, 1) === '5') { // Server returns helpful information when a partner sends up incorrect fields in logEvent(). // This information appears in req.responseText. - if (req['responseURL'] && req['responseURL'].includes("v2/event")) { + if (req['responseURL'] && req['responseURL'].includes('v2/event')) { callback(req['responseText'], null, req['status']); } else { @@ -332,18 +332,18 @@ storage.set('use_jsonp', true); this.jsonpRequest(url, data, method, callback); } - }; +}; - /** +/** * @param {utils.resource} resource * @param {Object.} data * @param {storage} storage * @param {function(?Error,*=)=} callback */ - Server.prototype.request = function(resource, data, storage, callback) { - var self = this; +Server.prototype.request = function(resource, data, storage, callback) { + const self = this; - if (resource.endpoint === "/v1/pageview" && data && data['journey_displayed']) { + if (resource.endpoint === '/v1/pageview' && data && data['journey_displayed']) { // special case for pageview endpoint utils.currentRequestBrttTag = resource.endpoint + '-1-brtt'; } @@ -351,7 +351,7 @@ utils.currentRequestBrttTag = resource.endpoint + '-brtt'; } - if ((resource.endpoint === "/v1/url") && Object.keys(utils.instrumentation).length > 1) { + if ((resource.endpoint === '/v1/url') && Object.keys(utils.instrumentation).length > 1) { delete utils.instrumentation['-brtt']; data['instrumentation'] = safejson.stringify(utils.merge({}, utils.instrumentation)); utils.instrumentation = {}; @@ -359,17 +359,17 @@ // Removes PII from request data in case fields flow in from cascading requests if (utils.userPreferences.trackingDisabled) { - var PII = [ 'browser_fingerprint_id', 'alternative_browser_fingerprint_id', 'identity_id', 'session_id', 'identity' ]; - for (var index = 0; index < PII.length; index++) { + const PII = [ 'browser_fingerprint_id', 'alternative_browser_fingerprint_id', 'identity_id', 'session_id', 'identity' ]; + for (let index = 0; index < PII.length; index++) { if (data.hasOwnProperty(PII[index])) { delete data[PII[index]]; } } } - var u = this.getUrl(resource, data); + const u = this.getUrl(resource, data); if (u.error) { - var errorObj = { + const errorObj = { message: u.error, endpoint: resource.endpoint, data: data @@ -377,8 +377,8 @@ return callback(new Error(safejson.stringify(errorObj))); } - var url; - var postData = ''; + let url; + let postData = ''; if (resource.method === 'GET') { url = u.url + '?' + u.data; } @@ -387,7 +387,7 @@ postData = u.data; } - var requestBody; + let requestBody; if (storage.get('use_jsonp') || resource.jsonp) { requestBody = data; } @@ -396,12 +396,12 @@ } // How many times to retry the request if the initial attempt fails - var retries = utils.retries; + let retries = utils.retries; // If request fails, retry after X miliseconds - /*** + /** * * @type {function(?Error,*=): ?undefined} */ - var done = function(err, data, status) { + const done = function(err, data, status) { if (typeof self.onAPIResponse === 'function') { // Record every request and response, including retries // Note status is always undefined for jsonp requests (/_r and @@ -416,7 +416,7 @@ ); } - if (err && retries > 0 && (status || "").toString().substring(0, 1) === '5') { + if (err && retries > 0 && (status || '').toString().substring(0, 1) === '5') { retries--; window.setTimeout(function() { makeRequest(); @@ -432,14 +432,14 @@ return utils.userPreferences.allowErrorsInCallback ? done(new Error(utils.messages.trackingDisabled), null, 300) : done(null, {}, 200); } - var noParseJsonResp = false; - var responseType; - if (resource.endpoint === "/v1/qr-code") { + let noParseJsonResp = false; + let responseType; + if (resource.endpoint === '/v1/qr-code') { noParseJsonResp = true; - responseType = "arraybuffer"; + responseType = 'arraybuffer'; } /* jshint -W003 */ - var makeRequest = function() { + const makeRequest = function() { if (storage.get('use_jsonp') || resource.jsonp) { self.jsonpRequest(url, data, resource.method, done); } @@ -449,4 +449,4 @@ }; /* jshint +W003 */ makeRequest(); - }; +}; diff --git a/src/3_banner_utils.js b/src/3_banner_utils.js index 60920be12..f8e102689 100644 --- a/src/3_banner_utils.js +++ b/src/3_banner_utils.js @@ -81,13 +81,13 @@ banner_utils.removeClass = function(element, className) { return; } if (banner_utils.hasClass(element, className)) { - var reg = new RegExp('(\\s|^)' + className + '(\\s|$)'); + const reg = new RegExp('(\\s|^)' + className + '(\\s|$)'); element.className = element.className.replace(reg, ' '); } }; banner_utils.getDate = function(days) { - var currentDate = new Date(); + const currentDate = new Date(); return currentDate.setDate(currentDate.getDate() + days); }; @@ -101,25 +101,25 @@ banner_utils.getBodyStyle = function(style) { }; banner_utils.addCSSLengths = function(length1, length2) { - var convertToUnitlessPixels = function(input) { + const convertToUnitlessPixels = function(input) { if (!input) { return 0; } - var unit = input.replace(/[0-9,\.]/g, ''); - var inputArray = input.match(/\d+/g); - var value = parseInt(inputArray.length > 0 ? inputArray[0] : '0', 10); - var vw = function() { + const unit = input.replace(/[0-9,\.]/g, ''); + const inputArray = input.match(/\d+/g); + const value = parseInt(inputArray.length > 0 ? inputArray[0] : '0', 10); + const vw = function() { return Math.max(document.documentElement.clientWidth, window.innerWidth || 0) / 100; }; - var vh = function() { + const vh = function() { return Math.max(document.documentElement.clientHeight, window.innerHeight || 0) / 100; }; return parseInt( { - "px": function(value) { + 'px': function(value) { return value; }, - "em": function(value) { + 'em': function(value) { if (document.body.currentStyle) { return value * convertToUnitlessPixels(document.body.currentStyle.fontSize); } @@ -127,7 +127,7 @@ banner_utils.addCSSLengths = function(length1, length2) { return value * parseFloat(window.getComputedStyle(document.body).fontSize); } }, - "rem": function(value) { + 'rem': function(value) { if (document.documentElement.currentStyle) { return value * convertToUnitlessPixels(document.documentElement.currentStyle.fontSize); @@ -137,19 +137,19 @@ banner_utils.addCSSLengths = function(length1, length2) { parseFloat(window.getComputedStyle(document.documentElement).fontSize); } }, - "vw": function(value) { + 'vw': function(value) { return value * vw(); }, - "vh": function(value) { + 'vh': function(value) { return value * vh(); }, - "vmin": function(value) { + 'vmin': function(value) { return value * Math.min(vh(), vw()); }, - "vmax": function(value) { + 'vmax': function(value) { return value * Math.max(vh(), vw()); }, - "%": function() { + '%': function() { return (document.body.clientWidth / 100) * value; } }[unit](value), @@ -165,7 +165,7 @@ banner_utils.addCSSLengths = function(length1, length2) { * @return {boolean} */ banner_utils.shouldAppend = function(storage, options) { - var hideBanner = storage.get('hideBanner', true); + let hideBanner = storage.get('hideBanner', true); if (options.respectDNT && navigator && !!Number(navigator['doNotTrack'])) { return false; @@ -185,7 +185,7 @@ banner_utils.shouldAppend = function(storage, options) { hideBanner = !hideBanner; } - var forgetHide = options.forgetHide; + let forgetHide = options.forgetHide; if (typeof forgetHide === 'number') { forgetHide = false; } diff --git a/src/4_banner_css.js b/src/4_banner_css.js index 1d4232676..8218290b6 100644 --- a/src/4_banner_css.js +++ b/src/4_banner_css.js @@ -160,10 +160,10 @@ banner_css.iframe_position = function(sticky, position) { */ banner_css.css = function(options, element) { // Construct Banner CSS - var style = banner_css.banner(options); + let style = banner_css.banner(options); // User agent specific styles - var userAgent = utils.mobileUserAgent(); + const userAgent = utils.mobileUserAgent(); if ((userAgent === 'ios' || userAgent === 'ipad') && options.showiOS) { style += banner_css.mobile + banner_css.ios; } @@ -184,22 +184,22 @@ banner_css.css = function(options, element) { if (options.iframe) { style += banner_css.inneriframe; - var iFrameCSS = document.createElement('style'); + const iFrameCSS = document.createElement('style'); iFrameCSS.type = 'text/css'; iFrameCSS.id = 'branch-iframe-css'; utils.addNonceAttribute(iFrameCSS); iFrameCSS.innerHTML = banner_css.iframe + banner_css.iframe_position(options.mobileSticky, options.position); - (document.head || document.getElementsByTagName("head")[0]).appendChild(iFrameCSS); + (document.head || document.getElementsByTagName('head')[0]).appendChild(iFrameCSS); } - var css = document.createElement('style'); + const css = document.createElement('style'); css.type = 'text/css'; css.id = 'branch-css'; css.innerHTML = style; utils.addNonceAttribute(css); - var doc = (options.iframe ? element.contentWindow.document : document); - var controlledHead = (doc.head || doc.getElementsByTagName("head")[0]); + const doc = (options.iframe ? element.contentWindow.document : document); + const controlledHead = (doc.head || doc.getElementsByTagName('head')[0]); if (controlledHead && typeof controlledHead.appendChild === 'function') { controlledHead.appendChild(css); } diff --git a/src/4_banner_html.js b/src/4_banner_html.js index 796cac3e5..2e58e2ddc 100644 --- a/src/4_banner_html.js +++ b/src/4_banner_html.js @@ -29,8 +29,8 @@ banner_html.banner = function(options, action) { (options.rating ? ('' + (function() { - var stars = ""; - for (var i = 0; i < 5; i++) { + let stars = ''; + for (let i = 0; i < 5; i++) { stars += '' + '' + '' + @@ -69,7 +69,7 @@ banner_html.banner = function(options, action) { stars += ''; } return stars; - })() + + }()) + '') : '') + (options.reviewCount ? @@ -115,7 +115,7 @@ banner_html.checkmark = function() { * @param {banner_utils.options} options */ banner_html.iframe = function(options, action, callback) { - var iframe = document.createElement('iframe'); + const iframe = document.createElement('iframe'); iframe.src = 'about:blank'; // solves CORS issues, test in IE iframe.style.overflow = 'hidden'; iframe.scrolling = 'no'; @@ -124,8 +124,8 @@ banner_html.iframe = function(options, action, callback) { utils.addNonceAttribute(iframe); iframe.onload = function() { - var bodyClass; - var userAgent = utils.mobileUserAgent(); + let bodyClass; + const userAgent = utils.mobileUserAgent(); if (userAgent === 'ios' || userAgent === 'ipad') { bodyClass = 'branch-banner-ios'; } @@ -136,7 +136,7 @@ banner_html.iframe = function(options, action, callback) { bodyClass = 'branch-banner-other'; } - var iframedoc = iframe.contentDocument || iframe.contentWindow.document; + const iframedoc = iframe.contentDocument || iframe.contentWindow.document; iframedoc.head = iframedoc.createElement('head'); iframedoc.body = iframedoc.createElement('body'); iframedoc.body.className = bodyClass; @@ -155,7 +155,7 @@ banner_html.iframe = function(options, action, callback) { banner_html.div = function(options, action, doc) { doc = doc || document; - var banner = doc.createElement('div'); + const banner = doc.createElement('div'); banner.id = 'branch-banner'; banner.className = 'branch-animation'; banner.innerHTML = banner_html.banner(options, action); @@ -169,7 +169,7 @@ banner_html.div = function(options, action, doc) { * @param {storage} storage */ banner_html.markup = function(options, storage, callback) { - var action = '
' + + const action = '
' + banner_html.mobileAction(options, storage) + '
'; @@ -177,7 +177,7 @@ banner_html.markup = function(options, storage, callback) { banner_html.iframe(options, action, callback); } else { - var markup_div = banner_html.div(options, action, document); + const markup_div = banner_html.div(options, action, document); callback(markup_div); } }; diff --git a/src/5_banner.js b/src/5_banner.js index 5e7f928ba..e6c24db50 100644 --- a/src/5_banner.js +++ b/src/5_banner.js @@ -24,11 +24,11 @@ banner = function(branch, options, linkData, storage) { branch._publishEvent('willShowBanner'); - var element; - var bodyMarginTopInline = document.body.style.marginTop; - var bodyMarginBottomInline = document.body.style.marginBottom; + let element; + const bodyMarginTopInline = document.body.style.marginTop; + const bodyMarginBottomInline = document.body.style.marginBottom; - var closeBanner = function(closeOptions, callback) { + const closeBanner = function(closeOptions, callback) { if (typeof closeOptions === 'function') { callback = closeOptions; closeOptions = {}; @@ -80,21 +80,21 @@ banner = function(branch, options, linkData, storage) { } }; - var finalHookupsCallback = function(markup) { + const finalHookupsCallback = function(markup) { element = markup; // Add CSS banner_css.css(options, element); // Attach actions linkData['channel'] = linkData['channel'] || 'app banner'; - var doc = options.iframe ? element.contentWindow.document : document; + const doc = options.iframe ? element.contentWindow.document : document; if (utils.mobileUserAgent()) { options['open_app'] = options.open_app; options['append_deeplink_path'] = options.append_deeplink_path; options['make_new_link'] = options.make_new_link; options['deepview_type'] = 'banner'; branch['deepview'](linkData, options); - var cta = doc.getElementById('branch-mobile-action'); + const cta = doc.getElementById('branch-mobile-action'); if (cta) { cta.onclick = function(ev) { ev.preventDefault(); @@ -103,8 +103,8 @@ banner = function(branch, options, linkData, storage) { } } - var bodyMarginTopComputed = banner_utils.getBodyStyle('margin-top'); - var bodyMarginBottomComputed = banner_utils.getBodyStyle('margin-bottom'); + const bodyMarginTopComputed = banner_utils.getBodyStyle('margin-top'); + const bodyMarginBottomComputed = banner_utils.getBodyStyle('margin-bottom'); // Trigger animation banner_utils.addClass(document.body, 'branch-banner-is-active'); @@ -117,7 +117,7 @@ banner = function(branch, options, linkData, storage) { banner_utils.addCSSLengths(banner_utils.bannerHeight, bodyMarginBottomComputed); } - var closeButton = doc.getElementById('branch-banner-close'); + const closeButton = doc.getElementById('branch-banner-close'); if (closeButton) { closeButton.onclick = function(ev) { @@ -129,7 +129,7 @@ banner = function(branch, options, linkData, storage) { }; } - var modalBackground = doc.getElementById('branch-banner-modal-background'); + const modalBackground = doc.getElementById('branch-banner-modal-background'); if (modalBackground) { modalBackground.onclick = function(ev) { @@ -157,7 +157,6 @@ banner = function(branch, options, linkData, storage) { else { setTimeout(onAnimationEnd, banner_utils.animationDelay); } - }; // Create markup diff --git a/src/6_branch.js b/src/6_branch.js index 70bdce17b..2dc86a96b 100644 --- a/src/6_branch.js +++ b/src/6_branch.js @@ -1,4 +1,4 @@ -/*** +/** * * This file provides the main Branch function. */ 'use strict'; @@ -17,15 +17,13 @@ goog.require('safejson'); goog.require('branch_view'); goog.require('journeys_utils'); -/*globals Ti, BranchStorage, require */ - -var default_branch; +let default_branch; /** * Enum for what parameters are in a wrapped Branch method * @enum {number} */ -var callback_params = { +const callback_params = { NO_CALLBACK: 0, CALLBACK_ERR: 1, CALLBACK_ERR_DATA: 2 @@ -35,7 +33,7 @@ var callback_params = { * Enum for the initialization state of the Branch Object * @enum {number} */ -var init_states = { +const init_states = { NO_INIT: 0, INIT_PENDING: 1, INIT_FAILED: 2, @@ -46,7 +44,7 @@ var init_states = { * Enum for the initialization state of the Branch Object * @enum {number} */ -var init_state_fail_codes = { +const init_state_fail_codes = { NO_FAILURE: 0, UNKNOWN_CAUSE: 1, OPEN_FAILED: 2, @@ -54,17 +52,17 @@ var init_state_fail_codes = { HAS_APP_FAILED: 4 }; -/*** +/** * * @param {number} parameters * @param {function(...?): undefined} func * @param {boolean=} init */ -var wrap = function(parameters, func, init) { - var r = function() { - var self = this; - var args; - var callback; - var lastArg = arguments[arguments.length - 1]; +const wrap = function(parameters, func, init) { + const r = function() { + const self = this; + let args; + let callback; + const lastArg = arguments[arguments.length - 1]; if (parameters === callback_params.NO_CALLBACK || typeof lastArg !== 'function') { callback = function(err) { return; @@ -76,10 +74,10 @@ var wrap = function(parameters, func, init) { callback = lastArg; } self._queue(function(next) { - /*** + /** * * @type {function(?Error,?): undefined} */ - var done = function(err, data) { + const done = function(err, data) { try { if (err && parameters === callback_params.NO_CALLBACK) { throw err; @@ -114,7 +112,7 @@ var wrap = function(parameters, func, init) { return r; }; -/*** +/** * * @class Branch * @constructor */ @@ -127,13 +125,13 @@ Branch = function() { } this._queue = task_queue(); - var storageMethods = [ 'session', 'cookie', 'pojo' ]; + const storageMethods = [ 'session', 'cookie', 'pojo' ]; this._storage = /** @type {storage} */ (new BranchStorage(storageMethods)); this._server = new Server(); - var sdk = 'web'; + const sdk = 'web'; /** @type {Array} */ this._listeners = [ ]; @@ -145,13 +143,12 @@ Branch = function() { this.init_state_fail_details = null; }; -/*** +/** * * @param {utils.resource} resource * @param {Object.} obj * @param {function(?Error,?)=} callback */ Branch.prototype._api = function(resource, obj, callback) { - if (this.app_id) { obj['app_id'] = this.app_id; } @@ -169,7 +166,7 @@ Branch.prototype._api = function(resource, obj, callback) { obj['identity_id'] = this.identity_id; } - if (resource.endpoint.indexOf("/v1/") < 0) { + if (resource.endpoint.indexOf('/v1/') < 0) { if (((resource.params && resource.params['developer_identity']) || (resource.queryPart && resource.queryPart['developer_identity'])) && this.identity) { @@ -209,25 +206,25 @@ Branch.prototype._api = function(resource, obj, callback) { }); }; -/*** +/** * * @function Branch._referringLink */ Branch.prototype._referringLink = function(forJourneys) { - var sessionData = session.get(this._storage); - var referringLink = sessionData && sessionData['referring_link']; + const sessionData = session.get(this._storage); + const referringLink = sessionData && sessionData['referring_link']; if (referringLink) { return referringLink; } else { if (utils.userPreferences.enableExtendedJourneysAssist && forJourneys) { - var localStorageData = session.get(this._storage, true); - var referring_Link = localStorageData && localStorageData['referring_link']; - var referringLinkExpiry = localStorageData && localStorageData['referringLinkExpiry']; + const localStorageData = session.get(this._storage, true); + const referring_Link = localStorageData && localStorageData['referring_link']; + const referringLinkExpiry = localStorageData && localStorageData['referringLinkExpiry']; if (referring_Link && referringLinkExpiry) { - var now = new Date(); + const now = new Date(); // compare the expiry time of the item with the current time if (now.getTime() > referringLinkExpiry) { - session.patch(this._storage, { "referringLinkExpiry": null }, true, true); + session.patch(this._storage, {'referringLinkExpiry': null}, true, true); } else { return referring_Link; @@ -236,7 +233,7 @@ Branch.prototype._referringLink = function(forJourneys) { } } - var clickId = this._storage.get('click_id'); + const clickId = this._storage.get('click_id'); if (clickId) { return config.link_service_endpoint + '/c/' + clickId; } @@ -244,13 +241,13 @@ Branch.prototype._referringLink = function(forJourneys) { return null; }; -/*** +/** * * @function Branch._publishEvent * @param {string} event * @param {Object} data - _optional_ - data to pass into listener callback. */ Branch.prototype._publishEvent = function(event, data) { - for (var i = 0; i < this._listeners.length; i++) { + for (let i = 0; i < this._listeners.length; i++) { if (!this._listeners[i].event || this._listeners[i].event === event) { this._listeners[i].listener(event, data); } @@ -321,17 +318,16 @@ Branch.prototype._publishEvent = function(event, data) { * **Note:** `Branch.init` must be called prior to calling any other Branch functions. * ___ */ -/*** +TOC_HEADING &Branch Session& ^ALL ***/ -/*** +TOC_ITEM #initbranch_key-options-callback &.init()& ^ALL ***/ +/** * +TOC_HEADING &Branch Session& ^ALL ***/ +/** * +TOC_ITEM #initbranch_key-options-callback &.init()& ^ALL ***/ Branch.prototype['init'] = wrap( callback_params.CALLBACK_ERR_DATA, function(done, branch_key, options) { - if (utils.navigationTimingAPIEnabled) { utils.instrumentation['init-began-at'] = utils.timeSinceNavigationStart(); } - var self = this; + const self = this; self.init_state = init_states.INIT_PENDING; @@ -363,10 +359,10 @@ Branch.prototype['init'] = wrap( // initialize identity_id from storage // note the previous line scrubs this if tracking disabled. - var localData = session.get(self._storage, true); + const localData = session.get(self._storage, true); self.identity_id = localData && localData['identity_id']; - var setBranchValues = function(data) { + const setBranchValues = function(data) { if (data['link_click_id']) { self.link_click_id = data['link_click_id'].toString(); } @@ -397,18 +393,18 @@ Branch.prototype['init'] = wrap( return data; }; - var sessionData = session.get(self._storage); + const sessionData = session.get(self._storage); - var branchMatchIdFromOptions = (options && typeof options['branch_match_id'] !== 'undefined' && options['branch_match_id'] !== null) ? + const branchMatchIdFromOptions = (options && typeof options['branch_match_id'] !== 'undefined' && options['branch_match_id'] !== null) ? options['branch_match_id'] : null; - var link_identifier = (branchMatchIdFromOptions || utils.getParamValue('_branch_match_id') || utils.hashValue('r')); - var freshInstall = !self.identity_id; // initialized from local storage above + const link_identifier = (branchMatchIdFromOptions || utils.getParamValue('_branch_match_id') || utils.hashValue('r')); + const freshInstall = !self.identity_id; // initialized from local storage above self._branchViewEnabled = !!self._storage.get('branch_view_enabled'); - var fetchLatestBrowserFingerPrintID = function(cb) { - var params_r = { "sdk": config.version, "branch_key": self.branch_key }; - var currentSessionData = session.get(self._storage) || {}; - var permData = session.get(self._storage, true) || {}; + const fetchLatestBrowserFingerPrintID = function(cb) { + const params_r = {'sdk': config.version, 'branch_key': self.branch_key}; + const currentSessionData = session.get(self._storage) || {}; + const permData = session.get(self._storage, true) || {}; if (permData['browser_fingerprint_id']) { params_r['_t'] = permData['browser_fingerprint_id']; } @@ -431,19 +427,16 @@ Branch.prototype['init'] = wrap( if (cb) { cb(null, currentSessionData); } - - }; - var restoreIdentityOnInstall = function(data) { + const restoreIdentityOnInstall = function(data) { if (freshInstall) { - data["identity"] = self.identity; + data['identity'] = self.identity; } return data; }; - var finishInit = function(err, data) { - + const finishInit = function(err, data) { if (data) { data = setBranchValues(data); @@ -475,15 +468,15 @@ Branch.prototype['init'] = wrap( self['renderFinalize'](); } - var additionalMetadata = utils.getAdditionalMetadata(); - var metadata = utils.validateParameterType(options['metadata'], "object") ? options['metadata'] : null; + const additionalMetadata = utils.getAdditionalMetadata(); + const metadata = utils.validateParameterType(options['metadata'], 'object') ? options['metadata'] : null; if (metadata) { - var hostedDeeplinkDataWithMergedMetadata = utils.mergeHostedDeeplinkData(additionalMetadata['hosted_deeplink_data'], metadata); + const hostedDeeplinkDataWithMergedMetadata = utils.mergeHostedDeeplinkData(additionalMetadata['hosted_deeplink_data'], metadata); if (hostedDeeplinkDataWithMergedMetadata && Object.keys(hostedDeeplinkDataWithMergedMetadata).length > 0) { additionalMetadata['hosted_deeplink_data'] = hostedDeeplinkDataWithMergedMetadata; } } - var requestData = branch_view._getPageviewRequestData( + const requestData = branch_view._getPageviewRequestData( journeys_utils._getPageviewMetadata(options, additionalMetadata), options, self, @@ -494,13 +487,13 @@ Branch.prototype['init'] = wrap( resources.pageview, requestData, function(err, pageviewResponse) { - if (!err && typeof pageviewResponse === "object") { - var journeyInTestMode = requestData['branch_view_id'] ? true : false; + if (!err && typeof pageviewResponse === 'object') { + const journeyInTestMode = requestData['branch_view_id'] ? true : false; if (branch_view.shouldDisplayJourney( - pageviewResponse, - options, - journeyInTestMode - ) + pageviewResponse, + options, + journeyInTestMode + ) ) { branch_view.displayJourney( pageviewResponse['template'], @@ -513,7 +506,7 @@ Branch.prototype['init'] = wrap( } else { if (pageviewResponse['auto_branchify'] || (!branchMatchIdFromOptions && utils.getParamValue('branchify_url') && self._referringLink())) { - var linkOptions = { + const linkOptions = { 'make_new_link': false, 'open_app': true, 'auto_branchify': true @@ -530,9 +523,9 @@ Branch.prototype['init'] = wrap( ); }); }; - var attachVisibilityEvent = function() { - var hidden; - var changeEvent; + const attachVisibilityEvent = function() { + let hidden; + let changeEvent; if (typeof document.hidden !== 'undefined') { hidden = 'hidden'; changeEvent = 'visibilitychange'; @@ -566,15 +559,15 @@ Branch.prototype['init'] = wrap( }; if (sessionData && sessionData['session_id'] && !link_identifier && !utils.getParamValue('branchify_url')) { // resets data in session storage to prevent previous link click data from being returned to Branch.init() - session.update(self._storage, { "data": "" }); - session.update(self._storage, { "referring_link": "" }); + session.update(self._storage, {'data': ''}); + session.update(self._storage, {'referring_link': ''}); attachVisibilityEvent(); fetchLatestBrowserFingerPrintID(finishInit); return; } - var params_r = { "sdk": config.version, "branch_key": self.branch_key }; - var permData = session.get(self._storage, true) || {}; + const params_r = {'sdk': config.version, 'branch_key': self.branch_key}; + const permData = session.get(self._storage, true) || {}; if (permData['browser_fingerprint_id']) { params_r['_t'] = permData['browser_fingerprint_id']; @@ -585,7 +578,7 @@ Branch.prototype['init'] = wrap( } // Execute the /v1/open right away or after _open_delay_ms. - var open_delay = parseInt(utils.getParamValue('[?&]_open_delay_ms'), 10); + const open_delay = parseInt(utils.getParamValue('[?&]_open_delay_ms'), 10); if (!utils.isSafari11OrGreater() && !utils.isIOSWKWebView()) { self._api( @@ -601,17 +594,17 @@ Branch.prototype['init'] = wrap( self._api( resources.open, { - "link_identifier": link_identifier, - "browser_fingerprint_id": link_identifier || browser_fingerprint_id, - "identity": permData['identity'] ? permData['identity'] : null, - "alternative_browser_fingerprint_id": permData['browser_fingerprint_id'], - "options": options, - "initial_referrer": utils.getInitialReferrer(self._referringLink()), - "current_url": utils.getCurrentUrl(), - "screen_height": utils.getScreenHeight(), - "screen_width": utils.getScreenWidth(), - "model": utils.userAgentData ? utils.userAgentData.model : null, - "os_version": utils.userAgentData ? utils.userAgentData.platformVersion : null + 'link_identifier': link_identifier, + 'browser_fingerprint_id': link_identifier || browser_fingerprint_id, + 'identity': permData['identity'] ? permData['identity'] : null, + 'alternative_browser_fingerprint_id': permData['browser_fingerprint_id'], + 'options': options, + 'initial_referrer': utils.getInitialReferrer(self._referringLink()), + 'current_url': utils.getCurrentUrl(), + 'screen_height': utils.getScreenHeight(), + 'screen_width': utils.getScreenWidth(), + 'model': utils.userAgentData ? utils.userAgentData.model : null, + 'os_version': utils.userAgentData ? utils.userAgentData.platformVersion : null }, function(err, data) { if (err) { @@ -640,17 +633,17 @@ Branch.prototype['init'] = wrap( self._api( resources.open, { - "link_identifier": link_identifier, - "browser_fingerprint_id": link_identifier || permData['browser_fingerprint_id'], - "identity": permData['identity'] ? permData['identity'] : null, - "alternative_browser_fingerprint_id": permData['browser_fingerprint_id'], - "options": options, - "initial_referrer": utils.getInitialReferrer(self._referringLink()), - "current_url": utils.getCurrentUrl(), - "screen_height": utils.getScreenHeight(), - "screen_width": utils.getScreenWidth(), - "model": utils.userAgentData ? utils.userAgentData.model : null, - "os_version": utils.userAgentData ? utils.userAgentData.platformVersion : null + 'link_identifier': link_identifier, + 'browser_fingerprint_id': link_identifier || permData['browser_fingerprint_id'], + 'identity': permData['identity'] ? permData['identity'] : null, + 'alternative_browser_fingerprint_id': permData['browser_fingerprint_id'], + 'options': options, + 'initial_referrer': utils.getInitialReferrer(self._referringLink()), + 'current_url': utils.getCurrentUrl(), + 'screen_height': utils.getScreenHeight(), + 'screen_width': utils.getScreenWidth(), + 'model': utils.userAgentData ? utils.userAgentData.model : null, + 'os_version': utils.userAgentData ? utils.userAgentData.platformVersion : null }, function(err, data) { if (err) { @@ -681,7 +674,7 @@ Branch.prototype['init'] = wrap( * currently private method, which may be opened to the public in the future */ Branch.prototype['renderQueue'] = wrap(callback_params.NO_CALLBACK, function(done, render) { - var self = this; + const self = this; if (self._renderFinalized) { render(); } @@ -697,7 +690,7 @@ Branch.prototype['renderQueue'] = wrap(callback_params.NO_CALLBACK, function(don * currently private method, which may be opened to the public in the future */ Branch.prototype['renderFinalize'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done) { - var self = this; + const self = this; if (self._renderQueue && self._renderQueue.length > 0) { self._renderQueue.forEach(function(callback) { callback.call(this); @@ -722,9 +715,9 @@ Branch.prototype['renderFinalize'] = wrap(callback_params.CALLBACK_ERR_DATA, fun * immediately, otherwise, it will return once Branch has been initialized. * ___ */ -/*** +TOC_ITEM #datacallback &.data()& ^ALL ***/ +/** * +TOC_ITEM #datacallback &.data()& ^ALL ***/ Branch.prototype['data'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done) { - var data = utils.whiteListSessionData(session.get(this._storage)); + const data = utils.whiteListSessionData(session.get(this._storage)); data['referring_link'] = this._referringLink(); data['data_parsed'] = data['data'] && data['data'].length !== 0 ? safejson.parse(data['data']) : {}; done(null, data); @@ -745,7 +738,7 @@ Branch.prototype['data'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done * ___ * */ -/*** +TOC_ITEM #firstcallback &.first()& ^ALL ***/ +/** * +TOC_ITEM #firstcallback &.first()& ^ALL ***/ Branch.prototype['first'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done) { done(null, utils.whiteListSessionData(session.get(this._storage, true))); }); @@ -785,11 +778,11 @@ Branch.prototype['first'] = wrap(callback_params.CALLBACK_ERR_DATA, function(don * ``` * ___ */ -/*** +TOC_ITEM #setidentityidentity-callback &.setIdentity()& ^ALL ***/ +/** * +TOC_ITEM #setidentityidentity-callback &.setIdentity()& ^ALL ***/ Branch.prototype['setIdentity'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done, identity) { - var self = this; + const self = this; if (identity) { - var data = { + const data = { identity_id: self.identity_id, session_id: self.session_id, link: self.sessionLink, @@ -797,9 +790,8 @@ Branch.prototype['setIdentity'] = wrap(callback_params.CALLBACK_ERR_DATA, functi }; self.identity = identity; // store the identity - session.patch(self._storage, { "identity": identity }, true); + session.patch(self._storage, {'identity': identity}, true); done(null, data); - } else { done(new Error(utils.message(utils.messages.missingIdentity))); @@ -828,11 +820,11 @@ Branch.prototype['setIdentity'] = wrap(callback_params.CALLBACK_ERR_DATA, functi * ___ * */ -/*** +TOC_ITEM #logoutcallback &.logout()& ^ALL ***/ +/** * +TOC_ITEM #logoutcallback &.logout()& ^ALL ***/ Branch.prototype['logout'] = wrap(callback_params.CALLBACK_ERR, function(done) { - var self = this; - var data = { - "identity": null + const self = this; + const data = { + 'identity': null }; self.identity = null; @@ -844,7 +836,7 @@ Branch.prototype['logout'] = wrap(callback_params.CALLBACK_ERR, function(done) { }); Branch.prototype['getBrowserFingerprintId'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done) { - var permData = session.get(this._storage, true) || {}; + const permData = session.get(this._storage, true) || {}; done(null, permData['browser_fingerprint_id'] || null); }); @@ -863,12 +855,12 @@ Branch.prototype['getBrowserFingerprintId'] = wrap(callback_params.CALLBACK_ERR_ * ___ * */ -/*** +TOC_ITEM #crossPlatformIdscallback &.crossPlatformIds()& ^ALL ***/ +/** * +TOC_ITEM #crossPlatformIdscallback &.crossPlatformIds()& ^ALL ***/ Branch.prototype['crossPlatformIds'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done) { this._api( resources.crossPlatformIds, { - "user_data": safejson.stringify(utils.getUserData(this)) + 'user_data': safejson.stringify(utils.getUserData(this)) }, function(err, data) { return done(err || null, data && data['user_data'] || null); @@ -893,15 +885,15 @@ Branch.prototype['crossPlatformIds'] = wrap(callback_params.CALLBACK_ERR_DATA, f * ___ * */ -/*** +TOC_ITEM #lastAttributedTouchDataattribution_window-callback &.lastAttributedTouchData()& ^ALL ***/ +/** * +TOC_ITEM #lastAttributedTouchDataattribution_window-callback &.lastAttributedTouchData()& ^ALL ***/ Branch.prototype['lastAttributedTouchData'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done, attribution_window) { attribution_window = utils.validateParameterType(attribution_window, 'number') ? attribution_window : null; - var userData = utils.getUserData(this); + const userData = utils.getUserData(this); utils.addPropertyIfNotNull(userData, 'attribution_window', attribution_window); this._api( resources.lastAttributedTouchData, { - "user_data": safejson.stringify(userData) + 'user_data': safejson.stringify(userData) }, function(err, data) { return done(err || null, data || null); @@ -934,10 +926,10 @@ Branch.prototype['lastAttributedTouchData'] = wrap(callback_params.CALLBACK_ERR_ * ``` * ___ */ -/*** +TOC_HEADING &Event Tracking& ^ALL ***/ -/*** +TOC_ITEM #trackevent-metadata-callback &.track()& ^ALL ***/ +/** * +TOC_HEADING &Event Tracking& ^ALL ***/ +/** * +TOC_ITEM #trackevent-metadata-callback &.track()& ^ALL ***/ Branch.prototype['track'] = wrap(callback_params.CALLBACK_ERR, function(done, event, metadata, options) { - var self = this; + const self = this; metadata = metadata || {}; @@ -945,13 +937,13 @@ Branch.prototype['track'] = wrap(callback_params.CALLBACK_ERR, function(done, ev utils.nonce = options['nonce'] ? options['nonce'] : utils.nonce; - if (event === "pageview") { - var hostedDeeplinkDataWithMergedMetadata = utils.mergeHostedDeeplinkData(utils.getHostedDeepLinkData(), metadata); + if (event === 'pageview') { + const hostedDeeplinkDataWithMergedMetadata = utils.mergeHostedDeeplinkData(utils.getHostedDeepLinkData(), metadata); if (hostedDeeplinkDataWithMergedMetadata && Object.keys(hostedDeeplinkDataWithMergedMetadata).length > 0) { metadata['hosted_deeplink_data'] = hostedDeeplinkDataWithMergedMetadata; } - var requestData = branch_view._getPageviewRequestData( + const requestData = branch_view._getPageviewRequestData( journeys_utils._getPageviewMetadata(options, metadata), options, self, @@ -960,15 +952,9 @@ Branch.prototype['track'] = wrap(callback_params.CALLBACK_ERR, function(done, ev self._api(resources.pageview, requestData, function(err, pageviewResponse) { - if (!err && typeof pageviewResponse === "object") { - var journeyInTestMode = requestData['branch_view_id'] ? true : false; - if (branch_view.shouldDisplayJourney - ( - pageviewResponse, - options, - journeyInTestMode - ) - ) { + if (!err && typeof pageviewResponse === 'object') { + const journeyInTestMode = requestData['branch_view_id'] ? true : false; + if (branch_view.shouldDisplayJourney(pageviewResponse, options, journeyInTestMode)) { branch_view.displayJourney( pageviewResponse['template'], requestData, @@ -987,10 +973,9 @@ Branch.prototype['track'] = wrap(callback_params.CALLBACK_ERR, function(done, ev } } ); - } else { - console.warn("track method currently supports only pageview event."); + console.warn('track method currently supports only pageview event.'); } }); @@ -1115,40 +1100,40 @@ Branch.prototype['track'] = wrap(callback_params.CALLBACK_ERR, function(done, ev * ``` * ___ */ -/*** +TOC_ITEM #logeventevent-event_data_and_custom_data-content_items-callback &.logEvent()& ^ALL ***/ +/** * +TOC_ITEM #logeventevent-event_data_and_custom_data-content_items-callback &.logEvent()& ^ALL ***/ Branch.prototype['logEvent'] = wrap(callback_params.CALLBACK_ERR, function(done, name, eventData, contentItems, customer_event_alias) { name = utils.validateParameterType(name, 'string') ? name : null; eventData = utils.validateParameterType(eventData, 'object') ? eventData : null; customer_event_alias = utils.validateParameterType(customer_event_alias, 'string') ? customer_event_alias : null; - var extractedEventAndCustomData = utils.separateEventAndCustomData(eventData); + const extractedEventAndCustomData = utils.separateEventAndCustomData(eventData); if (utils.isStandardEvent(name)) { contentItems = utils.validateParameterType(contentItems, 'array') ? contentItems : null; this._api( - resources.logStandardEvent, - { - "name": name, - "user_data": safejson.stringify(utils.getUserData(this)), - "custom_data": safejson.stringify(extractedEventAndCustomData && extractedEventAndCustomData["custom_data"] || {}), - "event_data": safejson.stringify(extractedEventAndCustomData && extractedEventAndCustomData["event_data"] || {}), - "content_items": safejson.stringify(contentItems || []), - "customer_event_alias": customer_event_alias - }, function(err, data) { - return done(err || null); - }); + resources.logStandardEvent, + { + 'name': name, + 'user_data': safejson.stringify(utils.getUserData(this)), + 'custom_data': safejson.stringify(extractedEventAndCustomData && extractedEventAndCustomData['custom_data'] || {}), + 'event_data': safejson.stringify(extractedEventAndCustomData && extractedEventAndCustomData['event_data'] || {}), + 'content_items': safejson.stringify(contentItems || []), + 'customer_event_alias': customer_event_alias + }, function(err, data) { + return done(err || null); + }); } else { this._api(resources.logCustomEvent, - { - "name": name, - "user_data": safejson.stringify(utils.getUserData(this)), - "custom_data": safejson.stringify(extractedEventAndCustomData && extractedEventAndCustomData["custom_data"] || {}), - "event_data": safejson.stringify(extractedEventAndCustomData && extractedEventAndCustomData["event_data"] || {}), - "content_items": safejson.stringify(contentItems || []), - "customer_event_alias": customer_event_alias - }, function(err, data) { - return done(err || null); - }); + { + 'name': name, + 'user_data': safejson.stringify(utils.getUserData(this)), + 'custom_data': safejson.stringify(extractedEventAndCustomData && extractedEventAndCustomData['custom_data'] || {}), + 'event_data': safejson.stringify(extractedEventAndCustomData && extractedEventAndCustomData['event_data'] || {}), + 'content_items': safejson.stringify(contentItems || []), + 'customer_event_alias': customer_event_alias + }, function(err, data) { + return done(err || null); + }); } }); @@ -1242,11 +1227,11 @@ Branch.prototype['logEvent'] = wrap(callback_params.CALLBACK_ERR, function(done, * ``` * */ -/*** +TOC_HEADING &Deep Linking& ^ALL ***/ -/*** +TOC_ITEM #linkdata-callback &.link()& ^ALL ***/ +/** * +TOC_HEADING &Deep Linking& ^ALL ***/ +/** * +TOC_ITEM #linkdata-callback &.link()& ^ALL ***/ Branch.prototype['link'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done, data) { - var linkData = utils.cleanLinkData(data); - var keyCopy = this.branch_key; + const linkData = utils.cleanLinkData(data); + const keyCopy = this.branch_key; this._api(resources.link, linkData, function(err, data) { if (err) { // if an error occurs or if tracking is disabled then return a dynamic link @@ -1317,7 +1302,7 @@ Branch.prototype['link'] = wrap(callback_params.CALLBACK_ERR_DATA, function(done Branch.prototype['qrCode'] = wrap( callback_params.CALLBACK_ERR_DATA, function(done, linkData, qrCodeSettings, options) { - var data = utils.cleanLinkData(linkData); + const data = utils.cleanLinkData(linkData); data['qr_code_settings'] = safejson.stringify(utils.convertObjectValuesToString(qrCodeSettings || {})); this._api( resources.qrCode, @@ -1401,9 +1386,9 @@ Branch.prototype['qrCode'] = wrap( * ``` * */ -/*** +TOC_ITEM #deepviewdata-options-callback &.deepview()& ^ALL ***/ +/** * +TOC_ITEM #deepviewdata-options-callback &.deepview()& ^ALL ***/ Branch.prototype['deepview'] = wrap(callback_params.CALLBACK_ERR, function(done, data, options) { - var self = this; + const self = this; if (!options) { options = { }; @@ -1419,10 +1404,10 @@ Branch.prototype['deepview'] = wrap(callback_params.CALLBACK_ERR, function(done, } data['data'] = utils.merge(utils.getHostedDeepLinkData(), data['data']); - data = utils.isIframe() ? utils.merge({ 'is_iframe': true }, data) : data; + data = utils.isIframe() ? utils.merge({'is_iframe': true}, data) : data; - var cleanedData = utils.cleanLinkData(data); - var fallbackUrl = utils.generateDynamicBNCLink(this.branch_key, cleanedData); + const cleanedData = utils.cleanLinkData(data); + const fallbackUrl = utils.generateDynamicBNCLink(this.branch_key, cleanedData); if (options['open_app'] || options['open_app'] === null || typeof options['open_app'] === 'undefined') { cleanedData['open_app'] = true; @@ -1430,7 +1415,7 @@ Branch.prototype['deepview'] = wrap(callback_params.CALLBACK_ERR, function(done, cleanedData['append_deeplink_path'] = !!options['append_deeplink_path']; cleanedData['deepview_type'] = options['deepview_type']; - var referringLink = self._referringLink(); + const referringLink = self._referringLink(); if (referringLink && !options['make_new_link']) { cleanedData['link_click_id'] = utils.getClickIdAndSearchStringFromLink(referringLink); } @@ -1514,11 +1499,11 @@ Branch.prototype._windowRedirect = function(url) { * * */ -/*** +TOC_ITEM #deepviewcta &.deepviewCta()& ^ALL ***/ +/** * +TOC_ITEM #deepviewcta &.deepviewCta()& ^ALL ***/ Branch.prototype['deepviewCta'] = wrap(callback_params.CALLBACK_ERR, function(done) { if (typeof this._deepviewCta === 'undefined') { return utils.userPreferences.trackingDisabled ? done(new Error(utils.messages.trackingDisabled), null) : - done(new Error(utils.messages.deepviewNotCalled), null); + done(new Error(utils.messages.deepviewNotCalled), null); } if (window.event) { if (window.event.preventDefault) { @@ -1567,8 +1552,8 @@ Branch.prototype['deepviewCta'] = wrap(callback_params.CALLBACK_ERR, function(do * - *didCloseJourney*: Journey's close animation has completed and it is no longer visible to the user. * - *didCallJourneyClose*: Emitted when developer calls `branch.closeJourney()` to dismiss Journey. */ -/*** +TOC_HEADING &Event Listener& ^WEB ***/ -/*** +TOC_ITEM #addlistenerevent-listener &.addListener()& ^WEB ***/ +/** * +TOC_HEADING &Event Listener& ^WEB ***/ +/** * +TOC_ITEM #addlistenerevent-listener &.addListener()& ^WEB ***/ Branch.prototype['addListener'] = function(event, listener) { if (typeof event === 'function' && listener === undefined) { listener = event; @@ -1593,7 +1578,7 @@ Branch.prototype['addListener'] = function(event, listener) { * just an identical clone of the function. * */ -/*** +TOC_ITEM #removelistenerlistener &.removeListener()& ^WEB ***/ +/** * +TOC_ITEM #removelistenerlistener &.removeListener()& ^WEB ***/ Branch.prototype['removeListener'] = function(listener) { if (listener) { this._listeners = this._listeners.filter(function(subscription) { @@ -1635,8 +1620,8 @@ Branch.prototype['removeListener'] = function(listener) { * }); * ``` */ -/*** +TOC_HEADING &Journeys Web To App& ^WEB ***/ -/*** +TOC_ITEM #setbranchviewdatadata &.setBranchViewData()& ^WEB ***/ +/** * +TOC_HEADING &Journeys Web To App& ^WEB ***/ +/** * +TOC_ITEM #setbranchviewdatadata &.setBranchViewData()& ^WEB ***/ function _setBranchViewData(context, done, data) { data = data || {}; try { @@ -1667,9 +1652,9 @@ Branch.prototype['setBranchViewData'] = wrap(callback_params.CALLBACK_ERR, funct * ___ * */ -/*** +TOC_ITEM #closejourneycallback &.closeJourney()& ^WEB ***/ +/** * +TOC_ITEM #closejourneycallback &.closeJourney()& ^WEB ***/ Branch.prototype['closeJourney'] = wrap(callback_params.CALLBACK_ERR, function(done) { - var self = this; + const self = this; self['renderQueue'](function() { if (journeys_utils.banner && journeys_utils.isJourneyDisplayed) { self._publishEvent('didCallJourneyClose', journeys_utils.journeyLinkData); @@ -1684,7 +1669,7 @@ Branch.prototype['closeJourney'] = wrap(callback_params.CALLBACK_ERR, function(d Branch.prototype['banner'] = wrap(callback_params.CALLBACK_ERR, function(done, options, data) { if (!utils.mobileUserAgent()) { - console.info("banner functionality is not supported on desktop"); + console.info('banner functionality is not supported on desktop'); } else { data = data || {}; @@ -1695,7 +1680,7 @@ Branch.prototype['banner'] = wrap(callback_params.CALLBACK_ERR, function(done, o options['showAgain'] = options['forgetHide']; } /** @type {banner_utils.options} */ - var bannerOptions = { + const bannerOptions = { icon: /** @type {string} */ (utils.cleanBannerText(options['icon']) || ''), title: /** @type {string} */ (utils.cleanBannerText(options['title']) || ''), description: /** @type {string} */ (utils.cleanBannerText(options['description']) || ''), @@ -1769,7 +1754,7 @@ Branch.prototype['banner'] = wrap(callback_params.CALLBACK_ERR, function(done, o data['data'] = utils.merge(utils.getHostedDeepLinkData(), data['data']); - var self = this; + const self = this; self['renderQueue'](function() { self.closeBannerPointer = banner(self, bannerOptions, data, self._storage); }); @@ -1778,12 +1763,12 @@ Branch.prototype['banner'] = wrap(callback_params.CALLBACK_ERR, function(done, o }); Branch.prototype['closeBanner'] = wrap(0, function(done) { - var self = this; + const self = this; self['renderQueue'](function() { if (self.closeBannerPointer) { - self._publishEvent("willCloseBanner"); + self._publishEvent('willCloseBanner'); self.closeBannerPointer(function() { - self._publishEvent("didCloseBanner"); + self._publishEvent('didCloseBanner'); }); } }); @@ -1842,26 +1827,25 @@ Branch.prototype['closeBanner'] = wrap(0, function(done) { * ``` * ___ */ -/*** +TOC_HEADING &Revenue Analytics& ^WEB ***/ -/*** +TOC_ITEM #trackcommerceeventevent-commerce_data-metadata-callback &.trackCommerceEvent()& ^WEB ***/ +/** * +TOC_HEADING &Revenue Analytics& ^WEB ***/ +/** * +TOC_ITEM #trackcommerceeventevent-commerce_data-metadata-callback &.trackCommerceEvent()& ^WEB ***/ Branch.prototype['trackCommerceEvent'] = wrap(callback_params.CALLBACK_ERR, function(done, event, commerce_data, metadata) { - var self = this; + const self = this; self['renderQueue'](function() { - - var validationError = utils.validateCommerceEventParams(event, commerce_data); + const validationError = utils.validateCommerceEventParams(event, commerce_data); if (validationError) { return done(new Error(validationError)); } self._api(resources.commerceEvent, { - "event": event, - "metadata": utils.merge({ - "url": document.URL, - "user_agent": navigator.userAgent, - "language": navigator.language + 'event': event, + 'metadata': utils.merge({ + 'url': document.URL, + 'user_agent': navigator.userAgent, + 'language': navigator.language }, metadata || {}), - "initial_referrer": utils.getInitialReferrer(self._referringLink()), - "commerce_data": commerce_data + 'initial_referrer': utils.getInitialReferrer(self._referringLink()), + 'commerce_data': commerce_data }, function(err, data) { done(err || null); }); @@ -1889,10 +1873,10 @@ Branch.prototype['trackCommerceEvent'] = wrap(callback_params.CALLBACK_ERR, func * The do-not-track mode state is persistent: it is saved for the user across browser sessions for the web site. * ___ */ -/*** +TOC_HEADING &User Privacy& ^WEB ***/ -/*** +TOC_ITEM #disabletrackingdisabletracking &.disableTracking()& ^WEB ***/ +/** * +TOC_HEADING &User Privacy& ^WEB ***/ +/** * +TOC_ITEM #disabletrackingdisabletracking &.disableTracking()& ^WEB ***/ Branch.prototype['disableTracking'] = wrap(callback_params.CALLBACK_ERR, function(done, disableTracking) { - if (disableTracking === false || disableTracking === "false") { + if (disableTracking === false || disableTracking === 'false') { utils.userPreferences.trackingDisabled = false; utils.userPreferences.allowErrorsInCallback = false; if (this.branch_key && this.init_options) { @@ -1902,7 +1886,7 @@ Branch.prototype['disableTracking'] = wrap(callback_params.CALLBACK_ERR, functio this['init'](this.branch_key, this.init_options); } } - else if (disableTracking === undefined || disableTracking === true || disableTracking === "true") { + else if (disableTracking === undefined || disableTracking === true || disableTracking === 'true') { utils.cleanApplicationAndSessionStorage(this); utils.userPreferences.trackingDisabled = true; utils.userPreferences.allowErrorsInCallback = true; @@ -1918,11 +1902,11 @@ Branch.prototype['setAPIResponseCallback'] = wrap(callback_params.NO_CALLBACK, f done(); }, /* allowed before init */ true); -/*** +/** * * @function Branch.referringLink * @param {Boolean} withExtendedJourneysAssist - Boolean indicating whether or not to get ReferringLink for extended Journeys Assist scenario.defaults to false. * Gets the referring link from storage (session, local) wih link expiry applied if provided. */ - Branch.prototype.referringLink = function(withExtendedJourneysAssist) { +Branch.prototype.referringLink = function(withExtendedJourneysAssist) { return this._referringLink(withExtendedJourneysAssist); }; diff --git a/src/7_initialization.js b/src/7_initialization.js index cd5293269..d94c7076d 100644 --- a/src/7_initialization.js +++ b/src/7_initialization.js @@ -12,9 +12,9 @@ goog.require('config'); // jshint unused:false branch_instance = new Branch(); if (window['branch'] && window['branch']['_q']) { - var queue = window['branch']['_q']; - for (var i = 0; i < queue.length; i++) { - var task = queue[i]; + const queue = window['branch']['_q']; + for (let i = 0; i < queue.length; i++) { + const task = queue[i]; branch_instance[task[0]].apply(branch_instance, task[1]); } } diff --git a/src/branch_view.js b/src/branch_view.js index 84f2fc206..d1d73a537 100644 --- a/src/branch_view.js +++ b/src/branch_view.js @@ -21,34 +21,33 @@ function checkPreviousBanner() { * @param {boolean} hasApp */ function renderHtmlBlob(parent, html, hasApp, iframeLoadedCallback) { - - var ctaText = hasApp ? 'OPEN' : 'GET'; + let ctaText = hasApp ? 'OPEN' : 'GET'; journeys_utils.setPositionAndHeight(html); // Get metadata, css and js from html blob then remove them - var metadata = journeys_utils.getMetadata(html); + const metadata = journeys_utils.getMetadata(html); if (metadata) { ctaText = journeys_utils.getCtaText(metadata, hasApp); journeys_utils.findInsertionDiv(parent, metadata); } - var cssInsideIframe = journeys_utils.getCss(html); + const cssInsideIframe = journeys_utils.getCss(html); journeys_utils.getJsAndAddToParent(html); - var cssIframeContainer = journeys_utils.getIframeCss(html); + const cssIframeContainer = journeys_utils.getIframeCss(html); html = journeys_utils.removeScriptAndCss(html); // create iframe element, add html, add css, add ctaText - var iframe = journeys_utils.createIframe(); + const iframe = journeys_utils.createIframe(); iframe.onload = function() { journeys_utils.addHtmlToIframe(iframe, html, utils.mobileUserAgent()); journeys_utils.addIframeOuterCSS(cssIframeContainer, metadata); journeys_utils.addIframeInnerCSS(iframe, cssInsideIframe); journeys_utils.addDynamicCtaText(iframe, ctaText); - + journeys_utils.branch._publishEvent('willShowJourney', journeys_utils.journeyLinkData); - + journeys_utils.animateBannerEntrance(iframe, cssIframeContainer); iframeLoadedCallback(iframe); - } + }; document.body.appendChild(iframe); return iframe; }; @@ -59,7 +58,7 @@ function renderHtmlBlob(parent, html, hasApp, iframeLoadedCallback) { * @return {boolean} */ function _areJourneysDismissedGlobally(branch) { - var globalDismissEndTimestamp = branch._storage.get('globalJourneysDismiss', true); + const globalDismissEndTimestamp = branch._storage.get('globalJourneysDismiss', true); if (globalDismissEndTimestamp === true || globalDismissEndTimestamp > Date.now()) { return true; @@ -70,7 +69,7 @@ function _areJourneysDismissedGlobally(branch) { } branch_view.shouldDisplayJourney = function(eventResponse, options, journeyInTestMode) { - if ( checkPreviousBanner() || + if (checkPreviousBanner() || !utils.mobileUserAgent() || !eventResponse['event_data'] || !eventResponse['template'] @@ -95,15 +94,15 @@ branch_view.shouldDisplayJourney = function(eventResponse, options, journeyInTes }; branch_view.incrementPageviewAnalytics = function(branchViewData) { - var requestData = { - "event": "pageview", - "journey_displayed": true, - "audience_rule_id": branchViewData['audience_rule_id'], - "branch_view_id": branchViewData['branch_view_id'] + let requestData = { + 'event': 'pageview', + 'journey_displayed': true, + 'audience_rule_id': branchViewData['audience_rule_id'], + 'branch_view_id': branchViewData['branch_view_id'] }; - var sessionStorage = session.get(journeys_utils.branch._storage) || {}; - var identity = sessionStorage.hasOwnProperty('identity') ? sessionStorage['identity'] : null; + const sessionStorage = session.get(journeys_utils.branch._storage) || {}; + const identity = sessionStorage.hasOwnProperty('identity') ? sessionStorage['identity'] : null; requestData = utils.addPropertyIfNotNull(requestData, 'identity', identity); journeys_utils.branch._api( @@ -116,38 +115,38 @@ branch_view.incrementPageviewAnalytics = function(branchViewData) { }; branch_view.displayJourney = function(html, requestData, templateId, branchViewData, testModeEnabled, journeyLinkData) { - if(journeys_utils.exitAnimationIsRunning){ - return; + if (journeys_utils.exitAnimationIsRunning) { + return; } journeys_utils.branchViewId = templateId; journeys_utils.setJourneyLinkData(journeyLinkData); - var audienceRuleId = branchViewData['audience_rule_id']; + const audienceRuleId = branchViewData['audience_rule_id']; // this code removes any leftover css from previous banner - var branchCSS = document.getElementById('branch-iframe-css') + const branchCSS = document.getElementById('branch-iframe-css'); if (branchCSS) { - branchCSS.parentElement.removeChild(branchCSS) + branchCSS.parentElement.removeChild(branchCSS); } - var placeholder = document.createElement('div'); + const placeholder = document.createElement('div'); placeholder.id = 'branch-banner'; document.body.insertBefore(placeholder, null); banner_utils.addClass(placeholder, 'branch-banner-is-active'); - var failed = false; - var callbackString = requestData['callback_string']; - var banner = null; - var cta = null; - var storage = journeys_utils.branch._storage; + let failed = false; + const callbackString = requestData['callback_string']; + const banner = null; + let cta = null; + const storage = journeys_utils.branch._storage; if (html) { - var metadata = journeys_utils.getMetadata(html) || {}; + const metadata = journeys_utils.getMetadata(html) || {}; html = journeys_utils.tryReplaceJourneyCtaLink(html); - var timeoutTrigger = window.setTimeout( + const timeoutTrigger = window.setTimeout( function() { window[callbackString] = function() { }; }, @@ -164,30 +163,31 @@ branch_view.displayJourney = function(html, requestData, templateId, branchViewD journeys_utils.finalHookups(templateId, audienceRuleId, storage, cta, banner, metadata, testModeEnabled, branch_view); }; - var finalHookupsOnIframeLoaded = function (banner) { + const finalHookupsOnIframeLoaded = function (banner) { journeys_utils.banner = banner; - + if (banner === null) { failed = true; return; } - + journeys_utils.finalHookups(templateId, audienceRuleId, storage, cta, banner, metadata, testModeEnabled, branch_view); - + if (utils.navigationTimingAPIEnabled) { utils.instrumentation['journey-load-time'] = utils.timeSinceNavigationStart(); } - + document.body.removeChild(placeholder); - + if (!utils.userPreferences.trackingDisabled && !testModeEnabled) { branch_view.incrementPageviewAnalytics(branchViewData); } - } + }; renderHtmlBlob(document.body, html, requestData['has_app_websdk'], finalHookupsOnIframeLoaded); - } else { + } + else { document.body.removeChild(placeholder); - + if (!utils.userPreferences.trackingDisabled && !testModeEnabled) { branch_view.incrementPageviewAnalytics(branchViewData); } @@ -195,7 +195,6 @@ branch_view.displayJourney = function(html, requestData, templateId, branchViewD }; branch_view._getPageviewRequestData = function(metadata, options, branch, isDismissEvent) { - journeys_utils.branch = branch; if (!options) { @@ -210,16 +209,16 @@ branch_view._getPageviewRequestData = function(metadata, options, branch, isDism journeys_utils.exitAnimationDisabled = options['disable_exit_animation'] || false; // starts object off with data from setBranchViewData() call - var obj = utils.merge({}, branch._branchViewData); - var sessionStorage = session.get(branch._storage) || {}; - var has_app = sessionStorage.hasOwnProperty('has_app') ? sessionStorage['has_app'] : false; - var identity = sessionStorage.hasOwnProperty('identity') ? sessionStorage['identity'] : null; - var journeyDismissals = branch._storage.get('journeyDismissals', true); - var userLanguage = (options['user_language'] || utils.getBrowserLanguageCode() || 'en').toLowerCase() || null; - var initialReferrer = utils.getInitialReferrer(branch._referringLink()); - var branchViewId = options['branch_view_id'] || utils.getParameterByName('_branch_view_id') || null; - var linkClickId = !options['make_new_link'] ? utils.getClickIdAndSearchStringFromLink(branch._referringLink(true)) : null; - var SessionlinkClickId = sessionStorage.hasOwnProperty('session_link_click_id') ? sessionStorage['session_link_click_id'] : null; + let obj = utils.merge({}, branch._branchViewData); + const sessionStorage = session.get(branch._storage) || {}; + const has_app = sessionStorage.hasOwnProperty('has_app') ? sessionStorage['has_app'] : false; + const identity = sessionStorage.hasOwnProperty('identity') ? sessionStorage['identity'] : null; + const journeyDismissals = branch._storage.get('journeyDismissals', true); + const userLanguage = (options['user_language'] || utils.getBrowserLanguageCode() || 'en').toLowerCase() || null; + const initialReferrer = utils.getInitialReferrer(branch._referringLink()); + const branchViewId = options['branch_view_id'] || utils.getParameterByName('_branch_view_id') || null; + const linkClickId = !options['make_new_link'] ? utils.getClickIdAndSearchStringFromLink(branch._referringLink(true)) : null; + const SessionlinkClickId = sessionStorage.hasOwnProperty('session_link_click_id') ? sessionStorage['session_link_click_id'] : null; // adds root level keys for v1/event obj['event'] = !isDismissEvent ? 'pageview' : 'dismiss'; @@ -249,7 +248,7 @@ branch_view._getPageviewRequestData = function(metadata, options, branch, isDism if (linkClickId) { obj.data['link_click_id'] = linkClickId; } - var linkData = sessionStorage['data'] ? safejson.parse(sessionStorage['data']) : null; + const linkData = sessionStorage['data'] ? safejson.parse(sessionStorage['data']) : null; if (linkData && linkData['+referrer']) { obj.data['+referrer'] = linkData['+referrer']; } diff --git a/src/extern.js b/src/extern.js index 82174ccc7..9d1aa5858 100644 --- a/src/extern.js +++ b/src/extern.js @@ -1,3 +1,4 @@ +/* eslint-disable no-unused-vars */ /** * This file is just for the closure compiler, to tell it the types of various * external functions. @type{?} means it's "optional". @@ -5,29 +6,29 @@ 'use strict'; /** @type {?} */ -var define; +let define; /** @type {?} */ define.amd; /** @type {?} */ -var exports; +let exports; -var module = { +const module = { exports: {} }; // var console = { log: function() {}, error: function() {} }; -var sessionStorage = { +const sessionStorage = { clear: function() {}, getItem: function() {}, setItem: function() {} }; // Used in Cordova -var require = function(module) {}; +const require = function(module) {}; -var localStorage = { +const localStorage = { clear: function() {}, getItem: function() {}, removeItem: function() {}, diff --git a/src/journeys_utils.js b/src/journeys_utils.js index 6c0ed222d..7fd3eb153 100644 --- a/src/journeys_utils.js +++ b/src/journeys_utils.js @@ -67,17 +67,17 @@ journeys_utils.previousDivToInjectParents = []; // holds data from Journey that is currently being viewed & data from setBranchViewData() journeys_utils.journeyLinkData = null; -/*** +/** * * @function journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight * @param {string} bannerHeight */ journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight = function(bannerHeight) { - var unitsRegex = /vh|%/gi; // search and replace vh, % + const unitsRegex = /vh|%/gi; // search and replace vh, % return unitsRegex.test(bannerHeight) ? bannerHeight.replace(unitsRegex, '') : false; -} +}; -/*** +/** * * @function journeys_utils.setPositionAndHeight * @param {string} html * @@ -87,17 +87,17 @@ journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight = function(bannerHe */ journeys_utils.setPositionAndHeight = function(html) { setDefaultBannerProperties(); - var metadata = journeys_utils.getMetadata(html) || {}; + const metadata = journeys_utils.getMetadata(html) || {}; if (metadata && metadata['bannerHeight'] && metadata['position'] && metadata['sticky']) { journeys_utils.bannerHeight = metadata['bannerHeight']; journeys_utils.position = metadata['position']; journeys_utils.sticky = metadata['sticky']; } else { // to support older banners without proper metadata. Spacer div === top - var spacerMatch = html.match(journeys_utils.spacerRe) + const spacerMatch = html.match(journeys_utils.spacerRe); if (spacerMatch) { journeys_utils.position = 'top'; - var heightMatch = spacerMatch[1].match(journeys_utils.findMarginRe); + const heightMatch = spacerMatch[1].match(journeys_utils.findMarginRe); if (heightMatch) { journeys_utils.bannerHeight = heightMatch[1]; } @@ -108,9 +108,9 @@ journeys_utils.setPositionAndHeight = function(html) { journeys_utils.sticky = 'fixed'; } } - var relativeBannerHeightOrFalse = journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(journeys_utils.bannerHeight); + const relativeBannerHeightOrFalse = journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(journeys_utils.bannerHeight); if (relativeBannerHeightOrFalse) { - var bannerHeightInPixels = (relativeBannerHeightOrFalse/100) * journeys_utils.windowHeight + 'px'; + const bannerHeightInPixels = (relativeBannerHeightOrFalse / 100) * journeys_utils.windowHeight + 'px'; journeys_utils.bannerHeight = bannerHeightInPixels; if (relativeBannerHeightOrFalse < 100) { journeys_utils.isHalfPage = true; @@ -119,50 +119,50 @@ journeys_utils.setPositionAndHeight = function(html) { journeys_utils.isFullPage = true; } } -} +}; -/*** +/** * * @function journeys_utils.getMetadata * @param {string} html */ journeys_utils.getMetadata = function(html) { - var match = html.match(journeys_utils.jsonRe); - if(match) { - var src = match[1]; + const match = html.match(journeys_utils.jsonRe); + if (match) { + const src = match[1]; return safejson.parse(src); } -} +}; -/*** +/** * * @function journeys_utils.getIframeCss * @param {string} html */ journeys_utils.getIframeCss = function(html) { - var match = html.match(journeys_utils.iframeCssRe); + const match = html.match(journeys_utils.iframeCssRe); if (match) { return match[1]; } -} +}; -/*** +/** * * @function journeys_utils.getCtaText * @param {Object} metadata * @param {boolean} hasApp */ journeys_utils.getCtaText = function(metadata, hasApp) { - var ctaText; + let ctaText; - if(hasApp && metadata && metadata['ctaText'] && metadata['ctaText']['has_app']) { + if (hasApp && metadata && metadata['ctaText'] && metadata['ctaText']['has_app']) { ctaText = metadata['ctaText']['has_app']; } - else if(metadata && metadata['ctaText'] && metadata['ctaText']['no_app']) { + else if (metadata && metadata['ctaText'] && metadata['ctaText']['no_app']) { ctaText = metadata['ctaText']['no_app']; } return ctaText; -} +}; -/*** +/** * * @function journeys_utils.findInsertionDiv * @param {Object} parent - A dom element or document.body * @param {Object} metadata @@ -171,45 +171,45 @@ journeys_utils.findInsertionDiv = function(parent, metadata) { journeys_utils.divToInjectParents = []; if (metadata && metadata['injectorSelector']) { - var injectors = document.querySelectorAll(metadata['injectorSelector']); + const injectors = document.querySelectorAll(metadata['injectorSelector']); if (injectors) { - for(var i = 0; i < injectors.length; i++) { + for (let i = 0; i < injectors.length; i++) { journeys_utils.divToInjectParents.push(injectors[i].parentElement); } } } -} +}; -/*** +/** * * @function journeys_utils.getCss * @param {string} html */ journeys_utils.getCss = function(html) { - var match = html.match(journeys_utils.cssRe); + const match = html.match(journeys_utils.cssRe); if (match) { return match[1]; } -} +}; -/*** +/** * * @function journeys_utils.getJsAndAddToParent * @param {string} html * * take the js from template and add to document.body */ journeys_utils.getJsAndAddToParent = function(html) { - var match = html.match(journeys_utils.jsRe); - if(match) { - var src = match[1]; - var script = document.createElement('script'); + const match = html.match(journeys_utils.jsRe); + if (match) { + const src = match[1]; + const script = document.createElement('script'); script.id = 'branch-journey-cta'; utils.addNonceAttribute(script); script.innerHTML = src; document.body.appendChild(script); } -} +}; -/*** +/** * * @function journeys_utils.removeScriptAndCss * @param {string} html * @@ -217,32 +217,32 @@ journeys_utils.getJsAndAddToParent = function(html) { * We will use the remaining html to add to iframe */ journeys_utils.removeScriptAndCss = function(html) { - var matchJson = html.match(journeys_utils.jsonRe); - var matchJs = html.match(journeys_utils.jsRe); - var matchCss = html.match(journeys_utils.cssRe); - var matchIframeCss = html.match(journeys_utils.iframeCssRe); + const matchJson = html.match(journeys_utils.jsonRe); + const matchJs = html.match(journeys_utils.jsRe); + const matchCss = html.match(journeys_utils.cssRe); + const matchIframeCss = html.match(journeys_utils.iframeCssRe); - if(matchJson) { - html = html.replace(journeys_utils.jsonRe,''); + if (matchJson) { + html = html.replace(journeys_utils.jsonRe, ''); } - if(matchJs) { - html = html.replace(journeys_utils.jsRe,''); + if (matchJs) { + html = html.replace(journeys_utils.jsRe, ''); } - if(matchCss) { - html = html.replace(journeys_utils.cssRe,''); + if (matchCss) { + html = html.replace(journeys_utils.cssRe, ''); } - if(matchIframeCss) { + if (matchIframeCss) { html = html.replace(journeys_utils.iframeCssRe, ''); } return html; -} +}; -/*** +/** * * @function journeys_utils.createIframe */ journeys_utils.createIframe = function() { - var iframe = document.createElement('iframe'); + const iframe = document.createElement('iframe'); iframe.src = 'about:blank'; // solves CORS issues, test in IE iframe.style.overflow = 'hidden'; iframe.scrolling = 'no'; @@ -252,16 +252,16 @@ journeys_utils.createIframe = function() { utils.addNonceAttribute(iframe); return iframe; -} +}; -/*** +/** * * @function journeys_utils.addHtmlToIframe * @param {Object} iframe - iframe node created in previous step * @param {string} html - raw Journey HTML * @param {string} userAgent - UA to determine body class */ journeys_utils.addHtmlToIframe = function(iframe, html, userAgent) { - var bodyClass; + let bodyClass; if (userAgent === 'ios' || userAgent === 'ipad') { bodyClass = 'branch-banner-ios'; } @@ -271,17 +271,18 @@ journeys_utils.addHtmlToIframe = function(iframe, html, userAgent) { else { bodyClass = 'branch-banner-other'; } - var iframedoc = iframe.contentDocument || iframe.contentWindow.document; + const iframedoc = iframe.contentDocument || iframe.contentWindow.document; iframedoc.head = iframedoc.createElement('head'); iframedoc.body = iframedoc.createElement('body'); iframedoc.body.innerHTML = html; iframedoc.body.className = bodyClass; - var metaTag = iframedoc.querySelector('meta[name="accessibility"]'); + const metaTag = iframedoc.querySelector('meta[name="accessibility"]'); if (metaTag && metaTag.content === 'wcag') { - var scriptTag = iframedoc.createElement('script'); + const scriptTag = iframedoc.createElement('script'); scriptTag.type = 'text/javascript'; + /* eslint-env es6*/ scriptTag.text = ` - var focusableElements = +var focusableElements = 'button, [href], input, select, textarea, [role="button"], h1, [role="text"], .branch-banner-content'; var modal = document.getElementById('branch-banner'); var focusableContent = modal.querySelectorAll(focusableElements); @@ -309,33 +310,32 @@ journeys_utils.addHtmlToIframe = function(iframe, html, userAgent) { `; iframedoc.querySelector('body').append(scriptTag); } -} +}; -/*** +/** * * @function journeys_utils.addIframeOuterCSS * * Creates a style element on document.body and adds CSS that will determine * banner position, height and sticky. */ journeys_utils.addIframeOuterCSS = function(cssIframeContainer, metadata) { - var iFrameCSS = document.createElement('style'); + const iFrameCSS = document.createElement('style'); iFrameCSS.type = 'text/css'; iFrameCSS.id = 'branch-iframe-css'; - var bodyMargin = ''; journeys_utils.bodyMarginTop = banner_utils.getBodyStyle('margin-top'); - var bodyMarginTopNumber = +journeys_utils.bodyMarginTop.slice(0, -2); + const bodyMarginTopNumber = +journeys_utils.bodyMarginTop.slice(0, -2); journeys_utils.bodyMarginBottom = banner_utils.getBodyStyle('margin-bottom'); - var bodyMarginBottomNumber = +journeys_utils.bodyMarginBottom.slice(0, -2); - var bannerMarginNumber = +journeys_utils.bannerHeight.slice(0, -2); + const bodyMarginBottomNumber = +journeys_utils.bodyMarginBottom.slice(0, -2); + const bannerMarginNumber = +journeys_utils.bannerHeight.slice(0, -2); if (cssIframeContainer) {} else if (journeys_utils.position === 'top') { - var calculatedBodyMargin = +bannerMarginNumber + bodyMarginTopNumber; + const calculatedBodyMargin = +bannerMarginNumber + bodyMarginTopNumber; document.body.style.marginTop = calculatedBodyMargin.toString() + 'px'; - } + } else if (journeys_utils.position === 'bottom') { - var calculatedBodyMargin = +bannerMarginNumber + bodyMarginBottomNumber; + const calculatedBodyMargin = +bannerMarginNumber + bodyMarginBottomNumber; document.body.style.marginBottom = calculatedBodyMargin.toString() + 'px'; } @@ -343,24 +343,23 @@ journeys_utils.addIframeOuterCSS = function(cssIframeContainer, metadata) { if (journeys_utils.divToInjectParents.length > 0) { // dont want to add margin for full page fixed journeys_utils.divToInjectParents.forEach(function(parent) { - var isFixedNavFullPage; - var computedParentStyle = window.getComputedStyle(parent); + let isFixedNavFullPage; + const computedParentStyle = window.getComputedStyle(parent); if (computedParentStyle) { isFixedNavFullPage = journeys_utils.isFullPage && computedParentStyle.getPropertyValue('position') === 'fixed'; } if (!isFixedNavFullPage) { parent.style.marginTop = journeys_utils.bannerHeight; } - }) + }); } // determines the removal of additional whitespace above Journey if position changes from 'top' to 'bottom' - if (journeys_utils.previousPosition === "top" && + if (journeys_utils.previousPosition === 'top' && journeys_utils.previousPosition !== journeys_utils.position && journeys_utils.exitAnimationDisabledPreviously && journeys_utils.previousDivToInjectParents && journeys_utils.previousDivToInjectParents.length > 0) { - journeys_utils.previousDivToInjectParents.forEach(function (parent) { parent.style.marginTop = 0; }); @@ -376,18 +375,19 @@ journeys_utils.addIframeOuterCSS = function(cssIframeContainer, metadata) { if (cssIframeContainer) { iFrameCSS.innerHTML = cssIframeContainer; - } else { + } + else { iFrameCSS.innerHTML = generateIframeOuterCSS(metadata); } utils.addNonceAttribute(iFrameCSS); document.head.appendChild(iFrameCSS); -} +}; function generateIframeOuterCSS(metadata) { - var bodyWebkitTransitionStyle = ''; - var iFrameAnimationStyle = ''; + let bodyWebkitTransitionStyle = ''; + let iFrameAnimationStyle = ''; // Resets previous transition styles document.body.style.transition = ''; @@ -404,22 +404,22 @@ function generateIframeOuterCSS(metadata) { } - var css = bodyWebkitTransitionStyle ? bodyWebkitTransitionStyle : ''; // add if we need to - css += '#branch-banner-iframe { box-shadow: 0 0 5px rgba(0, 0, 0, .35); width: 1px; min-width:100%;' + + let css = bodyWebkitTransitionStyle ? bodyWebkitTransitionStyle : ''; // add if we need to + css += '#branch-banner-iframe { box-shadow: 0 0 5px rgba(0, 0, 0, .35); width: 1px; min-width:100%;' + ' left: 0; right: 0; border: 0; height: ' + journeys_utils.bannerHeight + '; z-index: 99999; ' + - iFrameAnimationStyle + ' }\n' + + iFrameAnimationStyle + ' }\n' + '#branch-banner-iframe { position: ' + (journeys_utils.sticky) + '; }\n' + '@media only screen and (orientation: landscape) { ' + - 'body { ' + (journeys_utils.position === 'top' ? 'margin-top: ' : 'margin-bottom: ' ) + + 'body { ' + (journeys_utils.position === 'top' ? 'margin-top: ' : 'margin-bottom: ') + (journeys_utils.isFullPage ? journeys_utils.windowWidth + 'px' : journeys_utils.bannerHeight) + '; }\n' + '#branch-banner-iframe { height: ' + (journeys_utils.isFullPage ? journeys_utils.windowWidth + 'px' : journeys_utils.bannerHeight) + '; }'; return css; } -/*** +/** * * @function journeys_utils.addIframeInnerCSS * @param {Object} iframe - iframe node * @param {string} innerCSS @@ -427,21 +427,21 @@ function generateIframeOuterCSS(metadata) { * Adds css that was stripped from html blob to the iframe element */ journeys_utils.addIframeInnerCSS = function(iframe, innerCSS) { - var css = document.createElement('style'); + const css = document.createElement('style'); css.type = 'text/css'; css.id = 'branch-css'; css.innerHTML = innerCSS; utils.addNonceAttribute(css); - var doc = iframe.contentWindow.document; + const doc = iframe.contentWindow.document; doc.head.appendChild(css); // if banner is partial height with relative units, we need to make sure // it fills the entire height of the iframe if (journeys_utils.isHalfPage || journeys_utils.isFullPage) { - var dismissBackground = doc.getElementsByClassName('branch-banner-dismiss-background')[0]; - var content = doc.getElementsByClassName('branch-banner-content')[0]; + const dismissBackground = doc.getElementsByClassName('branch-banner-dismiss-background')[0]; + const content = doc.getElementsByClassName('branch-banner-content')[0]; if (!dismissBackground && content) { content.style.height = journeys_utils.bannerHeight; } @@ -458,55 +458,56 @@ journeys_utils.addIframeInnerCSS = function(iframe, innerCSS) { // this is to allow floating button to work try { // get computed background-color of .branch-banner-content - var content = doc.getElementsByClassName('branch-banner-content')[0] - var contentComputedStyle = window.getComputedStyle(content) - var bg = contentComputedStyle.getPropertyValue('background-color') - var arr = bg.split(', ') + const content = doc.getElementsByClassName('branch-banner-content')[0]; + const contentComputedStyle = window.getComputedStyle(content); + const bg = contentComputedStyle.getPropertyValue('background-color'); + const arr = bg.split(', '); // if the alpha === 0, remove the box shadow if (arr[3] && parseFloat(arr[3]) === 0) { - iframe.style.boxShadow = "none"; + iframe.style.boxShadow = 'none'; } - } catch(err) {}; -} + } + catch (err) {}; +}; -/*** +/** * * @function journeys_utils.addDynamicCtaText * @param {Object} iframe * @param {string} ctaText */ journeys_utils.addDynamicCtaText = function(iframe, ctaText) { - var doc = iframe.contentWindow.document; + const doc = iframe.contentWindow.document; if (doc && doc.getElementById('branch-mobile-action')) { - var mobileAction = doc.getElementById('branch-mobile-action'); + const mobileAction = doc.getElementById('branch-mobile-action'); mobileAction.innerHTML = ctaText; mobileAction.setAttribute('aria-label', ctaText); } -} +}; -/*** +/** * * @function journeys_utils.centerOverlay * @param {Object} banner */ journeys_utils.centerOverlay = function(banner) { if (banner && banner.style) { - banner.style.bottom = "140px"; - banner.style.width = "94%"; - banner.style.borderRadius = "20px"; - banner.style.margin = "auto"; + banner.style.bottom = '140px'; + banner.style.width = '94%'; + banner.style.borderRadius = '20px'; + banner.style.margin = 'auto'; } -} +}; -/*** +/** * * @function journeys_utils.animateBannerEntrance * @param {Object} banner */ journeys_utils.animateBannerEntrance = function(banner, cssIframeContainer) { banner_utils.addClass(document.body, 'branch-banner-is-active'); if (journeys_utils.isFullPage && journeys_utils.sticky === 'fixed') { - var bodyCSS = document.createElement("style"); - bodyCSS.type = "text/css"; - bodyCSS.innerHTML = ".branch-banner-no-scroll {overflow: hidden;}"; - document.head.appendChild(bodyCSS); + const bodyCSS = document.createElement('style'); + bodyCSS.type = 'text/css'; + bodyCSS.innerHTML = '.branch-banner-no-scroll {overflow: hidden;}'; + document.head.appendChild(bodyCSS); banner_utils.addClass(document.body, 'branch-banner-no-scroll'); } @@ -514,7 +515,8 @@ journeys_utils.animateBannerEntrance = function(banner, cssIframeContainer) { if (cssIframeContainer) { banner.style.top = null; banner.style.bottom = null; - } else { + } + else { if (journeys_utils.position === 'top') { banner.style.top = '0'; } @@ -522,8 +524,8 @@ journeys_utils.animateBannerEntrance = function(banner, cssIframeContainer) { // check if safeAreaRequired is true or not if (journeys_utils.journeyLinkData && journeys_utils.journeyLinkData['journey_link_data'] && !journeys_utils.journeyLinkData['journey_link_data']['safeAreaRequired']) { banner.style.bottom = '0'; - - } else { + } + else { journeys_utils._dynamicallyRepositionBanner(); } } @@ -532,45 +534,46 @@ journeys_utils.animateBannerEntrance = function(banner, cssIframeContainer) { journeys_utils.isJourneyDisplayed = true; } setTimeout(onAnimationEnd, journeys_utils.animationDelay); -} +}; journeys_utils._resizeListener = function () { if (journeys_utils.isSafeAreaEnabled) { journeys_utils._resetJourneysBannerPosition(false, false); } -} +}; journeys_utils._scrollListener = function () { if (journeys_utils.isSafeAreaEnabled) { if (window.pageYOffset > window.innerHeight) { journeys_utils._resetJourneysBannerPosition(true, false); - } else { + } + else { journeys_utils._resetJourneysBannerPosition(false, false); } } -} +}; journeys_utils._dynamicallyRepositionBanner = function() { journeys_utils.isSafeAreaEnabled = true; // disable Journey animation to avoid lag when repositioning the banner - document.getElementById('branch-banner-iframe').style.transition = "all 0s" + document.getElementById('branch-banner-iframe').style.transition = 'all 0s'; // make sure on the first journey load the position is correct journeys_utils._resetJourneysBannerPosition(false, true); // resize listener for Safari in-app webview resize due to bottom/top nav bar - window.addEventListener("resize", journeys_utils._resizeListener); + window.addEventListener('resize', journeys_utils._resizeListener); // scroll listener for bottom overscrolling edge case - window.addEventListener("scroll", journeys_utils._scrollListener); -} + window.addEventListener('scroll', journeys_utils._scrollListener); +}; journeys_utils._resetJourneysBannerPosition = function(isPageBottomOverScrolling, checkIfPageAlreadyScrollingOnFirstLoad) { - var bannerIFrame = document.getElementById('branch-banner-iframe'); - var bannerHeight = bannerIFrame.offsetHeight; - var bannerTopDistance = bannerIFrame.offsetTop; - var windowHeight = window.innerHeight; + const bannerIFrame = document.getElementById('branch-banner-iframe'); + const bannerHeight = bannerIFrame.offsetHeight; + const bannerTopDistance = bannerIFrame.offsetTop; + const windowHeight = window.innerHeight; // on first load check if the page is already scrolling - if(checkIfPageAlreadyScrollingOnFirstLoad) { - if(window.pageYOffset !== 0) { + if (checkIfPageAlreadyScrollingOnFirstLoad) { + if (window.pageYOffset !== 0) { bannerIFrame.style.bottom = '0'; return false; } @@ -579,29 +582,30 @@ journeys_utils._resetJourneysBannerPosition = function(isPageBottomOverScrolling if (!isPageBottomOverScrolling) { // always keep banner top location equal to the height specified if ((windowHeight - bannerTopDistance) != bannerHeight) { - bannerIFrame.style.top = "" + (windowHeight - bannerHeight) + "px"; + bannerIFrame.style.top = '' + (windowHeight - bannerHeight) + 'px'; } - } else { + } + else { // bottom overscrolling is usually equivalent to half the banner size - bannerIFrame.style.top = (windowHeight - bannerHeight) + (bannerHeight / 2) + "px"; + bannerIFrame.style.top = (windowHeight - bannerHeight) + (bannerHeight / 2) + 'px'; } -} +}; journeys_utils._addSecondsToDate = function(seconds) { - var currentDate = new Date(); + const currentDate = new Date(); return currentDate.setSeconds(currentDate.getSeconds() + seconds); -} +}; journeys_utils._findGlobalDismissPeriod = function(metadata) { - var globalDismissPeriod = metadata['globalDismissPeriod']; + const globalDismissPeriod = metadata['globalDismissPeriod']; if (typeof globalDismissPeriod === 'number') { - return globalDismissPeriod === -1 - ? true - : journeys_utils._addSecondsToDate(globalDismissPeriod); + return globalDismissPeriod === -1 ? + true : + journeys_utils._addSecondsToDate(globalDismissPeriod); } -} +}; -/*** +/** * * @function journeys_utils.finalHookups * @param {string} templateId * @param {string} audienceRuleId @@ -612,27 +616,26 @@ journeys_utils._findGlobalDismissPeriod = function(metadata) { * hooks up the call to action and dismiss buttons */ journeys_utils.finalHookups = function(templateId, audienceRuleId, storage, cta, banner, metadata, testModeEnabled, branch_view) { - - if(!cta || !banner) { + if (!cta || !banner) { return; } - var doc = banner.contentWindow.document; + const doc = banner.contentWindow.document; - var actionEls = doc.querySelectorAll('#branch-mobile-action'); + const actionEls = doc.querySelectorAll('#branch-mobile-action'); Array.prototype.forEach.call(actionEls, function(el) { el.addEventListener('click', function(e) { journeys_utils.branch._publishEvent('didClickJourneyCTA', journeys_utils.journeyLinkData); journeys_utils.journeyDismissed = true; cta(); journeys_utils.animateBannerExit(banner); - }) - }) + }); + }); journeys_utils._setupDismissBehavior('.branch-banner-continue', 'didClickJourneyContinue', storage, banner, templateId, audienceRuleId, metadata, testModeEnabled, branch_view, 'click'); journeys_utils._setupDismissBehavior('.branch-banner-close', 'didClickJourneyClose', storage, banner, templateId, audienceRuleId, metadata, testModeEnabled, branch_view, 'click'); journeys_utils._setupDismissBehavior('.branch-banner-dismiss-background', 'didClickJourneyBackgroundDismiss', storage, banner, templateId, audienceRuleId, metadata, testModeEnabled, branch_view, 'click'); journeys_utils._setupDismissBehavior('.branch-banner-dismiss-background', 'didScrollJourneyBackgroundDismiss', storage, banner, templateId, audienceRuleId, metadata, testModeEnabled, branch_view, 'touchmove'); -} +}; /** * @function journeys_utils._setupDismissBehavior @@ -647,116 +650,116 @@ journeys_utils.finalHookups = function(templateId, audienceRuleId, storage, cta, * Attach callbacks for dismiss elements on journey */ journeys_utils._setupDismissBehavior = function(cssSelector, eventName, storage, banner, templateId, audienceRuleId, metadata, testModeEnabled, branch_view, eventType) { - var doc = banner.contentWindow.document; - var cancelEls = doc.querySelectorAll(cssSelector); + const doc = banner.contentWindow.document; + const cancelEls = doc.querySelectorAll(cssSelector); Array.prototype.forEach.call(cancelEls, function(el) { el.addEventListener(eventType, function(e) { journeys_utils._handleJourneyDismiss(eventName, storage, banner, templateId, audienceRuleId, metadata, testModeEnabled, branch_view); }); }); -} +}; journeys_utils._setJourneyDismiss = function(storage, templateId, audienceRuleId) { - var journeyDismissals = storage.get('journeyDismissals', true); + let journeyDismissals = storage.get('journeyDismissals', true); journeyDismissals = journeyDismissals ? safejson.parse(journeyDismissals) : {}; journeyDismissals[audienceRuleId] = { - "view_id": templateId, - "dismiss_time": Date.now() + 'view_id': templateId, + 'dismiss_time': Date.now() }; storage.set('journeyDismissals', safejson.stringify(journeyDismissals), true); return journeyDismissals; -} +}; journeys_utils.decodeSymbols = function (str) { if (str === undefined || str === null) { return null; } return str - .replace(/</g, "<") - .replace(/>/g, ">") - .replace(/&/g, "&") - .replace(/"/g, "\"") - .replace(/'/g, "'") - .replace(/¦/g, "¦") - .replace(/«/g, "«") - .replace(/´/g, "´") - .replace(/·/g, "·") - .replace(/»/g, "»") - .replace(/&/g, "&") - .replace(/¿/g, "¿") - .replace(/×/g, "×") - .replace(/÷/g, "÷") - .replace(/À/g, "À") - .replace(/Á/g, "Á") - .replace(/Â/g, "Â") - .replace(/Ã/g, "Ã") - .replace(/Ä/g, "Ä") - .replace(/Å/g, "Å") - .replace(/Æ/g, "Æ") - .replace(/Ç/g, "Ç") - .replace(/È/g, "È") - .replace(/É/g, "É") - .replace(/Ê/g, "Ê") - .replace(/Ë/g, "Ë") - .replace(/Ì/g, "Ì") - .replace(/Í/g, "Í") - .replace(/Î/g, "Î") - .replace(/Ï/g, "Ï") - .replace(/Ð/g, "Ð") - .replace(/Ñ/g, "Ñ") - .replace(/Ò/g, "Ò") - .replace(/Ó/g, "Ó") - .replace(/Ô/g, "Ô") - .replace(/Õ/g, "Õ") - .replace(/Ö/g, "Ö") - .replace(/Ø/g, "Ø") - .replace(/Ù/g, "Ù") - .replace(/Ú/g, "Ú") - .replace(/Û/g, "Û") - .replace(/Ü/g, "Ü") - .replace(/Ý/g, "Ý") - .replace(/Þ/g, "Þ") - .replace(/ß/g, "ß") - .replace(/à/g, "à") - .replace(/á/g, "á") - .replace(/â/g, "â") - .replace(/ã/g, "ã") - .replace(/ä/g, "ä") - .replace(/å/g, "å") - .replace(/æ/g, "æ") - .replace(/ç/g, "ç") - .replace(/è/g, "è") - .replace(/é/g, "é") - .replace(/ê/g, "ê") - .replace(/ë/g, "ë") - .replace(/ì/g, "ì") - .replace(/í/g, "í") - .replace(/î/g, "î") - .replace(/ï/g, "ï") - .replace(/ð/g, "ð") - .replace(/ñ/g, "ñ") - .replace(/ò/g, "ò") - .replace(/ó/g, "ó") - .replace(/ô/g, "ô") - .replace(/õ/g, "õ") - .replace(/ö/g, "ö") - .replace(/ø/g, "ø") - .replace(/ù/g, "ù") - .replace(/ú/g, "ú") - .replace(/û/g, "û") - .replace(/ü/g, "ü") - .replace(/ý/g, "ý") - .replace(/þ/g, "þ") - .replace(/ÿ/g, "ÿ"); -} + .replace(/</g, '<') + .replace(/>/g, '>') + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(/'/g, '\'') + .replace(/¦/g, '¦') + .replace(/«/g, '«') + .replace(/´/g, '´') + .replace(/·/g, '·') + .replace(/»/g, '»') + .replace(/&/g, '&') + .replace(/¿/g, '¿') + .replace(/×/g, '×') + .replace(/÷/g, '÷') + .replace(/À/g, 'À') + .replace(/Á/g, 'Á') + .replace(/Â/g, 'Â') + .replace(/Ã/g, 'Ã') + .replace(/Ä/g, 'Ä') + .replace(/Å/g, 'Å') + .replace(/Æ/g, 'Æ') + .replace(/Ç/g, 'Ç') + .replace(/È/g, 'È') + .replace(/É/g, 'É') + .replace(/Ê/g, 'Ê') + .replace(/Ë/g, 'Ë') + .replace(/Ì/g, 'Ì') + .replace(/Í/g, 'Í') + .replace(/Î/g, 'Î') + .replace(/Ï/g, 'Ï') + .replace(/Ð/g, 'Ð') + .replace(/Ñ/g, 'Ñ') + .replace(/Ò/g, 'Ò') + .replace(/Ó/g, 'Ó') + .replace(/Ô/g, 'Ô') + .replace(/Õ/g, 'Õ') + .replace(/Ö/g, 'Ö') + .replace(/Ø/g, 'Ø') + .replace(/Ù/g, 'Ù') + .replace(/Ú/g, 'Ú') + .replace(/Û/g, 'Û') + .replace(/Ü/g, 'Ü') + .replace(/Ý/g, 'Ý') + .replace(/Þ/g, 'Þ') + .replace(/ß/g, 'ß') + .replace(/à/g, 'à') + .replace(/á/g, 'á') + .replace(/â/g, 'â') + .replace(/ã/g, 'ã') + .replace(/ä/g, 'ä') + .replace(/å/g, 'å') + .replace(/æ/g, 'æ') + .replace(/ç/g, 'ç') + .replace(/è/g, 'è') + .replace(/é/g, 'é') + .replace(/ê/g, 'ê') + .replace(/ë/g, 'ë') + .replace(/ì/g, 'ì') + .replace(/í/g, 'í') + .replace(/î/g, 'î') + .replace(/ï/g, 'ï') + .replace(/ð/g, 'ð') + .replace(/ñ/g, 'ñ') + .replace(/ò/g, 'ò') + .replace(/ó/g, 'ó') + .replace(/ô/g, 'ô') + .replace(/õ/g, 'õ') + .replace(/ö/g, 'ö') + .replace(/ø/g, 'ø') + .replace(/ù/g, 'ù') + .replace(/ú/g, 'ú') + .replace(/û/g, 'û') + .replace(/ü/g, 'ü') + .replace(/ý/g, 'ý') + .replace(/þ/g, 'þ') + .replace(/ÿ/g, 'ÿ'); +}; journeys_utils._getDismissRequestData = function(branch_view, dismissal_source) { - var metadata = {}; - var hostedDeeplinkData = utils.getHostedDeepLinkData(); + const metadata = {}; + const hostedDeeplinkData = utils.getHostedDeepLinkData(); if (hostedDeeplinkData && Object.keys(hostedDeeplinkData).length > 0) { metadata['hosted_deeplink_data'] = hostedDeeplinkData; } - var dismissRequestData = branch_view._getPageviewRequestData( + const dismissRequestData = branch_view._getPageviewRequestData( journeys_utils._getPageviewMetadata(null, metadata), null, journeys_utils.branch, @@ -765,66 +768,67 @@ journeys_utils._getDismissRequestData = function(branch_view, dismissal_source) if ( journeys_utils.journeyLinkData && - journeys_utils.journeyLinkData["journey_link_data"] + journeys_utils.journeyLinkData['journey_link_data'] ) { utils.addPropertyIfNotNull( dismissRequestData, - "journey_id", - journeys_utils.journeyLinkData["journey_link_data"]["journey_id"] + 'journey_id', + journeys_utils.journeyLinkData['journey_link_data']['journey_id'] ); utils.addPropertyIfNotNull( dismissRequestData, - "journey_name", - journeys_utils.decodeSymbols(journeys_utils.journeyLinkData["journey_link_data"]["journey_name"]) + 'journey_name', + journeys_utils.decodeSymbols(journeys_utils.journeyLinkData['journey_link_data']['journey_name']) ); utils.addPropertyIfNotNull( dismissRequestData, - "view_id", - journeys_utils.journeyLinkData["journey_link_data"]["view_id"] + 'view_id', + journeys_utils.journeyLinkData['journey_link_data']['view_id'] ); utils.addPropertyIfNotNull( dismissRequestData, - "view_name", + 'view_name', journeys_utils.decodeSymbols( - journeys_utils.journeyLinkData["journey_link_data"]["view_name"] + journeys_utils.journeyLinkData['journey_link_data']['view_name'] ) ); utils.addPropertyIfNotNull( dismissRequestData, - "channel", + 'channel', journeys_utils.decodeSymbols( - journeys_utils.journeyLinkData["journey_link_data"]["channel"] + journeys_utils.journeyLinkData['journey_link_data']['channel'] ) ); utils.addPropertyIfNotNull( dismissRequestData, - "campaign", + 'campaign', journeys_utils.decodeSymbols( - journeys_utils.journeyLinkData["journey_link_data"]["campaign"] + journeys_utils.journeyLinkData['journey_link_data']['campaign'] ) ); try { utils.addPropertyIfNotNull( dismissRequestData, - "tags", + 'tags', JSON.stringify( - journeys_utils.journeyLinkData["journey_link_data"]["tags"] + journeys_utils.journeyLinkData['journey_link_data']['tags'] ) ); - } catch (e) { - dismissRequestData["tags"] = JSON.stringify([]); + } + catch (e) { + dismissRequestData['tags'] = JSON.stringify([]); } } utils.addPropertyIfNotNull(dismissRequestData, 'dismissal_source', dismissal_source); return dismissRequestData; -} +}; journeys_utils._handleJourneyDismiss = function(eventName, storage, banner, templateId, audienceRuleId, metadata, testModeEnabled, branch_view) { - var globalDismissPeriod = !testModeEnabled - ? journeys_utils._findGlobalDismissPeriod(metadata) - : 0; + const globalDismissPeriod = !testModeEnabled ? + journeys_utils._findGlobalDismissPeriod(metadata) : + 0; journeys_utils.branch._publishEvent(eventName, journeys_utils.journeyLinkData); journeys_utils.journeyDismissed = true; journeys_utils.animateBannerExit(banner); @@ -834,9 +838,9 @@ journeys_utils._handleJourneyDismiss = function(eventName, storage, banner, temp storage.set('globalJourneysDismiss', globalDismissPeriod, true); } journeys_utils._setJourneyDismiss(storage, templateId, audienceRuleId); - var listener = function () { + const listener = function () { journeys_utils.branch.removeListener(listener); - var requestData = journeys_utils._getDismissRequestData(branch_view, utils.dismissEventToSourceMapping[eventName]); + const requestData = journeys_utils._getDismissRequestData(branch_view, utils.dismissEventToSourceMapping[eventName]); journeys_utils.branch._api( resources.dismiss, requestData, @@ -844,14 +848,8 @@ journeys_utils._handleJourneyDismiss = function(eventName, storage, banner, temp if (!err && metadata && metadata['dismissRedirect']) { window.location = metadata['dismissRedirect']; } - else if (!err && typeof data === "object" && data['template']) { - if (branch_view.shouldDisplayJourney - ( - data, - null, - false - ) - ) { + else if (!err && typeof data === 'object' && data['template']) { + if (branch_view.shouldDisplayJourney(data, null, false)) { branch_view.displayJourney( data['template'], requestData, @@ -867,45 +865,45 @@ journeys_utils._handleJourneyDismiss = function(eventName, storage, banner, temp }; journeys_utils.branch.addListener('branch_internal_event_didCloseJourney', listener); } -} +}; journeys_utils._getPageviewMetadata = function(options, additionalMetadata) { - var pageviewMetadata = utils.merge({ - "url": options && options.url || utils.getWindowLocation(), - "user_agent": navigator.userAgent, - "language": navigator.language, - "screen_width": screen.width || -1, - "screen_height": screen.height || -1, - "window_device_pixel_ratio": window.devicePixelRatio || 1, + let pageviewMetadata = utils.merge({ + 'url': options && options.url || utils.getWindowLocation(), + 'user_agent': navigator.userAgent, + 'language': navigator.language, + 'screen_width': screen.width || -1, + 'screen_height': screen.height || -1, + 'window_device_pixel_ratio': window.devicePixelRatio || 1 }, additionalMetadata || {}); - pageviewMetadata = utils.addPropertyIfNotNullorEmpty(pageviewMetadata, "model", utils.userAgentData ? utils.userAgentData.model : ""); - pageviewMetadata = utils.addPropertyIfNotNullorEmpty(pageviewMetadata, "os_version", utils.userAgentData ? utils.userAgentData.platformVersion : ""); + pageviewMetadata = utils.addPropertyIfNotNullorEmpty(pageviewMetadata, 'model', utils.userAgentData ? utils.userAgentData.model : ''); + pageviewMetadata = utils.addPropertyIfNotNullorEmpty(pageviewMetadata, 'os_version', utils.userAgentData ? utils.userAgentData.platformVersion : ''); return pageviewMetadata; }; -/*** +/** * * @function journeys_utils.animateBannerExit * @param {Object} banner * @param {boolean=} dismissedJourneyProgrammatically */ journeys_utils.animateBannerExit = function(banner, dismissedJourneyProgrammatically) { - if(!journeys_utils.exitAnimationDisabled){ + if (!journeys_utils.exitAnimationDisabled) { journeys_utils.exitAnimationIsRunning = true; } // adds transitions for Journey exit if they don't exist if (journeys_utils.entryAnimationDisabled && !journeys_utils.exitAnimationDisabled) { - document.body.style.transition = "all 0" + (journeys_utils.animationSpeed * 1.5 / 1000) + "s ease"; - document.getElementById('branch-banner-iframe').style.transition = "all 0" + (journeys_utils.animationSpeed / 1000) + "s ease"; + document.body.style.transition = 'all 0' + (journeys_utils.animationSpeed * 1.5 / 1000) + 's ease'; + document.getElementById('branch-banner-iframe').style.transition = 'all 0' + (journeys_utils.animationSpeed / 1000) + 's ease'; // ensure that -webkit-transition styles get applied as well - var iFrameOutterCSSBackup = document.getElementById('branch-iframe-css').innerHTML + '\n'; + let iFrameOutterCSSBackup = document.getElementById('branch-iframe-css').innerHTML + '\n'; iFrameOutterCSSBackup += 'body { -webkit-transition: all ' + (journeys_utils.animationSpeed * 1.5 / 1000) + 's ease; }\n'; iFrameOutterCSSBackup += '#branch-banner-iframe { -webkit-transition: all ' + (journeys_utils.animationSpeed / 1000) + 's ease; }\n'; // in order for updated styles to get applied, we have to remove all branch-iframe-css styles - document.getElementById('branch-iframe-css').innerHTML = ""; - //re-add them here for changes to take effect + document.getElementById('branch-iframe-css').innerHTML = ''; + // re-add them here for changes to take effect document.getElementById('branch-iframe-css').innerHTML = iFrameOutterCSSBackup; } @@ -918,7 +916,7 @@ journeys_utils.animateBannerExit = function(banner, dismissedJourneyProgrammatic journeys_utils.branch._publishEvent('willCloseJourney', journeys_utils.journeyLinkData); // removes timeout if animation is disabled or uses default timeout - var speedAndDelay = journeys_utils.exitAnimationDisabled ? 0 : journeys_utils.animationSpeed + journeys_utils.animationDelay; + const speedAndDelay = journeys_utils.exitAnimationDisabled ? 0 : journeys_utils.animationSpeed + journeys_utils.animationDelay; setTimeout(function() { // remove banner, branch-css, and branch-iframe-css banner_utils.removeElement(banner); @@ -932,8 +930,9 @@ journeys_utils.animateBannerExit = function(banner, dismissedJourneyProgrammatic journeys_utils.divToInjectParents.length > 0) { journeys_utils.divToInjectParents.forEach(function(parent) { parent.style.marginTop = 0; - }) - } else { + }); + } + else { journeys_utils.exitAnimationDisabledPreviously = journeys_utils.exitAnimationDisabled; journeys_utils.previousPosition = journeys_utils.position; journeys_utils.previousDivToInjectParents = journeys_utils.divToInjectParents; @@ -952,8 +951,8 @@ journeys_utils.animateBannerExit = function(banner, dismissedJourneyProgrammatic // clear any safe area listeners on banner closing if (journeys_utils.isSafeAreaEnabled) { journeys_utils.isSafeAreaEnabled = false; - window.removeEventListener("resize", journeys_utils._resizeListener); - window.removeEventListener("scroll", journeys_utils._scrollListener); + window.removeEventListener('resize', journeys_utils._resizeListener); + window.removeEventListener('scroll', journeys_utils._scrollListener); } journeys_utils.branch._publishEvent('didCloseJourney', journeys_utils.journeyLinkData); if (!dismissedJourneyProgrammatically) { @@ -961,14 +960,14 @@ journeys_utils.animateBannerExit = function(banner, dismissedJourneyProgrammatic } journeys_utils.isJourneyDisplayed = false; - setTimeout(function(){ journeys_utils.exitAnimationIsRunning = false; }, journeys_utils.animationSpeed ) + setTimeout(function() {journeys_utils.exitAnimationIsRunning = false;}, journeys_utils.animationSpeed); }, speedAndDelay); }; journeys_utils.setJourneyLinkData = function(linkData) { - var data = { 'banner_id': journeys_utils.branchViewId }; - if (linkData && typeof linkData === "object" && Object.keys(linkData || {}).length > 0) { - var journeyLinkDataPropertiesToFilterOut = ['browser_fingerprint_id', 'app_id', 'source', 'open_app', 'link_click_id']; + const data = {'banner_id': journeys_utils.branchViewId}; + if (linkData && typeof linkData === 'object' && Object.keys(linkData || {}).length > 0) { + const journeyLinkDataPropertiesToFilterOut = [ 'browser_fingerprint_id', 'app_id', 'source', 'open_app', 'link_click_id' ]; utils.removePropertiesFromObject(linkData, journeyLinkDataPropertiesToFilterOut); data['journey_link_data'] = {}; utils.merge(data['journey_link_data'], linkData); @@ -977,19 +976,19 @@ journeys_utils.setJourneyLinkData = function(linkData) { }; journeys_utils.getValueForKeyInBranchViewData = function(key) { - if(!journeys_utils){ + if (!journeys_utils) { return false; } - if(!journeys_utils.branch){ + if (!journeys_utils.branch) { return false; } - if(!journeys_utils.branch._branchViewData){ + if (!journeys_utils.branch._branchViewData) { return false; } - if(!journeys_utils.branch._branchViewData.data){ + if (!journeys_utils.branch._branchViewData.data) { return false; } @@ -997,15 +996,15 @@ journeys_utils.getValueForKeyInBranchViewData = function(key) { }; journeys_utils.hasJourneyCtaLink = function () { - if(!journeys_utils.getValueForKeyInBranchViewData('$journeys_cta')){ + if (!journeys_utils.getValueForKeyInBranchViewData('$journeys_cta')) { return false; } return journeys_utils.getBranchViewDataItemOrUndefined('$journeys_cta').length > 0; }; -journeys_utils.getBranchViewDataItemOrUndefined = function(name){ - if(journeys_utils.getValueForKeyInBranchViewData(name)){ +journeys_utils.getBranchViewDataItemOrUndefined = function(name) { + if (journeys_utils.getValueForKeyInBranchViewData(name)) { return journeys_utils.branch._branchViewData.data[name]; } return undefined; @@ -1015,34 +1014,35 @@ journeys_utils.getJourneyCtaLink = function () { return journeys_utils.getBranchViewDataItemOrUndefined('$journeys_cta'); }; -journeys_utils.tryReplaceJourneyCtaLink = function (html){ - try{ - if(journeys_utils.hasJourneyCtaLink()){ - var journeyLinkReplacePattern = /validate[(].+[)];/g; - var pattern = 'validate("' + journeys_utils.getJourneyCtaLink() + '")' - var replacedHtml = html.replace(journeyLinkReplacePattern, pattern); - return replacedHtml.replace('window.top.location.replace(', 'window.top.location = ') +journeys_utils.tryReplaceJourneyCtaLink = function (html) { + try { + if (journeys_utils.hasJourneyCtaLink()) { + const journeyLinkReplacePattern = /validate[(].+[)];/g; + const pattern = 'validate("' + journeys_utils.getJourneyCtaLink() + '")'; + const replacedHtml = html.replace(journeyLinkReplacePattern, pattern); + return replacedHtml.replace('window.top.location.replace(', 'window.top.location = '); } - }catch(e){ + } + catch (e) { return html; } return html; }; -journeys_utils.trySetJourneyUrls = function (linkElements, urls = ['$android_url', '$ios_url', '$fallback_url', '$desktop_url']) { - if(!linkElements){ +journeys_utils.trySetJourneyUrls = function (linkElements, urls = [ '$android_url', '$ios_url', '$fallback_url', '$desktop_url' ]) { + if (!linkElements) { return linkElements; } - var assignUrls = function (data) { + const assignUrls = function (data) { return urls.reduce((value, url)=>{ - if(value[url]){ + if (value[url]) { return value; } - var entry = journeys_utils.getBranchViewDataItemOrUndefined(url); - if(entry){ + const entry = journeys_utils.getBranchViewDataItemOrUndefined(url); + if (entry) { value[url] = entry; } return value; @@ -1050,11 +1050,12 @@ journeys_utils.trySetJourneyUrls = function (linkElements, urls = ['$android_url }; try { - var data = (safejson.parse(linkElements.data)); + const data = (safejson.parse(linkElements.data)); linkElements.data = JSON.stringify(assignUrls(data)); return linkElements; - }catch(e){ + } + catch (e) { return linkElements; } }; diff --git a/src/onpage.js b/src/onpage.js index c436821c9..151d5d457 100644 --- a/src/onpage.js +++ b/src/onpage.js @@ -22,7 +22,7 @@ root[branchStr] = branchSdk; } -})( +}( window, document, 'script', 'branch', function(branch, name) { branch[name] = function() { branch._q.push([ name, arguments ]); @@ -58,4 +58,4 @@ 'qrCode' ], 0 -); +)); diff --git a/test/0_config.js b/test/0_config.js index 5d0f73af9..024d9e33b 100644 --- a/test/0_config.js +++ b/test/0_config.js @@ -4,7 +4,7 @@ goog.require('config'); describe('config', function() { - var assert = testUtils.unplanned(); + const assert = testUtils.unplanned(); describe('app_service_endpoint', function() { it('app_service_endpoint should be defined', function() { assert.isDefined(config.app_service_endpoint, 'app_service_endpoint is un-defined'); diff --git a/test/0_queue.js b/test/0_queue.js index 4742b1a77..d2143a73c 100644 --- a/test/0_queue.js +++ b/test/0_queue.js @@ -3,10 +3,10 @@ goog.require('task_queue'); describe('task_queue', function() { - var queue; - var orderCalled; - var clock; - var assert = testUtils.unplanned(); + let queue; + let orderCalled; + let clock; + const assert = testUtils.unplanned(); beforeEach(function() { queue = task_queue(); clock = sinon.useFakeTimers(); diff --git a/test/1_utils.js b/test/1_utils.js index b03041dbc..c6276ef6b 100644 --- a/test/1_utils.js +++ b/test/1_utils.js @@ -1,55 +1,55 @@ 'use strict'; -/*jshint -W079 */ -var sinon = require('sinon'); +/* jshint -W079 */ +const sinon = require('sinon'); goog.require('utils'); describe('utils', function() { - var assert = testUtils.unplanned(); + const assert = testUtils.unplanned(); describe('base64encode', function() { it('should encode a string', function() { - var string = 'test string to encode'; - var expectedEncoded = 'dGVzdCBzdHJpbmcgdG8gZW5jb2Rl'; + const string = 'test string to encode'; + const expectedEncoded = 'dGVzdCBzdHJpbmcgdG8gZW5jb2Rl'; assert.strictEqual(utils.base64encode(string), expectedEncoded, 'Correctly encoded'); }); }); describe('merge', function() { it('should merge two objects despite duplication', function() { - var obj1 = { "simple": "object" }; - var obj2 = { - "simple": "object", - "nested": { - "object": "here" + const obj1 = {'simple': 'object'}; + const obj2 = { + 'simple': 'object', + 'nested': { + 'object': 'here' } }; - var expectedMerged = { - "simple": "object", - "nested": { - "object": "here" + const expectedMerged = { + 'simple': 'object', + 'nested': { + 'object': 'here' } }; assert.deepEqual(utils.merge(obj1, obj2), expectedMerged, 'Correctly merged'); }); it('should handle an non-object for first argument', function() { - var obj1 = null; - var obj2 = { - "simple": "object", - "nested": { - "object": "here" + const obj1 = null; + const obj2 = { + 'simple': 'object', + 'nested': { + 'object': 'here' } }; - var expectedMerged = { - "simple": "object", - "nested": { - "object": "here" + const expectedMerged = { + 'simple': 'object', + 'nested': { + 'object': 'here' } }; assert.deepEqual(utils.merge(obj1, obj2), expectedMerged, 'Correctly merged'); }); it('should handle an non-object for second argument', function() { - var obj1 = { "simple": "object" }; - var obj2 = null; - var expectedMerged = { "simple": "object" }; + const obj1 = {'simple': 'object'}; + const obj2 = null; + const expectedMerged = {'simple': 'object'}; assert.deepEqual(utils.merge(obj1, obj2), expectedMerged, 'Correctly merged'); }); }); @@ -65,31 +65,31 @@ describe('utils', function() { * developer_identity seems risky, but setting identity to the correct * value is an improvement over two nulls. */ - var input = { - "data": "string", - "data_parsed": { - "key": "value" + const input = { + 'data': 'string', + 'data_parsed': { + 'key': 'value' }, - "has_app": true, - "identity": "90210", - "developer_identity": "67890", - "referring_identity": "12345", - "referring_link": null, - "unwanted": "param" + 'has_app': true, + 'identity': '90210', + 'developer_identity': '67890', + 'referring_identity': '12345', + 'referring_link': null, + 'unwanted': 'param' }; - var expected = { - "data": "string", - "data_parsed": { - "key": "value" + const expected = { + 'data': 'string', + 'data_parsed': { + 'key': 'value' }, - "has_app": true, - "identity": "90210", - "developer_identity": "90210", - "referring_identity": "12345", - "referring_link": null + 'has_app': true, + 'identity': '90210', + 'developer_identity': '90210', + 'referring_identity': '12345', + 'referring_link': null }; // determine whitelisted fields before deleting unwanted param - var actual = utils.whiteListSessionData(input); + const actual = utils.whiteListSessionData(input); assert.deepEqual( actual, expected, @@ -98,23 +98,23 @@ describe('utils', function() { }); it('should make missing params null', function() { - var data = { - "data": "string", - "identity": "67890", - "referring_identity": "12345" + const data = { + 'data': 'string', + 'identity': '67890', + 'referring_identity': '12345' }; - var whiteListedData = utils.whiteListSessionData(data); + const whiteListedData = utils.whiteListSessionData(data); assert.strictEqual(whiteListedData['has_app'], null, 'has_app should be null'); }); }); describe('cleanLinkData', function() { - var windowLocation = 'http://someurl/pluspath'; - var ogTitle = 'OGTitle'; - var ogDescription = 'OGDescription'; - var ogImage = 'OGImage'; - var ogVideo = 'OGVideo'; - var ogType = 'OGType'; + const windowLocation = 'http://someurl/pluspath'; + const ogTitle = 'OGTitle'; + const ogDescription = 'OGDescription'; + const ogImage = 'OGImage'; + const ogVideo = 'OGVideo'; + const ogType = 'OGType'; beforeEach(function() { sinon.stub(utils, 'getWindowLocation') @@ -134,8 +134,8 @@ describe('utils', function() { }); it('should accept empty linkData', function() { - var linkData = { }; - var dataString = [ + const linkData = { }; + const dataString = [ '{', '"$canonical_url":"' + windowLocation + '",', '"$og_title":"' + ogTitle + '",', @@ -145,8 +145,8 @@ describe('utils', function() { '"$og_type":"' + ogType + '"', '}' ].join(''); - var expectedCleanedLinkData = { - source: "web-sdk", + const expectedCleanedLinkData = { + source: 'web-sdk', data: dataString }; assert.deepEqual( @@ -157,17 +157,17 @@ describe('utils', function() { }); it('should stringify field "data" and add "source"', function() { - var linkData = { - "data": { - subfield1:"bar", - "subfield2":false + const linkData = { + 'data': { + 'subfield1': 'bar', + 'subfield2': false }, - field1: 12345, - field2: "67890", - "field 3": true, - field4: null + 'field1': 12345, + 'field2': '67890', + 'field 3': true, + 'field4': null }; - var dataString = [ + const dataString = [ '{', '"subfield1":"bar",', '"subfield2":false,', @@ -179,13 +179,13 @@ describe('utils', function() { '"$og_type":"' + ogType + '"', '}' ].join(''); - var expectedCleanedLinkData = { - "data": dataString, - field1: 12345, - field2: "67890", - "field 3": true, - field4: null, - source: "web-sdk" + const expectedCleanedLinkData = { + 'data': dataString, + 'field1': 12345, + 'field2': '67890', + 'field 3': true, + 'field4': null, + 'source': 'web-sdk' }; assert.deepEqual( utils.cleanLinkData(linkData), @@ -195,18 +195,18 @@ describe('utils', function() { }); it('should not stringify pre-stringified field "data"', function() { - var linkData = { - "data": + const linkData = { + 'data': { - subfield1:"bar", - "subfield2":false + 'subfield1': 'bar', + 'subfield2': false }, - field1: 12345, - field2: "67890", - "field 3": true, - field4: null + 'field1': 12345, + 'field2': '67890', + 'field 3': true, + 'field4': null }; - var dataString = [ + const dataString = [ '{', '"subfield1":"bar",', '"subfield2":false,', @@ -218,13 +218,13 @@ describe('utils', function() { '"$og_type":"' + ogType + '"', '}' ].join(''); - var expectedCleanedLinkData = { - "data": dataString, - field1: 12345, - field2: "67890", - "field 3": true, - field4: null, - source: "web-sdk" + const expectedCleanedLinkData = { + 'data': dataString, + 'field1': 12345, + 'field2': '67890', + 'field 3': true, + 'field4': null, + 'source': 'web-sdk' }; assert.deepEqual( utils.cleanLinkData((utils.cleanLinkData(linkData))), @@ -291,7 +291,7 @@ describe('utils', function() { utils.message(utils.messages.timeout), 'Request timed out', 'Expected Request timed out message produced' - ); + ); }); it('should produce a missing URL error', function() { @@ -428,8 +428,8 @@ describe('utils', function() { ); }); it.skip('should return OG tags', function() { - var expected = { - $og_type:'product' + const expected = { + $og_type: 'product' }; assert.deepEqual( expected, @@ -438,7 +438,7 @@ describe('utils', function() { ); }); it.skip('should find applink, twitter and branch hosted data on page', function() { - var expected = { + const expected = { watch_brand: 'Hamilton', type: 'Khaki Aviation Stainless Steel Automatic Leather-Strap Watch', $ios_deeplink_path: 'applinks/hamilton/khaki/ios', @@ -451,13 +451,13 @@ describe('utils', function() { ); }); it('$ios_deeplink_path and $android_deeplink_path should be formed from hosted metadata', function() { - var params = { "$key1":"val1", "$key2":"val2" }; - var deeplinkPaths = { "hostedIOS":"hosteddld/ios", "hostedAndroid":"hosteddld/android", "applinksIOS":"appllinks/ios", "applinksAndroid":"applinks/android", "twitterIOS":"twitter/ios", "twitterAndroid":"twitter/android" }; - var expected = { - "$key1":"val1", - "$key2":"val2", - "$ios_deeplink_path":"hosteddld/ios", - "$android_deeplink_path":"hosteddld/android" + const params = {'$key1': 'val1', '$key2': 'val2'}; + const deeplinkPaths = {'hostedIOS': 'hosteddld/ios', 'hostedAndroid': 'hosteddld/android', 'applinksIOS': 'appllinks/ios', 'applinksAndroid': 'applinks/android', 'twitterIOS': 'twitter/ios', 'twitterAndroid': 'twitter/android'}; + const expected = { + '$key1': 'val1', + '$key2': 'val2', + '$ios_deeplink_path': 'hosteddld/ios', + '$android_deeplink_path': 'hosteddld/android' }; assert.deepEqual( expected, @@ -466,13 +466,13 @@ describe('utils', function() { ); }); it('$ios_deeplink_path should be formed from applinks tag and $android_deeplink_path from hosted metadata tag', function() { - var params = { "$key1":"val1", "$key2":"val2" }; - var deeplinkPaths = { "hostedIOS":null, "hostedAndroid":"hosteddld/android", "applinksIOS":"appllinks/ios", "applinksAndroid":"applinks/android", "twitterIOS":"twitter/ios", "twitterAndroid":"twitter/android" }; - var expected = { - "$key1":"val1", - "$key2":"val2", - "$ios_deeplink_path":"appllinks/ios", - "$android_deeplink_path":"hosteddld/android" + const params = {'$key1': 'val1', '$key2': 'val2'}; + const deeplinkPaths = {'hostedIOS': null, 'hostedAndroid': 'hosteddld/android', 'applinksIOS': 'appllinks/ios', 'applinksAndroid': 'applinks/android', 'twitterIOS': 'twitter/ios', 'twitterAndroid': 'twitter/android'}; + const expected = { + '$key1': 'val1', + '$key2': 'val2', + '$ios_deeplink_path': 'appllinks/ios', + '$android_deeplink_path': 'hosteddld/android' }; assert.deepEqual( expected, @@ -481,11 +481,11 @@ describe('utils', function() { ); }); it('$ios_deeplink_path and $android_deeplink_path should be formed from twitter tags', function() { - var params = {}; - var deeplinkPaths = { "twitterIOS":"twitter/ios", "twitterAndroid":"twitter/android" }; - var expected = { - "$ios_deeplink_path":"twitter/ios", - "$android_deeplink_path":"twitter/android" + const params = {}; + const deeplinkPaths = {'twitterIOS': 'twitter/ios', 'twitterAndroid': 'twitter/android'}; + const expected = { + '$ios_deeplink_path': 'twitter/ios', + '$android_deeplink_path': 'twitter/android' }; assert.deepEqual( expected, @@ -494,12 +494,12 @@ describe('utils', function() { ); }); it('$ios_deeplink_path and $android_deeplink_path should be formed from twitter tags. $deeplink_path should also be present', function() { - var params = {}; - var deeplinkPaths = { "twitterIOS":"twitter/some/path", "twitterAndroid":"twitter/some/path" }; - var expected = { - "$ios_deeplink_path":"twitter/some/path", - "$android_deeplink_path":"twitter/some/path", - "$deeplink_path":"twitter/some/path" + const params = {}; + const deeplinkPaths = {'twitterIOS': 'twitter/some/path', 'twitterAndroid': 'twitter/some/path'}; + const expected = { + '$ios_deeplink_path': 'twitter/some/path', + '$android_deeplink_path': 'twitter/some/path', + '$deeplink_path': 'twitter/some/path' }; assert.deepEqual( expected, @@ -508,11 +508,11 @@ describe('utils', function() { ); }); it('Original key:value pairs in params should be present', function() { - var params = { "$key1":"val1", "$key2":"val2" }; - var deeplinkPaths = {}; - var expected = { - "$key1":"val1", - "$key2":"val2" + const params = {'$key1': 'val1', '$key2': 'val2'}; + const deeplinkPaths = {}; + const expected = { + '$key1': 'val1', + '$key2': 'val2' }; assert.deepEqual( expected, @@ -524,47 +524,47 @@ describe('utils', function() { describe('getClickIdAndSearchStringFromLink', function() { it.skip('If /123abc is passed in, 123abc should be returned"', function() { - var expected = "123abc"; + const expected = '123abc'; assert.strictEqual( expected, - utils.getClickIdAndSearchStringFromLink("/123abc"), + utils.getClickIdAndSearchStringFromLink('/123abc'), 'should be equal' ); }); it.skip('If /c/123abc is passed in, 123abc should be returned"', function() { - var expected = "123abc"; + const expected = '123abc'; assert.strictEqual( expected, - utils.getClickIdAndSearchStringFromLink("/c/123abc"), + utils.getClickIdAndSearchStringFromLink('/c/123abc'), 'should be equal' ); }); it.skip('If /c/123abc?key1=val1 is passed in, 123abc?key1=val1 should be returned"', function() { - var expected = "123abc?key1=val1"; + const expected = '123abc?key1=val1'; assert.strictEqual( expected, - utils.getClickIdAndSearchStringFromLink("/c/123abc?key1=val1"), + utils.getClickIdAndSearchStringFromLink('/c/123abc?key1=val1'), 'should be equal' ); }); it('If {} is passed in, "" should be returned"', function() { - var expected = ""; + const expected = ''; assert.strictEqual( expected, - utils.getClickIdAndSearchStringFromLink(""), + utils.getClickIdAndSearchStringFromLink(''), 'should be equal' ); }); it('If "" is passed in, "" should be returned"', function() { - var expected = ""; + const expected = ''; assert.strictEqual( expected, - utils.getClickIdAndSearchStringFromLink(""), + utils.getClickIdAndSearchStringFromLink(''), 'should be equal' ); }); it('If undefined is passed in, "" should be returned"', function() { - var expected = ""; + const expected = ''; assert.strictEqual( expected, utils.getClickIdAndSearchStringFromLink(undefined), @@ -572,7 +572,7 @@ describe('utils', function() { ); }); it('If null is passed in, "" should be returned"', function() { - var expected = ""; + const expected = ''; assert.strictEqual( expected, utils.getClickIdAndSearchStringFromLink(null), @@ -580,148 +580,147 @@ describe('utils', function() { ); }); it('If "http://example.com:3000?test=test" is passed in, ?test=test should be returned"', function() { - var expected = "?test=test"; + const expected = '?test=test'; assert.strictEqual( expected, - utils.getClickIdAndSearchStringFromLink("http://example.com:3000?test=test"), + utils.getClickIdAndSearchStringFromLink('http://example.com:3000?test=test'), 'should be equal' ); }); it('If "http://example.com:3000/?test=test" is passed in, ?test=test should be returned"', function() { - var expected = "?test=test"; + const expected = '?test=test'; assert.strictEqual( expected, - utils.getClickIdAndSearchStringFromLink("http://example.com:3000/?test=test"), + utils.getClickIdAndSearchStringFromLink('http://example.com:3000/?test=test'), 'should be equal' ); }); it('If "http://example.com:3000/c/clickid?search=test#hash" is passed in, clickid?search=test should be returned"', function() { - var expected = "clickid?search=test"; + const expected = 'clickid?search=test'; assert.strictEqual( expected, - utils.getClickIdAndSearchStringFromLink("http://example.com:3000/c/clickid?search=test#hash"), + utils.getClickIdAndSearchStringFromLink('http://example.com:3000/c/clickid?search=test#hash'), 'should be equal' ); }); it('If "http://example.com:3000/c/clickid/?search=test#hash" is passed in, clickid?search=test should be returned"', function() { - var expected = "clickid?search=test"; + const expected = 'clickid?search=test'; assert.strictEqual( expected, - utils.getClickIdAndSearchStringFromLink("http://example.com:3000/c/clickid/?search=test#hash"), + utils.getClickIdAndSearchStringFromLink('http://example.com:3000/c/clickid/?search=test#hash'), 'should be equal' ); }); }); describe('convertObjectValuesToString', function() { it('a simple object\'s values should be stringified', function() { - var initial = { + const initial = { key1: 1, key2: 2 }; - var expected = { - key1: "1", - key2: "2" + const expected = { + key1: '1', + key2: '2' }; assert.deepEqual( expected, utils.convertObjectValuesToString(initial), - "objects values are not strings" + 'objects values are not strings' ); }); it('a complex object\'s values should be stringified', function() { - var initial = { - "revenue": 123, - "currency": "USD", - "custom_key_0": { "sku": "foo-sku-7", "price": 8.50, "quantity": 4 }, - "custom_key_1": [ - { "sku": "foo-sku-7", "price": 8.50, "quantity": 4 }, + const initial = { + 'revenue': 123, + 'currency': 'USD', + 'custom_key_0': {'sku': 'foo-sku-7', 'price': 8.50, 'quantity': 4}, + 'custom_key_1': [ + {'sku': 'foo-sku-7', 'price': 8.50, 'quantity': 4}, 'testing' ] }; - var expected = { - "revenue":"123", - "currency":"USD", - "custom_key_0":"{\"sku\":\"foo-sku-7\",\"price\":8.5,\"quantity\":4}", - "custom_key_1": "[{\"sku\":\"foo-sku-7\",\"price\":8.5,\"quantity\":4},\"testing\"]" + const expected = { + 'revenue': '123', + 'currency': 'USD', + 'custom_key_0': '{"sku":"foo-sku-7","price":8.5,"quantity":4}', + 'custom_key_1': '[{"sku":"foo-sku-7","price":8.5,"quantity":4},"testing"]' }; assert.deepEqual( expected, utils.convertObjectValuesToString(initial), - "objects values are not strings" + 'objects values are not strings' ); }); it('should return empty object', function() { - var initial = {}; + const initial = {}; assert.deepEqual( {}, utils.convertObjectValuesToString(initial), - "should return empty object" + 'should return empty object' ); }); }); describe('convertValueToString', function() { it('should stringify a number', function() { - var initial = 0; - var expected = "0"; + const initial = 0; + const expected = '0'; assert.strictEqual( expected, utils.convertValueToString(initial), - "0 should be converted to \"0\"" + '0 should be converted to "0"' ); }); it('should stringify a boolean', function() { - var initial = true; - var expected = "true"; + const initial = true; + const expected = 'true'; assert.strictEqual( expected, utils.convertValueToString(initial), - "true should be converted to \"true\"" + 'true should be converted to "true"' ); }); it('should stringify null', function() { - var initial = null; - var expected = "null"; + const initial = null; + const expected = 'null'; assert.strictEqual( expected, utils.convertValueToString(initial), - "null should be converted to \"null\"" + 'null should be converted to "null"' ); }); it('should stringify an object', function() { - var initial = { "sku": "foo-sku-7", "price": 8.50, "quantity": 4 }; - var expected = "{\"sku\":\"foo-sku-7\",\"price\":8.5,\"quantity\":4}"; + const initial = {'sku': 'foo-sku-7', 'price': 8.50, 'quantity': 4}; + const expected = '{"sku":"foo-sku-7","price":8.5,"quantity":4}'; assert.strictEqual( expected, utils.convertValueToString(initial), - "object should be stringified" + 'object should be stringified' ); }); it('should stringify an array', function() { - var initial = [ - { "sku": "foo-sku-7", "price": 8.50, "quantity": 4 }, + const initial = [ + {'sku': 'foo-sku-7', 'price': 8.50, 'quantity': 4}, 'testing' ]; - var expected = "[{\"sku\":\"foo-sku-7\",\"price\":8.5,\"quantity\":4},\"testing\"]"; + const expected = '[{"sku":"foo-sku-7","price":8.5,"quantity":4},"testing"]'; assert.strictEqual( expected, utils.convertValueToString(initial), - "array should be stringified" + 'array should be stringified' ); }); }); - describe('isSafari11OrGreater', function() { - var originalUa = navigator.userAgent; + const originalUa = navigator.userAgent; function setUserAgent(ua) { - navigator.__defineGetter__("userAgent", function() { + navigator.__defineGetter__('userAgent', function() { return ua; }); } @@ -730,7 +729,7 @@ describe('utils', function() { setUserAgent(originalUa); }); - var popularBrowsers = [ + const popularBrowsers = [ 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.85 Safari/537.36', 'Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)', 'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36', @@ -774,7 +773,7 @@ describe('utils', function() { ]; it('should return false for non safari browsers', function() { - var isSafari11 = false; + let isSafari11 = false; popularBrowsers.forEach(function(ua) { setUserAgent(ua); if (navigator.userAgent === ua && utils.isSafari11OrGreater()) { @@ -785,7 +784,7 @@ describe('utils', function() { assert.strictEqual(isSafari11, false, 'should return false for all browsers'); }); - var safari11 = [ + const safari11 = [ 'Mozilla/5.0 (iPod touch; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.28 (KHTML, like Gecko) Version/11.0 Mobile/15A5318g Safari/604.1', 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.31 (KHTML, like Gecko) Version/11.0 Mobile/15A5327g Safari/604.1', 'Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.28 (KHTML, like Gecko) Version/11.0 Mobile/15A5318g Safari/604.1', @@ -799,7 +798,7 @@ describe('utils', function() { ]; it('should return true for safari 11 browsers', function() { - var isSafari11 = true; + let isSafari11 = true; safari11.forEach(function(ua) { setUserAgent(ua); if (navigator.userAgent === ua && !utils.isSafari11OrGreater()) { @@ -811,32 +810,31 @@ describe('utils', function() { }); }); describe('separateEventAndCustomData ', function() { - it('extracted custom and event data should equal initial objects', function() { - var event_data = { - "transaction_id": "1AB23456C7890123D", - "revenue": 6.00, - "currency": "USD", - "shipping": 3.00, - "tax": 3.00, - "coupon": "8891701", - "affiliation": "xyz_affiliation", - "search_query": "boat shoes sperrys", - "description": "Sperry Authentic Original" + const event_data = { + 'transaction_id': '1AB23456C7890123D', + 'revenue': 6.00, + 'currency': 'USD', + 'shipping': 3.00, + 'tax': 3.00, + 'coupon': '8891701', + 'affiliation': 'xyz_affiliation', + 'search_query': 'boat shoes sperrys', + 'description': 'Sperry Authentic Original' }; - var custom_data = { - "custom_key_1": "custom_val_1", - "custom_key_2": "custom_val_2", - "custom_key_3": "custom_val_3" + const custom_data = { + 'custom_key_1': 'custom_val_1', + 'custom_key_2': 'custom_val_2', + 'custom_key_3': 'custom_val_3' }; - var event_and_custom_data = {}; + const event_and_custom_data = {}; utils.merge(event_and_custom_data, event_data); utils.merge(event_and_custom_data, custom_data); - var extractedEventAndCustomData = utils.separateEventAndCustomData(event_and_custom_data); + const extractedEventAndCustomData = utils.separateEventAndCustomData(event_and_custom_data); assert.deepEqual( event_data, extractedEventAndCustomData['event_data'], @@ -850,8 +848,8 @@ describe('utils', function() { }); it('utils.isStandardEvent() should return true for standard events and false for custom events', function() { - var standardEvent = 'ADD_TO_WISHLIST'; - var customEvent = 'ADD_TO_WISHLISTT'; + const standardEvent = 'ADD_TO_WISHLIST'; + const customEvent = 'ADD_TO_WISHLISTT'; assert.strictEqual(true, utils.isStandardEvent(standardEvent), @@ -862,12 +860,12 @@ describe('utils', function() { }); it('should return true or false for a given parameter and type', function() { - var parameter1 = {}; - var parameter2 = []; - var parameter3 = "test"; - var type1 = "object"; - var type2 = "array"; - var type3 = "string"; + const parameter1 = {}; + const parameter2 = []; + const parameter3 = 'test'; + const type1 = 'object'; + const type2 = 'array'; + const type3 = 'string'; assert.strictEqual(false, utils.validateParameterType(null, type1), 'should return false'); @@ -904,19 +902,18 @@ describe('utils', function() { assert.strictEqual(true, utils.validateParameterType(parameter3, type3), 'should return true'); - }); }); describe('mergeMetadataFromInitToHostedMetadata', function() { it.skip('override previous hosted_deeplink_data keys via user-supplied metadata object', function() { - var additionalMetadata = {}; + const additionalMetadata = {}; additionalMetadata['hosted_deeplink_data'] = utils.getHostedDeepLinkData(); - var userSuppliedMetadata = { watch_brand: 'Seiko', + const userSuppliedMetadata = {watch_brand: 'Seiko', type: 'Presage' }; - var response = utils.mergeHostedDeeplinkData(additionalMetadata['hosted_deeplink_data'], userSuppliedMetadata); - var expected = { + const response = utils.mergeHostedDeeplinkData(additionalMetadata['hosted_deeplink_data'], userSuppliedMetadata); + const expected = { watch_brand: 'Seiko', type: 'Presage', $ios_deeplink_path: 'applinks/hamilton/khaki/ios', @@ -930,11 +927,11 @@ describe('utils', function() { }); it.skip('merge hosted_deeplink_data and user-supplied metadata', function() { - var additionalMetadata = {}; + const additionalMetadata = {}; additionalMetadata['hosted_deeplink_data'] = utils.getHostedDeepLinkData(); - var userSuppliedMetadata = { productA: '12345' }; - var response = utils.mergeHostedDeeplinkData(additionalMetadata['hosted_deeplink_data'], userSuppliedMetadata); - var expected = { + const userSuppliedMetadata = {productA: '12345'}; + const response = utils.mergeHostedDeeplinkData(additionalMetadata['hosted_deeplink_data'], userSuppliedMetadata); + const expected = { watch_brand: 'Hamilton', type: 'Khaki Aviation Stainless Steel Automatic Leather-Strap Watch', $ios_deeplink_path: 'applinks/hamilton/khaki/ios', @@ -949,10 +946,10 @@ describe('utils', function() { }); it('tests with metadata and without hosted_deeplink_data', function() { - var additionalMetadata = {}; - var userSuppliedMetadata = { productA: '12345' }; - var response = utils.mergeHostedDeeplinkData(additionalMetadata['hosted_deeplink_data'], userSuppliedMetadata); - var expected = { productA: '12345' }; + const additionalMetadata = {}; + const userSuppliedMetadata = {productA: '12345'}; + const response = utils.mergeHostedDeeplinkData(additionalMetadata['hosted_deeplink_data'], userSuppliedMetadata); + const expected = {productA: '12345'}; assert.deepEqual( expected, response, @@ -961,11 +958,11 @@ describe('utils', function() { }); it('ensure that additionalMetadata[\'hosted_deeplink_data\'] does not get mutated', function() { - var additionalData = { 'root_key': '1234' }; - additionalData['hosted_deeplink_data'] = { productA: '12345' }; - var userSuppliedMetadata = { productB: '12345' }; + const additionalData = {'root_key': '1234'}; + additionalData['hosted_deeplink_data'] = {productA: '12345'}; + const userSuppliedMetadata = {productB: '12345'}; utils.mergeHostedDeeplinkData(additionalData['hosted_deeplink_data'], userSuppliedMetadata); - var expected = { 'root_key': '1234', 'hosted_deeplink_data': { productA: '12345' } }; + const expected = {'root_key': '1234', 'hosted_deeplink_data': {productA: '12345'}}; assert.deepEqual( expected, additionalData, @@ -974,11 +971,11 @@ describe('utils', function() { }); it('ensure that userSuppliedMetadata does not get mutated', function() { - var additionalData = {}; - additionalData['hosted_deeplink_data'] = { productA: '12345' }; - var userSuppliedMetadata = { productB: '12345' }; + const additionalData = {}; + additionalData['hosted_deeplink_data'] = {productA: '12345'}; + const userSuppliedMetadata = {productB: '12345'}; utils.mergeHostedDeeplinkData(additionalData['hosted_deeplink_data'], userSuppliedMetadata); - var expected = { productB: '12345' }; + const expected = {productB: '12345'}; assert.deepEqual( expected, userSuppliedMetadata, @@ -994,10 +991,10 @@ describe('utils', function() { assert.strictEqual(true, utils.userPreferences.shouldBlockRequest('https://api2.branch.io/v1/open')); }); it('should return false with v1/open as url endpoint and valid request data provided', function() { - assert.strictEqual(false, utils.userPreferences.shouldBlockRequest('https://api2.branch.io/v1/open', { link_identifier: '111111111111' })); + assert.strictEqual(false, utils.userPreferences.shouldBlockRequest('https://api2.branch.io/v1/open', {link_identifier: '111111111111'})); }); it('should return true with v1/xyz as url endpoint and with bogus request data', function() { - assert.strictEqual(true, utils.userPreferences.shouldBlockRequest('https://api2.branch.io/v1/xyz', { link_identifier: '111111111111' })); + assert.strictEqual(true, utils.userPreferences.shouldBlockRequest('https://api2.branch.io/v1/xyz', {link_identifier: '111111111111'})); }); it('should allow raw links', function() { assert.strictEqual(false, utils.userPreferences.shouldBlockRequest('https://bnctestbed.app.link/abcdefg')); @@ -1006,7 +1003,7 @@ describe('utils', function() { describe('delay function', function() { it('calls synchronously for a non-numeric delay argument', function() { - var executed = false; + let executed = false; utils.delay(function() { executed = true; }, NaN); @@ -1015,7 +1012,7 @@ describe('utils', function() { }); it('calls synchronously for a zero delay argument', function() { - var executed = false; + let executed = false; utils.delay(function() { executed = true; }, 0); @@ -1024,7 +1021,7 @@ describe('utils', function() { }); it('calls synchronously for a negative delay argument', function() { - var executed = false; + let executed = false; utils.delay(function() { executed = true; }, -25); @@ -1033,8 +1030,8 @@ describe('utils', function() { }); it('delays for any positive numeric argument', function(done) { - var executed = false; - var clock = sinon.useFakeTimers(); + let executed = false; + const clock = sinon.useFakeTimers(); utils.delay(function() { executed = true; done(); @@ -1047,7 +1044,7 @@ describe('utils', function() { }); describe('isWebKitBrowser function', function() { - var originalWebKitURL = window.webkitURL; + const originalWebKitURL = window.webkitURL; it('returns true when window.webkitURL is defined', function() { // pretend to be webkit @@ -1074,9 +1071,9 @@ describe('utils', function() { }); describe('isIOSWKWebView function', function() { - var originalUa = navigator.userAgent; - var originalWebKitURL = window.webkitURL; - var iOSBrowsers = { + const originalUa = navigator.userAgent; + const originalWebKitURL = window.webkitURL; + const iOSBrowsers = { safari: 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Mobile/15E148 Safari/604.1', chrome: 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/84.0.4147.71 Mobile/15E148 Safari/604.1', firefox: 'Mozilla/5.0 (iPhone; CPU OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/28.0 Mobile/15E148 Safari/605.1.15', @@ -1088,7 +1085,7 @@ describe('utils', function() { }; function setUserAgent(ua) { - navigator.__defineGetter__("userAgent", function() { + navigator.__defineGetter__('userAgent', function() { return ua; }); } @@ -1177,57 +1174,57 @@ describe('utils', function() { describe('addPropertyIfNotNullorEmpty', function() { it('should not add property if value is empty', function() { - var obj = { "prop1": "value1" }; - var expectedObj = { - "prop1": "value1" + const obj = {'prop1': 'value1'}; + const expectedObj = { + 'prop1': 'value1' }; - assert.deepEqual(utils.addPropertyIfNotNullorEmpty(obj, "prop2", ""), expectedObj, 'Correctly added property to object'); + assert.deepEqual(utils.addPropertyIfNotNullorEmpty(obj, 'prop2', ''), expectedObj, 'Correctly added property to object'); }); it('should not add property if value is null', function() { - var obj = { "prop1": "value1" }; - var expectedObj = { - "prop1": "value1" + const obj = {'prop1': 'value1'}; + const expectedObj = { + 'prop1': 'value1' }; - assert.deepEqual(utils.addPropertyIfNotNullorEmpty(obj, "prop2", null), expectedObj, 'Correctly added property to object'); + assert.deepEqual(utils.addPropertyIfNotNullorEmpty(obj, 'prop2', null), expectedObj, 'Correctly added property to object'); }); it('should add property if value is not empty', function() { - var obj = { "prop1": "value1" }; - var expectedObj = { - "prop1": "value1", - "prop2": "value2" + const obj = {'prop1': 'value1'}; + const expectedObj = { + 'prop1': 'value1', + 'prop2': 'value2' }; - assert.deepEqual(utils.addPropertyIfNotNullorEmpty(obj, "prop2", "value2"), expectedObj, 'Correctly added property to object'); + assert.deepEqual(utils.addPropertyIfNotNullorEmpty(obj, 'prop2', 'value2'), expectedObj, 'Correctly added property to object'); }); }); describe('removeTrailingDotZeros', function() { it('should return empty if value is empty', function() { - var versionNumber = ""; + const versionNumber = ''; assert.deepEqual(utils.removeTrailingDotZeros(versionNumber), versionNumber, 'Correctly matched empty'); }); it('should return null if value is null', function() { - var versionNumber = null; + const versionNumber = null; assert.deepEqual(utils.removeTrailingDotZeros(versionNumber), versionNumber, 'Correctly matched null'); }); it('no dot- should not strip trailing dot zero', function() { - var versionNumber = "10"; + const versionNumber = '10'; assert.deepEqual(utils.removeTrailingDotZeros(versionNumber), versionNumber, 'Correctly strip trailing zeros'); }); it('with dot and no zeros- should not strip trailing dot zero', function() { - var versionNumber = "10.10"; + const versionNumber = '10.10'; assert.deepEqual(utils.removeTrailingDotZeros(versionNumber), versionNumber, 'Correctly strip trailing zeros'); }); it('single dot- should not strip trailing dot zero', function() { - var versionNumber = "10.0"; + const versionNumber = '10.0'; assert.deepEqual(utils.removeTrailingDotZeros(versionNumber), versionNumber, 'Correctly strip trailing zeros'); }); it('multi-dot : should return string with trailing dot zeros stripped', function() { - var versionNumber = "10.0.0"; - var expected = "10"; + const versionNumber = '10.0.0'; + const expected = '10'; assert.deepEqual(utils.removeTrailingDotZeros(versionNumber), expected, 'Correctly strip trailing zeros'); }); it('should not strip trailing dot zero', function() { - var versionNumber = "10.0.1"; + const versionNumber = '10.0.1'; assert.deepEqual(utils.removeTrailingDotZeros(versionNumber), versionNumber, 'Correctly strip trailing zeros'); }); }); diff --git a/test/2_storage.js b/test/2_storage.js index 5808d0f71..6439db0bb 100644 --- a/test/2_storage.js +++ b/test/2_storage.js @@ -2,14 +2,14 @@ goog.require('storage'); // jshint ignore:line -var BRANCH_KEY_PREFIX = 'BRANCH_WEBSDK_KEY'; -var ITEM_KEY = 'key'; -var ITEM_KEY_UNSTORED = 'key unstored'; -var ITEM_VALUE = 'value'; +const BRANCH_KEY_PREFIX = 'BRANCH_WEBSDK_KEY'; +const ITEM_KEY = 'key'; +const ITEM_KEY_UNSTORED = 'key unstored'; +const ITEM_VALUE = 'value'; describe('session storage', function() { - var storage = new BranchStorage([ 'session' ]); // jshint ignore:line - var assert = testUtils.unplanned(); + const storage = new BranchStorage([ 'session' ]); // jshint ignore:line + const assert = testUtils.unplanned(); beforeEach(function() { storage.clear(); }); @@ -25,19 +25,19 @@ describe('session storage', function() { it('should get stored item with key', function() { storage.set(ITEM_KEY, ITEM_VALUE); - var item = storage.get(ITEM_KEY); + const item = storage.get(ITEM_KEY); assert.strictEqual(item, ITEM_VALUE, 'correct value with key'); }); it('should return null for an unstored item', function() { - var item = storage.get(ITEM_KEY_UNSTORED); + const item = storage.get(ITEM_KEY_UNSTORED); assert.strictEqual(item, null, 'returned null'); }); it('should remove an item', function() { storage.set(ITEM_KEY, ITEM_VALUE, 'session'); storage.remove(ITEM_KEY); - var item = storage.get(ITEM_KEY); + const item = storage.get(ITEM_KEY); assert.strictEqual(item, null, 'returned null'); }); @@ -49,8 +49,8 @@ describe('session storage', function() { }); describe('local storage', function() { - var storage = new BranchStorage([ 'local' ]); // jshint ignore:line - var assert = testUtils.unplanned(); + const storage = new BranchStorage([ 'local' ]); // jshint ignore:line + const assert = testUtils.unplanned(); beforeEach(function() { storage.clear(); }); @@ -66,19 +66,19 @@ describe('local storage', function() { it('should get stored item with key', function() { storage.set(ITEM_KEY, ITEM_VALUE); - var item = storage.get(ITEM_KEY); + const item = storage.get(ITEM_KEY); assert.strictEqual(item, ITEM_VALUE, 'correct value with key'); }); it('should return null for an unstored item', function() { - var item = storage.get(ITEM_KEY_UNSTORED); + const item = storage.get(ITEM_KEY_UNSTORED); assert.strictEqual(item, null, 'returned null'); }); it('should remove an item', function() { storage.set(ITEM_KEY, ITEM_VALUE, 'session'); storage.remove(ITEM_KEY); - var item = storage.get(ITEM_KEY); + const item = storage.get(ITEM_KEY); assert.strictEqual(item, null, 'returned null'); }); @@ -90,55 +90,55 @@ describe('local storage', function() { }); describe('cookie storage', function() { - var storage = new BranchStorage([ 'cookie' ]); // jshint ignore:line - var ITEM_KEY = 'branch_session'; - var ITEM_VALUE = 'test_val'; - var assert = testUtils.unplanned(); + const storage = new BranchStorage([ 'cookie' ]); // jshint ignore:line + const ITEM_KEY = 'branch_session'; + const ITEM_VALUE = 'test_val'; + const assert = testUtils.unplanned(); // sets non-Branch cookies - document.cookie = "non_branch_cookie_1=abc"; - document.cookie = "non_branch_cookie_2=def"; - document.cookie = "non_branch_cookie_3=ghi"; + document.cookie = 'non_branch_cookie_1=abc'; + document.cookie = 'non_branch_cookie_2=def'; + document.cookie = 'non_branch_cookie_3=ghi'; it('should get stored item with key', function() { storage.set(ITEM_KEY, ITEM_VALUE); - var item = storage.get(ITEM_KEY); + const item = storage.get(ITEM_KEY); assert.strictEqual(item, ITEM_VALUE, 'Cookie not stored. [This may not work in some browsers with a file: URL, e.g. Chrome.]'); }); it('should return null for an un-stored item', function() { - var item = storage.get('not_an_item'); + const item = storage.get('not_an_item'); assert.strictEqual(item, null, 'returned null'); }); it('should remove a Branch cookie', function() { storage.remove(ITEM_KEY); - var item = storage.get(ITEM_KEY); + const item = storage.get(ITEM_KEY); assert.strictEqual(item, null, 'returned null'); }); it('should remove a Branch cookie that is not branch_session or branch_session_first', function() { - var cookieName = "test_1"; - var cookieValue = "123"; + const cookieName = 'test_1'; + const cookieValue = '123'; storage.set(cookieName, cookieValue); storage.remove(cookieName); - var item = storage.get(cookieName); + const item = storage.get(cookieName); assert.strictEqual(item, null, ' returned null'); }); it('should clear all Branch cookies', function() { - var testCookies = { - "key_1": "val_1", - "branch_session": "val_2", - "branch_session_first": "val_3" + const testCookies = { + 'key_1': 'val_1', + 'branch_session': 'val_2', + 'branch_session_first': 'val_3' }; - for (var key in testCookies) { + for (const key in testCookies) { if (testCookies.hasOwnProperty(key)) { storage.set(key, testCookies[key]); } } storage.clear(); - var item = null; + let item = null; for (key in testCookies) { if (testCookies.hasOwnProperty(key)) { item = storage.get(testCookies[key]); @@ -148,27 +148,27 @@ describe('cookie storage', function() { }); it('should return all Branch cookies', function() { - var expected = { - "key_1": "val_1", - "branch_session": "val_2", - "branch_session_first": "val_3" + const expected = { + 'key_1': 'val_1', + 'branch_session': 'val_2', + 'branch_session_first': 'val_3' }; - for (var key in expected) { + for (const key in expected) { if (expected.hasOwnProperty(key)) { storage.set(key, expected[key]); } } - var actual = storage.getAll(); + const actual = storage.getAll(); assert.strictEqual(Object.keys(expected).length, Object.keys(actual).length, 'Cookie not stored. [This may not work in some browsers with a file: URL, e.g. Chrome.]'); for (key in actual) { if (actual.hasOwnProperty(key)) { assert.strictEqual(actual[key], expected[key], ' correct value for key'); } } - var nonBranchCookies = { - 'non_branch_cookie_1':'abc', - 'non_branch_cookie_2':'def', - 'non_branch_cookie_3':'ghi' + const nonBranchCookies = { + 'non_branch_cookie_1': 'abc', + 'non_branch_cookie_2': 'def', + 'non_branch_cookie_3': 'ghi' }; for (key in nonBranchCookies) { // check whether original Branch cookies are returned if (nonBranchCookies.hasOwnProperty(key)) { @@ -179,20 +179,20 @@ describe('cookie storage', function() { it('non-Branch cookies should remain after clearing storage', function() { storage.clear(); - var expected = { - 'non_branch_cookie_1':'abc', - 'non_branch_cookie_2':'def', - 'non_branch_cookie_3':'ghi' + const expected = { + 'non_branch_cookie_1': 'abc', + 'non_branch_cookie_2': 'def', + 'non_branch_cookie_3': 'ghi' }; - var cookiesArray = document.cookie.split(';'); - var cookiesFound = 0; - for (var i = 0; i < cookiesArray.length; i++) { - var cookie = cookiesArray[i].trim(); - var firstEqualSign = cookie.indexOf("="); - var cookieName = cookie.substring(0, firstEqualSign); - var cookieValue = cookie.substring(firstEqualSign + 1, cookie.length); + const cookiesArray = document.cookie.split(';'); + let cookiesFound = 0; + for (let i = 0; i < cookiesArray.length; i++) { + const cookie = cookiesArray[i].trim(); + const firstEqualSign = cookie.indexOf('='); + const cookieName = cookie.substring(0, firstEqualSign); + const cookieValue = cookie.substring(firstEqualSign + 1, cookie.length); if (expected.hasOwnProperty(cookieName) && expected[cookieName] === cookieValue) { - cookiesFound +=1; + cookiesFound += 1; } } assert.strictEqual(3, cookiesFound, 'Cookie not stored. [This may not work in some browsers with a file: URL, e.g. Chrome.]'); @@ -200,8 +200,8 @@ describe('cookie storage', function() { }); describe('pojo storage', function() { - var storage = new BranchStorage([ 'pojo' ]); // jshint ignore:line - var assert = testUtils.unplanned(); + const storage = new BranchStorage([ 'pojo' ]); // jshint ignore:line + const assert = testUtils.unplanned(); beforeEach(function() { storage.clear(); }); @@ -213,20 +213,20 @@ describe('pojo storage', function() { it('should get stored item with key', function() { storage.set(ITEM_KEY, ITEM_VALUE); - var item = storage.get(ITEM_KEY); + const item = storage.get(ITEM_KEY); assert.strictEqual(item, ITEM_VALUE, 'correct value with key'); }); it('should return null for an unstored item', function() { storage.set(ITEM_KEY, ITEM_VALUE); - var item = storage.get(ITEM_KEY_UNSTORED); + const item = storage.get(ITEM_KEY_UNSTORED); assert.strictEqual(item, null, 'returned null'); }); it('should remove an item', function() { storage.set(ITEM_KEY, ITEM_VALUE, 'session'); storage.remove(ITEM_KEY); - var item = storage.get(ITEM_KEY); + const item = storage.get(ITEM_KEY); assert.strictEqual(item, null, 'returned null'); }); diff --git a/test/3_api.js b/test/3_api.js index f86aa3637..306914649 100644 --- a/test/3_api.js +++ b/test/3_api.js @@ -7,11 +7,11 @@ goog.require('storage'); // jshint unused:false goog.require('config'); goog.require('safejson'); -/*globals branch_sample_key, session_id, identity_id, browser_fingerprint_id, BranchStorage */ +/* globals branch_sample_key, session_id, identity_id, browser_fingerprint_id, BranchStorage */ describe('Server helpers', function() { - var server = new Server(); - var assert = testUtils.unplanned(); + const server = new Server(); + const assert = testUtils.unplanned(); it('serializeObject should work', function() { // Test simple objects @@ -110,18 +110,18 @@ describe('Server helpers', function() { }); describe('Server', function() { - var server = new Server(); - var storage = new BranchStorage([ 'session', 'pojo' ]); - var xhr; - var requests; - var clock; + const server = new Server(); + const storage = new BranchStorage([ 'session', 'pojo' ]); + let xhr; + let requests; + let clock; beforeEach(function() { storage.clear(); xhr = sinon.useFakeXMLHttpRequest(); clock = sinon.useFakeTimers(); server.createScript = function() {}; - sinon.stub(server, "createScript", function(src) { - requests.push({ src: src, callback: window[src.match(/callback=([^&]+)/)[1]] }); + sinon.stub(server, 'createScript', function(src) { + requests.push({src: src, callback: window[src.match(/callback=([^&]+)/)[1]]}); }); requests = []; @@ -151,7 +151,7 @@ describe('Server', function() { it('should pass in branch_key and browser_fingerprint_id', function(done) { storage['set']('use_jsonp', false); - var assert = testUtils.plan(5, done); + const assert = testUtils.plan(5, done); server.request( resources.open, testUtils.params({ }), @@ -167,15 +167,15 @@ describe('Server', function() { assert.strictEqual(requests[0].method, 'POST', 'Method correct'); assert.strictEqual( requests[0].requestBody, - "browser_fingerprint_id=" + browser_fingerprint_id + - "&identity_id=" + identity_id + - "&sdk=web" + config.version + - "&branch_key=" + branch_sample_key + - "&options=%7B%7D", + 'browser_fingerprint_id=' + browser_fingerprint_id + + '&identity_id=' + identity_id + + '&sdk=web' + config.version + + '&branch_key=' + branch_sample_key + + '&options=%7B%7D', 'Data correct'); requests[0].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, '{ "session_id": 123 }' ); }); @@ -183,13 +183,13 @@ describe('Server', function() { it('should pass as a jsonp request', function(done) { storage['set']('use_jsonp', true); - var assert = testUtils.plan(3, done); + const assert = testUtils.plan(3, done); - var completeParams = testUtils.params({ }); + const completeParams = testUtils.params({ }); server.request(resources.open, completeParams, storage, assert.done); assert.strictEqual(requests.length, 1, 'Request made'); - var encodedData = encodeURIComponent( + const encodedData = encodeURIComponent( utils.base64encode(goog.json.serialize(completeParams)) ); assert.strictEqual( @@ -203,7 +203,7 @@ describe('Server', function() { }); it('should fail without branch_key', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.open, testUtils.params({ }, [ 'branch_key' ]), @@ -212,7 +212,7 @@ describe('Server', function() { err = safejson.parse(err.message); assert.strictEqual( err.message, - "API request /v1/open missing parameter branch_key or app_id" + 'API request /v1/open missing parameter branch_key or app_id' ); } ); @@ -221,11 +221,11 @@ describe('Server', function() { it('should pass without branch_key but with app_id', function(done) { storage['set']('use_jsonp', false); - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.open, testUtils.params( - { "app_id": "5680621892404085" }, + {'app_id': '5680621892404085'}, [ 'branch_key' ] ), storage, @@ -234,26 +234,26 @@ describe('Server', function() { assert.strictEqual(requests.length, 1, 'Request made'); assert.strictEqual( requests[0].requestBody, - "browser_fingerprint_id=" + browser_fingerprint_id + - "&identity_id=" + identity_id + - "&sdk=web" + config.version + - "&app_id=" + "5680621892404085" + - "&options=%7B%7D", + 'browser_fingerprint_id=' + browser_fingerprint_id + + '&identity_id=' + identity_id + + '&sdk=web' + config.version + + '&app_id=' + '5680621892404085' + + '&options=%7B%7D', 'Data correct'); }); // param format and type tests it('should fail with incorrect branch_key format', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.open, - testUtils.params({ "branch_key": "ahd&7393j" }), + testUtils.params({'branch_key': 'ahd&7393j'}), storage, function(err) { err = safejson.parse(err.message); assert.strictEqual( err.message, - "API request /v1/open missing parameter branch_key or app_id" + 'API request /v1/open missing parameter branch_key or app_id' ); } ); @@ -261,43 +261,42 @@ describe('Server', function() { }); it('should fail with link_identifier as number, not string', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.open, - testUtils.params({ "link_identifier": 45433 }), + testUtils.params({'link_identifier': 45433}), storage, function(err) { err = safejson.parse(err.message); assert.strictEqual( err.message, - "API request /v1/open, parameter link_identifier is not a string" + 'API request /v1/open, parameter link_identifier is not a string' ); } ); assert.strictEqual(requests.length, 0, 'No request made'); }); - it ('should not include developer identity', function(done) { - var assert = testUtils.plan(1, done); + it('should not include developer identity', function(done) { + const assert = testUtils.plan(1, done); storage.set('use_jsonp', false); /* * Branch instance will pass identity, if set, but resources will filter it out. */ server.request( resources.open, - testUtils.params({ identity: '12345678' }), + testUtils.params({identity: '12345678'}), storage, assert.done ); - var request = requests[0]; + const request = requests[0]; assert.ok(!request.requestBody.includes('identity='), 'Does not include identity'); requests[0].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, '{ "session_id": 123 }' ); }); - }); describe('/v1/profile', function() { @@ -308,10 +307,10 @@ describe('Server', function() { it('should pass in branch_key and identity', function(done) { storage['set']('use_jsonp', false); - var assert = testUtils.plan(5, done); + const assert = testUtils.plan(5, done); server.request( resources.profile, - testUtils.params({ "identity": "test_id" }), + testUtils.params({'identity': 'test_id'}), storage, assert.done ); @@ -324,31 +323,31 @@ describe('Server', function() { assert.strictEqual(requests[0].method, 'POST', 'Method correct'); assert.strictEqual( requests[0].requestBody, - "identity_id=" + identity_id + - "&identity=test_id" + - "&browser_fingerprint_id=" + browser_fingerprint_id + - "&sdk=web" + config.version + - "&session_id=" + session_id + - "&branch_key=" + branch_sample_key, + 'identity_id=' + identity_id + + '&identity=test_id' + + '&browser_fingerprint_id=' + browser_fingerprint_id + + '&sdk=web' + config.version + + '&session_id=' + session_id + + '&branch_key=' + branch_sample_key, 'Params correct' ); requests[0].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, '{ "session_id": 123 }' ); }); it('should pass as a jsonp request', function(done) { - var assert = testUtils.plan(3, done); + const assert = testUtils.plan(3, done); storage['set']('use_jsonp', true); - var completeParams = testUtils.params({ "identity": "test_id" }); + const completeParams = testUtils.params({'identity': 'test_id'}); server.request(resources.profile, completeParams, storage, assert.done); assert.strictEqual(requests.length, 1, 'Request made'); - var encodedData = encodeURIComponent( + const encodedData = encodeURIComponent( utils.base64encode(goog.json.serialize(completeParams)) ); assert.strictEqual( @@ -362,12 +361,12 @@ describe('Server', function() { }); it('should fail without identity', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request(resources.profile, testUtils.params(), storage, function(err) { err = safejson.parse(err.message); assert.strictEqual( err.message, - "API request /v1/profile missing parameter identity", + 'API request /v1/profile missing parameter identity', 'Expected err.message' ); }); @@ -375,16 +374,16 @@ describe('Server', function() { }); it('should fail without branch_key', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.profile, - testUtils.params({ "identity": "test_id" }, [ 'branch_key' ]), + testUtils.params({'identity': 'test_id'}, [ 'branch_key' ]), storage, function(err) { err = safejson.parse(err.message); assert.strictEqual( err.message, - "API request /v1/profile missing parameter branch_key or app_id", + 'API request /v1/profile missing parameter branch_key or app_id', 'Expected err.message' ); } @@ -393,16 +392,16 @@ describe('Server', function() { }); it('should fail without identity_id', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.profile, - testUtils.params({ identity: 'foo' }, [ 'identity_id' ]), + testUtils.params({identity: 'foo'}, [ 'identity_id' ]), storage, function(err) { err = safejson.parse(err.message); assert.strictEqual( err.message, - "API request /v1/profile missing parameter identity_id", + 'API request /v1/profile missing parameter identity_id', 'Expected err.message' ); } @@ -418,7 +417,7 @@ describe('Server', function() { }); it('should pass in sdk', function(done) { - var assert = testUtils.plan(3, done); + const assert = testUtils.plan(3, done); server.request(resources._r, testUtils.params(), storage, assert.done); assert.strictEqual(requests.length, 1, 'Request made'); assert.strictEqual( @@ -432,14 +431,14 @@ describe('Server', function() { }); it('should fail without sdk', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources._r, testUtils.params({ }, [ 'sdk' ]), storage, function(err) { err = safejson.parse(err.message); - assert.strictEqual(err.message, "API request /_r missing parameter sdk"); + assert.strictEqual(err.message, 'API request /_r missing parameter sdk'); } ); assert.strictEqual(requests.length, 0, 'No request made'); @@ -454,7 +453,7 @@ describe('Server', function() { it('should pass in branch_key and identity_id', function(done) { storage['set']('use_jsonp', false); - var assert = testUtils.plan(5, done); + const assert = testUtils.plan(5, done); server.request(resources.link, testUtils.params(), storage, assert.done); @@ -467,26 +466,26 @@ describe('Server', function() { assert.strictEqual(requests[0].method, 'POST', 'Method correct'); assert.strictEqual( requests[0].requestBody, - "identity_id=" + identity_id + - "&browser_fingerprint_id=" + browser_fingerprint_id + - "&sdk=web" + config.version + - "&session_id=" + session_id + - "&branch_key=" + branch_sample_key + 'identity_id=' + identity_id + + '&browser_fingerprint_id=' + browser_fingerprint_id + + '&sdk=web' + config.version + + '&session_id=' + session_id + + '&branch_key=' + branch_sample_key ); requests[0].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, '{ "session_id": 123 }' ); }); it('should pass as a jsonp request', function(done) { - var assert = testUtils.plan(3, done); + const assert = testUtils.plan(3, done); storage['set']('use_jsonp', true); server.request(resources.link, testUtils.params(), storage, assert.done); assert.strictEqual(requests.length, 1, 'Request made'); - var encodedData = encodeURIComponent( + const encodedData = encodeURIComponent( utils.base64encode(goog.json.serialize(testUtils.params())) ); assert.strictEqual( @@ -499,7 +498,7 @@ describe('Server', function() { }); it('should fail without branch_key', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.link, testUtils.params({ }, [ 'branch_key' ]), @@ -508,7 +507,7 @@ describe('Server', function() { err = safejson.parse(err.message); assert.strictEqual( err.message, - "API request /v1/url missing parameter branch_key or app_id" + 'API request /v1/url missing parameter branch_key or app_id' ); } ); @@ -516,7 +515,7 @@ describe('Server', function() { }); it('should fail without identity_id', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.link, testUtils.params({ }, [ 'identity_id' ]), @@ -525,7 +524,7 @@ describe('Server', function() { err = safejson.parse(err.message); assert.strictEqual( err.message, - "API request /v1/url missing parameter identity_id" + 'API request /v1/url missing parameter identity_id' ); } ); @@ -534,16 +533,16 @@ describe('Server', function() { // param format and type tests it('should fail with tags as string, not array', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.link, - testUtils.params({ "tags": "Hello, I'm not an array." }), + testUtils.params({'tags': 'Hello, I\'m not an array.'}), storage, function(err) { err = safejson.parse(err.message); assert.strictEqual( err.message, - "API request /v1/url, parameter tags is not an array" + 'API request /v1/url, parameter tags is not an array' ); } ); @@ -559,10 +558,10 @@ describe('Server', function() { it('should pass in link_url and click', function(done) { storage['set']('use_jsonp', false); - var assert = testUtils.plan(4, done); + const assert = testUtils.plan(4, done); server.request( resources.linkClick, - testUtils.params({ "link_url": "3hpH54U-58", "click": "click" }), + testUtils.params({'link_url': '3hpH54U-58', 'click': 'click'}), storage, assert.done ); @@ -577,17 +576,17 @@ describe('Server', function() { requests[0].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, '{ "session_id": 123 }' ); }); it('should pass as a jsonp request', function(done) { - var assert = testUtils.plan(3, done); + const assert = testUtils.plan(3, done); storage['set']('use_jsonp', true); server.request( resources.linkClick, - testUtils.params({ "link_url": "3hpH54U-58", "click": "click" }), + testUtils.params({'link_url': '3hpH54U-58', 'click': 'click'}), storage, assert.done ); @@ -602,28 +601,28 @@ describe('Server', function() { }); it('should fail without link_url', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.linkClick, - testUtils.params({ "click": "click" }), + testUtils.params({'click': 'click'}), storage, function(err) { err = safejson.parse(err.message); - assert.strictEqual(err.message, "API request missing parameter link_url"); + assert.strictEqual(err.message, 'API request missing parameter link_url'); } ); assert.strictEqual(requests.length, 0, 'No request made'); }); it('should fail without click', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); server.request( resources.linkClick, - testUtils.params({ "link_url": "3hpH54U-58" }), + testUtils.params({'link_url': '3hpH54U-58'}), storage, function(err) { err = safejson.parse(err.message); - assert.strictEqual(err.message, "API request missing parameter click"); + assert.strictEqual(err.message, 'API request missing parameter click'); } ); assert.strictEqual(requests.length, 0, 'No request made'); @@ -633,14 +632,14 @@ describe('Server', function() { describe('API tests for trackingDisabled mode', function() { it('Tests a v1/open request, includes correct data, tracking disabled and error callback enabled :: request should go through', function(done) { // This simulates a call to v1/open as part of the Branch initialization process - var assert = testUtils.plan(1, done); + const assert = testUtils.plan(1, done); utils.userPreferences.trackingDisabled = true; utils.userPreferences.allowErrorsInCallback = false; localStorage.setItem('branch_session', {}); server.request( resources.open, testUtils.params({ - "link_identifier": "1111111111" + 'link_identifier': '1111111111' }), storage, assert.done ); @@ -650,7 +649,7 @@ describe('Server', function() { }); describe('onAPIResponse', function() { - var assert = testUtils.unplanned(); + const assert = testUtils.unplanned(); beforeEach(function() { requests = []; @@ -663,8 +662,8 @@ describe('Server', function() { it('receives all relevant fields from an XHR request if present', function(done) { storage['set']('use_jsonp', false); - var params = testUtils.params({ - "link_identifier": "1111111111" + const params = testUtils.params({ + 'link_identifier': '1111111111' }); server.onAPIResponse = function(url, method, requestBody, error, status, responseBody) { try { @@ -674,7 +673,7 @@ describe('Server', function() { assert.ok(requestBody.match(/link_identifier=1111111111/)); assert.strictEqual(error, null); assert.strictEqual(status, 200); - assert.deepEqual(responseBody, { 'session_id': 123 }, 'correct response'); + assert.deepEqual(responseBody, {'session_id': 123}, 'correct response'); done(); } catch (error) { @@ -691,7 +690,7 @@ describe('Server', function() { requests[0].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, '{ "session_id": 123 }' ); }); diff --git a/test/6_branch.js b/test/6_branch.js index d528c78f7..f54889641 100644 --- a/test/6_branch.js +++ b/test/6_branch.js @@ -12,12 +12,12 @@ goog.require('safejson'); goog.require('goog.json'); // jshint unused:false -/*globals branch_sample_key, session_id, identity_id, browser_fingerprint_id, BranchStorage */ +/* globals branch_sample_key, session_id, identity_id, browser_fingerprint_id, BranchStorage */ describe('Branch', function() { - var storage = new BranchStorage([ 'pojo' ]); - var sandbox; - var requests; + const storage = new BranchStorage([ 'pojo' ]); + let sandbox; + let requests; window.sdk_version = 'web' + config.version; @@ -33,7 +33,7 @@ describe('Branch', function() { if (!keepStorage) { storage.clear(); } - var branch = new Branch(); + const branch = new Branch(); sandbox.stub(branch._server, 'request', function(resource, obj, storage, callback) { requests.push({ @@ -63,26 +63,26 @@ describe('Branch', function() { function basicTests(call, params) { it('should silently fail if branch not initialized', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(params.length * 2, done); + const branch = initBranch(false); + const assert = testUtils.plan(params.length * 2, done); function basicTest(param) { - var p = testUtils.nulls(param); + const p = testUtils.nulls(param); branch[call].apply(branch, p.concat(function(err) { assert.strictEqual(err.message, 'Branch SDK not initialized'); })); } - for (var i = 0; i < params.length; i++) { + for (let i = 0; i < params.length; i++) { basicTest(params[i]); } done(); }); } - var originalUa = navigator.userAgent; + const originalUa = navigator.userAgent; function setUserAgent(ua) { - navigator.__defineGetter__("userAgent", function() { + navigator.__defineGetter__('userAgent', function() { return ua; }); } @@ -95,17 +95,17 @@ describe('Branch', function() { describe('init', function() { it('should call api with params and version', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(7, done); + const branch = initBranch(false); + const assert = testUtils.plan(7, done); sandbox.stub(utils, 'whiteListSessionData', function(data) { return data; }); - var expectedResponse = { - "session_id": "113636235674656786", - "identity_id": "98807509250212101", - "identity": "Branch", - "has_app": true, - "referring_link": null + const expectedResponse = { + 'session_id': '113636235674656786', + 'identity_id': '98807509250212101', + 'identity': 'Branch', + 'has_app': true, + 'referring_link': null }; branch.init(branch_sample_key, function(err, res) { @@ -121,8 +121,8 @@ describe('Branch', function() { assert.deepEqual( requests[0].obj, { - "sdk": "web" + config.version, - branch_key: branch_sample_key + 'sdk': 'web' + config.version, + 'branch_key': branch_sample_key }, 'Request params to _r correct' ); @@ -131,16 +131,16 @@ describe('Branch', function() { assert.deepEqual( requests[1].obj, { - "branch_key": branch_sample_key, - "link_identifier": undefined, - "initial_referrer": requests[1].obj.initial_referrer, - "browser_fingerprint_id": browser_fingerprint_id, - "alternative_browser_fingerprint_id": undefined, - "sdk": "web" + config.version, - "options": { }, - "current_url": utils.getCurrentUrl(), - "screen_height": utils.getScreenHeight(), - "screen_width": utils.getScreenWidth() + 'branch_key': branch_sample_key, + 'link_identifier': undefined, + 'initial_referrer': requests[1].obj.initial_referrer, + 'browser_fingerprint_id': browser_fingerprint_id, + 'alternative_browser_fingerprint_id': undefined, + 'sdk': 'web' + config.version, + 'options': { }, + 'current_url': utils.getCurrentUrl(), + 'screen_height': utils.getScreenHeight(), + 'screen_width': utils.getScreenWidth() }, 'Request to open params correct' ); @@ -149,17 +149,17 @@ describe('Branch', function() { }); it('should not whitelist referring_link', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(7, done); + const branch = initBranch(false); + const assert = testUtils.plan(7, done); sandbox.stub(utils, 'whiteListSessionData', function(data) { return data; }); - var expectedResponse = { - "session_id": "113636235674656786", - "identity_id": "98807509250212101", - "identity": "Branch", - "has_app": true, - "referring_link": '/c/ngJf86-h' + const expectedResponse = { + 'session_id': '113636235674656786', + 'identity_id': '98807509250212101', + 'identity': 'Branch', + 'has_app': true, + 'referring_link': '/c/ngJf86-h' }; branch.init(branch_sample_key, function(err, res) { @@ -175,8 +175,8 @@ describe('Branch', function() { assert.deepEqual( requests[0].obj, { - "sdk": "web" + config.version, - branch_key: branch_sample_key + 'sdk': 'web' + config.version, + 'branch_key': branch_sample_key }, 'Request params to _r correct' ); @@ -185,16 +185,16 @@ describe('Branch', function() { assert.deepEqual( requests[1].obj, { - "branch_key": branch_sample_key, - "link_identifier": undefined, - "initial_referrer": requests[1].obj.initial_referrer, - "browser_fingerprint_id": browser_fingerprint_id, - "alternative_browser_fingerprint_id": undefined, - "sdk": "web" + config.version, - "options": { }, - "current_url": utils.getCurrentUrl(), - "screen_height": utils.getScreenHeight(), - "screen_width": utils.getScreenWidth() + 'branch_key': branch_sample_key, + 'link_identifier': undefined, + 'initial_referrer': requests[1].obj.initial_referrer, + 'browser_fingerprint_id': browser_fingerprint_id, + 'alternative_browser_fingerprint_id': undefined, + 'sdk': 'web' + config.version, + 'options': { }, + 'current_url': utils.getCurrentUrl(), + 'screen_height': utils.getScreenHeight(), + 'screen_width': utils.getScreenWidth() }, 'Request to open params correct' ); @@ -203,8 +203,8 @@ describe('Branch', function() { }); it('should support being called without a callback', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(1, done); + const branch = initBranch(false); + const assert = testUtils.plan(1, done); branch.init(branch_sample_key); @@ -223,8 +223,8 @@ describe('Branch', function() { }); it('should return invalid app id error', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(1, done); + const branch = initBranch(false); + const assert = testUtils.plan(1, done); branch.init(branch_sample_key, function(err) { assert.strictEqual(err.message, 'Invalid app id'); }); @@ -234,8 +234,8 @@ describe('Branch', function() { }); it('should fail early on browser fingerprint error', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(2, done); + const branch = initBranch(false); + const assert = testUtils.plan(2, done); branch.init(branch_sample_key, function(err) { assert.strictEqual(err.message, 'Browser fingerprint fetch failed'); assert.strictEqual(requests.length, 1, 'Only 1 request made'); @@ -245,8 +245,8 @@ describe('Branch', function() { it('should store in session and call open with link_identifier from hash', function(done) { if (testUtils.go('#r:12345')) { - var branch = initBranch(false); - var assert = testUtils.plan(3, done); + const branch = initBranch(false); + const assert = testUtils.plan(3, done); branch.init(branch_sample_key, function(err, data) { assert.strictEqual( @@ -267,8 +267,8 @@ describe('Branch', function() { requests[1].callback( null, { - session_id: "1234", - something: "else" + session_id: '1234', + something: 'else' } ); requests[2].callback(null, {}); @@ -276,16 +276,16 @@ describe('Branch', function() { assert.deepEqual( requests[1].obj, { - "branch_key": branch_sample_key, - "link_identifier": '12345', - "initial_referrer": requests[1].obj.initial_referrer, - "browser_fingerprint_id": '12345', - "alternative_browser_fingerprint_id": undefined, - "sdk": "web" + config.version, - "options": { }, - "current_url": utils.getCurrentUrl(), - "screen_height": utils.getScreenHeight(), - "screen_width": utils.getScreenWidth() + 'branch_key': branch_sample_key, + 'link_identifier': '12345', + 'initial_referrer': requests[1].obj.initial_referrer, + 'browser_fingerprint_id': '12345', + 'alternative_browser_fingerprint_id': undefined, + 'sdk': 'web' + config.version, + 'options': { }, + 'current_url': utils.getCurrentUrl(), + 'screen_height': utils.getScreenHeight(), + 'screen_width': utils.getScreenWidth() }, 'Request to open params correct' ); @@ -299,8 +299,8 @@ describe('Branch', function() { 'should store in session and call open with link_identifier from get param', function(done) { if (testUtils.go('?_branch_match_id=67890')) { - var branch = initBranch(false); - var assert = testUtils.plan(3, done); + const branch = initBranch(false); + const assert = testUtils.plan(3, done); branch.init(branch_sample_key, function(err, data) { assert.strictEqual( @@ -321,8 +321,8 @@ describe('Branch', function() { requests[1].callback( null, { - session_id: "1234", - something: "else" + session_id: '1234', + something: 'else' } ); requests[2].callback(null, {}); @@ -330,16 +330,16 @@ describe('Branch', function() { assert.deepEqual( requests[1].obj, { - "branch_key": branch_sample_key, - "link_identifier": '67890', - "initial_referrer": requests[1].obj.initial_referrer, - "browser_fingerprint_id": '67890', - "alternative_browser_fingerprint_id": undefined, - "sdk": "web" + config.version, - "options": { }, - "current_url": utils.getCurrentUrl(), - "screen_height": utils.getScreenHeight(), - "screen_width": utils.getScreenWidth() + 'branch_key': branch_sample_key, + 'link_identifier': '67890', + 'initial_referrer': requests[1].obj.initial_referrer, + 'browser_fingerprint_id': '67890', + 'alternative_browser_fingerprint_id': undefined, + 'sdk': 'web' + config.version, + 'options': { }, + 'current_url': utils.getCurrentUrl(), + 'screen_height': utils.getScreenHeight(), + 'screen_width': utils.getScreenWidth() }, 'Request to open params correct' ); @@ -351,8 +351,8 @@ describe('Branch', function() { ); it('should not call has_app if no session present', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(2, done); + const branch = initBranch(false); + const assert = testUtils.plan(2, done); branch.init(branch_sample_key, function(err, data) { assert.strictEqual(requests.length, 2, 'two requests made'); assert.deepEqual( @@ -375,47 +375,46 @@ describe('Branch', function() { it('should call has_app if session present but no link_identifier from get param', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(3, done); - branch.init(branch_sample_key); - requests[0].callback(null, browser_fingerprint_id); - requests[1].callback( - null, - { - session_id: session_id, - browser_fingerprint_id: browser_fingerprint_id, - identity_id: identity_id, - data: JSON.stringify({ - '$desktop_url': window.location.protocol + "//" + + let branch = initBranch(false); + const assert = testUtils.plan(3, done); + branch.init(branch_sample_key); + requests[0].callback(null, browser_fingerprint_id); + requests[1].callback( + null, + { + session_id: session_id, + browser_fingerprint_id: browser_fingerprint_id, + identity_id: identity_id, + data: JSON.stringify({ + '$desktop_url': window.location.protocol + '//' + window.location.host + window.location.pathname - }) - } - ); - requests[2].callback(null, {}); + }) + } + ); + requests[2].callback(null, {}); - requests = [ ]; - branch = initBranch(false, true); - branch.init(branch_sample_key); + requests = [ ]; + branch = initBranch(false, true); + branch.init(branch_sample_key); - assert.strictEqual(requests.length, 2, 'Should make 2 requests'); - assert.deepEqual( - requests[0].resource.endpoint, - '/_r', - 'First request should be sent to /_r' - ); - assert.deepEqual( - requests[1].resource.endpoint, - '/v1/has-app', - 'Second request should be sent to /v1/has-app' - ); - }); + assert.strictEqual(requests.length, 2, 'Should make 2 requests'); + assert.deepEqual( + requests[0].resource.endpoint, + '/_r', + 'First request should be sent to /_r' + ); + assert.deepEqual( + requests[1].resource.endpoint, + '/v1/has-app', + 'Second request should be sent to /v1/has-app' + ); + }); it('should not call has_app if session and link_identifier present', function(done) { - var assert = testUtils.plan(3, done); + const assert = testUtils.plan(3, done); if (testUtils.go('?_branch_match_id=67890')) { - - var branch = initBranch(false); + let branch = initBranch(false); branch.init(branch_sample_key); requests[0].callback(null, browser_fingerprint_id); @@ -426,7 +425,7 @@ describe('Branch', function() { browser_fingerprint_id: browser_fingerprint_id, identity_id: identity_id, data: JSON.stringify({ - '$desktop_url': window.location.protocol + "//" + + '$desktop_url': window.location.protocol + '//' + window.location.host + window.location.pathname }) @@ -444,7 +443,7 @@ describe('Branch', function() { browser_fingerprint_id: browser_fingerprint_id, identity_id: identity_id, data: JSON.stringify({ - '$desktop_url': window.location.protocol + "//" + + '$desktop_url': window.location.protocol + '//' + window.location.host + window.location.pathname }) @@ -470,22 +469,22 @@ describe('Branch', function() { }); it('should not call _r if userAgent is safari 11 or greater', function(done) { - var safari11Ua = 'Mozilla/5.0 (iPod touch; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.28 (KHTML, like Gecko) Version/11.0 Mobile/15A5318g Safari/604.1'; + const safari11Ua = 'Mozilla/5.0 (iPod touch; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.28 (KHTML, like Gecko) Version/11.0 Mobile/15A5318g Safari/604.1'; setUserAgent(safari11Ua); if (navigator.userAgent !== safari11Ua) { return done(); } - var branch = initBranch(false); - var assert = testUtils.plan(1, done); + const branch = initBranch(false); + const assert = testUtils.plan(1, done); branch.init(branch_sample_key); requests[0].callback( null, { - session_id: "1234", - something: "else" + session_id: '1234', + something: 'else' } ); requests[1].callback(null, {}); @@ -499,16 +498,16 @@ describe('Branch', function() { assert.deepEqual( requests[0].obj, { - "branch_key": branch_sample_key, - "link_identifier": undefined, - "initial_referrer": requests[0].obj.initial_referrer, - "browser_fingerprint_id": undefined, - "alternative_browser_fingerprint_id": undefined, - "sdk": "web" + config.version, - "options": { }, - "current_url": utils.getCurrentUrl(), - "screen_height": utils.getScreenHeight(), - "screen_width": utils.getScreenWidth() + 'branch_key': branch_sample_key, + 'link_identifier': undefined, + 'initial_referrer': requests[0].obj.initial_referrer, + 'browser_fingerprint_id': undefined, + 'alternative_browser_fingerprint_id': undefined, + 'sdk': 'web' + config.version, + 'options': { }, + 'current_url': utils.getCurrentUrl(), + 'screen_height': utils.getScreenHeight(), + 'screen_width': utils.getScreenWidth() }, 'Request to open params correct' ); @@ -516,51 +515,50 @@ describe('Branch', function() { it('should not call _r if session present but no link_identifier and safari 11 or greater', function(done) { - var safari11Ua = 'Mozilla/5.0 (iPod touch; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.28 (KHTML, like Gecko) Version/11.0 Mobile/15A5318g Safari/604.1'; - setUserAgent(safari11Ua); - if (navigator.userAgent !== safari11Ua) { - return done(); - } + const safari11Ua = 'Mozilla/5.0 (iPod touch; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.28 (KHTML, like Gecko) Version/11.0 Mobile/15A5318g Safari/604.1'; + setUserAgent(safari11Ua); + if (navigator.userAgent !== safari11Ua) { + return done(); + } - var branch = initBranch(false); - var assert = testUtils.plan(2, done); + let branch = initBranch(false); + const assert = testUtils.plan(2, done); - branch.init(branch_sample_key); - requests[0].callback( - null, - { - session_id: session_id, - browser_fingerprint_id: undefined, - identity_id: identity_id, - data: JSON.stringify({ - '$desktop_url': window.location.protocol + "//" + + branch.init(branch_sample_key); + requests[0].callback( + null, + { + session_id: session_id, + browser_fingerprint_id: undefined, + identity_id: identity_id, + data: JSON.stringify({ + '$desktop_url': window.location.protocol + '//' + window.location.host + window.location.pathname - }) - } - ); - requests[1].callback(null, {}); - - requests = [ ]; - branch = initBranch(false, true); - branch.init(branch_sample_key); + }) + } + ); + requests[1].callback(null, {}); - assert.strictEqual(requests.length, 1, 'Should make 2 requests'); - assert.deepEqual( - requests[0].resource.endpoint, - '/v1/has-app', - 'Second request should be sent to /v1/has-app' - ); - }); + requests = [ ]; + branch = initBranch(false, true); + branch.init(branch_sample_key); + assert.strictEqual(requests.length, 1, 'Should make 2 requests'); + assert.deepEqual( + requests[0].resource.endpoint, + '/v1/has-app', + 'Second request should be sent to /v1/has-app' + ); + }); }); describe('data', function() { it('should return whitelisted session storage data', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(2, done); - var data = safejson.stringify({ 'key_1': 'value_1' }); - var whitelistedData = { + const branch = initBranch(true); + const assert = testUtils.plan(2, done); + const data = safejson.stringify({'key_1': 'value_1'}); + const whitelistedData = { 'data': data, 'referring_identity': 'referring_user', 'identity': 'identity', @@ -584,14 +582,14 @@ describe('Branch', function() { describe('setIdentity', function() { basicTests('setIdentity', [ 1 ]); it('should invoke callback with data when a non-null value for identity is passed', function(done) { - var expectedResponse = { - "session_id": "113636235674656786", - "identity_id": "98807509250212101", - "link": "https://bnctestbed.app.link/?%24identity_id=98807509250212101", - "developer_identity": "test_identity" + const expectedResponse = { + 'session_id': '113636235674656786', + 'identity_id': '98807509250212101', + 'link': 'https://bnctestbed.app.link/?%24identity_id=98807509250212101', + 'developer_identity': 'test_identity' }; - var branch = initBranch(true); - var assert = testUtils.plan(4, done); + const branch = initBranch(true); + const assert = testUtils.plan(4, done); branch.setIdentity('test_identity', function(err, res) { assert.deepEqual(res, expectedResponse, 'response returned'); @@ -599,19 +597,19 @@ describe('Branch', function() { }); it('should update identity and identity_id in local storage', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(2, done); + const branch = initBranch(true); + const assert = testUtils.plan(2, done); branch.setIdentity('12345678', function(err, data) { - var localData = safejson.parse(localStorage.getItem('branch_session_first')); + const localData = safejson.parse(localStorage.getItem('branch_session_first')); assert.strictEqual(localData['identity'], '12345678'); assert.strictEqual(localData['identity_id'], '7654321'); }); - requests[0].callback(null, { identity: '12345678', identity_id: '7654321' }); + requests[0].callback(null, {identity: '12345678', identity_id: '7654321'}); }); it('should invoke callback with error when a null value for identity is passed', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(4, done); + const branch = initBranch(true); + const assert = testUtils.plan(4, done); branch.setIdentity(null, function(err, res) { assert.strictEqual(err, utils.messages.missingIdentity, 'error matched for missing identity'); @@ -622,13 +620,12 @@ describe('Branch', function() { describe('track', function() { basicTests('track', [ 0 ]); - var spy = sinon.spy(console, 'warn'); + const spy = sinon.spy(console, 'warn'); it('should print console warning about method deprecation for track', function() { - var branch = initBranch(true); - var assert = testUtils.unplanned(); + const branch = initBranch(true); + const assert = testUtils.unplanned(); branch.track(); - assert(spy.calledWith("track method currently supports only pageview event.")); - + assert(spy.calledWith('track method currently supports only pageview event.')); }); }); @@ -636,8 +633,8 @@ describe('Branch', function() { basicTests('logout', [ 0 ]); it('should call api with branch_key and session_id', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(3, done); + const branch = initBranch(true); + const assert = testUtils.plan(3, done); branch.logout(function(err) { assert.strictEqual(err, null, 'No error'); }); @@ -646,7 +643,7 @@ describe('Branch', function() { requests[0].callback(); assert.deepEqual( requests[0].obj, - testUtils.params({ }, [ "_t" ]), + testUtils.params({ }, [ '_t' ]), 'All params sent' ); }); @@ -654,29 +651,29 @@ describe('Branch', function() { it( 'should overwrite existing session_id, sessionLink, and identity_id\'s', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(6, done); + const branch = initBranch(true); + const assert = testUtils.plan(6, done); branch.logout(function(err) { assert.strictEqual(err, null, 'No error'); }); assert.strictEqual(requests.length, 1, 'Request made'); - var newSessionId = 'new_session'; - var newIdentityId = 'new_id'; - var newLink = 'new_link'; + const newSessionId = 'new_session'; + const newIdentityId = 'new_id'; + const newLink = 'new_link'; requests[0].callback( null, { - "identity_id": newIdentityId, - "session_id": newSessionId, - "link": newLink + 'identity_id': newIdentityId, + 'session_id': newSessionId, + 'link': newLink } ); assert.deepEqual( requests[0].obj, - testUtils.params({ }, [ "_t" ]), + testUtils.params({ }, [ '_t' ]), 'All params sent' ); assert.strictEqual(branch.session_id, newSessionId, 'branch session was replaced'); @@ -693,15 +690,15 @@ describe('Branch', function() { describe('link', function() { basicTests('link', [ 1 ]); - var expectedRequest = function(serialized, source, desktopUrlAppend) { - var val = testUtils.params({ - tags: [ 'tag1', 'tag2' ], - channel: 'sample app', - feature: 'create link', - stage: 'created link', - type: 1, - data: { - mydata: 'bar', + const expectedRequest = function(serialized, source, desktopUrlAppend) { + const val = testUtils.params({ + 'tags': [ 'tag1', 'tag2' ], + 'channel': 'sample app', + 'feature': 'create link', + 'stage': 'created link', + 'type': 1, + 'data': { + 'mydata': 'bar', '$desktop_url': 'https://cdn.branch.io/example.html', '$og_title': 'Branch Metrics', '$og_description': 'Branch Metrics', @@ -710,8 +707,8 @@ describe('Branch', function() { '$og_video': null, '$og_type': 'product' }, - "sdk": "web" + config.version - }, [ "_t" ]); + 'sdk': 'web' + config.version + }, [ '_t' ]); if (desktopUrlAppend) { val['data']['$desktop_url'] += desktopUrlAppend; } @@ -724,13 +721,13 @@ describe('Branch', function() { return val; }; - var expectedResponse = { - "url": "https://bnc.lt/l/3HZMytU-BW" + const expectedResponse = { + 'url': 'https://bnc.lt/l/3HZMytU-BW' }; it('should call api with serialized data and return link with browser_fingerprint_id appended', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(4, done); + const branch = initBranch(true); + const assert = testUtils.plan(4, done); branch.link(expectedRequest(), function(err, link) { assert.strictEqual(err, null, 'No error'); assert.strictEqual(link, expectedResponse['url'], 'link returned'); @@ -741,42 +738,42 @@ describe('Branch', function() { }); it('an error should be returned causing .link() to return a bnc.lt long link', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(20, done); + const branch = initBranch(true); + const assert = testUtils.plan(20, done); branch.link(expectedRequest(), function(err, link) { - var urlParser = document.createElement("a"); + const urlParser = document.createElement('a'); urlParser.href = link; - assert.strictEqual(urlParser.protocol, "https:", "Dynamic BNC link's protocol is correct"); - var hostWithoutPort = urlParser.host; + assert.strictEqual(urlParser.protocol, 'https:', 'Dynamic BNC link\'s protocol is correct'); + let hostWithoutPort = urlParser.host; if (hostWithoutPort.indexOf(':') > -1) { hostWithoutPort = hostWithoutPort.substring(0, hostWithoutPort.indexOf(':')); } - assert.strictEqual(hostWithoutPort, "bnc.lt", "Dynamic BNC link's host correct"); + assert.strictEqual(hostWithoutPort, 'bnc.lt', 'Dynamic BNC link\'s host correct'); // making sure that this test doesn't fail in IE10 - var pathName = urlParser.pathname; + let pathName = urlParser.pathname; if (pathName[0] === '/') { pathName = pathName.substring(1, pathName.length); } - assert.strictEqual(pathName, "a/key_live_ljmAgMXod0f4V0wNEf4ZubhpphenI4wS", "Dynamic BNC link's pathname correct"); + assert.strictEqual(pathName, 'a/key_live_ljmAgMXod0f4V0wNEf4ZubhpphenI4wS', 'Dynamic BNC link\'s pathname correct'); - var queryParams = urlParser.search.replace('?', ''); + let queryParams = urlParser.search.replace('?', ''); queryParams = queryParams.split('&'); - var expectedQueryParams = { + const expectedQueryParams = { tags: [ 'tag1', 'tag2' ], channel: 'sample app', feature: 'create link', stage: 'created link', - type: "1", + type: '1', sdk: 'web' + config.version, source: 'web-sdk', - data: { "mydata":"bar", "$desktop_url":"https://cdn.branch.io/example.html", "$og_title":"Branch Metrics", "$og_description":"Branch Metrics", "$og_image_url":"http://branch.io/img/logo_icon_white.png", "$canonical_url":"https://cdn.branch.io/example.html", "$og_video":null, "$og_type":"product" } + data: {'mydata': 'bar', '$desktop_url': 'https://cdn.branch.io/example.html', '$og_title': 'Branch Metrics', '$og_description': 'Branch Metrics', '$og_image_url': 'http://branch.io/img/logo_icon_white.png', '$canonical_url': 'https://cdn.branch.io/example.html', '$og_video': null, '$og_type': 'product'} }; - var actual = {}; - for (var i = 0; i < queryParams.length; i++) { - var keyValuePair = queryParams[i].split('='); - var key = keyValuePair[0]; - var value = decodeURIComponent(keyValuePair[1]); + const actual = {}; + for (let i = 0; i < queryParams.length; i++) { + const keyValuePair = queryParams[i].split('='); + const key = keyValuePair[0]; + const value = decodeURIComponent(keyValuePair[1]); if (key === 'tags') { if (!actual[key]) { actual[key] = []; @@ -788,10 +785,10 @@ describe('Branch', function() { } } // jshint maxdepth:5 - for (var property in expectedQueryParams) { + for (const property in expectedQueryParams) { if (expectedQueryParams.hasOwnProperty(property)) { - assert.strictEqual(true, actual.hasOwnProperty(property), "property exists in dynamic bnc link"); - var valActual = decodeURIComponent(actual[property]); + assert.strictEqual(true, actual.hasOwnProperty(property), 'property exists in dynamic bnc link'); + let valActual = decodeURIComponent(actual[property]); if (property === 'data') { valActual = atob(valActual); valActual = JSON.parse(valActual); @@ -799,8 +796,8 @@ describe('Branch', function() { } else if (property === 'tags') { valActual = valActual.split(','); - for (var t = 0; t < expectedQueryParams[property].length; t++) { - var valueExists = expectedQueryParams[property].indexOf(valActual[t]) > -1; + for (let t = 0; t < expectedQueryParams[property].length; t++) { + const valueExists = expectedQueryParams[property].indexOf(valActual[t]) > -1; assert.strictEqual(true, valueExists, 'tag is correctly appended to dynamic bnc.lt link'); } } @@ -815,16 +812,16 @@ describe('Branch', function() { }); it('should add source = "web-sdk" to link data', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(2, done); + const branch = initBranch(true); + const assert = testUtils.plan(2, done); branch.link(expectedRequest()); assert.strictEqual(requests.length, 1, 'Request made'); assert.strictEqual(requests[0].obj['source'], 'web-sdk', 'web-sdk source set'); }); it('should remove r hash from desktop_url', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(2, done); + const branch = initBranch(true); + const assert = testUtils.plan(2, done); branch.link(expectedRequest(false, false, '#r:12345')); assert.strictEqual(requests.length, 1, 'Request made'); assert.strictEqual( @@ -842,38 +839,37 @@ describe('Branch', function() { sandbox.stub(utils, 'mobileUserAgent', function(server, branchViewData, data) { return false; }); - var spy = sinon.spy(console, 'info'); + const spy = sinon.spy(console, 'info'); it('should print console warning about method deprecation for sendMS', function() { - var branch = initBranch(true); - var assert = testUtils.unplanned(); + const branch = initBranch(true); + const assert = testUtils.unplanned(); branch.banner(); - assert(spy.calledWith("banner functionality is not supported on desktop")); - + assert(spy.calledWith('banner functionality is not supported on desktop')); }); }); describe('deepview', function() { basicTests('deepview', [ 1 ]); - var branch; - var linkData = testUtils.params({ + let branch; + const linkData = testUtils.params({ channel: 'sample app', - data: { mydata: 'bar' }, + data: {mydata: 'bar'}, feature: 'create link', stage: 'created link', tags: [ 'tag1', 'tag2' ] - }, [ "_t" ]); - var options = { + }, [ '_t' ]); + const options = { make_new_link: true, open_app: true, append_deeplink_path: true }; - var windowLocation = 'http://someurl/pluspath'; - var ogTitle = 'OGTitle'; - var ogDescription = 'OGDescription'; - var ogImage = 'OGImage'; - var ogVideo = 'OGVideo'; - var ogType = 'OGType'; + const windowLocation = 'http://someurl/pluspath'; + const ogTitle = 'OGTitle'; + const ogDescription = 'OGDescription'; + const ogImage = 'OGImage'; + const ogVideo = 'OGVideo'; + const ogType = 'OGType'; beforeEach(function() { sinon.stub(utils, 'getWindowLocation') @@ -905,8 +901,8 @@ describe('Branch', function() { }); it('should call v1/deepview endpoint with the right params for branch.deepview() calls', function(done) { - var assert = testUtils.plan(7, done); - var dataString = [ + const assert = testUtils.plan(7, done); + const dataString = [ '{', '"mydata":"bar",', '"$canonical_url":"' + windowLocation + '",', @@ -928,10 +924,10 @@ describe('Branch', function() { assert.strictEqual(requests.length, 1, 'exactly one request made'); requests[0].callback(); - var obj = requests[0].obj; + const obj = requests[0].obj; assert.strictEqual(obj.data, dataString, 'data is sent'); - assert.deepEqual(obj.tags, [ "tag1", "tag2" ], 'tags is sent'); + assert.deepEqual(obj.tags, [ 'tag1', 'tag2' ], 'tags is sent'); assert.strictEqual(obj.open_app, true, 'open_app is sent'); // assert.strictEqual(obj.append_deeplink_path, // utils.mobileUserAgent() ? true : undefined, @@ -942,7 +938,7 @@ describe('Branch', function() { }); it('should call v1/deepview endpoint with the right params for branch.banner() calls', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); // we're testing banner, which means we need to be mobile sandbox.stub(utils, 'mobileUserAgent', function(server, branchViewData, data) { @@ -955,7 +951,7 @@ describe('Branch', function() { }); // create a fake banner div so we don't fill up the dom with real banners - var bannerDiv = document.createElement('iframe'); + const bannerDiv = document.createElement('iframe'); bannerDiv.src = 'about:blank'; bannerDiv.id = 'branch-mobile-action'; document.body.appendChild(bannerDiv); @@ -963,54 +959,35 @@ describe('Branch', function() { return bannerDiv; }); - - var bannerDeeplinkData = { - tags: [ 'custom' ], - data: { - mydata: 'From Banner', - foo: 'bar', - '$deeplink_path': 'open/item/5678' - } - }; - - var banner = branch.banner( - { - immediate: true, - disableHide: true, - forgetHide: true - }, - bannerDeeplinkData - ); - assert.strictEqual(requests.length, 1, 'exactly one request made'); - var obj = requests[0].obj; + const obj = requests[0].obj; assert.strictEqual(obj.deepview_type, 'banner', 'deepview_type is sent as \'banner\''); document.body.removeChild(bannerDiv); }); it('should ignore the referring link if make_new_link is true', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); sandbox.stub(branch, '_referringLink', function() { return '123abc'; }); branch.deepview( linkData, - { make_new_link: true }, + {make_new_link: true}, function(err) { assert.strictEqual(err, null, 'No error'); } ); requests[0].callback(); - var obj = requests[0].obj; + const obj = requests[0].obj; assert.strictEqual(obj.link_click_id, undefined, 'link_click_id is not sent'); }); it('should reuse the referring link if make_new_link is not true', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); sandbox.stub(branch, '_referringLink', function() { return '123abc'; }); @@ -1024,12 +1001,12 @@ describe('Branch', function() { ); requests[0].callback(); - var obj = requests[0].obj; + const obj = requests[0].obj; assert.strictEqual(obj.link_click_id, '123abc', 'link_click_id is sent'); }); it('should assign the function in request callback to branch._deepviewCta', function(done) { - var assert = testUtils.plan(4, done); + const assert = testUtils.plan(4, done); branch.deepview( {}, @@ -1047,7 +1024,7 @@ describe('Branch', function() { }); it('should return err and use the right fallback when the req has err', function(done) { - var assert = testUtils.plan(3, done); + const assert = testUtils.plan(3, done); sandbox.stub(branch, '_windowRedirect', function(url) { assert(false, 'redirect should not happen unless explicitly called'); @@ -1071,39 +1048,39 @@ describe('Branch', function() { branch._windowRedirect.restore(); } sandbox.stub(branch, '_windowRedirect', function(link) { - var urlParser = document.createElement("a"); + const urlParser = document.createElement('a'); urlParser.href = link; - assert.strictEqual(urlParser.protocol, "https:", "Dynamic BNC link's protocol is correct"); - var hostWithoutPort = urlParser.host; + assert.strictEqual(urlParser.protocol, 'https:', 'Dynamic BNC link\'s protocol is correct'); + let hostWithoutPort = urlParser.host; if (hostWithoutPort.indexOf(':') > -1) { hostWithoutPort = hostWithoutPort.substring(0, hostWithoutPort.indexOf(':')); } - assert.strictEqual(hostWithoutPort, "bnc.lt", "Dynamic BNC link's host correct"); + assert.strictEqual(hostWithoutPort, 'bnc.lt', 'Dynamic BNC link\'s host correct'); // making sure that this test doesn't fail in IE10 - var pathName = urlParser.pathname; + let pathName = urlParser.pathname; if (pathName[0] === '/') { pathName = pathName.substring(1, pathName.length); } - assert.strictEqual(pathName, "a/key_live_ljmAgMXod0f4V0wNEf4ZubhpphenI4wS", "Dynamic BNC link's pathname correct"); + assert.strictEqual(pathName, 'a/key_live_ljmAgMXod0f4V0wNEf4ZubhpphenI4wS', 'Dynamic BNC link\'s pathname correct'); - var queryParams = urlParser.search.replace('?', ''); + let queryParams = urlParser.search.replace('?', ''); queryParams = queryParams.split('&'); - var expectedQueryParams = { + const expectedQueryParams = { channel: 'testChannel', source: 'web-sdk', - data: { "$canonical_url":"http://someurl/pluspath", "$og_title":"OGTitle", "$og_description":"OGDescription", "$og_image_url": "OGImage", "$og_video":"OGVideo", "$og_type":"OGType", "akey": "aval" } + data: {'$canonical_url': 'http://someurl/pluspath', '$og_title': 'OGTitle', '$og_description': 'OGDescription', '$og_image_url': 'OGImage', '$og_video': 'OGVideo', '$og_type': 'OGType', 'akey': 'aval'} }; - var actual = {}; - for (var i = 0; i < queryParams.length; i++) { - var keyValuePair = queryParams[i].split('='); - var value = decodeURIComponent(keyValuePair[1]); + const actual = {}; + for (let i = 0; i < queryParams.length; i++) { + const keyValuePair = queryParams[i].split('='); + const value = decodeURIComponent(keyValuePair[1]); actual[keyValuePair[0]] = value; } - for (var key in expectedQueryParams) { + for (const key in expectedQueryParams) { if (expectedQueryParams.hasOwnProperty(key)) { - assert.strictEqual(true, actual.hasOwnProperty(key), "property exists in dynamic bnc link"); - var actualVal = decodeURIComponent(actual[key]); + assert.strictEqual(true, actual.hasOwnProperty(key), 'property exists in dynamic bnc link'); + let actualVal = decodeURIComponent(actual[key]); if (key === 'data') { actualVal = atob(actualVal); actualVal = JSON.parse(actualVal); @@ -1121,17 +1098,16 @@ describe('Branch', function() { branch._windowRedirect.restore(); } }); - }); describe('deepviewCta', function() { - var branch; + let branch; beforeEach(function() { branch = initBranch(true); }); it('should throw an error if branch._deepviewCta is undefined', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); assert.strictEqual(branch._deepviewCta, undefined, 'default to undefined'); branch.deepviewCta(function(err) { assert.strictEqual( @@ -1143,7 +1119,7 @@ describe('Branch', function() { }); it('should throw an error if tracking is disabled and branch._deepviewCta is undefined', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); assert.strictEqual(branch._deepviewCta, undefined, 'default to undefined'); branch.disableTracking(); branch.deepviewCta(function(err) { @@ -1156,7 +1132,7 @@ describe('Branch', function() { }); it('should not throw an error if branch._deepviewCta is a function', function(done) { - var assert = testUtils.plan(1, done); + const assert = testUtils.plan(1, done); branch._deepviewCta = function() {}; branch.deepviewCta(function(err) { assert.strictEqual(err, undefined, 'no error should be present in callback'); @@ -1165,10 +1141,10 @@ describe('Branch', function() { }); describe('addListener', function() { it('should add and remove an event listener to the branch object and fire', function(done) { - var branch = initBranch(true); - var assert = testUtils.plan(7, done); - var listenerFired = 0; - var listener = function(event) { + const branch = initBranch(true); + const assert = testUtils.plan(7, done); + let listenerFired = 0; + const listener = function(event) { assert.strictEqual('test_event', event, 'recieved event equals triggered event'); listenerFired++; }; @@ -1196,8 +1172,8 @@ describe('Branch', function() { describe('disableTracking() tests', function() { it('Flow with branch.init(), branch.disableTracking(true), branch.disableTracking(false)', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(6, done); + const branch = initBranch(false); + const assert = testUtils.plan(6, done); branch.init(branch_sample_key, function(err, data) { assert.strictEqual(err, null, 'No error'); }); @@ -1205,8 +1181,8 @@ describe('Branch', function() { requests[1].callback( null, { - session_id: "1234", - something: "else" + session_id: '1234', + something: 'else' } ); requests[2].callback(null, {}); @@ -1215,16 +1191,16 @@ describe('Branch', function() { assert.strictEqual('{"session_id":"1234","something":"else","identity":null}', localStorage.getItem('branch_session_first'), 'Cookie not stored. [This may not work in some browsers with a file: URL, e.g. Chrome.]'); branch.disableTracking(true); - assert.strictEqual("{}", sessionStorage.getItem('branch_session'), 'Cookie not stored. [This may not work in some browsers with a file: URL, e.g. Chrome.]'); - assert.strictEqual("{}", localStorage.getItem('branch_session_first'), 'Cookie not stored. [This may not work in some browsers with a file: URL, e.g. Chrome.]'); + assert.strictEqual('{}', sessionStorage.getItem('branch_session'), 'Cookie not stored. [This may not work in some browsers with a file: URL, e.g. Chrome.]'); + assert.strictEqual('{}', localStorage.getItem('branch_session_first'), 'Cookie not stored. [This may not work in some browsers with a file: URL, e.g. Chrome.]'); branch.disableTracking(false); requests[3].callback(null, browser_fingerprint_id); requests[4].callback( null, { - session_id: "1234", - something: "else" + session_id: '1234', + something: 'else' } ); requests[5].callback(null, {}); diff --git a/test/6_branch_new.js b/test/6_branch_new.js index 589e548b9..7cdee2927 100644 --- a/test/6_branch_new.js +++ b/test/6_branch_new.js @@ -1,11 +1,11 @@ 'use strict'; -/*jshint -W079 */ -var sinon = require('sinon'); +/* jshint -W079 */ +const sinon = require('sinon'); goog.require('Branch'); describe('Branch - new', function() { - var branch; + let branch; beforeEach(function() { branch = sinon.createStubInstance(Branch); }); @@ -14,7 +14,7 @@ describe('Branch - new', function() { }); describe('referringLink', function() { it('test method exists', function() { - sinon.assert.match(typeof branch.referringLink, "function"); + sinon.assert.match(typeof branch.referringLink, 'function'); }); }); }); diff --git a/test/7_integration.js b/test/7_integration.js index 150d3edf6..aa5db8688 100644 --- a/test/7_integration.js +++ b/test/7_integration.js @@ -3,25 +3,24 @@ goog.require('config'); goog.require('goog.json'); // jshint unused:false -/*globals branch_sample_key, session_id, identity_id, browser_fingerprint_id, branch */ -/*globals device_fingerprint_id */ +/* globals device_fingerprint_id */ describe('Integration tests', function() { - var requests = [ ]; - var xhr; - var clock; - var jsonpCallback = 0; + let requests = [ ]; + let xhr; + let clock; + let jsonpCallback = 0; - var clearBranchStorage = function() { + const clearBranchStorage = function() { sessionStorage.clear(); localStorage.clear(); - var clearCookies = function(temp, perm) { - var deleteCookie = function(cookie) { + const clearCookies = function(temp, perm) { + const deleteCookie = function(cookie) { document.cookie = cookie.substring(0, cookie.indexOf('=')) + '=;expires=-1;path=/'; }; - var cookieArray = document.cookie.split(';'); - for (var i = 0; i < cookieArray.length; i++) { - var cookie = cookieArray[i]; + const cookieArray = document.cookie.split(';'); + for (let i = 0; i < cookieArray.length; i++) { + let cookie = cookieArray[i]; while (cookie.charAt(0) === ' ') { cookie = cookie.substring(1, cookie.length); } @@ -47,7 +46,7 @@ describe('Integration tests', function() { }; branch._server.createScript = function() {}; sinon.stub(branch._server, 'createScript', function(src) { - requests.push({ src: src, callback: window[src.match(/callback=([^&]+)/)[1]] }); + requests.push({src: src, callback: window[src.match(/callback=([^&]+)/)[1]]}); }); }); @@ -77,14 +76,14 @@ describe('Integration tests', function() { } }); - var sampleParams = { + const sampleParams = { tags: [ 'tag1', 'tag2' ], channel: 'sample app', feature: 'create link', stage: 'created link', type: 1, data: { - mydata: 'bar', + 'mydata': 'bar', '$desktop_url': 'https://cdn.branch.io/example.html', '$og_title': 'Branch Metrics', '$og_description': 'Branch Metrics', @@ -92,15 +91,15 @@ describe('Integration tests', function() { } }; - var indexOfLastInitRequest = function(requestsAfterInit) { + const indexOfLastInitRequest = function(requestsAfterInit) { return requestsAfterInit + 1; }; - var numberOfAsserts = function(assertsAfterInit) { + const numberOfAsserts = function(assertsAfterInit) { return assertsAfterInit + 4; }; - var branchInit = function(assert, callback) { + const branchInit = function(assert, callback) { branch.init.apply( branch, [ @@ -127,7 +126,7 @@ describe('Integration tests', function() { // v1/open requests[1].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, '{ "identity_id":' + identity_id + ', "session_id":"123088518049178533", "device_fingerprint_id":null, ' + '"browser_fingerprint_id":"79336952217731267", ' + @@ -136,7 +135,7 @@ describe('Integration tests', function() { // v1/event requests[2].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, JSON.stringify({ branch_view_enabled: false })); @@ -144,18 +143,18 @@ describe('Integration tests', function() { if (assert) { assert.strictEqual(requests.length, 3, 'Exactly three requests were made'); - var params = requests[1].requestBody.split('&'); - var requestObj = params.reduce(function(a, b) { - var pair = b.split('='); + const params = requests[1].requestBody.split('&'); + const requestObj = params.reduce(function(a, b) { + const pair = b.split('='); a[pair[0]] = pair[1]; return a; }, {}); - var expectedObj = { + const expectedObj = { app_id: browser_fingerprint_id, browser_fingerprint_id: browser_fingerprint_id, identity_id: identity_id, - options: "%7B%7D", + options: '%7B%7D', sdk: 'web' + config.version }; @@ -173,14 +172,14 @@ describe('Integration tests', function() { describe('init', function() { it('should call api with params and version', function(done) { - var assert = testUtils.plan(numberOfAsserts(1), done); + const assert = testUtils.plan(numberOfAsserts(1), done); branchInit(assert, function(err, data) { assert.deepEqual(data, { - data: "", + data: '', data_parsed: {}, has_app: true, - identity: "Branch", + identity: 'Branch', referring_identity: null, referring_link: null }, @@ -189,12 +188,12 @@ describe('Integration tests', function() { }); it('should support being called without a callback', function(done) { - var assert = testUtils.plan(numberOfAsserts(0), done); + const assert = testUtils.plan(numberOfAsserts(0), done); branchInit(assert); }); it('should return error to callback', function(done) { - var assert = testUtils.plan(1, done); + const assert = testUtils.plan(1, done); branch.init(browser_fingerprint_id, function(err) { assert.strictEqual(err.message, 'Error in API: 400', 'Expect 400 error message'); }); @@ -203,11 +202,11 @@ describe('Integration tests', function() { }); it('should attempt 5xx error three times total', function(done) { - var assert = testUtils.plan(1, done); + const assert = testUtils.plan(1, done); branch.init(browser_fingerprint_id, function(err) { assert.strictEqual(err.message, 'Error in API: 500', 'Expect 500 error message'); }); - var requestCount = 0; + let requestCount = 0; requests[requestCount].callback(browser_fingerprint_id); requestCount++; requests[requestCount].respond(500); @@ -220,7 +219,7 @@ describe('Integration tests', function() { }); it('should store in session and call open with link_identifier from hash', function(done) { - var assert = testUtils.plan(1, done); + const assert = testUtils.plan(1, done); if (testUtils.go('#r:12345')) { branchInit(); assert( @@ -234,21 +233,20 @@ describe('Integration tests', function() { jsonpCallback--; done(); } - }); }); describe('setIdentity', function() { it('make two requests to init and set identity, and return expected data', function(done) { - var assert = testUtils.plan(2, done); + const assert = testUtils.plan(2, done); branchInit(); branch.setIdentity('identity', function(err, data) { assert.deepEqual(data, { - "identity_id": identity_id, - "link_click_id": "114750153298026746", - "link": config.link_service_endpoint + "/i/4LYQTXE0_k", - "referring_data_parsed": null + 'identity_id': identity_id, + 'link_click_id': '114750153298026746', + 'link': config.link_service_endpoint + '/i/4LYQTXE0_k', + 'referring_data_parsed': null }, 'Expected response returned' ); @@ -260,7 +258,7 @@ describe('Integration tests', function() { ); requests[indexOfLastInitRequest(2)].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, '{ "identity_id":' + identity_id + ', "link_click_id":"114750153298026746"' + ', "link":"https://bnc.lt/i/4LYQTXE0_k" }' @@ -270,16 +268,16 @@ describe('Integration tests', function() { describe('data', function() { it('should make two requests and return session data', function(done) { - var assert = testUtils.plan(numberOfAsserts(2), done); + const assert = testUtils.plan(numberOfAsserts(2), done); branchInit(assert); branch.data(function(err, data) { assert.deepEqual( data, { - data: "", + data: '', data_parsed: {}, has_app: true, - identity: "Branch", + identity: 'Branch', referring_identity: null, referring_link: null }, @@ -292,14 +290,14 @@ describe('Integration tests', function() { describe('getBrowserFingerprintId', function() { it('it should return browser-fingerprint-id with value 79336952217731267', function(done) { - var assert = testUtils.plan(numberOfAsserts(1), done); + const assert = testUtils.plan(numberOfAsserts(1), done); branchInit(assert); branch.getBrowserFingerprintId(function(err, data) { - assert.strictEqual("79336952217731267", data, 'expected browser-fingerprint-id returned correctly (79336952217731267)'); + assert.strictEqual('79336952217731267', data, 'expected browser-fingerprint-id returned correctly (79336952217731267)'); }); }); it('with tracking disabled, it should return browser-fingerprint-id with value null', function(done) { - var assert = testUtils.plan(numberOfAsserts(1), done); + const assert = testUtils.plan(numberOfAsserts(1), done); branchInit(assert); branch.disableTracking(); branch.getBrowserFingerprintId(function(err, data) { @@ -310,7 +308,7 @@ describe('Integration tests', function() { describe('link', function() { it('should make three requests and return short link', function(done) { - var assert = testUtils.plan(numberOfAsserts(2), done); + const assert = testUtils.plan(numberOfAsserts(2), done); branchInit(assert); branch.link(sampleParams, function(err, data) { @@ -327,7 +325,7 @@ describe('Integration tests', function() { ); requests[indexOfLastInitRequest(2)].respond( 200, - { "Content-Type": "application/json" }, + {'Content-Type': 'application/json'}, '{ "url":"https://bnc.lt/l/4manXlk0AJ" }' ); }); diff --git a/test/blob-banner.js b/test/blob-banner.js deleted file mode 100644 index 44578843e..000000000 --- a/test/blob-banner.js +++ /dev/null @@ -1 +0,0 @@ -var blobBanner = "
×
Demo App
1000
Branch View Banner!
"; \ No newline at end of file diff --git a/test/blob-interstitial.js b/test/blob-interstitial.js deleted file mode 100644 index 7146c1e8c..000000000 --- a/test/blob-interstitial.js +++ /dev/null @@ -1 +0,0 @@ -var blobInterstitial = "
×
Demo App
1000
Branch View Interstitial!
"; \ No newline at end of file diff --git a/test/branch-deps.js b/test/branch-deps.js index a4f38eef1..d895c161d 100644 --- a/test/branch-deps.js +++ b/test/branch-deps.js @@ -1,33 +1,30 @@ -goog.addDependency('../../../../src/0_config.js', ['config'], []); -goog.addDependency('../../../../src/0_jsonparse.js', ['safejson'], ['goog.json']); -goog.addDependency('../../../../src/0_queue.js', ['task_queue'], []); -goog.addDependency('../../../../src/1_utils.js', ['utils'], ['config', 'goog.json', 'safejson']); -goog.addDependency('../../../../src/2_resources.js', ['resources'], ['config', 'utils']); -goog.addDependency('../../../../src/2_session.js', ['session'], ['goog.json', 'safejson', 'storage', 'utils']); -goog.addDependency('../../../../src/2_storage.js', ['storage'], ['goog.json', 'utils']); -goog.addDependency('../../../../src/3_api.js', ['Server'], ['goog.json', 'safejson', 'storage', 'utils']); -goog.addDependency('../../../../src/3_banner_utils.js', ['banner_utils'], ['safejson', 'storage', 'utils']); -goog.addDependency('../../../../src/4_banner_css.js', ['banner_css'], ['banner_utils', 'utils']); -goog.addDependency('../../../../src/4_banner_html.js', ['banner_html'], ['banner_utils', 'session', 'storage', 'utils']); -goog.addDependency('../../../../src/5_banner.js', ['banner'], ['banner_css', 'banner_html', 'banner_utils', 'utils']); -goog.addDependency('../../../../src/6_branch.js', ['Branch'], ['Server', 'banner', 'branch_view', 'config', 'goog.json', 'journeys_utils', 'resources', 'safejson', 'session', 'storage', 'task_queue', 'utils']); -goog.addDependency('../../../../src/7_initialization.js', ['branch_instance'], ['Branch', 'config']); -goog.addDependency('../../../../src/branch_view.js', ['branch_view'], ['banner_css', 'journeys_utils', 'safejson', 'utils']); -goog.addDependency('../../../../src/extern.js', [], []); -goog.addDependency('../../../../src/journeys_utils.js', ['journeys_utils'], ['banner_utils', 'safejson', 'utils'], {'lang': 'es6'}); +goog.addDependency('../../../../src/0_config.js', [ 'config' ], []); +goog.addDependency('../../../../src/0_jsonparse.js', [ 'safejson' ], [ 'goog.json' ]); +goog.addDependency('../../../../src/0_queue.js', [ 'task_queue' ], [], {'lang': 'es6'}); +goog.addDependency('../../../../src/1_utils.js', [ 'utils' ], [ 'config', 'goog.json', 'safejson' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/2_resources.js', [ 'resources' ], [ 'config', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/2_session.js', [ 'session' ], [ 'goog.json', 'safejson', 'storage', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/2_storage.js', [ 'storage' ], [ 'goog.json', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/3_api.js', [ 'Server' ], [ 'goog.json', 'safejson', 'storage', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/3_banner_utils.js', [ 'banner_utils' ], [ 'safejson', 'storage', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/4_banner_css.js', [ 'banner_css' ], [ 'banner_utils', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/4_banner_html.js', [ 'banner_html' ], [ 'banner_utils', 'session', 'storage', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/5_banner.js', [ 'banner' ], [ 'banner_css', 'banner_html', 'banner_utils', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/6_branch.js', [ 'Branch' ], [ 'Server', 'banner', 'branch_view', 'config', 'goog.json', 'journeys_utils', 'resources', 'safejson', 'session', 'storage', 'task_queue', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/7_initialization.js', [ 'branch_instance' ], [ 'Branch', 'config' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/branch_view.js', [ 'branch_view' ], [ 'banner_css', 'journeys_utils', 'safejson', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../src/extern.js', [], [], {'lang': 'es6'}); +goog.addDependency('../../../../src/journeys_utils.js', [ 'journeys_utils' ], [ 'banner_utils', 'safejson', 'utils' ], {'lang': 'es6'}); goog.addDependency('../../../../src/onpage.js', [], []); -goog.addDependency('../../../../test/0_config.js', [], ['config']); -goog.addDependency('../../../../test/0_queue.js', [], ['task_queue']); -goog.addDependency('../../../../test/1_utils.js', [], ['utils']); -goog.addDependency('../../../../test/2_storage.js', [], ['storage']); -goog.addDependency('../../../../test/3_api.js', [], ['Server', 'config', 'resources', 'safejson', 'storage', 'utils']); -goog.addDependency('../../../../test/6_branch.js', [], ['Branch', 'banner_html', 'banner_utils', 'config', 'goog.json', 'resources', 'safejson', 'session', 'storage', 'utils']); -goog.addDependency('../../../../test/6_branch_new.js', [], ['Branch']); -goog.addDependency('../../../../test/7_integration.js', [], ['config', 'goog.json']); -goog.addDependency('../../../../test/blob-banner.js', [], []); -goog.addDependency('../../../../test/blob-interstitial.js', [], []); -goog.addDependency('../../../../test/journeys.js', [], ['Branch', 'banner_utils', 'branch_view', 'config', 'goog.json', 'resources', 'session', 'storage', 'utils'], {'lang': 'es5'}); -goog.addDependency('../../../../test/journeys_utils.js', [], ['journeys_utils'], {'lang': 'es6'}); -goog.addDependency('../../../../test/saucelabs.js', [], []); -goog.addDependency('../../../../test/test-utils.js', [], [], {'lang': 'es5'}); +goog.addDependency('../../../../test/0_config.js', [], [ 'config' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/0_queue.js', [], [ 'task_queue' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/1_utils.js', [], [ 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/2_storage.js', [], [ 'storage' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/3_api.js', [], [ 'Server', 'config', 'resources', 'safejson', 'storage', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/6_branch.js', [], [ 'Branch', 'banner_html', 'banner_utils', 'config', 'goog.json', 'resources', 'safejson', 'session', 'storage', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/6_branch_new.js', [], [ 'Branch' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/7_integration.js', [], [ 'config', 'goog.json' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/journeys.js', [], [ 'Branch', 'banner_utils', 'branch_view', 'config', 'goog.json', 'resources', 'session', 'storage', 'utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/journeys_utils.js', [], [ 'journeys_utils' ], {'lang': 'es6'}); +goog.addDependency('../../../../test/test-utils.js', [], [], {'lang': 'es6'}); diff --git a/test/journeys.js b/test/journeys.js index a5fbc51a0..d95c45375 100644 --- a/test/journeys.js +++ b/test/journeys.js @@ -11,12 +11,12 @@ goog.require('banner_utils'); goog.require('goog.json'); // jshint unused:false -/*globals branch_sample_key, session_id, identity_id, browser_fingerprint_id, BranchStorage */ +/* globals branch_sample_key, session_id, identity_id, browser_fingerprint_id, BranchStorage */ describe('Branch', function() { - var storage = new BranchStorage([ 'pojo' ]); - var sandbox; - var requests; + const storage = new BranchStorage([ 'pojo' ]); + let sandbox; + let requests; window.sdk_version = 'web' + config.version; @@ -41,7 +41,7 @@ describe('Branch', function() { return 'ios'; }); - var branch = new Branch(); + const branch = new Branch(); sandbox.stub(branch._server, 'request', function(resource, obj, storage, callback) { requests.push({ @@ -69,45 +69,23 @@ describe('Branch', function() { return branch; } - function basicTests(call, params) { - it('should fail if branch not initialized', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(params.length * 2, done); - - function basicTest(param) { - var p = testUtils.nulls(param); - branch[call].apply(branch, p.concat(function(err) { - assert.strictEqual(err.message, 'Branch SDK not initialized'); - })); - assert.throws(function() { - branch[call].apply(branch, p); - }, 'Branch SDK not initialized'); - } - - for (var i = 0; i < params.length; i++) { - basicTest(params[i]); - } - }); - } - afterEach(function() { sandbox.restore(); }); describe('journeys', function() { - it('should attempt to pass deeplink data in a banner call', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(3, done); + const branch = initBranch(false); + const assert = testUtils.plan(3, done); - var bannerDeeplinkData = { + const bannerDeeplinkData = { tags: [ 'custom' ], data: { - mydata: 'From Banner', - foo: 'bar', + 'mydata': 'From Banner', + 'foo': 'bar', '$deeplink_path': 'open/item/5678' } - } + }; branch.init(branch_sample_key); branch.banner( @@ -149,17 +127,17 @@ describe('Branch', function() { }); it('should attempt to pass deeplink data to a journey in a page view event', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(4, done); + const branch = initBranch(false); + const assert = testUtils.plan(4, done); - var bannerDeeplinkData = { + const bannerDeeplinkData = { tags: [ 'custom' ], data: { - mydata: 'From Banner', - foo: 'bar', + 'mydata': 'From Banner', + 'foo': 'bar', '$deeplink_path': 'open/item/5678' } - } + }; sandbox.stub(branch_view, 'handleBranchViewData', function(server, branchViewData, data) { assert.isDefined(data, 'user data has been defined'); @@ -215,24 +193,20 @@ describe('Branch', function() { }); it('should attempt to pass deeplink data to a journey in a custom event', function(done) { - var branch = initBranch(false); - var assert = testUtils.plan(4, done); + const branch = initBranch(false); + const assert = testUtils.plan(4, done); - var bannerDeeplinkData = { + const bannerDeeplinkData = { tags: [ 'custom' ], data: { - mydata: 'From Banner', - foo: 'bar', + 'mydata': 'From Banner', + 'foo': 'bar', '$deeplink_path': 'open/item/5678' } - } + }; sandbox.stub(branch_view, 'handleBranchViewData', function(server, branchViewData, data) { assert.isDefined(data, 'user data has been defined'); - var test = banner_utils.shouldAppend(storage, { - forgetHide: true, - showiOS: true - }); assert.strictEqual(false, banner_utils.shouldAppend(storage, { forgetHide: true, showiOS: true @@ -289,17 +263,17 @@ describe('Branch', function() { // where a Journey view would be shown. In this case, the data most recently passed to // branch.banner() and stored in the data cache would be sent through to the /v1/branchview // call. It would be combined on the server with data set in the Dashboard. - var branch = initBranch(false); - var assert = testUtils.plan(4, done); + const branch = initBranch(false); + const assert = testUtils.plan(4, done); - var bannerDeeplinkData = { + const bannerDeeplinkData = { tags: [ 'custom' ], data: { - mydata: 'From Banner', - foo: 'bar', + 'mydata': 'From Banner', + 'foo': 'bar', '$deeplink_path': 'open/item/5678' } - } + }; sandbox.stub(branch_view, 'handleBranchViewData', function(server, branchViewData, data) { assert.isDefined(data, 'user data has been defined'); @@ -349,7 +323,6 @@ describe('Branch', function() { assert.strictEqual(requests.length, 4, '4 requests made'); }, 10); }); - }); }); diff --git a/test/journeys_utils.js b/test/journeys_utils.js index d4f248191..efe8585f7 100644 --- a/test/journeys_utils.js +++ b/test/journeys_utils.js @@ -2,47 +2,48 @@ goog.require('journeys_utils'); -describe('getRelativeHeightValueOrFalseFromBannerHeight', function() { - const assert = testUtils.unplanned(); - it('should return false when bannerHeight is in pixel values', function() { - const bannerHeight = '350px'; - const expected = false; - assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, 'false when bannerHeight is pixels'); - }); - - it('should return the height value when bannerHeight is provided with viewHeight units - 100vh', function() { - const bannerHeight = '100vh'; - const expected = '100'; - assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '100 from bannerHeight of 100vh'); - }); - - it('should return the height value when bannerHeight is provided with viewHeight units - 99vh', function() { - const bannerHeight = '99vh'; - const expected = '99'; - assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '99 from bannerHeight of 99vh'); - }); - - it('should return the height value when bannerHeight is provided with viewHeight units - 5vh', function() { - const bannerHeight = '5vh'; - const expected = '5'; - assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '5 from bannerHeight of 5vh'); - }); - - it('should return the height value when bannerHeight is provided with percentage units - 100%', function() { - const bannerHeight = '100%'; - const expected = '100'; - assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '100 from bannerHeight of 100%'); - }); - - it('should return the height value when bannerHeight is provided with percentage units - 99%', function() { - const bannerHeight = '99%'; - const expected = '99'; - assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '99 from bannerHeight of 99%'); - }); - - it('should return the height value when bannerHeight is provided with percentage units - 5%', function() { - const bannerHeight = '5%'; - const expected = '5'; - assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '5 from bannerHeight of 5%'); - }); -}); \ No newline at end of file +describe('getRelativeHeightValueOrFalseFromBannerHeight', function () { + const assert = testUtils.unplanned(); + it('should return false when bannerHeight is in pixel values', function () { + const bannerHeight = '350px'; + const expected = false; + assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, 'false when bannerHeight is pixels'); + }); + + it('should return the height value when bannerHeight is provided with viewHeight units - 100vh', function () { + const bannerHeight = '100vh'; + const expected = '100'; + assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '100 from bannerHeight of 100vh'); + }); + + it('should return the height value when bannerHeight is provided with viewHeight units - 99vh', function () { + const bannerHeight = '99vh'; + const expected = '99'; + assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '99 from bannerHeight of 99vh'); + }); + + it('should return the height value when bannerHeight is provided with viewHeight units - 5vh', function () { + const bannerHeight = '5vh'; + const expected = '5'; + assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '5 from bannerHeight of 5vh'); + }); + + it('should return the height value when bannerHeight is provided with percentage units - 100%', function () { + const bannerHeight = '100%'; + const expected = '100'; + assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '100 from bannerHeight of 100%'); + }); + + it('should return the height value when bannerHeight is provided with percentage units - 99%', function () { + const bannerHeight = '99%'; + const expected = '99'; + assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '99 from bannerHeight of 99%'); + }); + + it('should return the height value when bannerHeight is provided with percentage units - 5%', function () { + const bannerHeight = '5%'; + const expected = '5'; + assert.strictEqual(journeys_utils.getRelativeHeightValueOrFalseFromBannerHeight(bannerHeight), expected, '5 from bannerHeight of 5%'); + }); +}); + diff --git a/test/saucelabs.js b/test/saucelabs.js deleted file mode 100644 index 8f7913d8f..000000000 --- a/test/saucelabs.js +++ /dev/null @@ -1,29 +0,0 @@ -// Sauce labs magic, don't worry about it -function onload() { - var runner = mocha.run(); - - var failedTests = []; - runner.on('end', function() { - window.mochaResults = runner.stats; - window.mochaResults.reports = failedTests; - }); - - var logFailure = function(test, err) { - - var flattenTitles = function(test) { - var titles = []; - while (test.parent.title) { - titles.push(test.parent.title); - test = test.parent; - } - return titles.reverse(); - }; - - failedTests.push({ name: test.title, - result: false, - message: err.message, - stack: err.stack, - titles: flattenTitles(test) }); - }; - runner.on('fail', logFailure); -}; diff --git a/test/test-utils.js b/test/test-utils.js index fc7140610..44e50ad04 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -27,21 +27,22 @@ (function(root, factory) { if (typeof define === 'function' && define.amd) { define([], factory); // AMD - } else if (typeof exports === 'object') { + } + else if (typeof exports === 'object') { module.exports = factory(); // CommonJS - } else { + } + else { root.assert = factory(); // Global } -})( +}( this, function() { - // UTILITY // Object.create compatible in IE - var create = Object.create || function(p) { + const create = Object.create || function(p) { if (!p) { - throw Error('no type') + throw Error('no type'); }; function f() {}; f.prototype = p; @@ -49,7 +50,7 @@ }; // UTILITY - var util = { + const util = { inherits: function(ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = create( @@ -117,15 +118,15 @@ } }; - var pSlice = Array.prototype.slice; + const pSlice = Array.prototype.slice; // From https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys - var objectKeys = typeof Object.keys === 'function' ? + const objectKeys = typeof Object.keys === 'function' ? Object.keys : (function() { - var hasOwnProperty = Object.prototype.hasOwnProperty; - var hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'); - var dontEnums = [ + const hasOwnProperty = Object.prototype.hasOwnProperty; + const hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'); + const dontEnums = [ 'toString', 'toLocaleString', 'valueOf', @@ -134,20 +135,20 @@ 'propertyIsEnumerable', 'constructor' ]; - var dontEnumsLength = dontEnums.length; + const dontEnumsLength = dontEnums.length; return function(obj) { if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) { throw new TypeError('Object.keys called on non-object'); } - var result = []; - var prop; - var i; + const result = []; + let prop; + let i; for (prop in obj) { if (hasOwnProperty.call(obj, prop)) { - result.push(prop); + result.push(prop); } } @@ -160,13 +161,13 @@ } return result; }; - })(); + }()); // 1. The assert module provides functions that throw // AssertionError's when particular conditions are not met. The // assert module must conform to the following interface. - var assert = ok; + const assert = ok; // 2. The AssertionError is defined in assert. // new assert.AssertionError({ message: message, @@ -178,18 +179,20 @@ this.actual = options.actual; this.expected = options.expected; this.operator = options.operator; - this.message = (options.message && (options.message + ": ")) + getMessage(this); + this.message = (options.message && (options.message + ': ')) + getMessage.call(this); this.generatedMessage = true; - var stackStartFunction = options.stackStartFunction || fail; + const stackStartFunction = options.stackStartFunction || fail; if (Error.captureStackTrace) { Error.captureStackTrace(this, stackStartFunction); - } else { + } + else { // try to throw an error now, and from the stack property // work out the line that called in to assert.js. try { this.stack = (new Error).stack.toString(); - } catch (e) {} + } + catch (e) {} } }; @@ -212,15 +215,16 @@ function truncate(s, n) { if (util.isString(s)) { return s.length < n ? s : s.slice(0, n); - } else { + } + else { return s; } } - function getMessage(self) { - return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + - self.operator + ' ' + - truncate(JSON.stringify(self.expected, replacer), 128); + function getMessage() { + return truncate(JSON.stringify(this.actual, replacer), 128) + ' ' + + this.operator + ' ' + + truncate(JSON.stringify(this.expected, replacer), 128); } // At present only the three keys mentioned above are used and @@ -258,7 +262,7 @@ function ok(value, message) { if (!value) { - fail(value, true, message, '==', assert.ok) + fail(value, true, message, '==', assert.ok); }; } assert.ok = ok; @@ -269,7 +273,7 @@ assert.equal = function equal(actual, expected, message) { if (actual != expected) { - fail(actual, expected, message, '==', assert.equal) + fail(actual, expected, message, '==', assert.equal); }; }; @@ -307,10 +311,10 @@ // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). if (util.isRegExp(actual) && util.isRegExp(expected)) { return actual.source === expected.source && - actual.global === expected.global && - actual.multiline === expected.multiline && - actual.lastIndex === expected.lastIndex && - actual.ignoreCase === expected.ignoreCase; + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; } // 7.4. Other pairs that do not both pass typeof value == 'object', @@ -328,7 +332,7 @@ return objEquiv(actual, expected); } - var isArguments = function(object) { + let isArguments = function(object) { return Object.prototype.toString.call(object) == '[object Arguments]'; }; @@ -341,7 +345,7 @@ typeof object.length === 'number' || false; }; } - })(); + }()); function objEquiv(a, b) { if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) { @@ -351,10 +355,10 @@ if (a.prototype !== b.prototype) { return false; } - //~~~I've managed to break Object.keys through screwy arguments passing. + // ~~~I've managed to break Object.keys through screwy arguments passing. // Converting to array solves the problem. - var aIsArgs = isArguments(a); - var bIsArgs = isArguments(b); + const aIsArgs = isArguments(a); + const bIsArgs = isArguments(b); if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) { return false; } @@ -365,35 +369,34 @@ return _deepEqual(a, b); } try { - var ka = objectKeys(a); - var kb = objectKeys(b); - var key; - var i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) { - return false; - } - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) { + const ka = objectKeys(a); + const kb = objectKeys(b); + // having the same number of owned properties (keys incorporates hasOwnProperty) + if (ka.length != kb.length) { return false; } - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key])) { - return false; + // the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + // ~~~cheap key test + for (let i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) { + return false; + } } + // equivalent values for every corresponding key, and + // ~~~possibly expensive deep test + for (let i = ka.length - 1; i >= 0; i--) { + const key = ka[i]; + if (!_deepEqual(a[key], b[key])) { + return false; + } + } + return true; + } + catch (e) {// happens when one is a string literal and the other isn't + return false; } - return true; } // 8. The non-equivalence assertion tests for any deep inequality. @@ -430,9 +433,11 @@ if (Object.prototype.toString.call(expected) == '[object RegExp]') { return expected.test(actual); - } else if (actual instanceof expected) { + } + else if (actual instanceof expected) { return true; - } else if (expected.call({}, actual) === true) { + } + else if (expected.call({}, actual) === true) { return true; } @@ -440,7 +445,7 @@ } function _throws(shouldThrow, block, expected, message) { - var actual; + let actual; if (util.isString(expected)) { message = expected; @@ -449,7 +454,8 @@ try { block(); - } catch (e) { + } + catch (e) { actual = e; } @@ -473,13 +479,13 @@ // 11. Expected to throw an error: // assert.throws(block, Error_opt, message_opt); - assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [true].concat(pSlice.call(arguments))); + assert.throws = function(block, /* optional*/error, /* optional*/message) { + _throws.apply(this, [ true ].concat(pSlice.call(arguments))); }; // EXTENSION! This is annoying to write outside this module. - assert.doesNotThrow = function(block, /*optional*/message) { - _throws.apply(this, [false].concat(pSlice.call(arguments))); + assert.doesNotThrow = function(block, /* optional*/message) { + _throws.apply(this, [ false ].concat(pSlice.call(arguments))); }; assert.ifError = function(err) { @@ -515,7 +521,7 @@ testUtils.params = function(extra, without) { // Returns new object every time. - var p = utils.merge( + const p = utils.merge( { branch_key: branch_sample_key, browser_fingerprint_id: browser_fingerprint_id, @@ -526,22 +532,22 @@ }, extra || {} ); - for (var k = 0; k < (without || []).length; k++) { + for (let k = 0; k < (without || []).length; k++) { delete p[without[k]]; } return p; }; testUtils.nulls = function(n) { - var p = []; - for (var k = 0; k < n; k++) { + const p = []; + for (let k = 0; k < n; k++) { p.push(null); } return p; }; testUtils.after = function(n, done) { - var remaining = n; + let remaining = n; return function() { remaining--; if (remaining == 0) { @@ -553,7 +559,7 @@ }; }; - var assertions = [ + const assertions = [ 'ok', 'fail', 'equal', @@ -569,8 +575,8 @@ ]; testUtils.plan = function(n, done) { - var d = testUtils.after(n, done); - var ret = function() { + const d = testUtils.after(n, done); + const ret = function() { assert.apply(assert, Array.prototype.slice.call(arguments, 0)); d(); }; @@ -580,8 +586,8 @@ d(); }; } - for (var i = 0; i < assertions.length; i++) { - create(assertions[i]) + for (let i = 0; i < assertions.length; i++) { + create(assertions[i]); } ret.done = function(err) { @@ -599,7 +605,7 @@ if (!window.history.pushState) { return false; } - var newLocation = window.location.toString().split(/[\?#]/)[0] + suffix; + const newLocation = window.location.toString().split(/[\?#]/)[0] + suffix; if (newLocation !== window.location.toString()) { window.history.pushState({}, '', newLocation); // Simply not possible in IE 9 return true; @@ -612,4 +618,4 @@ return assert; } -); +));