From 156f2832afa4e72cc092caf5ab17159ba134fdc2 Mon Sep 17 00:00:00 2001 From: "Nursoltan Saipolda (Topcoder)" Date: Fri, 3 Sep 2021 19:30:14 +0800 Subject: [PATCH 1/2] fix failing tests --- connect-automation/.vscode/launch.json | 26 + connect-automation/conf.ts | 14 +- connect-automation/config/config.json | 55 +- connect-automation/package-lock.json | 3653 +---------------- connect-automation/package.json | 2 +- .../page-objects/common-page/common.helper.ts | 278 +- .../page-objects/login/login.helper.ts | 1 - .../page-objects/login/login.po.ts | 31 +- .../create-new-phase.helper.ts | 76 - .../create-new-phase.model.ts | 7 - .../create-new-phase/create-new-phase.po.ts | 78 - .../my-profile/my-profile.helper.ts | 21 +- .../my-profile/my-profile.po.ts | 18 +- .../create-project/create-project.helper.ts | 14 +- .../create-project/create-project.po.ts | 98 +- .../invite-copilot/invite-copilot.helper.ts | 16 +- .../projects/projects.helper.ts | 90 +- .../projects/projects.po.ts | 81 +- .../project-milestone.helper.ts | 554 +++ .../project-milestone.model.ts | 22 + .../project-milestone/project-milestone.po.ts | 304 ++ .../project-settings.helper.ts | 103 +- .../project-settings/project-settings.po.ts | 21 +- .../_Connect Automation Smoke Test Plan.xlsx | Bin 30305 -> 45468 bytes ...~$_Connect Automation Smoke Test Plan.xlsx | Bin 165 -> 165 bytes connect-automation/test-data/test-data.json | 170 +- .../create-new-milestone.spec.ts | 41 + .../verify-customer-approveMilestone.spec.ts | 33 + .../verify-customer-role.spec.ts | 32 + .../create-new-phase.spec.ts | 34 - .../profile-update/left-menu.spec.ts | 2 +- .../profile-update/my-profile.spec.ts | 2 +- .../project-creation-flow/projects.spec.ts | 1 - .../project-settings.spec.ts | 18 +- connect-automation/utils/config-helper.ts | 11 +- 35 files changed, 1682 insertions(+), 4225 deletions(-) create mode 100644 connect-automation/.vscode/launch.json delete mode 100644 connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.helper.ts delete mode 100644 connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.model.ts delete mode 100644 connect-automation/page-objects/phase-creation-flow/create-new-phase/create-new-phase.po.ts create mode 100644 connect-automation/page-objects/project-milestone/project-milestone.helper.ts create mode 100644 connect-automation/page-objects/project-milestone/project-milestone.model.ts create mode 100644 connect-automation/page-objects/project-milestone/project-milestone.po.ts create mode 100644 connect-automation/test-suites/milestone-flow/create-new-milestone.spec.ts create mode 100644 connect-automation/test-suites/milestone-flow/verify-customer-approveMilestone.spec.ts create mode 100644 connect-automation/test-suites/milestone-flow/verify-customer-role.spec.ts delete mode 100644 connect-automation/test-suites/phase-creation-flow/create-new-phase.spec.ts 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 1c84e05ce34bdd9a8c82cd6039d0eb879bdb6ba2..e3ae1689dc4d1b9d757ffc827eb9c13cab5ff280 100644 GIT binary patch literal 45468 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 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 ad2f313c5791bf98661d9cc1d629e5c26bb5fc86..5a932052db2a5d1e1d32a453f59be330b8becc3b 100644 GIT binary patch literal 165 zcmWgj%}g%JFV0UZQSeVo%S=vH2rW)6QXm9G8GIQs8Il=_81fm4fjEt!gh7G9A4sQx R#Z!U2P@qgIP=x};5CA3W7%cz* literal 165 ucmd-M%gjzJRtQTi%1u-t9&j^+F=R4iGbAz;GbjMrsSHI7xj>!*O&|c { + /** + * 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; }, }; From c805057e3a0bbfaaf966f2eba6f5560ab8a6528d Mon Sep 17 00:00:00 2001 From: "Nursoltan Saipolda (Topcoder)" Date: Fri, 3 Sep 2021 20:47:18 +0800 Subject: [PATCH 2/2] change test data --- connect-automation/test-data/test-data.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connect-automation/test-data/test-data.json b/connect-automation/test-data/test-data.json index 049da2a82..9f0be18a7 100644 --- a/connect-automation/test-data/test-data.json +++ b/connect-automation/test-data/test-data.json @@ -57,7 +57,7 @@ } }, "projectSettings": { - "enforceTopcoderNDA": "Yes", + "enforceTopcoderNDA": "No", "intendedWorkGroups": "Hide Challenges", "projectUpdatedMessage": "PROJECT UPDATED.", "tagName": "Tag1",