diff --git a/connect-automation/.vscode/launch.json b/connect-automation/.vscode/launch.json new file mode 100644 index 000000000..56cfb27d9 --- /dev/null +++ b/connect-automation/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "args": [ + "-u", + "tdd", + "--timeout", + "999999", + "--colors", + "${workspaceFolder}/test-suites" + ], + "internalConsoleOptions": "openOnSessionStart", + "name": "Mocha Tests", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "request": "launch", + "skipFiles": [ + "/**" + ], + "type": "pwa-node" + }, + ] +} \ No newline at end of file diff --git a/connect-automation/conf.ts b/connect-automation/conf.ts index b69d06986..9668f1a66 100644 --- a/connect-automation/conf.ts +++ b/connect-automation/conf.ts @@ -26,7 +26,15 @@ exports.config = { '--disable-gpu', '--no-sandbox', '--window-size=1325x744', + 'disable-infobars' ], + 'excludeSwitches': ['enable-automation'], + prefs: { + 'credentials_enable_service': false, + 'profile': { + 'password_manager_enabled': false + } + } }, }, @@ -41,8 +49,10 @@ exports.config = { '../temp/test-suites/project-creation-flow/create-project.spec.js', '../temp/test-suites/project-creation-flow/invite-copilot.spec.js', '../temp/test-suites/project-creation-flow/projects.spec.js', - '../temp/test-suites/phase-creation-flow/create-new-phase.spec.js', - '../temp/test-suites/project-settings-flow/project-settings.spec.js' + '../temp/test-suites/project-settings-flow/project-settings.spec.js', + '../temp/test-suites/milestone-flow/create-new-milestone.spec.js', + '../temp/test-suites/milestone-flow/verify-customer-role.spec.js', + '../temp/test-suites/milestone-flow/verify-customer-approveMilestone.spec.js' ], // Options to be passed to Jasmine. diff --git a/connect-automation/config/config.json b/connect-automation/config/config.json index 903c05ba8..16655dc1b 100644 --- a/connect-automation/config/config.json +++ b/connect-automation/config/config.json @@ -1,29 +1,28 @@ { - "env": "dev", - "username": "mailmemakar402", - "password": "P@ssw0rd", - "customerRole": { - "email": "topcoderconnect+Customer@gmail.com", - "password": "appirio123" - }, - "copilotRole": { - "email": "topcoderconnect+Copilot@gmail.com", - "password": "appirio123" - }, - "copilotManagerRole": { - "email": "topcoderconnect+CopilotManager@gmail.com", - "password": "appirio123" - }, - "homePageUrl": "https://connect.topcoder-dev.com/", - "loginUrl": "https://auth.topcoder-dev.com", - "redirectLoginUrl": "https://accounts-auth0.topcoder-dev.com/?regSource=tcBusiness&retUrl=https://connect.topcoder-dev.com", - "logoutUrl": "https://accounts-auth0.topcoder-dev.com/?logout=true&retUrl=https://connect.topcoder-dev.com", - "myProfileUrl": "https://connect.topcoder-dev.com/settings/profile", - "notificationSettingsUrl": "https://connect.topcoder-dev.com/settings/notifications", - "accountAndSecurityUrl": "https://connect.topcoder-dev.com/settings/account", - "notificationsUrl": "https://connect.topcoder-dev.com/notifications", - "allProjectsUrl": "https://connect.topcoder-dev.com/projects", - "givenProjectUrl": "https://connect.topcoder-dev.com/projects/18013", - "expiredProjectUrl": "https://connect.topcoder-dev.com/projects/17236", - "platformUrl": "https://platform.topcoder-dev.com/taas/myteams" -} + "env": "dev", + "username": "mailmemakar402", + "password": "P@ssw0rd", + "customerRole": { + "email": "topcoderconnect+Customer@gmail.com", + "password": "appirio123" + }, + "copilotRole": { + "email": "topcoderconnect+Copilot@gmail.com", + "password": "appirio123" + }, + "copilotManagerRole": { + "email": "topcoderconnect+CopilotManager@gmail.com", + "password": "appirio123" + }, + "homePageUrl": "https://connect.topcoder-dev.com/", + "loginUrl": "https://auth.topcoder-dev.com", + "redirectLoginUrl": "https://accounts-auth0.topcoder-dev.com/?regSource=tcBusiness&retUrl=https://connect.topcoder-dev.com", + "logoutUrl": "https://accounts-auth0.topcoder-dev.com/?logout=true&retUrl=https://connect.topcoder-dev.com", + "myProfileUrl": "https://connect.topcoder-dev.com/settings/profile", + "notificationSettingsUrl": "https://connect.topcoder-dev.com/settings/notifications", + "accountAndSecurityUrl": "https://connect.topcoder-dev.com/settings/account", + "notificationsUrl": "https://connect.topcoder-dev.com/notifications", + "allProjectsUrl": "https://connect.topcoder-dev.com/projects", + "expiredProjectUrl": "https://connect.topcoder-dev.com/projects/17236", + "platformUrl": "https://platform.topcoder-dev.com/taas/myteams" +} \ No newline at end of file diff --git a/connect-automation/package-lock.json b/connect-automation/package-lock.json index e9d505299..334148055 100644 --- a/connect-automation/package-lock.json +++ b/connect-automation/package-lock.json @@ -1,3643 +1,8 @@ { "name": "connect-app-e2e-test", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "connect-app-e2e-test", - "version": "1.0.0", - "dependencies": { - "@types/node": "^12.7.8", - "exceljs": "^4.2.0", - "jasmine": "^3.4.0", - "jasmine-reporters": "^2.3.2", - "jsdom": "^15.1.1", - "lodash": "^4.17.19", - "mail-listener2": "^0.3.1", - "moment": "^2.29.1", - "papaparse": "^5.3.0", - "protractor": "^7.0.0", - "protractor-beautiful-reporter": "^1.2.8", - "topcoder-testing-lib": "git+https://github.com/topcoder-platform/topcoder-testing-lib.git#develop", - "tslint-config-prettier": "^1.18.0", - "typescript": "^3.5.3", - "webdriver-manager": "^12.1.7", - "winston": "^3.2.1" - }, - "devDependencies": { - "@types/jasmine": "^3.3.16", - "@types/jasminewd2": "^2.0.6", - "@types/lodash": "^4.14.159", - "rimraf": "^2.6.3", - "tslint": "^5.18.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.12.13" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "node_modules/@babel/highlight": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", - "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", - "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@fast-csv/format": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", - "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" - } - }, - "node_modules/@fast-csv/format/node_modules/@types/node": { - "version": "14.14.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz", - "integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==" - }, - "node_modules/@fast-csv/parse": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", - "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/@fast-csv/parse/node_modules/@types/node": { - "version": "14.14.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz", - "integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==" - }, - "node_modules/@types/jasmine": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.3.tgz", - "integrity": "sha512-5QKAG8WfC9XrOgYLXPrxv1G2IIUE6zDyzTWamhNWJO0LqPRUbZ0q0zGHDhDJ7MpFloUuyME/jpBIdPjq3/P3jA==", - "dev": true - }, - "node_modules/@types/jasminewd2": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", - "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", - "dev": true, - "dependencies": { - "@types/jasmine": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.168", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", - "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", - "dev": true - }, - "node_modules/@types/node": { - "version": "12.19.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.16.tgz", - "integrity": "sha512-7xHmXm/QJ7cbK2laF+YYD7gb5MggHIIQwqyjin3bpEGiSuvScMQ5JZZXPvRipi1MwckTQbJZROMns/JxdnIL1Q==" - }, - "node_modules/@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=" - }, - "node_modules/@types/selenium-webdriver": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", - "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==" - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/addressparser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=" - }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "engines": { - "node": ">=0.3.0" - } - }, - "node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/archiver": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.2.0.tgz", - "integrity": "sha512-QEAKlgQuAtUxKeZB9w5/ggKXh21bZS+dzzuQ0RPBC20qtDCbTyzqmisoeJP46MP39fg4B4IcyvR+yeyEBdblsQ==", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.0", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.0.0", - "tar-stream": "^2.1.4", - "zip-stream": "^4.0.4" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "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==" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big-integer": { - "version": "1.6.48", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", - "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, - "node_modules/bl": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.4.tgz", - "integrity": "sha512-7tdr4EpSd7jJ6tuQ21vu2ke8w7pNEstzj1O8wwq6sNNzO3UDi5MA8Gny/gquCj7r2C6fHudg8tKRGyjRgmvNxQ==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "blocking-proxy": "built/lib/bin.js" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" - }, - "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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browserstack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", - "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", - "dependencies": { - "https-proxy-agent": "^2.2.1" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dependencies": { - "traverse": ">=0.3.0 <0.4" - } - }, - "node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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/circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", - "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", - "dependencies": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" - } - }, - "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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "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==" - }, - "node_modules/color-string": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", - "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/colorspace": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", - "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", - "dependencies": { - "color": "3.0.x", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/compress-commons": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.0.2.tgz", - "integrity": "sha512-qhd32a9xgzmpfoga1VQEiLEwdKZ6Plnpx5UCgIsf89FSolyJ7WnifY4Gtjgv5WR6hWAyRaHxC5MiEhU/38U70A==", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/crc-32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", - "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", - "dependencies": { - "exit-on-epipe": "~1.0.1", - "printj": "~1.1.0" - }, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", - "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/cross-spawn/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", - "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" - } - }, - "node_modules/dayjs": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.4.tgz", - "integrity": "sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==" - }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" - }, - "node_modules/del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dependencies": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dependencies": { - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exceljs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-4.2.0.tgz", - "integrity": "sha512-r0/ClXRs3cQmMGJOQY6/ymnZSBSzeJL/LjAlKjY75ev1iQgf0LcmeFfTqFTFK0fADLAWieOMXe7abPoGYWI6hA==", - "dependencies": { - "archiver": "^5.0.0", - "dayjs": "^1.8.34", - "fast-csv": "^4.3.1", - "jszip": "^3.5.0", - "readable-stream": "^3.6.0", - "saxes": "^5.0.1", - "tmp": "^0.2.0", - "unzipper": "^0.10.11", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/exit-on-epipe": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", - "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-csv": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", - "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", - "dependencies": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - }, - "engines": { - "node": ">=10.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==" - }, - "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==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" - }, - "node_modules/fecha": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", - "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dependencies": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz", - "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==" - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "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": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dependencies": { - "whatwg-encoding": "^1.0.1" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "node_modules/imap": { - "version": "0.8.19", - "resolved": "https://registry.npmjs.org/imap/-/imap-0.8.19.tgz", - "integrity": "sha1-NniHOTSrCc6mukh0HyhNoq9Z2NU=", - "dependencies": { - "readable-stream": "1.1.x", - "utf7": ">=1.0.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/imap/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/imap/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/imap/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "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", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dependencies": { - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/jasmine": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.6.4.tgz", - "integrity": "sha512-hIeOou6y0BgCOKYgXYveQvlY+PTHgDPajFf+vLCYbMTQ+VjAP9+EQv0nuC9+gyCAAWISRFauB1XUb9kFuOKtcQ==", - "dependencies": { - "glob": "^7.1.6", - "jasmine-core": "~3.6.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, - "node_modules/jasmine-core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.6.0.tgz", - "integrity": "sha512-8uQYa7zJN8hq9z+g8z1bqCfdC8eoDAeVnM5sfqs7KHv9/ifoJ500m018fpFc7RDaO6SWCLCXwo/wPSNcdYTgcw==" - }, - "node_modules/jasmine-reporters": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz", - "integrity": "sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A==", - "dependencies": { - "mkdirp": "^0.5.1", - "xmldom": "^0.1.22" - } - }, - "node_modules/jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", - "engines": { - "node": ">= 6.9.x" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "node_modules/jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", - "dependencies": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsdom/node_modules/saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", - "dependencies": { - "xmlchars": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "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==" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "node_modules/jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/jszip": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", - "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "set-immediate-shim": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/klaw-sync": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-2.1.0.tgz", - "integrity": "sha1-PTvNhgDnv971MjHHOf8FOu1WDkQ=", - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dependencies": { - "invert-kv": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" - }, - "node_modules/lodash.isnil": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.isundefined": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "node_modules/logform": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", - "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", - "dependencies": { - "colors": "^1.2.1", - "fast-safe-stringify": "^2.0.4", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "triple-beam": "^1.3.0" - } - }, - "node_modules/mail-listener2": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/mail-listener2/-/mail-listener2-0.3.1.tgz", - "integrity": "sha1-GBRJfZYy/Y6vTjywg6qQEpZh+ok=", - "dependencies": { - "async": "^0.9.0", - "imap": "~0.8.14", - "mailparser": "~0.4.6" - } - }, - "node_modules/mail-listener2/node_modules/async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - }, - "node_modules/mailparser": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-0.4.9.tgz", - "integrity": "sha1-HQpI1vqqovCawTmO0CPY746xnis=", - "dependencies": { - "encoding": ">=0.1.4", - "mime": "*", - "mimelib": ">=0.2.17", - "uue": "~1.0.0" - } - }, - "node_modules/map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dependencies": { - "p-defer": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dependencies": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mime": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", - "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "dependencies": { - "mime-db": "1.45.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimelib": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.3.1.tgz", - "integrity": "sha1-eHrdJBXYJ6yzr27EvKHqlZZBiFM=", - "dependencies": { - "addressparser": "~1.0.1", - "encoding": "~0.1.12" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dependencies": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/papaparse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.0.tgz", - "integrity": "sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg==" - }, - "node_modules/parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/printj": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", - "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==", - "bin": { - "printj": "bin/printj.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "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==" - }, - "node_modules/protractor": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", - "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", - "dependencies": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.1.7", - "yargs": "^15.3.1" - }, - "bin": { - "protractor": "bin/protractor", - "webdriver-manager": "bin/webdriver-manager" - }, - "engines": { - "node": ">=10.13.x" - } - }, - "node_modules/protractor-beautiful-reporter": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/protractor-beautiful-reporter/-/protractor-beautiful-reporter-1.3.6.tgz", - "integrity": "sha512-lALPJJV8li3AqweEfKcXSRBK/QSe82FyB13b1+6NQvrAkE6YyoZ91pYg1ZNUcaZU0HO+pPAmbF4mfW+5FLvieg==", - "dependencies": { - "circular-json": "^0.3.1", - "fs-extra": "^3.0.1", - "klaw-sync": "^2.1.0", - "mkdirp": "~0.3.5" - } - }, - "node_modules/protractor-beautiful-reporter/node_modules/mkdirp": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", - "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" - }, - "node_modules/protractor/node_modules/jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", - "dependencies": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, - "node_modules/protractor/node_modules/jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=" - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.1.tgz", - "integrity": "sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA==", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/request-promise-native/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dependencies": { - "https-proxy-agent": "^2.2.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dependencies": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/selenium-webdriver/node_modules/tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dependencies": { - "os-tmpdir": "~1.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "engines": { - "node": "*" - } - }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/topcoder-testing-lib": { - "resolved": "git+ssh://git@github.com/topcoder-platform/topcoder-testing-lib.git#a5a1ebf0b5fce818fc38339af4d0106fe5a79974", - "dependencies": { - "@types/node": "^12.7.8", - "jsdom": "^15.1.1", - "protractor": "^5.4.2", - "typescript": "^3.5.3", - "winston": "^3.2.1" - } - }, - "node_modules/topcoder-testing-lib/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "engines": { - "node": ">=4" - } - }, - "node_modules/topcoder-testing-lib/node_modules/cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/topcoder-testing-lib/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/topcoder-testing-lib/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "node_modules/topcoder-testing-lib/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/topcoder-testing-lib/node_modules/jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", - "dependencies": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, - "node_modules/topcoder-testing-lib/node_modules/jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=" - }, - "node_modules/topcoder-testing-lib/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/topcoder-testing-lib/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/topcoder-testing-lib/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "engines": { - "node": ">=4" - } - }, - "node_modules/topcoder-testing-lib/node_modules/protractor": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", - "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", - "dependencies": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.0.6", - "yargs": "^12.0.5" - }, - "bin": { - "protractor": "bin/protractor", - "webdriver-manager": "bin/webdriver-manager" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/topcoder-testing-lib/node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "node_modules/topcoder-testing-lib/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/topcoder-testing-lib/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/topcoder-testing-lib/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/topcoder-testing-lib/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/topcoder-testing-lib/node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/topcoder-testing-lib/node_modules/wrap-ansi/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/topcoder-testing-lib/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/topcoder-testing-lib/node_modules/yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dependencies": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "node_modules/topcoder-testing-lib/node_modules/yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - }, - "node_modules/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tslint": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", - "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - } - }, - "node_modules/tslint-config-prettier": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", - "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", - "bin": { - "tslint-config-prettier-check": "bin/check.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/tslint/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslint/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/tslint/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/tslint/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", - "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf7": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utf7/-/utf7-1.0.2.tgz", - "integrity": "sha1-lV9JCq5lO6IguUVqCod2wZk2CZE=", - "dependencies": { - "semver": "~5.3.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/uue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uue/-/uue-1.0.0.tgz", - "integrity": "sha1-ITuUSLmLmLnQPK9gGiI1ib2IZDA=" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "dependencies": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dependencies": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/webdriver-manager": { - "version": "12.1.8", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", - "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", - "dependencies": { - "adm-zip": "^0.4.9", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - }, - "bin": { - "webdriver-manager": "bin/webdriver-manager" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" - }, - "node_modules/winston": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", - "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", - "dependencies": { - "@dabh/diagnostics": "^2.0.2", - "async": "^3.1.0", - "is-stream": "^2.0.0", - "logform": "^2.2.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.4.0" - }, - "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/winston-transport": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", - "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", - "dependencies": { - "readable-stream": "^2.3.7", - "triple-beam": "^1.2.0" - }, - "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/winston-transport/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/winston/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/ws": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.3.tgz", - "integrity": "sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA==", - "engines": { - "node": ">=8.3.0" - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", - "engines": { - "node": ">=0.1" - } - }, - "node_modules/y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/zip-stream": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.4.tgz", - "integrity": "sha512-a65wQ3h5gcQ/nQGWV1mSZCEzCML6EK/vyVPcrPNynySP1j3VBbQKh3nhC8CbORb+jfl2vXvh56Ul5odP1bAHqw==", - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.0.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - } - }, "dependencies": { "@babel/code-frame": { "version": "7.12.13", @@ -5883,14 +2248,6 @@ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -5916,6 +2273,14 @@ } } }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", diff --git a/connect-automation/package.json b/connect-automation/package.json index 8e2205add..1eaed3baf 100644 --- a/connect-automation/package.json +++ b/connect-automation/package.json @@ -35,7 +35,7 @@ "webdriver-update": "node node_modules/protractor/bin/webdriver-manager update", "pretest": "npm run webdriver-update && npm run clean && npm run tsc", "test": "protractor temp/conf.js", - "lint": "npx tslint --project ." + "lint": "npx tslint --project . --fix" }, "keywords": [ "protractor", diff --git a/connect-automation/page-objects/common-page/common.helper.ts b/connect-automation/page-objects/common-page/common.helper.ts index 09842d546..f7e5215e2 100644 --- a/connect-automation/page-objects/common-page/common.helper.ts +++ b/connect-automation/page-objects/common-page/common.helper.ts @@ -1,4 +1,5 @@ import moment = require('moment'); +import { browser, protractor } from 'protractor' import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; import * as appconfig from '../../config/app-config.json'; import { logger } from '../../logger/logger'; @@ -31,6 +32,14 @@ const waitUntil = async ( ); }; +const alertBoxXpath = '//div[@class="s-alert-box-inner"]/span'; +const closeIconXpath = '//span[@class="s-alert-close"]'; +const projectTableXpath = '//div[@class="flex-data"]'; +const customerProjectsXpath = '//div[@class="project-header-details"]'; +const contentWrapperXpath = '//div[@class="twoColsLayout-contentInner"]'; +const milestoneXpath = "//th[contains(text(),'MILESTONE')]"; +const addNewMilestonesXpath = "//button[contains(text(),'Add New Milestone')]"; + export const CommonHelper = { /** * Log in browser @@ -53,6 +62,7 @@ export const CommonHelper = { await LoginPageHelper.logout(); } catch (e) { await BrowserHelper.restart(); + await this.listenersCleanup(); } }, @@ -132,11 +142,9 @@ export const CommonHelper = { * @param value value to fill */ async fillInputField(el: TcElementImpl, value: string) { - el.click(); - await BrowserHelper.sleep(100); - el.clear(); - await BrowserHelper.sleep(100); - el.sendKeys(value); + await el.click(); + await el.clear(); + await el.sendKeys(value); }, /** @@ -188,7 +196,6 @@ export const CommonHelper = { async navigateToAllProjectsPage() { await BrowserHelper.open(ConfigHelper.getAllProjectsUrl()); await CommonHelper.waitForPageDisplayed(); - await BrowserHelper.sleep(5000); }, /** @@ -220,6 +227,20 @@ export const CommonHelper = { return ElementHelper.getElementByClassName('loading-indicator'); }, + /** + * Get Loading Indicator + */ + get projectList() { + return ElementHelper.getElementByXPath(projectTableXpath) + }, + + /** + * Get Content Wrapper + */ + get contentWrapper() { + return ElementHelper.getElementByXPath(contentWrapperXpath) + }, + /** * Wait for project title to appear */ @@ -260,37 +281,11 @@ export const CommonHelper = { * @param isCustomer true if current logged in user had customer role */ async goToRecentlyCreatedProject(isCustomer = false) { - await BrowserHelper.sleep(40000); - await BrowserHelper.waitUntilVisibilityOf(await this.firstProject(isCustomer)); - const title = await this.firstProject(isCustomer); - await BrowserHelper.waitUntilClickableOf(title); - await title.click(); - }, - - /** - * Get Alert Box Element - */ - alertBox() { - return ElementHelper.getElementByClassName('s-alert-box-inner'); - }, - - /** - * Get Success Alert Span - */ - successAlert() { - return ElementHelper.getElementByTag('span', this.alertBox()); - }, - - /** - * Wait for success alert to show - */ - async waitForSuccessAlert(target: TcElementImpl) { - await CommonHelper.waitUntilVisibilityOf( - () => target, - 'Wait for success alert message', - true - ); - logger.info('Success Alert Displayed'); + await BrowserHelper.open(ConfigHelper.getHomePageUrl()); + await BrowserHelper.sleep(5000); + isCustomer ? await this.waitForCustomerProjects() : await this.waitForProjectsToGetLoaded(); + const testElement = await this.firstProject(isCustomer); + await testElement.click(); }, /** @@ -301,15 +296,6 @@ export const CommonHelper = { await targetEl.click(); }, - /** - * Verify success alert shows correct message - * @param expectedText expected success text to appear - */ - async verifySuccessAlert(expectedText: string) { - await this.waitForSuccessAlert(this.alertBox()); - expect(await this.successAlert().getText()).toBe(expectedText); - }, - /** * Necessary input format for calendar input */ @@ -327,21 +313,20 @@ export const CommonHelper = { /** * Wait for Page Element to be displayed */ - async waitForElementToGetDisplayed(element) { + async waitForElementToGetDisplayed(webElement: TcElement) { await CommonHelper.waitUntilVisibilityOf( - () => element, + () => webElement, 'Wait for Element To get Displayed', true ); - return element; + return webElement; }, /** * Get Alert Box */ get getAlertBox() { - BrowserHelper.sleep(1000); - return ElementHelper.getElementByXPath('//div[@class="s-alert-box-inner"]/span'); + return ElementHelper.getElementByXPath(alertBoxXpath); }, /** @@ -352,26 +337,187 @@ export const CommonHelper = { * * @returns Either True or False */ - async isElementPresent(identifierType: string, identifierValue: string) { - let isElementPresent = true; - let element: TcElementImpl; - try { - switch(identifierType.toLowerCase()) { - case 'xpath': element = ElementHelper.getElementByXPath(identifierValue); break; - } - const isElementDisplayed = await element.isDisplayed(); - const isElementEnabled = await element.isEnabled(); - isElementPresent = (isElementDisplayed && isElementEnabled) ? true: false; - } catch(error) { - isElementPresent = false; - } - return isElementPresent; + async isElementPresent(identifierType: string, identifierValue: string) { + let isElementPresent = true; + let webElement: TcElementImpl; + try { + switch (identifierType.toLowerCase()) { + case 'xpath': webElement = ElementHelper.getElementByXPath(identifierValue); break; + } + const isElementDisplayed = await webElement.isDisplayed(); + const isElementEnabled = await webElement.isEnabled(); + isElementPresent = (isElementDisplayed && isElementEnabled) ? true : false; + } catch (error) { + isElementPresent = false; + } + return isElementPresent; }, /** * Get Join Project Button */ get joinProjectButton() { - return ElementHelper.getElementByButtonText('Join project'); + return ElementHelper.getElementByButtonText('Join project'); + }, + + getDate(incrementBy = 0) { + let dd: string; + let mm: string; + let yyyy: string; + const today = new Date(); + if (incrementBy === 0) { + dd = today.getDate().toString(); + mm = (today.getMonth() + 1).toString(); + yyyy = today.getFullYear().toString(); + } else { + const incrementalDate = new Date(); + incrementalDate.setDate(incrementalDate.getDate() + incrementBy); + dd = incrementalDate.getDate().toString(); + mm = (incrementalDate.getMonth() + 1).toString(); + yyyy = incrementalDate.getFullYear().toString(); + } + return [dd, mm, yyyy]; + }, + + /** + * Checks if element is present or not on page + * + * @param identifierType Type of Identifier + * @param identifierValue Identifier Value to search + * + * @returns Either True or False + */ + async waitForElementToBeVisible(identifierType: string, identifierValue: string, verifyText = false) { + let webElement: TcElementImpl; + let count = 0; + + while (true) { + try { + switch (identifierType.toLowerCase()) { + case 'xpath': webElement = ElementHelper.getElementByXPath(identifierValue); break; + } + const isElementDisplayed = await webElement.isDisplayed(); + const isElementEnabled = await webElement.isEnabled(); + const text = (await webElement.getText()).trim(); + let textVerification = true; + if (verifyText) { + textVerification = text.length !== 0 ? true : false; + } + if (isElementDisplayed && isElementEnabled && textVerification) { + break; + } + } catch (error) { + continue; + } + if (count > appconfig.Timeout.PageLoad) { + break; + } + await BrowserHelper.sleep(100); + count++; + } + return webElement; + }, + + /** + * Get Alert Message And Close Popup + * + * @returns Alert Message + */ + async getAlertMessageAndClosePopup() { + await this.waitForElementToBeVisible('xpath', alertBoxXpath, true); + const message = await this.getAlertBox.getText(); + try { + await ElementHelper.getElementByXPath(closeIconXpath).click(); + } catch (Error) { logger.info("Popup already closed.") } + + await BrowserHelper.sleep(500); + return message; + }, + + /** + * Matches element text from the list of elements and clicks on that element + * + * @param list List of Elements + * @param value Value to match with element text + */ + async searchTextFromListAndClick(list: any, value: string, clickUsingActions = false) { + const isClicked = false; + const size = list.length + for (let index = 0; index < size; index++) { + await list[index].getText().then(async (text: string) => { + if (text === value) { + if (clickUsingActions) { + browser.actions().mouseMove(list[index]).sendKeys(protractor.Key.ENTER).perform(); + } else { + list[index].click(); + } + await BrowserHelper.sleep(1000); + logger.info(`Clicked on ${value}`); + } + }) + if (isClicked) { + break; + } + } + }, + + async waitForProjectsToGetLoaded() { + await this.waitForElementToBeVisible('xpath', projectTableXpath, true); + }, + + async waitForCustomerProjects() { + await this.waitForElementToBeVisible('xpath', customerProjectsXpath, true); + }, + + async waitForListToGetLoaded(identifierType: string, identifierValue: string, listSize = 1) { + let webElementsList: any; + let count = 0; + + while (true) { + try { + switch (identifierType.toLowerCase()) { + case 'xpath': webElementsList = await ElementHelper.getAllElementsByXPath(identifierValue); break; + } + const size = await webElementsList.length; + if (size > listSize) { + break; + } + } catch (error) { + continue; + } + if (count > appconfig.Timeout.PageLoad) { + break; + } + await BrowserHelper.sleep(100); + count++; + } }, + + async listenersCleanup() { + logger.info(`Running ${this.listenersCleanup.name} ...`); + const exitListeners = process.listeners("exit"); + const exitListenersFn = exitListeners.map((f) => f.toString()); + + exitListeners.forEach((listener: any, index: number) => { + if (exitListenersFn.indexOf(listener.toString()) !== index) { + process.removeListener('exit', listener); + } + }); + logger.info(`\tDone!`); + }, + + /** + * Wait for milestone page loads + */ + async waitForMilestones() { + await this.waitForElementToBeVisible('xpath', milestoneXpath, true); + }, + + /** + * Wait for add new milestones button loads + */ + async waitForAddNewMilestones() { + await this.waitForElementToBeVisible('xpath', addNewMilestonesXpath, true); + } }; + diff --git a/connect-automation/page-objects/login/login.helper.ts b/connect-automation/page-objects/login/login.helper.ts index 1088bf4f2..78523e102 100644 --- a/connect-automation/page-objects/login/login.helper.ts +++ b/connect-automation/page-objects/login/login.helper.ts @@ -35,7 +35,6 @@ export class LoginPageHelper { */ public static async logout() { await this.loginPageObject.logout(); - await BrowserHelper.sleep(5000); } private static loginPageObject: LoginPage; diff --git a/connect-automation/page-objects/login/login.po.ts b/connect-automation/page-objects/login/login.po.ts index 929d83744..1cceae006 100644 --- a/connect-automation/page-objects/login/login.po.ts +++ b/connect-automation/page-objects/login/login.po.ts @@ -18,6 +18,11 @@ export class LoginPage { */ public async logout() { await BrowserHelper.open(ConfigHelper.getLogoutUrl()); + await BrowserHelper.waitUntilClickableOf( + this.startAProjectButton, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); logger.info('user logged out'); } @@ -49,16 +54,30 @@ export class LoginPage { return ElementHelper.getElementByClassName('auth0-lock-widget'); } + /** + * Get Username field + */ + public get loginWindow() { + return ElementHelper.getElementById('hiw-login-container'); + } + + /** + * Get Start A Project button + */ + public get startAProjectButton() { + return ElementHelper.getElementByXPath('//a[contains(@class, "tc-btn-primary")]'); + } + /** * Wait for the login form to be displayed */ - public async waitForLoginForm() { + public async waitForLoginForm() { // Wait until login form appears - await BrowserHelper.sleep(8000); - CommonHelper.waitUntilVisibilityOf( - () => this.loginForm, - 'Wait for login form', - true + await CommonHelper.waitForElementToGetDisplayed(this.loginWindow) + await BrowserHelper.waitUntilClickableOf( + this.loginButton, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable ); logger.info('Login Form Displayed'); } diff --git a/connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.helper.ts b/connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.helper.ts deleted file mode 100644 index 29717ffd2..000000000 --- a/connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.helper.ts +++ /dev/null @@ -1,76 +0,0 @@ -import * as moment from 'moment'; -import { BrowserStack } from 'protractor/built/driverProviders'; -import { BrowserHelper } from 'topcoder-testing-lib'; -import { logger } from '../../../logger/logger'; -import { CommonHelper } from '../../common-page/common.helper'; -import { IPhaseCreationData } from './create-new-phase.model'; -import { CreateNewPhasePageObject } from './create-new-phase.po'; - -export class CreateNewPhaseHelper { - /** - * Initialize Create New Phase page object - */ - public static initialize() { - this.createNewPhasePageObject = new CreateNewPhasePageObject(); - } - - /** - * Verify whether user can create a phase and publish it. - * @param formData phase creation form data defined in test data - */ - public static async verifyCreateNewPhase(formData: IPhaseCreationData) { - // If user is invited to project, click on "Join Project" to proceed. - await BrowserHelper.sleep(4000); - if (await CommonHelper.joinProjectButton.isPresent()) { - await CommonHelper.joinProjectButton.click(); - } - - await this.clickOnAddNewPhaseButton(); - await this.fillCreatePhaseForm(formData.title, formData.daysBetweenStartAndEndDate); - - await BrowserHelper.sleep(3000); - await this.createNewPhasePageObject.publishButton.click(); - - const alertElement = CommonHelper.alertBox(); - await CommonHelper.waitForSuccessAlert(alertElement); - expect(await CommonHelper.successAlert().getText()).toBe( - `PROJECT PHASE CREATED.` - ); - } - - private static createNewPhasePageObject: CreateNewPhasePageObject; - - /** - * Click Add New Phase button, verify phase creation screen appearance - */ - private static async clickOnAddNewPhaseButton() { - await BrowserHelper.waitUntilClickableOf(this.createNewPhasePageObject.addNewPhaseButton); - await this.createNewPhasePageObject.addNewPhaseButton.click(); - // Phase creation form should appear - const newPhaseFormElement = this.createNewPhasePageObject.phaseCreationForm; - await BrowserHelper.waitUntilPresenceOf(newPhaseFormElement); - expect(newPhaseFormElement).toBeDefined(); - } - - /** - * Put the phase name, start date and end date to phase creation form - * @param title form phase name - * @param daysBetweenStartAndEndDate number of days between start and end date. default to 3 days. - */ - private static async fillCreatePhaseForm(title: string, daysBetweenStartAndEndDate = 3) { - // Fill title field - const titleWithDate = CommonHelper.appendDate(title); - await this.createNewPhasePageObject.titleInput.sendKeys(titleWithDate); - logger.info(`Filled title field with: ${titleWithDate}`); - - // Fill start date field - const startDate = moment().format(CommonHelper.dateFormat()); - await this.createNewPhasePageObject.startDateInput().sendKeys(startDate); - logger.info(`Filled start date field with: ${startDate.slice(2)}`); - - // Fill end date field - const endDate = moment().add(daysBetweenStartAndEndDate, 'days').format(CommonHelper.dateFormat()); - await this.createNewPhasePageObject.endDateInput().sendKeys(endDate); - logger.info(`Filled end date field with: ${endDate.slice(2)}`); - } -} diff --git a/connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.model.ts b/connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.model.ts deleted file mode 100644 index c41a7901a..000000000 --- a/connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.model.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface IPhaseCreationData { - title: string; - daysBetweenStartAndEndDate?: number; - reportName: string; - deliverableReviewName: string; - finalDeliverableReviewName: string; -} \ No newline at end of file diff --git a/connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.po.ts b/connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.po.ts deleted file mode 100644 index 78d37bda8..000000000 --- a/connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.po.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { ElementHelper } from 'topcoder-testing-lib'; -export class CreateNewPhasePageObject { - /** - * Get Add New Phase Button - */ - public get addNewPhaseButton() { - return ElementHelper.getElementByButtonText('Add New Phase'); - } - - /** - * Get Project Creation Form - */ - public get phaseCreationForm() { - return ElementHelper.getElementByClassName('_1jLI3q'); - } - - /** - * Get title input - */ - public get titleInput() { - return ElementHelper.getElementByName('title'); - } - - /** - * Get name input - * @param appendix numeric indicator of added milestone form - */ - public nameInput(appendix?: string) { - return ElementHelper.getElementByName(`name_${appendix}`); - } - - /** - * Get start date input - * @param appendix numeric indicator of added milestone form - */ - public startDateInput(appendix?: string) { - const inputName = appendix ? `startDate_${appendix}` : 'startDate'; - return ElementHelper.getElementByName(inputName); - } - - /** - * Get end date input - * @param appendix numeric indicator of added milestone form - */ - public endDateInput(appendix?: string) { - const inputName = appendix ? `endDate_${appendix}` : 'endDate'; - return ElementHelper.getElementByName(inputName); - } - - /** - * Get Type Input - */ - public async allTypeInput() { - return ElementHelper.getAllElementsByClassName('react-select-container'); - } - - /** - * Select option from type field dropdown - * @param option desired option - */ - public getOptionFromTypeDropdown(option: string) { - return ElementHelper.getElementByCssContainingText('.react-select__option', option); - } - - /** - * Get Add Milestone Button - */ - public get addMilestoneButton() { - return ElementHelper.getElementByButtonText('Add Milestone'); - } - - /** - * Get Publish Button - */ - public get publishButton() { - return ElementHelper.getElementByButtonText('Publish'); - } -} diff --git a/connect-automation/page-objects/profile-update/my-profile/my-profile.helper.ts b/connect-automation/page-objects/profile-update/my-profile/my-profile.helper.ts index 0ac58669e..147bb694b 100644 --- a/connect-automation/page-objects/profile-update/my-profile/my-profile.helper.ts +++ b/connect-automation/page-objects/profile-update/my-profile/my-profile.helper.ts @@ -1,7 +1,8 @@ import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import * as appconfig from '../../../config/app-config.json'; import { logger } from '../../../logger/logger'; -import { CommonHelper } from '../../common-page/common.helper'; import { ConfigHelper } from '../../../utils/config-helper'; +import { CommonHelper } from '../../common-page/common.helper'; import { IUserProfile } from './my-profile.model'; import { MyProfilePageObject } from './my-profile.po'; @@ -19,7 +20,11 @@ export class MyProfilePageHelper { public static async open() { await MyProfilePageObject.open(); await CommonHelper.waitForPageDisplayed(); - await BrowserHelper.sleep(5000); + await BrowserHelper.waitUntilClickableOf( + this.myProfilePageObject.firstNameField, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); } /** @@ -119,11 +124,9 @@ export class MyProfilePageHelper { public static async updateCountryDropdown(country: string) { const el = await this.myProfilePageObject.countryField(); await el.click(); - await BrowserHelper.sleep(200); const selectOption = await this.myProfilePageObject.selectTextFromDropDown( country ); - await BrowserHelper.sleep(200); logger.info(`Updated Country Field: ${country}`); await selectOption.click(); } @@ -144,8 +147,7 @@ export class MyProfilePageHelper { await this.myProfilePageObject.submitButton.click(); // Wait until Success Alert Message Appears - const alertElement = this.myProfilePageObject.successAlert; - await CommonHelper.waitForSuccessAlert(alertElement); + await CommonHelper.getAlertMessageAndClosePopup(); } /** @@ -177,10 +179,15 @@ export class MyProfilePageHelper { await this.updateProfileInformation(userProfile); - await BrowserHelper.sleep(1000); // Go To User Profile Page Again await this.open(); + await BrowserHelper.waitUntilClickableOf( + this.myProfilePageObject.myProfileSettingsForm, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); + const firstName = await this.myProfilePageObject.getFirstNameValue(); const lastName = await this.myProfilePageObject.getLastNameValue(); const title = await this.myProfilePageObject.getTitleValue(); diff --git a/connect-automation/page-objects/profile-update/my-profile/my-profile.po.ts b/connect-automation/page-objects/profile-update/my-profile/my-profile.po.ts index 110953af0..30bbb316f 100644 --- a/connect-automation/page-objects/profile-update/my-profile/my-profile.po.ts +++ b/connect-automation/page-objects/profile-update/my-profile/my-profile.po.ts @@ -1,8 +1,9 @@ import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { TcElementImpl } from '../../../node_modules/topcoder-testing-lib/dist/src/tc-element-impl'; + import { logger } from '../../../logger/logger'; -import { TcElementImpl } from 'topcoder-testing-lib/dist/src/tc-element-impl'; -import { CommonHelper } from '../../common-page/common.helper'; import { ConfigHelper } from '../../../utils/config-helper'; +import { CommonHelper } from '../../common-page/common.helper'; export class MyProfilePageObject { /** @@ -149,15 +150,6 @@ export class MyProfilePageObject { return ElementHelper.getElementByButtonText('Save settings'); } - /** - * Get Success Alert Span - */ - public get successAlert() { - return CommonHelper.findElementByText( - 'span', - 'Settings successfully saved.' - ); - } /** * Find Selected Text From Dropdown Menu * @param text string @@ -192,4 +184,8 @@ export class MyProfilePageObject { public get businessPhoneDropdown() { return ElementHelper.getElementByClassName('dropdown-menu-list'); } + + public get myProfileSettingsForm() { + return ElementHelper.getElementByXPath('//form[@class="profile-settings-form"]'); + } } diff --git a/connect-automation/page-objects/project-creation-flow/create-project/create-project.helper.ts b/connect-automation/page-objects/project-creation-flow/create-project/create-project.helper.ts index 6b073c476..410e3dd97 100644 --- a/connect-automation/page-objects/project-creation-flow/create-project/create-project.helper.ts +++ b/connect-automation/page-objects/project-creation-flow/create-project/create-project.helper.ts @@ -18,7 +18,6 @@ export class CreateProjectPageHelper { public static async open() { await CreateProjectPageObject.open(); await CommonHelper.waitForPageDisplayed(); - // await BrowserHelper.sleep(5000); } /** @@ -57,10 +56,10 @@ export class CreateProjectPageHelper { await this.fillRequirementForm(taasData.answers, taasData.email); await this.createProjectPageObject.submitJobRequest.click(); - await CommonHelper.verifySuccessAlert(`PROJECT '${taasData.title.toUpperCase()}' CREATED`); + const message = await CommonHelper.getAlertMessageAndClosePopup(); + expect(message).toContain(`PROJECT '${taasData.title.toUpperCase()}' CREATED`); await this.createProjectPageObject.viewTalentRequestButton.click(); - await BrowserHelper.sleep(10000); await CommonHelper.verifyPageUrl(ConfigHelper.getPlatformUrl()); } @@ -234,15 +233,16 @@ export class CreateProjectPageHelper { await dropdownInputs[1].click(); dropdownOptions = await this.createProjectPageObject.dropdownOptions(); - await BrowserHelper.sleep(200); await dropdownOptions[6].click(); await this.createProjectPageObject.editorTextarea.click(); await this.createProjectPageObject.editorTextareaInput.sendKeys(description); await this.createProjectPageObject.skillsInput.click(); - await BrowserHelper.sleep(2500); - await this.createProjectPageObject.multiSelectOption.click(); + await CommonHelper.waitForListToGetLoaded('xpath', this.createProjectPageObject.multiSelectOptionClassName, 2); + + const elements = await this.createProjectPageObject.multiSelectOption; + await elements[1].click(); await this.createProjectPageObject.nextButton.click(); @@ -308,7 +308,7 @@ export class CreateProjectPageHelper { */ private static async verifyAddJobItem() { await this.createProjectPageObject.plusIcon.click(); - let jobFormNumber = await this.createProjectPageObject.taasJobForm(); + const jobFormNumber = await this.createProjectPageObject.taasJobForm(); expect(jobFormNumber.length).toBe(2); } diff --git a/connect-automation/page-objects/project-creation-flow/create-project/create-project.po.ts b/connect-automation/page-objects/project-creation-flow/create-project/create-project.po.ts index 3594e252a..f55ea2289 100644 --- a/connect-automation/page-objects/project-creation-flow/create-project/create-project.po.ts +++ b/connect-automation/page-objects/project-creation-flow/create-project/create-project.po.ts @@ -4,13 +4,6 @@ import { ConfigHelper } from '../../../utils/config-helper'; import { CommonHelper } from '../../common-page/common.helper'; export class CreateProjectPageObject { - /** - * Open the Home page - */ - public static async open() { - await BrowserHelper.open(ConfigHelper.getHomePageUrl()); - logger.info('User navigated to Home Page'); - } /** * Get New Project Button @@ -50,16 +43,6 @@ export class CreateProjectPageObject { return ElementHelper.getElementByTag('h1', parentEl); } - /** - * Get Select Button - */ - public async selectButton() { - const selectButtons = await ElementHelper.getAllElementsByButtonText( - 'Select' - ); - return selectButtons[0]; - } - /** * Get Your Project Button */ @@ -174,13 +157,6 @@ export class CreateProjectPageObject { return ElementHelper.getElementByCss('.ZALPRV._1SfKng'); } - /** - * Get taas job form - */ - public async taasJobForm() { - return ElementHelper.getAllElementsByClassName('_3mAtc-'); - } - /** * Get sub title */ @@ -191,55 +167,81 @@ export class CreateProjectPageObject { } /** - * Get number input elements + * Get editor textarea */ - public async numberInputEls() { - const els = await ElementHelper.getAllElementsByCss('.tc-file-field__inputs.trlMaU'); - return els; + public get editorTextarea() { + return ElementHelper.getElementByClassName('te-editor-section'); } /** - * Get dropdown elements + * Get editor textarea input */ - public async dropdownEls() { - const els = await ElementHelper.getAllElementsByCss('.dropdown-wrap.SelectDropdown.default'); - return els; + public get editorTextareaInput() { + return ElementHelper.getElementByCss('.tui-editor-contents.tui-editor-contents-placeholder'); } /** - * Get dropdown options + * Get skills input */ - public async dropdownOptions() { - const els = await ElementHelper.getAllElementsByClassName('dropdown-menu-list-item'); - return els; + public get skillsInput() { + return ElementHelper.getElementByCss('.css-1hwfws3.react-select__value-container.react-select__value-container--is-multi'); } /** - * Get editor textarea + * Get multi select option */ - public get editorTextarea() { - return ElementHelper.getElementByClassName('te-editor-section'); + public get multiSelectOption() { + return ElementHelper.getAllElementsByXPath(this.multiSelectOptionClassName); } /** - * Get editor textarea input + * Open the Home page */ - public get editorTextareaInput() { - return ElementHelper.getElementByCss('.tui-editor-contents.tui-editor-contents-placeholder'); + public static async open() { + await BrowserHelper.open(ConfigHelper.getHomePageUrl()); + logger.info('User navigated to Home Page'); } + public multiSelectOptionClassName = '//div[contains(@class, "css-fk865s-option react-select__option")]'; /** - * Get skills input + * Get Select Button */ - public get skillsInput() { - return ElementHelper.getElementByCss('.css-1hwfws3.react-select__value-container.react-select__value-container--is-multi'); + public async selectButton() { + const selectButtons = await ElementHelper.getAllElementsByButtonText( + 'Select' + ); + return selectButtons[0]; } /** - * Get multi select option + * Get taas job form */ - public get multiSelectOption() { - return ElementHelper.getElementByCss('.css-fk865s-option.react-select__option'); + public async taasJobForm() { + return ElementHelper.getAllElementsByClassName('_3mAtc-'); + } + + /** + * Get number input elements + */ + public async numberInputEls() { + const els = await ElementHelper.getAllElementsByCss('.tc-file-field__inputs.trlMaU'); + return els; + } + + /** + * Get dropdown elements + */ + public async dropdownEls() { + const els = await ElementHelper.getAllElementsByCss('.dropdown-wrap.SelectDropdown.default'); + return els; + } + + /** + * Get dropdown options + */ + public async dropdownOptions() { + const els = await ElementHelper.getAllElementsByClassName('dropdown-menu-list-item'); + return els; } /** diff --git a/connect-automation/page-objects/project-creation-flow/invite-copilot/invite-copilot.helper.ts b/connect-automation/page-objects/project-creation-flow/invite-copilot/invite-copilot.helper.ts index c337d6535..f104ce701 100644 --- a/connect-automation/page-objects/project-creation-flow/invite-copilot/invite-copilot.helper.ts +++ b/connect-automation/page-objects/project-creation-flow/invite-copilot/invite-copilot.helper.ts @@ -1,4 +1,5 @@ import { BrowserHelper } from 'topcoder-testing-lib'; +import * as appconfig from '../../../config/app-config.json'; import { CommonHelper } from '../../common-page/common.helper'; import { InviteCopilotPageObject } from './invite-copilot.po'; @@ -16,7 +17,6 @@ export class InviteCopilotHelper { public static async open() { await InviteCopilotPageObject.open(); await CommonHelper.waitForPageDisplayed(); - // await BrowserHelper.sleep(8000); } /** @@ -36,7 +36,6 @@ export class InviteCopilotHelper { */ private static async clickOnManageLink() { await CommonHelper.waitAndClickElement(this.inviteCopilotPageObject.manageCopilotLink); - await BrowserHelper.sleep(2000); } /** @@ -46,15 +45,16 @@ export class InviteCopilotHelper { private static async sendInvitationToCopilot(copilotHandle: string) { const inputField = this.inviteCopilotPageObject.inviteInputField; await this.inviteCopilotPageObject.dropdownElement.click(); - await BrowserHelper.sleep(200); await inputField.sendKeys(copilotHandle); await this.inviteCopilotPageObject.selectedOption.click(); + await BrowserHelper.waitUntilClickableOf( + this.inviteCopilotPageObject.sendInviteButton, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); await this.inviteCopilotPageObject.sendInviteButton.click(); - const alertElement = CommonHelper.alertBox(); - await CommonHelper.waitForSuccessAlert(alertElement); - expect(await CommonHelper.successAlert().getText()).toBe( - `YOU'VE SUCCESSFULLY INVITED MEMBER(S).` - ); + const message = await CommonHelper.getAlertMessageAndClosePopup(); + expect(message).toEqual(`YOU'VE SUCCESSFULLY INVITED MEMBER(S).`); } } diff --git a/connect-automation/page-objects/project-creation-flow/projects/projects.helper.ts b/connect-automation/page-objects/project-creation-flow/projects/projects.helper.ts index 417fbddb5..2092148d3 100644 --- a/connect-automation/page-objects/project-creation-flow/projects/projects.helper.ts +++ b/connect-automation/page-objects/project-creation-flow/projects/projects.helper.ts @@ -1,5 +1,7 @@ import _ = require('lodash'); import { BrowserHelper } from 'topcoder-testing-lib'; +import * as appconfig from '../../../config/app-config.json'; +import { logger } from '../../../logger/logger'; import { CommonHelper } from '../../common-page/common.helper'; import { ISearchProject } from './projects.model'; import { ProjectsPageObject } from './projects.po'; @@ -18,7 +20,7 @@ export class ProjectsHelper { public static async open() { await ProjectsPageObject.open(); await CommonHelper.waitForPageDisplayed(); - await BrowserHelper.sleep(4000); + await CommonHelper.waitForProjectsToGetLoaded(); } /** @@ -27,17 +29,18 @@ export class ProjectsHelper { public static async verifyCopilotProjectJoin() { // Go to Recently created project await CommonHelper.goToRecentlyCreatedProject(); - await BrowserHelper.sleep(4000); // Click on Join Project button + await BrowserHelper.waitUntilClickableOf( + CommonHelper.joinProjectButton, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); await CommonHelper.joinProjectButton.click(); - const alertElement = CommonHelper.alertBox(); - await CommonHelper.waitForSuccessAlert(alertElement); // Verify Success Alert - expect(await CommonHelper.successAlert().getText()).toBe( - `YOU'VE SUCCESSFULLY JOINED THE PROJECT.` - ); + const message = await CommonHelper.getAlertMessageAndClosePopup(); + expect(message).toEqual(`YOU'VE SUCCESSFULLY JOINED THE PROJECT.`); } /** @@ -45,9 +48,11 @@ export class ProjectsHelper { * @param searchProject object for search */ public static async verifyProjectSearch(searchProject: ISearchProject) { - await BrowserHelper.sleep(3000); const allProjectsBeforeSearch = await this.projectsPageObject.projectTitles(); const beforeSearchLength = allProjectsBeforeSearch.length; + + await CommonHelper.waitForProjectsToGetLoaded(); + const firstProjectBeforeSearch = await allProjectsBeforeSearch[0].getText(); // Search by project name @@ -65,7 +70,19 @@ export class ProjectsHelper { // Search by Handle await this.projectsPageObject.fillSearchBar(searchProject.searchByHandle); await this.verifyProjectSearchByHandle(searchProject.searchByHandle); + await BrowserHelper.waitUntilClickableOf( + this.projectsPageObject.clearButton, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); await this.clickCancelButton(); + await BrowserHelper.sleep(2000); + + await BrowserHelper.waitUntilClickableOf( + this.projectsPageObject.loadMoreNoMoreLabel, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); const allProjectsAfterSearch = await this.projectsPageObject.projectTitles(); @@ -101,16 +118,53 @@ export class ProjectsHelper { ]; tabNames.map(async (currentTab, index) => { - await BrowserHelper.sleep(1000); - const activeTab = await this.projectsPageObject.tabElement(currentTab); - await activeTab.click(); - const currentUrl = await BrowserHelper.getCurrentUrl(); + const currentUrl = await this.waitForTabProjectsToLoad(currentTab, expectedLinkStatuses[index]); expect(currentUrl).toContain(expectedLinkStatuses[index]); }); } private static projectsPageObject: ProjectsPageObject; + private static async waitForTabProjectsToLoad(currentTab: string, linkToCheck: string) { + let loopCount = 0; + + const activeTab = await this.projectsPageObject.tabElement(currentTab); + await BrowserHelper.waitUntilClickableOf( + this.projectsPageObject.loadMoreNoMoreLabel, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); + + const previousText = await this.projectsPageObject.loadMoreNoMoreLabel.getText(); + await activeTab.click(); + + await BrowserHelper.waitUntilClickableOf( + this.projectsPageObject.loadMoreNoMoreLabel, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); + + while (true) { + try { + if (loopCount > appconfig.Timeout.ElementClickable) { + break; + } + loopCount++; + + const currentText = await this.projectsPageObject.loadMoreNoMoreLabel.getText(); + const currentUrl = await BrowserHelper.getCurrentUrl(); + if (currentText !== previousText && currentUrl.includes(linkToCheck)) { + break; + } else if (currentText === previousText && currentUrl.includes(linkToCheck)) { + break; + } + } catch { + continue; + } + } + return BrowserHelper.getCurrentUrl(); + } + /** * Verify all projects * @param searchTerm search term @@ -121,7 +175,6 @@ export class ProjectsHelper { const projectName = await project.getText(); expect(projectName.toLowerCase()).toContain(searchTerm); }); - await BrowserHelper.sleep(1000); } /** @@ -129,11 +182,8 @@ export class ProjectsHelper { * @param searchTerm search term */ private static async verifyProjectWithRef(searchTerm: string) { - await BrowserHelper.sleep(5000); const ref = await this.projectsPageObject.refText.getText(); expect(ref).toBe(searchTerm); - - await BrowserHelper.sleep(1000); } /** @@ -141,7 +191,6 @@ export class ProjectsHelper { */ private static async clickCancelButton() { await this.projectsPageObject.clearButton.click(); - await BrowserHelper.sleep(1000); } /** @@ -149,12 +198,13 @@ export class ProjectsHelper { * @param memberHandle member handle from test data */ private static async verifyProjectSearchByHandle(memberHandle: string) { - await CommonHelper.goToRecentlyCreatedProject(); + await BrowserHelper.sleep(5000); + const firstProject = await CommonHelper.firstProject(); + await firstProject.click(); await BrowserHelper.waitUntilVisibilityOf(this.projectsPageObject.firstMember); - expect(await this.projectsPageObject.firstMember.getText()).toBe( + expect(await this.projectsPageObject.firstMember.getText()).toContain( memberHandle ); await this.projectsPageObject.backButton.click(); - await BrowserHelper.sleep(5000); } } diff --git a/connect-automation/page-objects/project-creation-flow/projects/projects.po.ts b/connect-automation/page-objects/project-creation-flow/projects/projects.po.ts index 442e4e4f4..795241608 100644 --- a/connect-automation/page-objects/project-creation-flow/projects/projects.po.ts +++ b/connect-automation/page-objects/project-creation-flow/projects/projects.po.ts @@ -4,13 +4,6 @@ import { ConfigHelper } from '../../../utils/config-helper'; import { CommonHelper } from '../../common-page/common.helper'; export class ProjectsPageObject { - /** - * Open the Home page - */ - public static async open() { - await BrowserHelper.open(ConfigHelper.getHomePageUrl()); - logger.info('User navigated to Home Page'); - } /** * Get Search Input @@ -33,6 +26,48 @@ export class ProjectsPageObject { return ElementHelper.getElementByClassName('search-bar__clear'); } + /** + * Get Project Dashboard Element + */ + public get projectDashboard() { + const parentEl = ElementHelper.getElementByClassName('WtXOeL _3rjDL1'); + return ElementHelper.getElementContainingText('Dashboard', parentEl); + } + + /** + * Get first member's element + */ + public get firstMember() { + return ElementHelper.getElementByXPath('(//div[@class="members"])[1]'); + } + + /** + * Get back to dashboard button + */ + public get backButton() { + return ElementHelper.getElementByClassName('_3Ielx-'); + } + + /** + * Get ref containing element + */ + public get refText() { + return ElementHelper.getElementByXPath('(//span[@class="txt-gray-md"])[1]'); + } + + public get loadMoreNoMoreLabel() { + return ElementHelper.getElementByXPath(this.loadMoreNoMoreLabelXpath); + } + + /** + * Open the Home page + */ + public static async open() { + await BrowserHelper.open(ConfigHelper.getHomePageUrl()); + logger.info('User navigated to Home Page'); + } + public loadMoreNoMoreLabelXpath = '//div[@class="gridview-load-more"]/button | //div[@class="gridview-no-more"]'; + /** * Get All Projects By Title */ @@ -48,7 +83,8 @@ export class ProjectsPageObject { const searchInput = this.searchInput; await CommonHelper.fillInputField(searchInput, inputText); await this.searchButton.click(); - await BrowserHelper.sleep(1000); + + await BrowserHelper.sleep(2000); } /** @@ -64,14 +100,6 @@ export class ProjectsPageObject { ); } - /** - * Get Project Dashboard Element - */ - public get projectDashboard() { - const parentEl = ElementHelper.getElementByClassName('WtXOeL _3rjDL1'); - return ElementHelper.getElementContainingText('Dashboard', parentEl); - } - /** * Get Active Tab Element */ @@ -79,25 +107,4 @@ export class ProjectsPageObject { const tabNames = ElementHelper.getAllElementsByClassName('_2ZbGEn E7SY3s'); return tabNames[0]; } - - /** - * Get first member's element - */ - public get firstMember() { - return ElementHelper.getElementByClassName('GV60ta'); - } - - /** - * Get back to dashboard button - */ - public get backButton() { - return ElementHelper.getElementByClassName('_3Ielx-'); - } - - /** - * Get ref containing element - */ - public get refText() { - return ElementHelper.getElementByClassName('txt-gray-md'); - } } diff --git a/connect-automation/page-objects/project-milestone/project-milestone.helper.ts b/connect-automation/page-objects/project-milestone/project-milestone.helper.ts new file mode 100644 index 000000000..9448d9d24 --- /dev/null +++ b/connect-automation/page-objects/project-milestone/project-milestone.helper.ts @@ -0,0 +1,554 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import * as config from '../../config/app-config.json'; +import { logger } from '../../logger/logger'; +import { CommonHelper } from '../common-page/common.helper'; +import { LoginPage } from '../login/login.po'; +import { IProjectMilestone } from './project-milestone.model'; +import { ProjectMilestonePageObject } from './project-milestone.po'; + +let milestoneName: string; +let milestoneDescription: string; +let startDate: string[]; +let endDate: string[]; + +export class ProjectMilestonePageHelper { + /** + * Initialize Create Project Milestone page object + */ + public static initialize() { + this.projectMilestonePageObject = new ProjectMilestonePageObject(); + this.loginPageObject = new LoginPage(); + } + + /** + * Open Home page + * + * @param isCustomer is cusomter + */ + public static async open(isCustomer: boolean = false) { + await CommonHelper.goToRecentlyCreatedProject(isCustomer); + await CommonHelper.waitForPageDisplayed(); + + await BrowserHelper.waitUntilClickableOf( + this.projectMilestonePageObject.dashboardPageLoad, + config.Timeout.ElementClickable, + config.LoggerErrors.ElementClickable + ); + } + + /** + * Verify that User can Create / Edit / Delete Milestone + * + * @param projectMilestones Test Data for the test + */ + public static async verifyUserCanCreateEditDeleteMilestone(projectMilestones: IProjectMilestone) { + await CommonHelper.waitForAddNewMilestones(); + await this.addMilestones(projectMilestones, 1, projectMilestones.active); + + await this.projectMilestonePageObject.getEditButton(milestoneName).click(); + logger.info('Clicked On Edit Button'); + + milestoneName = milestoneName + "EDITED"; + milestoneDescription = milestoneDescription + "EDITED"; + startDate = CommonHelper.getDate(3); + endDate = CommonHelper.getDate(5); + + // await this.clickAddNewMilestoneButtonAndVerifyTitle(projectMilestones); + + await this.specifyMilestoneDetails(milestoneName, milestoneDescription, startDate, endDate, projectMilestones.active); + + const saveButton = await this.projectMilestonePageObject.saveButton(); + await saveButton.click(); + logger.info('Save button clicked.'); + + const isVerified = await this.verifyMileStoneDetails(milestoneName, milestoneDescription, startDate, endDate, projectMilestones.active); + expect(isVerified).toEqual(true); + logger.info('Verified Milestone Details Edited Successfully.'); + + const beforeDeletionCount = (await this.projectMilestonePageObject.milestoneTableRows).length; + logger.info(`Before Deletion Milestone Length ${beforeDeletionCount}`); + + await this.projectMilestonePageObject.getDeleteButton(milestoneName).click(); + logger.info('Clicked Delete Button'); + + const popupMessage = await this.projectMilestonePageObject.popupMessage.getText(); + expect(popupMessage).toContain(projectMilestones.deleteConfirmation); + expect(popupMessage).toContain(projectMilestones.deletePopupMessage); + logger.info(`Verified Popup Message ${popupMessage}`); + + await this.projectMilestonePageObject.yesButton.click(); + logger.info('Clicked Yes button'); + + // Verify Alert Message + const milestoneDeletionMessage = await CommonHelper.getAlertMessageAndClosePopup(); + expect(milestoneDeletionMessage).toEqual(projectMilestones.milestoneDeletionMessage); + logger.info(`Verified Milestone Deletion Message ${milestoneDeletionMessage}`); + + const afterDeletionCount = (await this.projectMilestonePageObject.milestoneTableRows).length; + logger.info(`After Deletion Milestone Length ${afterDeletionCount}`); + + expect(afterDeletionCount).toBeLessThan(beforeDeletionCount); + logger.info('Verified Milestone After Deletion Count is Less than before Deletion'); + } + + /** + * Specify Milestone Details + * @param mName Milestone Name + * @param mDescription Milestone Description + * @param mStartDate Milestone Start Date + * @param mEndDate Milestone End Date + * @param status Milestone Status + */ + public static async specifyMilestoneDetails(mName: string, mDescription: string, mStartDate: string[], mEndDate: string[], status: string) { + const milestoneNameElement = this.projectMilestonePageObject.milestoneNameTextbox; + await milestoneNameElement.clear(); + await milestoneNameElement.sendKeys(mName); + logger.info(`Specified Milestone Name ${mName}`); + + const milestoneDescElement = this.projectMilestonePageObject.milestoneDescriptionTextbox; + await milestoneDescElement.clear(); + await milestoneDescElement.sendKeys(mDescription); + logger.info(`Specified Milestone Description ${mDescription}`); + + // const startDateValue = mStartDate[0]+mStartDate[1]+mStartDate[2]; + // await this.projectMilestonePageObject.milestoneStartDateTextbox.sendKeys(startDateValue); + // logger.info(`Specified Start Date ${startDateValue}`); + + // const endDateValue = mEndDate[0]+mEndDate[1]+mEndDate[2]; + // await this.projectMilestonePageObject.milestoneEndDateTextbox.sendKeys(endDateValue); + // logger.info(`Specified End Date ${endDateValue}`); + + await this.projectMilestonePageObject.milestoneDropdown.click(); + await CommonHelper.waitForElementToBeVisible('xpath', this.projectMilestonePageObject.milestoneListXpath); + const list = await this.projectMilestonePageObject.milestoneList; + for (const milestone of list) { + const name = await milestone.getText(); + if (name === status) { + await milestone.click(); + logger.info(`Milestone Status ${status} selected.`); + break; + } + } + } + + public static async addNewMilestone(projectMilestones: IProjectMilestone, status: string) { + await BrowserHelper.waitUntilClickableOf( + this.projectMilestonePageObject.getAddButton(), + config.Timeout.ElementClickable, + config.LoggerErrors.ElementClickable + ); + + await this.clickAddNewMilestoneButtonAndVerifyTitle(projectMilestones); + + await this.specifyMilestoneDetails(milestoneName, milestoneDescription, startDate, endDate, status); + logger.info(`Specified Milestone Details`); + + const saveButton = await this.projectMilestonePageObject.saveButton(); + await saveButton.click(); + logger.info('Clicked on Save button'); + + const milestoneCreationMessage = await CommonHelper.getAlertMessageAndClosePopup(); + expect(milestoneCreationMessage).toEqual(projectMilestones.milestoneCreationMessage); + logger.info(`Verified Milestone creating message ${milestoneCreationMessage}`); + + const isVerified = await this.verifyMileStoneDetails(milestoneName, milestoneDescription, startDate, endDate, status); + expect(isVerified).toEqual(true); + logger.info('Verified Newly created milestone details'); + } + + /** + * Click Add New Milestone Button and Verify Title + * + * @param projectMilestones Test Data for the test + */ + public static async clickAddNewMilestoneButtonAndVerifyTitle(projectMilestones: IProjectMilestone) { + await this.projectMilestonePageObject.getAddButton().click(); + logger.info("Clicked on Add New Milestone button"); + + const pageTitle = await this.projectMilestonePageObject.milestonesPageTitle.getText(); + expect(pageTitle).toBe(projectMilestones.milestone); + logger.info(`Verified Milestone Page Title $${pageTitle}`); + + const addButton = await this.projectMilestonePageObject.getAddButton().getText(); + expect(addButton).toBe(projectMilestones.addButton); + logger.info(`Verified Add New Milestone Button $${addButton}`); + } + + /** + * Verify Milestone Details + * + * @param mName Milestone Name + * @param mDescription Milestone Description + * @param mStartDate Milestone Start Date + * @param mEndDate Milestone End Date + * @param status Status + * + * @returns True / False + */ + public static async verifyMileStoneDetails(mName: string, mDescription: string, mStartDate: string[], mEndDate: string[], status: string) { + let isVerified = false; + const list = await this.projectMilestonePageObject.milestoneTableRows + for (const milestoneRow of list) { + const row = await milestoneRow.getText(); + if (row.includes(mName)) { + expect(row).toContain(mName); + logger.info(`Verified Milestone Name ${mName}`); + expect(row).toContain(mDescription); + logger.info(`Verified Milestone Description ${mDescription}`); + expect(row).toContain(status); + logger.info(`Verified Milestone Status ${status}`); + // expect(row).toContain(`${mStartDate[1]}-${mStartDate[0]}-${mStartDate[2]}`); + // logger.info(`Verified Start Date ${mStartDate[1]}-${mStartDate[0]}-${mStartDate[2]}`); + // expect(row).toContain(`${mEndDate[1]}-${mEndDate[0]}-${mEndDate[2]}`); + // logger.info(`Verified End Date ${mStartDate[1]}-${mStartDate[0]}-${mStartDate[2]}`); + isVerified = true; + break; + } + } + return isVerified; + } + + /** + * Verify User Can Add Copilot On Milestone + * + * @param projectMilestones Test Data for the test + */ + public static async verifyUserCanAddCopilotOnMilestone(projectMilestones: IProjectMilestone) { + await CommonHelper.waitForAddNewMilestones(); + milestoneName = CommonHelper.appendDate(projectMilestones.milestone); + milestoneDescription = CommonHelper.appendDate(projectMilestones.description); + startDate = CommonHelper.getDate(); + endDate = CommonHelper.getDate(2); + + await this.clickAddNewMilestoneButtonAndVerifyTitle(projectMilestones); + + await this.specifyMilestoneDetails(milestoneName, milestoneDescription, startDate, endDate, projectMilestones.active); + + await this.projectMilestonePageObject.getAddCopilotButton(milestoneName).click(); + logger.info('Click on Add Copilot button'); + await CommonHelper.waitForElementToBeVisible('xpath', this.projectMilestonePageObject.copilotManagementWindowTitleXpath); + + const copilotManagementWindowTitle = await this.projectMilestonePageObject.copilotManagementWindowTitle.getText(); + expect(copilotManagementWindowTitle).toEqual(projectMilestones.copilot); + logger.info(`Verified Copilot Management Window Title ${copilotManagementWindowTitle}`); + + await this.projectMilestonePageObject.copilotDropdown.click(); + await this.projectMilestonePageObject.copilotTextbox.sendKeys(projectMilestones.copilotName); + await CommonHelper.searchTextFromListAndClick(await this.projectMilestonePageObject.copilotList, projectMilestones.copilotName, true); + + await BrowserHelper.waitUntilClickableOf( + this.projectMilestonePageObject.getAddButton(2), + config.Timeout.ElementClickable, + config.LoggerErrors.ElementClickable + ); + + await this.projectMilestonePageObject.getAddButton(2).click(); + logger.info('Clicked on Add Button'); + + const copilotNameLabelValue = await this.projectMilestonePageObject.copilotNameLabel.getText(); + expect(copilotNameLabelValue).toEqual(projectMilestones.copilotName); + logger.info(`Verified Copilot Name Label Value ${copilotNameLabelValue}`); + + await this.projectMilestonePageObject.closeIcon.click(); + logger.info('Clicked Close Icon'); + + const saveButton = await this.projectMilestonePageObject.saveButton(); + await saveButton.click(); + logger.info('Clicked Save Icon'); + + const milestoneCreationMessage = await CommonHelper.getAlertMessageAndClosePopup(); + expect(milestoneCreationMessage).toEqual(projectMilestones.milestoneCreationMessage); + logger.info(`Verified Milestone Creation Message ${milestoneCreationMessage}`); + + const isVerified = await this.verifyMileStoneDetails(milestoneName, milestoneDescription, startDate, endDate, projectMilestones.active); + expect(isVerified).toEqual(true); + logger.info('Verified Milestone Details Successfully.'); + + await CommonHelper.waitForElementToBeVisible('xpath', this.projectMilestonePageObject.copilotImageXpath.replace('MILESTONE_NAME', milestoneName)); + const copilotImageName = await this.projectMilestonePageObject.getCopilotImage(milestoneName).getAttribute("alt"); + expect(copilotImageName).toEqual(projectMilestones.copilotName); + logger.info(`Copilot Image Verified with attribute ${copilotImageName}`); + } + + /** + * Verify User Can Bulk Update the milestone + * + * @param projectMilestones Test data for the test + * @param milestoneNames List of Milestones to be updated + */ + public static async verifyUserCanBulkUpdateTheMilestone(projectMilestones: IProjectMilestone) { + const beforeRowDates = await this.getDateDetailsForAvailableMilestones(); + + await this.projectMilestonePageObject.milestoneSelectAllCheckbox.click(); + logger.info('Click on Milestone Select All checkbox'); + + const message = await this.projectMilestonePageObject.projectSelectedLabel.getText(); + expect(message).toContain(projectMilestones.projectsSelected); + logger.info(`Verified Message ${message}`); + + await this.projectMilestonePageObject.addCopilotButton.click(); + logger.info(`Clicked On Add Copilot Icon`); + + await CommonHelper.waitForElementToBeVisible('xpath', this.projectMilestonePageObject.copilotManagementWindowTitleXpath); + const copilotManagementWindowTitle = await this.projectMilestonePageObject.copilotManagementWindowTitle.getText(); + expect(copilotManagementWindowTitle).toEqual(projectMilestones.copilot); + logger.info(`Verified Copilot Management Window Title ${copilotManagementWindowTitle}`); + + await this.projectMilestonePageObject.copilotDropdown.click(); + await this.projectMilestonePageObject.copilotTextbox.sendKeys(projectMilestones.copilotName); + await CommonHelper.searchTextFromListAndClick(await this.projectMilestonePageObject.copilotList, projectMilestones.copilotName, true); + logger.info(`Selected Copilot from the list ${projectMilestones.copilotName}`); + await this.projectMilestonePageObject.getAddButton(2).click(); + + const copilotNameLabelValue = await this.projectMilestonePageObject.copilotNameLabel.getText(); + expect(copilotNameLabelValue).toEqual(projectMilestones.copilotName); + logger.info(`Verified Copilot Name Label Value ${copilotNameLabelValue}`); + + await this.projectMilestonePageObject.closeIcon.click(); + logger.info('Clicked Close Icon'); + + await this.projectMilestonePageObject.moveMilestoneButton.click(); + logger.info('Clicked Move Milestone Icon'); + + await BrowserHelper.waitUntilClickableOf( + this.projectMilestonePageObject.moveMilestonePopupMessage, + config.Timeout.ElementClickable, + config.LoggerErrors.ElementClickable + ); + const moveMilestonePopupMessage = await this.projectMilestonePageObject.moveMilestonePopupMessage.getText(); + expect(moveMilestonePopupMessage).toContain(projectMilestones.moveMilestoneDatesTitle); + expect(moveMilestonePopupMessage).toContain(projectMilestones.moveMilestoneDatesDescription); + logger.info(`Verified Move Milestone Popup Message: ${moveMilestonePopupMessage}`); + + const moveMilestoneInputBoxElement = this.projectMilestonePageObject.moveMilestoneInputBox; + moveMilestoneInputBoxElement.clear(); + moveMilestoneInputBoxElement.sendKeys(projectMilestones.noOfDays); + logger.info(`Specified Value ${projectMilestones.noOfDays} in Move Milestone Textbox`); + + await this.projectMilestonePageObject.getMoveMilestoneButton().click(); + logger.info('Clicked on Move Milestone button'); + + const afterRowDates = await this.getDateDetailsForAvailableMilestones(); + await this.verifyMilestoneDatesAfterMovingDates(beforeRowDates, afterRowDates, projectMilestones.noOfDays); + + await this.projectMilestonePageObject.deleteMilestoneButton.click(); + logger.info('Clicked on Move Milestone Delete button'); + + await BrowserHelper.waitUntilClickableOf( + this.projectMilestonePageObject.moveMilestonePopupMessage, + config.Timeout.ElementClickable, + config.LoggerErrors.ElementClickable + ); + const popupMessage = await this.projectMilestonePageObject.popupMessage.getText(); + expect(popupMessage).toContain(projectMilestones.deleteConfirmation); + expect(popupMessage).toContain(projectMilestones.deletePopupMessage); + logger.info(`Verified Delete Milestone Popup Message: ${popupMessage}`); + + await this.projectMilestonePageObject.yesButton.click(); + logger.info('Clicked Yes button'); + + const milestoneDeletionMessage = await CommonHelper.getAlertMessageAndClosePopup(); + expect(milestoneDeletionMessage).toEqual(projectMilestones.milestoneDeletionMessage); + logger.info(`Verified Delete Milestone Message ${milestoneDeletionMessage}`); + } + + /** + * Adds a new Milestone + * + * @param projectMilestones Test Data for Adding Milestone + * @param count No. of Milestones to add + * @param status Milestone Status + * + * @returns Names of Milestones created + */ + public static async addMilestones(projectMilestones: IProjectMilestone, count: any, status: string) { + const milestoneNames = []; + + for (let cnt = 0; cnt < count; cnt++) { + milestoneName = CommonHelper.appendDate(projectMilestones.milestone); + milestoneDescription = CommonHelper.appendDate(projectMilestones.description); + startDate = CommonHelper.getDate(cnt); + endDate = CommonHelper.getDate(cnt + 2); + + await this.addNewMilestone(projectMilestones, status); + milestoneNames.push(milestoneName); + } + + return milestoneNames; + } + + /** + * Verify Add Milestone Button and Draft Milestone Should not be displayed for Customer + * + * @param projectMilestones Test Data for the test + * + * @param customerUser Customer User Details + */ + public static async verifyAddMilestoneButtonAndDraftMilestoneShouldNotBeDisplayed(projectMilestones: IProjectMilestone, customerUser: any) { + // await this.addMilestones(projectMilestones, 1, projectMilestones.active); + await this.addMilestones(projectMilestones, 1, projectMilestones.inReview); + await this.addMilestones(projectMilestones, 1, projectMilestones.inReview); + await this.addMilestones(projectMilestones, 1, projectMilestones.draft); + + await this.loginPageObject.logout(); + + await CommonHelper.login(customerUser.email, customerUser.password); + logger.info('Logged in using Customer User'); + + await this.open(true); + + const isAddButtonPresent = await CommonHelper.isElementPresent('xpath', this.projectMilestonePageObject.addNewMilestoneXpath); + expect(isAddButtonPresent).toEqual(false); + logger.info('Verified Add Button is Not Visible for Customer User'); + + const isDraftMilestonePresent = await CommonHelper.isElementPresent('xpath', this.projectMilestonePageObject.milestoneStatusXpath); + expect(isDraftMilestonePresent).toEqual(false); + logger.info('Verified Draft Milestone Created by Copilot User s Not Visible for Customer User'); + } + + /** + * Deletes All Milestones Present + * + * @param projectMilestones Test Data for the test + */ + public static async deleteAllMilestones(projectMilestones: IProjectMilestone) { + await CommonHelper.waitForMilestones(); + await BrowserHelper.waitUntilClickableOf( + this.projectMilestonePageObject.getAddButton(), + config.Timeout.ElementClickable, + config.LoggerErrors.ElementClickable + ); + + await this.projectMilestonePageObject.milestoneSelectAllCheckbox.click().then(async () => { + logger.info('Click on Milestone Select All checkbox'); + + await this.projectMilestonePageObject.deleteMilestoneButton.click(); + logger.info('Clicked on Move Milestone Delete button'); + + await BrowserHelper.waitUntilClickableOf( + this.projectMilestonePageObject.moveMilestonePopupMessage, + config.Timeout.ElementClickable, + config.LoggerErrors.ElementClickable + ); + const popupMessage = await this.projectMilestonePageObject.popupMessage.getText(); + expect(popupMessage).toContain(projectMilestones.deleteConfirmation); + expect(popupMessage).toContain(projectMilestones.deletePopupMessage); + logger.info(`Verified Delete Milestone Popup Message: ${popupMessage}`); + + await this.projectMilestonePageObject.yesButton.click(); + logger.info('Clicked Yes button'); + + const milestoneDeletionMessage = await CommonHelper.getAlertMessageAndClosePopup(); + expect(milestoneDeletionMessage).toEqual(projectMilestones.milestoneDeletionMessage); + logger.info(`Verified Delete Milestone Message ${milestoneDeletionMessage}`); + + await BrowserHelper.waitUntilClickableOf( + this.projectMilestonePageObject.getAddButton(), + config.Timeout.ElementClickable, + config.LoggerErrors.ElementClickable + ); + }).catch((err) => { + logger.info('No Milestones to Delete'); + }); + } + + /** + * Gets Date Details for the Available Milestones + * + * @returns Date Details + */ + public static async getDateDetailsForAvailableMilestones() { + const availableDates = []; + const tableRows = await this.projectMilestonePageObject.milestoneTableRows; + for (const test of tableRows) { + const tableTds = await ElementHelper.getAllElementsByTag("td", test); + for (let innerCnt = 0; innerCnt < tableTds.length; innerCnt++) { + const dateString = await tableTds[innerCnt].getText(); + if (innerCnt === 4) { + availableDates.push(dateString); + } + if (innerCnt === 5) { + availableDates.push(dateString); + break; + } + } + } + return availableDates; + } + + /** + * Verify Date Difference after moving milestone dates + * + * @param beforeRowDates Before Moving Milestone Dates + * @param afterRowDates After Moving Milestone Dates + * @param differenceToCheck Difference number to check + */ + public static async verifyMilestoneDatesAfterMovingDates(beforeRowDates: string[], afterRowDates: string[], differenceToCheck: number) { + for (let cnt = 0; cnt < beforeRowDates.length; cnt++) { + const datesArray1 = beforeRowDates[cnt]; + const datesArray2 = afterRowDates[cnt]; + const date1 = new Date(datesArray1); + const date2 = new Date(datesArray2); + const diffTime = Math.abs(date2.getTime() - date1.getTime()); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + expect(diffDays).toEqual(differenceToCheck); + logger.info(`Verified Date Difference between dates ${date1.getDate()} and ${date2.getDate()} as ${differenceToCheck}`); + } + } + + /** + * approve the milestone which are in review status + */ + public static async takeActionOnMilestone(projectMilestones: IProjectMilestone, customerUser: any, copilotUser: any) { + await CommonHelper.waitForMilestones(); + await this.verifyAddMilestoneButtonAndDraftMilestoneShouldNotBeDisplayed(projectMilestones, customerUser); + await this.approveMilestoneAndVerify() + + await this.loginPageObject.logout(); + + await CommonHelper.login(copilotUser.email, copilotUser.password); + logger.info('Logged in using Copilot User'); + + await this.open(); + const milestoneApproveNotification = this.projectMilestonePageObject.allMilestoneApproveNotification() + await BrowserHelper.waitUntilVisibilityOf(milestoneApproveNotification) + logger.info(`'${await milestoneApproveNotification.getText()}' is displayed on the page.`) + expect(milestoneApproveNotification.getText()).toContain(projectMilestones.allMilestoneApprovedNotificationStr) + await CommonHelper.waitAndClickElement(this.projectMilestonePageObject.getDismissAllMilestoneApprovedNotificationButton()) + logger.info(`The notification alert is dismissed.`) + } + + /** + * approve all milestone with customer role + * @param message + */ + public static async approveMilestoneAndVerify() { + const approveMilestoneButton = await this.projectMilestonePageObject.getAllMilestoneActionButtonsForCustomer('approve') + let numberOfInReviewMilestones = (approveMilestoneButton).length + let index: number = 0; + + logger.info(`Total ${numberOfInReviewMilestones} numbers of milestone found with 'In review' status`) + + const approveMilestoneButton1 = this.projectMilestonePageObject.getMilestoneActionButtonForCustomer('approve') + await BrowserHelper.sleep(2000); + while (numberOfInReviewMilestones !== 0) { + logger.info("Approve milestone button is displayed on the page.") + try { + expect(await BrowserHelper.waitUntilClickableOf(approveMilestoneButton1)) + await CommonHelper.waitAndClickElement(approveMilestoneButton1) + logger.info(`${index + 1} milestone approved.`) + index++ + numberOfInReviewMilestones--; + const approvedAlert = await CommonHelper.getAlertMessageAndClosePopup(); + await BrowserHelper.waitUntilInVisibilityOf(approvedAlert) + } catch (StaleElementReferenceError) { + await BrowserHelper.sleep(4000); + } + } + index = 0; + logger.info("All milestone with 'In review' status are approved.") + } + + private static loginPageObject: LoginPage; + private static projectMilestonePageObject: ProjectMilestonePageObject; +} diff --git a/connect-automation/page-objects/project-milestone/project-milestone.model.ts b/connect-automation/page-objects/project-milestone/project-milestone.model.ts new file mode 100644 index 000000000..515f41cbc --- /dev/null +++ b/connect-automation/page-objects/project-milestone/project-milestone.model.ts @@ -0,0 +1,22 @@ +export interface IProjectMilestone { + milestone: string; + addButton: string; + active: string; + milestoneCreationMessage: string; + description: string; + deleteConfirmation: string; + deletePopupMessage: string; + milestoneDeletionMessage: string; + copilot: string; + copilotName: string; + moveMilestoneDatesTitle: string; + moveMilestoneDatesDescription: string; + move: string; + projectsSelected: string; + noOfDays: number; + draft: string; + inReview:string; + actionOnMilestoneApprove:string; + milestoneApprovedMessageStr:string; + allMilestoneApprovedNotificationStr:string; +} \ No newline at end of file diff --git a/connect-automation/page-objects/project-milestone/project-milestone.po.ts b/connect-automation/page-objects/project-milestone/project-milestone.po.ts new file mode 100644 index 000000000..4465a6169 --- /dev/null +++ b/connect-automation/page-objects/project-milestone/project-milestone.po.ts @@ -0,0 +1,304 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../logger/logger'; +import { ConfigHelper } from '../../utils/config-helper'; + +export class ProjectMilestonePageObject { + + /** + * Get Content Wrapper Element + */ + public get contentWrapper() { + return ElementHelper.getElementByClassName("twoColsLayout-contentInner"); + } + + /** + * Get Dashboard Page + */ + public get dashboardPageLoad() { + return ElementHelper.getElementByXPath('//div[contains(@class, "twoColsLayout-contentInner")]'); + } + + /** + * Get Milestone Page Title + */ + public get milestonesPageTitle() { + return ElementHelper.getElementByXPath('//div[contains(@class,"twoColsLayout-contentInner")]//li/span'); + } + + /** + * Get Milestone Name textbox + */ + public get milestoneNameTextbox() { + return ElementHelper.getElementByXPath('//input[contains(@name, "title-")]'); + } + + /** + * Get Milestone Description Textbox + */ + public get milestoneDescriptionTextbox() { + return ElementHelper.getElementByXPath('//textarea[contains(@name, "description-")]'); + } + + /** + * Get Milestone Table Rows + */ + public get milestoneTableRows() { + return ElementHelper.getAllElementsByXPath('//tbody/tr'); + } + + /** + * Get Popup Message + */ + public get popupMessage() { + return ElementHelper.getElementByXPath('//div[contains(@style, "position: absolute;")]'); + } + + /** + * Get Yes button + */ + public get yesButton() { + return ElementHelper.getElementByXPath('(//div[contains(@style, "position: absolute;")]//button)[1]'); + } + + /** + * Get Management Window Title + */ + public get copilotManagementWindowTitle() { + return ElementHelper.getElementByXPath(this.copilotManagementWindowTitleXpath); + } + + /** + * Get Copilot Dropdown + */ + public get copilotDropdown() { + return ElementHelper.getElementByXPath('//div[@class="right-sidebar-container"]//div[contains(@class, "react-select__control")]'); + } + + /** + * Get Copilot Textbox + */ + public get copilotTextbox() { + return ElementHelper.getElementByXPath('//input[@type="text" and @style]'); + } + + /** + * Get Copilot Name Label + */ + public get copilotNameLabel() { + return ElementHelper.getElementByXPath('(//div[@class="Avatar"]/following-sibling::div/span)[1]'); + } + + /** + * Get Close Icon + */ + public get closeIcon() { + return ElementHelper.getElementByXPath('//h2/button'); + } + + /** + * Get Action Row's first columns + */ + public async actionRow() { + const els = await ElementHelper.getAllElementsByClassName('_2BPUCg'); + return els[0]; + } + + /** + * Get Save button + */ + public async saveButton() { + const actionRow = await this.actionRow(); + return ElementHelper.getElementByCss("button[type='submit']", actionRow); + } + + /** + * Get Milestone SelectAll Checkbox + */ + public get milestoneSelectAllCheckbox() { + return ElementHelper.getElementByXPath('//label[@for="select-all" and not (@class)]'); + } + + /** + * Get Project Selected Label + */ + public get projectSelectedLabel() { + return ElementHelper.getElementByXPath('((//button[contains(@class,"tc-btn-primary tc-btn-sm")])[1]//preceding-sibling::div)[1]'); + } + + /** + * Get Add Copilot Button + */ + public get addCopilotButton() { + return ElementHelper.getElementByXPath('((//button[contains(@class,"tc-btn-primary tc-btn-sm")])[1]//preceding-sibling::div)[4]'); + } + + /** + * Get Copilot List + */ + public get copilotList() { + return ElementHelper.getAllElementsByXPath('//div[contains(@class, "react-select__option")]'); + } + + /** + * Get Move Milestone Button + */ + public get moveMilestoneButton() { + return ElementHelper.getElementByXPath('(//button[contains(@class,"tc-btn-primary tc-btn-sm")])[1]//preceding-sibling::span'); + } + + /** + * Get Move Milestone Popup Message + */ + public get moveMilestonePopupMessage() { + return ElementHelper.getElementByXPath('//div[@data-placement="bottom-end"]'); + } + + /** + * Get Move Milestone Input box + */ + public get moveMilestoneInputBox() { + return ElementHelper.getElementByXPath('//div[@data-placement="bottom-end"]//input'); + } + + /** + * Get Delete Milestone Button + */ + public get deleteMilestoneButton() { + return ElementHelper.getElementByXPath('((//button[contains(@class,"tc-btn-primary tc-btn-sm")])[1]//preceding-sibling::div)[3]'); + } + + /** + * Get Milestone Start Date Text box + */ + public get milestoneStartDateTextbox() { + return ElementHelper.getElementByXPath('//input[contains(@name, "startDate")]'); + } + + /** + * Get Milestone End Text box + */ + public get milestoneEndDateTextbox() { + return ElementHelper.getElementByXPath('//input[contains(@name, "endDate")]'); + } + + /** + * Get Milestone Dropdown + */ + public get milestoneDropdown() { + return ElementHelper.getElementByXPath('//div[contains(@class,"react-select-hiddendropdown-container")]'); + } + + /** + * Get Milestone List + */ + public get milestoneList() { + return ElementHelper.getAllElementsByXPath('//div[contains(@class, "react-select__option")]'); + } + + public milestoneListXpath = '//div[contains(@class , "react-select__menu-list")]'; + public addNewMilestoneXpath = '(//button[contains(@class,"tc-btn-primary tc-btn-sm")])[INDEX]'; + public copilotImageXpath = `//td[contains(text(), "MILESTONE_NAME")]//ancestor::tr//img`; + public copilotManagementWindowTitleXpath = '//div[@class="right-sidebar-container"]//h2'; + public milestoneStatusXpath = '//td[text()="MILESTONE_NAME"]//following-sibling::td/span'; + public actionButtonForCustomerXpath = "//span[.= 'In Review']/parent::td/following-sibling::td//button[contains(@class, '#')]" // assumes action buttons are available for customers for milestone in review status. + + /** + * Get Add Copilot Button + * + * @param milestoneName Milestone Name for the copilot button + */ + public getAddCopilotButton(milestoneName: string) { + return ElementHelper.getElementByXPath(`//input[contains(@value, "${milestoneName}")]//ancestor::tr//button[contains(@class, "tc-btn-default")]`); + } + + /** + * Get Move Milestone Button + * + * @param index Index of the button + */ + public getMoveMilestoneButton(index = 1) { + return ElementHelper.getElementByXPath(`(//div[@data-placement="bottom-end"]//button)[${index}]`); + } + + /** + * Get Add Button + * + * @param index Index of the Add Button (In Case more than one button is present) + */ + public getAddButton(index = 1) { + return ElementHelper.getElementByXPath(this.addNewMilestoneXpath.replace("INDEX", index + "")); + } + + /** + * Get Edit Button + * + * @param milestoneName Edit Button for Milestone + */ + public getEditButton(milestoneName: string) { + return ElementHelper.getElementByXPath(`(//td[text()="${milestoneName}"]/parent::tr//button[@type="button"])[1]`); + } + + /** + * Get Delete Button + * + * @param milestoneName Delete button for Milestone + */ + public getDeleteButton(milestoneName: string) { + return ElementHelper.getElementByXPath(`(//td[text()="${milestoneName}"]/parent::tr//button[@type="button"])[2]`); + } + + /** + * Get Copilot Image + * @param milestoneName Copilot Image for Milestone + * @returns + */ + public getCopilotImage(milestoneName: string) { + return ElementHelper.getElementByXPath(this.copilotImageXpath.replace('MILESTONE_NAME', milestoneName)); + } + + /** + * Get Milestone Status + * + * @param milestoneName State for the Milestone + */ + public getMilestoneStatus(milestoneName: string) { + return ElementHelper.getElementByXPath(this.milestoneStatusXpath); + } + + /** + * @returns Set of all milestone approve/reject buttons + */ + public getAllMilestoneActionButtonsForCustomer(actionRequired: string) { + const actionIndex = (actionRequired === 'approve' ? 'WMNL' : '_2xf0_H') + return ElementHelper.getAllElementsByXPath(this.actionButtonForCustomerXpath.replace('#', actionIndex)) + } + + /** + * @returns milestone approve/reject buttons + */ + public getMilestoneActionButtonForCustomer(actionRequired: string) { + const actionIndex = (actionRequired === 'approve' ? 'WMNL' : '_2xf0_H') + return ElementHelper.getElementByXPath(this.actionButtonForCustomerXpath.replace('#', actionIndex)) + } + + /** + * @returns all milestone approved notification. + */ + public allMilestoneApproveNotification() { + return ElementHelper.getElementByXPath("//div[@class='_309UjB']") + } + + /** + * Get project title + */ + public get projectTitle() { + return ElementHelper.getElementByClassName("project-card") + } + + /** + * @returns **dismiss button** for all milestone approved notification + */ + public getDismissAllMilestoneApprovedNotificationButton() { + return ElementHelper.getElementByXPath("//button/div[.='DISMISS']") + } +} \ No newline at end of file diff --git a/connect-automation/page-objects/project-settings/project-settings.helper.ts b/connect-automation/page-objects/project-settings/project-settings.helper.ts index 0930acf25..3d1a839ed 100644 --- a/connect-automation/page-objects/project-settings/project-settings.helper.ts +++ b/connect-automation/page-objects/project-settings/project-settings.helper.ts @@ -1,5 +1,6 @@ import * as path from 'path'; import { BrowserHelper } from 'topcoder-testing-lib'; +import * as appconfig from '../../config/app-config.json'; import { CommonHelper } from '../common-page/common.helper'; import { ProjectSettingsPageObject } from '../project-settings/project-settings.po'; import { IProjectSettings } from './project-settings.model'; @@ -13,14 +14,27 @@ export class ProjectSettingsPageHelper { } /** - * Open Home page - * @param expired + * Open Expired Project */ - public static async open(expired = false) { - await ProjectSettingsPageObject.open(expired); + public static async openExpiredProject() { + await ProjectSettingsPageObject.openExpiredProject(); + } + + /** + * Open Settings + */ + public static async openSettings() { await CommonHelper.waitForPageDisplayed(); - await BrowserHelper.sleep(10000); await CommonHelper.waitForElementToGetDisplayed(this.projectSettingsPageObject.getProjectMenu('Project Settings')); + + await this.projectSettingsPageObject.getProjectMenu('Project Settings').click(); + + // Waiting for page to get loaded + await BrowserHelper.waitUntilClickableOf( + this.projectSettingsPageObject.projectSettingsForm, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); } /** @@ -29,11 +43,8 @@ export class ProjectSettingsPageHelper { * @param projectSettings Test Data for the test */ public static async editProjectSettings(projectSettings: IProjectSettings) { - // Click on Project Settings Menu - await this.projectSettingsPageObject.getProjectMenu('Project Settings').click(); - // Select Enforce NDA Yes Button - const enforceTopcoderNDARadioButtons = await this.projectSettingsPageObject.enforceTopcoderNDARadioButtons; + const enforceTopcoderNDARadioButtons = await this.projectSettingsPageObject.enforceTopcoderNDARadioButtons(); const index = (projectSettings.enforceTopcoderNDA === 'Yes') ? 0 : 1; await enforceTopcoderNDARadioButtons[index].click(); @@ -48,7 +59,7 @@ export class ProjectSettingsPageHelper { await this.projectSettingsPageObject.saveButton.click(); // Verify the Alert Message - const message = await CommonHelper.getAlertBox.getText(); + const message = await CommonHelper.getAlertMessageAndClosePopup(); expect(message).toBe(projectSettings.projectUpdatedMessage); // Verify the Enforce NDA Yes Button is selected @@ -64,38 +75,32 @@ export class ProjectSettingsPageHelper { * Resets the Project Settings as a pre-requisite for TC001 */ public static async resetSettings() { - // Resetting the project settings - await this.projectSettingsPageObject.getProjectMenu('Project Settings').click(); - - // Waiting for page to get loaded - await BrowserHelper.sleep(5000); - // Resetting Enforce NDA to No - const allProjectsBeforeSearch = await this.projectSettingsPageObject.enforceTopcoderNDARadioButtons; + const allProjectsBeforeSearch = await this.projectSettingsPageObject.enforceTopcoderNDARadioButtons(); await allProjectsBeforeSearch[1].click(); - + await BrowserHelper.sleep(2000); + // Deleting the Existing Intended Work Group if present await this.projectSettingsPageObject.intendedWorkGroupsCloseIcon.click().catch((err) => { // Do Nothing - }); - + }); + // Clicking on Save button if any changes are present - await this.projectSettingsPageObject.saveButton.click().catch((err) => { + await this.projectSettingsPageObject.saveButton.click().then(async () => { + await CommonHelper.getAlertMessageAndClosePopup(); + }).catch((err) => { // Do Nothing - }); - await BrowserHelper.sleep(1000); - + }); + // Navigating to the project URL again - await this.open(); + await CommonHelper.goToRecentlyCreatedProject(); + await this.openSettings(); } /** * Verify Account Expiry Information */ public static async verifyAccountExpiryInformation() { - // Resetting the project settings - await this.projectSettingsPageObject.getProjectMenu('Project Settings').click(); - // Verify that Account Expiry Icon is present const isIconPresent = await CommonHelper.isElementPresent('xpath', this.projectSettingsPageObject.projectSettingsExpiryIcon); expect(isIconPresent).toBe(true); @@ -119,7 +124,7 @@ export class ProjectSettingsPageHelper { const isTabSelected = await this.projectSettingsPageObject.isTabSelected('Files'); expect(isTabSelected).toBe(true); - // Get Current File Count before ading new file + // Get Current File Count before adding new file const previousCount = (await this.projectSettingsPageObject.getCount('Files').getText()).toString(); // Click on Add New Button and Wait for Upload Dialog box to appear @@ -127,7 +132,7 @@ export class ProjectSettingsPageHelper { const fileUploadDialogBox = this.projectSettingsPageObject.fileUploadDialogBox; await CommonHelper.waitForElementToGetDisplayed(fileUploadDialogBox) - // Verify that File Uplodder Window is displayed + // Verify that File Uploader Window is displayed const isIconPresent = await CommonHelper.isElementPresent('xpath', this.projectSettingsPageObject.fileUploadContentArea); expect(isIconPresent).toBe(true); @@ -149,7 +154,7 @@ export class ProjectSettingsPageHelper { await BrowserHelper.waitUntilInVisibilityOf(attachmentOptionsDialogBox) // Verify Alert Message - let message = await CommonHelper.getAlertBox.getText(); + let message = await CommonHelper.getAlertMessageAndClosePopup(); expect(message).toBe(projectSettings.newFileAdditionMessage); // Verify the newly added File Name @@ -158,11 +163,17 @@ export class ProjectSettingsPageHelper { // Get Current Count after adding file const currentCount = (await this.projectSettingsPageObject.getCount('Files').getText()).toString(); - expect(parseInt(currentCount, 10)).toEqual(parseInt(previousCount, 10)+1); + expect(parseInt(currentCount, 10)).toBeGreaterThan(parseInt(previousCount, 10)); // Click on the Assets Library File Name that's newly Added and Verify new tab is opened await this.clickOnLinkAndVerifyNewTab(tagName); + await BrowserHelper.waitUntilClickableOf( + this.projectSettingsPageObject.getGridButton(tagName), + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); + // Click On Grid Button against newly added file and click Edit Link await this.projectSettingsPageObject.getGridButton(tagName).click(); await this.projectSettingsPageObject.getGridEditButton(tagName).click(); @@ -185,7 +196,7 @@ export class ProjectSettingsPageHelper { await this.projectSettingsPageObject.saveChangesButton.click(); // Verify Alert Message - message = await CommonHelper.getAlertBox.getText(); + message = await CommonHelper.getAlertMessageAndClosePopup(); expect(message).toBe(projectSettings.attachmentUpdationSuccessMessage); // Fetch Updated file name from the Files tab @@ -196,7 +207,7 @@ export class ProjectSettingsPageHelper { await this.projectSettingsPageObject.getGridButton(tagName).click(); await this.projectSettingsPageObject.getGridRemoveButton(tagName).click(); - // Verify Delte Popup Title + // Verify Delete Popup Title const deletePopupTitle = (await this.projectSettingsPageObject.editAttachmentWindow.getText()).toString(); expect(deletePopupTitle).toEqual(projectSettings.deletePopupTitle); @@ -208,9 +219,8 @@ export class ProjectSettingsPageHelper { await this.projectSettingsPageObject.deleteFileButton.click(); // Verify Alert Message - const attachmentRemovalMessage = await CommonHelper.getAlertBox.getText(); + const attachmentRemovalMessage = await CommonHelper.getAlertMessageAndClosePopup(); expect(attachmentRemovalMessage).toBe(projectSettings.attachmentRemovalMessage); - await BrowserHelper.sleep(2000); // Verify Files Count after File Deletion const countAfterDeletion = (await this.projectSettingsPageObject.getCount('Files').getText()).toString(); @@ -255,7 +265,7 @@ export class ProjectSettingsPageHelper { await this.projectSettingsPageObject.addLinkButton.click(); // Verify Alert Message - let message = await CommonHelper.getAlertBox.getText(); + let message = await CommonHelper.getAlertMessageAndClosePopup(); expect(message).toBe(projectSettings.linkAttachmentSuccessMessage); // Verify Uploaded link Name @@ -264,11 +274,17 @@ export class ProjectSettingsPageHelper { // Verify Link could should be updated by 1 const currentCount = (await this.projectSettingsPageObject.getCount('Links').getText()).toString(); - expect(parseInt(currentCount, 10)).toEqual(parseInt(previousCount, 10)+1); + expect(parseInt(currentCount, 10)).toEqual(parseInt(previousCount, 10) + 1); // Click on Recently Added Link and Verify new tab is opened await this.clickOnLinkAndVerifyNewTab(tagName); + await BrowserHelper.waitUntilClickableOf( + this.projectSettingsPageObject.getGridButton(tagName), + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); + // Click On Grid Button against newly added Link and click Edit button await this.projectSettingsPageObject.getGridButton(tagName).click(); await this.projectSettingsPageObject.getGridEditButton(tagName).click(); @@ -293,12 +309,12 @@ export class ProjectSettingsPageHelper { const updatedTitleName = CommonHelper.appendDate(titleName); await editLinkTitleName.clear(); await editLinkTitleName.sendKeys(updatedTitleName); - + // Click on Edit Link button await this.projectSettingsPageObject.editLinkButton.click() // Verify Alert Message - message = await CommonHelper.getAlertBox.getText(); + message = await CommonHelper.getAlertMessageAndClosePopup(); expect(message).toBe(projectSettings.attachmentUpdationSuccessMessage); // Verify Updated Link Title @@ -313,7 +329,7 @@ export class ProjectSettingsPageHelper { const deletePopupTitle = (await this.projectSettingsPageObject.editAttachmentWindow.getText()).toString(); expect(deletePopupTitle).toEqual(projectSettings.deleteLinkPopupTitle); - // Verify Delte Link Popup Message + // Verify Delete Link Popup Message const deletePopupMessage = (await this.projectSettingsPageObject.deletePopupMessage.getText()).toString(); expect(deletePopupMessage).toEqual(projectSettings.deletePopupMessage); @@ -321,9 +337,8 @@ export class ProjectSettingsPageHelper { await this.projectSettingsPageObject.deleteLinkButton.click(); // Verify Alert Message - const attachmentRemovalMessage = await CommonHelper.getAlertBox.getText(); + const attachmentRemovalMessage = await CommonHelper.getAlertMessageAndClosePopup(); expect(attachmentRemovalMessage).toBe(projectSettings.attachmentRemovalMessage); - await BrowserHelper.sleep(2000); // Verify Link Count after Deleting link const countAfterDeletion = (await this.projectSettingsPageObject.getCount('Links').getText()).toString(); @@ -391,7 +406,7 @@ export class ProjectSettingsPageHelper { */ public static async clickOnLinkAndVerifyNewTab(tagName: string) { await this.projectSettingsPageObject.getAssetsLibraryFileName(tagName).click(); - await BrowserHelper.sleep(5000); + await BrowserHelper.sleep(2000); await BrowserHelper.getAllWindowHandles().then((handles) => { expect(handles.length).toEqual(2); BrowserHelper.switchToWindow(handles[1]); diff --git a/connect-automation/page-objects/project-settings/project-settings.po.ts b/connect-automation/page-objects/project-settings/project-settings.po.ts index 6e9dffa83..0941fce57 100644 --- a/connect-automation/page-objects/project-settings/project-settings.po.ts +++ b/connect-automation/page-objects/project-settings/project-settings.po.ts @@ -4,11 +4,10 @@ import { ConfigHelper } from '../../utils/config-helper'; export class ProjectSettingsPageObject { /** - * Open the Given Project URL - * @param expired + * Open the Given Expired Project URL */ - public static async open(expired = false) { - const url = expired ? ConfigHelper.getExpiredProjectUrl() : ConfigHelper.getGivenProjectUrl() + public static async openExpiredProject() { + const url = ConfigHelper.getExpiredProjectUrl() await BrowserHelper.open(url); logger.info('User navigated to Project Page'); } @@ -27,14 +26,14 @@ export class ProjectSettingsPageObject { case 'Messages': index = 2; break; case 'Assets Library': index = 5; break; case 'Project Settings': index = 7; break; - } + } return ElementHelper.getElementByXPath(`(//a[contains(@href,'/projects/')]/span)[${index}]`); } /** * Get Enforce Topcoder NDA Radio Buttons List */ - public get enforceTopcoderNDARadioButtons() { + public async enforceTopcoderNDARadioButtons() { return ElementHelper.getAllElementsByXPath('//label[contains(@for,"nda-opt")]'); } @@ -130,7 +129,7 @@ export class ProjectSettingsPageObject { public async isTabSelected(tabName: string) { const selectedTabXpath = `//span[text()='${tabName}']/parent::li`; const className = (await ElementHelper.getElementByXPath(selectedTabXpath).getAttribute('class')).toString() - return (className.trim().length !== 0) ? true: false; + return (className.trim().length !== 0) ? true : false; } /** @@ -397,4 +396,12 @@ export class ProjectSettingsPageObject { public get uploadedFile() { return ElementHelper.getElementByXPath('//a[contains(@href, "/projects/messages")]'); } + + public get projectSettingsForm() { + return ElementHelper.getElementByXPath('//div[contains(@class, "edit-project-defaults-form")]'); + } + + public get noAccountAvailableLabel() { + return ElementHelper.getElementByXPath('(//div[@class="container"]//div[contains(@class,"react-select__placeholder")])[1]'); + } } \ No newline at end of file diff --git a/connect-automation/test-cases/_Connect Automation Smoke Test Plan.xlsx b/connect-automation/test-cases/_Connect Automation Smoke Test Plan.xlsx index 1c84e05ce..e3ae1689d 100644 Binary files a/connect-automation/test-cases/_Connect Automation Smoke Test Plan.xlsx and b/connect-automation/test-cases/_Connect Automation Smoke Test Plan.xlsx differ diff --git a/connect-automation/test-cases/~$_Connect Automation Smoke Test Plan.xlsx b/connect-automation/test-cases/~$_Connect Automation Smoke Test Plan.xlsx index ad2f313c5..5a932052d 100644 Binary files a/connect-automation/test-cases/~$_Connect Automation Smoke Test Plan.xlsx and b/connect-automation/test-cases/~$_Connect Automation Smoke Test Plan.xlsx differ diff --git a/connect-automation/test-data/test-data.json b/connect-automation/test-data/test-data.json index 9f12d5299..9f0be18a7 100644 --- a/connect-automation/test-data/test-data.json +++ b/connect-automation/test-data/test-data.json @@ -1,77 +1,99 @@ { - "userProfile": { - "firstName": "John", - "lastName": "Doe", - "title": "programmer", - "country": "Nepal", - "countryCode": "+977", - "countryAbbr": "NPL", - "companyUrl": "www.topcoder.com", - "localTimezone": "Africa/Accra", - "startTime": "9:00", - "endTime": "18:00", - "businessPhoneCountry": "India", - "businessPhoneCountryCode": "+91" - }, - "projectData": { - "appName": "Automation", - "appDescription": "This project is created by automated test", - "answers": { - "beforeWeStart": "I am just exploring my options", - "whatDoYouNeed": "Development & QA", - "willYourAppNeedMoreScreen": "Yes", - "howManyScreens": "45-60 screens", - "whereShouldAppWork": "Web Browser", - "howShouldAppWorks": "I want a web app that is installable on desktops." + "userProfile": { + "firstName": "John", + "lastName": "Doe", + "title": "programmer", + "country": "Nepal", + "countryCode": "+977", + "countryAbbr": "NPL", + "companyUrl": "www.topcoder.com", + "localTimezone": "Africa/Accra", + "startTime": "9:00", + "endTime": "18:00", + "businessPhoneCountry": "India", + "businessPhoneCountryCode": "+91" }, - "notes": "Notes from test" - }, - "taas": { - "title": "test Taas Project", - "jobTitle": "Test Job Title", - "email": "mailmemakar@gmail.com", - "numOfPeople": 4, - "duration": 10, - "description": "test description", - "answers": { - "beforeWeStart": "I need work done", - "startDate": "As soon as possible", - "requirement": "No additional onboarding processes are required" - } - }, - "inviteCopilot": { - "copilotHandle": "TCConnCopilot" - }, - "searchProject": { - "searchByName": "taas", - "searchByRef": "cjamedit", - "searchByHandle": "mailmemakar402" - }, - "phaseCreation": { - "formData": { - "title": "Dev Phase", - "daysBetweenStartAndEndDate": 3, - "reportName": "Reporting 1", - "deliverableReviewName": "Deliverable Review 1", - "finalDeliverableReviewName": "Final Deliverable Review 1" + "projectData": { + "appName": "Automation", + "appDescription": "This project is created by automated test", + "answers": { + "beforeWeStart": "I am just exploring my options", + "whatDoYouNeed": "Development & QA", + "willYourAppNeedMoreScreen": "Yes", + "howManyScreens": "45-60 screens", + "whereShouldAppWork": "Web Browser", + "howShouldAppWorks": "I want a web app that is installable on desktops." + }, + "notes": "Notes from test" + }, + "taas": { + "title": "test Taas Project", + "jobTitle": "Test Job Title", + "email": "mailmemakar@gmail.com", + "numOfPeople": 4, + "duration": 10, + "description": "test description", + "answers": { + "beforeWeStart": "I need work done", + "startDate": "As soon as possible", + "requirement": "No additional onboarding processes are required" + } + }, + "inviteCopilot": { + "copilotHandle": "TCConnCopilot" + }, + "searchProject": { + "searchByName": "taas", + "searchByRef": "cjamedit", + "searchByHandle": "mailmemakar402" + }, + "phaseCreation": { + "formData": { + "title": "Dev Phase", + "daysBetweenStartAndEndDate": 3, + "reportName": "Reporting 1", + "deliverableReviewName": "Deliverable Review 1", + "finalDeliverableReviewName": "Final Deliverable Review 1" + } + }, + "projectSettings": { + "enforceTopcoderNDA": "No", + "intendedWorkGroups": "Hide Challenges", + "projectUpdatedMessage": "PROJECT UPDATED.", + "tagName": "Tag1", + "newFileAdditionMessage": "ADDED ATTACHMENT TO THE PROJECT SUCCESSFULLY", + "attachmentUpdationSuccessMessage": "UPDATED ATTACHMENT SUCCESSFULLY", + "deletePopupTitle": "You're about to delete a File", + "deletePopupMessage": "Your team might need this link, are you sure you want to delete it? This action can't be undone.", + "attachmentRemovalMessage": "REMOVED ATTACHMENT SUCCESSFULLY", + "linkAttachmentSuccessMessage": "ADDED ATTACHMENT TO THE PROJECT SUCCESSFULLY", + "deleteLinkPopupTitle": "You're about to delete a link", + "editAttachmentWindowTitle": "You're about to edit an attachment", + "assetsLibraryTitle": "Title1", + "addALinkURL": "https://www.google.com", + "editLinkWindowTitle": "You're about to edit a link", + "discussionTitle": "Message1" + }, + "projectMilestone": { + "milestone": "MILESTONES", + "addButton": "ADD", + "active": "Active", + "milestoneCreationMessage": "PROJECT MILESTONE CREATED.", + "description": "Description", + "deleteConfirmation": "Deletion Confirmation", + "deletePopupMessage": "Are you sure you want to delete the selected Milestone (s)?", + "milestoneDeletionMessage": "PROJECT MILESTONE DELETED.", + "copilot": "Copilot", + "copilotName": "TCConnCopilot", + "moveMilestoneDatesTitle": "Move Milestone Dates", + "moveMilestoneDatesDescription": "Move selected milestone dates", + "move": "Move", + "projectsSelected": "PROJECT(S) SELECTED", + "noOfDays": 2, + "draft": "Draft", + "inReview": "In Review", + "actionOnMilestoneApprove": "approve", + "milestoneApprovedMessageStr": "APPROVED MILESTONES SUCCESSFULLY.", + "allMilestoneApprovedNotificationStr": "All the milestone(s) has been approved by the customer" } - }, - "projectSettings": { - "enforceTopcoderNDA": "Yes", - "intendedWorkGroups": "Hide Challenges", - "projectUpdatedMessage": "PROJECT UPDATED.", - "tagName": "Tag1", - "newFileAdditionMessage": "ADDED ATTACHMENT TO THE PROJECT SUCCESSFULLY", - "attachmentUpdationSuccessMessage": "UPDATED ATTACHMENT SUCCESSFULLY", - "deletePopupTitle": "You're about to delete a File", - "deletePopupMessage": "Your team might need this link, are you sure you want to delete it? This action can't be undone.", - "attachmentRemovalMessage": "REMOVED ATTACHMENT SUCCESSFULLY", - "linkAttachmentSuccessMessage": "ADDED ATTACHMENT TO THE PROJECT SUCCESSFULLY", - "deleteLinkPopupTitle": "You're about to delete a link", - "editAttachmentWindowTitle": "You're about to edit an attachment", - "assetsLibraryTitle": "Title1", - "addALinkURL": "https://www.google.com", - "editLinkWindowTitle": "You're about to edit a link", - "discussionTitle": "Message1" - } -} +} \ No newline at end of file diff --git a/connect-automation/test-suites/milestone-flow/create-new-milestone.spec.ts b/connect-automation/test-suites/milestone-flow/create-new-milestone.spec.ts new file mode 100644 index 000000000..4e79a6dfd --- /dev/null +++ b/connect-automation/test-suites/milestone-flow/create-new-milestone.spec.ts @@ -0,0 +1,41 @@ +import { CommonHelper } from '../../page-objects/common-page/common.helper'; +import { ProjectMilestonePageHelper } from '../../page-objects/project-milestone/project-milestone.helper'; +import * as testData from '../../test-data/test-data.json'; +import { ConfigHelper } from '../../utils/config-helper'; + +describe('Connect App - Create New Milestone Tests:', () => { + /** + * Sets up the browser + */ + beforeAll(async () => { + const customerUser = ConfigHelper.getCopilotUser(); + await CommonHelper.login(customerUser.email, customerUser.password); + }); + + /** + * Logs out + */ + afterAll(async () => { + await CommonHelper.logout(); + }); + + beforeEach(async () => { + ProjectMilestonePageHelper.initialize(); + await CommonHelper.goToRecentlyCreatedProject(); + await CommonHelper.waitForPageDisplayed(); + }); + + it('[TC_001] Should verify user can create/Edit/Delete the MILESTONES', async () => { + await ProjectMilestonePageHelper.verifyUserCanCreateEditDeleteMilestone(testData.projectMilestone); + }); + + it('[TC_002] Should verify user can add copilot on Milestone.', async () => { + await ProjectMilestonePageHelper.verifyUserCanAddCopilotOnMilestone(testData.projectMilestone); + }); + + it('[TC_003] Should verify user can bulk update the milestone.', async () => { + await ProjectMilestonePageHelper.deleteAllMilestones(testData.projectMilestone); + const milestoneNames = await ProjectMilestonePageHelper.addMilestones(testData.projectMilestone, 2, testData.projectMilestone.active); + await ProjectMilestonePageHelper.verifyUserCanBulkUpdateTheMilestone(testData.projectMilestone); + }); +}); \ No newline at end of file diff --git a/connect-automation/test-suites/milestone-flow/verify-customer-approveMilestone.spec.ts b/connect-automation/test-suites/milestone-flow/verify-customer-approveMilestone.spec.ts new file mode 100644 index 000000000..afc24bd8f --- /dev/null +++ b/connect-automation/test-suites/milestone-flow/verify-customer-approveMilestone.spec.ts @@ -0,0 +1,33 @@ +import { CommonHelper } from '../../page-objects/common-page/common.helper'; +import { ProjectMilestonePageHelper } from '../../page-objects/project-milestone/project-milestone.helper'; +import * as testData from '../../test-data/test-data.json'; +import { ConfigHelper } from '../../utils/config-helper'; + +describe('Connect App - Verify Customer Role Tests:', () => { + /** + * Sets up the browser + */ + beforeAll(async () => { + const user = ConfigHelper.getCopilotUser(); + await CommonHelper.login(user.email, user.password); + }); + + /** + * Logs out + */ + afterAll(async () => { + await CommonHelper.logout(); + }); + + beforeEach(async () => { + ProjectMilestonePageHelper.initialize(); + // Go to the given app URL + await ProjectMilestonePageHelper.open(); + }); + + it('[TC_001] Should verify user can approve the milestone for Customer role', async () => { + const customerUser = ConfigHelper.getCustomerUser(); + const copilotUser = ConfigHelper.getCopilotUser(); + await ProjectMilestonePageHelper.takeActionOnMilestone(testData.projectMilestone, customerUser, copilotUser) + }); +}); \ No newline at end of file diff --git a/connect-automation/test-suites/milestone-flow/verify-customer-role.spec.ts b/connect-automation/test-suites/milestone-flow/verify-customer-role.spec.ts new file mode 100644 index 000000000..4375e3e09 --- /dev/null +++ b/connect-automation/test-suites/milestone-flow/verify-customer-role.spec.ts @@ -0,0 +1,32 @@ +import { CommonHelper } from '../../page-objects/common-page/common.helper'; +import { ProjectMilestonePageHelper } from '../../page-objects/project-milestone/project-milestone.helper'; +import * as testData from '../../test-data/test-data.json'; +import { ConfigHelper } from '../../utils/config-helper'; + +describe('Connect App - Verify Customer Role Tests:', () => { + /** + * Sets up the browser + */ + beforeAll(async () => { + const user = ConfigHelper.getCopilotUser(); + await CommonHelper.login(user.email, user.password); + }); + + /** + * Logs out + */ + afterAll(async () => { + await CommonHelper.logout(); + }); + + beforeEach(async () => { + ProjectMilestonePageHelper.initialize(); + // Go to the given app URL + await ProjectMilestonePageHelper.open(); + }); + + it('[TC_001] Should verify Add Milestone button and Draft Milestone should not be displayed for customer role.', async () => { + const customerUser = ConfigHelper.getCustomerUser(); + await ProjectMilestonePageHelper.verifyAddMilestoneButtonAndDraftMilestoneShouldNotBeDisplayed(testData.projectMilestone, customerUser); + }); +}); \ No newline at end of file diff --git a/connect-automation/test-suites/phase-creation-flow/create-new-phase.spec.ts b/connect-automation/test-suites/phase-creation-flow/create-new-phase.spec.ts deleted file mode 100644 index 0d25536a1..000000000 --- a/connect-automation/test-suites/phase-creation-flow/create-new-phase.spec.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { CommonHelper } from '../../page-objects/common-page/common.helper'; -import { CreateNewPhaseHelper } from '../../page-objects/phase-creation-flow/create-new-phase/create-new-phase.helper'; -import * as testData from '../../test-data/test-data.json'; -import { ConfigHelper } from '../../utils/config-helper'; - -describe('Connect App - Create New Phase Tests:', () => { - /** - * Sets up the browser - */ - beforeAll(async () => { - // Precondition: User should be logged in with Copilot role. - const copilotUser = ConfigHelper.getCopilotUser(); - await CommonHelper.login(copilotUser.email, copilotUser.password); - }); - - /** - * Logs out - */ - afterAll(async () => { - await CommonHelper.logout(); - }); - - beforeEach(async () => { - CreateNewPhaseHelper.initialize(); - // Step Sequence #1: Go to the given app URL - await CommonHelper.goToRecentlyCreatedProject(); - }); - - it('[TC_001] should verify user can create a Phase and Publish it.', async () => { - await CreateNewPhaseHelper.verifyCreateNewPhase( - testData.phaseCreation.formData - ); - }); -}); diff --git a/connect-automation/test-suites/profile-update/left-menu.spec.ts b/connect-automation/test-suites/profile-update/left-menu.spec.ts index 631949e7a..e0f873c62 100644 --- a/connect-automation/test-suites/profile-update/left-menu.spec.ts +++ b/connect-automation/test-suites/profile-update/left-menu.spec.ts @@ -1,7 +1,7 @@ import { CommonHelper } from '../../page-objects/common-page/common.helper'; import { LeftMenuPageHelper } from '../../page-objects/profile-update/left-menu/left-menu.helper'; -import { ConfigHelper } from '../../utils/config-helper'; import { MyProfilePageHelper } from '../../page-objects/profile-update/my-profile/my-profile.helper'; +import { ConfigHelper } from '../../utils/config-helper'; describe('Connect App - Left Menu Tests:', () => { /** diff --git a/connect-automation/test-suites/profile-update/my-profile.spec.ts b/connect-automation/test-suites/profile-update/my-profile.spec.ts index ca237917f..111c662fb 100644 --- a/connect-automation/test-suites/profile-update/my-profile.spec.ts +++ b/connect-automation/test-suites/profile-update/my-profile.spec.ts @@ -1,7 +1,7 @@ import { CommonHelper } from '../../page-objects/common-page/common.helper'; +import { MyProfilePageHelper } from '../../page-objects/profile-update/my-profile/my-profile.helper'; import * as testData from '../../test-data/test-data.json'; import { ConfigHelper } from '../../utils/config-helper'; -import { MyProfilePageHelper } from '../../page-objects/profile-update/my-profile/my-profile.helper'; describe('Connect App - My Profile Page Tests:', () => { /** diff --git a/connect-automation/test-suites/project-creation-flow/projects.spec.ts b/connect-automation/test-suites/project-creation-flow/projects.spec.ts index 2dd49f251..19e694b36 100644 --- a/connect-automation/test-suites/project-creation-flow/projects.spec.ts +++ b/connect-automation/test-suites/project-creation-flow/projects.spec.ts @@ -37,7 +37,6 @@ describe('Connect App - Copilot Role Project Related Tests:', () => { // Logout from current user. await CommonHelper.logout(); - await BrowserHelper.sleep(5000); expect(await BrowserHelper.getCurrentUrl()).toBe( ConfigHelper.getHomePageUrl() ); diff --git a/connect-automation/test-suites/project-settings-flow/project-settings.spec.ts b/connect-automation/test-suites/project-settings-flow/project-settings.spec.ts index 1230688d3..ed30ac073 100644 --- a/connect-automation/test-suites/project-settings-flow/project-settings.spec.ts +++ b/connect-automation/test-suites/project-settings-flow/project-settings.spec.ts @@ -25,32 +25,36 @@ describe('Connect App - Project Settings Tests:', () => { }); it('[TC_001] Should verify user can update Project Details ( eg NDA, Default Group)', async () => { - // Step Sequence #1: Go to the given app URL - await ProjectSettingsPageHelper.open(); + await CommonHelper.goToRecentlyCreatedProject(); + await ProjectSettingsPageHelper.openSettings(); // Resetting Existing Project Settings await ProjectSettingsPageHelper.resetSettings(); - + // Editing Project Settings await ProjectSettingsPageHelper.editProjectSettings(testData.projectSettings); }); it('[TC_002] Should verify system showing Billing Account expiry information.', async () => { - await ProjectSettingsPageHelper.open(true); + await ProjectSettingsPageHelper.openExpiredProject(); + await ProjectSettingsPageHelper.openSettings(); await ProjectSettingsPageHelper.verifyAccountExpiryInformation(); }); it('[TC_003] Should verify user can Add/Edit/Delete/Download Files', async () => { - await ProjectSettingsPageHelper.open(); + await CommonHelper.goToRecentlyCreatedProject(); + await CommonHelper.waitForAddNewMilestones(); await ProjectSettingsPageHelper.verifyUserCanAddEditDeleteDownloadFiles(testData.projectSettings); }); it('[TC_004] Should verify user can Add/Edit/Delete/Download Links', async () => { - await ProjectSettingsPageHelper.open(); + await CommonHelper.goToRecentlyCreatedProject(); + await CommonHelper.waitForAddNewMilestones(); await ProjectSettingsPageHelper.verifyUserCanAddEditDeleteDownloadLinks(testData.projectSettings); }); it('[TC_005] Should verify user can Add Message with Files Attachment', async () => { - await ProjectSettingsPageHelper.open(); + await CommonHelper.goToRecentlyCreatedProject(); + await CommonHelper.waitForAddNewMilestones(); await ProjectSettingsPageHelper.verifyUserCanAddMessageWithFileAttachment(testData.projectSettings); }); }); diff --git a/connect-automation/utils/config-helper.ts b/connect-automation/utils/config-helper.ts index 526b55743..7778926bf 100644 --- a/connect-automation/utils/config-helper.ts +++ b/connect-automation/utils/config-helper.ts @@ -106,24 +106,17 @@ export const ConfigHelper = { return this.getConfig().copilotManagerRole; }, - /** - * Get Given Project URL - */ - getGivenProjectUrl(): string { - return this.getConfig().givenProjectUrl; - }, - /** * Get Expired Project URL */ - getExpiredProjectUrl(): string { + getExpiredProjectUrl(): string { return this.getConfig().expiredProjectUrl; }, /** * Get platform URL */ - getPlatformUrl(): string { + getPlatformUrl(): string { return this.getConfig().platformUrl; }, };