diff --git a/.circleci/config.yml b/.circleci/config.yml index e64aa9bcce..4dd7eaa25e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,4 @@ -version: 2 +version: 2.1 defaults: &defaults docker: @@ -63,7 +63,7 @@ jobs: source awsenvconf source buildenvvar ./master_deploy.sh -d ECS -e DEV -t latest -s dev_communityapp_taskvar -i communityapp - + # Build & Deploy against testing backend "build-test": <<: *defaults @@ -231,35 +231,50 @@ workflows: branches: only: - develop + - develop_automation + - ci-manual-approval + post-steps: + - run: + name: Run automation + command: | + source awsenvconf + source buildenvvar + ./automated-smoke-test/smoketest.sh automation-config-dev.json dev + - "smoke-testing": + type: approval + requires: + - build-dev # This is alternate dev env for parallel testing - "build-test": context : org-global filters: branches: only: - - gig-apply-fix + - free # This is alternate dev env for parallel testing - "build-qa": context : org-global filters: branches: only: - - hide-my-communities + - free # This is beta env for production soft releases - "build-prod-beta": context : org-global filters: branches: only: - - integration-v5-challenge-api - - hot-fix + - free # This is stage env for production QA releases - "build-prod-staging": context : org-global + requires: + - smoke-testing filters: branches: only: - develop + - ci-manual-approval # Production builds are exectuted # when PR is merged to the master # Don't change anything in this configuration @@ -279,4 +294,3 @@ workflows: branches: ignore: - develop - diff --git a/.gitignore b/.gitignore index 7e1c07c0b2..e3c54e7508 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,9 @@ jspm_packages set-env*.sh set-test-env.sh .idea -*.iml \ No newline at end of file +*.iml + +# e2e test case +automated-smoke-test/temp +automated-smoke-test/test-results +automated-smoke-test/config/config.json diff --git a/CODEOWNERS b/CODEOWNERS index a5c44ddd43..0134537700 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -* @sushilshinde @ajefts +* @sushilshinde @ajefts @luizrrodrigues diff --git a/automated-smoke-test/Dockerfile b/automated-smoke-test/Dockerfile new file mode 100644 index 0000000000..b228769e64 --- /dev/null +++ b/automated-smoke-test/Dockerfile @@ -0,0 +1,32 @@ +FROM node:10.17.0-stretch +RUN apt update +RUN apt install sudo +RUN sudo apt-get update; sudo apt-get install -y openjdk-8-jre openjdk-8-jre-headless openjdk-8-jdk openjdk-8-jdk-headless; +RUN curl --silent --show-error --location --fail --retry 3 --output /tmp/google-chrome-stable_current_amd64.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \ + && (sudo dpkg -i /tmp/google-chrome-stable_current_amd64.deb || sudo apt-get -fy install) \ + && rm -rf /tmp/google-chrome-stable_current_amd64.deb \ + && sudo sed -i 's|HERE/chrome"|HERE/chrome" --disable-setuid-sandbox --no-sandbox|g' \ + "/opt/google/chrome/google-chrome" \ + && google-chrome --version +RUN export CHROMEDRIVER_RELEASE=$(curl --location --fail --retry 3 http://chromedriver.storage.googleapis.com/LATEST_RELEASE) \ + && curl --silent --show-error --location --fail --retry 3 --output /tmp/chromedriver_linux64.zip "http://chromedriver.storage.googleapis.com/$CHROMEDRIVER_RELEASE/chromedriver_linux64.zip" \ + && cd /tmp \ + && unzip chromedriver_linux64.zip \ + && rm -rf chromedriver_linux64.zip \ + && sudo mv chromedriver /usr/local/bin/chromedriver \ + && sudo chmod +x /usr/local/bin/chromedriver \ + && chromedriver --version +RUN sudo apt-get install -y libgconf-2-4 +RUN sudo apt-get install -y xvfb +RUN sudo apt-get install -y jq +ENV DISPLAY :99 +RUN printf '#!/bin/sh\nXvfb :99 -screen 0 1280x1024x24 &\nexec "$@"\n' > /tmp/entrypoint \ + && chmod +x /tmp/entrypoint \ + && sudo mv /tmp/entrypoint /docker-entrypoint.sh + +COPY . /automated-smoke-test +WORKDIR /automated-smoke-test +RUN npm install +RUN ./node_modules/.bin/webdriver-manager update --versions.chrome=="$(google-chrome -version)" +ENTRYPOINT ["/docker-entrypoint.sh"] +CMD ["/bin/sh"] \ No newline at end of file diff --git a/automated-smoke-test/README.md b/automated-smoke-test/README.md new file mode 100644 index 0000000000..f0d9a840b9 --- /dev/null +++ b/automated-smoke-test/README.md @@ -0,0 +1,49 @@ +# Topcoder Testing Project - E2E Tests + +#### Software Required + +Nodejs v8.11.4+ +Chrome Browser + +#### Installation: + +- Installs + `npm install` + +- To run tests + `cd automated-smoke-test` + `npm run test` +- To run Test locally + `cd automated-smoke-test` + `npm run local-test` + +Note : if you want to run the script for different env, make sure you there is config.json file created. For example , to run the dev env + `cd automated-smoke-test` + `cp config/automation-config-dev.json config/config.json` + `npm run test` + + +- Test results are generated in test-results/ folder + +``` +HTML report - TestResult.html +Junit report - junitresults-TopcoderLoginPageTests.xml and junitresults-TopcoderRegistrationPageTests.xml +``` + +- To view junit reports into html, install xunit-viewer + `npm i -g xunit-viewer` + +- HTML report from Junit reports can be generated using this command + `xunit-viewer --results=test-results/ --output=/home/Documents/` + +As of now, the tests are running in headless mode. To view the actual chrom browser running the tests, you can remove `--headless` option from `chromeOptions.args` in `config.ts` + +#### Implementation Details: + +- TBD + +#### Configuration details: + +- config.json holds the data level configuration, like user credentials etc +- conf.ts holds the application configuration, like jasmine reporters to be configured, specs to be run etc. + \ No newline at end of file diff --git a/automated-smoke-test/conf.ts b/automated-smoke-test/conf.ts new file mode 100644 index 0000000000..2148d113a8 --- /dev/null +++ b/automated-smoke-test/conf.ts @@ -0,0 +1,79 @@ +import reporters = require('jasmine-reporters'); +import HtmlReporter = require('protractor-beautiful-reporter'); +import { BrowserHelper } from 'topcoder-testing-lib'; + +declare global { + namespace NodeJS { + interface IGlobal { + document: Document; + window: Window; + navigator: Navigator; + forgotPasswordMailListener: any; + registrationMailListener: any; + } + } +} + +exports.config = { + directConnect: true, + + // Capabilities to be passed to the webdriver instance. + capabilities: { + browserName: 'chrome', + chromeOptions: { + args: [ + "--headless", + '--disable-gpu', + '--no-sandbox', + '--window-size=1325x744', + ], + }, + }, + + // Framework to use. Jasmine is recommended. + framework: 'jasmine2', + + specs: [ + // '../temp/test-suites/tc-login.spec.js' + // '../temp/test-suites/tc-tools.spec.js', + // '../temp/test-suites/tc-account.spec.js', + // '../temp/test-suites/tc-profile.spec.js', + // '../temp/test-suites/tc-header.spec.js', + // '../temp/test-suites/tc-footer.spec.js', + // '../temp/test-suites/tc-preferences.spec.js', + '../temp/test-suites/tc-challenge-listing.spec.js', + // '../temp/test-suites/tc-challenge-detail.spec.js', + // '../temp/test-suites/tc-my-dashboard.spec.js', + // '../temp/test-suites/tc-member-profile.spec.js', + ], + + // Options to be passed to Jasmine. + jasmineNodeOpts: { + defaultTimeoutInterval: 1200000, // 20 minutes + isVerbose: true, + showColors: true, + }, + + onPrepare: () => { + BrowserHelper.maximize(); + BrowserHelper.implicitlyWait(5000); + const junitReporter = new reporters.JUnitXmlReporter({ + consolidateAll: false, + savePath: 'test-results', + }); + jasmine.getEnv().addReporter(junitReporter); + jasmine.getEnv().addReporter( + new HtmlReporter({ + baseDirectory: 'test-results', + docName: 'TestResult.html', // Change html report file name + docTitle: 'Test Automation Execution Report', // Add title for the html report + gatherBrowserLogs: true, // Store Browser logs + jsonsSubfolder: 'jsons', // JSONs Subfolder + preserveDirectory: false, // Preserve base directory + screenshotsSubfolder: 'screenshots', + takeScreenShotsForSkippedSpecs: true, // Screenshots for skipped test cases + takeScreenShotsOnlyForFailedSpecs: false, // Screenshots only for failed test cases + }).getJasmine2Reporter() + ); + }, +}; diff --git a/automated-smoke-test/config/app-config.json b/automated-smoke-test/config/app-config.json new file mode 100644 index 0000000000..fd59eb6fa5 --- /dev/null +++ b/automated-smoke-test/config/app-config.json @@ -0,0 +1,18 @@ +{ + "Timeout": { + "FieldVisibility": 15000, + "ElementVisibility": 15000, + "ElementInvisibility": 15000, + "ElementPresence": 15000, + "ElementClickable": 15000, + "PageLoad": 300000 + }, + + "LoggerErrors": { + "ElementVisibilty": "Element did not display within timeout", + "ElementInvisibilty": "Element did not become invisible within timeout", + "ElementPresence": "Element was not present within timeout", + "ElementClickable": "Element was not clickable within timeout", + "PageLoad": "Page did not load within timeout" + } +} diff --git a/automated-smoke-test/config/automation-config-beta.json b/automated-smoke-test/config/automation-config-beta.json new file mode 100644 index 0000000000..9070e77ce5 --- /dev/null +++ b/automated-smoke-test/config/automation-config-beta.json @@ -0,0 +1,183 @@ +{ + "env": "beta", + "logoRedirectionUrl": "https://www.topcoder.com/", + "businessUrl": "https://www.topcoder.com/", + "loginUrl": "https://auth.topcoder.com/", + "redirectLoginUrl": "https://accounts-auth0.topcoder.com/?retUrl=http://www.topcoder.com/", + "homePageUrl": "https://www.topcoder.com/", + "splashPageUrl": "https://www.topcoder.com/splash/", + "logoutUrl": "https://www.topcoder.com/logout", + "toolsUrl": "https://beta-community-app.topcoder.com/settings/tools", + "accountUrl": "https://beta-community-app.topcoder.com/settings/account", + "profileUrl": "https://beta-community-app.topcoder.com/settings/profile", + "preferencesUrl": "https://beta-community-app.topcoder.com/settings/preferences", + "challengeListingUrl": "https://beta-community-app.topcoder.com/challenges", + "subMenuUrls": { + "overview": "https://beta-community-app.topcoder.com/community/learn", + "howItWorks": "https://beta-community-app.topcoder.com/thrive/tracks?track=Topcoder", + "allChallenges": "http://beta-community-app.topcoder.com/challenges", + "competitiveProgramming": "https://beta-community-app.topcoder.com/community/arena", + "taas": "https://beta-community-app.topcoder.com/gigs", + "practice": "https://beta-community-app.topcoder.com/community/practice", + "competitiveProgrammingThrive": "https://beta-community-app.topcoder.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://beta-community-app.topcoder.com/thrive/tracks?track=Data%20Science&tax=", + "designThrive": "https://beta-community-app.topcoder.com/thrive/tracks?track=Design&tax=", + "developmentThrive": "https://beta-community-app.topcoder.com/thrive/tracks?track=Development&tax=", + "qaThrive": "https://beta-community-app.topcoder.com/thrive/tracks?track=QA&tax=", + "tco": "https://beta-community-app.topcoder.com/community/member-programs/topcoder-open", + "programs": "https://beta-community-app.topcoder.com/community/member-programs", + "forums": "https://accounts.topcoder.com/member", + "statistics": "https://beta-community-app.topcoder.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://beta-community-app.topcoder.com/thrive" + }, + "subMenuUrlsAfterLogin": { + "dashboard": "https://beta-community-app.topcoder.com/my-dashboard", + "myProfile": "https://beta-community-app.topcoder.com/members/CustomerUser", + "payments": "https://community.topcoder.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "competitiveProgramming": "https://beta-community-app.topcoder.com/community/arena", + "forums": "https://apps.topcoder.com/forums/" + }, + "footerLinks": { + "allChallenges": "https://www.topcoder.com/challenges", + "competitiveProgramming": "https://www.topcoder.com/community/arena", + "taas": "https://www.topcoder.com/gigs", + "competitiveProgrammingThrive": "https://www.topcoder.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://www.topcoder.com/thrive/tracks?track=Data%20Science", + "designThrive": "https://www.topcoder.com/thrive/tracks?track=Design", + "developmentThrive": "https://www.topcoder.com/thrive/tracks?track=Development", + "qaThrive": "https://www.topcoder.com/thrive/tracks?track=QA", + "tco": "https://www.topcoder.com/community/member-programs/topcoder-open", + "programs": "https://www.topcoder.com/community/member-programs", + "forums": "https://apps.topcoder.com/forums", + "statistics": "https://www.topcoder.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://www.topcoder.com/thrive", + "gettingPaid": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Getting%20Paid", + "faq": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=FAQ", + "generalInfo": "https://www.topcoder.com/thrive/tracks?track=Topcoder", + "websiteHelp": "mailto:support@topcoder.com", + "admins": "https://www.topcoder.com/community/admins", + "contactUs": "https://www.topcoder.com/community/contact", + "joinCommunity": "https://accounts.topcoder.com/member/registration?utm_source=community&utm_campaign=tc-footer&utm_medium=promotion", + "aboutCommunity": "https://www.topcoder.com/community/learn", + "changeLog": "https://www.topcoder.com/community/changelog", + "talkToSales": "https://go.topcoder.com/contact/", + "events": "https://www.topcoder.com/community/events", + "terms": "https://www.topcoder.com/community/terms", + "challengePipeline": "https://www.topcoder.com/community/pipeline", + "practice": "https://www.topcoder.com/community/practice" + }, + "footerLinksAfterLogin": { + "competitiveProgramming": "https://www.topcoder.com/community/arena" + }, + "socialLinks": { + "facebook": "https://www.facebook.com/topcoder/", + "youtube": "https://www.youtube.com/c/TopcoderOfficial", + "linkedin": "www.linkedin.com", + "twitter": "https://twitter.com/topcoder", + "instagram": "https://www.instagram.com/topcoder/" + }, + "forumSettingUrl": "https://apps.topcoder.com/forums/?module=Settings", + "paymentSettingUrl": "https://community.topcoder.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "helpUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "searchUrl": "https://beta-community-app.topcoder.com/search/members", + "allNotificationsUrl": "https://beta-community-app.topcoder.com/notifications", + "policiesUrl": "https://www.topcoder.com/policy", + "username": "CustomerUser", + "password": "appirio123", + "email": "sathya.jayabal+topgeartest@gmail.com", + "challangesLinks": { + "rssFeedUrl": "http://feeds.topcoder.com/challenges/feed", + "aboutUrl": "https://www.topcoder.com/about-the-2018-topcoder-open/", + "contactUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles/hc/en-us/articles/219069687-Contact-Support", + "privacyUrl": "https://www.topcoder.com/privacy-policy/", + "helpUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "termsUrl": "https://www.topcoder.com/community/how-it-works/terms/" + }, + "challengeDetail": { + "url": "https://beta-community-app.topcoder.com/challenges/4bd5cf15-41ee-4932-927d-fda5731ec023", + "termsLinkText": "Standard Terms for Topcoder Competitions v2.2", + "challengeName": "[Do not register] Sample challenge for Automation.", + "challengeTag": "QA", + "termUrl": "https://beta-community-app.topcoder.com/challenges/terms/detail/9ef9dec4-dddb-48c9-9cce-659db68bc5ac", + "forumUrl": "https://apps.topcoder.com/forums/?module=Category&categoryID=82117", + "submissionUrl": "https://beta-community-app.topcoder.com/challenges/4bd5cf15-41ee-4932-927d-fda5731ec023/submit", + "scorecardUrl": "https://software.topcoder.com/review/actions/ViewScorecard?scid=30002133" + }, + "myDashboard": { + "url": "https://beta-community-app.topcoder.com/my-dashboard", + "challenge": { + "name": "Test challenge- Spec Preview", + "currentPhase": "Checkpoint Review", + "linkToSubmit": "", + "userRole": "" + }, + "community": { + "name": "Blockchain Community", + "learnMoreUrl": "https://blockchain.topcoder.com/" + } + }, + "memberProfile": { + "url": "https://beta-community-app.topcoder.com/members", + "profileInfo": { + "handle": "iamtong", + "numberOfCollapsedSkills": 10, + "verifiedSkill": "HTML5", + "noneVerifiedSkill": "Marvel - Design", + "country": "THAILAND", + "memberSince": "MEMBER SINCE MAY, 2009", + "tracks": ["COPILOT", "DEVELOP", "DESIGN"], + "quote": "I'm a designer focusing on designing mobile/ web applications and user experience.", + "forumLink": "https://apps.topcoder.com/forums/?module=History&userID=22781893" + }, + "memberHaveWebSectionInfo": { + "handle": "oton", + "webLink": "HTTPS://ARIFWIDIANTO.COM" + }, + "copilotProfile": { + "handle": "iamtong", + "trackName": "COPILOT", + "fullfillmentInfo": { + "name": "COPILOT", + "info": "100%", + "infoTitle": "FULFILLMENT", + "link": "https://beta-community-app.topcoder.com/members/iamtong/details/?track=COPILOT&subTrack=COPILOT" + } + }, + "designProfile": { + "handle": "iamtong", + "trackName": "DESIGN", + "numberOfSubtracks": 11, + "winInfo": { + "name": "WEB DESIGNS", + "info": "258", + "infoTitle": "WINS", + "link": "https://beta-community-app.topcoder.com/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" + } + }, + "developmentProfile": { + "handle": "iamtong", + "trackName": "DEVELOP", + "numberOfSubtracks": 8, + "winInfo": { + "name": "FIRST2FINISH", + "info": "56", + "infoTitle": "WINS", + "link": "https://beta-community-app.topcoder.com/members/iamtong/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" + } + }, + "dataScienceProfile": { + "handle": "FireIce", + "trackName": "DATA_SCIENCE", + "numberOfSubtracks": 2, + "ratingInfo": { + "name": "MARATHON MATCH", + "info": "999", + "infoTitle": "RATING", + "link": "https://beta-community-app.topcoder.com/members/FireIce/details/?track=DATA_SCIENCE&subTrack=MARATHON_MATCH" + } + } + } +} + diff --git a/automated-smoke-test/config/automation-config-dev.json b/automated-smoke-test/config/automation-config-dev.json new file mode 100644 index 0000000000..69590cbc74 --- /dev/null +++ b/automated-smoke-test/config/automation-config-dev.json @@ -0,0 +1,183 @@ +{ + "env": "dev", + "logoRedirectionUrl": "https://community-app.topcoder-dev.com/", + "businessUrl": "https://community-app.topcoder-dev.com/", + "switchToBusinessUrl": "https://community-app.topcoder.com/", + "loginUrl": "https://auth.topcoder-dev.com/", + "redirectLoginUrl": "https://accounts-auth0.topcoder-dev.com/?retUrl=http://community-app.topcoder-dev.com/", + "homePageUrl": "https://community-app.topcoder-dev.com/", + "splashPageUrl": "https://community-app.topcoder-dev.com/splash/", + "logoutUrl": "https://community-app.topcoder-dev.com/logout", + "toolsUrl": "https://community-app.topcoder-dev.com/settings/tools", + "accountUrl": "https://community-app.topcoder-dev.com/settings/account", + "profileUrl": "https://community-app.topcoder-dev.com/settings/profile", + "preferencesUrl": "https://community-app.topcoder-dev.com/settings/preferences", + "challengeListingUrl": "https://community-app.topcoder-dev.com/challenges", + "subMenuUrls": { + "overview": "https://community-app.topcoder-dev.com/community/learn", + "howItWorks": "https://community-app.topcoder-dev.com/thrive/tracks?track=Topcoder", + "allChallenges": "http://community-app.topcoder-dev.com/challenges", + "competitiveProgramming": "https://community-app.topcoder-dev.com/community/arena", + "taas": "https://community-app.topcoder-dev.com/gigs", + "practice": "https://community-app.topcoder-dev.com/community/practice", + "competitiveProgrammingThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=Data%20Science&tax=", + "designThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=Design&tax=", + "developmentThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=Development&tax=", + "qaThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=QA&tax=", + "tco": "https://community-app.topcoder-dev.com/community/member-programs/topcoder-open", + "programs": "https://community-app.topcoder-dev.com/community/member-programs", + "forums": "https://accounts.topcoder-dev.com/member", + "statistics": "https://community-app.topcoder-dev.com/community/statistics", + "blog": "https://community-app.topcoder.com/blog/", + "thrive": "https://community-app.topcoder-dev.com/thrive" + }, + "subMenuUrlsAfterLogin": { + "dashboard": "https://community-app.topcoder-dev.com/my-dashboard", + "myProfile": "https://community-app.topcoder-dev.com/members/tester1234", + "payments": "https://community.topcoder-dev.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "competitiveProgramming": "https://community-app.topcoder-dev.com/community/arena", + "forums": "https://apps.topcoder-dev.com/forums/" + }, + "footerLinks": { + "allChallenges": "https://community-app.topcoder-dev.com/challenges", + "competitiveProgramming": "https://community-app.topcoder-dev.com/community/arena", + "taas": "https://community-app.topcoder-dev.com/gigs", + "competitiveProgrammingThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=Data%20Science", + "designThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=Design", + "developmentThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=Development", + "qaThrive": "https://community-app.topcoder-dev.com/thrive/tracks?track=QA", + "tco": "https://community-app.topcoder-dev.com/community/member-programs/topcoder-open", + "programs": "https://community-app.topcoder-dev.com/community/member-programs", + "forums": "https://apps.topcoder.com/forums", + "statistics": "https://community-app.topcoder-dev.com/community/statistics", + "blog": "https://community-app.topcoder.com/blog/", + "thrive": "https://community-app.topcoder-dev.com/thrive", + "gettingPaid": "https://community-app.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=Getting%20Paid", + "faq": "https://community-app.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=FAQ", + "generalInfo": "https://community-app.topcoder-dev.com/thrive/tracks?track=Topcoder", + "websiteHelp": "mailto:support@topcoder.com", + "admins": "https://community-app.topcoder-dev.com/community/admins", + "contactUs": "https://community-app.topcoder-dev.com/community/contact", + "joinCommunity": "https://accounts.topcoder.com/member/registration?utm_source=community&utm_campaign=tc-footer&utm_medium=promotion", + "aboutCommunity": "https://community-app.topcoder-dev.com/community/learn", + "changeLog": "https://community-app.topcoder-dev.com/community/changelog", + "talkToSales": "https://go.topcoder.com/contact/", + "events": "https://community-app.topcoder-dev.com/community/events", + "terms": "https://community-app.topcoder-dev.com/community/terms", + "challengePipeline": "https://community-app.topcoder-dev.com/community/pipeline", + "practice": "https://community-app.topcoder-dev.com/community/practice" + }, + "footerLinksAfterLogin": { + "competitiveProgramming": "https://community-app.topcoder-dev.com/community/arena" + }, + "socialLinks": { + "facebook": "https://community-app.facebook.com/topcoder/", + "youtube": "https://community-app.youtube.com/c/TopcoderOfficial", + "linkedin": "community-app.linkedin.com", + "twitter": "https://twitter.com/topcoder", + "instagram": "https://community-app.instagram.com/topcoder/" + }, + "forumSettingUrl": "https://apps.topcoder-dev.com/forums/?module=Settings", + "paymentSettingUrl": "https://community.topcoder-dev.com/tc?module=EditPaymentPreferences", + "helpUrl": "https://community-app.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "searchUrl": "https://community-app.topcoder-dev.com/search/members", + "allNotificationsUrl": "https://community-app.topcoder-dev.com/notifications", + "policiesUrl": "https://community-app.topcoder-dev.com/policy", + "username": "tester1234", + "password": "appirio123", + "email": "sathya.jayabal@gmail.com", + "challangesLinks": { + "rssFeedUrl": "http://feeds.topcoder-dev.com/challenges/feed", + "aboutUrl": "https://community-app.topcoder-dev.com/about-the-2018-topcoder-open/", + "contactUrl": "https://community-app.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=Help%20Articles/hc/en-us/articles/219069687-Contact-Support", + "privacyUrl": "https://community-app.topcoder-dev.com/privacy-policy/", + "helpUrl": "https://community-app.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "termsUrl": "https://community-app.topcoder-dev.com/community/how-it-works/terms/" + }, + "challengeDetail": { + "url": "https://community-app.topcoder-dev.com/challenges/e0db3e96-522e-4b56-b954-a514acfd536e", + "termsLinkText": "Standard Terms for Topcoder Competitions v2.2", + "challengeName": "NDA Test Challenge", + "challengeTag": "Java", + "termUrl": "https://community-app.topcoder-dev.com/challenges/terms/detail/b11da5cd-713f-478d-90f4-f679ef53ee95", + "forumUrl": "https://apps.topcoder-dev.com/forums/?module=Category&categoryID=0", + "submissionUrl": "https://community-app.topcoder-dev.com/challenges/e0db3e96-522e-4b56-b954-a514acfd536e/submit", + "scorecardUrl": "https://software.topcoder-dev.com/review/actions/ViewScorecard?scid=30056744" + }, + "myDashboard": { + "url": "https://community-app.topcoder-dev.com/my-dashboard", + "challenge": { + "name": "Test_challenge_Automation", + "currentPhase": "Submission", + "linkToSubmit": "", + "userRole": "" + }, + "community": { + "name": "Blockchain Community", + "learnMoreUrl": "https://blockchain.topcoder-dev.com/" + } + }, + "memberProfile": { + "url": "https://community-app.topcoder-dev.com/members", + "profileInfo": { + "handle": "iamtong", + "numberOfCollapsedSkills": 10, + "verifiedSkill": "HTML5", + "noneVerifiedSkill": "Marvel - Design", + "country": "THAILAND", + "memberSince": "MEMBER SINCE MAY, 2009", + "tracks": ["COPILOT", "DEVELOP", "DESIGN"], + "quote": "I'm a designer focusing on designing mobile/ web applications and user experience.", + "forumLink": "https://apps.topcoder-dev.com/forums/?module=History&userID=22781893" + }, + "memberHaveWebSectionInfo": { + "handle": "oton", + "webLink": "HTTPS://ARIFWIDIANTO.COM" + }, + "copilotProfile": { + "handle": "iamtong", + "trackName": "COPILOT", + "fullfillmentInfo": { + "name": "COPILOT", + "info": "100%", + "infoTitle": "FULFILLMENT", + "link": "https://community-app.topcoder-dev.com/members/iamtong/details/?track=COPILOT&subTrack=COPILOT" + } + }, + "designProfile": { + "handle": "iamtong", + "trackName": "DESIGN", + "numberOfSubtracks": 11, + "winInfo": { + "name": "WEB DESIGNS", + "info": "189", + "infoTitle": "WINS", + "link": "https://community-app.topcoder-dev.com/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" + } + }, + "developmentProfile": { + "handle": "winterflame", + "trackName": "DEVELOP", + "numberOfSubtracks": 14, + "winInfo": { + "name": "FIRST2FINISH", + "info": "2", + "infoTitle": "WINS", + "link": "https://community-app.topcoder-dev.com/members/winterflame/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" + } + }, + "dataScienceProfile": { + "handle": "FireIce", + "trackName": "DATA_SCIENCE", + "numberOfSubtracks": 2, + "ratingInfo": { + "name": "MARATHON MATCH", + "info": "999", + "infoTitle": "RATING", + "link": "https://community-app.topcoder-dev.com/members/FireIce/details/?track=DATA_SCIENCE&subTrack=MARATHON_MATCH" + } + } + } +} diff --git a/automated-smoke-test/config/automation-config-local.json b/automated-smoke-test/config/automation-config-local.json new file mode 100644 index 0000000000..44c399f53c --- /dev/null +++ b/automated-smoke-test/config/automation-config-local.json @@ -0,0 +1,178 @@ +{ + "env": "local", + "logoRedirectionUrl": "http://localhost:3000/", + "businessUrl": "http://localhost:3000/", + "switchToBusinessUrl": "http://localhost:3000/", + "loginUrl": "http://localhost:5000", + "redirectLoginUrl": "http://localhost:5000/?retUrl=http://localhost:3000", + "homePageUrl": "http://localhost:3000/", + "splashPageUrl": "http://localhost:3000/splash/", + "logoutUrl": "https://topcoder.com/logout", + "toolsUrl": "http://localhost:3000/settings/tools", + "accountUrl": "http://localhost:3000/settings/account", + "profileUrl": "http://localhost:3000/settings/profile", + "preferencesUrl": "http://localhost:3000/settings/preferences", + "challengeListingUrl": "http://localhost:3000/challenges", + "subMenuUrls": { + "overview": "http://localhost:3000/community/learn", + "howItWorks": "http://localhost:3000/thrive/tracks?track=Topcoder", + "allChallenges": "http://localhost:3000/challenges", + "competitiveProgramming": "http://localhost:3000/community/arena", + "taas": "http://localhost:3000/gigs", + "practice": "http://localhost:3000/community/practice", + "competitiveProgrammingThrive": "http://localhost:3000/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "http://localhost:3000/thrive/tracks?track=Data%20Science&tax=", + "designThrive": "http://localhost:3000/thrive/tracks?track=Design&tax=", + "developmentThrive": "http://localhost:3000/thrive/tracks?track=Development&tax=", + "qaThrive": "http://localhost:3000/thrive/tracks?track=QA&tax=", + "tco": "http://localhost:3000/community/member-programs/topcoder-open", + "programs": "http://localhost:3000/community/member-programs", + "forums": "https://accounts.topcoder.com/member", + "statistics": "http://localhost:3000/community/statistics", + "blog": "http://localhost:3000/blog/", + "thrive": "http://localhost:3000/thrive" + }, + "subMenuUrlsAfterLogin": { + "dashboard": "http://localhost:3000/my-dashboard", + "myProfile": "http://localhost:3000/members/CustomerUser", + "payments": "https://community.topcoder.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "forums": "https://apps.topcoder.com/forums/" + }, + "footerLinks": { + "allChallenges": "http://localhost:3000/challenges", + "competitiveProgramming": "http://localhost:3000/community/arena", + "taas": "http://localhost:3000/gigs", + "competitiveProgrammingThrive": "http://localhost:3000/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "http://localhost:3000/thrive/tracks?track=Data%20Science", + "designThrive": "http://localhost:3000/thrive/tracks?track=Design", + "developmentThrive": "http://localhost:3000/thrive/tracks?track=Development", + "qaThrive": "http://localhost:3000/thrive/tracks?track=QA", + "tco": "http://localhost:3000/community/member-programs/topcoder-open", + "programs": "http://localhost:3000/community/member-programs", + "forums": "https://apps.topcoder.com/forums", + "statistics": "http://localhost:3000/community/statistics", + "blog": "http://localhost:3000/blog/", + "thrive": "http://localhost:3000/thrive", + "gettingPaid": "http://localhost:3000/thrive/tracks?track=Topcoder&tax=Getting%20Paid", + "faq": "http://localhost:3000/thrive/tracks?track=Topcoder&tax=FAQ", + "generalInfo": "http://localhost:3000/thrive/tracks?track=Topcoder", + "websiteHelp": "mailto:support@topcoder.com", + "admins": "http://localhost:3000/community/admins", + "contactUs": "http://localhost:3000/community/contact", + "joinCommunity": "https://accounts.topcoder.com/member/registration?utm_source=community&utm_campaign=tc-footer&utm_medium=promotion", + "aboutCommunity": "http://localhost:3000/community/learn", + "changeLog": "http://localhost:3000/community/changelog", + "talkToSales": "https://go.topcoder.com/contact/", + "events": "http://localhost:3000/community/events", + "terms": "http://localhost:3000/community/terms", + "challengePipeline": "http://localhost:3000/community/pipeline" + }, + "socialLinks": { + "facebook": "https://www.facebook.com/topcoder/", + "youtube": "https://www.youtube.com/c/TopcoderOfficial", + "linkedin": "www.linkedin.com", + "twitter": "https://twitter.com/topcoder", + "instagram": "https://www.instagram.com/topcoder/" + }, + "forumSettingUrl": "https://apps.topcoder.com/forums/?module=Settings", + "paymentSettingUrl": "https://community.topcoder.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "helpUrl": "http://localhost:3000/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "searchUrl": "http://localhost:3000/search/members", + "allNotificationsUrl": "http://localhost:3000/notifications", + "policiesUrl": "http://localhost:3000/policy", + "username": "Tonyj", + "password": "appirio123", + "email": "topcoderconnect@gmail.com", + "challangesLinks": { + "rssFeedUrl": "http://feeds.topcoder.com/challenges/feed", + "aboutUrl": "http://localhost:3000/about-the-2018-topcoder-open/", + "contactUrl": "http://localhost:3000/thrive/tracks?track=Topcoder&tax=Help%20Articles/hc/en-us/articles/219069687-Contact-Support", + "privacyUrl": "http://localhost:3000/privacy-policy/", + "helpUrl": "http://localhost:3000/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "termsUrl": "http://localhost:3000/community/how-it-works/terms/" + }, + "challengeDetail": { + "url": "http://localhost:3000/challenges/4bd5cf15-41ee-4932-927d-fda5731ec023", + "termsLinkText": "Standard Terms for Topcoder Competitions v2.2", + "challengeName": "[Do not register] Sample challenge for Automation.", + "challengeTag": "QA", + "termUrl": "http://localhost:3000/challenges/terms/detail/9ef9dec4-dddb-48c9-9cce-659db68bc5ac", + "forumUrl": "https://apps.topcoder.com/forums/?module=Category&categoryID=82117", + "submissionUrl": "http://localhost:3000/challenges/4bd5cf15-41ee-4932-927d-fda5731ec023/submit", + "scorecardUrl": "https://software.topcoder.com/review/actions/ViewScorecard?scid=30002133" + }, + "myDashboard": { + "url": "http://localhost:3000/my-dashboard", + "challenge": { + "name": "Test challenge- Spec Preview", + "currentPhase": "Checkpoint Review", + "linkToSubmit": "", + "userRole": "" + }, + "community": { + "name": "Blockchain Community", + "learnMoreUrl": "https://blockchain.topcoder.com/" + } + }, + "memberProfile": { + "url": "http://localhost:3000/members", + "profileInfo": { + "handle": "iamtong", + "numberOfCollapsedSkills": 10, + "verifiedSkill": "HTML5", + "noneVerifiedSkill": "Marvel - Design", + "country": "THAILAND", + "memberSince": "MEMBER SINCE MAY, 2009", + "tracks": ["COPILOT", "DEVELOP", "DESIGN"], + "quote": "I'm a designer focusing on designing mobile/ web applications and user experience.", + "forumLink": "https://apps.topcoder.com/forums/?module=History&userID=22781893" + }, + "memberHaveWebSectionInfo": { + "handle": "oton", + "webLink": "HTTPS://ARIFWIDIANTO.COM" + }, + "copilotProfile": { + "handle": "iamtong", + "trackName": "COPILOT", + "fullfillmentInfo": { + "name": "COPILOT", + "info": "100%", + "infoTitle": "FULFILLMENT", + "link": "http://localhost:3000/members/iamtong/details/?track=COPILOT&subTrack=COPILOT" + } + }, + "designProfile": { + "handle": "iamtong", + "trackName": "DESIGN", + "numberOfSubtracks": 11, + "winInfo": { + "name": "WEB DESIGNS", + "info": "258", + "infoTitle": "WINS", + "link": "http://localhost:3000/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" + } + }, + "developmentProfile": { + "handle": "iamtong", + "trackName": "DEVELOP", + "numberOfSubtracks": 8, + "winInfo": { + "name": "FIRST2FINISH", + "info": "56", + "infoTitle": "WINS", + "link": "http://localhost:3000/members/iamtong/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" + } + }, + "dataScienceProfile": { + "handle": "FireIce", + "trackName": "DATA_SCIENCE", + "numberOfSubtracks": 2, + "ratingInfo": { + "name": "MARATHON MATCH", + "info": "999", + "infoTitle": "RATING", + "link": "http://localhost:3000/members/FireIce/details/?track=DATA_SCIENCE&subTrack=MARATHON_MATCH" + } + } + } +} diff --git a/automated-smoke-test/config/automation-config-prod.json b/automated-smoke-test/config/automation-config-prod.json new file mode 100644 index 0000000000..ee3bf8661c --- /dev/null +++ b/automated-smoke-test/config/automation-config-prod.json @@ -0,0 +1,178 @@ +{ + "env": "prod", + "logoRedirectionUrl": "https://www.topcoder.com/", + "businessUrl": "https://www.topcoder.com/", + "switchToBusinessUrl": "https://www.topcoder.com/", + "loginUrl": "https://auth.topcoder.com/", + "redirectLoginUrl": "https://accounts-auth0.topcoder.com/?retUrl=http://www.topcoder.com/", + "homePageUrl": "https://www.topcoder.com/", + "splashPageUrl": "https://www.topcoder.com/splash/", + "logoutUrl": "https://www.topcoder.com/logout", + "toolsUrl": "https://www.topcoder.com/settings/tools", + "accountUrl": "https://www.topcoder.com/settings/account", + "profileUrl": "https://www.topcoder.com/settings/profile", + "preferencesUrl": "https://www.topcoder.com/settings/preferences", + "challengeListingUrl": "https://www.topcoder.com/challenges", + "subMenuUrls": { + "overview": "https://www.topcoder.com/community/learn", + "howItWorks": "https://www.topcoder.com/thrive/tracks?track=Topcoder", + "allChallenges": "https://www.topcoder.com/challenges", + "competitiveProgramming": "https://www.topcoder.com/community/arena", + "taas": "https://www.topcoder.com/gigs", + "practice": "https://www.topcoder.com/community/practice", + "competitiveProgrammingThrive": "https://www.topcoder.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://www.topcoder.com/thrive/tracks?track=Data%20Science&tax=", + "designThrive": "https://www.topcoder.com/thrive/tracks?track=Design&tax=", + "developmentThrive": "https://www.topcoder.com/thrive/tracks?track=Development&tax=", + "qaThrive": "https://www.topcoder.com/thrive/tracks?track=QA&tax=", + "tco": "https://www.topcoder.com/community/member-programs/topcoder-open", + "programs": "https://www.topcoder.com/community/member-programs", + "forums": "https://accounts.topcoder.com/member", + "statistics": "https://www.topcoder.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://www.topcoder.com/thrive" + }, + "subMenuUrlsAfterLogin": { + "dashboard": "https://www.topcoder.com/my-dashboard", + "myProfile": "https://www.topcoder.com/members/CustomerUser", + "payments": "https://community.topcoder.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "forums": "https://apps.topcoder.com/forums/" + }, + "footerLinks": { + "allChallenges": "https://www.topcoder.com/challenges", + "competitiveProgramming": "https://www.topcoder.com/community/arena", + "taas": "https://www.topcoder.com/gigs", + "competitiveProgrammingThrive": "https://www.topcoder.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://www.topcoder.com/thrive/tracks?track=Data%20Science", + "designThrive": "https://www.topcoder.com/thrive/tracks?track=Design", + "developmentThrive": "https://www.topcoder.com/thrive/tracks?track=Development", + "qaThrive": "https://www.topcoder.com/thrive/tracks?track=QA", + "tco": "https://www.topcoder.com/community/member-programs/topcoder-open", + "programs": "https://www.topcoder.com/community/member-programs", + "forums": "https://apps.topcoder.com/forums", + "statistics": "https://www.topcoder.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://www.topcoder.com/thrive", + "gettingPaid": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Getting%20Paid", + "faq": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=FAQ", + "generalInfo": "https://www.topcoder.com/thrive/tracks?track=Topcoder", + "websiteHelp": "mailto:support@topcoder.com", + "admins": "https://www.topcoder.com/community/admins", + "contactUs": "https://www.topcoder.com/community/contact", + "joinCommunity": "https://accounts.topcoder.com/member/registration?utm_source=community&utm_campaign=tc-footer&utm_medium=promotion", + "aboutCommunity": "https://www.topcoder.com/community/learn", + "changeLog": "https://www.topcoder.com/community/changelog", + "talkToSales": "https://go.topcoder.com/contact/", + "events": "https://www.topcoder.com/community/events", + "terms": "https://www.topcoder.com/community/terms", + "challengePipeline": "https://www.topcoder.com/community/pipeline" + }, + "socialLinks": { + "facebook": "https://www.facebook.com/topcoder/", + "youtube": "https://www.youtube.com/c/TopcoderOfficial", + "linkedin": "www.linkedin.com", + "twitter": "https://twitter.com/topcoder", + "instagram": "https://www.instagram.com/topcoder/" + }, + "forumSettingUrl": "https://apps.topcoder.com/forums/?module=Settings", + "paymentSettingUrl": "https://community.topcoder.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "helpUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "searchUrl": "https://www.topcoder.com/search/members", + "allNotificationsUrl": "https://www.topcoder.com/notifications", + "policiesUrl": "https://www.topcoder.com/policy", + "username": "CustomerUser", + "password": "appirio123", + "email": "topcoderconnect@gmail.com", + "challangesLinks": { + "rssFeedUrl": "http://feeds.topcoder.com/challenges/feed", + "aboutUrl": "https://www.topcoder.com/about-the-2018-topcoder-open/", + "contactUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles/hc/en-us/articles/219069687-Contact-Support", + "privacyUrl": "https://www.topcoder.com/privacy-policy/", + "helpUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "termsUrl": "https://www.topcoder.com/community/how-it-works/terms/" + }, + "challengeDetail": { + "url": "https://www.topcoder.com/challenges/4bd5cf15-41ee-4932-927d-fda5731ec023", + "termsLinkText": "Standard Terms for Topcoder Competitions v2.2", + "challengeName": "[Do not register] Sample challenge for Automation.", + "challengeTag": "QA", + "termUrl": "https://www.topcoder.com/challenges/terms/detail/9ef9dec4-dddb-48c9-9cce-659db68bc5ac", + "forumUrl": "https://apps.topcoder.com/forums/?module=Category&categoryID=82117", + "submissionUrl": "https://www.topcoder.com/challenges/4bd5cf15-41ee-4932-927d-fda5731ec023/submit", + "scorecardUrl": "https://software.topcoder.com/review/actions/ViewScorecard?scid=30002133" + }, + "myDashboard": { + "url": "https://www.topcoder.com/my-dashboard", + "challenge": { + "name": "Test challenge- Spec Preview", + "currentPhase": "Checkpoint Review", + "linkToSubmit": "", + "userRole": "" + }, + "community": { + "name": "Blockchain Community", + "learnMoreUrl": "https://blockchain.topcoder.com/" + } + }, + "memberProfile": { + "url": "https://www.topcoder.com/members", + "profileInfo": { + "handle": "iamtong", + "numberOfCollapsedSkills": 10, + "verifiedSkill": "HTML5", + "noneVerifiedSkill": "Marvel - Design", + "country": "THAILAND", + "memberSince": "MEMBER SINCE MAY, 2009", + "tracks": ["COPILOT", "DEVELOP", "DESIGN"], + "quote": "I'm a designer focusing on designing mobile/ web applications and user experience.", + "forumLink": "https://apps.topcoder.com/forums/?module=History&userID=22781893" + }, + "memberHaveWebSectionInfo": { + "handle": "oton", + "webLink": "HTTPS://ARIFWIDIANTO.COM" + }, + "copilotProfile": { + "handle": "iamtong", + "trackName": "COPILOT", + "fullfillmentInfo": { + "name": "COPILOT", + "info": "100%", + "infoTitle": "FULFILLMENT", + "link": "https://www.topcoder.com/members/iamtong/details/?track=COPILOT&subTrack=COPILOT" + } + }, + "designProfile": { + "handle": "iamtong", + "trackName": "DESIGN", + "numberOfSubtracks": 11, + "winInfo": { + "name": "WEB DESIGNS", + "info": "258", + "infoTitle": "WINS", + "link": "https://www.topcoder.com/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" + } + }, + "developmentProfile": { + "handle": "iamtong", + "trackName": "DEVELOP", + "numberOfSubtracks": 8, + "winInfo": { + "name": "FIRST2FINISH", + "info": "56", + "infoTitle": "WINS", + "link": "https://www.topcoder.com/members/iamtong/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" + } + }, + "dataScienceProfile": { + "handle": "FireIce", + "trackName": "DATA_SCIENCE", + "numberOfSubtracks": 2, + "ratingInfo": { + "name": "MARATHON MATCH", + "info": "999", + "infoTitle": "RATING", + "link": "https://www.topcoder.com/members/FireIce/details/?track=DATA_SCIENCE&subTrack=MARATHON_MATCH" + } + } + } +} diff --git a/automated-smoke-test/config/automation-config-qa.json b/automated-smoke-test/config/automation-config-qa.json new file mode 100644 index 0000000000..8d6f4d00c8 --- /dev/null +++ b/automated-smoke-test/config/automation-config-qa.json @@ -0,0 +1,183 @@ +{ + "env": "dev", + "logoRedirectionUrl": "https://www.topcoder-dev.com/", + "businessUrl": "https://www.topcoder.com/", + "switchToBusinessUrl": "https://www.topcoder.com/", + "loginUrl": "https://auth.topcoder.com/", + "redirectLoginUrl": "https://accounts-auth0.topcoder.com/?retUrl=http://www.topcoder.com/", + "homePageUrl": "https://www.topcoder-dev.com/", + "splashPageUrl": "https://www.topcoder.com/splash/", + "logoutUrl": "https://www.topcoder-dev.com/logout", + "toolsUrl": "https://qa-community-app.topcoder-dev.com/settings/tools", + "accountUrl": "https://qa-community-app.topcoder-dev.com/settings/account", + "profileUrl": "https://qa-community-app.topcoder-dev.com/settings/profile", + "preferencesUrl": "https://qa-community-app.topcoder-dev.com/settings/preferences", + "challengeListingUrl": "https://qa-community-app.topcoder-dev.com/challenges", + "subMenuUrls": { + "overview": "https://qa-community-app.topcoder-dev.com/community/learn", + "howItWorks": "https://qa-community-app.topcoder-dev.com/thrive/tracks?track=Topcoder", + "allChallenges": "http://qa-community-app.topcoder-dev.com/challenges", + "competitiveProgramming": "https://accounts.topcoder-dev.com/", + "taas": "https://qa-community-app.topcoder-dev.com/gigs", + "practice": "https://qa-community-app.topcoder-dev.com/community/practice", + "competitiveProgrammingThrive": "https://qa-community-app.topcoder-dev.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://qa-community-app.topcoder-dev.com/thrive/tracks?track=Data%20Science&tax=", + "designThrive": "https://qa-community-app.topcoder-dev.com/thrive/tracks?track=Design&tax=", + "developmentThrive": "https://qa-community-app.topcoder-dev.com/thrive/tracks?track=Development&tax=", + "qaThrive": "https://qa-community-app.topcoder-dev.com/thrive/tracks?track=QA&tax=", + "tco": "https://qa-community-app.topcoder-dev.com/community/member-programs/topcoder-open", + "programs": "https://qa-community-app.topcoder-dev.com/community/member-programs", + "forums": "https://accounts.topcoder-dev.com/member", + "statistics": "https://qa-community-app.topcoder-dev.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://qa-community-app.topcoder-dev.com/thrive" + }, + "subMenuUrlsAfterLogin": { + "dashboard": "https://qa-community-app.topcoder-dev.com/my-dashboard", + "myProfile": "https://qa-community-app.topcoder-dev.com/members/tester1234", + "payments": "https://community.topcoder-dev.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "competitiveProgramming": "https://qa-community-app.topcoder-dev.com/community/arena", + "forums": "https://apps.topcoder-dev.com/forums/" + }, + "footerLinks": { + "allChallenges": "https://www.topcoder-dev.com/challenges", + "competitiveProgramming": "https://qa-community-app.topcoder-dev.com/community/arena", + "taas": "https://www.topcoder-dev.com/gigs", + "competitiveProgrammingThrive": "https://www.topcoder-dev.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://www.topcoder-dev.com/thrive/tracks?track=Data%20Science", + "designThrive": "https://www.topcoder-dev.com/thrive/tracks?track=Design", + "developmentThrive": "https://www.topcoder-dev.com/thrive/tracks?track=Development", + "qaThrive": "https://www.topcoder-dev.com/thrive/tracks?track=QA", + "tco": "https://www.topcoder-dev.com/community/member-programs/topcoder-open", + "programs": "https://www.topcoder-dev.com/community/member-programs", + "forums": "https://apps.topcoder.com/forums", + "statistics": "https://www.topcoder-dev.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://www.topcoder-dev.com/thrive", + "gettingPaid": "https://www.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=Getting%20Paid", + "faq": "https://www.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=FAQ", + "generalInfo": "https://www.topcoder-dev.com/thrive/tracks?track=Topcoder", + "websiteHelp": "mailto:support@topcoder.com", + "admins": "https://www.topcoder-dev.com/community/admins", + "contactUs": "https://www.topcoder-dev.com/community/contact", + "joinCommunity": "https://accounts.topcoder.com/member/registration?utm_source=community&utm_campaign=tc-footer&utm_medium=promotion", + "aboutCommunity": "https://www.topcoder-dev.com/community/learn", + "changeLog": "https://www.topcoder-dev.com/community/changelog", + "talkToSales": "https://go.topcoder.com/contact/", + "events": "https://www.topcoder-dev.com/community/events", + "terms": "https://www.topcoder-dev.com/community/terms", + "challengePipeline": "https://www.topcoder-dev.com/community/pipeline", + "practice": "https://www.topcoder-dev.com/community/practice" + }, + "footerLinksAfterLogin": { + "competitiveProgramming": "https://www.topcoder-dev.com/community/arena" + }, + "socialLinks": { + "facebook": "https://www.facebook.com/topcoder/", + "youtube": "https://www.youtube.com/c/TopcoderOfficial", + "linkedin": "www.linkedin.com", + "twitter": "https://twitter.com/topcoder", + "instagram": "https://www.instagram.com/topcoder/" + }, + "forumSettingUrl": "https://apps.topcoder-dev.com/forums/?module=Settings", + "paymentSettingUrl": "https://community.topcoder-dev.com/tc?module=EditPaymentPreferences", + "helpUrl": "https://community-app.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "searchUrl": "https://qa-community-app.topcoder-dev.com/search/members", + "allNotificationsUrl": "https://qa-community-app.topcoder-dev.com/notifications", + "policiesUrl": "https://www.topcoder.com/policy", + "username": "tester1234", + "password": "appirio123", + "email": "sathya.jayabal@gmail.com", + "challangesLinks": { + "rssFeedUrl": "http://feeds.topcoder-dev.com/challenges/feed", + "aboutUrl": "https://www.topcoder.com/about-the-2018-topcoder-open/", + "contactUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles/hc/en-us/articles/219069687-Contact-Support", + "privacyUrl": "https://www.topcoder-dev.com/privacy-policy/", + "helpUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "termsUrl": "https://www.topcoder-dev.com/community/how-it-works/terms/" + }, + "challengeDetail": { + "url": "https://qa-community-app.topcoder-dev.com/challenges/ee951f3e-8c3d-41d7-b232-aa8774ff7f27", + "termsLinkText": "Standard Terms for Topcoder Competitions v2.2", + "challengeName": "Test Automation challenge", + "challengeTag": "Challenge", + "termUrl": "https://qa-community-app.topcoder-dev.com/challenges/terms/detail/b11da5cd-713f-478d-90f4-f679ef53ee95", + "forumUrl": "https://apps.topcoder-dev.com/forums/?module=Category&categoryID=0", + "submissionUrl": "https://qa-community-app.topcoder-dev.com/challenges/ee951f3e-8c3d-41d7-b232-aa8774ff7f27/submit", + "scorecardUrl": "https://software.topcoder-dev.com/review/actions/ViewScorecard?scid=30001610" + }, + "myDashboard": { + "url": "https://qa-community-app.topcoder-dev.com/my-dashboard", + "challenge": { + "name": "Test_challenge_Automation", + "currentPhase": "Submission", + "linkToSubmit": "", + "userRole": "" + }, + "community": { + "name": "Blockchain Community", + "learnMoreUrl": "https://qa-community-app.topcoder-dev.com/__community__/blockchain" + } + }, + "memberProfile": { + "url": "https://qa-community-app.topcoder-dev.com/members", + "profileInfo": { + "handle": "iamtong", + "numberOfCollapsedSkills": 10, + "verifiedSkill": "HTML5", + "noneVerifiedSkill": "Marvel - Design", + "country": "THAILAND", + "memberSince": "MEMBER SINCE MAY, 2009", + "tracks": ["COPILOT", "DEVELOP", "DESIGN"], + "quote": "I'm a designer focusing on designing mobile/ web applications and user experience.", + "forumLink": "https://apps.topcoder-dev.com/forums/?module=History&userID=22781893" + }, + "memberHaveWebSectionInfo": { + "handle": "oton", + "webLink": "HTTPS://ARIFWIDIANTO.COM" + }, + "copilotProfile": { + "handle": "iamtong", + "trackName": "COPILOT", + "fullfillmentInfo": { + "name": "COPILOT", + "info": "100%", + "infoTitle": "FULFILLMENT", + "link": "https://qa-community-app.topcoder-dev.com/members/iamtong/details/?track=COPILOT&subTrack=COPILOT" + } + }, + "designProfile": { + "handle": "iamtong", + "trackName": "DESIGN", + "numberOfSubtracks": 11, + "winInfo": { + "name": "WEB DESIGNS", + "info": "189", + "infoTitle": "WINS", + "link": "https://qa-community-app.topcoder-dev.com/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" + } + }, + "developmentProfile": { + "handle": "winterflame", + "trackName": "DEVELOP", + "numberOfSubtracks": 14, + "winInfo": { + "name": "FIRST2FINISH", + "info": "2", + "infoTitle": "WINS", + "link": "https://qa-community-app.topcoder-dev.com/members/winterflame/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" + } + }, + "dataScienceProfile": { + "handle": "FireIce", + "trackName": "DATA_SCIENCE", + "numberOfSubtracks": 2, + "ratingInfo": { + "name": "MARATHON MATCH", + "info": "999", + "infoTitle": "RATING", + "link": "https://qa-community-app.topcoder-dev.com/members/FireIce/details/?track=DATA_SCIENCE&subTrack=MARATHON_MATCH" + } + } + } +} diff --git a/automated-smoke-test/config/automation-config-staging.json b/automated-smoke-test/config/automation-config-staging.json new file mode 100644 index 0000000000..348cbcc95a --- /dev/null +++ b/automated-smoke-test/config/automation-config-staging.json @@ -0,0 +1,184 @@ +{ + "env": "staging", + "logoRedirectionUrl": "https://www.topcoder.com/", + "businessUrl": "https://www.topcoder.com/", + "switchToBusinessUrl": "https://www.topcoder.com/", + "loginUrl": "https://auth.topcoder.com/", + "redirectLoginUrl": "https://accounts-auth0.topcoder.com/?retUrl=http://www.topcoder.com/", + "homePageUrl": "https://www.topcoder.com/", + "splashPageUrl": "https://www.topcoder.com/splash/", + "logoutUrl": "https://www.topcoder.com/logout", + "toolsUrl": "https://staging-community-app.topcoder.com/settings/tools", + "accountUrl": "https://staging-community-app.topcoder.com/settings/account", + "profileUrl": "https://staging-community-app.topcoder.com/settings/profile", + "preferencesUrl": "https://staging-community-app.topcoder.com/settings/preferences", + "challengeListingUrl": "https://staging-community-app.topcoder.com/challenges", + "subMenuUrls": { + "overview": "https://staging-community-app.topcoder.com/community/learn", + "howItWorks": "https://staging-community-app.topcoder.com/thrive/tracks?track=Topcoder", + "allChallenges": "http://staging-community-app.topcoder.com/challenges", + "competitiveProgramming": "https://staging-community-app.topcoder.com/community/arena", + "taas": "https://staging-community-app.topcoder.com/gigs", + "practice": "https://staging-community-app.topcoder.com/community/practice", + "competitiveProgrammingThrive": "https://staging-community-app.topcoder.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://staging-community-app.topcoder.com/thrive/tracks?track=Data%20Science&tax=", + "designThrive": "https://staging-community-app.topcoder.com/thrive/tracks?track=Design&tax=", + "developmentThrive": "https://staging-community-app.topcoder.com/thrive/tracks?track=Development&tax=", + "qaThrive": "https://staging-community-app.topcoder.com/thrive/tracks?track=QA&tax=", + "tco": "https://staging-community-app.topcoder.com/community/member-programs/topcoder-open", + "programs": "https://staging-community-app.topcoder.com/community/member-programs", + "forums": "https://accounts.topcoder.com/member", + "statistics": "https://staging-community-app.topcoder.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://staging-community-app.topcoder.com/thrive" + }, + "subMenuUrlsAfterLogin": { + "dashboard": "https://staging-community-app.topcoder.com/my-dashboard", + "myProfile": "https://staging-community-app.topcoder.com/members/CustomerUser", + "payments": "https://community.topcoder.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "competitiveProgramming": "https://staging-community-app.topcoder.com/community/arena", + "forums": "https://apps.topcoder.com/forums/" + }, + "footerLinks": { + "allChallenges": "https://www.topcoder.com/challenges", + "competitiveProgramming": "https://www.topcoder.com/community/arena", + "taas": "https://www.topcoder.com/gigs", + "competitiveProgrammingThrive": "https://www.topcoder.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://www.topcoder.com/thrive/tracks?track=Data%20Science", + "designThrive": "https://www.topcoder.com/thrive/tracks?track=Design", + "developmentThrive": "https://www.topcoder.com/thrive/tracks?track=Development", + "qaThrive": "https://www.topcoder.com/thrive/tracks?track=QA", + "tco": "https://www.topcoder.com/community/member-programs/topcoder-open", + "programs": "https://www.topcoder.com/community/member-programs", + "forums": "https://apps.topcoder.com/forums", + "statistics": "https://www.topcoder.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://www.topcoder.com/thrive", + "gettingPaid": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Getting%20Paid", + "faq": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=FAQ", + "generalInfo": "https://www.topcoder.com/thrive/tracks?track=Topcoder", + "websiteHelp": "mailto:support@topcoder.com", + "admins": "https://www.topcoder.com/community/admins", + "contactUs": "https://www.topcoder.com/community/contact", + "joinCommunity": "https://accounts.topcoder.com/member/registration?utm_source=community&utm_campaign=tc-footer&utm_medium=promotion", + "aboutCommunity": "https://www.topcoder.com/community/learn", + "changeLog": "https://www.topcoder.com/community/changelog", + "talkToSales": "https://go.topcoder.com/contact/", + "events": "https://www.topcoder.com/community/events", + "terms": "https://www.topcoder.com/community/terms", + "challengePipeline": "https://www.topcoder.com/community/pipeline", + "practice": "https://www.topcoder.com/community/practice" + }, + "footerLinksAfterLogin": { + "competitiveProgramming": "https://www.topcoder.com/community/arena" + }, + "socialLinks": { + "facebook": "https://www.facebook.com/topcoder/", + "youtube": "https://www.youtube.com/c/TopcoderOfficial", + "linkedin": "www.linkedin.com", + "twitter": "https://twitter.com/topcoder", + "instagram": "https://www.instagram.com/topcoder/" + }, + "forumSettingUrl": "https://apps.topcoder.com/forums/?module=Settings", + "paymentSettingUrl": "https://community.topcoder.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "helpUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "searchUrl": "https://staging-community-app.topcoder.com/search/members", + "allNotificationsUrl": "https://staging-community-app.topcoder.com/notifications", + "policiesUrl": "https://www.topcoder.com/policy", + "username": "CustomerUser", + "password": "appirio123", + "email": "topcoderconnect@gmail.com", + "challangesLinks": { + "rssFeedUrl": "http://feeds.topcoder.com/challenges/feed", + "aboutUrl": "https://www.topcoder.com/about-the-2018-topcoder-open/", + "contactUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles/hc/en-us/articles/219069687-Contact-Support", + "privacyUrl": "https://www.topcoder.com/privacy-policy/", + "helpUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "termsUrl": "https://www.topcoder.com/community/how-it-works/terms/" + }, + "challengeDetail": { + "url": "https://staging-community-app.topcoder.com/challenges/4bd5cf15-41ee-4932-927d-fda5731ec023", + "termsLinkText": "Standard Terms for Topcoder Competitions v2.2", + "challengeName": "[Do not register] Sample challenge for Automation.", + "challengeTag": "QA", + "termUrl": "https://staging-community-app.topcoder.com/challenges/terms/detail/9ef9dec4-dddb-48c9-9cce-659db68bc5ac", + "forumUrl": "https://apps.topcoder.com/forums/?module=Category&categoryID=82117", + "submissionUrl": "https://staging-community-app.topcoder.com/challenges/4bd5cf15-41ee-4932-927d-fda5731ec023/submit", + "scorecardUrl": "https://software.topcoder.com/review/actions/ViewScorecard?scid=30002133" + }, + "myDashboard": { + "url": "https://staging-community-app.topcoder.com/my-dashboard", + "challenge": { + "name": "Test challenge- Spec Preview", + "currentPhase": "Submission", + "linkToSubmit": "", + "userRole": "" + }, + "community": { + "name": "Blockchain Community", + "learnMoreUrl": "https://blockchain.topcoder.com/" + } + }, + "memberProfile": { + "url": "https://staging-community-app.topcoder.com/members", + "profileInfo": { + "handle": "iamtong", + "numberOfCollapsedSkills": 10, + "verifiedSkill": "HTML5", + "noneVerifiedSkill": "Marvel - Design", + "country": "THAILAND", + "memberSince": "MEMBER SINCE MAY, 2009", + "tracks": ["COPILOT", "DEVELOP", "DESIGN"], + "quote": "I'm a designer focusing on designing mobile/ web applications and user experience.", + "forumLink": "https://apps.topcoder.com/forums/?module=History&userID=22781893" + }, + "memberHaveWebSectionInfo": { + "handle": "oton", + "webLink": "HTTPS://ARIFWIDIANTO.COM" + }, + "copilotProfile": { + "handle": "iamtong", + "trackName": "COPILOT", + "fullfillmentInfo": { + "name": "COPILOT", + "info": "100%", + "infoTitle": "FULFILLMENT", + "link": "https://staging-community-app.topcoder.com/members/iamtong/details/?track=COPILOT&subTrack=COPILOT" + } + }, + "designProfile": { + "handle": "iamtong", + "trackName": "DESIGN", + "numberOfSubtracks": 11, + "winInfo": { + "name": "WEB DESIGNS", + "info": "258", + "infoTitle": "WINS", + "link": "https://staging-community-app.topcoder.com/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" + } + }, + "developmentProfile": { + "handle": "iamtong", + "trackName": "DEVELOP", + "numberOfSubtracks": 8, + "winInfo": { + "name": "FIRST2FINISH", + "info": "56", + "infoTitle": "WINS", + "link": "https://staging-community-app.topcoder.com/members/iamtong/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" + } + }, + "dataScienceProfile": { + "handle": "FireIce", + "trackName": "DATA_SCIENCE", + "numberOfSubtracks": 2, + "ratingInfo": { + "name": "MARATHON MATCH", + "info": "999", + "infoTitle": "RATING", + "link": "https://staging-community-app.topcoder.com/members/FireIce/details/?track=DATA_SCIENCE&subTrack=MARATHON_MATCH" + } + } + } +} + diff --git a/automated-smoke-test/config/automation-config-test.json b/automated-smoke-test/config/automation-config-test.json new file mode 100644 index 0000000000..874bfdabf6 --- /dev/null +++ b/automated-smoke-test/config/automation-config-test.json @@ -0,0 +1,183 @@ +{ + "env": "dev", + "logoRedirectionUrl": "https://www.topcoder-dev.com/", + "businessUrl": "https://www.topcoder-dev.com/", + "switchToBusinessUrl": "https://www.topcoder.com/", + "loginUrl": "https://auth.topcoder-dev.com/", + "redirectLoginUrl": "https://accounts-auth0.topcoder-dev.com/?retUrl=http://www.topcoder.com/", + "homePageUrl": "https://www.topcoder-dev.com/", + "splashPageUrl": "https://www.topcoder.com/splash/", + "logoutUrl": "https://www.topcoder-dev.com/logout", + "toolsUrl": "https://test-community-app.topcoder-dev.com/settings/tools", + "accountUrl": "https://test-community-app.topcoder-dev.com/settings/account", + "profileUrl": "https://test-community-app.topcoder-dev.com/settings/profile", + "preferencesUrl": "https://test-community-app.topcoder-dev.com/settings/preferences", + "challengeListingUrl": "https://test-community-app.topcoder-dev.com/challenges", + "subMenuUrls": { + "overview": "https://test-community-app.topcoder-dev.com/community/learn", + "howItWorks": "https://test-community-app.topcoder-dev.com/thrive/tracks?track=Topcoder", + "allChallenges": "http://test-community-app.topcoder-dev.com/challenges", + "competitiveProgramming": "https://accounts.topcoder-dev.com/", + "taas": "https://test-community-app.topcoder-dev.com/gigs", + "practice": "https://test-community-app.topcoder-dev.com/community/practice", + "competitiveProgrammingThrive": "https://test-community-app.topcoder-dev.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://test-community-app.topcoder-dev.com/thrive/tracks?track=Data%20Science&tax=", + "designThrive": "https://test-community-app.topcoder-dev.com/thrive/tracks?track=Design&tax=", + "developmentThrive": "https://test-community-app.topcoder-dev.com/thrive/tracks?track=Development&tax=", + "qaThrive": "https://test-community-app.topcoder-dev.com/thrive/tracks?track=QA&tax=", + "tco": "https://test-community-app.topcoder-dev.com/community/member-programs/topcoder-open", + "programs": "https://test-community-app.topcoder-dev.com/community/member-programs", + "forums": "https://accounts.topcoder-dev.com/member", + "statistics": "https://test-community-app.topcoder-dev.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://test-community-app.topcoder-dev.com/thrive" + }, + "subMenuUrlsAfterLogin": { + "dashboard": "https://test-community-app.topcoder-dev.com/my-dashboard", + "myProfile": "https://test-community-app.topcoder-dev.com/members/tester1234", + "payments": "https://community.topcoder-dev.com/PactsMemberServlet?module=PaymentHistory&full_list=false", + "competitiveProgramming": "https://test-community-app.topcoder-dev.com/community/arena", + "forums": "https://apps.topcoder-dev.com/forums/" + }, + "footerLinks": { + "allChallenges": "https://www.topcoder-dev.com/challenges", + "competitiveProgramming": "https://test-community-app.topcoder-dev.com/community/arena", + "taas": "https://www.topcoder-dev.com/gigs", + "competitiveProgrammingThrive": "https://www.topcoder-dev.com/thrive/tracks?track=Competitive%20Programming", + "dataScienceThrive": "https://www.topcoder-dev.com/thrive/tracks?track=Data%20Science", + "designThrive": "https://www.topcoder-dev.com/thrive/tracks?track=Design", + "developmentThrive": "https://www.topcoder-dev.com/thrive/tracks?track=Development", + "qaThrive": "https://www.topcoder-dev.com/thrive/tracks?track=QA", + "tco": "https://www.topcoder-dev.com/community/member-programs/topcoder-open", + "programs": "https://www.topcoder-dev.com/community/member-programs", + "forums": "https://apps.topcoder.com/forums", + "statistics": "https://www.topcoder-dev.com/community/statistics", + "blog": "https://www.topcoder.com/blog/", + "thrive": "https://www.topcoder-dev.com/thrive", + "gettingPaid": "https://www.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=Getting%20Paid", + "faq": "https://www.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=FAQ", + "generalInfo": "https://www.topcoder-dev.com/thrive/tracks?track=Topcoder", + "websiteHelp": "mailto:support@topcoder.com", + "admins": "https://www.topcoder-dev.com/community/admins", + "contactUs": "https://www.topcoder-dev.com/community/contact", + "joinCommunity": "https://accounts.topcoder.com/member/registration?utm_source=community&utm_campaign=tc-footer&utm_medium=promotion", + "aboutCommunity": "https://www.topcoder-dev.com/community/learn", + "changeLog": "https://www.topcoder-dev.com/community/changelog", + "talkToSales": "https://go.topcoder.com/contact/", + "events": "https://www.topcoder-dev.com/community/events", + "terms": "https://www.topcoder-dev.com/community/terms", + "challengePipeline": "https://www.topcoder-dev.com/community/pipeline", + "practice": "https://www.topcoder-dev.com/community/practice" + }, + "footerLinksAfterLogin": { + "competitiveProgramming": "https://www.topcoder-dev.com/community/arena" + }, + "socialLinks": { + "facebook": "https://www.facebook.com/topcoder/", + "youtube": "https://www.youtube.com/c/TopcoderOfficial", + "linkedin": "www.linkedin.com", + "twitter": "https://twitter.com/topcoder", + "instagram": "https://www.instagram.com/topcoder/" + }, + "forumSettingUrl": "https://apps.topcoder-dev.com/forums/?module=Settings", + "paymentSettingUrl": "https://community.topcoder-dev.com/tc?module=EditPaymentPreferences", + "helpUrl": "https://community-app.topcoder-dev.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "searchUrl": "https://test-community-app.topcoder-dev.com/search/members", + "allNotificationsUrl": "https://test-community-app.topcoder-dev.com/notifications", + "policiesUrl": "https://www.topcoder-dev.com/policy", + "username": "tester1234", + "password": "appirio123", + "email": "sathya.jayabal@gmail.com", + "challangesLinks": { + "rssFeedUrl": "http://feeds.topcoder-dev.com/challenges/feed", + "aboutUrl": "https://www.topcoder.com/about-the-2018-topcoder-open/", + "contactUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles/hc/en-us/articles/219069687-Contact-Support", + "privacyUrl": "https://www.topcoder-dev.com/privacy-policy/", + "helpUrl": "https://www.topcoder.com/thrive/tracks?track=Topcoder&tax=Help%20Articles", + "termsUrl": "https://www.topcoder-dev.com/community/how-it-works/terms/" + }, + "challengeDetail": { + "url": "https://test-community-app.topcoder-dev.com/challenges/ee951f3e-8c3d-41d7-b232-aa8774ff7f27", + "termsLinkText": "Standard Terms for Topcoder Competitions v2.2", + "challengeName": "Test Automation challenge", + "challengeTag": "Challenge", + "termUrl": "https://test-community-app.topcoder-dev.com/challenges/terms/detail/b11da5cd-713f-478d-90f4-f679ef53ee95", + "forumUrl": "https://apps.topcoder-dev.com/forums/?module=Category&categoryID=0", + "submissionUrl": "https://test-community-app.topcoder-dev.com/challenges/ee951f3e-8c3d-41d7-b232-aa8774ff7f27/submit", + "scorecardUrl": "https://software.topcoder-dev.com/review/actions/ViewScorecard?scid=30001610" + }, + "myDashboard": { + "url": "https://test-community-app.topcoder-dev.com/my-dashboard", + "challenge": { + "name": "Test_challenge_Automation", + "currentPhase": "Submission", + "linkToSubmit": "", + "userRole": "" + }, + "community": { + "name": "Blockchain Community", + "learnMoreUrl": "https://test-community-app.topcoder-dev.com/__community__/blockchain" + } + }, + "memberProfile": { + "url": "https://test-community-app.topcoder-dev.com/members", + "profileInfo": { + "handle": "iamtong", + "numberOfCollapsedSkills": 10, + "verifiedSkill": "HTML5", + "noneVerifiedSkill": "Marvel - Design", + "country": "THAILAND", + "memberSince": "MEMBER SINCE MAY, 2009", + "tracks": ["COPILOT", "DEVELOP", "DESIGN"], + "quote": "I'm a designer focusing on designing mobile/ web applications and user experience.", + "forumLink": "https://apps.topcoder-dev.com/forums/?module=History&userID=22781893" + }, + "memberHaveWebSectionInfo": { + "handle": "oton", + "webLink": "HTTPS://ARIFWIDIANTO.COM" + }, + "copilotProfile": { + "handle": "iamtong", + "trackName": "COPILOT", + "fullfillmentInfo": { + "name": "COPILOT", + "info": "100%", + "infoTitle": "FULFILLMENT", + "link": "https://test-community-app.topcoder-dev.com/members/iamtong/details/?track=COPILOT&subTrack=COPILOT" + } + }, + "designProfile": { + "handle": "iamtong", + "trackName": "DESIGN", + "numberOfSubtracks": 11, + "winInfo": { + "name": "WEB DESIGNS", + "info": "189", + "infoTitle": "WINS", + "link": "https://test-community-app.topcoder-dev.com/members/iamtong/details/?track=DESIGN&subTrack=WEB_DESIGNS" + } + }, + "developmentProfile": { + "handle": "winterflame", + "trackName": "DEVELOP", + "numberOfSubtracks": 14, + "winInfo": { + "name": "FIRST2FINISH", + "info": "2", + "infoTitle": "WINS", + "link": "https://test-community-app.topcoder-dev.com/members/winterflame/details/?track=DEVELOP&subTrack=FIRST_2_FINISH" + } + }, + "dataScienceProfile": { + "handle": "FireIce", + "trackName": "DATA_SCIENCE", + "numberOfSubtracks": 2, + "ratingInfo": { + "name": "MARATHON MATCH", + "info": "999", + "infoTitle": "RATING", + "link": "https://test-community-app.topcoder-dev.com/members/FireIce/details/?track=DATA_SCIENCE&subTrack=MARATHON_MATCH" + } + } + } +} diff --git a/automated-smoke-test/gitignore b/automated-smoke-test/gitignore new file mode 100644 index 0000000000..b40c48a20e --- /dev/null +++ b/automated-smoke-test/gitignore @@ -0,0 +1,3 @@ +node_modules +test-results +temp \ No newline at end of file diff --git a/automated-smoke-test/logger/logger.ts b/automated-smoke-test/logger/logger.ts new file mode 100644 index 0000000000..a4e578a888 --- /dev/null +++ b/automated-smoke-test/logger/logger.ts @@ -0,0 +1,4 @@ +import { createLogger, transports } from "winston"; +export const logger = createLogger({ + transports: [new transports.Console()] +}); diff --git a/automated-smoke-test/package-lock.json b/automated-smoke-test/package-lock.json new file mode 100644 index 0000000000..635cba51fa --- /dev/null +++ b/automated-smoke-test/package-lock.json @@ -0,0 +1,2723 @@ +{ + "name": "automated-smoke-test", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@types/jasmine": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.5.10.tgz", + "integrity": "sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew==", + "dev": true + }, + "@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, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/lodash": { + "version": "4.14.159", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.159.tgz", + "integrity": "sha512-gF7A72f7WQN33DpqOWw9geApQPh4M3PxluMtaHxWHXEGSN12/WbcEk/eNSqWNQcQhF66VSZ06vCF94CrHwXJDg==", + "dev": true + }, + "@types/node": { + "version": "12.12.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.39.tgz", + "integrity": "sha512-pADGfwnDkr6zagDwEiCVE4yQrv7XDkoeVa4OfA9Ju/zRTk6YNDLGtQbkdL4/56mCQQCs4AhNrBIag6jrp7ZuOg==" + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=" + }, + "@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==" + }, + "abab": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==" + }, + "acorn": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==" + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" + } + } + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + }, + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=" + }, + "adm-zip": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz", + "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "archiver": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^2.6.3", + "buffer-crc32": "^0.2.1", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" + } + }, + "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==", + "requires": { + "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" + }, + "dependencies": { + "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==", + "requires": { + "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" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arguments-extended": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/arguments-extended/-/arguments-extended-0.0.3.tgz", + "integrity": "sha1-YQfkkX0OtvCk3WYyD8Fa/HLvSUY=", + "requires": { + "extended": "~0.0.3", + "is-extended": "~0.0.8" + } + }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + }, + "array-extended": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/array-extended/-/array-extended-0.0.11.tgz", + "integrity": "sha1-1xRK50jek8pybxIQCdv/FibRZL0=", + "requires": { + "arguments-extended": "~0.0.3", + "extended": "~0.0.3", + "is-extended": "~0.0.3" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "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=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "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==" + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "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==", + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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==" + }, + "browserstack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.0.tgz", + "integrity": "sha512-HJDJ0TSlmkwnt9RZ+v5gFpa1XZTBYTj0ywvLwJ3241J7vMw2jAsGNVhKHtmCOyg+VxeLZyaibO9UL71AsUeDIw==", + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-indexof-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz", + "integrity": "sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8=" + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + }, + "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 + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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=" + }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "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==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colornames": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/colornames/-/colornames-1.1.1.tgz", + "integrity": "sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y=" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "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 + }, + "compress-commons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "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==", + "requires": { + "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" + } + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "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=" + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", + "requires": { + "crc": "^3.4.4", + "readable-stream": "^3.4.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "date-extended": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/date-extended/-/date-extended-0.0.6.tgz", + "integrity": "sha1-I4AtV90b94GIE/4MMuhRqG2iZ8k=", + "requires": { + "array-extended": "~0.0.3", + "extended": "~0.0.3", + "is-extended": "~0.0.3" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "declare.js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/declare.js/-/declare.js-0.0.8.tgz", + "integrity": "sha1-BHit/5VkwAT1Hfc9i8E0AZ0o3N4=" + }, + "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=" + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "requires": { + "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" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "diagnostics": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", + "integrity": "sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ==", + "requires": { + "colorspace": "1.1.x", + "enabled": "1.0.x", + "kuler": "1.0.x" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "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==", + "requires": { + "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" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "enabled": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", + "integrity": "sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M=", + "requires": { + "env-variable": "0.0.x" + } + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "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==", + "requires": { + "once": "^1.4.0" + } + }, + "env-variable": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.6.tgz", + "integrity": "sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg==" + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "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==" + } + } + }, + "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=" + }, + "escodegen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "exceljs": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/exceljs/-/exceljs-1.15.0.tgz", + "integrity": "sha512-72CySYLU1oBIixpBkWV0mR6YM+X8v2GyyWgKBovS9Hso0Ul7S3FtlWGeAifxB+lpzznokWMRDLMZ8EyS2tX6xg==", + "requires": { + "archiver": "^3.0.0", + "fast-csv": "^2.4.1", + "jszip": "^3.1.5", + "moment": "^2.22.2", + "promish": "^5.1.1", + "sax": "^1.2.4", + "tmp": "^0.1.0", + "unzipper": "^0.9.12" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "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" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extended": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/extended/-/extended-0.0.6.tgz", + "integrity": "sha1-f7i/e52uOXWG5IVwrP1kLHjlBmk=", + "requires": { + "extender": "~0.0.5" + } + }, + "extender": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/extender/-/extender-0.0.10.tgz", + "integrity": "sha1-WJwHSCvmGhRgttgfnCSqZ+jzJM0=", + "requires": { + "declare.js": "~0.0.4" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-csv": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-2.5.0.tgz", + "integrity": "sha512-M/9ezLU9/uDwvDZTt9sNFJa0iLDUsbhYJwPtnE0D9MjeuB6DY9wRCyUPZta9iI6cSz5wBWGaUPL61QH8h92cNA==", + "requires": { + "extended": "0.0.6", + "is-extended": "0.0.10", + "object-extended": "0.0.7", + "safer-buffer": "^2.1.2", + "string-extended": "0.0.8" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "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==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "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==" + }, + "fecha": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz", + "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "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==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "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==" + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "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==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "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" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "requires": { + "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" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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==", + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "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==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "imap": { + "version": "0.8.19", + "resolved": "https://registry.npmjs.org/imap/-/imap-0.8.19.tgz", + "integrity": "sha1-NniHOTSrCc6mukh0HyhNoq9Z2NU=", + "requires": { + "readable-stream": "1.1.x", + "utf7": ">=1.0.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "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==" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "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==" + }, + "is-extended": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/is-extended/-/is-extended-0.0.10.tgz", + "integrity": "sha1-JE4UDfdbscmjEG9BL/GC+1NKbWI=", + "requires": { + "extended": "~0.0.3" + } + }, + "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=" + }, + "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=" + }, + "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==", + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "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=", + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jasmine": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.5.0.tgz", + "integrity": "sha512-DYypSryORqzsGoMazemIHUfMkXM7I7easFaxAvNM3Mr6Xz3Fy36TupTrAOxZWN8MVKEU5xECv22J4tUQf3uBzQ==", + "requires": { + "glob": "^7.1.4", + "jasmine-core": "~3.5.0" + } + }, + "jasmine-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==" + }, + "jasmine-reporters": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz", + "integrity": "sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A==", + "requires": { + "mkdirp": "^0.5.1", + "xmldom": "^0.1.22" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=" + }, + "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 + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "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==", + "requires": { + "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" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "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==" + }, + "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=" + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.4.0.tgz", + "integrity": "sha512-gZAOYuPl4EhPTXT0GjhI3o+ZAz3su6EhLrKUoAivcKqyqC7laS5JEv4XWZND9BgcDcF83vI85yGbDmDR6UhrIg==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + }, + "dependencies": { + "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==", + "requires": { + "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" + } + } + } + }, + "klaw-sync": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-2.1.0.tgz", + "integrity": "sha1-PTvNhgDnv971MjHHOf8FOu1WDkQ=", + "requires": { + "graceful-fs": "^4.1.11" + } + }, + "kuler": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-1.0.1.tgz", + "integrity": "sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ==", + "requires": { + "colornames": "^1.1.1" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "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==", + "requires": { + "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" + } + } + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, + "logform": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", + "integrity": "sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^2.3.3", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, + "mail-listener2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/mail-listener2/-/mail-listener2-0.3.1.tgz", + "integrity": "sha1-GBRJfZYy/Y6vTjywg6qQEpZh+ok=", + "requires": { + "async": "^0.9.0", + "imap": "~0.8.14", + "mailparser": "~0.4.6" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + } + } + }, + "mailparser": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/mailparser/-/mailparser-0.4.9.tgz", + "integrity": "sha1-HQpI1vqqovCawTmO0CPY746xnis=", + "requires": { + "encoding": ">=0.1.4", + "mime": "*", + "mimelib": ">=0.2.17", + "uue": "~1.0.0" + } + }, + "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==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mime": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", + "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "mimelib": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.3.1.tgz", + "integrity": "sha1-eHrdJBXYJ6yzr27EvKHqlZZBiFM=", + "requires": { + "addressparser": "~1.0.1", + "encoding": "~0.1.12" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.25.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.25.3.tgz", + "integrity": "sha512-PuYv0PHxZvzc15Sp8ybUCoQ+xpyPWvjOuK72a5ovzp2LI32rJXOiIfyoFoYvG3s6EwwrdkMyWuRiEHSZRLJNdg==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "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=", + "requires": { + "path-key": "^2.0.0" + } + }, + "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=" + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-extended": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/object-extended/-/object-extended-0.0.7.tgz", + "integrity": "sha1-hP0j9WsVWCrrPoiwXLVdJDLWijM=", + "requires": { + "array-extended": "~0.0.4", + "extended": "~0.0.3", + "is-extended": "~0.0.3" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "one-time": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", + "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "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" + } + }, + "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==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "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=" + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "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==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "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==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "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==" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "papaparse": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-4.6.3.tgz", + "integrity": "sha512-LRq7BrHC2kHPBYSD50aKuw/B/dGcg29omyJbKWY3KsYUZU69RKwaBHu13jGmCYBtOc4odsLCrFyk6imfyNubJQ==" + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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=" + }, + "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=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "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 + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "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==" + }, + "promish": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/promish/-/promish-5.1.1.tgz", + "integrity": "sha512-37xEzvSas6JIYI/BcKh5TwhaqWepI44u/hC+tQStkX1sxMf+L756beESPgSWirxRCPqtXHzosoNzpjLnTnP8FA==", + "requires": { + "es6-promise": "^3.0.2" + } + }, + "protractor": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", + "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", + "requires": { + "@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" + }, + "dependencies": { + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + } + }, + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=" + } + } + }, + "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==", + "requires": { + "circular-json": "^0.3.1", + "fs-extra": "^3.0.1", + "klaw-sync": "^2.1.0", + "mkdirp": "~0.3.5" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + } + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "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==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "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" + }, + "dependencies": { + "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==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "request-promise-core": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", + "requires": { + "lodash": "^4.17.15" + } + }, + "request-promise-native": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", + "requires": { + "request-promise-core": "1.1.3", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "dependencies": { + "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==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "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=" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "requires": { + "xmlchars": "^2.1.1" + } + }, + "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==", + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "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=" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "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 + }, + "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==", + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "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" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "string-extended": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/string-extended/-/string-extended-0.0.8.tgz", + "integrity": "sha1-dBlX3/SHsCcqee7FpE8jnubxfM0=", + "requires": { + "array-extended": "~0.0.5", + "date-extended": "~0.0.3", + "extended": "~0.0.3", + "is-extended": "~0.0.3" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "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", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "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==" + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "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==" + }, + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "requires": { + "rimraf": "^2.6.3" + } + }, + "topcoder-testing-lib": { + "version": "git+https://github.com/topcoder-platform/topcoder-testing-lib.git#a5a1ebf0b5fce818fc38339af4d0106fe5a79974", + "from": "git+https://github.com/topcoder-platform/topcoder-testing-lib.git#develop", + "requires": { + "@types/node": "^12.7.8", + "jsdom": "^15.1.1", + "protractor": "^5.4.2", + "typescript": "^3.5.3", + "winston": "^3.2.1" + } + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, + "tslib": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.12.0.tgz", + "integrity": "sha512-5rxCQkP0kytf4H1T4xz1imjxaUUPMvc5aWp0rJ/VMIN7ClRiH1FwFvBt8wOeMasp/epeUnmSW6CixSIePtiLqA==", + "dev": true + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "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==" + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typescript": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.2.tgz", + "integrity": "sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unzipper": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.9.15.tgz", + "integrity": "sha512-2aaUvO4RAeHDvOCuEtth7jrHFaCKTSXPqUkXwADaLBzGbgZGzUDccoEdJ5lW+3RmfpOZYNx0Rw6F6PUzM6caIA==", + "requires": { + "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", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "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==", + "requires": { + "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" + } + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "utf7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/utf7/-/utf7-1.0.2.tgz", + "integrity": "sha1-lV9JCq5lO6IguUVqCod2wZk2CZE=", + "requires": { + "semver": "~5.3.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uue/-/uue-1.0.0.tgz", + "integrity": "sha1-ITuUSLmLmLnQPK9gGiI1ib2IZDA=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "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==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "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==", + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "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==", + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webdriver-manager": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.7.tgz", + "integrity": "sha512-XINj6b8CYuUYC93SG3xPkxlyUc3IJbD6Vvo75CVGuG9uzsefDzWQrhz0Lq8vbPxtb4d63CZdYophF8k8Or/YiA==", + "requires": { + "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" + } + }, + "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==" + }, + "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==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "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==" + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "winston": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.2.1.tgz", + "integrity": "sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw==", + "requires": { + "async": "^2.6.1", + "diagnostics": "^1.1.1", + "is-stream": "^1.1.0", + "logform": "^2.1.1", + "one-time": "0.0.4", + "readable-stream": "^3.1.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.3.0" + } + }, + "winston-transport": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.3.0.tgz", + "integrity": "sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A==", + "requires": { + "readable-stream": "^2.3.6", + "triple-beam": "^1.2.0" + }, + "dependencies": { + "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==", + "requires": { + "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" + } + } + } + }, + "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==" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "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=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" + }, + "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==" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "requires": { + "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" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "zip-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", + "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + } + } + } +} diff --git a/automated-smoke-test/package.json b/automated-smoke-test/package.json new file mode 100644 index 0000000000..ec408e5a06 --- /dev/null +++ b/automated-smoke-test/package.json @@ -0,0 +1,43 @@ +{ + "name": "automated-smoke-test", + "version": "1.0.0", + "description": "Community App Automation Tests", + "main": "conf.js", + "dependencies": { + "@types/node": "^12.7.8", + "exceljs": "^1.13.0", + "jasmine": "^3.4.0", + "jasmine-reporters": "^2.3.2", + "jsdom": "^15.1.1", + "lodash": "^4.17.19", + "mail-listener2": "^0.3.1", + "papaparse": "^4.6.3", + "protractor": "^5.4.2", + "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" + }, + "scripts": { + "tsc": "tsc", + "clean": "rimraf temp/ && rimraf download/ && rimraf test-results/", + "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", + "local-test":"cp config/automation-config-local.json config/config.json && protractor temp/conf.js" + }, + "keywords": [ + "protractor", + "jasmine", + "typescript" + ] +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/challenge-detail/challenge-detail.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/challenge-detail/challenge-detail.helper.ts new file mode 100644 index 0000000000..23f4173703 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/challenge-detail/challenge-detail.helper.ts @@ -0,0 +1,430 @@ +import { ConfigHelper } from '../../../../utils/config-helper'; +import { CommonHelper } from '../common-page/common.helper'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { ChallengeDetailPageObject } from './challenge-detail.po'; +import { logger } from '../../../../logger/logger'; + +export class ChallengeDetailPageHelper { + /** + * Opens the Challenge detail page + */ + public static async open() { + await ChallengeDetailPageObject.open(); + await this.waitForLoadingNewChallengInfo(); + } + + /** + * wait for loading challenge info + */ + static async waitForLoadingNewChallengInfo() { + await CommonHelper.waitUntilVisibilityOf( + () => ElementHelper.getElementByTag('h1'), + 'Wait for h1 tag', + true + ); + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeDetailPageObject.backButton, + 'Wait for challenge detail backbutton', + true + ); + } + + /** + * click on back button + */ + static async clickOnBackButton() { + await this.waitForLoadingNewChallengInfo(); + await ChallengeDetailPageObject.backButton.click(); + logger.info('Back button pressed on challenge detail page'); + } + + /** + * accept terms if it show term popup + */ + private static async acceptTermsIfNeeded() { + const termsAgreementButton = CommonHelper.findElementByText( + 'button', + 'I Agree' + ); + const termsAgreementButtonVisibility = await CommonHelper.isDisplayed( + termsAgreementButton + ); + if (termsAgreementButtonVisibility) { + await termsAgreementButton.click(); + } + } + + /** + * register if not already registered + */ + static async registerIfNotAlreadyRegistered() { + const registerButton = CommonHelper.findElementByText('button', 'Register'); + const isRegisterButtonPresent = await CommonHelper.isDisplayed( + registerButton + ); + if (!isRegisterButtonPresent) { + return; + } + + await CommonHelper.findElementByText('button', 'Register').click(); + + await this.acceptTermsIfNeeded(); + + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('button', 'Unregister'), + 'Wait for unregister button', + true + ); + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('a', 'CHALLENGE FORUM'), + 'Wait for challenge forum tab', + false + ); + } + + /** + * unregister if already registerd + */ + static async unregisterIfAlreadyRegistered() { + const registerButton = CommonHelper.findElementByText( + 'button', + 'Unregister' + ); + const isRegisterButtonPresent = await CommonHelper.isDisplayed( + registerButton + ); + if (!isRegisterButtonPresent) { + return; + } + + await CommonHelper.findElementByText('button', 'Unregister').click(); + + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('button', 'Register'), + 'Wait for Register', + true + ); + } + + /** + * register challenge + */ + static async register() { + const registerButton = CommonHelper.findElementByText('button', 'Register'); + const isRegisterButtonPresent = await CommonHelper.isDisplayed( + registerButton + ); + if (!isRegisterButtonPresent) { + const unregisterButton = CommonHelper.findElementByText( + 'button', + 'Unregister' + ); + const isUnregisterButtonPresent = CommonHelper.isDisplayed( + unregisterButton + ); + if (isUnregisterButtonPresent) { + await unregisterButton.click(); + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('button', 'Register'), + 'Wait for Register', + false + ); + } + } + + await CommonHelper.findElementByText('button', 'Register').click(); + + await this.acceptTermsIfNeeded(); + + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('button', 'Unregister'), + 'Wait for Unregister', + false + ); + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('a', 'CHALLENGE FORUM'), + 'Wait for challenge forum', + false + ); + } + + /** + * unregister challenge + */ + static async unregister() { + const unregisterButton = CommonHelper.findElementByText( + 'button', + 'Unregister' + ); + const isUnregisterButtonPresent = CommonHelper.isDisplayed( + unregisterButton + ); + if (isUnregisterButtonPresent) { + await unregisterButton.click(); + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('button', 'Register'), + 'Wait for Register', + false + ); + } + + const registerButton = CommonHelper.findElementByText('button', 'Register'); + const isRegisterButtonPresent = await CommonHelper.isDisplayed( + registerButton + ); + expect(isRegisterButtonPresent).toBe(true); + } + + /** + * Click on terms link + */ + static async clickOnTermsLink() { + await CommonHelper.waitUntilVisibilityOf( + () => + CommonHelper.findElementByText( + 'a', + ConfigHelper.getChallengeDetail().termsLinkText + ), + 'wait for term link', + false + ); + await BrowserHelper.executeScript('arguments[0].scrollIntoView();', CommonHelper.findElementByText( + 'a', + ConfigHelper.getChallengeDetail().termsLinkText + )); + await CommonHelper.findElementByText( + 'a', + ConfigHelper.getChallengeDetail().termsLinkText + ).click(); + logger.info('Terms link clicked'); + } + + /** + * verify terms authentication error + */ + static async verifyTermsAuthenticationError() { + await CommonHelper.waitUntilVisibilityOf( + () => + CommonHelper.findElementByText( + 'div', + 'Authentication credential was missing.' + ), + 'Wait for error term message', + true + ); + + const url = await BrowserHelper.getCurrentUrl(); + expect(url).toEqual(ConfigHelper.getChallengeDetail().termUrl); + } + + /** + * click on submit button + */ + static async clickOnSubmitButton() { + await CommonHelper.findElementByText('a', 'Submit').click(); + logger.info('Submit button clicked'); + } + + /** + * upload submission + */ + static async uploadSubmission() { + await this.clickOnSubmitButton(); + + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeDetailPageObject.pickFile, + 'Wait for pick file', + false + ); + + await ChallengeDetailPageObject.pickFile.click(); + + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeDetailPageObject.fileModal, + 'Wait for file modal', + false + ); + } + + /** + * verify challenge forum link + */ + static async verifyChallengeForumLink() { + const href = await CommonHelper.findElementByText( + 'a', + 'CHALLENGE FORUM' + ).getAttribute('href'); + expect(href).toEqual(ConfigHelper.getChallengeDetail().forumUrl); + } + + /** + * verify submission page + */ + static async verifySubmissionPage() { + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeDetailPageObject.submissionContainer, + 'Wait for submission container', + false + ); + const browserUrl = await BrowserHelper.getCurrentUrl(); + expect(browserUrl).toEqual(ConfigHelper.getChallengeDetail().submissionUrl); + logger.info('User redirected to submission page'); + } + + /** + * verify challenge deadlines + */ + static async verifyDeadlines() { + await CommonHelper.findElementByText('span', 'Show Deadlines').click(); + + const isDisplayed = await CommonHelper.isDisplayed( + CommonHelper.findElementByText('span', 'Hide Deadlines') + ); + expect(isDisplayed).toBe(true); + + const tabPanel = ChallengeDetailPageObject.tabPanel; + const timezone = await ElementHelper.getElementByTag( + 'p', + tabPanel + ).getText(); + expect(timezone.startsWith('Timezone')).toBe(true); + + const childDivs = await ElementHelper.getAllElementsByTag('div', tabPanel); + const expectedDeadlines = [ + 'Started', + 'Registration', + 'Submission', + 'Review', + 'Winners', + ]; + for (let i = 0; i < childDivs.length; i++) { + const text = await childDivs[i].getText(); + expect(text.startsWith(expectedDeadlines[i])).toBe(true); + } + } + + /** + * switch to details tab + */ + static async switchToDetailsTab() { + await CommonHelper.findElementByText('a', 'DETAILS').click(); + logger.info('Switched to Details tab'); + } + + /** + * get all challenge detail tabs + */ + static async getAllTabs() { + const tabs = await ElementHelper.getAllElementsByTag( + 'a', + ElementHelper.getElementByXPath( + '..', + CommonHelper.findElementByText('a', 'DETAILS') + ) + ); + return tabs; + } + + /** + * verify challenge detail tab + */ + static async verifyDetailsTab() { + const challengeOverviewEl = CommonHelper.findElementByText( + 'h2', + 'Challenge Overview' + ); + const isDisplayed = await CommonHelper.isDisplayed(challengeOverviewEl); + expect(isDisplayed).toBe(true); + + const tabs = await this.getAllTabs(); + const ariaLabel = await tabs[0].getAttribute('aria-selected'); + expect(ariaLabel).toBe('true'); + } + + /** + * swtich to registrants tab + */ + static async switchToRegistrantsTab() { + const tabs = await this.getAllTabs(); + await tabs[1].click(); + logger.info('Switched to Registrants tab'); + } + + /** + * verify registrants tab + */ + static async verifyRegistrantsTab() { + const isDisplayed = await CommonHelper.isDisplayed( + ChallengeDetailPageObject.registrantsTable + ); + expect(isDisplayed).toBe(true); + + const tabs = await this.getAllTabs(); + const ariaLabel = await tabs[1].getAttribute('aria-selected'); + expect(ariaLabel).toBe('true'); + } + + /** + * switch to submissions tab + */ + static async switchToSubmissionsTab() { + const tabs = await this.getAllTabs(); + await tabs[2].click(); + logger.info('Switched to Submissions tab'); + } + + /** + * verify submissions tab + */ + static async verifySubmissionsTab() { + const isUsernameDisplayed = await CommonHelper.isDisplayed( + CommonHelper.findElementByText('span', 'Username') + ); + expect(isUsernameDisplayed).toBe(true); + + const isSubmissionDateDisplayed = await CommonHelper.isDisplayed( + CommonHelper.findElementByText('span', 'Submission Date') + ); + expect(isSubmissionDateDisplayed).toBe(true); + + const tabs = await this.getAllTabs(); + const ariaLabel = await tabs[2].getAttribute('aria-selected'); + expect(ariaLabel).toBe('true'); + } + + /** + * click on review scorecard link + */ + static async clickOnReviewScorecardLink() { + await CommonHelper.findElementByText('a', 'Review Scorecard').click(); + logger.info('Review Scorecard link clicked'); + } + + /** + * verify scorecard page + */ + static async verifyScorecardPage() { + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeDetailPageObject.scoreCardContainer, + 'Wait for scorecard container', + true + ); + const browserUrl = await BrowserHelper.getCurrentUrl(); + expect(browserUrl).toEqual(ConfigHelper.getChallengeDetail().scorecardUrl); + logger.info('User redirected to scorecard page'); + } + + /** + * verify terms page + */ + static async verifyTermsPage() { + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeDetailPageObject.termContainer, + 'Wait for term container', + false + ); + const browserUrl = await BrowserHelper.getCurrentUrl(); + expect(browserUrl).toEqual(ConfigHelper.getChallengeDetail().termUrl); + logger.info('User redirected to terms page'); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/challenge-detail/challenge-detail.po.ts b/automated-smoke-test/page-objects/pages/topcoder/challenge-detail/challenge-detail.po.ts new file mode 100644 index 0000000000..79439c629a --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/challenge-detail/challenge-detail.po.ts @@ -0,0 +1,73 @@ +import { BrowserHelper, ElementHelper, Keys } from 'topcoder-testing-lib'; +import { logger } from '../../../../logger/logger'; +import { ConfigHelper } from '../../../../utils/config-helper'; +import { CommonHelper } from '../common-page/common.helper'; + +export class ChallengeDetailPageObject { + /** + * Open the Challenge detail page + */ + static async open() { + await BrowserHelper.open(ConfigHelper.getChallengeDetail().url); + logger.info('User navigated to Challenge Detail Page'); + } + + /** + * back button + */ + static get backButton() { + return CommonHelper.getLinkByAriaLabel('Back to challenge list'); + } + + /** + * pick file link + */ + static get pickFile() { + return CommonHelper.getLinkByAriaLabel('Select file to upload'); + } + + /** + * get file modal + */ + static get fileModal() { + return ElementHelper.getElementByClassName('fsp-picker'); + } + + /** + * get submission container + */ + static get submissionContainer() { + return ElementHelper.getElementById('react-view'); + } + + /** + * get tab panel + */ + static get tabPanel() { + return ElementHelper.getElementByCss('[role="tabpanel"]'); + } + + /** + * get registrants table + */ + static get registrantsTable() { + return CommonHelper.getLinkByAriaLabel('Registrants'); + } + + /** + * get scorecard cotnainer + */ + static get scoreCardContainer() { + return ElementHelper.getElementById('mainTabs'); + } + + /** + * Get term container + */ + static get termContainer() { + return CommonHelper.findElementByText( + 'h3', + 'Acceptance of Terms and Conditions' + ); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/challenge-listing/challenge-listing.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/challenge-listing/challenge-listing.helper.ts new file mode 100644 index 0000000000..882f663fab --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/challenge-listing/challenge-listing.helper.ts @@ -0,0 +1,919 @@ +import { ChallengeListingPageObject } from './challenge-listing.po'; +import { ConfigHelper } from '../../../../utils/config-helper'; +import { CommonHelper } from '../common-page/common.helper'; +import { HeaderPage } from '../header/header.po'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../logger/logger'; + +export class ChallengeListingPageHelper { + /** + * Initialize the challenge listing page object + */ + public static initialize() { + this.headerPageObject = new HeaderPage(); + } + + /** + * Opens the Challenge Listing page + */ + public static async open() { + await ChallengeListingPageObject.open(); + await this.waitForLoadingNewChallengeList(); + } + + /** + * Verify the redirection on clicking the login header link + */ + public static async verifyLoginLink() { + const expectedUrl = ConfigHelper.getLoginUrl(); + await this.headerPageObject.clickOnLoginLink(); + await CommonHelper.verifyCurrentUrlToContain(expectedUrl); + } + + /** + * Check if the open for registration challenges should be listed. + */ + static async verifyOpenForRegistrationChallenges() { + await CommonHelper.waitUntilVisibilityOf( + () => ElementHelper.getElementByTag('h2'), + 'Wait for h2 tag', + false + ); + const headers = await ElementHelper.getAllElementsByTag('h2'); + const registrationChallenges = await headers[0].getText(); + expect(registrationChallenges).toEqual('Open for registration'); + } + + /** + * fill and verify search results + */ + static async fillAndVerifySearchResults() { + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeListingPageObject.firstChallengeLink, + 'Wait for first challenge link', + false + ); + + const searchString = ConfigHelper.getChallengeDetail().challengeName; + await ChallengeListingPageObject.challengeSearchBox.sendKeys(searchString); + await ChallengeListingPageObject.challengeSearchButton.click(); + await BrowserHelper.sleep(2000); + + const firstChallenge = ChallengeListingPageObject.firstChallengeLink; + const firstChallengeName = await firstChallenge.getText(); + expect(firstChallengeName).toEqual(searchString); + } + + /** + * verify filter by toggle + */ + static async verifyFilterToggle() { + await this.openFiltersPanel(); + let filtersVisibility = await CommonHelper.isDisplayed(ChallengeListingPageObject.keywordsLabel); + expect(filtersVisibility).toBe(true); + await ChallengeListingPageObject.filterButton.click(); + filtersVisibility = await CommonHelper.isDisplayed( + ChallengeListingPageObject.keywordsLabel + ); + expect(filtersVisibility).toBe(false); + } + + /** + * select keyword + */ + static async selectKeyword(keyword: string) { + await ChallengeListingPageObject.keywordInput.sendKeys(keyword); + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.selectOptionElement, + 'Wait for select option', + false + ); + await CommonHelper.selectOptionElement.click(); + } + + /** + * select keyword + */ + static async selectType(type: string) { + await ChallengeListingPageObject.typeInput.sendKeys(type); + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.selectOptionElement, + 'Wait for select option', + false + ); + await CommonHelper.selectOptionElement.click(); + } + + /** + * check if dropdown for keyword is displayted + */ + static async dropdownForKeywordIsDisplayed() { + const isDisplayed = await CommonHelper.isDisplayed(ChallengeListingPageObject.keywordInput); + expect(isDisplayed).toEqual(true); + } + + /** + * check if dropdown for type is displayted + */ + static async dropdownForTypeIsDisplayed() { + const isDisplayed = await CommonHelper.isDisplayed(ChallengeListingPageObject.typeInput); + expect(isDisplayed).toEqual(true); + } + + /** + * check if dropdown for sub community is displayted + */ + static async dropdownForSubCommunityIsDisplayed() { + const isDisplayed = await CommonHelper.isDisplayed(ChallengeListingPageObject.subCommunityDropdown); + expect(isDisplayed).toEqual(true); + } + + /** + * check if dropdown for date range is displayted + */ + static async dropdownForDateRangeIsDisplayed() { + const dateRangeStartDate = await ChallengeListingPageObject.dateRangeStartDate(); + const isDisplayed = await CommonHelper.isDisplayed(dateRangeStartDate); + expect(isDisplayed).toEqual(true); + } + + public static async scrollDownToPage(totalChallenge = 100) { + const scrollCount = totalChallenge / 10 + 1; + for (var i = 0; i < scrollCount; i++) { + await BrowserHelper.executeScript('arguments[0].scrollIntoView();', CommonHelper.findElementByText( + 'a', + 'Policies' + )); + await BrowserHelper.sleep(1500); + } + } + + /** + * Wait for fetching new challenge list + */ + public static async waitForLoadingNewChallengeList() { + + // Scroll down until see footer. + await BrowserHelper.executeScript('arguments[0].scrollIntoView();', CommonHelper.findElementByText( + 'a', + 'Policies' + )); + + // sleeping since challenge number takes time to update + BrowserHelper.sleep(5000); + + // wait for showing page + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('span', 'All Challenges'), + 'Wait for all challenges', + true + ); + } + + private static async verifyChallengesMatchingKeyword(filters: Array) { + await this.waitForLoadingNewChallengeList(); + const challenges = await ChallengeListingPageObject.challengeLinks; + for (let i = 0; i < challenges.length; i++) { + const parentDiv = ElementHelper.getElementByXPath('..', challenges[i]); + let skills = await ElementHelper.getAllElementsByCss( + 'button[type=button]', + parentDiv + ); + + // expand skills by clicking on the hidden `+x` button + for (let i = 0; i < skills.length; i++) { + const skill = await skills[i]; + const text = await skill.getText(); + if (text[0] == '+') { + await skill.click(); + } + } + + skills = await ElementHelper.getAllElementsByCss( + 'button[type=button]', + parentDiv + ); + const skillsTexts = skills.map((skill) => skill.getText()); + expect( + skillsTexts.filter(async (sPromise: Promise) => { + const s = await sPromise; + for (let j = 0; j < filters.length; j++) { + if (s.includes(filters[j])) { + return true; + } + } + return false; + }).length > 0 + ).toBe(true); + } + } + + static async verifyFilterByKeywords() { + await this.openFiltersPanel(); + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeListingPageObject.keywordsLabel, + 'Wait for keywords label', + false + ); + let filtersVisibility = await CommonHelper.isDisplayed(ChallengeListingPageObject.keywordsLabel); + expect(filtersVisibility).toBe(true); + + await this.selectKeyword('Java'); + await this.verifyChallengesMatchingKeyword(['Java']); + } + + private static async verifyChallengesMatchingType( + expectedChallengesLength: number, + filters: string | any[] + ) { + await this.scrollDownToPage(expectedChallengesLength); + const challenges = await ChallengeListingPageObject.challengeLinks; + let totalChallenges = 0; + expect(challenges.length).toEqual(expectedChallengesLength); + for (let j = 0; j < filters.length; j++) { + const filter = filters[j]; + const matchingElements = await ChallengeListingPageObject.findAllElementsByText( + 'div', + filter.name + ); + totalChallenges += matchingElements.length; + } + expect(totalChallenges).toEqual(expectedChallengesLength); + } + + static async verifyFilterByType() { + await this.openFiltersPanel(); + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeListingPageObject.typeLabel, + 'Wait for type label', + false + ); + let filtersVisibility = await CommonHelper.isDisplayed(ChallengeListingPageObject.typeLabel); + expect(filtersVisibility).toBe(true); + await this.selectType('First2Finish'); + + await this.viewMoreChallenges(); + + // need to sleep to wait for ajax calls to be completed to filter using the above type + await this.waitForLoadingNewChallengeList(); + const count = await this.getOpenForRegistrationChallengesCount(); + await this.verifyChallengesMatchingType(count, [{ name: 'F2F' }]); + } + + static async selectSubCommunity(index: number) { + await ChallengeListingPageObject.subCommunityDropdown.click(); + await BrowserHelper.sleep(3000); + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.selectOptionElement, + 'Wait for select option', + false + ); + const allOptions = await CommonHelper.selectAllOptionsElement; + const selectedOption = allOptions[index]; + logger.info('se ' + allOptions.length); + if (selectedOption) { + await allOptions[index].click(); + // need to sleep to wait for ajax calls to be completed to filter using the above type + await BrowserHelper.sleep(5000); + return true; + } else { + await ChallengeListingPageObject.subCommunityDropdown.click(); + return false; + } + } + + static async verifyFilterBySubCommunity() { + await this.openFiltersPanel(); + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeListingPageObject.subCommunityLabel, + 'Wait for sub community label', + false + ); + let filtersVisibility = await CommonHelper.isDisplayed(ChallengeListingPageObject.subCommunityLabel); + expect(filtersVisibility).toBe(true); + + await this.selectSubCommunity(1); + + let count = await this.getOpenForRegistrationChallengesCount(); + await this.scrollDownToPage(count); + let challenges = await ChallengeListingPageObject.challengeLinks; + + expect(challenges.length).toEqual(count); + + await this.selectSubCommunity(0); + challenges = await ChallengeListingPageObject.challengeLinks; + expect(challenges.length > 0).toBe(true); + } + + static async openFiltersPanel() { + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeListingPageObject.filterButton, + 'Wait for filter button', + false + ); + await ChallengeListingPageObject.filterButton.click(); + BrowserHelper.sleep(1000); + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeListingPageObject.keywordsLabel, + 'Wait for keyword label', + false + ); + } + + static async selectDateRange() { + await CommonHelper.waitUntil( + () => async () => { + const daterange = await ChallengeListingPageObject.dateRangeStartDate(); + if (!(await CommonHelper.isDisplayed(daterange))) { + return false; + } + return await CommonHelper.isDisplayed(daterange); + }, + 'wait for day range field', + true + ); + + const days = [ + 'Sunday', + 'Monday', + 'Tuesday', + 'Wednesday', + 'Thursday', + 'Friday', + 'Saturday', + ]; + const months = [ + 'January', + 'February', + 'March', + 'April', + 'May', + 'June', + 'July', + 'August', + 'September', + 'October', + 'November', + 'December', + ]; + + const now = new Date(); + const currentDay = days[now.getDay()]; + const currentMonth = months[now.getMonth()]; + const currentYear = now.getFullYear(); + + const nowPlusOne = new Date(); + nowPlusOne.setDate(nowPlusOne.getDate() + 1); + + const nextDay = days[nowPlusOne.getDay()]; + const nextDayMonth = months[nowPlusOne.getMonth()]; + const nextDayYear = nowPlusOne.getFullYear(); + + const currentDayAriaText = + 'Choose ' + + currentDay + + ', ' + + currentMonth + + ' ' + + now.getDate() + + ', ' + + currentYear + + ' as your check-in date. It’s available.'; + const nextDayAriaText = + 'Choose ' + + nextDay + + ', ' + + nextDayMonth + + ' ' + + nowPlusOne.getDate() + + ', ' + + nextDayYear + + ' as your check-out date. It’s available.'; + + const dateRangeStartDate = await ChallengeListingPageObject.dateRangeStartDate(); + await dateRangeStartDate.click(); + await BrowserHelper.sleep(1000); + await CommonHelper.getLinkByAriaLabel(currentDayAriaText).click(); + await CommonHelper.getLinkByAriaLabel(nextDayAriaText).click(); + await BrowserHelper.sleep(1000); + } + + static async verifyNumberOfAppliedFilters( + expectedNumberOfAppliedFilters: number + ) { + const appliedFiltersText = await ChallengeListingPageObject.appliedFilters.getText(); + if (expectedNumberOfAppliedFilters === 0) { + expect(appliedFiltersText).toEqual('Filters'); + } else { + expect(appliedFiltersText).toEqual( + 'Filters' + expectedNumberOfAppliedFilters + ); + } + } + + static async verifyFilterByKeywordsAndType() { + await this.selectKeyword('Java'); + await this.selectType('Challenge'); + await this.verifyChallengesMatchingKeyword(['Java']); + const count = await this.getOpenForRegistrationChallengesCount(); + await this.verifyChallengesMatchingType(count, [{ name: 'CH' }]); + } + + /** + * verify filter by multiple keywords + */ + static async verifyFilterByMultipleKeywords() { + await this.selectKeyword('Java'); + await this.selectKeyword('HTML5'); + await this.verifyChallengesMatchingKeyword(['Java', 'HTML5']); + } + + /** + * view more challenge + */ + static async viewMoreChallenges() { + const viewMoreChallenges = await ChallengeListingPageObject.viewMoreChallenges; + viewMoreChallenges.map(async (c) => { + await BrowserHelper.waitUntilClickableOf(c); + await BrowserHelper.sleep(3000); + if (await CommonHelper.isPresent(c)) { + await c.click(); + } + }); + } + + /** + * verify filter by multiple types + */ + static async verifyFilterByMultipleTypes() { + await this.selectType('Challenge'); + await this.selectType('First2Finish'); + + // await this.viewMoreChallenges(); + + const count = await this.getOpenForRegistrationChallengesCount(); + + await this.verifyChallengesMatchingType(count, [ + { name: 'F2F' }, + { name: 'CH' }, + ]); + } + + /** + * verify removal of keyword + */ + static async verifyRemovalOfKeyword() { + const removeTags = await ChallengeListingPageObject.allRemoveTags(); + // remove HTML5 tag + await removeTags[1].click(); + await this.verifyChallengesMatchingKeyword(['Java']); + } + + /** + * verify removal of type + */ + static async verifyRemovalOfType() { + const removeTags = await ChallengeListingPageObject.allRemoveTags(); + await removeTags[1].click(); + const count = await this.getOpenForRegistrationChallengesCount(); + await this.verifyChallengesMatchingType(count, [{ name: 'F2F' }]); + } + + /** + * click clear filter + */ + static async clearFilters() { + await CommonHelper.findElementByText('button', 'Clear filters').click(); + } + + /** + * verify sort function + */ + static async verifySortingFunctionality() { + await BrowserHelper.sleep(2000); + const el = await ChallengeListingPageObject.selectSortOfOpenForRegistrationChallenges(); + await el.click(); + + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeListingPageObject.selectSortByTitleOption, + 'Wait for select sort by title', + false + ); + await ChallengeListingPageObject.selectSortByTitleOption.click(); + + const challenges = await ChallengeListingPageObject.submissionTitle(); + if (challenges.length > 0) { + let titleOfCurrentChallenge = await challenges[0].getText(); + + for (let i = 1; i < challenges.length; i++) { + const text = await challenges[i].getText(); + expect(titleOfCurrentChallenge <= text).toBe(true); + titleOfCurrentChallenge = text; + } + } + } + + /** + * Check if section with header present + * @param header header string + */ + static async waitTillHeaderPresentWithText(header: string) { + await CommonHelper.waitUntil( + () => async () => { + const headers = await CommonHelper.h2Fields; + const texts = []; + for (let i = 1; i < headers.length; i++) { + const text = await headers[i].getText(); + texts.push(text); + } + return texts.indexOf(header) >= 0; + }, + `Wait for ${header} header`, + false + ); + } + + /** + * Wait until only one header present + * @param header header of challenges section + */ + static async waitTillOnlyOneHeaderPresentWithText(header: string) { + await CommonHelper.waitUntil( + () => async () => { + const headers = await CommonHelper.h2Fields; + const text = headers.length !== 0 ? await headers[0].getText() : ''; + return headers.length === 1 && text === header; + }, + `Wait for only show ${header} header`, + false + ); + } + + /** + * verify view more challenges button + */ + static async verifyViewMoreChallenges() { + const els = await ChallengeListingPageObject.viewMoreChallenges; + for (let i = 0; i < els.length; i++) { + // get view more challenges buttons again when change the menu + const allViewMoreLinks = await ChallengeListingPageObject.viewMoreChallenges; + + const href = await allViewMoreLinks[i].getAttribute('href'); + const splits = href.split('?bucket='); + const bucket = splits[1]; + if (bucket == 'openForRegistration') { + await allViewMoreLinks[i].click(); + } + + const allChallengesLink = await ChallengeListingPageObject.filterChallengesBy( + 'All Challenges' + ); + await allChallengesLink.click(); + } + } + + /** + * verify challenges by challenge tag + */ + static async verifyChallengesByChallengeTag() { + const tagText = ConfigHelper.getChallengeDetail().challengeTag; + + await CommonHelper.waitUntilVisibilityOf( + () => ChallengeListingPageObject.getChallengeTag(tagText), + 'Wait for tag', + false + ); + await ChallengeListingPageObject.getChallengeTag(tagText).click(); + // waiting for re-render to happen + await BrowserHelper.sleep(15000); + + const checkTagMatchWithChallenge = async (challenges) => { + for (let i = 0; i < challenges.length; i++) { + const skills = ( + await ChallengeListingPageObject.findSkillsForChallenge(challenges[i]) + ).join(''); + expect(skills.indexOf(tagText) >= 0).toBe(true); + } + }; + const registrationChallenges = await ChallengeListingPageObject.openForRegistrationChallenges; + await checkTagMatchWithChallenge(registrationChallenges); + } + + /** + * Veirfy challenge count by toggling development + */ + static async verifyChallengeCountByTogglingDevelopment() { + let openForRegistrationChallenges = await ChallengeListingPageObject.filterChallengesBy( + 'Open for registration' + ); + await openForRegistrationChallenges.click(); + await this.waitTillOnlyOneHeaderPresentWithText('Open for registration'); + + // switch off development + let el = await ChallengeListingPageObject.developmentSwitch(); + await el.click(); + await CommonHelper.waitUntilPresenceOf( + () => ChallengeListingPageObject.developmentSwitchTurnedOff, + 'wait for development switch turn off', + false + ); + + await this.scrollDownToPage(); + await this.waitForLoadingNewChallengeList(); + + let challenges = await ChallengeListingPageObject.openForRegistrationChallenges; + const afterOpenForRegistrationChallengesCount = await this.getOpenForRegistrationChallengesCount(); + expect(afterOpenForRegistrationChallengesCount).toEqual(challenges.length); + } + + /** + * Get challenge count of any tab + * @param tabName tab name + * @param shouldWait should wait for fetching challenge complete + */ + static async getAnyChallengesCount(tabName: string, shouldWait = false) { + // the challenge count will change after loading depend on the request loading time, + // not sure how to resolve this + // just wait for now + await BrowserHelper.sleep(5000); + const challenges = await ChallengeListingPageObject.filterChallengesBy( + tabName + ); + let challengesText = await challenges.getText(); + challengesText = challengesText.replace(/(\r\n|\n|\r)/gm, ' '); + const count = parseInt(challengesText.split(tabName)[1]); + return count || 0; + } + + /** + * get all challenges count + */ + static async getAllChallengesCount() { + return this.getAnyChallengesCount('All Challenges'); + } + + /** + * get ongoing challenges count + */ + static async getOngoingChallengesCount() { + return this.getAnyChallengesCount('Ongoing challenges', true); + } + + /** + * get open for registration challenges count + */ + static async getOpenForRegistrationChallengesCount() { + return this.getAnyChallengesCount('Open for registration'); + } + + /** + * navigate to first challenge + */ + static async navigateToFirstChallenge() { + const challengeLinks = await ChallengeListingPageObject.openForRegistrationChallenges; + await challengeLinks[0].click(); + } + + /** + * verify all challenges + */ + static async verifyAllChallenges() { + await this.verifyOpenForRegistrationChallenges(); + } + + /** + * verify open for registration challenges only + */ + static async verifyOpenForRegistrationChallengesOnly() { + const openForRegistrationLink = await ChallengeListingPageObject.filterChallengesBy( + 'Open for registration' + ); + await openForRegistrationLink.click(); + await this.waitTillOnlyOneHeaderPresentWithText('Open for registration'); + await this.verifyOpenForRegistrationChallenges(); + } + + /** + * veirfy ongoing challenges only + */ + static async verifyOngoingChallengesOnly() { + const ongoingChallengesLink = await ChallengeListingPageObject.filterChallengesBy( + 'Ongoing challenges' + ); + await ongoingChallengesLink.click(); + await this.waitTillOnlyOneHeaderPresentWithText('Ongoing challenges'); + + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('span', 'Ends '), + 'Wait for ends element', + false + ); + } + + /** + * verify open for review challenges + */ + static async verifyOpenForReviewChallenges() { + const reviewStatusEls = await ChallengeListingPageObject.reviewStatusElements(); + + for (let i = 0; i < reviewStatusEls.length; i++) { + const el = reviewStatusEls[i]; + const status = await el.getText(); + expect(status.includes('Review')).toBe(true); + } + } + + /** + * verify open for review challenges only + */ + static async verifyOpenForReviewChallengesOnly() { + const openForReviewLink = await ChallengeListingPageObject.filterChallengesBy( + 'Open for review' + ); + await openForReviewLink.click(); + await this.waitForLoadingNewChallengeList(); + + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('span', 'Review'), + 'Wait for review element', + false + ); + + await this.verifyOpenForReviewChallenges(); + const headers = await CommonHelper.h2Fields; + expect(headers.length).toEqual(1); + } + + /** + * verify past challenge only + */ + static async verifyPastChallengesOnly() { + const pastChallengesLink = await ChallengeListingPageObject.filterChallengesBy( + 'Past challenges' + ); + await pastChallengesLink.click(); + + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('span', 'Ended '), + 'Wait for ended element', + false + ); + + const headers = await CommonHelper.h2Fields; + expect(headers.length).toEqual(1); + } + + /** + * verify challenges with all switch buttons turned off + */ + static async verifyWithAllSwitchesTurnedOff() { + let el = await ChallengeListingPageObject.designSwitch(); + await el.click(); + await CommonHelper.waitUntilPresenceOf( + () => ChallengeListingPageObject.designSwitchTurnedOff, + 'wait for design switch turn off', + false + ); + + el = await ChallengeListingPageObject.developmentSwitch(); + await el.click(); + await CommonHelper.waitUntilPresenceOf( + () => ChallengeListingPageObject.developmentSwitchTurnedOff, + 'wait for development switch turn off', + false + ); + + el = await ChallengeListingPageObject.dataScienceSwitch(); + await el.click(); + await CommonHelper.waitUntilPresenceOf( + () => ChallengeListingPageObject.dataScienceSwitchTurnedOff, + 'wait for data science switch turn off', + false + ); + + el = await ChallengeListingPageObject.qaSwitch(); + await el.click(); + await CommonHelper.waitUntilPresenceOf( + () => ChallengeListingPageObject.qaSwitchTurnedOff, + 'wait for qa switch turn off', + false + ); + + const headers = await CommonHelper.h2Fields; + expect(headers.length).toBe(0); + + const openForReviewLink = await ChallengeListingPageObject.filterChallengesBy( + 'Open for review' + ); + await openForReviewLink.click(); + + await this.waitTillOnlyOneHeaderPresentWithText('Open for review'); + await CommonHelper.waitUntilVisibilityOf( + () => + CommonHelper.findElementByText( + 'div', + 'There are no review opportunities available' + ), + 'Wait for no review element', + true + ); + } + + /** + * Click on rss link + */ + static async clickOnRssLink() { + const el = await ChallengeListingPageObject.rssLink(); + await el.click(); + } + + /** + * verify rss page + */ + static async verifyRssPage() { + await CommonHelper.waitUntil( + () => async () => { + const url = await BrowserHelper.getCurrentUrl(); + return url.indexOf(ConfigHelper.getChallangesLinks().rssFeedUrl) >= 0; + }, + 'wait for match rss feed url', + false + ); + } + + /** + * Verify link under rss + * @param label lable of link + * @param expectedUrl expected url + */ + static async verifyLinkUnderRss(label: string, expectedUrl: string) { + const el = await ChallengeListingPageObject.getLinkUnderRss(label); + await el.click(); + await CommonHelper.verifyPopupWindowWithUrl( + expectedUrl, + 'Wrong link for ' + label + ); + } + + /** + * verify link under rss + */ + static async verifyLinksUnderRss() { + const linksConfig = [ + { + label: 'About', + expectedUrl: ConfigHelper.getChallangesLinks().aboutUrl, + }, + { + label: 'Contact', + expectedUrl: ConfigHelper.getChallangesLinks().contactUrl, + }, + { + label: 'Help', + expectedUrl: ConfigHelper.getChallangesLinks().helpUrl, + }, + { + label: 'Privacy', + expectedUrl: ConfigHelper.getChallangesLinks().privacyUrl, + }, + { + label: 'Terms', + expectedUrl: ConfigHelper.getChallangesLinks().termsUrl, + }, + ]; + for (let i = 0; i < linksConfig.length; i++) { + const linkConfig = linksConfig[i]; + await this.verifyLinkUnderRss(linkConfig.label, linkConfig.expectedUrl); + } + } + + /** + * Verify challenges after login + */ + static async verifyChallengesAfterLogin() { + await CommonHelper.waitUntilVisibilityOf( + () => ElementHelper.getElementByTag('h2'), + 'Wait for h2 tag', + false + ); + const headers = await CommonHelper.h2Fields; + let expectedHeaders = ['Open for registration']; + for (let i = 0; i < headers.length; i++) { + const headerText = await headers[i].getText(); + expect(headerText).toEqual(expectedHeaders[i]); + } + } + + /** + * Verify clear filter button + * @param enabled check if enable + */ + static async verifyClearFilterState(enabled: boolean) { + const cursorPointer = await ElementHelper.getElementByClassName( + '_22SITo' + ).getCssValue('cursor'); + expect(cursorPointer !== 'not-allowed').toEqual(enabled); + } + + private static headerPageObject: HeaderPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/challenge-listing/challenge-listing.po.ts b/automated-smoke-test/page-objects/pages/topcoder/challenge-listing/challenge-listing.po.ts new file mode 100644 index 0000000000..371ef80c4b --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/challenge-listing/challenge-listing.po.ts @@ -0,0 +1,370 @@ +import { BrowserHelper, ElementHelper, Keys } from 'topcoder-testing-lib'; +import { logger } from '../../../../logger/logger'; +import { ConfigHelper } from '../../../../utils/config-helper'; +import { CommonHelper } from '../common-page/common.helper'; +import { TcElementImpl } from 'topcoder-testing-lib/dist/src/tc-element-impl'; + +export class ChallengeListingPageObject { + /** + * Open the Challenge Listing page + */ + static async open() { + await BrowserHelper.open(ConfigHelper.getChallengeListingUrl()); + logger.info('User navigated to Challenges Page'); + } + + /** + * First challenge link + */ + static get firstChallengeLink() { + return ElementHelper.getElementByClassName('vir_2D'); + } + + /** + * get challenge search box + */ + static get challengeSearchBox() { + return ElementHelper.getElementById('search-challenges'); + } + + /** + * Get search challenge button + */ + static get challengeSearchButton() { + return ElementHelper.getElementByCss( + 'span[role=button]', + ElementHelper.getElementByCss('label[for=search-challenges]') + ); + } + + /** + * Get filter button + */ + static get filterButton() { + return ElementHelper.getElementByClassName('tc-outline-btn'); + } + + /** + * Get filter keywords label field + */ + static get keywordsLabel() { + return ElementHelper.getElementByCss('label[for=keyword-select]'); + } + + /** + * Get filter type label field + */ + static get typeLabel() { + return ElementHelper.getElementByCss('label[for=type-select]'); + } + + /** + * Get filter sub community label field + */ + static get subCommunityLabel() { + return ElementHelper.getElementByCss('label[for=community-select]'); + } + + /** + * Get filter sub community label field + */ + static get subCommunityDropdown() { + return ElementHelper.getElementById('react-select-3--value-item'); + } + + /** + * Get filter keywords input field + */ + static get keywordInput() { + return ElementHelper.getElementById('keyword-select'); + } + + /** + * Get challenge link + */ + static get challengeLinks() { + return ElementHelper.getAllElementsByClassName('vir_2D'); + } + + /** + * Get filter type field + */ + static get typeInput() { + return ElementHelper.getElementById('type-select'); + } + + /** + * Get view more challenges button + */ + static get viewMoreChallenges() { + return ElementHelper.getAllElementsByXPath( + '//a[contains(text(), "View more challenges")]' + ); + } + + /** + * Get filter challenge by container + */ + static async filterChallengesBy(filter: string) { + const els = await ElementHelper.getAllElementsByXPath( + '//div[contains(text(), "' + filter + '")]' + ); + return els[1]; + } + + /** + * Get all elements that contain text + * @param elementType element type + * @param text text to contain + */ + static findAllElementsByText(elementType: string, text: string) { + return ElementHelper.getAllElementsByXPath( + '//' + elementType + '[contains(text(), "' + text + '")]' + ); + } + + /** + * get start date range field + */ + static async dateRangeStartDate() { + const els = await ElementHelper.getAllElementsByClassName( + 'DateInput_input_1' + ); + return els[2]; + } + + /** + * get apply filters button + */ + static get appliedFilters() { + return ElementHelper.getElementByClassName('tc-outline-btn'); + } + + /** + * get remove tag + */ + static async allRemoveTags() { + const crossTags = await this.findAllElementsByText('span', '×'); + const filteredCrossTags = []; + for (let i = 0; i < crossTags.length; i++) { + const className = await crossTags[i].getAttribute('class'); + if (className === 'Select-value-icon') { + filteredCrossTags.push(crossTags[i]); + } + } + return filteredCrossTags; + } + + /** + * select sort of open for registration challenges + */ + static async selectSortOfOpenForRegistrationChallenges() { + const els = await ElementHelper.getAllElementsByClassName('Select--single'); + return els[1]; + } + + /** + * Get number of submissions + */ + static get selectNumberOfSubmissions() { + return CommonHelper.findElementByText('div', '# of submissions'); + } + + /** + * Get title a-z sort option + */ + static get selectSortByTitleOption() { + return CommonHelper.findElementByText('div', 'Title A-Z'); + } + + /** + * Get submission elements + */ + static async submissionElements() { + const headers = await CommonHelper.h2Fields; + return ElementHelper.getAllElementsByClassName( + '_2Kuu31', + ElementHelper.getElementByXPath( + '..', + ElementHelper.getElementByXPath('..', headers[0]) + ) + ); + } + + /** + * Get submission title + */ + static async submissionTitle() { + const headers = await CommonHelper.h2Fields; + return ElementHelper.getAllElementsByClassName('vir_2D', headers[0]); + } + + /** + * Get challenges by type + * @param type type of challenges + */ + private static getChallenges(type: string) { + return ElementHelper.getAllElementsByClassName( + 'vir_2D', + ElementHelper.getElementByXPath( + '..', + ElementHelper.getElementByXPath( + '..', + ElementHelper.getElementByXPath( + '//h2[contains(text(), "' + type + '")]' + ) + ) + ) + ); + } + + /** + * Get challenge tag element + * @param challengeTag challenge tag + */ + static getChallengeTag(challengeTag: string) { + return ElementHelper.getElementByButtonText(challengeTag); + } + + /** + * Get open for registration challenges + */ + static get openForRegistrationChallenges() { + return this.getChallenges('Open for registration'); + } + + /** + * Get skills of challenge + * @param challenge challenge element + */ + static async findSkillsForChallenge(challenge: TcElementImpl) { + const buttons = await ElementHelper.getAllElementsByTag( + 'button', + ElementHelper.getElementByXPath('..', challenge) + ); + const skills = []; + for (let j = 0; j < buttons.length; j++) { + const skill = await buttons[j].getText(); + skills.push(skill); + } + return skills; + } + + /** + * Get on going challenges + */ + static get ongoingChallenges() { + return this.getChallenges('Ongoing challenges'); + } + + /** + * Get development switch button + */ + static async developmentSwitch() { + const els = await ElementHelper.getAllElementsByCss('div[role="switch"]'); + return ElementHelper.getElementByTag('div', els[1]); + } + + /** + * Get development switch turned off button + */ + static get developmentSwitchTurnedOff() { + return CommonHelper.getLinkByAriaLabel( + 'Development toggle button pressed Off' + ); + } + + /** + * Get development switch turned on button + */ + static get developmentSwitchTurnedOn() { + return CommonHelper.getLinkByAriaLabel( + 'Development toggle button pressed On' + ); + } + + /** + * get review status elements + */ + static async reviewStatusElements() { + const headers = await CommonHelper.h2Fields; + + const elements = ElementHelper.getAllElementsByClassName( + '_1YwVym', + ElementHelper.getElementByXPath( + '..', + ElementHelper.getElementByXPath('..', headers[0]) + ) + ); + + return elements; + } + + /** + * get design switch button + */ + static async designSwitch() { + const els = await ElementHelper.getAllElementsByCss('div[role="switch"]'); + return ElementHelper.getElementByTag('div', els[0]); + } + + /** + * get data science switch button + */ + static async dataScienceSwitch() { + const els = await ElementHelper.getAllElementsByCss('div[role="switch"]'); + return ElementHelper.getElementByTag('div', els[2]); + } + + /** + * get QA switch button + */ + static async qaSwitch() { + const els = await ElementHelper.getAllElementsByCss('div[role="switch"]'); + return ElementHelper.getElementByTag('div', els[3]); + } + + /** + * get design switch turned off + */ + static get designSwitchTurnedOff() { + return CommonHelper.getLinkByAriaLabel('Design toggle button pressed Off'); + } + + /** + * get data science switch turned off button + */ + static get dataScienceSwitchTurnedOff() { + return CommonHelper.getLinkByAriaLabel( + 'Data Science toggle button pressed Off' + ); + } + + /** + * get QA switch turned off button + */ + static get qaSwitchTurnedOff() { + return CommonHelper.getLinkByAriaLabel( + 'QA toggle button pressed Off' + ); + } + + /** + * Get rss link + */ + static async rssLink() { + const els = await ElementHelper.getAllElementsByXPath( + "//a[contains(text(),'Get the RSS feed')]" + ); + return els[1]; + } + + /** + * Get link under rss link + * @param label label of link + */ + static async getLinkUnderRss(label: string) { + const els = await CommonHelper.getAllLinksByAriaLabel(label); + return els[1]; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/common-page/common.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/common-page/common.helper.ts new file mode 100644 index 0000000000..6f7df348fc --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/common-page/common.helper.ts @@ -0,0 +1,366 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import * as appconfig from '../../../../config/app-config.json'; +import { logger } from '../../../../logger/logger'; +import TcElement from 'topcoder-testing-lib/dist/src/tc-element'; +import { TcElementImpl } from 'topcoder-testing-lib/dist/src/tc-element-impl'; + +/** + * Wait until condition return true + * @param func function for checking condition + * @param extraMessage extra error message when timeout + * @param isPageLoad wait for loading page + */ +const waitUntil = async ( + func: () => any, + extraMessage: string, + isPageLoad: boolean +) => { + await BrowserHelper.waitUntil( + func, + isPageLoad + ? appconfig.Timeout.PageLoad + : appconfig.Timeout.ElementVisibility, + (isPageLoad + ? appconfig.LoggerErrors.PageLoad + : appconfig.LoggerErrors.ElementVisibilty) + + '.' + + extraMessage + ); +}; + +export const CommonHelper = { + /** + * Click on an element containing text + * @param {String} text + */ + async clickOnElementContainingText(text: string) { + const element = ElementHelper.getElementContainingText(text); + await element.click(); + logger.info(`Clicked on element containing text ${text}`); + }, + + /** + * Click on a html tag element containing text + * @param {String} tag + * @param {String} text + */ + async clickOnTagElementContainingText(tag: string, text: string) { + const element = CommonHelper.findElementByText(tag, text); + await element.click(); + logger.info(`Clicked on ${tag} element containing text ${text}`); + }, + + /** + * Verify page title + * @param {String} title + */ + async verifyPageTitle(title: string) { + const pageTitle = await BrowserHelper.getTitle(); + logger.info(`Current page title is ${pageTitle}`); + expect(pageTitle).toEqual( + title, + `Provided title ${title} does not match page title ${pageTitle}` + ); + }, + + /** + * Verify page url + * @param {String} url + */ + async verifyCurrentUrl(url: string) { + const currentUrl = await BrowserHelper.getCurrentUrl(); + logger.info(`Current page url is ${currentUrl}`); + expect(url).toEqual( + currentUrl, + `Provided Url ${url} does not match page URL ${currentUrl}` + ); + }, + + /** + * Verify page url to contain the given url + * @param {String} url + */ + async verifyCurrentUrlToContain(url: string) { + const currentUrl = await BrowserHelper.getCurrentUrl(); + logger.info(`Current page url is ${currentUrl}`); + expect(currentUrl).toContain( + url, + `Provided Url ${url} is not present in page URL ${currentUrl}` + ); + }, + + /** + * Verify pop window exists + */ + async verifyPopupWindow() { + const windows = await BrowserHelper.getAllWindowHandles(); + expect(windows.length).toBe(2, 'Popup window did not open'); + await BrowserHelper.switchToWindow(windows[1]); + await BrowserHelper.close(); + await BrowserHelper.switchToWindow(windows[0]); + }, + + /** + * Verify pop up window's title + * @param {String} title + */ + async verifyPopupWindowWithTitle(title: string) { + const windows = await BrowserHelper.getAllWindowHandles(); + expect(windows.length).toBe(2, 'Popup window did not open'); + await BrowserHelper.switchToWindow(windows[1]); + BrowserHelper.setIgnoreSync(true); + await CommonHelper.waitUntilPresenceOf( + () => ElementHelper.getElementByXPath('//title'), + 'wait for popup window with title', + false + ); + const popupWindowTitle = await BrowserHelper.getTitle(); + expect(popupWindowTitle).toEqual( + title, + `Provided title ${title} does not match page title ${popupWindowTitle}` + ); + await BrowserHelper.close(); + await BrowserHelper.switchToWindow(windows[0]); + }, + + /** + * Verify pop up window's url + * @param {String} expectedUrl + * @param {String} customeErrorMessage + */ + async verifyPopupWindowWithUrl( + expectedUrl: string, + customeErrorMessage: string = '' + ) { + const windows = await BrowserHelper.getAllWindowHandles(); + expect(windows.length).toBe(2, 'Popup window did not open'); + await BrowserHelper.switchToWindow(windows[1]); + const url = await BrowserHelper.getCurrentUrl(); + expect(url).toBe( + expectedUrl, + customeErrorMessage + ? customeErrorMessage + : `Provided url ${expectedUrl} does not match current url ${url}` + ); + await BrowserHelper.close(); + await BrowserHelper.switchToWindow(windows[0]); + }, + + /** + * Get anchor element containing text and verify the href in that element + * @param {String} text + * @param {String} href + */ + async verifyHrefInAnchorContainingText(text: string, href: string) { + const anchorElement = CommonHelper.findElementByText('a', text); + const anchorElementHref = await anchorElement.getAttribute('href'); + expect(anchorElementHref).toEqual( + href, + `Provided href ${href} does not match anchor element href ${anchorElementHref}` + ); + }, + + /** + * Switch tab by opening tab and optionally verify header of new tab + * @param {String} tag + * @param {String} text + */ + async switchTabByClickingOnTagWithText(tag: string, text: string) { + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText(tag, text), + 'new tag header show', + false + ); + await CommonHelper.findElementByText(tag, text).click(); + }, + + /** + * Wait until the element becomes visible + * @param {TcElementImpl} tcElement element + * @param {TcElementImpl} extraMessage extra message + * @param {Boolean} isPageLoad is loading page + */ + async waitUntilVisibilityOf( + func: () => TcElement, + extraMessage: string, + isPageLoad: boolean + ) { + await waitUntil( + () => async () => { + try { + return await func().isDisplayed(); + } catch { + // element is not attached to the DOM of a page. + return false; + } + }, + extraMessage, + isPageLoad + ); + }, + + /** + * Wait until the element becomes invisible + * @param {TcElementImpl} tcElement element + * @param {TcElementImpl} extraMessage extra message + * @param {Boolean} isPageLoad is loading page + */ + async waitUntilInVisibilityOf( + func: () => TcElement, + extraMessage: string, + isPageLoad: boolean + ) { + await waitUntil( + () => async () => { + try { + return !(await func().isDisplayed()); + } catch { + // element is not attached to the DOM of a page. + return true; + } + }, + extraMessage, + isPageLoad + ); + }, + + /** + * Check if element is displayed + * @param {TcElementImpl} element element + */ + async isDisplayed(element: TcElement): Promise { + try { + return await element.isDisplayed(); + } catch { + // element is not attached to the DOM of a page. + return false; + } + }, + + /** + * Check if element is present + * @param {TcElementImpl} element element + */ + async isPresent(element: TcElement): Promise { + try { + return await element.isPresent(); + } catch { + // element is not attached to the DOM of a page. + return false; + } + }, + + /** + * Wait until the element is present + * @param {TcElementImpl} tcElement element + * @param {TcElementImpl} extraMessage extra message + * @param {Boolean} isPageLoad is loading page + */ + async waitUntilPresenceOf( + func: () => TcElement, + extraMessage: string, + isPageLoad: boolean + ) { + await BrowserHelper.waitUntil( + () => async () => { + try { + return await func().isPresent(); + } catch { + // element is not attached to the DOM of a page. + return false; + } + }, + isPageLoad + ? appconfig.Timeout.PageLoad + : appconfig.Timeout.ElementPresence, + (isPageLoad + ? appconfig.LoggerErrors.PageLoad + : appconfig.LoggerErrors.ElementPresence) + + '.' + + extraMessage + ); + }, + + /** + * Wait until the condition is true + * @param {function} func + * @param {TcElementImpl} extraMessage extra message + * @param {Boolean} isPageLoad is loading page + */ + async waitUntil(func: () => any, extraMessage: string, isPageLoad: boolean) { + await waitUntil(func, extraMessage, isPageLoad); + }, + + /** + * Get link by arial label + * @param label arial lable + */ + getLinkByAriaLabel(label: string) { + return ElementHelper.getElementByCss('[aria-label="' + label + '"]'); + }, + + /** + * Get all links by arial label + * @param label arial lable + */ + getAllLinksByAriaLabel(label: string) { + return ElementHelper.getAllElementsByCss('[aria-label="' + label + '"]'); + }, + + /** + * Get element that contain text + * @param tag tag + * @param text text contain + * @param parent parent element + */ + findElementByText( + tag: string, + text: string, + parent: TcElementImpl = undefined + ) { + return ElementHelper.getElementByXPath( + '//' + tag + '[contains(text(), "' + text + '")]', + parent + ); + }, + + /** + * Get element by attribute value + * @param tag tag + * @param attribute attribute + * @param value attribute value + * @param parent parent element + */ + findElementByAttribute( + tag: string, + attribute: string, + value: string, + parent: TcElementImpl = undefined + ) { + return ElementHelper.getElementByCss( + `${tag}[${attribute}="${value}"]`, + parent + ); + }, + + /** + * Get all h2 fields + */ + get h2Fields() { + return ElementHelper.getAllElementsByTag('h2'); + }, + + /** + * get select option element + */ + get selectOptionElement() { + return ElementHelper.getElementByClassName('Select-option'); + }, + + /** + * get all select options element + */ + get selectAllOptionsElement() { + return ElementHelper.getAllElementsByClassName('Select-option'); + }, +}; diff --git a/automated-smoke-test/page-objects/pages/topcoder/footer/footer.constants.ts b/automated-smoke-test/page-objects/pages/topcoder/footer/footer.constants.ts new file mode 100644 index 0000000000..d271d2a40c --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/footer/footer.constants.ts @@ -0,0 +1,160 @@ +import { ConfigHelper } from "../../../../utils/config-helper"; + +export class FooterConstants { + /** + * Footer menu links + * @param isLoggedIn - is user logged in + */ + public static getFooterMenu(isLoggedIn?: boolean) { + const menuConfiguration = { + Compete: { + submenus: [ + { + text: "All Challenges", + url: ConfigHelper.getFooterLink("allChallenges"), + }, + { + text: "Competitive Programming", + url: ConfigHelper.getFooterLink("competitiveProgramming"), + }, + { + text: "Gig Work", + url: ConfigHelper.getFooterLink("taas"), + }, + { + text: "Practice", + url: ConfigHelper.getFooterLink("practice"), + }, + ], + text: "COMPETE", + }, + Tracks: { + submenus: [ + { + text: "Competitive Programming", + url: ConfigHelper.getFooterLink("competitiveProgrammingThrive"), + }, + { + text: "Data Science", + url: ConfigHelper.getFooterLink("dataScienceThrive"), + }, + { + text: "Design", + url: ConfigHelper.getFooterLink("designThrive"), + }, + { + text: "Development", + url: ConfigHelper.getFooterLink("developmentThrive"), + }, + { + text: "QA", + url: ConfigHelper.getFooterLink("qaThrive"), + }, + ], + text: "TRACKS", + }, + Community: { + submenus: [ + { + text: "Blog", + url: ConfigHelper.getFooterLink("blog"), + }, + { + text: "Challenge Pipeline", + url: ConfigHelper.getFooterLink("challengePipeline"), + }, + { + text: "Events Calendar", + url: ConfigHelper.getFooterLink("events"), + }, + { + text: "Forums", + url: ConfigHelper.getFooterLink("forums"), + }, + { + text: "Programs", + url: ConfigHelper.getFooterLink("programs"), + }, + { + text: "Statistics", + url: ConfigHelper.getFooterLink("statistics"), + }, + { + text: "TCO", + url: ConfigHelper.getFooterLink("tco"), + }, + { + text: "Thrive", + url: ConfigHelper.getFooterLink("thrive"), + }, + ], + text: "COMMUNITY", + }, + HelpCenter: { + submenus: [ + { + text: "Getting Paid", + url: ConfigHelper.getFooterLink("gettingPaid"), + }, + { + text: "FAQ", + url: ConfigHelper.getFooterLink("faq"), + }, + { + text: "General Info", + url: ConfigHelper.getFooterLink("generalInfo"), + }, + { + text: "Website Help", + url: ConfigHelper.getFooterLink("websiteHelp"), + }, + ], + text: "HELP CENTER", + }, + About: { + submenus: [ + { + text: "Admins", + url: ConfigHelper.getFooterLink("admins"), + }, + { + text: "Contact Us", + url: ConfigHelper.getFooterLink("contactUs"), + }, + { + text: "Join Community", + url: ConfigHelper.getFooterLink("joinCommunity"), + }, + { + text: "About Community", + url: ConfigHelper.getFooterLink("aboutCommunity"), + }, + { + text: "Changelog", + url: ConfigHelper.getFooterLink("changeLog"), + }, + { + text: "Talk to Sales", + url: ConfigHelper.getFooterLink("talkToSales"), + }, + ], + text: "ABOUT", + }, + }; + + return menuConfiguration; + } + + /** + * Social media links + */ + public static getSocialLinks() { + return [ + ConfigHelper.getSocialLink("facebook"), + ConfigHelper.getSocialLink("youtube"), + ConfigHelper.getSocialLink("linkedin"), + ConfigHelper.getSocialLink("twitter"), + ConfigHelper.getSocialLink("instagram"), + ]; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/footer/footer.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/footer/footer.helper.ts new file mode 100644 index 0000000000..fbdb7a7ece --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/footer/footer.helper.ts @@ -0,0 +1,105 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../logger/logger'; +import { FooterPage } from './footer.po'; +import { ConfigHelper } from '../../../../utils/config-helper'; +import { CommonHelper } from '../common-page/common.helper'; +import { FooterConstants } from './footer.constants'; +import { ChallengeListingPageObject } from '../challenge-listing/challenge-listing.po'; + +export class FooterHelper { + /** + * Initialize the footer page object + */ + public static initialize() { + this.footerPageObject = new FooterPage(); + } + + /** + * Opens the Challenge Listing page + */ + public static async open() { + await ChallengeListingPageObject.open(); + } + + /** + * Verifies any footer section. + * It verifies the redirection of the footer links in a given section + * @param sectionName + * @param isLoggedIn + */ + public static async verifyFooterSection(sectionName, isLoggedIn) { + const menuItem = FooterConstants.getFooterMenu(isLoggedIn)[sectionName]; + const submenus: Object[] = menuItem.submenus; + + const footerLinkTexts = []; + let footerLinks = await this.footerPageObject.getAllFooterLinksInSection( + menuItem.text + ); + + for (let i = 0; i < footerLinks.length; i++) { + // This is needed to prevent stale state exception + footerLinks = await this.footerPageObject.getAllFooterLinksInSection( + menuItem.text + ); + const footerLink = footerLinks[i]; + const text = await footerLink.getText(); + + footerLinkTexts.push(text); + logger.info(footerLink.getText()); + const expectedUrl = submenus[i]['url']; + expect(text).toEqual(submenus[i]['text']); + if (text === 'Forums') { + const href = await footerLink.getAttribute('href'); + expect(href).toEqual(expectedUrl); + continue; + } + await footerLink.click(); + await BrowserHelper.sleep(1000); + logger.info('Clicked on link ' + text); + if (text === 'Website Help') { + const href = await footerLink.getAttribute('href'); + expect(href).toEqual(expectedUrl); + } else if ( + text === 'Statistics' || + text === 'Changelog' + ) { + await CommonHelper.verifyCurrentUrlToContain(expectedUrl); + } else { + await CommonHelper.verifyCurrentUrl(expectedUrl); + } + + await ChallengeListingPageObject.open(); + } + + expect(footerLinkTexts).toEqual(submenus.map((s) => s['text'])); + } + + /** + * Verifies the social media icons and their redirection + */ + public static async verifySocialIcons() { + const configuredSocialLinks = FooterConstants.getSocialLinks(); + const socialLinks = await this.footerPageObject.getAllSocialLinks(); + for (let i = 0; i < socialLinks.length; i++) { + const socialLink = socialLinks[i]; + await socialLink.click(); + const windowHandles = await BrowserHelper.getAllWindowHandles(); + await BrowserHelper.switchToWindow(windowHandles[1]); + const currentUrl = await BrowserHelper.getCurrentUrl(); + expect(currentUrl.includes(configuredSocialLinks[i])).toBe(true); + await BrowserHelper.close(); + await BrowserHelper.switchToWindow(windowHandles[0]); + } + } + + /** + * Verifies the policies link + */ + public static async verifyPoliciesLink() { + await this.footerPageObject.clickOnPoliciesLink(); + await BrowserHelper.sleep(1000); + await CommonHelper.verifyCurrentUrl(ConfigHelper.getPoliciesUrl()); + } + + private static footerPageObject: FooterPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/footer/footer.po.ts b/automated-smoke-test/page-objects/pages/topcoder/footer/footer.po.ts new file mode 100644 index 0000000000..f62536748a --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/footer/footer.po.ts @@ -0,0 +1,37 @@ +import { ElementHelper } from 'topcoder-testing-lib'; + +export class FooterPage { + /** + * Gets the policies link + */ + private get policiesLink() { + return ElementHelper.getElementByLinkText('Policies'); + } + + /** + * Gets all the links under a particular section in the footer + * @param sectionName + */ + public async getAllFooterLinksInSection(sectionName) { + const xpath = `//h4[text()="${sectionName}"]/following-sibling::ul//li//a`; + const footerLinks = await ElementHelper.getAllElementsByXPath(xpath); + return footerLinks; + } + + /** + * Gets all social media links in footer + */ + public async getAllSocialLinks() { + const socialLinks = await ElementHelper.getAllElementsByXPath( + `//h4[text()='FOLLOW US']/following-sibling::div//a` + ); + return socialLinks; + } + + /** + * Clicks on the policies link + */ + public async clickOnPoliciesLink() { + return this.policiesLink.click(); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/header/header.constants.ts b/automated-smoke-test/page-objects/pages/topcoder/header/header.constants.ts new file mode 100644 index 0000000000..dfe73efe67 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/header/header.constants.ts @@ -0,0 +1,127 @@ +import { ConfigHelper } from '../../../../utils/config-helper'; + +export class HeaderConstants { + /** + * Challenge Listing page menu + */ + public static getMenu(isLoggedIn?: boolean) { + const menuConfiguration = { + Community: { + submenus: [ + { + text: 'Overview', + url: ConfigHelper.getSubMenuUrl('overview', isLoggedIn), + }, + { + text: 'How It Works', + url: ConfigHelper.getSubMenuUrl('howItWorks', isLoggedIn), + }, + ], + text: 'COMMUNITY', + }, + Compete: { + submenus: [ + { + text: 'All Challenges', + url: ConfigHelper.getSubMenuUrl('allChallenges', isLoggedIn), + }, + { + text: 'Competitive Programming', + url: ConfigHelper.getSubMenuUrl( + 'competitiveProgramming', + isLoggedIn + ), + }, + { + text: 'Gig Work', + url: ConfigHelper.getSubMenuUrl('taas', isLoggedIn), + }, + { + text: 'Practice', + url: ConfigHelper.getSubMenuUrl('practice', isLoggedIn), + }, + ], + text: 'Compete', + }, + Tracks: { + submenus: [ + { + text: 'Competitive Programming', + url: ConfigHelper.getSubMenuUrl( + 'competitiveProgrammingThrive', + isLoggedIn + ), + }, + { + text: 'Data Science', + url: ConfigHelper.getSubMenuUrl('dataScienceThrive', isLoggedIn), + }, + { + text: 'Design', + url: ConfigHelper.getSubMenuUrl('designThrive', isLoggedIn), + }, + { + text: 'Development', + url: ConfigHelper.getSubMenuUrl('developmentThrive', isLoggedIn), + }, + { + text: 'QA', + url: ConfigHelper.getSubMenuUrl('qaThrive', isLoggedIn), + }, + ], + text: 'Tracks', + }, + Explore: { + submenus: [ + { + text: 'TCO', + url: ConfigHelper.getSubMenuUrl('tco', isLoggedIn), + }, + { + text: 'Programs', + url: ConfigHelper.getSubMenuUrl('programs', isLoggedIn), + }, + { + text: 'Forums', + url: ConfigHelper.getSubMenuUrl('forums', isLoggedIn), + }, + { + text: 'Statistics', + url: ConfigHelper.getSubMenuUrl('statistics', isLoggedIn), + }, + { + text: 'Blog', + url: ConfigHelper.getSubMenuUrl('blog', isLoggedIn), + }, + { + text: 'Thrive', + url: ConfigHelper.getSubMenuUrl('thrive', isLoggedIn), + }, + ], + text: 'Explore', + }, + }; + + if (isLoggedIn) { + menuConfiguration['Community'] = { + submenus: [ + { + text: 'Dashboard', + url: ConfigHelper.getSubMenuUrl('dashboard', isLoggedIn), + }, + { + text: 'My Profile', + url: ConfigHelper.getSubMenuUrl('myProfile', isLoggedIn), + }, + { + text: 'Payments', + url: ConfigHelper.getSubMenuUrl('payments', isLoggedIn), + }, + ], + text: 'COMMUNITY', + }; + } + + return menuConfiguration; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/header/header.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/header/header.helper.ts new file mode 100644 index 0000000000..89797ba4b6 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/header/header.helper.ts @@ -0,0 +1,233 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../logger/logger'; +import { HeaderPage } from './header.po'; +import { HeaderConstants } from './header.constants'; +import { ConfigHelper } from '../../../../utils/config-helper'; +import { CommonHelper } from '../common-page/common.helper'; +import { LoginPage } from '../login/login.po'; + +export class HeaderHelper { + /** + * Initialize the challenge listing Page Object + */ + public static initialize() { + this.headerPageObject = new HeaderPage(); + this.loginPageObject = new LoginPage(); + } + + /** + * sets the Challenge Listing page object + */ + public static setHeaderPage(header) { + this.headerPageObject = header; + } + + /** + * Opens the Challenge Listing page + * @param isLoggedIn + */ + public static async open(isLoggedIn) { + await this.headerPageObject.open(isLoggedIn); + } + + /** + * Verify the logo link redirection + * @param isLoggedIn + */ + public static async verifyLogoLink(isLoggedIn) { + const expectedUrl = isLoggedIn + ? ConfigHelper.getSubMenuUrl('dashboard', true) + : ConfigHelper.getLogoRedirectionUrl(); + await this.headerPageObject.clickOnLogoLink(); + const currentUrl = await BrowserHelper.getCurrentUrl(); + expect(currentUrl).toEqual(expectedUrl); + } + + /** + * Verify the redirection on clicking the login header link + */ + public static async verifyLoginLink() { + const expectedUrl = ConfigHelper.getLoginUrl(); + await this.headerPageObject.clickOnLoginLink(); + await CommonHelper.verifyCurrentUrlToContain(expectedUrl); + } + + /** + * Verify the redirection on clicking the "BUSINESS" header link + */ + public static async verifyBusinessLink() { + await this.headerPageObject.clickOnBusinessLink(); + await this.loginPageObject.waitForHomePage(); + } + + /** + * Verify the header menu + * It verifies if the sub-menu items are correct and + * also verifies the redirection on clicking each sub-menu + * @param menu - menu to be verified + * @param isLoggedIn + */ + public static async verifyMenu(menu, isLoggedIn?: boolean) { + const menuItem = HeaderConstants.getMenu(isLoggedIn)[menu]; + // By default community menu is open + if (menu != 'Community') { + await this.headerPageObject.clickOnMenu(menuItem.text); + } + const submenuNames = await this.headerPageObject.getSubMenuNames(); + const expectedSubmenuNames = menuItem.submenus.map((s) => s.text); + expect(submenuNames).toEqual(expectedSubmenuNames); + + const submenus: Object[] = menuItem.submenus; + + for (let i = 0; i < submenus.length; i++) { + const subMenu = submenus[i]; + const text = subMenu['text']; + const url = subMenu['url']; + + if (text === 'All Challenges') { + continue; + } + + await this.headerPageObject.clickOnMenu(text); + await BrowserHelper.sleep(1000); + if (text === 'Payments') { + await CommonHelper.verifyPopupWindowWithUrl(url); + } else if (text === 'Forums') { + await CommonHelper.verifyPopupWindow(); + } else if (text === 'Statistics') { + await CommonHelper.verifyCurrentUrlToContain(url); + } else if (text === 'Blog') { + await CommonHelper.verifyPopupWindow(); + } else if (text === 'Thrive') { + await CommonHelper.verifyCurrentUrlToContain(url); + }else { + await CommonHelper.verifyCurrentUrl(url); + } + + await this.headerPageObject.open(isLoggedIn); + // By default community menu is open + if (menu != 'Community') { + await this.headerPageObject.clickOnMenu(menuItem.text); + } + } + } + + /** + * Verifies the user section in the user avatar menu + */ + public static async verifyUserMenuProfileLink() { + const expectedUrl = ConfigHelper.getSubMenuUrl('myProfile', true); + await this.headerPageObject.openUserMenu(); + await this.headerPageObject.clickOnUserInfoSection(); + await BrowserHelper.sleep(1000); + await CommonHelper.verifyCurrentUrl(expectedUrl); + } + + /** + * Verifies the 'Switch to Business' link in the user avatar menu + */ + public static async verifyUserMenuBusinessLink() { + await this.headerPageObject.openUserMenu(); + await this.headerPageObject.clickOnSwitchToBusinessLink(); + const expectedUrl = ConfigHelper.getSwitchToBusinessUrl(); + await BrowserHelper.sleep(1000); + await CommonHelper.verifyCurrentUrl(expectedUrl); + } + + /** + * Verifies the 'Settings' link in the user avatar menu + */ + public static async verifyUserMenuSettingsLink() { + await this.headerPageObject.openUserMenu(); + await this.headerPageObject.clickOnSettingsLink(); + const expectedUrl = ConfigHelper.getProfileUrl(); + await BrowserHelper.sleep(1000); + await CommonHelper.verifyCurrentUrl(expectedUrl); + } + + /** + * Verifies the 'Help' link in the user avatar menu + */ + public static async verifyUserMenuHelpLink() { + await this.headerPageObject.openUserMenu(); + await this.headerPageObject.clickOnHelpLink(); + const expectedUrl = ConfigHelper.getHelpUrl(); + await BrowserHelper.sleep(1000); + await CommonHelper.verifyCurrentUrl(expectedUrl); + } + + /** + * Verifies the 'Log out' link in the user avatar menu + */ + public static async verifyUserMenuLogoutLink() { + await this.headerPageObject.openUserMenu(); + await this.headerPageObject.clickOnLogoutLink(); + await this.loginPageObject.waitForHomePage(); + } + + /** + * Verifies the notification menu + */ + public static async verifyNotificationPopup() { + await this.headerPageObject.openNotificationsPopup(); + expect(await this.headerPageObject.isNotificationsPopupVisible()).toBe( + true + ); + } + + /** + * Verifies the 'View all notifications' link if present + */ + public static async verifyAllNotificationsLink() { + await BrowserHelper.sleep(1000); + await this.headerPageObject.openNotificationsPopup(); + if (this.headerPageObject.isViewAllNotificationsPresent) { + await this.headerPageObject.clickOnViewAllNotificationsLink(); + const expectedUrl = ConfigHelper.getAllNotificationsUrl(); + await CommonHelper.verifyCurrentUrl(expectedUrl); + } + } + + /** + * Verifies the behaviour of searching by username + * @param username + */ + public static async verifySearchByUsername(username) { + await this.headerPageObject.search(username); + const expectedUrl = ConfigHelper.getSearchUrl() + '?q=' + username; + await BrowserHelper.waitUntilUrlIs(expectedUrl); + logger.info('Search with username: ' + username); + + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('h1', username), + 'Wait for username element', + false + ); + expect( + await CommonHelper.findElementByText('h1', username).getText() + ).toEqual(username); + } + + /** + * Verifies the behaviour of searching by skill + * @param skill + */ + public static async verifySearchBySkill(skill) { + await this.headerPageObject.search(skill); + const expectedUrl = ConfigHelper.getSearchUrl() + '?q=' + skill; + await BrowserHelper.waitUntilUrlIs(expectedUrl); + logger.info('Search with skill: ' + skill); + + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('span', skill), + 'Wait for skills element', + false + ); + const skillsText = await CommonHelper.findElementByText('span', skill).getText(); + logger.info('Skills found: ' + skillsText); + expect(skillsText.includes(skill)).toBe(true); + } + + private static headerPageObject: HeaderPage; + private static loginPageObject: LoginPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/header/header.po.ts b/automated-smoke-test/page-objects/pages/topcoder/header/header.po.ts new file mode 100644 index 0000000000..ef2e65ef1b --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/header/header.po.ts @@ -0,0 +1,328 @@ +import { BrowserHelper, ElementHelper, Keys } from 'topcoder-testing-lib'; +import { logger } from '../../../../logger/logger'; +import { ConfigHelper } from '../../../../utils/config-helper'; +import { CommonHelper } from '../common-page/common.helper'; + +export class HeaderPage { + /** + * Gets the Challenge Listing page + * @param isLoggedIn + */ + public async open(isLoggedIn: boolean) { + await BrowserHelper.open(ConfigHelper.getOverviewUrl()); + const tabName = isLoggedIn ? 'Dashboard' : 'How It Works'; + // wait for showing page + tab name + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('span', tabName), + 'Wait for tab ' + tabName, + true + ); + logger.info('header is loaded'); + } + + /** + * Gets the user handle menu + */ + private async getUserHandleMenu() { + const spans = await ElementHelper.getAllElementsByCssContainingText( + 'span', + ConfigHelper.getUserName() + ); + return spans[3]; + } + + /** + * Gets the 'Switch to BUSINESS' link in user avatar menu + */ + private async getSwitchToBusinessLink() { + const spans = await ElementHelper.getAllElementsByCssContainingText( + 'span', + 'Switch to BUSINESS' + ); + return spans[1]; + } + + /** + * Gets the 'Menu' link + * @param menu + */ + private getMenuLink(menu) { + const spans = ElementHelper.getElementByCssContainingText('span', menu); + return spans; + } + + /** + * Gets the user info span which redirects to profile page + * in user avatar menu + */ + private async getUserInfoSection() { + const spans = await ElementHelper.getAllElementsByCssContainingText( + 'span', + ConfigHelper.getEmail() + ); + return spans[1]; + } + + /** + * Gets the logo link + */ + private async getLogoLink() { + const links = await ElementHelper.getAllElementsByCss("a[href='/']"); + return links[1]; + } + + /** + * Gets the settings link in user avatar menu + */ + private async getSettingsLink() { + const links = await ElementHelper.getAllElementsByCss( + "a[href='/settings/profile']" + ); + return links[1]; + } + + /** + * Gets the help link in user avatar menu + */ + private async getHelpLink() { + const links = await ElementHelper.getAllElementsByCssContainingText( + 'a', + 'Help' + ); + return links[1]; + } + + /** + * Gets the log out link in user avatar menu + */ + private async getLogoutLink() { + const links = await ElementHelper.getAllElementsByCssContainingText( + 'a', + 'Log Out' + ); + return links[1]; + } + + /** + * Gets the login link + */ + private get loginLink() { + return ElementHelper.getElementByLinkText('LOGIN'); + } + + /** + * Gets the 'BUSINESS' header link + */ + private get businessLink() { + return ElementHelper.getElementByLinkText('BUSINESS'); + } + + /** + * Gets the search icon + */ + private get searchIcon() { + return ElementHelper.getElementByCss('[data-menu="search"]'); + } + + private get searchInput() { + return ElementHelper.getElementByCss( + '[placeholder="Find members by username or skill"]' + ); + } + + /** + * Gets the notification bell icon + */ + private async getBellIcon() { + const xpath = `//a[contains(@href, '/members/${ConfigHelper.getUserName()}')]/parent::div/parent::div/div[position()=1]`; + const els = await ElementHelper.getAllElementsByXPath(xpath); + return els[1]; + } + + /** + * Gets the 'View All Notifications' link from notifications menu + */ + private async getAllNotificationsLink() { + const els = await ElementHelper.getAllElementsByCssContainingText( + 'a', + 'View all Notifications' + ); + return els[1]; + } + + /** + * Gets the 'Notifications' label from notifications popup + */ + private async getNotificationsLabel() { + const els = await ElementHelper.getAllElementsByCssContainingText( + 'span', + 'Notifications' + ); + return els[3]; + } + + /** + * Clicks on the logo + */ + public async clickOnLogoLink() { + const logoLink = await this.getLogoLink(); + await logoLink.click(); + logger.info('Clicked on logo'); + } + + /** + * Clicks on the Business link + */ + public async clickOnBusinessLink() { + await CommonHelper.waitUntilVisibilityOf( + () => this.businessLink, + 'Wait for business link', + false + ); + await this.businessLink.click(); + logger.info('Clicked on BUSINESS link'); + } + + /** + * Clicks on Login link + */ + public async clickOnLoginLink() { + await CommonHelper.waitUntilVisibilityOf( + () => this.loginLink, + 'Wait for login link', + false + ); + await this.loginLink.click(); + logger.info('Clicked on LOGIN link'); + } + + /** + * Clicks on the given menu item basis the link text + * @param menu + */ + public async clickOnMenu(menu) { + await this.getMenuLink(menu).click(); + logger.info('Clicked on menu ' + menu); + } + + /** + * Opens the user avatar menu + */ + public async openUserMenu() { + const userProfileLink = await this.getUserHandleMenu(); + await userProfileLink.click(); + const settingsLink = await this.getSettingsLink(); + expect(await CommonHelper.isDisplayed(settingsLink)).toBe( + true, + 'Setting link is not displayed' + ); + const userInfo = await this.getUserInfoSection(); + expect(await CommonHelper.isDisplayed(userInfo)).toBe( + true, + 'My profile link is not displayed' + ); + const logoutLink = await this.getLogoutLink(); + expect(await CommonHelper.isDisplayed(logoutLink)).toBe( + true, + 'Logout link is not displayed' + ); + } + + /** + * Clicks on the user info section in the user avatar menu + */ + public async clickOnUserInfoSection() { + const userInfo = await this.getUserInfoSection(); + await userInfo.click(); + } + + /** + * Clicks on the 'SWITCH TO BUSINESS' link in the user avatar menu + */ + public async clickOnSwitchToBusinessLink() { + const switchToBusinessLink = await this.getSwitchToBusinessLink(); + await switchToBusinessLink.click(); + } + + /** + * Clicks on the 'Settings' link in user avatar menu + */ + public async clickOnSettingsLink() { + const settingsLink = await this.getSettingsLink(); + await settingsLink.click(); + } + + /** + * Clicks on the 'Help' link in the user avatar menu + */ + public async clickOnHelpLink() { + const helpLink = await this.getHelpLink(); + await helpLink.click(); + } + + /** + * Clicks on the 'Log Out' link in the user avatar menu + */ + public async clickOnLogoutLink() { + const logoutLink = await this.getLogoutLink(); + await logoutLink.click(); + } + + /** + * Clicks on the notification bell icon + */ + public async openNotificationsPopup() { + const bellIcon = await this.getBellIcon(); + await bellIcon.click(); + } + + /** + * Checks if the notifications popup is open + */ + public async isNotificationsPopupVisible() { + const notificationsLabel = await this.getNotificationsLabel(); + return await CommonHelper.isPresent(notificationsLabel); + } + + /** + * Checks if the notifications popup is open + */ + public async isViewAllNotificationsPresent() { + return await CommonHelper.isPresent(await this.getAllNotificationsLink()); + } + + /** + * Clicks on the 'View all notifications' link + */ + public async clickOnViewAllNotificationsLink() { + const allNotificationsLink = await this.getAllNotificationsLink(); + await allNotificationsLink.click(); + } + + /** + * Searches for member/skill via the search menu + * @param query + */ + public async search(query) { + const searchIcon = this.searchIcon; + + await BrowserHelper.mouseMove(searchIcon); + await this.searchInput.sendKeys(query); + await this.searchInput.sendKeys(Keys.ENTER); + } + + /** + * Gets the sub-menu items for the current selected menu + */ + public async getSubMenuNames() { + const xpath = `//div[contains(@role, 'search')]//../following-sibling::div//div//a//span[1]`; + const submenus = []; + const els = await ElementHelper.getAllElementsByXPath(xpath); + for (let i = 0; i < els.length; i++) { + const text = await els[i].getText(); + submenus.push(text); + } + + return submenus; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/home-page/home.po.ts b/automated-smoke-test/page-objects/pages/topcoder/home-page/home.po.ts new file mode 100644 index 0000000000..f5bb7e74c3 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/home-page/home.po.ts @@ -0,0 +1,10 @@ +import { ElementHelper } from 'topcoder-testing-lib'; + +export class HomePage { + /** + * Gets the home page container element + */ + public get container() { + return ElementHelper.getElementByClassName('home'); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/login/login.constants.ts b/automated-smoke-test/page-objects/pages/topcoder/login/login.constants.ts new file mode 100644 index 0000000000..d32e496d7d --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/login/login.constants.ts @@ -0,0 +1,13 @@ +export class LoginPageConstants { + /** + * Error messages + */ + static get errors() { + return { + InvalidPassword: + 'That password is incorrect. Please check that you entered the right one.', + MemberNotPresent: + "We couldn't find a member with that username. Please check that you entered it correctly.", + }; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/login/login.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/login/login.helper.ts new file mode 100644 index 0000000000..f8ca773ee8 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/login/login.helper.ts @@ -0,0 +1,122 @@ +import { logger } from '../../../../logger/logger'; +import { ConfigHelper } from '../../../../utils/config-helper'; +import { CommonHelper } from '../common-page/common.helper'; +import { LoginPageConstants } from './login.constants'; +import { LoginPage } from './login.po'; +import { SplashPage } from '../splash/splash.po'; +import { BrowserHelper } from 'topcoder-testing-lib'; + +export class LoginPageHelper { + /** + * Set the page object + * @param {LoginPage} loginPage + */ + public static setLoginPage(loginPage) { + this.loginPageObject = loginPage; + } + + /** + * Open page + */ + public static async open() { + this.loginPageObject = new LoginPage(); + await this.loginPageObject.open(); + } + + /** + * Login + * @param {String} username + * @param {String} password + */ + public static async login(username: string, password: string) { + await this.loginPageObject.waitForLoginForm(); + await this.loginPageObject.fillLoginForm(username, password); + await BrowserHelper.sleep(5000); + } + + /** + * Logout + */ + public static async logout() { + await this.loginPageObject.logout(); + await BrowserHelper.sleep(5000); + } + + /** + * Verify Login + * @param {String} username + * @param {String} password + */ + public static async verifyLogin(username: string, password: string) { + await CommonHelper.verifyCurrentUrl(ConfigHelper.getLoginUrl()); + await this.loginPageObject.waitForLoginForm(); + await this.loginPageObject.fillLoginForm(username, password); + const homePage = await this.loginPageObject.waitForHomePage(); + await this.verifyHomePage(); + } + + /** + * Verify Login with invalid username + * @param {String} invalidUsername + * @param {String} password + */ + public static async verifyLoginWithInvalidUserName( + invalidUsername: string, + password: string + ) { + await this.loginPageObject.waitForLoginForm(); + await this.loginPageObject.fillLoginForm(invalidUsername, password); + await this.loginPageObject.waitForErrorMessage(); + expect(await this.loginPageObject.errorMessage.getText()).toEqual( + LoginPageConstants.errors.MemberNotPresent + ); + logger.info('Member not found error displayed'); + } + + /** + * Verify Login with invalid password + * @param {String} username + * @param {String} invalidPassword + */ + public static async verifyLoginWithInvalidPassword( + username: string, + invalidPassword: string + ) { + await this.loginPageObject.waitForLoginForm(); + await this.loginPageObject.fillLoginForm(username, invalidPassword); + await this.loginPageObject.waitForErrorMessage(); + expect(await this.loginPageObject.errorMessage.getText()).toEqual( + LoginPageConstants.errors.InvalidPassword + ); + logger.info('Invalid Password error message displayed'); + } + + /** + * Verify Logout + */ + public static async verifyLogout() { + this.loginPageObject.logout(); + const homePage = await this.loginPageObject.waitForHomePage(); + await this.verifyHomePage(); + } + + /** + * Verify the current page is the home page + * @param {HomePage} homePage + */ + public static async verifyHomePage() { + CommonHelper.verifyCurrentUrl(ConfigHelper.getHomePageUrl()); + logger.info('User redirected to home-page'); + } + + /** + * Verify the current page is the splash page + * @param {SplashPage} splashPage + */ + public static async verifySplashPage(splashPage: SplashPage) { + CommonHelper.verifyCurrentUrl(ConfigHelper.getSplashPageUrl()); + logger.info('User redirected to splash-page'); + } + + private static loginPageObject: LoginPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/login/login.po.ts b/automated-smoke-test/page-objects/pages/topcoder/login/login.po.ts new file mode 100644 index 0000000000..39ca7685a9 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/login/login.po.ts @@ -0,0 +1,151 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import * as appconfig from '../../../../config/app-config.json'; +import { logger } from '../../../../logger/logger'; +import { ConfigHelper } from '../../../../utils/config-helper'; +import { HomePage } from '../home-page/home.po.js'; +import { SplashPage } from '../splash/splash.po'; +import { CommonHelper } from '../common-page/common.helper'; +import { StartPage } from '../start/start.po'; + +export class LoginPage { + /** + * Get login page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getRedirectLoginUrl()); + logger.info('User navigated to Topcoder Login Page'); + } + + /** + * Get login form + */ + public get loginForm() { + return ElementHelper.getElementByClassName('auth0-lock-widget'); + } + + /** + * Get Username field + */ + public get userNameField() { + return ElementHelper.getElementByName('username'); + } + + /** + * Get Password field + */ + public get passwordField() { + return ElementHelper.getElementByName('password'); + } + + /** + * Get Login button + */ + public get loginButton() { + return ElementHelper.getElementByCss("button[type = 'submit']"); + } + + /** + * Get Error message + */ + public get errorMessage() { + return ElementHelper.getElementByClassName('form-error'); + } + + /** + * Logout the user + */ + public async logout() { + await BrowserHelper.open(ConfigHelper.getLogoutUrl()); + logger.info('user logged out'); + } + + /** + * Wait for the login form to be displayed + */ + public async waitForLoginForm() { + // Wait until login form appear + await BrowserHelper.sleep(8000); + CommonHelper.waitUntilVisibilityOf( + () => this.loginForm, + 'Wait for login form', + true + ); + logger.info('Login Form Displayed'); + } + + /** + * Fill and submit the login form + */ + public async fillLoginForm(username, password) { + await CommonHelper.waitUntilPresenceOf( + () => this.userNameField, + 'wait for username field', + false + ); + await this.userNameField.sendKeys(username); + await this.passwordField.sendKeys(password); + logger.info( + 'Login form filled with values: username - ' + + username + + ', password - ' + + password + ); + await BrowserHelper.waitUntilClickableOf( + this.loginButton, + appconfig.Timeout.ElementClickable, + appconfig.LoggerErrors.ElementClickable + ); + await this.loginButton.click(); + logger.info('Submitted login form'); + } + + /** + * Wait for home page to be displayed + */ + public async waitForHomePage() { + const homepage = new HomePage(); + await CommonHelper.waitUntilVisibilityOf( + () => homepage.container, + 'Wait for home page', + true + ); + return homepage; + } + + /** + * Wait for start page to be displayed + */ + public async waitForStartPage() { + const startPage = new StartPage(); + await CommonHelper.waitUntilVisibilityOf( + () => startPage.container, + 'Wait for home page', + true + ); + return startPage; + } + + /** + * Wait for home page to be displayed + */ + public async waitForSplashPage() { + const splashpage = new SplashPage(); + await CommonHelper.waitUntilVisibilityOf( + () => splashpage.container, + 'Wait for splash page', + true + ); + return splashpage; + } + + /** + * Wait for error message to be displayed + */ + public async waitForErrorMessage() { + await CommonHelper.waitUntilVisibilityOf( + () => this.errorMessage, + 'Wait for error message', + false + ); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/member-profile-page/member-profile.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/member-profile-page/member-profile.helper.ts new file mode 100644 index 0000000000..bc7193768e --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/member-profile-page/member-profile.helper.ts @@ -0,0 +1,335 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import * as _ from 'lodash'; +import { CommonHelper } from '../common-page/common.helper'; +import { MemberProfilePageObject, SkillInfo } from './member-profile.po'; +import { + MemberProfileTrackConfig, + MemberProfileSubtrackConfig, +} from '../../../../utils/config-helper'; + +export class MemberProfilePageHelper { + /** + * Open member profile page + * @param handle handle of member + */ + private static async open(handle: string) { + await BrowserHelper.open( + `${MemberProfilePageObject.memberProfileUrl}/${handle}` + ); + await CommonHelper.waitUntilVisibilityOf( + () => MemberProfilePageObject.getHandleField(handle), + 'Wait for show member handle', + true + ); + await BrowserHelper.sleep(1000); + } + + /** + * Open any member profile page + */ + public static async openMemberPage() { + await this.open(MemberProfilePageObject.memberProfileInfo.handle); + } + + /** + * Open copilot member profile page + */ + public static async openCopilotMemberPage() { + await this.open(MemberProfilePageObject.memberCopilotProfileInfo.handle); + } + + /** + * Open development member profile page + */ + public static async openDevelopmentMemberPage() { + await this.open( + MemberProfilePageObject.memberDevelopmentProfileInfo.handle + ); + } + + /** + * Open design member profile page + */ + public static async openDesignMemberPage() { + await this.open(MemberProfilePageObject.memberDesignProfileInfo.handle); + } + + /** + * Open data science member profile page + */ + public static async openDataScienceMemberPage() { + await this.open( + MemberProfilePageObject.memberDataScienceProfileInfo.handle + ); + } + + /** + * Open member have web section profile page + */ + public static async openMemberHaveWebSectionProfilePage() { + await this.open( + MemberProfilePageObject.memberHaveWebSectionProfileInfo.handle + ); + } + + /** + * Verify member details are correct + */ + public static async verifyMemberDetailsAreCorrect() { + const memberInfo = await MemberProfilePageObject.getMemberInfo(); + const expectedClientInfo = MemberProfilePageObject.memberProfileInfo; + const omitProps = [ + 'numberOfCollapsedSkills', + 'verifiedSkill', + 'noneVerifiedSkill', + ]; + return expect( + _.isEqual( + _.omit(memberInfo, omitProps), + _.omit(expectedClientInfo, omitProps) + ) + ).toBe(true, 'Member details are not correct'); + } + + /** + * Verify member skills are correct + */ + public static async verifySkillsAreCorrect() { + const expectedClientInfo = MemberProfilePageObject.memberProfileInfo; + let skills: SkillInfo[] = await MemberProfilePageObject.getAllSkills(); + expect(skills.length).toBe( + expectedClientInfo.numberOfCollapsedSkills, + 'Number of skills for the user is not correct' + ); + expect( + _.some(skills, { + name: expectedClientInfo.verifiedSkill, + isHaveCheckMark: true, + }) + ).toBe(true, 'Verified skill is not displayed with a check mark'); + expect( + _.some(skills, { + name: expectedClientInfo.noneVerifiedSkill, + isHaveCheckMark: false, + }) + ).toBe(true, 'Unverified skill should not be displayed with a check mark'); + const numberOfCollapsedSkills = skills.length; + await CommonHelper.findElementByText('button', 'VIEW ALL').click(); + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('button', 'VIEW LESS'), + 'Wait for view less button', + false + ); + skills = await MemberProfilePageObject.getAllSkills(); + const numberOfAllSkills = skills.length; + expect(numberOfCollapsedSkills <= numberOfAllSkills).toBe( + true, + 'Button View All does not work as expected' + ); + await CommonHelper.findElementByText('button', 'VIEW LESS').click(); + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('button', 'VIEW ALL'), + 'Wait for view less button', + false + ); + expect(skills.length <= numberOfAllSkills).toBe( + true, + 'Button View Less does not work as expected' + ); + } + + /** + * Verify subtrack show correct info + * @param trackInfo track info + */ + public static async verifySubtractkShowCorrectInfo( + trackInfo: MemberProfileTrackConfig + ) { + const allSubtracks = await MemberProfilePageObject.getAllSubtracks( + trackInfo.trackName + ); + const fields = ['name', 'info', 'infoTitle']; + const verifySubtrack = async ( + expectedSubtrack: MemberProfileSubtrackConfig + ) => { + expect( + _.some(allSubtracks, (subtrack) => + _.isEqual(_.pick(subtrack, fields), _.pick(expectedSubtrack, fields)) + ) + ).toBe(true, `Subtrack of ${trackInfo.trackName} is not correct`); + }; + if (trackInfo.fullfillmentInfo) { + await verifySubtrack(trackInfo.fullfillmentInfo); + } else if (trackInfo.winInfo) { + await verifySubtrack(trackInfo.winInfo); + } else if (trackInfo.ratingInfo) { + await verifySubtrack(trackInfo.ratingInfo); + } + } + + /** + * Verify clicking on subtrack card takes + * the user to the corresponding Stats History page + */ + public static async verifyClickingOnSubtrackCard( + trackInfo: MemberProfileTrackConfig + ) { + const allSubtracks = await MemberProfilePageObject.getAllSubtracks( + trackInfo.trackName + ); + const fields = ['name', 'info', 'infoTitle']; + const verifySubtrack = async ( + expectedSubtrack: MemberProfileSubtrackConfig + ) => { + const subtrackInfo: MemberProfileSubtrackConfig = _.find( + allSubtracks, + _.pick(expectedSubtrack, fields) + ); + if (subtrackInfo) { + await subtrackInfo.card.click(); + await CommonHelper.verifyCurrentUrl(expectedSubtrack.link); + } + }; + if (trackInfo.fullfillmentInfo) { + await verifySubtrack(trackInfo.fullfillmentInfo); + } else if (trackInfo.winInfo) { + await verifySubtrack(trackInfo.winInfo); + } else if (trackInfo.ratingInfo) { + await verifySubtrack(trackInfo.ratingInfo); + } + } + + /** + * Verify number of subtracks is correct + */ + public static async verifyNumberOfSubtracksIsCorrect( + trackInfo: MemberProfileTrackConfig + ) { + const allSubtracks = await MemberProfilePageObject.getAllSubtracks( + trackInfo.trackName + ); + expect(trackInfo.numberOfSubtracks).toBe( + allSubtracks.length, + `Number of subtracks is not correct under ${trackInfo.trackName} track` + ); + } + + /** + * Verify that below details on the copilot activity + * card are correct fullfillment % + */ + public static async verifyCopilotFullfillmentIsCorrect() { + await this.verifySubtractkShowCorrectInfo( + MemberProfilePageObject.memberCopilotProfileInfo + ); + } + + /** + * Verify clicking on Copilot activity card takes + * the user to the corresponding Stats History page + */ + public static async verifyClickingOnCopilotSubtrackCard() { + await this.verifyClickingOnSubtrackCard( + MemberProfilePageObject.memberCopilotProfileInfo + ); + } + + /** + * Verify the number of subtracks is correct under the development track + */ + public static async verifyNumberOfDevelopmentSubtracksIsCorrect() { + await this.verifyNumberOfSubtracksIsCorrect( + MemberProfilePageObject.memberDevelopmentProfileInfo + ); + } + + /** + * Verify that the below details on any development subtrack + * card are correct Wins / Rating + */ + public static async verifyDevelopmentSubtrackIsCorrect() { + await this.verifySubtractkShowCorrectInfo( + MemberProfilePageObject.memberDevelopmentProfileInfo + ); + } + + /** + * Verify clicking on development activity card takes + * the user to the corresponding Stats History page + */ + public static async verifyClickingOnDevelopmentSubtrackCard() { + await this.verifyClickingOnSubtrackCard( + MemberProfilePageObject.memberDevelopmentProfileInfo + ); + } + + /** + * Verify the number of subtracks is correct under the design track + */ + public static async verifyNumberOfDesignSubtracksIsCorrect() { + await this.verifyNumberOfSubtracksIsCorrect( + MemberProfilePageObject.memberDesignProfileInfo + ); + } + + /** + * Verify that the below details on any design subtrack + * card are correct Wins / Rating + */ + public static async verifyDesignSubtrackIsCorrect() { + await this.verifySubtractkShowCorrectInfo( + MemberProfilePageObject.memberDesignProfileInfo + ); + } + + /** + * Verify clicking on design activity card takes + * the user to the corresponding Stats History page + */ + public static async verifyClickingOnDesignSubtrackCard() { + await this.verifyClickingOnSubtrackCard( + MemberProfilePageObject.memberDesignProfileInfo + ); + } + + /** + * Verify the number of subtracks is correct under the data science track + */ + public static async verifyNumberOfDataScienceSubtracksIsCorrect() { + await this.verifyNumberOfSubtracksIsCorrect( + MemberProfilePageObject.memberDataScienceProfileInfo + ); + } + + /** + * Verify that the below details on any data science subtrack + * card are correct Wins / Rating + */ + public static async verifyDataScienceSubtrackIsCorrect() { + await this.verifySubtractkShowCorrectInfo( + MemberProfilePageObject.memberDataScienceProfileInfo + ); + } + + /** + * Verify clicking on data science activity card takes + * the user to the corresponding Stats History page + */ + public static async verifyClickingOnDataScienceSubtrackCard() { + await this.verifyClickingOnSubtrackCard( + MemberProfilePageObject.memberDataScienceProfileInfo + ); + } + + /** + * Verify web section show correct web link + */ + public static async verifyWebSectionShowCorrectWeblink() { + const webLinks = await MemberProfilePageObject.getAllWebLinks(); + expect( + webLinks.indexOf( + MemberProfilePageObject.memberHaveWebSectionProfileInfo.webLink + ) >= 0 + ).toBe(true, 'Web link show on the web section is not correct'); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/member-profile-page/member-profile.po.ts b/automated-smoke-test/page-objects/pages/topcoder/member-profile-page/member-profile.po.ts new file mode 100644 index 0000000000..b1ccca9856 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/member-profile-page/member-profile.po.ts @@ -0,0 +1,174 @@ +import { ElementHelper } from "topcoder-testing-lib"; +import { + ConfigHelper, + MemberProfileInfoConfig, + MemberProfileSubtrackConfig, +} from "../../../../utils/config-helper"; +import { CommonHelper } from "../common-page/common.helper"; + +// skill info +export interface SkillInfo { + name: string; + isHaveCheckMark: boolean; +} + +export class MemberProfilePageObject { + /** + * Get member profile url + */ + static get memberProfileUrl(): string { + return ConfigHelper.getMemberProfileConfig().url; + } + /** + * Get member profile info + */ + static get memberProfileInfo() { + return ConfigHelper.getMemberProfileConfig().profileInfo; + } + /** + * Get copilot profile info + */ + static get memberCopilotProfileInfo() { + return ConfigHelper.getMemberProfileConfig().copilotProfile; + } + /** + * Get development profile info + */ + static get memberDevelopmentProfileInfo() { + return ConfigHelper.getMemberProfileConfig().developmentProfile; + } + /** + * Get design profile info + */ + static get memberDesignProfileInfo() { + return ConfigHelper.getMemberProfileConfig().designProfile; + } + /** + * Get data science profile info + */ + static get memberDataScienceProfileInfo() { + return ConfigHelper.getMemberProfileConfig().dataScienceProfile; + } + /** + * Get member have web section info + */ + static get memberHaveWebSectionProfileInfo() { + return ConfigHelper.getMemberProfileConfig().memberHaveWebSectionInfo; + } + /** + * Get handle field + * @param handle handle of member + */ + static getHandleField(handle: string) { + return CommonHelper.findElementByText("h1", handle); + } + /** + * Get all skills + */ + static async getAllSkills(): Promise { + const skills = await ElementHelper.getAllElementsByClassName("_17_DJM"); + return await Promise.all( + skills.map(async (card) => { + const name = await ElementHelper.getElementByClassName( + "_31cKGD", + card + ).getText(); + const isHaveCheckMark = await CommonHelper.isPresent( + ElementHelper.getElementByCss("._BoiHz svg", card) + ); + return { + name, + isHaveCheckMark, + }; + }) + ); + } + /** + * Get all tracks + */ + static async getAllTracks(): Promise { + const tracks = await ElementHelper.getAllElementsByClassName("_2lQG4o"); + return await Promise.all( + tracks.map(async (card) => { + return await card.getAttribute("id"); + }) + ); + } + /** + * Get all subtracks + * @param trackId id of track + */ + static async getAllSubtracks( + trackId: string + ): Promise { + const trackElement = ElementHelper.getElementById(trackId); + const subtracks = await ElementHelper.getAllElementsByClassName( + "_3Es9QB", + trackElement + ); + return await Promise.all( + subtracks.map(async (card) => { + const name = await ElementHelper.getElementByClassName( + "_3LRlZS", + card + ).getText(); + const info = await ElementHelper.getElementByClassName( + "aMu8-h", + card + ).getText(); + const infoTitle = await ElementHelper.getElementByClassName( + "_3_M6ux", + card + ).getText(); + return { + name, + info, + infoTitle, + card, + }; + }) + ); + } + /** + * Get all web links + */ + static async getAllWebLinks(): Promise { + const webLinks = await ElementHelper.getAllElementsByCss("a.hyNr-2"); + return await Promise.all( + webLinks.map(async (card) => { + const link = await ElementHelper.getElementByClassName( + "_13i4cy", + card + ).getText(); + return link; + }) + ); + } + /** + * Get member info + */ + static async getMemberInfo(): Promise { + const handle = await ElementHelper.getElementByTag("h1").getText(); + const numberOfCollapsedSkills = (await this.getAllSkills()).length; + const userDet = await ElementHelper.getElementByCss("h3.a6sow0").getText(); + const country = userDet.split(" ", 1)[0]; + console.log("country:" + country); + const memberSince = await ElementHelper.getElementByCss( + "h3._3ODNva" + ).getText(); + const tracks = await this.getAllTracks(); + const quote = await ElementHelper.getElementByCss("p._1tUAew").getText(); + const forumLink = await ElementHelper.getElementByCss( + "a._1S7iib" + ).getAttribute("href"); + return { + handle, + numberOfCollapsedSkills, + country, + memberSince, + tracks, + quote, + forumLink, + }; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/my-dashboard-page/my-dashboard.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/my-dashboard-page/my-dashboard.helper.ts new file mode 100644 index 0000000000..6ecb0c145f --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/my-dashboard-page/my-dashboard.helper.ts @@ -0,0 +1,96 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import * as _ from 'lodash'; +import { MyDashboardPageObject } from './my-dashboard.po'; +import { CommonHelper } from '../common-page/common.helper'; +import { ChallengeCardInfo } from '../../../../utils/config-helper'; + +export class MyDashboardPageHelper { + /** + * Open my dashboard page + */ + public static async open() { + await BrowserHelper.open(MyDashboardPageObject.myDashboardUrl); + await CommonHelper.waitUntilVisibilityOf( + () => MyDashboardPageObject.challengeCard, + 'Wait for challenge card', + true + ); + await BrowserHelper.sleep(1000); + } + + /** + * Check if tab is active + * @param tabName name of tab + */ + public static async checkIfTabIsActive(tabName: string) { + const tabItem = MyDashboardPageObject.getTabWithName(tabName); + const className = await tabItem.getAttribute('class'); + expect(className).toContain('_10EtkX'); // tab is selected + } + + /** + * Check if challenge card have correct info + */ + public static async checkChallengeCardIsDisplayed() { + const allCardsInfo = await MyDashboardPageObject.getAllChallengeCardsInfo(); + expect( + _.some(allCardsInfo, (card: ChallengeCardInfo) => + _.isEqual(card, MyDashboardPageObject.myChallengeCardInfo) + ) + ).toBe(true, 'Challenge card is not displayed'); + } + + /** + * Select tab + * @param tabName name of tab + */ + public static async selectTab(tabName: string) { + const tabItem = MyDashboardPageObject.getTabWithName(tabName); + const button = CommonHelper.findElementByAttribute( + 'div', + 'role', + 'button', + tabItem + ); + await button.click(); + } + + /** + * Verify user communities are displayed + */ + public static async verifyUserCommunitiesAreDisplayed() { + await CommonHelper.waitUntilVisibilityOf( + () => MyDashboardPageObject.communityCard, + 'Wait for community card', + true + ); + await BrowserHelper.sleep(1000); + const communities = await MyDashboardPageObject.getAllComunities(); + expect( + communities.indexOf(MyDashboardPageObject.myCommunityInfo.name) >= 0 + ).toBe(true, 'Community card is not displayed'); + } + + /** + * Verify learn more link + */ + public static async verifyLearnMoreLink() { + const button = await MyDashboardPageObject.getLearnMoreButtonOfMyCommunity(); + await button.click(); + CommonHelper.verifyPopupWindowWithUrl( + MyDashboardPageObject.myCommunityInfo.learnMoreUrl + ); + } + + /** + * Verify srm tab is displayed + */ + public static async verifySRMTabIsDisplayed() { + await MyDashboardPageHelper.checkIfTabIsActive('SRMs'); + await CommonHelper.waitUntilVisibilityOf( + () => MyDashboardPageObject.practiceOnPastProblems, + 'Wait for practice on past problems card', + true + ); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/my-dashboard-page/my-dashboard.po.ts b/automated-smoke-test/page-objects/pages/topcoder/my-dashboard-page/my-dashboard.po.ts new file mode 100644 index 0000000000..c63e07afc8 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/my-dashboard-page/my-dashboard.po.ts @@ -0,0 +1,151 @@ +import { ElementHelper } from 'topcoder-testing-lib'; +import { + ConfigHelper, + ChallengeCardInfo, +} from '../../../../utils/config-helper'; +import { CommonHelper } from '../common-page/common.helper'; +import { TcElementImpl } from 'topcoder-testing-lib/dist/src/tc-element-impl'; + +export class MyDashboardPageObject { + /** + * Get my dashboard url + */ + static get myDashboardUrl() { + return ConfigHelper.getMyDashboardConfig().url; + } + + /** + * Get my challenge card info + */ + static get myChallengeCardInfo() { + return ConfigHelper.getMyDashboardConfig().challenge; + } + /** + * Get my community info + */ + static get myCommunityInfo() { + return ConfigHelper.getMyDashboardConfig().community; + } + + /** + * Get challenge card + */ + static get challengeCard() { + return ElementHelper.getElementByClassName('h5vOao'); + } + + /** + * Get community card + */ + static get communityCard() { + return ElementHelper.getElementByClassName('_2PpTJv'); + } + + /** + * Get practice on past problems card + */ + static get practiceOnPastProblems() { + return CommonHelper.findElementByText('h2', 'Practice on past problems'); + } + + /** + * Get dasbhoard tab + * @param tabName name of tab + */ + static getTabWithName(tabName: string) { + return ElementHelper.getElementByXPath( + '//div[contains(text(), "' + tabName + '")]/parent::div' + ); + } + + /** + * Get submit button + * @param parent parent element + */ + static getSubmitButton(parent: TcElementImpl) { + return CommonHelper.findElementByText('a', 'Submit', parent); + } + + /** + * Get all challenge card info + */ + static async getAllChallengeCardsInfo(): Promise { + const challengeCards = await ElementHelper.getAllElementsByClassName( + 'h5vOao' + ); + const cardInfos: ChallengeCardInfo[] = await Promise.all( + challengeCards.map(async (card) => { + const name = await ElementHelper.getElementByCss( + 'a._13aAhb', + card + ).getText(); + const currentPhase = await ElementHelper.getElementByTag( + 'h3' + ).getText(); + const isHaveSubmitButton = await CommonHelper.isDisplayed( + this.getSubmitButton(card) + ); + const linkToSubmit = isHaveSubmitButton + ? await this.getSubmitButton(card).getAttribute('href') + : ''; + const userRole = await ElementHelper.getElementByClassName( + '_2zSyAb', + card + ).getText(); + const cardInfo = { + name, + currentPhase, + linkToSubmit, + userRole, + }; + return cardInfo; + }) + ); + return cardInfos; + } + + /** + * Get all communities + */ + static async getAllComunities(): Promise { + const communityCards = await ElementHelper.getAllElementsByClassName( + '_2PpTJv' + ); + const communities: string[] = await Promise.all( + communityCards.map(async (card) => { + const name = await ElementHelper.getElementByClassName( + 'lO3iws', + card + ).getText(); + return name; + }) + ); + return communities; + } + + /** + * Get learn more button of my community + */ + static async getLearnMoreButtonOfMyCommunity(): Promise { + const communityCards = await ElementHelper.getAllElementsByClassName( + '_2PpTJv' + ); + let learnMoreButton: TcElementImpl; + await Promise.all( + communityCards.map(async (card) => { + const name = await ElementHelper.getElementByClassName( + 'lO3iws', + card + ).getText(); + if (name === this.myCommunityInfo.name) { + learnMoreButton = CommonHelper.findElementByText( + 'a', + 'Learn more', + card + ); + } + }) + ); + return learnMoreButton; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/account/linked-account/linked-account.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/account/linked-account/linked-account.helper.ts new file mode 100644 index 0000000000..cdd4db6c26 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/account/linked-account/linked-account.helper.ts @@ -0,0 +1,52 @@ +import { logger } from '../../../../../../logger/logger'; +import { LinkedAccountPage } from './linked-account.po'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class LinkedAccountPageHelper { + /** + * Opens the linked account page in the browser + */ + public static async open() { + this.linkedAccountPageObject = new LinkedAccountPage(); + await this.linkedAccountPageObject.open(); + } + + /** + * Delete all linked accounts + */ + public static async deleteAll() { + await BrowserHelper.sleep(3000); + await this.linkedAccountPageObject.deleteAll(); + } + + /** + * Add linked account + * @param linkedAccount + */ + public static async verifyAddLink(linkedAccount) { + await this.linkedAccountPageObject.addLinkedAccount(linkedAccount); + await this.linkedAccountPageObject.waitForDefaultSuccessMessage(); + + const text = ('http://' + linkedAccount).toUpperCase(); + const isDisplayed = await CommonHelper.isDisplayed( + ElementHelper.getElementByLinkText(text) + ); + expect(isDisplayed).toBe(true); + logger.info(`Linked account ${linkedAccount} added`); + } + + /** + * Verify deletion of linked account + * @param linkedAccount + */ + public static async verifyDeleteLink(linkedAccount) { + await this.linkedAccountPageObject.delete(); + const text = ('http://' + linkedAccount).toUpperCase(); + const els = await ElementHelper.getAllElementsByLinkText(text); + expect(els.length).toBe(0); + logger.info(`Linked account ${linkedAccount} deleted`); + } + + private static linkedAccountPageObject: LinkedAccountPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/account/linked-account/linked-account.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/account/linked-account/linked-account.po.ts new file mode 100644 index 0000000000..854f9de7a3 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/account/linked-account/linked-account.po.ts @@ -0,0 +1,106 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../../../logger/logger'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { SettingsPage } from '../../settings.po'; +import { SettingsPageConstants } from '../../settings.constants'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class LinkedAccountPage extends SettingsPage { + /** + * Gets the LinkedAccounts page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getAccountUrl()); + await this.switchTab('linked accounts'); + logger.info('User navigated to Linked Account Page'); + } + + /** + * Gets the external link input field + */ + private async getExternalLinkInput() { + const els = await ElementHelper.getAllElementsByCss( + 'input[placeholder="http://www.yourlink.com"' + ); + return els[1]; + } + + /** + * Gets the external link add button + */ + private get externalLinkAddButton() { + return ElementHelper.getElementByClassName('button-add-link'); + } + + /** + * Gets the external link delete icon + */ + private get deleteLink() { + return ElementHelper.getElementByXPath( + "//div[@role = 'link']//div[1]//div" + ); + } + + /** + * Gets the external link deletion message + */ + private get externalLinkDeletionMsg() { + return CommonHelper.findElementByText('div', 'was removed.'); + } + + /** + * Gets the success message + */ + public get successMsg() { + return CommonHelper.findElementByText( + 'div', + SettingsPageConstants.Messages.LinkSuccessMessage + ); + } + + /** + * Delete link + */ + public async delete() { + await this.deleteLink.click(); + await CommonHelper.waitUntilVisibilityOf( + () => this.deleteConfirmation, + 'Wait for delete comfirmation', + false + ); + await this.deleteConfirmation.click(); + + await CommonHelper.waitUntilVisibilityOf( + () => this.externalLinkDeletionMsg, + 'Wait for external link deletion message', + false + ); + await CommonHelper.waitUntilInVisibilityOf( + () => this.externalLinkDeletionMsg, + 'Wait for external link deletion message', + false + ); + } + + /** + * Delete all links + */ + public async deleteAll() { + const deleteLinks = await ElementHelper.getAllElementsByCss( + "div[role='link']" + ); + for (let i = 0; i < deleteLinks.length; i++) { + await this.delete(); + } + } + + /** + * Add linked account + * @param linkedAccount + */ + public async addLinkedAccount(linkedAccount) { + const inputField = await this.getExternalLinkInput(); + await inputField.sendKeys(linkedAccount); + await this.externalLinkAddButton.click(); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/account/my-account/my-account.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/account/my-account/my-account.helper.ts new file mode 100644 index 0000000000..9991bbd26d --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/account/my-account/my-account.helper.ts @@ -0,0 +1,51 @@ +import { logger } from '../../../../../../logger/logger'; +import { MyAccountPage } from './my-account.po'; +import { ElementHelper } from 'topcoder-testing-lib'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class MyAccountPageHelper { + /** + * Opens the my account page in the browser + */ + public static async open() { + this.myAccountPageObject = new MyAccountPage(); + await this.myAccountPageObject.open(); + } + + /** + * Verifies user consent by first toggling the consent and + * then re-toggling the consent to ensure consistent + * behaviour everytime + * In case of any alert, it dismisses the error message + */ + public static async verifyUserConsent() { + await CommonHelper.waitUntilPresenceOf( + () => this.myAccountPageObject.consentLabel, + 'wait for consent label', + true + ); + await this.myAccountPageObject.consentLabel.click(); + await this.myAccountPageObject.waitForDefaultSuccessMessage(); + try { + const errorPopup = CommonHelper.findElementByText( + 'p', + 'Failed to add user trait' + ); + const isDisplayed = await CommonHelper.isPresent(errorPopup); + if (isDisplayed) { + logger.info('Error popup was shown, dismissing it'); + await ElementHelper.getElementByButtonText('OK').click(); + } + } catch (ex) {} + const consentStatus = await this.myAccountPageObject.isConsentGiven(); + await this.myAccountPageObject.toggleConsent(); + await this.myAccountPageObject.waitForDefaultSuccessMessage(); + const expectedConsentStatus = !consentStatus; + const actualConsentStatus = await this.myAccountPageObject.isConsentGiven(); + expect(actualConsentStatus).toBe(expectedConsentStatus); + logger.info( + `consent toggled from ${consentStatus} to ${expectedConsentStatus}` + ); + } + private static myAccountPageObject: MyAccountPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/account/my-account/my-account.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/account/my-account/my-account.po.ts new file mode 100644 index 0000000000..54a029b986 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/account/my-account/my-account.po.ts @@ -0,0 +1,49 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../../../logger/logger'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { SettingsPage } from '../../settings.po'; + +export class MyAccountPage extends SettingsPage { + /** + * Gets the MyAccounts page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getAccountUrl()); + await this.switchTab('my account'); + logger.info('User navigated to My Account Page'); + } + + /** + * Get the consent label element + */ + public get consentLabel() { + return ElementHelper.getElementByCss( + 'label[for="pre-onoffswitch-user-consent"]' + ); + } + + /** + * Helper method which tells if the consent is already checked + */ + public async isConsentGiven() { + const backgroundColor = await this.consentLabel.getCssValue( + 'background-color' + ); + return this.getStatus(backgroundColor); + } + + /** + * Toggle the consent by clicking the label + */ + public async toggleConsent() { + await this.consentLabel.click(); + } + + /** + * Helper method to get status basis the background color + * @param color + */ + private getStatus(color: string) { + return color == 'rgba(192, 192, 192, 1)' ? false : true; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/email/email.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/email/email.helper.ts new file mode 100644 index 0000000000..d65d03c8f2 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/email/email.helper.ts @@ -0,0 +1,44 @@ +import { logger } from '../../../../../../logger/logger'; +import { EmailPreferencesPage } from './email.po'; +import { SettingsPageConstants } from '../../settings.constants'; + +export class EmailPreferencesPageHelper { + /** + * sets the Community page object + */ + public static setEmailPreferencesPage(emailPreferencesPage) { + this.emailPreferencesPageObject = emailPreferencesPage; + } + + /** + * Opens the community page in the browser + */ + public static async open() { + this.emailPreferencesPageObject = new EmailPreferencesPage(); + await this.emailPreferencesPageObject.open(); + } + + /** + * Updates the preferences if enabled from config + * @param pref + */ + public static async verifyUpdatePreferences(prefInputs) { + const prefs = SettingsPageConstants.getEmailPreferences(); + for (let i = 0; i < prefs.length; i++) { + const prefInput = prefInputs[i]; + let isPrefEnabled = await this.emailPreferencesPageObject.isPrefEnabled( + prefs[i] + ); + if ((prefInput && !isPrefEnabled) || (!prefInput && isPrefEnabled)) { + await this.emailPreferencesPageObject.updatePref(prefs[i]); + } + isPrefEnabled = await this.emailPreferencesPageObject.isPrefEnabled( + prefs[i] + ); + expect(isPrefEnabled).toBe(prefInput); + logger.info(prefs[i] + ' is ' + isPrefEnabled); + } + } + + private static emailPreferencesPageObject: EmailPreferencesPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/email/email.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/email/email.po.ts new file mode 100644 index 0000000000..bbecca5465 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/email/email.po.ts @@ -0,0 +1,76 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { SettingsPageConstants } from '../../settings.constants'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class EmailPreferencesPage extends SettingsPage { + /** + * Gets the Community page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getPreferencesUrl()); + await this.switchTab('e-mail'); + logger.info('User navigated to Preferences Page'); + } + + /** + * Gets the prefernce label + * @param pref + */ + private getPrefLabel(pref: String) { + return ElementHelper.getElementByXPath( + `//label[@for='pre-onoffswitch-${pref}']` + ); + } + + /** + * Gets the preference switch used for toggling + */ + private async getPrefSwitch(pref) { + const el = await ElementHelper.getElementByXPath( + `//label[@for='pre-onoffswitch-${pref}']//child::span[@class='onoffswitch-switch']` + ); + return el; + } + + /** + * Returns whether a given pref is enabled or not + * @param pref + */ + public async isPrefEnabled(pref): Promise { + const prefLabel = this.getPrefLabel(pref); + const bgColor = await prefLabel.getCssValue('background-color'); + return bgColor === SettingsPageConstants.Colors.GreyColor ? false : true; + } + + /** + * Updates a pref if enabled from config + * @param pref + */ + public async updatePref(pref: string) { + const prefSwitch = await this.getPrefSwitch(pref); + await prefSwitch.click(); + await CommonHelper.waitUntilVisibilityOf( + () => this.successMsg, + 'Wait for success message', + false + ); + + await CommonHelper.waitUntilInVisibilityOf( + () => this.successMsg, + 'wait for success message', + false + ); + } + /** + * Gets the pref success message + */ + public get successMsg() { + return CommonHelper.findElementByText( + 'div', + SettingsPageConstants.Messages.EmailPrefSuccessMessage + ); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/forum/forum.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/forum/forum.helper.ts new file mode 100644 index 0000000000..5fd51e18b4 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/forum/forum.helper.ts @@ -0,0 +1,31 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../../../logger/logger'; +import { ForumPage } from './forum.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; + +export class ForumPageHelper { + /** + * sets the Forum page object + */ + public static setForumPage(forumPage) { + this.forumPageObject = forumPage; + } + + /** + * Opens the forum page in the browser + */ + public static async open() { + this.forumPageObject = new ForumPage(); + await this.forumPageObject.open(); + } + + /** + * Verify forum setting page + */ + public static async verifyForumSetting() { + await BrowserHelper.waitUntilUrlIs(ConfigHelper.getForumSettingUrl()); + logger.info('redirected to forum settings page'); + } + + private static forumPageObject: ForumPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/forum/forum.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/forum/forum.po.ts new file mode 100644 index 0000000000..bb8e15cbfa --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/forum/forum.po.ts @@ -0,0 +1,15 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; + +export class ForumPage extends SettingsPage { + /** + * Gets the Forum page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getPreferencesUrl()); + await this.switchTab('forum'); + logger.info('User navigated to Forum Page'); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/payment/payment.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/payment/payment.helper.ts new file mode 100644 index 0000000000..7e91ff5d61 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/payment/payment.helper.ts @@ -0,0 +1,32 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../../../logger/logger'; +import { PaymentPage } from './payment.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; + +export class PaymentPageHelper { + /** + * sets the Payment page object + */ + public static setPaymentPage(paymentPage) { + this.paymentPageObject = paymentPage; + } + + /** + * Opens the payment page in the browser + */ + public static async open() { + this.paymentPageObject = new PaymentPage(); + await this.paymentPageObject.open(); + } + + /** + * Verifies the payment setting page + */ + public static async verifyPaymentSetting() { + await BrowserHelper.sleep(5000); + await BrowserHelper.waitUntilUrlIs(ConfigHelper.getPaymentSettingUrl()); + logger.info('redirected to payment settings page'); + } + + private static paymentPageObject: PaymentPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/payment/payment.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/payment/payment.po.ts new file mode 100644 index 0000000000..f14a4bb18d --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/preferences/payment/payment.po.ts @@ -0,0 +1,15 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; + +export class PaymentPage extends SettingsPage { + /** + * Gets the Payment page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getPreferencesUrl()); + await this.switchTab('payment'); + logger.info('User navigated to Payment Page'); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/basic-info/basic-info.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/basic-info/basic-info.helper.ts new file mode 100644 index 0000000000..95cd4894fc --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/basic-info/basic-info.helper.ts @@ -0,0 +1,143 @@ +import { logger } from '../../../../../../logger/logger'; +import { BasicInfoPage } from './basic-info.po'; + +export class BasicInfoPageHelper { + /** + * gets the Basic Info page object + */ + public static setBasicInfoPage(basicInfoPage) { + this.basicInfoPageObject = basicInfoPage; + } + + /** + * Opens the my account page in the browser + */ + public static async open() { + this.basicInfoPageObject = new BasicInfoPage(); + await this.basicInfoPageObject.open(); + } + + /** + * Verify basic Info Update + * @param basicInfo - object representation of Basic Information + */ + public static async verifyBasicInfoUpdate(basicInfo) { + await this.basicInfoPageObject.fillPersonalDetails( + basicInfo.personalDetails + ); + logger.info('Filled Personal Details section'); + await this.basicInfoPageObject.fillAboutYou(basicInfo.aboutYou); + logger.info('Filled about you section'); + await this.basicInfoPageObject.fillTrackDetails(basicInfo.tracks); + logger.info('Filled Track Details section'); + await this.basicInfoPageObject.saveChanges(); + await this.open(); + await this.verifyPersonalDetails(basicInfo.personalDetails); + await this.verifyAboutYou(basicInfo.aboutYou); + await this.verifyTrackDetails(basicInfo.tracks); + } + + /** + * Verify personal details section details + * @param personalDetails - object representation of personal details + */ + public static async verifyPersonalDetails(personalDetails) { + await this.basicInfoPageObject.fillPersonalDetails(personalDetails); + + const firstName = await this.basicInfoPageObject.firstName.element.getAttribute( + 'value' + ); + expect(firstName).toEqual(personalDetails.firstName); + + const lastName = await this.basicInfoPageObject.lastName.element.getAttribute( + 'value' + ); + expect(lastName).toEqual(personalDetails.lastName); + + const dob = await this.basicInfoPageObject.dob.element.getAttribute( + 'value' + ); + expect(dob).toEqual(BasicInfoPage.selectedDate); + + const address1 = await this.basicInfoPageObject.address1.element.getAttribute( + 'value' + ); + expect(address1).toEqual(personalDetails.address1); + + const address2 = await this.basicInfoPageObject.address2.element.getAttribute( + 'value' + ); + expect(address2).toEqual(personalDetails.address2); + + const city = await this.basicInfoPageObject.city.element.getAttribute( + 'value' + ); + expect(city).toEqual(personalDetails.city); + + const state = await this.basicInfoPageObject.state.element.getAttribute( + 'value' + ); + expect(state).toEqual(personalDetails.state); + + const zip = await this.basicInfoPageObject.zip.element.getAttribute( + 'value' + ); + expect(zip).toEqual(personalDetails.zip); + } + + /** + * Verify about you section details + * @param aboutYou - object representation of aboutYou + */ + public static async verifyAboutYou(aboutYou) { + const gender = await this.basicInfoPageObject.genderHidden.element.getAttribute( + 'value' + ); + expect(gender).toEqual(aboutYou.gender); + + const tshirtSize = await this.basicInfoPageObject.tshirtSizeHidden.element.getAttribute( + 'value' + ); + expect(tshirtSize).toEqual(aboutYou.tshirtSize); + + const currentLocation = await this.basicInfoPageObject.currentLocation.element.getAttribute( + 'value' + ); + expect(currentLocation).toEqual(aboutYou.currentLocation); + + const primaryInterestInTopcoder = await this.basicInfoPageObject.primaryInterestInTopcoder.element.getAttribute( + 'value' + ); + expect(primaryInterestInTopcoder).toEqual(aboutYou.primaryInterest); + + const description = await this.basicInfoPageObject.description.element.getAttribute( + 'value' + ); + expect(description).toEqual(aboutYou.description); + } + + /** + * Verify track details + * @param tracks - object representation of tracks + */ + public static async verifyTrackDetails(tracks) { + const disabledTracks = await this.basicInfoPageObject.getTrackSwitchesDisabled(); + if (!tracks.design) { + expect(disabledTracks.includes('design')).toBe(true); + } else { + expect(disabledTracks.includes('design')).toBe(false); + } + if (!tracks.develop) { + expect(disabledTracks.includes('develop')).toBe(true); + } else { + expect(disabledTracks.includes('develop')).toBe(false); + } + if (!tracks.dataScience) { + expect(disabledTracks.includes('data_science')).toBe(true); + } else { + expect(disabledTracks.includes('data_science')).toBe(false); + } + } + + private static basicInfoPageObject: BasicInfoPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/basic-info/basic-info.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/basic-info/basic-info.po.ts new file mode 100644 index 0000000000..29dedbf925 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/basic-info/basic-info.po.ts @@ -0,0 +1,326 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { TcElementImpl } from 'topcoder-testing-lib/dist/src/tc-element-impl'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class BasicInfoPage extends SettingsPage { + public static selectedDate; + + /** + * Gets the BasicInfo page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getProfileUrl()); + await this.switchTab('basic info'); + logger.info('User navigated to BasicInfo Page'); + } + + /** + * Gets the first name field + */ + public get firstName() { + return ElementHelper.getElementById('firstName'); + } + + /** + * Gets the last name field + */ + public get lastName() { + return ElementHelper.getElementById('lastName'); + } + + /** + * Gets the dob field + */ + public get dob() { + return ElementHelper.getElementById('date-range-picker1'); + } + + /** + * Gets the current date from datepicker + */ + public get currentDate() { + return ElementHelper.getElementByClassName('CalendarDay__selected'); + } + + /** + * Gets the address1 field + */ + public get address1() { + return ElementHelper.getElementByName('streetAddr1'); + } + + /** + * Gets the address2 field + */ + public get address2() { + return ElementHelper.getElementByName('streetAddr2'); + } + + /** + * Gets the city field + */ + public get city() { + return ElementHelper.getElementById('city'); + } + + /** + * Gets the state field + */ + public get state() { + return ElementHelper.getElementById('state'); + } + + /** + * Gets the zip field + */ + public get zip() { + return ElementHelper.getElementById('zipCode'); + } + + private get leftDatePickNavButton() { + return ElementHelper.getElementByClassName( + 'DayPickerNavigation_button__horizontal' + ); + } + + /** + * Get link basis aria label + * @param label + */ + public getLinkByAriaLabel(label: string) { + return ElementHelper.getElementByCss('[aria-label="' + label + '"]'); + } + + /** + * Get country input field + */ + public get countryInput() { + return ElementHelper.getElementByCss( + '[aria-activedescendant="react-select-2--value"]' + ); + } + + /** + * Gets gender input field + */ + public get genderInput() { + return ElementHelper.getElementByCss( + '[aria-activedescendant="react-select-3--value"]' + ); + } + + /** + * Gets the tshirt size input field + */ + public get sizeInput() { + return ElementHelper.getElementByCss( + '[aria-activedescendant="react-select-4--value"]' + ); + } + + /** + * Gets the gender hidden field + */ + public get genderHidden() { + return ElementHelper.getElementByName('gender'); + } + + /** + * Gets the tshirt size hidden field + */ + public get tshirtSizeHidden() { + return ElementHelper.getElementByName('tshirtSize'); + } + + /** + * Gets the current location field + */ + public get currentLocation() { + return ElementHelper.getElementById('currentLocation'); + } + + /** + * Gets the primary interest field + */ + public get primaryInterestInTopcoder() { + return ElementHelper.getElementById('primaryInterestInTopcoder'); + } + + /** + * Gets the description field + */ + public get description() { + return ElementHelper.getElementById('description'); + } + + private get saveButton() { + return ElementHelper.getTagElementMatchingText('button', 'Save Changes'); + } + + /** + * Gets the tracks which are disabled + */ + public async getTrackSwitchesDisabled() { + const elements = await ElementHelper.getAllElementsByClassName('BZhTou'); + const values = []; + for (let i = 0; i < elements.length; i++) { + const el = elements[i]; + const val = await ElementHelper.getElementByClassName( + 'onoffswitch-checkbox', + el + ).element.getAttribute('value'); + values.push(val); + } + return values; + } + + /** + * Gets all the track switches + */ + private async getTrackSwitches() { + return ElementHelper.getAllElementsByClassName('onoffswitch-switch'); + } + + /** + * Gets the first date which can be selected and is enabled + */ + private async getFirstSelectableDate() { + const els: TcElementImpl[] = await ElementHelper.getAllElementsByClassName( + 'CalendarDay__default' + ); + let label = ''; + for (let i = 0; i < els.length; i++) { + const isDisplayed = await CommonHelper.isDisplayed(els[i]); + if (isDisplayed) { + label = await els[i].element.getAttribute('aria-label'); + return label; + } + } + } + + /** + * Fills the personal details + */ + public async fillPersonalDetails(personalDetails) { + // wait for showing first name + await CommonHelper.waitUntilVisibilityOf( + () => this.firstName, + 'Wait for first name', + false + ); + BrowserHelper.sleep(1000); + await this.firstName.clear(); + await this.firstName.sendKeys(personalDetails.firstName); + + await this.lastName.clear(); + await this.lastName.sendKeys(personalDetails.lastName); + + await this.dob.click(); + + let firstSelectableLabel = await this.getFirstSelectableDate(); + const today = new Date(); + const formatted = this.getDate(today); + + // today's date is the first selectable date, so move back + if (formatted === firstSelectableLabel) { + await this.leftDatePickNavButton.click(); + await BrowserHelper.sleep(1000); + firstSelectableLabel = await this.getFirstSelectableDate(); + await this.getLinkByAriaLabel(firstSelectableLabel).click(); + } else { + await this.getLinkByAriaLabel(firstSelectableLabel).click(); + } + + BasicInfoPage.selectedDate = await this.dob.getAttribute('value'); + + await this.address1.clear(); + await this.address1.sendKeys(personalDetails.address1); + + await this.address2.clear(); + await this.address2.sendKeys(personalDetails.address2); + + await this.city.clear(); + await this.city.sendKeys(personalDetails.city); + + await this.state.clear(); + await this.state.sendKeys(personalDetails.state); + + await this.zip.clear(); + await this.zip.sendKeys(personalDetails.zip); + + await this.performSelection( + this.countryInput, + null, + personalDetails.country + ); + } + + /** + * Fills about-you section + */ + public async fillAboutYou(aboutYou) { + await this.performSelection(this.genderInput, null, aboutYou.gender); + await this.performSelection(this.sizeInput, null, aboutYou.tshirtSize); + + await this.currentLocation.clear(); + await this.currentLocation.sendKeys(aboutYou.currentLocation); + + await this.primaryInterestInTopcoder.clear(); + await this.primaryInterestInTopcoder.sendKeys(aboutYou.primaryInterest); + + await this.description.clear(); + await this.description.sendKeys(aboutYou.description); + } + + /** + * Fills the track details section + */ + public async fillTrackDetails(tracks) { + const disabledTracks = await this.getTrackSwitchesDisabled(); + const switches = await this.getTrackSwitches(); + + if ( + (disabledTracks.includes('design') && tracks.design) || + (!disabledTracks.includes('design') && !tracks.design) + ) { + await switches[0].click(); + } + if ( + (disabledTracks.includes('develop') && tracks.develop) || + (!disabledTracks.includes('develop') && !tracks.develop) + ) { + await switches[1].click(); + } + if ( + (disabledTracks.includes('data_science') && tracks.dataScience) || + (!disabledTracks.includes('data_science') && !tracks.dataScience) + ) { + await switches[2].click(); + } + } + + /** + * Saves the changes filled in + */ + public async saveChanges() { + await this.saveButton.click(); + await this.waitForDefaultSuccessMessage(); + } + + /** + * Get date string + * @param date date object + */ + private getDate(date: Date) { + const options = { + weekday: 'long', + year: 'numeric', + month: 'long', + day: 'numeric', + }; + return date.toLocaleDateString('en-US', options); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/communities/community.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/communities/community.helper.ts new file mode 100644 index 0000000000..9610033824 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/communities/community.helper.ts @@ -0,0 +1,69 @@ +import { CommunityPage } from './community.po'; +import { SettingsPageConstants } from '../../settings.constants'; + +export class CommunityPageHelper { + /** + * sets the Community page object + */ + public static setCommunityPage(communityPage) { + this.communityPageObject = communityPage; + } + + /** + * Opens the community page in the browser + */ + public static async open() { + this.communityPageObject = new CommunityPage(); + await this.communityPageObject.open(); + } + + /** + * Disables all the communities + */ + public static async disableAll() { + await this.communityPageObject.disableAll(); + } + + /** + * Updates the community if enabled from config + * @param community + */ + public static async verifyUpdateCommunity(community) { + const isBlockchainEnabled = await this.communityPageObject.isCommunityEnabled( + SettingsPageConstants.Communities.Blockchain + ); + if ( + (community.blockchain && !isBlockchainEnabled) || + (!community.blockchain && isBlockchainEnabled) + ) { + await this.communityPageObject.updateCommunity( + SettingsPageConstants.Communities.Blockchain + ); + await this.communityPageObject.waitForDefaultSuccessMessage(); + } + const isCognitiveEnabled = await this.communityPageObject.isCommunityEnabled( + SettingsPageConstants.Communities.Cognitive + ); + if ( + (community.cognitive && !isCognitiveEnabled) || + (!community.cognitive && isCognitiveEnabled) + ) { + await this.communityPageObject.updateCommunity( + SettingsPageConstants.Communities.Cognitive + ); + await this.communityPageObject.waitForDefaultSuccessMessage(); + } + + let isEnabled = await this.communityPageObject.isCommunityEnabled( + SettingsPageConstants.Communities.Blockchain + ); + expect(isEnabled).toBe(community.blockchain); + + isEnabled = await this.communityPageObject.isCommunityEnabled( + SettingsPageConstants.Communities.Cognitive + ); + expect(isEnabled).toBe(community.cognitive); + } + + private static communityPageObject: CommunityPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/communities/community.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/communities/community.po.ts new file mode 100644 index 0000000000..22807bbbe7 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/communities/community.po.ts @@ -0,0 +1,117 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { SettingsPageConstants } from '../../settings.constants'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class CommunityPage extends SettingsPage { + /** + * Gets the Community page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getProfileUrl()); + await this.switchTab('communities'); + logger.info('User navigated to Communities Page'); + } + + /** + * Gets the blockchain community label + */ + private async getBlockChainLabel() { + const els = await ElementHelper.getAllElementsByClassName( + 'onoffswitch-label' + ); + return els[1]; + } + + /** + * Gets the blockchain community switch used for toggling + */ + private async getBlockChainSwitch() { + const els = await ElementHelper.getAllElementsByClassName( + 'onoffswitch-switch' + ); + return els[1]; + } + + /** + * Gets the cognitive community label + */ + private async getCognitiveLabel() { + const els = await ElementHelper.getAllElementsByClassName( + 'onoffswitch-label' + ); + return els[3]; + } + + /** + * Gets the cognitive community switch used for toggling + */ + private async getCognitiveSwitch() { + const els = await ElementHelper.getAllElementsByClassName( + 'onoffswitch-switch' + ); + return els[3]; + } + + /** + * Returns whether a given community is enabled or not + * @param community + */ + public async isCommunityEnabled(community): Promise { + if (community === SettingsPageConstants.Communities.Blockchain) { + const blockChainLabel = await this.getBlockChainLabel(); + const bgColor = await blockChainLabel.getCssValue('background-color'); + return bgColor === SettingsPageConstants.Colors.GreyColor ? false : true; + } else if (community === SettingsPageConstants.Communities.Cognitive) { + const cognitiveLabel = await this.getCognitiveLabel(); + const bgColor = await cognitiveLabel.getCssValue('background-color'); + return bgColor === SettingsPageConstants.Colors.GreyColor ? false : true; + } + return false; + } + + /** + * Disables all communities + */ + public async disableAll() { + await CommonHelper.waitUntilVisibilityOf( + () => this.heading, + 'Wait for community heading', + false + ); + + const isBlockchainEnabled = await this.isCommunityEnabled( + SettingsPageConstants.Communities.Blockchain + ); + if (isBlockchainEnabled) { + const blockSwitch = await this.getBlockChainSwitch(); + await blockSwitch.click(); + await this.waitForDefaultSuccessMessage(); + } + + const isCognitiveEnabled = await this.isCommunityEnabled( + SettingsPageConstants.Communities.Cognitive + ); + if (isCognitiveEnabled) { + const cognitiveSwitch = await this.getCognitiveSwitch(); + await cognitiveSwitch.click(); + await this.waitForDefaultSuccessMessage(); + } + } + + /** + * Updates a community if enabled from config + * @param community + */ + public async updateCommunity(community: string) { + if (community === SettingsPageConstants.Communities.Blockchain) { + const blockChainSwitch = await this.getBlockChainSwitch(); + await blockChainSwitch.click(); + } else if (community === SettingsPageConstants.Communities.Cognitive) { + const cognitiveSwitch = await this.getCognitiveSwitch(); + await cognitiveSwitch.click(); + } + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/education/education.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/education/education.helper.ts new file mode 100644 index 0000000000..adf2c48c6e --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/education/education.helper.ts @@ -0,0 +1,84 @@ +import { logger } from '../../../../../../logger/logger'; +import { EducationPage } from './education.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class EducationPageHelper { + /** + * sets the Education page object + */ + public static setEducationPage(educationPage) { + this.educationPageObject = educationPage; + } + + /** + * Opens the education page in the browser + */ + public static async open() { + this.educationPageObject = new EducationPage(); + await this.educationPageObject.open(); + } + + /** + * Deletes all the educations already added till now + */ + public static async deleteAll() { + await this.educationPageObject.deleteAllEducation(); + } + + /** + * Verifies that user can add education + * @param education - education object to be used to fill data + */ + public static async verifyAddEducation(education) { + const name = this.getName(education); + await this.educationPageObject.addEducation(education); + await this.educationPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(true); + logger.info('education added: ' + name); + } + + /** + * Verifies that user can update the education + * @param education - education object holding old values + * @param newEducation - education object holding the new values + */ + public static async verifyEditEducation(education, newEducation) { + const name = this.getName(education); + const newName = this.getName(newEducation); + + await this.educationPageObject.editEducation(education, newEducation); + await this.educationPageObject.waitForDefaultSuccessMessage(); + + const el = CommonHelper.findElementByText('div', newName); + const isDisplayed = await CommonHelper.isPresent(el); + expect(isDisplayed).toBe(true); + logger.info('education edited from: ' + name + ' to ' + newName); + } + + /** + * Verifies user can delete education + * @param education - education object + */ + public static async verifyDeleteEducation(education) { + const name = this.getName(education); + await this.educationPageObject.deleteEducation(education); + await this.educationPageObject.waitForDefaultSuccessMessage(); + const el = CommonHelper.findElementByText('div', name); + const isDisplayed = await CommonHelper.isPresent(el); + expect(isDisplayed).toBe(false); + logger.info('deleted education: ' + name); + } + + /** + * gets the name from the education object + * @param education - object representing education + */ + private static getName(education) { + return education.collegeName; + } + + private static educationPageObject: EducationPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/education/education.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/education/education.po.ts new file mode 100644 index 0000000000..9ec9935d43 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/education/education.po.ts @@ -0,0 +1,135 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { TcElementImpl } from 'topcoder-testing-lib/dist/src/tc-element-impl'; + +export class EducationPage extends SettingsPage { + /** + * Gets the Education page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getProfileUrl()); + await this.switchTab('education'); + logger.info('User navigated to Education Page'); + } + + /** + * Delete all education + */ + public async deleteAllEducation() { + await this.deleteAll('Your education'); + } + + /** + * Gets the school/college input field + */ + private get schoolCollegeName() { + return ElementHelper.getElementById('schoolCollegeName'); + } + + /** + * Gets the major input field + */ + private get major() { + return ElementHelper.getElementById('major'); + } + + /** + * Gets the education start date input field + */ + private get startDate() { + return ElementHelper.getElementById('date-from1'); + } + + /** + * Gets the education end date field + */ + private get endDate() { + return ElementHelper.getElementById('date-to1'); + } + + /** + * Gets the education gruadated field + */ + private get graduatedLabel() { + return ElementHelper.getElementByCss('[for="graduated"]'); + } + + /** + * Adds the given education by setting the required fields + * @param education - object representation of education + */ + public async addEducation(education) { + BrowserHelper.sleep(1000); + await this.setCollegeName(education.collegeName); + await this.setMajor(education.major); + await this.setCollegeDate(this.startDate, education.fromDate); + await this.setCollegeDate(this.endDate, education.toDate); + if (education.graduated) { + await this.setGraduated(); + } + await this.getAddButton('education').click(); + } + + /** + * Updates the added education by editing some fields + * @param education - old education object + * @param newEducation - new education object + */ + public async editEducation(education, newEducation) { + await this.getEditIconbyName(education.collegeName).click(); + await this.setCollegeName(newEducation.collegeName); + await this.getEditButton('education').click(); + } + + /** + * Deletes educaction + * @param education + */ + public async deleteEducation(education) { + await this.getDeleteIconbyName(education.collegeName).click(); + await this.deleteConfirmation.click(); + } + + /** + * Sets the college field + * @param collegeName + */ + private async setCollegeName(collegeName) { + await BrowserHelper.waitUntilClickableOf(this.schoolCollegeName); + await this.schoolCollegeName.clear(); + await this.schoolCollegeName.sendKeys(collegeName); + } + + /** + * Sets the major field + * @param major + */ + private async setMajor(major) { + await this.major.clear(); + await this.major.sendKeys(major); + } + + /** + * Generic method to set the college date (startDate or endDate) + * @param el - tcElement representing the field + * @param value - value of the startDate or endDate + */ + private async setCollegeDate(el: TcElementImpl, value: string) { + await BrowserHelper.executeScript( + 'arguments[0].removeAttribute("readonly");', + el + ); + await BrowserHelper.sleep(1000); + await this.startDate.sendKeys(value); + await BrowserHelper.sleep(1000); + } + + /** + * Sets the graduated field by clicking the checkbox + */ + private async setGraduated() { + await this.graduatedLabel.click(); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/hobbies/hobby.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/hobbies/hobby.helper.ts new file mode 100644 index 0000000000..7ccea28a5f --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/hobbies/hobby.helper.ts @@ -0,0 +1,85 @@ +import { logger } from '../../../../../../logger/logger'; +import { HobbyPage } from './hobby.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class HobbyPageHelper { + /** + * sets the Hobby page object + */ + public static setHobbyPage(hobbyPage) { + this.hobbyPageObject = hobbyPage; + } + + /** + * Opens the hobby page in the browser + */ + public static async open() { + this.hobbyPageObject = new HobbyPage(); + await this.hobbyPageObject.open(); + } + + /** + * Deletes all the hobbies + */ + public static async deleteAll() { + await this.hobbyPageObject.deleteAllHobbies(); + } + + /** + * Adds the hobby and verifies it + * @param hobby - object representation of hobby to be added + */ + public static async verifyAddHobby(hobby) { + const name = this.getName(hobby); + await this.hobbyPageObject.addHobby(hobby); + await this.hobbyPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(true); + logger.info('hobby added: ' + name); + } + + /** + * Edits the hobby and updates by using the new representation of hobby + * @param hobby - object representation of old hobby + * @param newHobby - object representation of new hobby + */ + public static async verifyEditHobby(hobby, newHobby) { + const name = this.getName(hobby); + const newName = this.getName(newHobby); + + await this.hobbyPageObject.editHobby(hobby, newHobby); + await this.hobbyPageObject.waitForDefaultSuccessMessage(); + + const el = CommonHelper.findElementByText('div', newName); + const isDisplayed = await CommonHelper.isPresent(el); + expect(isDisplayed).toBe(true); + logger.info('hobby edited from: ' + name + ' to ' + newName); + } + + /** + * Deletes the hobby + * @param hobby + */ + public static async verifyDeleteHobby(hobby) { + const name = this.getName(hobby); + await this.hobbyPageObject.deleteHobby(hobby); + await this.hobbyPageObject.waitForDefaultSuccessMessage(); + const el = CommonHelper.findElementByText('div', name); + const isDisplayed = await CommonHelper.isPresent(el); + expect(isDisplayed).toBe(false); + logger.info('deleted hobby: ' + name); + } + + /** + * gets the name of the hobby + * using which UI can be searched + * @param hobby - object representation of hobby + */ + private static getName(hobby) { + return hobby.name; + } + + private static hobbyPageObject: HobbyPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/hobbies/hobby.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/hobbies/hobby.po.ts new file mode 100644 index 0000000000..8332296362 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/hobbies/hobby.po.ts @@ -0,0 +1,86 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; + +export class HobbyPage extends SettingsPage { + /** + * Gets the Hobby page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getProfileUrl()); + await this.switchTab('hobbies'); + logger.info('User navigated to Hobbies Page'); + } + + /** + * Delete all hobbies + */ + public async deleteAllHobbies() { + await this.deleteAll('Your hobbies'); + } + + /** + * Gets the hobby name field + */ + private get name() { + return ElementHelper.getElementById('hobby'); + } + + /** + * Gets the hobby description field + */ + private get description() { + return ElementHelper.getElementById('description'); + } + + /** + * Adds the hobby + * @param hobby - object representation of hobby + */ + public async addHobby(hobby) { + BrowserHelper.sleep(1000); + await this.setName(hobby.name); + await this.setDescription(hobby.description); + await this.getAddButton('hobby').click(); + } + + /** + * Edits the hobby + * @param hobby - object representation of existing hobby + * @param newHobby - object representation of new hobby + */ + public async editHobby(hobby, newHobby) { + await this.getEditIconbyName(hobby.name).click(); + await this.setName(newHobby.name); + await this.getEditButton('hobby').click(); + } + + /** + * Deletes the hobby + * @param hobby + */ + public async deleteHobby(hobby) { + await this.getDeleteIconbyName(hobby.name).click(); + await this.deleteConfirmation.click(); + } + + /** + * Sets the name field + * @param name - name of the hobby to input + */ + private async setName(name) { + await BrowserHelper.waitUntilClickableOf(this.name); + await this.name.clear(); + await this.name.sendKeys(name); + } + + /** + * Sets the description field + * @param description - description of the hobby to input + */ + private async setDescription(description) { + await this.description.clear(); + await this.description.sendKeys(description); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/language/language.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/language/language.helper.ts new file mode 100644 index 0000000000..11c841280b --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/language/language.helper.ts @@ -0,0 +1,82 @@ +import { ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../../../logger/logger'; +import { LanguagePage } from './language.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class LanguagePageHelper { + /** + * sets the Language page object + */ + public static setLanguagePage(languagePage) { + this.languagePageObject = languagePage; + } + + /** + * Opens the my language page in the browser + */ + public static async open() { + this.languagePageObject = new LanguagePage(); + await this.languagePageObject.open(); + } + + /** + * deletes all entries in the current tab + */ + public static async deleteAll() { + await this.languagePageObject.deleteAllLanguage(); + } + + public static async verifyAddLanguage(language) { + const name = this.getName(language); + await this.languagePageObject.addLanguage(language); + await this.languagePageObject.waitForDefaultSuccessMessage(); + const el = CommonHelper.findElementByText('div', name); + const isDisplayed = await CommonHelper.isPresent(el); + expect(isDisplayed).toBe(true); + logger.info('language added: ' + name); + } + + public static async verifyEditLanguage(oldLanguage, newLanguage) { + const name = this.getName(oldLanguage); + const newName = this.getName(newLanguage); + + await this.languagePageObject.editLanguage(oldLanguage, newLanguage); + await this.languagePageObject.waitForDefaultSuccessMessage(); + + let el = CommonHelper.findElementByText('div', newName); + let isDisplayed = await CommonHelper.isPresent(el); + expect(isDisplayed).toBe(true); + + el = ElementHelper.getTagElementMatchingText( + 'div', + `Spoken: ${newLanguage.spokenLevel.toUpperCase()} | Written: ${newLanguage.writtenLevel.toUpperCase()}` + ); + isDisplayed = await CommonHelper.isPresent(el); + expect(isDisplayed).toBe(true); + + const text = await ElementHelper.getElementByXPath('..', el).getText(); + expect(text.includes(newLanguage.name)).toBe(true); + + logger.info('language edited from: ' + name + ' to ' + newName); + } + + public static async verifyDeleteLanguage(language) { + await this.languagePageObject.deleteLanguage(language); + await this.languagePageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', language.name) + ); + expect(isDisplayed).toBe(false); + logger.info('deleted language: ' + language.name); + } + + /** + * gets the name from the language object + * @param language - object representing language + */ + private static getName(language) { + return language.name; + } + + private static languagePageObject: LanguagePage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/language/language.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/language/language.po.ts new file mode 100644 index 0000000000..500ecf0862 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/language/language.po.ts @@ -0,0 +1,123 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class LanguagePage extends SettingsPage { + /** + * Gets the Language page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getProfileUrl()); + await this.switchTab('language'); + logger.info('User navigated to Language Page'); + } + + /** + * Delete all language + */ + public async deleteAllLanguage() { + await this.deleteAll('Your language'); + } + + /** + * Gets the language name input field + */ + private async getLanguageInput() { + // wait to show first input element + await CommonHelper.waitUntilPresenceOf( + () => ElementHelper.getElementByXPath('//*[@aria-activedescendant]'), + 'wait for language input', + false + ); + const elements = await ElementHelper.getAllElementsByXPath( + '//*[@aria-activedescendant]' + ); + return elements[0]; + } + + /** + * Gets the spoken level input field + */ + private async getSpokenLevelInput() { + // wait to show first input element + await CommonHelper.waitUntilPresenceOf( + () => ElementHelper.getElementByXPath('//*[@aria-activedescendant]'), + 'wait for spoken level input', + false + ); + const elements = await ElementHelper.getAllElementsByXPath( + '//*[@aria-activedescendant]' + ); + return elements[1]; + } + + /** + * Gets the written level input field + */ + private async getWrittenLevelInput() { + // wait to show first input element + await CommonHelper.waitUntilPresenceOf( + () => ElementHelper.getElementByXPath('//*[@aria-activedescendant]'), + 'wait for written level input', + false + ); + const elements = await ElementHelper.getAllElementsByXPath( + '//*[@aria-activedescendant]' + ); + return elements[2]; + } + + /** + * Adds the language + * @param language - object representation of language + */ + public async addLanguage(language) { + await this.performSelection( + null, + this.getLanguageInput.bind(this), + language.name + ); + await this.performSelection( + null, + this.getSpokenLevelInput.bind(this), + language.spokenLevel + ); + await this.performSelection( + null, + this.getWrittenLevelInput.bind(this), + language.writtenLevel + ); + await this.getAddButton('language').click(); + } + + /** + * Updates the language + * @param oldLanguage - object representation of added language + * @param newLanguage - object representation of new language + */ + public async editLanguage(oldLanguage, newLanguage) { + await this.getEditIconbyName(oldLanguage.name).click(); + await this.performSelection( + null, + this.getSpokenLevelInput.bind(this), + newLanguage.spokenLevel + ); + await this.performSelection( + null, + this.getWrittenLevelInput.bind(this), + newLanguage.writtenLevel + ); + await this.getEditButton('language').click(); + } + + /** + * Deletes the language + * @param language + */ + public async deleteLanguage(language) { + await this.getDeleteIconbyName(language.name).click(); + await this.deleteConfirmation.click(); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/skills/skill.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/skills/skill.helper.ts new file mode 100644 index 0000000000..0dbc49fdf7 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/skills/skill.helper.ts @@ -0,0 +1,67 @@ +import { logger } from '../../../../../../logger/logger'; +import { SkillPage } from './skill.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class SkillPageHelper { + /** + * sets the Skill page object + */ + public static setSkillPage(skillPage) { + this.skillPageObject = skillPage; + } + + /** + * Opens the skill page in the browser + */ + public static async open() { + this.skillPageObject = new SkillPage(); + await this.skillPageObject.open(); + } + + /** + * Deletes all skills + */ + public static async deleteAll() { + await this.skillPageObject.deleteAll(); + } + + /** + * Verifies addition of skill + * @param skill + */ + public static async verifyAddSkill(skill) { + const name = this.getName(skill); + await this.skillPageObject.addSkill(skill); + await this.skillPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(true); + logger.info('skill added: ' + name); + } + + /** + * Verifies deletion of skill + * @param skill + */ + public static async verifyDeleteSkill(skill) { + const name = this.getName(skill); + await this.skillPageObject.deleteSkill(skill); + await this.skillPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(false); + logger.info('deleted skill: ' + name); + } + + /** + * gets name of skill which is used to query UI + * @param skill + */ + private static getName(skill) { + return skill.name; + } + + private static skillPageObject: SkillPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/skills/skill.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/skills/skill.po.ts new file mode 100644 index 0000000000..5434a70448 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/skills/skill.po.ts @@ -0,0 +1,96 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { SettingsPageConstants } from '../../settings.constants'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class SkillPage extends SettingsPage { + /** + * Gets the Skill page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getProfileUrl()); + await this.switchTab('skills'); + logger.info('User navigated to Skills Page'); + } + + /** + * Gets the skill input field + */ + private get skillInput() { + return ElementHelper.getElementByCss( + '[aria-activedescendant="react-select-10--value"]' + ); + } + + /** + * Gets the delete icon + */ + public get deleteIcon() { + return ElementHelper.getElementByXPath('//a[contains(@id,"skill-a-")]'); + } + + /** + * Gets the delete success message + */ + public get successMsg() { + return CommonHelper.findElementByText( + 'div', + SettingsPageConstants.Messages.SkillSuccessMessage + ); + } + + /** + * Deletes all skills + */ + public async deleteAll() { + await CommonHelper.waitUntilVisibilityOf( + () => this.heading, + 'Wait for skill heading', + false + ); + const delIcons = await ElementHelper.getAllElementsByXPath( + '//a[contains(@id,"skill-a-")]' + ); + for (let icon of delIcons) { + await icon.click(); + await this.deleteConfirmation.click(); + await this.waitForDefaultSuccessMessage(); + } + } + + /** + * Waits for visibility and invisibility of success message + */ + public async waitForDefaultSuccessMessage() { + await CommonHelper.waitUntilVisibilityOf( + () => this.successMsg, + 'Wait for success message', + false + ); + await CommonHelper.waitUntilInVisibilityOf( + () => this.successMsg, + 'Wait for success message', + false + ); + } + + /** + * Adds the given skill + * @param skill + */ + public async addSkill(skill) { + await this.performSelection(this.skillInput, null, skill.name); + await this.getAddButton('skill').click(); + } + + /** + * Deletes the given skill + * @param skill + */ + public async deleteSkill(skill) { + await this.deleteIcon.click(); + await this.deleteConfirmation.click(); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/work/work.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/work/work.helper.ts new file mode 100644 index 0000000000..b108a932b5 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/work/work.helper.ts @@ -0,0 +1,86 @@ +import { logger } from '../../../../../../logger/logger'; +import { WorkPage } from './work.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class WorkPageHelper { + /** + * sets the Work page object + */ + public static setWorkPage(workPage) { + this.workPageObject = workPage; + } + + /** + * Opens the work page in the browser + */ + public static async open() { + this.workPageObject = new WorkPage(); + await this.workPageObject.open(); + } + + /** + * Deletes all work experiences + */ + public static async deleteAll() { + await this.workPageObject.deleteAllWorks(); + } + + /** + * Adds a work experience + * @param work - object representation of work experience + */ + public static async verifyAddWork(work) { + const name = this.getName(work); + await this.workPageObject.addWork(work); + await this.workPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(true); + logger.info('work added: ' + name); + } + + /** + * Updates a work experience + * @param work - object representation of already added work experience + * @param newWork - object representation of new work experience + */ + public static async verifyEditWork(work, newWork) { + const name = this.getName(work); + const newName = this.getName(newWork); + + await this.workPageObject.editWork(work, newWork); + await this.workPageObject.waitForDefaultSuccessMessage(); + + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', newName) + ); + expect(isDisplayed).toBe(true); + logger.info('work edited from: ' + name + ' to ' + newName); + } + + /** + * Deletes a work experience + * @param work + */ + public static async verifyDeleteWork(work) { + const name = this.getName(work); + await this.workPageObject.deleteWork(work); + await this.workPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(false); + logger.info('deleted work: ' + name); + } + + /** + * Gets name of work experience which would be used to query in UI + * @param work + */ + private static getName(work) { + return this.workPageObject.getName(work); + } + + private static workPageObject: WorkPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/profile/work/work.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/work/work.po.ts new file mode 100644 index 0000000000..58d4ec9e04 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/profile/work/work.po.ts @@ -0,0 +1,186 @@ +import { logger } from '../../../../../../logger/logger'; +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { SettingsPage } from '../../settings.po'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { TcElementImpl } from 'topcoder-testing-lib/dist/src/tc-element-impl'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class WorkPage extends SettingsPage { + /** + * Gets the Work page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getProfileUrl()); + await this.switchTab('work'); + logger.info('User navigated to Work Page'); + } + + /** + * Delete all works + */ + public async deleteAllWorks() { + await this.deleteAll('Your workplaces'); + } + + /** + * Gets the company field + */ + private get company() { + return ElementHelper.getElementById('company'); + } + + /** + * Gets the industry field + */ + private get industry() { + return ElementHelper.getElementById('industry'); + } + + /** + * Gets the position field + */ + private get position() { + return ElementHelper.getElementById('position'); + } + + /** + * Gets the city field + */ + private get city() { + return ElementHelper.getElementById('cityTown'); + } + + /** + * Gets the start date field + */ + private get startDate() { + return ElementHelper.getElementById('date-from1'); + } + + /** + * Gets the end date field + */ + private get endDate() { + return ElementHelper.getElementById('date-to1'); + } + + /** + * Gets the currently working here field + */ + private get currentlyWorking() { + return ElementHelper.getElementByCss('[for="working"]'); + } + + /** + * Adds the work experience + * @param work + */ + public async addWork(work) { + await BrowserHelper.sleep(1000); + await this.setCompany(work.company); + await this.setPosition(work.position); + await this.setIndustry(work.industry); + await this.setCity(work.city); + await this.setWorkDate(this.startDate, work.startDate); + if (work.currentlyWorking) { + await this.setCurrentlyWorking(); + } + await this.getAddButton('workplace').click(); + } + + /** + * Updates the work experience + * @param work - object representation of already added work experience + * @param newWork - object representation of newly added work experience + */ + public async editWork(work, newWork) { + await CommonHelper.waitUntilVisibilityOf( + () => this.getEditIconbyName(this.getName(work)), + 'Wait for work icon', + false + ); + await this.getEditIconbyName(this.getName(work)).click(); + await BrowserHelper.sleep(1000); + await this.setCompany(newWork.company); + await this.getEditButton('workplace').click(); + } + + /** + * Deletes work experience + * @param work + */ + public async deleteWork(work) { + await CommonHelper.waitUntilVisibilityOf( + () => this.getDeleteIconbyName(this.getName(work)), + 'Wait for work icon', + false + ); + await this.getDeleteIconbyName(this.getName(work)).click(); + await this.deleteConfirmation.click(); + } + + /** + * Sets the company + * @param company + */ + private async setCompany(company) { + await BrowserHelper.waitUntilClickableOf(this.company); + await this.company.clear(); + await this.company.sendKeys(company); + } + + /** + * Sets the position + * @param position + */ + private async setPosition(position) { + await this.position.clear(); + await this.position.sendKeys(position); + } + + /** + * Sets the industry + * @param industry + */ + private async setIndustry(industry) { + await this.industry.clear(); + await this.industry.sendKeys(industry); + } + + /** + * Sets the city + * @param city + */ + private async setCity(city) { + await this.city.clear(); + await this.city.sendKeys(city); + } + + /** + * Generic method to set the work date (startDate/endDate) + */ + private async setWorkDate(el: TcElementImpl, value: string) { + await BrowserHelper.executeScript( + 'arguments[0].removeAttribute("readonly");', + el + ); + await BrowserHelper.sleep(1000); + await this.startDate.sendKeys(value); + await BrowserHelper.sleep(1000); + } + + /** + * Checks the currently working here checkbox + */ + private async setCurrentlyWorking() { + await this.currentlyWorking.click(); + } + + /** + * Gets the name used to query the UI basis the work object + * @param work + */ + public getName(work) { + return `${work.company} | ${work.industry} | ${work.city}`; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/settings.constants.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/settings.constants.ts new file mode 100644 index 0000000000..5de724522f --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/settings.constants.ts @@ -0,0 +1,47 @@ +export class SettingsPageConstants { + /** + * Messages across various setting pages + */ + public static get Messages() { + return { + SuccessMessage: 'Your information has been updated', + SkillSuccessMessage: 'Success', + LinkSuccessMessage: + 'Your link has been added. Data from your link will be visible on your profile shortly.', + EmailPrefSuccessMessage: 'Your email preferences were updated.', + }; + } + + /** + * Colors constants + */ + public static get Colors() { + return { + GreyColor: 'rgba(192, 192, 192, 1)', + }; + } + + /** + * Community constants + */ + public static get Communities() { + return { + Blockchain: 'blockchain', + Cognitive: 'cognitive', + }; + } + + /** + * Email Preferences + */ + public static getEmailPreferences() { + return [ + 'Pipeline', + 'Gig Work', + 'Monthly Newsletter', + 'Marathon Match Reminders', + 'Single Round Match Reminders', + 'TCO Tuesdays', + ]; + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/settings.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/settings.po.ts new file mode 100644 index 0000000000..ab0969dbf9 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/settings.po.ts @@ -0,0 +1,178 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../logger/logger'; +import { CommonHelper } from '../common-page/common.helper'; +import { SettingsPageConstants } from './settings.constants'; +import TcElement from 'topcoder-testing-lib/dist/src/tc-element'; + +export class SettingsPage { + /** + * Gets the page heading + */ + + public get heading() { + return CommonHelper.findElementByText('h1', 'Settings'); + } + + /** + * Gets the success message + */ + + public get successMsg() { + return CommonHelper.findElementByText( + 'div', + SettingsPageConstants.Messages.SuccessMessage + ); + } + + /** + * Gets the delete confirmation button + */ + public get deleteConfirmation() { + return CommonHelper.findElementByText('button', 'Yes, Delete'); + } + + /** + * Gets the delete icon + */ + protected get deleteIcon() { + return ElementHelper.getElementByCss('img[alt="delete-icon"]'); + } + + /** + * Switches tab to given tab name + * @param {String} tabName + */ + public async switchTab(tabName: string) { + // wait for showing page + tab name + await CommonHelper.waitUntilVisibilityOf( + () => CommonHelper.findElementByText('span', tabName), + 'Wait for tab ' + tabName, + true + ); + + await CommonHelper.switchTabByClickingOnTagWithText('span', tabName); + await BrowserHelper.sleep(3000); // wait 3 second to show the tab + logger.info('tab Switched to ' + tabName); + } + + /** + * Deletes all records on the tools page + * @param {String} yourItemName + */ + public async deleteAll(yourItemName: string) { + await CommonHelper.waitUntilVisibilityOf( + () => this.heading, + 'Wait for heading', + false + ); + await CommonHelper.waitUntilPresenceOf( + () => CommonHelper.findElementByText('div', yourItemName), + 'wait for ' + yourItemName, + false + ); + const delIcons = await this.getDeleteIcons(); + for (let {} of delIcons) { + await this.deleteIcon.click(); + await this.deleteConfirmation.click(); + await this.waitForDefaultSuccessMessage(); + } + } + + /** + * Gets all delete icons in the page + */ + private getDeleteIcons() { + return ElementHelper.getAllElementsByCss('img[alt="delete-icon"]'); + } + + /** + * Gets the add button for the given type + * @param {String} type + */ + protected getAddButton(type: string) { + return CommonHelper.findElementByText( + 'button', + 'Add ' + type + ' to your list' + ); + } + + /** + * Gets the edit button for the given type + * @param {String} type + */ + protected getEditButton(type: string) { + return CommonHelper.findElementByText( + 'button', + 'Edit ' + type + ' to your list' + ); + } + + /** + * Gets the edit icon for the given name + * @param {String} name + */ + protected getEditIconbyName(name: string) { + return ElementHelper.getElementByXPath( + `//*[text()='${name}']//following::img[@alt='edit-icon']` + ); + } + + /** + * Gets the delete icon for the given name + * @param {String} name + */ + protected getDeleteIconbyName(name: string) { + return ElementHelper.getElementByXPath( + `//*[text()='${name}']//following::img[@alt='delete-icon']` + ); + } + + /** + * Perform select suggestion dropdown + * @param element element field + * @param getElement get element function, use if have problem with element + * @param value value to select + */ + protected async performSelection( + element: TcElement, + getElement: () => any, + value: any + ) { + let queryElement = getElement ? await getElement() : element; + await CommonHelper.waitUntilVisibilityOf( + () => queryElement, + 'Wait for query element selection', + false + ); + queryElement = getElement ? await getElement() : element; + await queryElement.sendKeys(value); + await CommonHelper.waitUntilVisibilityOf( + () => this.selectOption, + 'Wait for select option', + false + ); + await this.selectOption.click(); + } + + protected get selectOption() { + // first option + return ElementHelper.getElementByClassName('Select-option'); + } + + /** + * Waits for visibility and invisibility of success message + */ + public async waitForDefaultSuccessMessage() { + await CommonHelper.waitUntilVisibilityOf( + () => this.successMsg, + 'Wait for success message', + false + ); + + await CommonHelper.waitUntilInVisibilityOf( + () => this.successMsg, + 'wait for success message', + false + ); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/tools/devices/device.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/devices/device.helper.ts new file mode 100644 index 0000000000..91f4da15ac --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/devices/device.helper.ts @@ -0,0 +1,75 @@ +import { logger } from '../../../../../../logger/logger'; +import { DevicePage } from './device.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class DevicePageHelper { + /** + * Opens the tools page in the browser + */ + public static async open() { + this.devicePageObject = new DevicePage(); + await this.devicePageObject.open(); + } + + /** + * deletes all entries in the current tab + */ + public static async deleteAll() { + await this.devicePageObject.deleteAllDevices(); + } + + /** + * verifyies that user can add device + */ + public static async verifyAddDevice(device) { + const name = this.getDeviceName(device); + await this.devicePageObject.addDevice(device); + await this.devicePageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(true); + logger.info('device added: ' + name); + } + + /** + * verifyies that user can edit device + */ + public static async verifyEditDevice(device, newDevice) { + const name = this.getDeviceName(device); + const newName = this.getDeviceName(newDevice); + + await this.devicePageObject.editDevice(device, newDevice); + await this.devicePageObject.waitForDefaultSuccessMessage(); + + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', newName) + ); + expect(isDisplayed).toBe(true); + logger.info('device edited from: ' + name + ' to ' + newName); + } + + /** + * verifyies that user can delete device + */ + public static async verifyDeleteDevice(device) { + const name = this.getDeviceName(device); + await this.devicePageObject.deleteDevice(device); + await this.devicePageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(false); + logger.info('deleted device: ' + name); + } + + /** + * Gets the device name basis which the UI would be queried + * @param device + */ + private static getDeviceName(device): string { + return `${device.model}`; + } + + private static devicePageObject: DevicePage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/tools/devices/device.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/devices/device.po.ts new file mode 100644 index 0000000000..7640fbb0d1 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/devices/device.po.ts @@ -0,0 +1,206 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../../../logger/logger'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { SettingsPage } from '../../settings.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class DevicePage extends SettingsPage { + /** + * Gets the Tools page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getToolsUrl()); + await this.switchTab('devices'); + logger.info('User navigated to Device Page'); + } + + /** + * Delete all service providers + */ + public async deleteAllDevices() { + await this.deleteAll('Your devices'); + } + + /** + * Gets the device form + */ + private get deviceForm() { + return ElementHelper.getElementByName('device-form'); + } + + /** + * Gets the device type input field + * @param type - if type isn't specified it would default to the placeholder + * @param parentEl + */ + private getDeviceType(type?: string, parentEl?) { + const value = type || 'Select device Type'; + return ElementHelper.getTagElementMatchingText('div', value, parentEl); + } + + /** + * Gets the device manufacturer input field + * @param manufacturer - if manufacturer isn't specified, it would default to the placeholder + */ + private getDeviceManufacturer(manufacturer?: string) { + const value = manufacturer || 'Select device Manufacturer'; + return CommonHelper.findElementByText('div', value); + } + + /** + * Gets the device model + * @param model - if model isn't specified, it would default to the placeholder + */ + private getDeviceModel(model?: string) { + const value = model || 'Select device Model'; + return CommonHelper.findElementByText('div', value); + } + + /** + * Gets the device OS + * @param os - if OS isn't provided, it would default to the placeholder + */ + private getDeviceOS(os?: string) { + const value = os || 'Select device Operating System'; + return CommonHelper.findElementByText('div', value); + } + + /** + * Generic method to get a device input field basis the value provided + * @param option - value basis which the element would be queried + */ + private getDeviceInputWithOption(option) { + return CommonHelper.findElementByText('div', option); + } + + /** + * Adds a device with the provided device object + * @param {Object} device + */ + public async addDevice(device) { + await this.setDeviceType(device.type); + await this.setDeviceManufacturer(device.manufacturer); + await this.setDeviceModel(device.model); + await this.setDeviceOS(device.os); + await this.getAddButton('device').click(); + } + + /** + * Edits the given device with the new provided device + * @param {Object} oldDevice + * @param {Object} newDevice + */ + public async editDevice(oldDevice, newDevice) { + const name = `${oldDevice.model}`; + await this.getEditIconbyName(name).click(); + await this.editDeviceType(oldDevice.type, newDevice.type); + await this.setDeviceManufacturer(newDevice.manufacturer); + await this.setDeviceModel(newDevice.model); + await this.setDeviceOS(newDevice.os); + await this.getEditButton('device').click(); + } + + /** + * Deletes the given device + * @param {Object} device + */ + public async deleteDevice(device) { + const name = `${device.model}`; + await this.getDeleteIconbyName(name).click(); + await this.deleteConfirmation.click(); + } + + /** + * Sets the device type + * @param type + */ + private async setDeviceType(type: string) { + await this.setDeviceOption(this.getDeviceType(), type); + } + + /** + * Updates the device type + * @param oldType + * @param newType + */ + private async editDeviceType(oldType: string, newType: string) { + await this.setDeviceOption( + this.getDeviceType(oldType, this.deviceForm), + newType + ); + } + + /** + * Sets the device manufacturer + * @param manufacturer + */ + private async setDeviceManufacturer(manufacturer: string) { + await this.setDeviceOption(this.getDeviceManufacturer(), manufacturer); + } + + /** + * Updates the device manufacturer + * @param oldManufacturer + * @param newManufacturer + */ + private async editDeviceManufacturer( + oldManufacturer: string, + newManufacturer: string + ) { + await this.setDeviceOption( + this.getDeviceManufacturer(oldManufacturer), + newManufacturer + ); + } + + /** + * Sets the device model + * @param model + */ + private async setDeviceModel(model: string) { + await this.setDeviceOption(this.getDeviceModel(), model); + } + + /** + * Updates the device model + * @param oldModel + * @param newModel + */ + private async editDeviceModel(oldModel: string, newModel: string) { + await this.setDeviceOption(this.getDeviceModel(oldModel), newModel); + } + + /** + * Sets the device OS + * @param os + */ + private async setDeviceOS(os: string) { + await this.setDeviceOption(this.getDeviceOS(), os); + } + + /** + * Updates the device OS + * @param oldOS + * @param newOS + */ + private async editDeviceOS(oldOS: string, newOS: string) { + await this.setDeviceOption(this.getDeviceOS(oldOS), newOS); + } + + /** + * Generic method to set the device properties + * @param element - element which should be filled + * @param value - value to be entered + */ + private async setDeviceOption(element, value: string) { + await BrowserHelper.waitUntilClickableOf(element); + await element.click(); + await CommonHelper.waitUntilVisibilityOf( + () => this.getDeviceInputWithOption(value), + 'Wait for device input with option', + false + ); + const optionEl = this.getDeviceInputWithOption(value); + await optionEl.click(); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/tools/service-providers/service-provider.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/service-providers/service-provider.helper.ts new file mode 100644 index 0000000000..a3e5a2e9bf --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/service-providers/service-provider.helper.ts @@ -0,0 +1,79 @@ +import { logger } from '../../../../../../logger/logger'; +import { ServiceProviderPage } from './service-provider.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class ServiceProviderPageHelper { + /** + * gets the Tools page object + */ + public static setServiceProviderPage(serviceProviderPage) { + this.serviceProviderPageObject = serviceProviderPage; + } + + /** + * Opens the tools page in the browser + */ + public static async open() { + this.serviceProviderPageObject = new ServiceProviderPage(); + await this.serviceProviderPageObject.open(); + } + + /** + * deletes all entries in the current tab + */ + public static async deleteAll() { + await this.serviceProviderPageObject.deleteAllServiceProviders(); + } + + /** + * verifyies that user can add service provider + */ + public static async verifyAddServiceProvider(serviceProvider) { + await this.serviceProviderPageObject.addServiceProvider(serviceProvider); + await this.serviceProviderPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', serviceProvider.name) + ); + expect(isDisplayed).toBe(true); + logger.info('serviceProvider added: ' + serviceProvider.name); + } + + /** + * verifyies that user can edit service provider + */ + public static async verifyEditServiceProvider( + serviceProvider, + newServiceProvider + ) { + await this.serviceProviderPageObject.editServiceProvider( + serviceProvider, + newServiceProvider + ); + await this.serviceProviderPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', newServiceProvider.name) + ); + expect(isDisplayed).toBe(true); + logger.info( + 'serviceProvider edited from: ' + + serviceProvider.name + + ' to ' + + newServiceProvider.name + ); + } + + /** + * verifyies that user can delete service provider + */ + public static async verifyDeleteServiceProvider(serviceProvider) { + await this.serviceProviderPageObject.deleteServiceProvider(serviceProvider); + await this.serviceProviderPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', serviceProvider.name) + ); + expect(isDisplayed).toBe(false); + logger.info('deleted serviceProvider: ' + serviceProvider.name); + } + + private static serviceProviderPageObject: ServiceProviderPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/tools/service-providers/service-provider.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/service-providers/service-provider.po.ts new file mode 100644 index 0000000000..e45e77d479 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/service-providers/service-provider.po.ts @@ -0,0 +1,84 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../../../logger/logger'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { SettingsPage } from '../../settings.po'; + +export class ServiceProviderPage extends SettingsPage { + /** + * Gets the Tools page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getToolsUrl()); + await this.switchTab('service providers'); + logger.info('User navigated to ServiceProvider Page'); + } + + /** + * Delete all service providers + */ + public async deleteAllServiceProviders() { + await this.deleteAll('Your service providers'); + } + + /** + * Gets the service provider type input + */ + private get serviceProviderType() { + return ElementHelper.getElementByCss('[role="combobox"]'); + } + + /** + * Gets the service provider Name textbox + */ + private get serviceProviderName() { + return ElementHelper.getElementById('name'); + } + + /** + * Adds a service provider with the provided name + * @param {String} name + */ + public async addServiceProvider(serviceProvider) { + await this.setServiceProviderType(serviceProvider.type); + await this.setServiceProviderName(serviceProvider.name); + await this.getAddButton('service provider').click(); + } + + /** + * Edits the given service provider name with the new provided name + * @param {String} name + * @param {String} newname + */ + public async editServiceProvider(serviceProvider, newServiceProvider) { + await this.getEditIconbyName(serviceProvider.name).click(); + await this.setServiceProviderType(newServiceProvider.type); + await this.setServiceProviderName(newServiceProvider.name); + await this.getEditButton('service provider').click(); + } + + /** + * Deletes the given service provider + * @param {String} name + */ + public async deleteServiceProvider(serviceProvider) { + await this.getDeleteIconbyName(serviceProvider.name).click(); + await this.deleteConfirmation.click(); + } + + /** + * Fills the software provider type input by selecting from the given options + * @param {string} type - software provider type + */ + private async setServiceProviderType(type) { + await this.performSelection(this.serviceProviderType, null, type); + } + + /** + * Fills the service provider name textbox with given name + * @param {String} name + */ + private async setServiceProviderName(name: string) { + await this.serviceProviderName.clear(); + await this.serviceProviderName.sendKeys(name); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/tools/softwares/software.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/softwares/software.helper.ts new file mode 100644 index 0000000000..2783afc0da --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/softwares/software.helper.ts @@ -0,0 +1,70 @@ +import { logger } from '../../../../../../logger/logger'; +import { SoftwarePage } from './software.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class SoftwarePageHelper { + /** + * gets the Software page object + */ + public static setSoftwarePage(softwarePage) { + this.softwarePageObject = softwarePage; + } + + /** + * Opens the software page in the browser + */ + public static async open() { + this.softwarePageObject = new SoftwarePage(); + await this.softwarePageObject.open(); + } + + /** + * deletes all entries in the current tab + */ + public static async deleteAll() { + await this.softwarePageObject.deleteAllSoftware(); + } + + /** + * verifyies that user can add software + */ + public static async verifyAddSoftware(software) { + await this.softwarePageObject.addSoftware(software); + await this.softwarePageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', software.name) + ); + expect(isDisplayed).toBe(true); + logger.info('software added: ' + software.name); + } + + /** + * verifyies that user can edit software + */ + public static async verifyEditSoftware(software, newSoftware) { + await this.softwarePageObject.editSoftware(software, newSoftware); + await this.softwarePageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', newSoftware.name) + ); + expect(isDisplayed).toBe(true); + logger.info( + 'software edited from: ' + software.name + ' to ' + newSoftware.name + ); + } + + /** + * verifyies that user can delete software + */ + public static async verifyDeleteSoftware(software) { + await this.softwarePageObject.deleteSoftware(software); + await this.softwarePageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', software.name) + ); + expect(isDisplayed).toBe(false); + logger.info('deleted software: ' + software.name); + } + + private static softwarePageObject: SoftwarePage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/tools/softwares/software.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/softwares/software.po.ts new file mode 100644 index 0000000000..0c26494b90 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/softwares/software.po.ts @@ -0,0 +1,85 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../../../logger/logger'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { SettingsPage } from '../../settings.po'; + +export class SoftwarePage extends SettingsPage { + /** + * Gets the Sofware page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getToolsUrl()); + await this.switchTab('software'); + logger.info('User navigated to Software Page'); + } + + /** + * Delete all sortware + */ + public async deleteAllSoftware() { + await this.deleteAll('Your software'); + } + + /** + * Gets the software type input + */ + private get softwareType() { + return ElementHelper.getElementByCss('[role="combobox"]'); + } + + /** + * Gets the software name textbox + */ + private get softwareName() { + return ElementHelper.getElementById('name'); + } + + /** + * Adds a software with the provided name + * @param {String} name + */ + public async addSoftware(software) { + await this.setSoftwareType(software.type); + await this.setSoftwareName(software.name); + await this.getAddButton('software').click(); + } + + /** + * Edits the given software name with the new provided name + * @param {String} name + * @param {String} newname + */ + public async editSoftware(software, newSoftware) { + const name = software.name; + await this.getEditIconbyName(name).click(); + await this.setSoftwareType(newSoftware.type); + await this.setSoftwareName(newSoftware.name); + await this.getEditButton('software').click(); + } + + /** + * Deletes the given software + * @param {String} name + */ + public async deleteSoftware(software) { + await this.getDeleteIconbyName(software.name).click(); + await this.deleteConfirmation.click(); + } + + /** + * Fills the software type input by selecting from the provided options + * @param {string} type - to which software type is set + */ + private async setSoftwareType(type) { + await this.performSelection(this.softwareType, null, type); + } + + /** + * Fills the software name textbox with given name + * @param {String} name + */ + private async setSoftwareName(name: string) { + await this.softwareName.clear(); + await this.softwareName.sendKeys(name); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/tools/subscriptions/subscriptions.helper.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/subscriptions/subscriptions.helper.ts new file mode 100644 index 0000000000..42d957e7a2 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/subscriptions/subscriptions.helper.ts @@ -0,0 +1,68 @@ +import { logger } from '../../../../../../logger/logger'; +import { SubscriptionsPage } from './subscriptions.po'; +import { CommonHelper } from '../../../common-page/common.helper'; + +export class SubscriptionsPageHelper { + /** + * gets the Tools page object + */ + public static setSubscriptionsPage(subscriptionsPage) { + this.subscriptionsPageObject = subscriptionsPage; + } + + /** + * Opens the tools page in the browser + */ + public static async open() { + this.subscriptionsPageObject = new SubscriptionsPage(); + await this.subscriptionsPageObject.open(); + } + + /** + * deletes all entries in the current tab + */ + public static async deleteAll() { + await this.subscriptionsPageObject.deleteAllSubscriptions(); + } + + /** + * verifies that user can add subscription + */ + public static async verifyAddSubscription(name) { + await this.subscriptionsPageObject.addSubscription(name); + await this.subscriptionsPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(true); + logger.info('subscription added: ' + name); + } + + /** + * verifies that user can edit subscription + */ + public static async verifyEditSubscription(name, newName) { + await this.subscriptionsPageObject.editSubscription(name, newName); + await this.subscriptionsPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', newName) + ); + expect(isDisplayed).toBe(true); + logger.info('subscription edited from: ' + name + ' to ' + newName); + } + + /** + * verifies that user can delete subscription + */ + public static async verifyDeleteSubscription(name) { + await this.subscriptionsPageObject.deleteSubscription(name); + await this.subscriptionsPageObject.waitForDefaultSuccessMessage(); + const isDisplayed = await CommonHelper.isPresent( + CommonHelper.findElementByText('div', name) + ); + expect(isDisplayed).toBe(false); + logger.info('deleted subscription: ' + name); + } + + private static subscriptionsPageObject: SubscriptionsPage; +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/settings/tools/subscriptions/subscriptions.po.ts b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/subscriptions/subscriptions.po.ts new file mode 100644 index 0000000000..156727bf37 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/settings/tools/subscriptions/subscriptions.po.ts @@ -0,0 +1,70 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { logger } from '../../../../../../logger/logger'; +import { ConfigHelper } from '../../../../../../utils/config-helper'; +import { SettingsPage } from '../../settings.po'; + +export class SubscriptionsPage extends SettingsPage { + /** + * Gets the Tools page + */ + public async open() { + await BrowserHelper.open(ConfigHelper.getToolsUrl()); + await this.switchTab('subscriptions'); + logger.info('User navigated to Subscriptions Page'); + } + + /** + * Delete all subscriptions + */ + public async deleteAllSubscriptions() { + await this.deleteAll('Your subscriptions'); + } + + /** + * Gets the subscription Name textbox + */ + private get subscriptionName() { + return ElementHelper.getElementById('name'); + } + + /** + * Adds a subscription with the provided name + * @param {String} name + */ + public async addSubscription(name) { + await BrowserHelper.sleep(1000); + await this.setSubscription(name); + await this.getAddButton('subscription').click(); + } + + /** + * Edits the given subscription name with the new provided name + * @param {String} name + * @param {String} newname + */ + public async editSubscription(name, newname) { + await this.getEditIconbyName(name).click(); + await BrowserHelper.sleep(1000); + await this.setSubscription(newname); + await this.getEditButton('subscription').click(); + } + + /** + * Deletes the given subscription + * @param {String} name + */ + public async deleteSubscription(name) { + await this.getDeleteIconbyName(name).click(); + await this.deleteConfirmation.click(); + } + + /** + * Fills the subscription name textbox with given name + * @param {String} name + */ + private async setSubscription(name: string) { + await BrowserHelper.waitUntilClickableOf(this.subscriptionName); + await this.subscriptionName.clear(); + await this.subscriptionName.sendKeys(name); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/splash/splash.po.ts b/automated-smoke-test/page-objects/pages/topcoder/splash/splash.po.ts new file mode 100644 index 0000000000..c89c5bafef --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/splash/splash.po.ts @@ -0,0 +1,10 @@ +import { ElementHelper } from 'topcoder-testing-lib'; + +export class SplashPage { + /** + * Gets the home page container element + */ + public get container() { + return ElementHelper.getElementByClassName('page-template-template-splash'); + } +} diff --git a/automated-smoke-test/page-objects/pages/topcoder/start/start.po.ts b/automated-smoke-test/page-objects/pages/topcoder/start/start.po.ts new file mode 100644 index 0000000000..00d2deefd0 --- /dev/null +++ b/automated-smoke-test/page-objects/pages/topcoder/start/start.po.ts @@ -0,0 +1,10 @@ +import { ElementHelper } from 'topcoder-testing-lib'; + +export class StartPage { + /** + * Gets the start page container element + */ + public get container() { + return ElementHelper.getElementById('8gcB2inC4m4GBeodzy2uN'); + } +} diff --git a/automated-smoke-test/smoketest.sh b/automated-smoke-test/smoketest.sh new file mode 100755 index 0000000000..7cfdc69084 --- /dev/null +++ b/automated-smoke-test/smoketest.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +log() +{ + echo "`date +'%D %T'` : $1" +} +track_error() +{ + if [ $1 != "0" ]; then + log "$2 exited with error code $1" + log "completed execution IN ERROR at `date`" + exit $1 + fi + +} + +APPCONFIGFILENAME=$1 +LOGICAL_PATH=$2 + +cd automated-smoke-test +aws s3 cp s3://tc-platform-${LOGICAL_PATH}/securitymanager/${APPCONFIGFILENAME} . +track_error $? "Environment setting" +cp ${APPCONFIGFILENAME} config/config.json + +docker build -t comm-smoke:latest . +docker run --shm-size=2g comm-smoke:latest ./testrun.sh -d -p 4444:4444 +track_error $? "Test case Failed" diff --git a/automated-smoke-test/test-cases/Community Smoke Test Cases.xlsx b/automated-smoke-test/test-cases/Community Smoke Test Cases.xlsx new file mode 100644 index 0000000000..abec10b015 Binary files /dev/null and b/automated-smoke-test/test-cases/Community Smoke Test Cases.xlsx differ diff --git a/automated-smoke-test/test-data/test-data.json b/automated-smoke-test/test-data/test-data.json new file mode 100644 index 0000000000..02aa602405 --- /dev/null +++ b/automated-smoke-test/test-data/test-data.json @@ -0,0 +1,121 @@ +{ + "login": { + "invalidUsername": "gjhhvv", + "invalidPassword": "invalidpassword" + }, + "tools": { + "subscription": "Sample A", + "newSubscription": "Sample B", + "device": { + "type": "Console", + "manufacturer": "Microsoft", + "model": "XBox One S", + "os": "Windows" + }, + "newDevice": { + "type": "Smartphone", + "manufacturer": "Acer", + "model": "Allegro", + "os": "Windows Phone" + }, + "software": { + "type": "Browser", + "name": "Software A" + }, + "newSoftware": { + "type": "Productivity", + "name": "Software B" + }, + "serviceProvider": { + "type": "Television", + "name": "Service Provider A" + }, + "newServiceProvider": { + "type": "Other", + "name": "Service Provider B" + } + }, + "profile": { + "personalDetails": { + "firstName": "Test1", + "lastName": "User1", + "address1": "Address1", + "address2": "Address2", + "city": "TestCity", + "state": "TestState", + "zip": "560000", + "country": "India" + }, + "aboutYou": { + "gender": "Male", + "tshirtSize": "XXS", + "currentLocation": "India", + "primaryInterest": "Coding", + "description": "Lorem Ipsum lorem ipsum" + }, + "tracks": { + "design": true, + "develop": false, + "dataScience": true + }, + "language": { + "name": "Afar", + "spokenLevel": "Basic", + "writtenLevel": "Intermediate" + }, + "newLanguage": { + "name": "Afar", + "spokenLevel": "Advanced", + "writtenLevel": "Basic" + }, + "education": { + "collegeName": "Test college", + "major": "Test Major", + "fromDate": "01/06/2010", + "toDate": "01/06/2014", + "graduated": true + }, + "newEducation": { + "collegeName": "Test college1" + }, + "work": { + "company": "Topcoder", + "position": "Software Developer", + "industry": "IT", + "city": "California", + "startDate": "01/01/2010", + "currentlyWorking": true + }, + "newWork": { + "company": "Wipro", + "position": "Software Developer", + "industry": "IT", + "city": "California", + "startDate": "01/01/2010", + "currentlyWorking": true + }, + "skill": { + "name": "ADO.NET" + }, + "hobby": { + "name": "Coding", + "description": "Description 1" + }, + "newHobby": { + "name": "Swimming", + "description": "Description 1" + }, + "community": { + "blockchain": true, + "cognitive": false + } + }, + "preferences": { + "email": [false, true, true, true, false, true] + }, + "search": { + "username": "tester1234", + "skill": "Java" + }, + "linkedAccount": "www.test.com" +} diff --git a/automated-smoke-test/test-suites/tc-account.spec.ts b/automated-smoke-test/test-suites/tc-account.spec.ts new file mode 100644 index 0000000000..0f3ab11ee8 --- /dev/null +++ b/automated-smoke-test/test-suites/tc-account.spec.ts @@ -0,0 +1,49 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import * as testData from '../test-data/test-data.json'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import { ConfigHelper } from '../utils/config-helper'; +import { MyAccountPageHelper } from '../page-objects/pages/topcoder/settings/account/my-account/my-account.helper'; +import { LinkedAccountPageHelper } from '../page-objects/pages/topcoder/settings/account/linked-account/linked-account.helper'; + +describe('Topcoder Account Page Tests: ', () => { + /** + * Sets up the browser and logs in + */ + beforeAll(async () => { + await BrowserHelper.initialize(); + await LoginPageHelper.open(); + await LoginPageHelper.login( + ConfigHelper.getUserName(), + ConfigHelper.getPassword() + ); + }); + + /** + * Logs out + */ + afterAll(async () => { + try { + await LoginPageHelper.logout(); + } catch (e) { + await BrowserHelper.restart(); + } + }); + + /** + * Verifies User can update his/her User Consent. + */ + it('[TC_001] should Verify User can update his/her User Consent', async () => { + await MyAccountPageHelper.open(); + await MyAccountPageHelper.verifyUserConsent(); + }); + + /** + * Verifies if User can add/delete external link + */ + it('[TC_002] should Verify User can Add/Delete External Link.', async () => { + await LinkedAccountPageHelper.open(); + await LinkedAccountPageHelper.deleteAll(); + await LinkedAccountPageHelper.verifyAddLink(testData.linkedAccount); + await LinkedAccountPageHelper.verifyDeleteLink(testData.linkedAccount); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-challenge-detail.spec.ts b/automated-smoke-test/test-suites/tc-challenge-detail.spec.ts new file mode 100644 index 0000000000..6b5a02da5c --- /dev/null +++ b/automated-smoke-test/test-suites/tc-challenge-detail.spec.ts @@ -0,0 +1,116 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import { ConfigHelper } from '../utils/config-helper'; +import { ChallengeListingPageHelper } from '../page-objects/pages/topcoder/challenge-listing/challenge-listing.helper'; +import { ChallengeDetailPageHelper } from '../page-objects/pages/topcoder/challenge-detail/challenge-detail.helper'; + +describe('Topcoder Challenge Detail Page Tests: ', () => { + /** + * Sets up the browser + */ + beforeAll(async () => { + await BrowserHelper.initialize(); + await BrowserHelper.maximize(); + }); + + /** + * Verifies all tests with login functionality + */ + describe('Pre-condition of login', () => { + beforeAll(async () => { + await LoginPageHelper.open(); + await LoginPageHelper.login( + ConfigHelper.getUserName(), + ConfigHelper.getPassword() + ); + }); + + /** + * Logs out + */ + afterAll(async () => { + try { + await LoginPageHelper.logout(); + } catch (e) { + await BrowserHelper.restart(); + } + }); + + /** + * Open challenge detail page and unregister challenge + */ + beforeEach(async () => { + await ChallengeDetailPageHelper.open(); + // unregister after finish test case + await ChallengeDetailPageHelper.unregisterIfAlreadyRegistered(); + }); + + /** + * Open challenge detail page and unregister challenge + */ + afterEach(async () => { + await ChallengeDetailPageHelper.open(); + // unregister after finish test case + await ChallengeDetailPageHelper.unregisterIfAlreadyRegistered(); + }); + + it('[TC-001] should verify that back button redirects user to challenge', async () => { + await ChallengeListingPageHelper.open(); + await ChallengeListingPageHelper.navigateToFirstChallenge(); + await ChallengeDetailPageHelper.clickOnBackButton(); + const url = await BrowserHelper.getCurrentUrl(); + expect(url).toEqual(ConfigHelper.getChallengeListingUrl()); + }); + + it('[TC-002] should verify that a user is able to successfully enter a submission to a code challenge', async () => { + await ChallengeDetailPageHelper.open(); + await ChallengeDetailPageHelper.registerIfNotAlreadyRegistered(); + await ChallengeDetailPageHelper.uploadSubmission(); + }); + + it('[TC_004] should verify whether the user is registered to the particular challenge on clicking the Register button', async () => { + await ChallengeDetailPageHelper.register(); + await ChallengeDetailPageHelper.verifyChallengeForumLink(); + }); + + it('[TC_005] should verify whether the user is unregistered into particular challenge on clicking the UnRegister button', async () => { + await ChallengeDetailPageHelper.register(); + await ChallengeDetailPageHelper.unregister(); + }); + + it('[TC_006] should verify whether the user is redirected to the Submission page on clicking the Submit button', async () => { + await ChallengeDetailPageHelper.register(); + await ChallengeDetailPageHelper.clickOnSubmitButton(); + await ChallengeDetailPageHelper.verifySubmissionPage(); + }); + + it('[TC_007] should verify whether the deadlines(time zone) for the particular challenge on clicking the show Deadlines', async () => { + await ChallengeDetailPageHelper.verifyDeadlines(); + }); + + it('[TC_008] should verify whether the details of the challenges are displayed on clicking the Details tab', async () => { + await ChallengeDetailPageHelper.switchToDetailsTab(); + await ChallengeDetailPageHelper.verifyDetailsTab(); + }); + + it('[TC_009] should verify whether the registered members of the challenges are displayed on clicking the Registrants tab', async () => { + await ChallengeDetailPageHelper.switchToRegistrantsTab(); + await ChallengeDetailPageHelper.verifyRegistrantsTab(); + }); + + it('[TC_010] should verify whether the Solution submitted members are displayed on clicking the Submissions tab', async () => { + await ChallengeDetailPageHelper.switchToSubmissionsTab(); + await ChallengeDetailPageHelper.verifySubmissionsTab(); + }); + + it('[TC_011] should verify whether the user is redirected to the Review Scorecard page on clicking the Review Scorecard link', async () => { + await ChallengeDetailPageHelper.clickOnReviewScorecardLink(); + await ChallengeDetailPageHelper.verifyScorecardPage(); + }); + + it('[TC_012] should verify whether the user is redirected to the Challenge Terms page on clicking the Challenge Terms link', async () => { + await ChallengeDetailPageHelper.clickOnTermsLink(); + await ChallengeDetailPageHelper.verifyTermsPage(); + }); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-challenge-listing.spec.ts b/automated-smoke-test/test-suites/tc-challenge-listing.spec.ts new file mode 100644 index 0000000000..b3a240ea4c --- /dev/null +++ b/automated-smoke-test/test-suites/tc-challenge-listing.spec.ts @@ -0,0 +1,235 @@ +import { BrowserHelper, ElementHelper } from 'topcoder-testing-lib'; +import { ChallengeListingPageHelper } from '../page-objects/pages/topcoder/challenge-listing/challenge-listing.helper'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import { ConfigHelper } from '../utils/config-helper'; +import { HeaderHelper } from '../page-objects/pages/topcoder/header/header.helper'; +import * as testData from '../test-data/test-data.json'; +import { ChallengeDetailPageHelper } from '../page-objects/pages/topcoder/challenge-detail/challenge-detail.helper'; + +describe('Topcoder Challenge Listing Page Tests: ', () => { + /** + * Sets up the browser + */ + beforeAll(async () => { + await BrowserHelper.initialize(); + await BrowserHelper.maximize(); + }); + + /** + * Verifies all tests without login functionality + */ + describe('Before Login Test Cases', () => { + beforeEach(async () => { + // do refresh the browser to avoid caching in site + await BrowserHelper.initialize(); + await BrowserHelper.maximize(); + HeaderHelper.initialize(); + ChallengeListingPageHelper.initialize(); + await ChallengeListingPageHelper.open(); + }); + + it('[TC_002] should verify whether the current page is redirected to Registration page on clicking the Log in button', async () => { + await ChallengeListingPageHelper.verifyLoginLink(); + }); +/* + it('[TC_003] should verify whether the user is able to search the member by their username/skill using the search icon', async () => { + await HeaderHelper.verifySearchByUsername(testData.search.username); + await ChallengeListingPageHelper.open(); + await HeaderHelper.verifySearchBySkill(testData.search.skill); + }); +*/ + it('[TC_004] should verify whether all the open for registration are listed on clicking the Challenge tab', async () => { + await ChallengeListingPageHelper.verifyOpenForRegistrationChallenges(); + }); + + it('[TC_006] should verify whether the user is able to search for a challenge by using the Search challenges textbox', async () => { + await ChallengeListingPageHelper.fillAndVerifySearchResults(); + }); + + it('[TC-007] should verify that the "Filter" button is working correctly', async () => { + await ChallengeListingPageHelper.verifyFilterToggle(); + }); + + it('[TC-008] should verify that the "Filter" option "keywords" is working correctly', async () => { + await ChallengeListingPageHelper.verifyFilterByKeywords(); + }); + + it('[TC-009] should verify that the "Filter" option "Type" is working correctly', async () => { + await ChallengeListingPageHelper.verifyFilterByType(); + }); + + it('[TC-010] should verify that the "Filter" option "Sub Community" is working correctly', async () => { + await ChallengeListingPageHelper.verifyFilterBySubCommunity(); + }); + + it('[TC-011] should verify that the "Filter" option for "Date range" is working correctly', async () => { + await ChallengeListingPageHelper.openFiltersPanel(); + await ChallengeListingPageHelper.selectDateRange(); + await ChallengeListingPageHelper.verifyNumberOfAppliedFilters(1); + }); + + it('[TC_012] should verify whether the challenges are filtered according to the keyword/Type/Sub community/Date range fields selected under the Filter function', async () => { + await ChallengeListingPageHelper.openFiltersPanel(); + await ChallengeListingPageHelper.verifyFilterByKeywordsAndType(); + await ChallengeListingPageHelper.verifyNumberOfAppliedFilters(2); + }); + + it('[TC_013] should verify whether the user is able to select more than one keyword/Type under the filter function', async () => { + await ChallengeListingPageHelper.openFiltersPanel(); + // await ChallengeListingPageHelper.verifyFilterByMultipleKeywords(); + await ChallengeListingPageHelper.verifyFilterByMultipleTypes(); + }); + + it('[TC_014] should verify whether the cross symbol inside the textbox keyword/Type filters removes the selected keyword/Type', async () => { + await ChallengeListingPageHelper.openFiltersPanel(); + await ChallengeListingPageHelper.verifyFilterByMultipleKeywords(); + await ChallengeListingPageHelper.verifyFilterByMultipleTypes(); + await ChallengeListingPageHelper.verifyRemovalOfKeyword(); + await ChallengeListingPageHelper.verifyRemovalOfType(); + }); + + it('[TC_015] should verify whether the number of filters applied are shown into Filter button according to the keyword/Type/Sub community/Date range fields selected', async () => { + await ChallengeListingPageHelper.openFiltersPanel(); + await ChallengeListingPageHelper.selectKeyword('Java'); + await ChallengeListingPageHelper.selectType('Challenge'); + const subComunityClicked = await ChallengeListingPageHelper.selectSubCommunity(1); + let expectedFilterNumber = 3; + if (!subComunityClicked) expectedFilterNumber = 2; + await ChallengeListingPageHelper.verifyNumberOfAppliedFilters(expectedFilterNumber); + }); + + it('[TC_016] should verify whether the clear filter button clears all the filters selected and all the challenges are displayed', async () => { + await ChallengeListingPageHelper.openFiltersPanel(); + await ChallengeListingPageHelper.selectKeyword('Java'); + await ChallengeListingPageHelper.selectType('Challenge'); + const subComunityClicked = await ChallengeListingPageHelper.selectSubCommunity(1); + let expectedFilterNumber = 3; + if (!subComunityClicked) expectedFilterNumber = 2; + await ChallengeListingPageHelper.verifyNumberOfAppliedFilters(expectedFilterNumber); + await ChallengeListingPageHelper.clearFilters(); + await ChallengeListingPageHelper.verifyNumberOfAppliedFilters(0); + }); + + it('[TC_017] should verify whether the Clear filter button is deactivated into filter function', async () => { + await ChallengeListingPageHelper.openFiltersPanel(); + await ChallengeListingPageHelper.dropdownForKeywordIsDisplayed(); + await ChallengeListingPageHelper.dropdownForTypeIsDisplayed(); + await ChallengeListingPageHelper.dropdownForSubCommunityIsDisplayed(); + await ChallengeListingPageHelper.dropdownForDateRangeIsDisplayed(); + await ChallengeListingPageHelper.verifyClearFilterState(false); + }); + + it('[TC_018] should verify whether the Sort by select option under the Open for registration list sorts the challenges according to the selected option', async () => { + await ChallengeListingPageHelper.verifySortingFunctionality(); + }); + + it('[TC_019] should verify whether the View more challenges link under the Open for registration list displays all the Open for registration', async () => { + await ChallengeListingPageHelper.verifyViewMoreChallenges(); + }); + + it('[TC-020] should verify that when user selects a challenge "tag", only challenges under the selected tag are shown', async () => { + await ChallengeListingPageHelper.verifyChallengesByChallengeTag(); + }); + + it('[TC-021] should verify that the challenge count matches the number of challenges displayed', async () => { + await ChallengeListingPageHelper.verifyChallengeCountByTogglingDevelopment(); + }); + + it('[TC-022] should verify that the challenge count remains the same when switching to the challenge details and then back to the challenge listings page', async () => { + const beforeAllChallengesCount = await ChallengeListingPageHelper.getAllChallengesCount(); + const beforeOpenForRegistrationChallengesCount = await ChallengeListingPageHelper.getOpenForRegistrationChallengesCount(); + await ChallengeListingPageHelper.navigateToFirstChallenge(); + await ChallengeDetailPageHelper.clickOnBackButton(); + const afterAllChallengesCount = await ChallengeListingPageHelper.getAllChallengesCount(); + const afterOpenForRegistrationChallengesCount = await ChallengeListingPageHelper.getOpenForRegistrationChallengesCount(); + expect(beforeAllChallengesCount).toBe( + afterAllChallengesCount, + 'All challenge count is not same as before ' + ); + expect(beforeOpenForRegistrationChallengesCount).toBe( + afterOpenForRegistrationChallengesCount, + 'Open for registration challenge count is not same as before ' + ); + }); + + it('[TC-023] should verify All Challenges link functionality with the design, development, data science and QA toggle switches on', async () => { + await ChallengeListingPageHelper.verifyAllChallenges(); + await ChallengeListingPageHelper.verifyOpenForRegistrationChallengesOnly(); + await ChallengeListingPageHelper.verifyOpenForReviewChallengesOnly(); + }); + + it('[TC-024] should verify All Challenges link functionality with the design, development, data science and QA toggle switches Off', async () => { + await ChallengeListingPageHelper.verifyWithAllSwitchesTurnedOff(); + }); + + //Commented as the RSS Feed link is currently hidden + + /*it('[TC_025] should verify whether the page is redirected to the RSS Feed page on clicking the RSS feed link', async () => { + await ChallengeListingPageHelper.clickOnRssLink(); + await ChallengeListingPageHelper.verifyRssPage(); + });*/ + + // Commented as the links are hidden + /*it('[TC_026] should verify whether the page is redirected to the respective page on clicking the link(About, Contact, Help, Privacy, Terms)', async () => { + await ChallengeListingPageHelper.verifyLinksUnderRss(); + });*/ + }); + + /** + * Verifies all tests with login functionality + */ + describe('With Login tests', () => { + /** + * Sets up the browser and logs in + */ + beforeAll(async () => { + await LoginPageHelper.open(); + await LoginPageHelper.login( + ConfigHelper.getUserName(), + ConfigHelper.getPassword() + ); + }); + + /** + * Logs out + */ + afterAll(async () => { + try { + await LoginPageHelper.logout(); + } catch (e) { + await BrowserHelper.restart(); + } + }); + + /** + * Open challenge listing page + */ + beforeEach(async () => { + ChallengeListingPageHelper.initialize(); + HeaderHelper.initialize(); + await ChallengeListingPageHelper.open(); + }); + + it('[TC_028] should verify whether the current page is redirected to my profile page on clicking the my profile under the Username menu.', async () => { + await HeaderHelper.verifyUserMenuProfileLink(); + }); + + it('[TC_030] should verify whether the current page is redirected to the settings page on clicking the settings under the Username menu', async () => { + await HeaderHelper.verifyUserMenuSettingsLink(); + }); + + it('[TC_031] should verify whether the logout happens on clicking the logout under the Username menu', async () => { + await HeaderHelper.verifyUserMenuLogoutLink(); + }); + + it('[TC_032] should verify whether the user is able to search the member by their username/skill using the search icon', async () => { + await HeaderHelper.verifySearchByUsername(testData.search.username); + await ChallengeListingPageHelper.open(); + await HeaderHelper.verifySearchBySkill(testData.search.skill); + }); + + it('[TC_033] should verify whether all the my challenges, open for registration are listed on clicking the Challenge tab', async () => { + await ChallengeListingPageHelper.verifyChallengesAfterLogin(); + }); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-footer.spec.ts b/automated-smoke-test/test-suites/tc-footer.spec.ts new file mode 100644 index 0000000000..d585238c44 --- /dev/null +++ b/automated-smoke-test/test-suites/tc-footer.spec.ts @@ -0,0 +1,123 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { ConfigHelper } from '../utils/config-helper'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import { FooterHelper } from '../page-objects/pages/topcoder/footer/footer.helper'; + +describe('Topcoder Footer Tests: ', () => { + /** + * Sets up the browser + */ + beforeAll(async () => { + await BrowserHelper.initialize(); + await BrowserHelper.maximize(); + }); + + /** + * Verifies all tests without login functionality + */ + describe('Without Login tests', () => { + beforeEach(async () => { + FooterHelper.initialize(); + await FooterHelper.open(); + }); + + /** + * Verifies the links under 'COMPETE' section in footer are working correctly + */ + it('[TC_002] should verify that the links under Compete are working from the Footer', async () => { + await FooterHelper.verifyFooterSection('Compete', false); + }); + + /** + * Verifies the links under 'TRACKS' section in footer are working correctly + */ + it('[TC_003] should verify that the links under Tracks are working from the Footer', async () => { + await FooterHelper.verifyFooterSection('Tracks', false); + }); + + /** + * Verifies the links under 'COMMUNITY' section in footer are working correctly + */ + it('[TC_004] should verify that the links under Community are working from the Footer', async () => { + await FooterHelper.verifyFooterSection('Community', false); + }); + + /** + * Verifies the links under 'HELP CENTER' section in footer are working correctly + */ + it('[TC_005] should verify that the links under Help Center are working from the Footer', async () => { + await FooterHelper.verifyFooterSection('HelpCenter', false); + }); + + /** + * Verifies the links under 'ABOUT' section in footer are working correctly + */ + it('[TC_006] should verify that the links under About are working from the Footer', async () => { + await FooterHelper.verifyFooterSection('About', false); + }); + + /** + * Verifies the links under 'FOLLOW US' section in footer are working correctly + */ + it('[TC_007] should verify Footer social icons functionality', async () => { + await FooterHelper.verifySocialIcons(); + }); + + /** + * Verifies the Policies link + */ + it('[TC_008] should verify Policies link', async () => { + await FooterHelper.verifyPoliciesLink(); + }); + }); + + /** + * Verifies all tests with login as pre-requisite + */ + describe('With Login tests', () => { + /** + * logs in + */ + beforeAll(async () => { + await LoginPageHelper.open(); + await LoginPageHelper.login( + ConfigHelper.getUserName(), + ConfigHelper.getPassword() + ); + }); + + /** + * Logs out + */ + afterAll(async () => { + try { + await LoginPageHelper.logout(); + } catch (e) { + await BrowserHelper.restart(); + } + }); + + /** + * Initialize the ChallengeListingPage and turn off angular synchronization + */ + beforeEach(async () => { + FooterHelper.initialize(); + await FooterHelper.open(); + }); + + // At present only the Compete and Community section links behave differently for logged in users + /** + * Verifies the links under 'COMPETE' section in footer are working correctly + */ + it('should verify that the links under Compete are working from the Footer', async () => { + await FooterHelper.verifyFooterSection('Compete', true); + }); + + /** + * Verifies the links under 'COMMUNITY' section in footer are working correctly + */ + it('should verify that the links under Community are working from the Footer', async () => { + await FooterHelper.verifyFooterSection('Community', true); + }); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-header.spec.ts b/automated-smoke-test/test-suites/tc-header.spec.ts new file mode 100644 index 0000000000..9369f6e9e1 --- /dev/null +++ b/automated-smoke-test/test-suites/tc-header.spec.ts @@ -0,0 +1,214 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import * as testData from '../test-data/test-data.json'; +import { ConfigHelper } from '../utils/config-helper'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import { HeaderHelper } from '../page-objects/pages/topcoder/header/header.helper'; + +describe('Topcoder Header Tests: ', () => { + /** + * Sets up the browser + */ + beforeAll(async () => { + await BrowserHelper.initialize(); + await BrowserHelper.maximize(); + }); + + /** + * Verifies all tests without logging in + */ + describe('Without Login tests', () => { + beforeEach(async () => { + HeaderHelper.initialize(); + await HeaderHelper.open(false); + }); + + /** + * Verifies the functionality of clicking on topcoder logo in header + */ + it('[TC_001] should check the logo link functionality', async () => { + await HeaderHelper.verifyLogoLink(false); + }); + + /** + * Verifies the functionality of clicking on BUSINESS link in header + */ + it('[TC_002] should check the business link functionality', async () => { + await HeaderHelper.verifyBusinessLink(); + }); + + /** + * Verifies the links under 'COMMUNITY' menu in header are working correctly + */ + it('[TC_003 - TC_005] should check Community menu functionality', async () => { + await HeaderHelper.verifyMenu('Community'); + }); + + /** + * Verifies the links under 'Compete' menu in header are working correctly + */ + it('[TC_006 - TC_010] should check Compete menu functionality', async () => { + await HeaderHelper.verifyMenu('Compete'); + }); + + /** + * Verifies the links under 'Tracks' menu in header are working correctly + */ + it('[TC_011 - TC_016] should check Tracks menu functionality', async () => { + await HeaderHelper.verifyMenu('Tracks'); + }); + + /** + * Verifies the links under 'Explore' menu in header are working correctly + */ + it('[TC_017 - TC_023] should check Explore menu functionality', async () => { + await HeaderHelper.verifyMenu('Explore'); + }); + + /** + * Verifies that the Login link in header is working correctly + */ + it('[TC_024] should check the Login button functionality', async () => { + await HeaderHelper.verifyLoginLink(); + }); + + /** + * Verifies that user is able to search by username/skill using the search bar + */ + it('[TC_025] should verify whether the user is able to search the member by their username/skill using the search icon.', async () => { + await HeaderHelper.verifySearchByUsername(testData.search.username); + await HeaderHelper.open(false); + await HeaderHelper.verifySearchBySkill(testData.search.skill); + }); + }); + + describe('With Login tests', () => { + /** + * Logs in + */ + beforeAll(async () => { + await LoginPageHelper.open(); + await LoginPageHelper.login( + ConfigHelper.getUserName(), + ConfigHelper.getPassword() + ); + }); + + /** + * Logs out + */ + afterAll(async () => { + try { + await LoginPageHelper.logout(); + } catch (e) { + await BrowserHelper.restart(); + } + }); + + /** + * Open overview page + */ + beforeEach(async () => { + HeaderHelper.initialize(); + await HeaderHelper.open(true); + }); + + /** + * Verifies the functionality of clicking on topcoder logo in header + */ + it('[TC_026] should check the logo link functionality', async () => { + await HeaderHelper.verifyLogoLink(true); + }); + + /** + * Verifies the functionality of clicking on BUSINESS link in header + */ + it('[TC_027] should check the business link functionality', async () => { + await HeaderHelper.verifyBusinessLink(); + }); + + /** + * Verifies the links under 'COMMUNITY' menu in header are working correctly + */ + it('[TC_028 - TC_031] should check Community menu functionality', async () => { + await HeaderHelper.verifyMenu('Community', true); + }); + + /** + * Verifies the links under 'Compete' menu in header are working correctly + */ + it('[TC_032 - TC_036] should check Compete menu functionality', async () => { + await HeaderHelper.verifyMenu('Compete', true); + }); + + /** + * Verifies the links under 'Tracks' menu in header are working correctly + */ + it('[TC_037 - TC_042] should check Tracks menu functionality', async () => { + await HeaderHelper.verifyMenu('Tracks', true); + }); + + /** + * Verifies the links under 'Explore' menu in header are working correctly + */ + it('[TC_043 - TC_049] should check Explore menu functionality', async () => { + await HeaderHelper.verifyMenu('Explore', true); + }); + + /** + * Verifies that notifications popup is opening correctly + */ + it('[TC_050] should verify that Bell icon opens the notifications popup', async () => { + await HeaderHelper.verifyNotificationPopup(); + }); + + /** + * Verifies the 'View All Notifications' link inside notifications menu + */ + it('[TC_051] should verify that View All Notifictaions Link opens the Notifications page', async () => { + await HeaderHelper.verifyAllNotificationsLink(); + }); + + /** + * Verifies the user info section link in avatar user menu + */ + it('[TC_052] should verify that clicking inside the user info section directs user to profile page', async () => { + await HeaderHelper.verifyUserMenuProfileLink(); + }); + + /** + * Verifies the 'SWITCH TO BUSINESS' link in avatar user menu + */ + it('[TC_053] should verify that clicking Switch To Business link directs user to topcoder home page', async () => { + await HeaderHelper.verifyUserMenuBusinessLink(); + }); + + /** + * Verifies the 'Settings' link in avatar user menu + */ + it('[TC_054] should verify that clicking Settings link directs user to settings page', async () => { + await HeaderHelper.verifyUserMenuSettingsLink(); + }); + + /** + * Verifies the 'Help' link in avatar user menu + */ + it('[TC_055] should verify that clicking Help link directs user to help page', async () => { + await HeaderHelper.verifyUserMenuHelpLink(); + }); + + /** + * Verifies the 'Log Out' link in avatar user menu + */ + it('[TC_056] should verify that clicking Logout button logouts the user from topcoder', async () => { + await HeaderHelper.verifyUserMenuLogoutLink(); + }); + + /** + * Verifies that user is able to search by username/skill using the search bar + */ + it('[TC_057] should verify whether the user is able to search the member by their username/skill using the search icon.', async () => { + await HeaderHelper.verifySearchByUsername(testData.search.username); + await HeaderHelper.verifySearchBySkill(testData.search.skill); + }); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-login.spec.ts b/automated-smoke-test/test-suites/tc-login.spec.ts new file mode 100644 index 0000000000..30c3c941ae --- /dev/null +++ b/automated-smoke-test/test-suites/tc-login.spec.ts @@ -0,0 +1,61 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import * as testData from '../test-data/test-data.json'; +import { ConfigHelper } from '../utils/config-helper'; + +describe('Topcoder Login Page Tests: ', () => { + /** + * Sets up browser login page + */ + beforeEach(async () => { + await BrowserHelper.initialize(); + await LoginPageHelper.open(); + }); + + /** + * Restarts browser + */ + afterEach(async () => { + await BrowserHelper.restart(); + }); + + /** + * Verifies User can login using valid credentials + */ + it('[TC_001] should Verify User can login using valid credentials', async () => { + const username = ConfigHelper.getUserName(); + const password = ConfigHelper.getPassword(); + await LoginPageHelper.verifyLogin(username, password); + }); + + /** + * Verifies User cannot login using invalid username + */ + it('[TC_002] should Verify User cannot login using invalid username', async () => { + const invalidUsername = testData.login.invalidUsername; + const password = ConfigHelper.getPassword(); + await LoginPageHelper.verifyLoginWithInvalidUserName( + invalidUsername, + password + ); + }); + + /** + * Verifies User cannot login using invalid password + */ + it('[TC_003] should Verify User cannot login using invalid password', async () => { + const username = ConfigHelper.getUserName(); + const inavlidPassword = testData.login.invalidPassword; + await LoginPageHelper.verifyLoginWithInvalidPassword( + username, + inavlidPassword + ); + }); + + /** + * Verifies User can logout + */ + it('[TC_004] should Verify User can logout', async () => { + await LoginPageHelper.verifyLogout(); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-member-profile.spec.ts b/automated-smoke-test/test-suites/tc-member-profile.spec.ts new file mode 100644 index 0000000000..94b29b58fe --- /dev/null +++ b/automated-smoke-test/test-suites/tc-member-profile.spec.ts @@ -0,0 +1,51 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { MemberProfilePageHelper } from '../page-objects/pages/topcoder/member-profile-page/member-profile.helper'; + +describe('Topcoder Member Profile Page Tests:', () => { + /** + * Sets up browser + */ + beforeEach(async () => { + await BrowserHelper.initialize(); + await BrowserHelper.maximize(); + }); + + it('[TC_001] should check that member profile card display', async () => { + await MemberProfilePageHelper.openMemberPage(); + await MemberProfilePageHelper.verifyMemberDetailsAreCorrect(); + }); + + it('[TC_002] should check that skills display', async () => { + await MemberProfilePageHelper.openMemberPage(); + await MemberProfilePageHelper.verifySkillsAreCorrect(); + }); + + it('[TC_003] should check the copilot activity section', async () => { + await MemberProfilePageHelper.openCopilotMemberPage(); + await MemberProfilePageHelper.verifyCopilotFullfillmentIsCorrect(); + await MemberProfilePageHelper.verifyClickingOnCopilotSubtrackCard(); + }); + + it('[TC_004] should check the development activity section', async () => { + await MemberProfilePageHelper.openDevelopmentMemberPage(); + await MemberProfilePageHelper.verifyDevelopmentSubtrackIsCorrect(); + await MemberProfilePageHelper.verifyClickingOnDevelopmentSubtrackCard(); + }); + + it('[TC_005] should check the design activity section', async () => { + await MemberProfilePageHelper.openDesignMemberPage(); + await MemberProfilePageHelper.verifyDesignSubtrackIsCorrect(); + await MemberProfilePageHelper.verifyClickingOnDesignSubtrackCard(); + }); + + it('[TC_006] should check the data science activity section', async () => { + await MemberProfilePageHelper.openDataScienceMemberPage(); + await MemberProfilePageHelper.verifyDataScienceSubtrackIsCorrect(); + await MemberProfilePageHelper.verifyClickingOnDataScienceSubtrackCard(); + }); + + it('[TC_007] should check the on the web section', async () => { + await MemberProfilePageHelper.openMemberHaveWebSectionProfilePage(); + await MemberProfilePageHelper.verifyWebSectionShowCorrectWeblink(); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-my-dashboard.spec.ts b/automated-smoke-test/test-suites/tc-my-dashboard.spec.ts new file mode 100644 index 0000000000..72887e74d3 --- /dev/null +++ b/automated-smoke-test/test-suites/tc-my-dashboard.spec.ts @@ -0,0 +1,53 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import { ConfigHelper } from '../utils/config-helper'; +import { MyDashboardPageHelper } from '../page-objects/pages/topcoder/my-dashboard-page/my-dashboard.helper'; + +describe('Topcoder My Dashboard Page Tests:', () => { + /** + * Sets up the browser and logs in + */ + beforeAll(async () => { + await BrowserHelper.initialize(); + await BrowserHelper.maximize(); + await LoginPageHelper.open(); + await LoginPageHelper.login( + ConfigHelper.getUserName(), + ConfigHelper.getPassword() + ); + }); + + /** + * Logs out + */ + afterAll(async () => { + try { + await LoginPageHelper.logout(); + } catch (e) { + await BrowserHelper.restart(); + } + }); + + /** + * Go to my dashboard page + */ + beforeEach(async () => { + await MyDashboardPageHelper.open(); + }); + + it('[TC_002] should check my active challenges tab', async () => { + await MyDashboardPageHelper.checkIfTabIsActive('My Active Challenge'); + await MyDashboardPageHelper.checkChallengeCardIsDisplayed(); + }); + + it('[TC_003] should check my communities tab', async () => { + await MyDashboardPageHelper.selectTab('My Communities'); + await MyDashboardPageHelper.verifyUserCommunitiesAreDisplayed(); + await MyDashboardPageHelper.verifyLearnMoreLink(); + }); + + it('[TC_003] should check my SRMs tab', async () => { + await MyDashboardPageHelper.selectTab('SRMs'); + await MyDashboardPageHelper.verifySRMTabIsDisplayed(); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-preferences.spec.ts b/automated-smoke-test/test-suites/tc-preferences.spec.ts new file mode 100644 index 0000000000..167496cbb8 --- /dev/null +++ b/automated-smoke-test/test-suites/tc-preferences.spec.ts @@ -0,0 +1,58 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import { ConfigHelper } from '../utils/config-helper'; +import { ForumPageHelper } from '../page-objects/pages/topcoder/settings/preferences/forum/forum.helper'; +import { PaymentPageHelper } from '../page-objects/pages/topcoder/settings/preferences/payment/payment.helper'; +import { EmailPreferencesPageHelper } from '../page-objects/pages/topcoder/settings/preferences/email/email.helper'; +import * as testData from '../test-data/test-data.json'; + +describe('Topcoder Preferences Page Tests: ', () => { + /** + * Sets up the browser and logs in + */ + beforeAll(async () => { + await BrowserHelper.initialize(); + await LoginPageHelper.open(); + await LoginPageHelper.login( + ConfigHelper.getUserName(), + ConfigHelper.getPassword() + ); + }); + + /** + * Logs out + */ + afterAll(async () => { + try { + await LoginPageHelper.logout(); + } catch (e) { + await BrowserHelper.restart(); + } + }); + + /** + * Verifies that user is able to update their email preferences + */ + it('[TC_001] should verify User can update their email preferences', async () => { + await EmailPreferencesPageHelper.open(); + await EmailPreferencesPageHelper.verifyUpdatePreferences( + testData.preferences.email + ); + }); + + /** + * Verifies that user is redirected to the forum settings page on switching to the Forum tab + */ + it("[TC_002] should verify User can redirect to forums's setting page", async () => { + await ForumPageHelper.open(); + await ForumPageHelper.verifyForumSetting(); + }); + + /** + * Verifies that user is redirected to the payment settings page on switching to the Payment tab + */ + it('[TC_003] should verify User can redirect to payment setting page', async () => { + await PaymentPageHelper.open(); + await PaymentPageHelper.verifyPaymentSetting(); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-profile.spec.ts b/automated-smoke-test/test-suites/tc-profile.spec.ts new file mode 100644 index 0000000000..9195ac7d6d --- /dev/null +++ b/automated-smoke-test/test-suites/tc-profile.spec.ts @@ -0,0 +1,122 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import { ConfigHelper } from '../utils/config-helper'; +import * as testData from '../test-data/test-data.json'; +import { BasicInfoPageHelper } from '../page-objects/pages/topcoder/settings/profile/basic-info/basic-info.helper'; +import { LanguagePageHelper } from '../page-objects/pages/topcoder/settings/profile/language/language.helper'; +import { EducationPageHelper } from '../page-objects/pages/topcoder/settings/profile/education/education.helper'; +import { WorkPageHelper } from '../page-objects/pages/topcoder/settings/profile/work/work.helper'; +import { SkillPageHelper } from '../page-objects/pages/topcoder/settings/profile/skills/skill.helper'; +import { HobbyPageHelper } from '../page-objects/pages/topcoder/settings/profile/hobbies/hobby.helper'; +import { CommunityPageHelper } from '../page-objects/pages/topcoder/settings/profile/communities/community.helper'; + +describe('Topcoder Profile Settings Page Tests: ', () => { + /** + * Sets up the browser and logs in + */ + beforeAll(async () => { + await BrowserHelper.initialize(); + await LoginPageHelper.open(); + await LoginPageHelper.login( + ConfigHelper.getUserName(), + ConfigHelper.getPassword() + ); + }); + + /** + * Logs out + */ + afterAll(async () => { + try { + await LoginPageHelper.logout(); + } catch (e) { + await BrowserHelper.restart(); + } + }); + + /** + * Verifies that user can update his basic information + */ + it('[TC_001] should verify whether the current user can update basic information', async () => { + await BasicInfoPageHelper.open(); + await BasicInfoPageHelper.verifyBasicInfoUpdate(testData.profile); + }); + + /** + * Verifies Add/Update/Delete language functionality + */ + it('[TC_002] should verify User can Add/Update/Delete language', async () => { + await LanguagePageHelper.open(); + await LanguagePageHelper.deleteAll(); + await LanguagePageHelper.verifyAddLanguage(testData.profile.language); + await LanguagePageHelper.verifyEditLanguage( + testData.profile.language, + testData.profile.newLanguage + ); + await LanguagePageHelper.verifyDeleteLanguage(testData.profile.newLanguage); + }); + + /** + * Verifies Add/Update/Delete education functionality + */ + + it('[TC_003] should verify User can Add/Update/Delete Education', async () => { + await EducationPageHelper.open(); + await EducationPageHelper.deleteAll(); + await EducationPageHelper.verifyAddEducation(testData.profile.education); + await EducationPageHelper.verifyEditEducation( + testData.profile.education, + testData.profile.newEducation + ); + await EducationPageHelper.verifyDeleteEducation( + testData.profile.newEducation + ); + }); + + /** + * Verifies Add/Update/Delete work functionality + */ + it('[TC_004] should verify User can Add/Update/Delete work ', async () => { + await WorkPageHelper.open(); + await WorkPageHelper.deleteAll(); + await WorkPageHelper.verifyAddWork(testData.profile.work); + await WorkPageHelper.verifyEditWork( + testData.profile.work, + testData.profile.newWork + ); + await WorkPageHelper.verifyDeleteWork(testData.profile.newWork); + }); + + /** + * Verifies Add/Update/Delete skill functionality + */ + it('[TC_005] should verify User can Add/Delete skill.', async () => { + await SkillPageHelper.open(); + await SkillPageHelper.deleteAll(); + await SkillPageHelper.verifyAddSkill(testData.profile.skill); + await SkillPageHelper.verifyDeleteSkill(testData.profile.skill); + }); + + /** + * Verifies Add/Update/Delete hobby functionality + */ + it('[TC_006] should verify User can Add/Update/Delete hobbies ', async () => { + await HobbyPageHelper.open(); + await HobbyPageHelper.deleteAll(); + await HobbyPageHelper.verifyAddHobby(testData.profile.hobby); + await HobbyPageHelper.verifyEditHobby( + testData.profile.hobby, + testData.profile.newHobby + ); + await HobbyPageHelper.verifyDeleteHobby(testData.profile.newHobby); + }); + + /** + * Verifies user can update blockchain/cognitive community + */ + it('[TC_007] should verify User can update the community.', async () => { + await CommunityPageHelper.open(); + await CommunityPageHelper.disableAll(); + await CommunityPageHelper.verifyUpdateCommunity(testData.profile.community); + }); +}); diff --git a/automated-smoke-test/test-suites/tc-tools.spec.ts b/automated-smoke-test/test-suites/tc-tools.spec.ts new file mode 100644 index 0000000000..0b9fc21d6b --- /dev/null +++ b/automated-smoke-test/test-suites/tc-tools.spec.ts @@ -0,0 +1,98 @@ +import { BrowserHelper } from 'topcoder-testing-lib'; +import { LoginPageHelper } from '../page-objects/pages/topcoder/login/login.helper'; +import * as testData from '../test-data/test-data.json'; +import { ConfigHelper } from '../utils/config-helper'; +import { DevicePageHelper } from '../page-objects/pages/topcoder/settings/tools/devices/device.helper'; +import { SoftwarePageHelper } from '../page-objects/pages/topcoder/settings/tools/softwares/software.helper'; +import { ServiceProviderPageHelper } from '../page-objects/pages/topcoder/settings/tools/service-providers/service-provider.helper'; +import { SubscriptionsPageHelper } from '../page-objects/pages/topcoder/settings/tools/subscriptions/subscriptions.helper'; + +describe('Topcoder Tools Page Tests: ', () => { + /** + * Sets up the browser and logs in + */ + beforeAll(async () => { + await BrowserHelper.initialize(); + await BrowserHelper.maximize(); + await LoginPageHelper.open(); + await LoginPageHelper.login( + ConfigHelper.getUserName(), + ConfigHelper.getPassword() + ); + }); + + /** + * Logs out + */ + afterAll(async () => { + try { + await LoginPageHelper.logout(); + } catch (e) { + await BrowserHelper.restart(); + } + }); + + /** + * Verifies Add/Update/Delete Device functionality + */ + it('[TC_001] should Verify User can Add/Update/Delete Device', async () => { + await DevicePageHelper.open(); + await DevicePageHelper.deleteAll(); + await DevicePageHelper.verifyAddDevice(testData.tools.device); + await DevicePageHelper.verifyEditDevice( + testData.tools.device, + testData.tools.newDevice + ); + await DevicePageHelper.verifyDeleteDevice(testData.tools.newDevice); + }); + + /** + * Verifies Add/Update/Delete Software functionality + */ + it('[TC_002] should Verify User can Add/Update/Delete Software', async () => { + await SoftwarePageHelper.open(); + await SoftwarePageHelper.deleteAll(); + await SoftwarePageHelper.verifyAddSoftware(testData.tools.software); + await SoftwarePageHelper.verifyEditSoftware( + testData.tools.software, + testData.tools.newSoftware + ); + await SoftwarePageHelper.verifyDeleteSoftware(testData.tools.newSoftware); + }); + + /** + * Verifies Add/Update/Delete Service Provider functionality + */ + it('[TC_003] should Verify User can Add/Update/Delete Service Provider', async () => { + await ServiceProviderPageHelper.open(); + await ServiceProviderPageHelper.deleteAll(); + await ServiceProviderPageHelper.verifyAddServiceProvider( + testData.tools.serviceProvider + ); + await ServiceProviderPageHelper.verifyEditServiceProvider( + testData.tools.serviceProvider, + testData.tools.newServiceProvider + ); + await ServiceProviderPageHelper.verifyDeleteServiceProvider( + testData.tools.newServiceProvider + ); + }); + + /** + * Verifies Add/Update/Delete Subscriptions functionalty + */ + it('[TC_004] should Verify User can Add/Update/Delete Subscriptions', async () => { + await SubscriptionsPageHelper.open(); + await SubscriptionsPageHelper.deleteAll(); + await SubscriptionsPageHelper.verifyAddSubscription( + testData.tools.subscription + ); + await SubscriptionsPageHelper.verifyEditSubscription( + testData.tools.subscription, + testData.tools.newSubscription + ); + await SubscriptionsPageHelper.verifyDeleteSubscription( + testData.tools.newSubscription + ); + }); +}); diff --git a/automated-smoke-test/testquality-linux b/automated-smoke-test/testquality-linux new file mode 100644 index 0000000000..7f0c4567cd Binary files /dev/null and b/automated-smoke-test/testquality-linux differ diff --git a/automated-smoke-test/testrun.sh b/automated-smoke-test/testrun.sh new file mode 100755 index 0000000000..4140ab7b9d --- /dev/null +++ b/automated-smoke-test/testrun.sh @@ -0,0 +1,23 @@ +#!/bin/bash +./node_modules/.bin/webdriver-manager start --detach +npm run test +#get user name and passwrod from config file for test quality app +# env=$(cat config.json | jq -r '.env') +# planName="Automate Execution-"$env +# email=$(cat config_update.json | jq '.testQualityEmail') +# password=$(cat config_update.json | jq '.testQualityPassword') +# sudo chmod 755 testquality-linux +# ./testquality-linux login ${email} ${password} --save +# ./testquality-linux upload_test_run test-results/junitresults-TopcoderLoginPageTests.xml --project_name='POC Automation Framework' --plan_name="'$planName'" +# ./testquality-linux upload_test_run test-results/junitresults-TopcoderToolsPageTests.xml --project_name='POC Automation Framework' --plan_name="'$planName'" +# ./testquality-linux upload_test_run test-results/junitresults-TopcoderAccountPageTests.xml --project_name='POC Automation Framework' --plan_name="'$planName'" +# ./testquality-linux upload_test_run test-results/junitresults-TopcoderFooterTests.xml --project_name='POC Automation Framework' --plan_name="'$planName'" +# ./testquality-linux upload_test_run test-results/junitresults-TopcoderHeaderTests.xml --project_name='POC Automation Framework' --plan_name="'$planName'" +# ./testquality-linux upload_test_run test-results/junitresults-TopcoderPreferencesPageTests.xml --project_name='POC Automation Framework' --plan_name="'$planName'" +# ./testquality-linux upload_test_run test-results/junitresults-junitresults-TopcoderProfileSettingsPageTests.xml --project_name='POC Automation Framework' --plan_name="'$planName'" + +if [ $? -eq 0 ]; then + echo "Test case successfully completed" +else + echo "Test case Failed" +fi diff --git a/automated-smoke-test/tsconfig.json b/automated-smoke-test/tsconfig.json new file mode 100644 index 0000000000..b8f26e010d --- /dev/null +++ b/automated-smoke-test/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["es5", "es6", "dom"], + "plugins": [ + { + "name": "typescript-tslint-plugin", + "alwaysShowRuleFailuresAsWarnings": false, + "ignoreDefinitionFiles": true, + "configFile": "./tslint.json", + "suppressWhileTypeErrorsPresent": false + } + ], + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": false, + "inlineSourceMap": true, + "declaration": false, + "removeComments": false, + "noImplicitAny": false, + "outDir": "temp", + "types": ["jasmine", "node"], + "resolveJsonModule": true, + "skipLibCheck": true + }, + "exclude": ["node_modules"] +} diff --git a/automated-smoke-test/tslint.json b/automated-smoke-test/tslint.json new file mode 100644 index 0000000000..f28b04eb3b --- /dev/null +++ b/automated-smoke-test/tslint.json @@ -0,0 +1,3 @@ +{ + "extends": ["tslint:latest", "tslint-config-prettier"] +} diff --git a/automated-smoke-test/utils/config-helper.ts b/automated-smoke-test/utils/config-helper.ts new file mode 100644 index 0000000000..1804ee0681 --- /dev/null +++ b/automated-smoke-test/utils/config-helper.ts @@ -0,0 +1,313 @@ +import * as config from '../config/config.json'; +import { TcElementImpl } from 'topcoder-testing-lib/dist/src/tc-element-impl'; + +export interface ChallengeLinks { + rssFeedUrl: string; + aboutUrl: string; + contactUrl: string; + helpUrl: string; + privacyUrl: string; + termsUrl: string; +} + +export interface ChallengeDetail { + rssFeedUrl: string; + url: string; + termsLinkText: string; + challengeName: string; + challengeTag: string; + termUrl: string; + forumUrl: string; + submissionUrl: string; + scorecardUrl: string; +} + +export interface CommunityCardInfo { + name: string; + learnMoreUrl: string; +} + +export interface ChallengeCardInfo { + name: string; + currentPhase: string; + linkToSubmit: string; + userRole: string; +} + +export interface MyDashboardConfig { + url: string; + challenge: ChallengeCardInfo; + community: CommunityCardInfo; +} + +export interface MemberHaveWebSectionInfoConfig { + handle: string; + webLink: string; +} + +export interface MemberProfileInfoConfig { + handle: string; + numberOfCollapsedSkills: number; + verifiedSkill?: string; + noneVerifiedSkill?: string; + country: string; + memberSince: string; + tracks: string[]; + quote: string; + forumLink: string; +} + +export interface MemberProfileSubtrackConfig { + name: string; + link?: string; + info?: string; + infoTitle?: string; + card?: TcElementImpl; +} + +export interface MemberProfileTrackConfig { + handle: string; + trackName: string; + numberOfSubtracks: number; + winInfo?: MemberProfileSubtrackConfig; + fullfillmentInfo?: MemberProfileSubtrackConfig; + ratingInfo?: MemberProfileSubtrackConfig; +} + +export interface MemberProfileConfig { + url: string; + profileInfo: MemberProfileInfoConfig; + copilotProfile: MemberProfileTrackConfig; + designProfile: MemberProfileTrackConfig; + developmentProfile: MemberProfileTrackConfig; + dataScienceProfile: MemberProfileTrackConfig; + memberHaveWebSectionInfo: MemberHaveWebSectionInfoConfig; +} + +export const ConfigHelper = { + /** + * Get current config + */ + getConfig() { + return config; + }, + + /** + * Gets the url on redirection after clicking the header logo + */ + getLogoRedirectionUrl() { + return this.getConfig().logoRedirectionUrl; + }, + + /** + * Gets the url on redirection after clicking the business link + */ + getBusinessUrl() { + return this.getConfig().businessUrl; + }, + + /** + * Gets the url on redirection after clicking the Switch To business link + */ + getSwitchToBusinessUrl() { + return this.getConfig().switchToBusinessUrl; + }, + + /** + * Gets the policies url + */ + getPoliciesUrl() { + return this.getConfig().policiesUrl; + }, + + /** + * Get login URL + */ + getLoginUrl() { + return this.getConfig().loginUrl; + }, + + /** + * Get Redirected login URL + */ + getRedirectLoginUrl() { + return this.getConfig().redirectLoginUrl; + }, + + /** + * Get homepage URL + */ + getHomePageUrl(): string { + return this.getConfig().homePageUrl; + }, + + /** + * Get logout URL + */ + getLogoutUrl() { + return this.getConfig().logoutUrl; + }, + + /** + * Get tools URL + */ + getToolsUrl() { + return this.getConfig().toolsUrl; + }, + + /** + * Get account URL + */ + getAccountUrl() { + return this.getConfig().accountUrl; + }, + + /** + * Get profile URL + */ + getProfileUrl() { + return this.getConfig().profileUrl; + }, + + /** + * Get challenge listing URL + */ + getChallengeListingUrl() { + return this.getConfig().challengeListingUrl; + }, + + /** + * Get splash listing URL + */ + getSplashPageUrl() { + return this.getConfig().splashPageUrl; + }, + + /** + * Get Username + */ + getUserName() { + return this.getConfig().username; + }, + + /** + * Gets the sub-menu url given the sub-menu name + * @param name + * @param isLoggedIn + */ + getSubMenuUrl(name, isLoggedIn) { + let menu = null; + if (isLoggedIn) { + menu = this.getConfig().subMenuUrlsAfterLogin[name]; + } + return menu || this.getConfig().subMenuUrls[name]; + }, + + /** + * Gets the footer url given the footer link name + * @param name + */ + getFooterLink(name) { + let link = null; + return link || this.getConfig().footerLinks[name]; + }, + + /** + * Gets the social media url given the social media + * @param socialMedia + */ + getSocialLink(socialMedia) { + return this.getConfig().socialLinks[socialMedia]; + }, + + /** + * Gets the preferences url + */ + getPreferencesUrl() { + return this.getConfig().preferencesUrl; + }, + + /** + * Gets the forum settings url + */ + getForumSettingUrl() { + return this.getConfig().forumSettingUrl; + }, + + /** + * Get the payment settings url + */ + getPaymentSettingUrl() { + return this.getConfig().paymentSettingUrl; + }, + + /** + * Gets the help page url + */ + getHelpUrl() { + return this.getConfig().helpUrl; + }, + + /** + * Gets the help page url + */ + getOverviewUrl() { + return this.getConfig().subMenuUrls['overview']; + }, + + /** + * Gets the search page url + */ + getSearchUrl() { + return this.getConfig().searchUrl; + }, + + /** + * Gets the notifications page url + */ + getAllNotificationsUrl() { + return this.getConfig().allNotificationsUrl; + }, + + /** + * Get Password + */ + getPassword() { + return this.getConfig().password; + }, + + /** + * Get Email + */ + getEmail() { + return this.getConfig().email; + }, + + /** + * Gets challenges link + */ + getChallangesLinks(): ChallengeLinks { + return this.getConfig().challangesLinks; + }, + + /** + * Gets challenge detail + */ + getChallengeDetail(): ChallengeDetail { + return this.getConfig().challengeDetail; + }, + + /** + * Get my dashboard config + */ + getMyDashboardConfig(): MyDashboardConfig { + return this.getConfig().myDashboard; + }, + + /** + * Get member profile config + */ + getMemberProfileConfig(): MemberProfileConfig { + return this.getConfig().memberProfile; + }, +}; diff --git a/package-lock.json b/package-lock.json index 84a69eb12d..1e5adfca69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14701,10326 +14701,57 @@ "topcoder-react-utils": "0.7.9" }, "dependencies": { - "auth0-js": { - "version": "6.8.4", - "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-6.8.4.tgz", - "integrity": "sha1-Qw3Uystk2NFdabHmIRhPmipkCmE=", - "requires": { - "Base64": "0.1.4", - "json-fallback": "0.0.1", - "jsonp": "0.0.4", - "reqwest": "1.1.6", - "trim": "0.0.1", - "winchan": "0.1.4", - "xtend": "2.1.2" - }, - "dependencies": { - "qs": { - "version": "git+https://github.com/jfromaniello/node-querystring.git#5d96513991635e3e22d7aa54a8584d6ce97cace8" - } - } - }, - "axios": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.12.0.tgz", - "integrity": "sha1-uQewIhzDTsHJ+sGOx/B935V4W6Q=", - "requires": { - "follow-redirects": "0.0.7" - } - }, - "config": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/config/-/config-3.3.1.tgz", - "integrity": "sha512-+2/KaaaAzdwUBE3jgZON11L1ggLLhpf2FsGrfqYFHZW22ySGv/HqYIXrBwKKvn+XZh1UBUjHwAcrfsSkSygT+Q==", - "requires": { - "json5": "2.1.3" - } - }, - "follow-redirects": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz", - "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=", - "requires": { - "debug": "2.6.9", - "stream-consume": "0.1.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "16.13.1" - } - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "requires": { - "minimist": "1.2.5" - } - }, - "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - }, - "react-redux": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-6.0.1.tgz", - "integrity": "sha512-T52I52Kxhbqy/6TEfBv85rQSDz6+Y28V/pf52vDWs1YRXG19mcFOGfHnY2HsNFHyhP+ST34Aih98fvt6tqwVcQ==", - "requires": { - "@babel/runtime": "7.9.6", - "hoist-non-react-statics": "3.3.2", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "prop-types": "15.7.2", - "react-is": "16.13.1" - } - }, - "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==", - "requires": { - "inherits": "2.0.3", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "redux": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", - "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", - "requires": { - "loose-envify": "1.4.0", - "symbol-observable": "1.2.0" - } - }, - "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" - }, - "serialize-javascript": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", - "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" - }, - "tc-accounts": { - "version": "git+https://github.com/appirio-tech/accounts-app.git#9d0daa189dbf5127ad6ca470ed1683eeb2495ac7", - "requires": { - "@uirouter/angularjs": "1.0.18", - "angucomplete-alt": "2.5.0", - "angular": "1.7.2", - "angular-auth0": "3.0.0", - "angular-cookies": "1.7.2", - "angular-messages": "1.7.2", - "appirio-tech-ng-iso-constants": "github:appirio-tech/ng-iso-constants#d54359ed9b99c0c477541059bcd2f73ad8d3f2f0", - "appirio-tech-ng-ui-components": "2.2.5", - "appirio-tech-react-components": "github:appirio-tech/react-components#97ba97c96d73ed5985c4d2800e967eb418555e74", - "auth0-js": "9.6.1", - "babel-polyfill": "6.26.0", - "filestack-js": "1.14.6", - "isomorphic-fetch": "2.2.1", - "lodash": "4.17.10", - "ng-onload": "0.2.1", - "prop-types": "15.6.2", - "rc-slider": "8.6.2", - "react": "15.6.2", - "react-dom": "15.6.2", - "react2angular": "4.0.4" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.3.tgz", - "integrity": "sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA==", - "requires": { - "regenerator-runtime": "0.13.3" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" - } - } - }, - "@types/angular": { - "version": "1.6.50", - "resolved": "https://registry.npmjs.org/@types/angular/-/angular-1.6.50.tgz", - "integrity": "sha512-D3KB0PdaxdwtA44yOpK+NtptTscKWgUzXmf8fiLaaVxnX+b7QQ+dUMsyeVDweCQ6VX4PMwkd6x2hJ0X+ISIsoQ==" - }, - "@types/lodash": { - "version": "4.14.116", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", - "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==" - }, - "@types/lodash.frompairs": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/lodash.frompairs/-/lodash.frompairs-4.0.4.tgz", - "integrity": "sha512-u/Ifsrh5yJ3j4DJ+sHiWeORyeQhDpSlVmdLqb4Z27pB0Vkp6ECw24mBEY0KxRXDi1Hy/NqVL7Cq3vqNEddQgcA==", - "requires": { - "@types/lodash": "4.14.116" - } - }, - "@uirouter/angularjs": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.18.tgz", - "integrity": "sha512-tswhwMMBDnbGOZnnCVpnA0pbd7dXkBck1HO0WY7fw8GO3dKbWAAc/rL0479dLypR89UDDGym5leTvZCLW4cJnA==", - "requires": { - "@uirouter/core": "5.0.19" - } - }, - "@uirouter/core": { - "version": "5.0.19", - "resolved": "https://registry.npmjs.org/@uirouter/core/-/core-5.0.19.tgz", - "integrity": "sha512-wow+CKRThUAQkiTLNQCBsKQIU3NbH8GGH/w/TrcjKdvkZQA2jQB9QSqmmZxj7XNoZXY7QVcSSc4DWmxuSeAWmQ==" - }, - "Base64": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/Base64/-/Base64-0.1.4.tgz", - "integrity": "sha1-6fbGvvVn/WNepBYqsU3TKedKpt4=" - }, - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "requires": { - "mime-types": "2.1.18", - "negotiator": "0.6.1" - } - }, - "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==" - }, - "acorn-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", - "requires": { - "acorn": "2.7.0" - }, - "dependencies": { - "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" - } - } - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "requires": { - "acorn": "3.3.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - } - } - }, - "add-dom-event-listener": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.0.2.tgz", - "integrity": "sha1-j67SxBAIchzxEdodMNmVuFvkK+0=", - "requires": { - "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ajv-keywords": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", - "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=" - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "angucomplete-alt": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/angucomplete-alt/-/angucomplete-alt-2.5.0.tgz", - "integrity": "sha1-rsLmnVD7E7lCmgxP0oqPIYwGUEo=" - }, - "angular": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/angular/-/angular-1.7.2.tgz", - "integrity": "sha512-JcKKJbBdybUsmQ6x1M3xWyTYQ/ioVKJhSByEAjqrhmlOfvMFdhfMqAx5KIo8rLGk4DFolYPcCSgssjgTVjCtRQ==" - }, - "angular-auth0": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/angular-auth0/-/angular-auth0-3.0.0.tgz", - "integrity": "sha512-wU7CI0YybpHeKfrleUV/LK+0iVHZeWbrpwsj6d+kRUpHetPBdRMWcTsYNLcxFZ04esmIBgmuAyZ6qZSkJHsfpA==", - "requires": { - "angular": "1.7.2", - "auth0-js": "9.6.1" - } - }, - "angular-cookies": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/angular-cookies/-/angular-cookies-1.7.2.tgz", - "integrity": "sha512-5+B6ypV51aRPbQaqC2R5pr96q946C662dQC8QC1UL+cAlLkgkKZXXXzFRhiaEnhntkSnURWVCPasLVHQdZ3YgA==" - }, - "angular-messages": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/angular-messages/-/angular-messages-1.7.2.tgz", - "integrity": "sha512-hLBZAApHpemfTN3IsItSczrLVm+6sAIn9XRV5PEFKBmfqE1umAmPAeFByfy9DLebJyR17rcFQ5qMj/KZk0ZtBA==" - }, - "angular-mocks": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/angular-mocks/-/angular-mocks-1.7.2.tgz", - "integrity": "sha512-yj9eWPG0usXX2eDTWM6YOmAGKraT7qHwuD+NrNyaR+mtrNr2ls77WuWXTjE1hZpmxTaGj4+R1nMY696XZn740Q==" - }, - "angular-scroll": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/angular-scroll/-/angular-scroll-1.0.2.tgz", - "integrity": "sha1-J2j/NdvhzkDgw/vt1FNIiCmcPi0=" - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "appirio-styles": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/appirio-styles/-/appirio-styles-0.0.30.tgz", - "integrity": "sha1-VZx5umDjDW/2Ib2r+RvUeRTTzGE=", - "requires": { - "node-neat": "1.7.2" - } - }, - "appirio-tech-api-schemas": { - "version": "5.0.70", - "resolved": "https://registry.npmjs.org/appirio-tech-api-schemas/-/appirio-tech-api-schemas-5.0.70.tgz", - "integrity": "sha1-3RtCG/rw8PSokKRTgHSlVYDQy8s=", - "requires": { - "auto-config-fake-server": "2.0.604" - } - }, - "appirio-tech-client-app-layer": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/appirio-tech-client-app-layer/-/appirio-tech-client-app-layer-0.1.3.tgz", - "integrity": "sha1-uO5YdHMM2r209RE8NMQvwOsxoOs=", - "requires": { - "axios": "0.8.1", - "history": "1.17.0", - "html-webpack-plugin": "1.7.0", - "humps": "0.6.0", - "isomorphic-fetch": "2.2.1", - "jwt-decode": "1.5.1", - "lodash": "4.17.10", - "normalizr": "1.4.1", - "q": "1.5.1", - "react": "0.14.9", - "react-dom": "0.14.9", - "react-redux": "4.4.9", - "react-router": "1.0.3", - "redux": "3.7.2", - "redux-form": "4.2.2", - "redux-logger": "2.10.2", - "redux-router": "1.0.0", - "redux-thunk": "0.1.0" - }, - "dependencies": { - "clean-css": { - "version": "3.4.28", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", - "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", - "requires": { - "commander": "2.8.1", - "source-map": "0.4.4" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": "1.0.1" - } - } - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "concat-stream": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", - "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.0.6", - "typedarray": "0.0.6" - } - }, - "fbjs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.6.1.tgz", - "integrity": "sha1-lja3cF9bqWhNRLcveDISVK/IYPc=", - "requires": { - "core-js": "1.2.7", - "loose-envify": "1.3.1", - "promise": "7.3.1", - "ua-parser-js": "0.7.18", - "whatwg-fetch": "0.9.0" - } - }, - "he": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.0.0.tgz", - "integrity": "sha1-baWyZdfyw7XkgHSRaODhWdBXKNo=" - }, - "html-minifier": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-1.5.0.tgz", - "integrity": "sha1-vrBf2cw0CUWGXBD0Cu30aa9LFTQ=", - "requires": { - "change-case": "2.3.1", - "clean-css": "3.4.28", - "commander": "2.9.0", - "concat-stream": "1.5.2", - "he": "1.0.0", - "ncname": "1.0.0", - "relateurl": "0.2.7", - "uglify-js": "2.6.4" - } - }, - "html-webpack-plugin": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-1.7.0.tgz", - "integrity": "sha1-zQxzx5G9DIxFsk4wAb4zSmt0KXs=", - "requires": { - "bluebird": "3.5.1", - "blueimp-tmpl": "2.5.7", - "html-minifier": "1.5.0", - "lodash": "3.10.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - } - } - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "react": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/react/-/react-0.14.9.tgz", - "integrity": "sha1-kRCmSXxJ1EuhwO3TF67CnC4NkdE=", - "requires": { - "envify": "3.4.1", - "fbjs": "0.6.1" - } - }, - "react-dom": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-0.14.9.tgz", - "integrity": "sha1-BQZKPc8PsYgKOyv8nVjFXY2fYpM=" - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - } - }, - "redux-thunk": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-0.1.0.tgz", - "integrity": "sha1-jjR2BoCLNb+Kkn30YW9v7RAYJuU=" - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "uglify-js": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", - "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", - "requires": { - "async": "0.2.10", - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - } - } - }, - "appirio-tech-ng-iso-constants": { - "version": "github:appirio-tech/ng-iso-constants#d54359ed9b99c0c477541059bcd2f73ad8d3f2f0" - }, - "appirio-tech-ng-ui-components": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/appirio-tech-ng-ui-components/-/appirio-tech-ng-ui-components-2.2.5.tgz", - "integrity": "sha1-QO2YuvZ3EjzHpxXRhcbI4phfrBI=", - "requires": { - "@uirouter/angularjs": "1.0.18", - "angular": "1.4.14", - "angular-scroll": "1.0.2", - "classnames": "2.2.6", - "moment": "2.10.6", - "ngreact": "0.2.0", - "react": "0.14.9", - "react-dom": "0.14.9", - "react-input-autosize": "0.6.13", - "react-redux": "4.4.9", - "react-select": "0.9.1", - "redux": "3.7.2", - "zepto": "0.0.4" - }, - "dependencies": { - "angular": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/angular/-/angular-1.4.14.tgz", - "integrity": "sha1-nQ/q9gzm5SzlD0nuMoZW0eGHXDc=" - }, - "fbjs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.6.1.tgz", - "integrity": "sha1-lja3cF9bqWhNRLcveDISVK/IYPc=", - "requires": { - "core-js": "1.2.7", - "loose-envify": "1.3.1", - "promise": "7.3.1", - "ua-parser-js": "0.7.18", - "whatwg-fetch": "0.9.0" - } - }, - "react": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/react/-/react-0.14.9.tgz", - "integrity": "sha1-kRCmSXxJ1EuhwO3TF67CnC4NkdE=", - "requires": { - "envify": "3.4.1", - "fbjs": "0.6.1" - } - }, - "react-dom": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-0.14.9.tgz", - "integrity": "sha1-BQZKPc8PsYgKOyv8nVjFXY2fYpM=" - } - } - }, - "appirio-tech-react-components": { - "version": "github:appirio-tech/react-components#97ba97c96d73ed5985c4d2800e967eb418555e74", - "requires": { - "appirio-tech-api-schemas": "5.0.70", - "appirio-tech-client-app-layer": "0.1.3", - "classnames": "2.2.6", - "coffee-script": "1.12.7", - "coffeescript": "1.12.7", - "filestack-js": "1.14.6", - "formsy-react": "0.19.5", - "isomorphic-fetch": "2.2.1", - "lodash": "4.17.10", - "material-ui": "0.20.2", - "moment": "2.24.0", - "prop-types": "15.7.2", - "react": "15.6.2", - "react-addons-pure-render-mixin": "15.6.2", - "react-addons-update": "15.6.2", - "react-avatar": "2.5.1", - "react-datetime": "2.16.3", - "react-dom": "15.6.2", - "react-dropzone": "3.13.4", - "react-popper": "0.7.5", - "react-portal": "4.2.0", - "react-redux": "4.4.9", - "react-router-dom": "4.3.1", - "react-select": "0.9.1", - "react-switch-button": "1.1.2", - "react-textarea-autosize": "5.2.1", - "react-transition-group": "2.9.0", - "redux-thunk": "2.3.0", - "uncontrollable": "4.1.0" - }, - "dependencies": { - "coffeescript": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", - "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==" - }, - "fbjs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.6.1.tgz", - "integrity": "sha1-lja3cF9bqWhNRLcveDISVK/IYPc=", - "requires": { - "core-js": "1.2.7", - "loose-envify": "1.4.0", - "promise": "7.3.1", - "ua-parser-js": "0.7.18", - "whatwg-fetch": "0.9.0" - } - }, - "history": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/history/-/history-2.1.2.tgz", - "integrity": "sha1-SqLeiXoOSGfkU5hDvm7Nsphr/ew=", - "requires": { - "deep-equal": "1.1.0", - "invariant": "2.2.4", - "query-string": "3.0.3", - "warning": "2.1.0" - }, - "dependencies": { - "warning": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-2.1.0.tgz", - "integrity": "sha1-ISINnGOvx3qMkhEeARr3Bc4MaQE=", - "requires": { - "loose-envify": "1.4.0" - } - } - } - }, - "hoist-non-react-statics": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", - "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "3.0.2" - } - }, - "moment": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", - "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "prop-types": { - "version": "15.7.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", - "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", - "requires": { - "loose-envify": "1.4.0", - "object-assign": "4.1.1", - "react-is": "16.11.0" - } - }, - "query-string": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-3.0.3.tgz", - "integrity": "sha1-ri4UtNBQcdTpuetIc8NbDc1C5jg=", - "requires": { - "strict-uri-encode": "1.1.0" - } - }, - "react-router": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-2.8.1.tgz", - "integrity": "sha1-c+lJH2zrMW0Pd5gpCBhj43juTtc=", - "requires": { - "history": "2.1.2", - "hoist-non-react-statics": "1.2.0", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "warning": "3.0.0" - } - }, - "tc-ui": { - "version": "git+https://github.com/appirio-tech/tc-ui.git#e577a0e704136f1e9ecce92ce4c0626aab932691", - "requires": { - "classnames": "2.2.6", - "lodash": "4.17.10", - "moment": "2.24.0", - "node-neat": "1.7.2", - "react": "0.14.9", - "react-datetime": "2.16.3", - "react-dom": "0.14.9", - "react-dropzone": "3.13.4", - "react-redux": "4.4.9", - "react-router": "2.8.1", - "react-select": "0.9.1", - "redux": "3.7.2" - }, - "dependencies": { - "react": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/react/-/react-0.14.9.tgz", - "integrity": "sha1-kRCmSXxJ1EuhwO3TF67CnC4NkdE=", - "requires": { - "envify": "3.4.1", - "fbjs": "0.6.1" - } - }, - "react-dom": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-0.14.9.tgz", - "integrity": "sha1-BQZKPc8PsYgKOyv8nVjFXY2fYpM=" - } - } - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "1.4.0" - } - } - } - }, - "appirio-tech-webpack-config": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/appirio-tech-webpack-config/-/appirio-tech-webpack-config-0.3.20.tgz", - "integrity": "sha1-6Z+WPo2AW0dqiSGQuooOTvINu1U=", - "requires": { - "angular-mocks": "1.7.2", - "appirio-styles": "0.0.30", - "appirio-tech-api-schemas": "5.0.70", - "babel-core": "6.26.3", - "babel-loader": "6.4.1", - "babel-plugin-lodash": "2.3.0", - "babel-preset-es2015": "6.24.1", - "babel-preset-react": "6.24.1", - "babel-preset-stage-2": "6.24.1", - "bourbon": "4.3.4", - "cjsx-loader": "2.1.0", - "coffee-loader": "0.7.3", - "coffee-script": "1.12.7", - "compression-webpack-plugin": "0.2.0", - "css-loader": "0.23.1", - "envify": "3.4.1", - "extract-text-webpack-plugin": "0.9.1", - "file-loader": "0.8.5", - "html-webpack-plugin": "2.30.1", - "jade": "1.11.0", - "jade-html-loader": "0.0.3", - "jade-loader": "0.8.0", - "jade-react-loader": "1.0.2", - "json-loader": "0.5.7", - "node-sass": "3.13.1", - "sass-loader": "3.2.3", - "style-loader": "0.13.2", - "transform-loader": "0.2.4", - "webpack": "1.15.0", - "webpack-dev-server": "1.16.5" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "requires": { - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=" - }, - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" - }, - "async-foreach": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", - "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "attr-accept": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz", - "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==", - "requires": { - "core-js": "2.6.10" - }, - "dependencies": { - "core-js": { - "version": "2.6.10", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", - "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==" - } - } - }, - "auth0-js": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.6.1.tgz", - "integrity": "sha1-kI4bxemnxveHsBmtU9dojKqi9I4=", - "requires": { - "base64-js": "1.3.0", - "idtoken-verifier": "1.2.0", - "js-cookie": "2.2.0", - "qs": "6.5.2", - "superagent": "3.8.3", - "url-join": "1.1.0", - "winchan": "0.2.0" - } - }, - "auto-config-fake-server": { - "version": "2.0.604", - "resolved": "https://registry.npmjs.org/auto-config-fake-server/-/auto-config-fake-server-2.0.604.tgz", - "integrity": "sha1-FY5RTIR5nRQ5iNw/w7mpkwnNhkY=", - "requires": { - "sinon": "2.0.0-pre" - } - }, - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000861", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "aws-sdk": { - "version": "2.0.31", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.0.31.tgz", - "integrity": "sha1-5yzx/caQFb2f0r3z07iMFlB9Jo4=", - "requires": { - "xml2js": "0.2.6", - "xmlbuilder": "0.4.2" - } - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" - }, - "axios": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.8.1.tgz", - "integrity": "sha1-4Or+wPNGE5Un3Dt5/cv/gDSiQEU=", - "requires": { - "follow-redirects": "0.0.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-0.0.7.tgz", - "integrity": "sha1-NLkLqyqRGqNHVx2pDyK9NuzYqRk=", - "requires": { - "debug": "2.6.9", - "stream-consume": "0.1.1" - } - } - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-core": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", - "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.10", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-generator": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", - "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.10", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", - "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-builder-react-jsx": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", - "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "esutils": "2.0.2" - } - }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } - }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", - "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", - "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } - }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-loader": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-6.4.1.tgz", - "integrity": "sha1-CzQRLVsHSKjc2/Uaz2+b1C1QuMo=", - "requires": { - "find-cache-dir": "0.1.1", - "loader-utils": "0.2.17", - "mkdirp": "0.5.1", - "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-lodash": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-lodash/-/babel-plugin-lodash-2.3.0.tgz", - "integrity": "sha1-QWbI88pSqpW+nhg50kWD5wqFfsI=", - "requires": { - "lodash": "4.17.10" - } - }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" - }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=" - }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" - }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" - }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" - }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" - }, - "babel-plugin-syntax-flow": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", - "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" - }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" - }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" - }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.10" - } - }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", - "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } - }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", - "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } - }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-flow-strip-types": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", - "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", - "requires": { - "babel-plugin-syntax-flow": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-display-name": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", - "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-jsx": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", - "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", - "requires": { - "babel-helper-builder-react-jsx": "6.26.0", - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-jsx-self": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", - "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-react-jsx-source": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", - "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-runtime": "6.26.0" - } - }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "requires": { - "regenerator-transform": "0.10.1" - } - }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } - }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.7", - "regenerator-runtime": "0.10.5" - }, - "dependencies": { - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - } - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-preset-flow": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", - "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", - "requires": { - "babel-plugin-transform-flow-strip-types": "6.22.0" - } - }, - "babel-preset-react": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", - "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", - "requires": { - "babel-plugin-syntax-jsx": "6.18.0", - "babel-plugin-transform-react-display-name": "6.25.0", - "babel-plugin-transform-react-jsx": "6.24.1", - "babel-plugin-transform-react-jsx-self": "6.22.0", - "babel-plugin-transform-react-jsx-source": "6.22.0", - "babel-preset-flow": "6.23.0" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "requires": { - "babel-core": "6.26.3", - "babel-runtime": "6.26.0", - "core-js": "2.5.7", - "home-or-tmp": "2.0.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" - }, - "dependencies": { - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - } - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "requires": { - "core-js": "2.5.7", - "regenerator-runtime": "0.11.1" - }, - "dependencies": { - "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" - } - } - }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.10" - } - }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.10" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "babel-types": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.10", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base62": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/base62/-/base62-1.2.8.tgz", - "integrity": "sha512-V6YHUbjLxN1ymqNLb1DPHoU1CpfdL7d2YTIp5W3U4hhoG4hhxNmsFDs66M9EXxBiSEke5Bt5dwdfMwwZF70iLA==" - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" - }, - "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "2.0.3" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "blueimp-tmpl": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/blueimp-tmpl/-/blueimp-tmpl-2.5.7.tgz", - "integrity": "sha1-M/sSwTnWVRKuQK+9ji3vjZ25ZJA=" - }, - "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", - "debug": "2.6.9", - "depd": "1.1.2", - "http-errors": "1.6.3", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.16" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - } - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } - }, - "bourbon": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/bourbon/-/bourbon-4.3.4.tgz", - "integrity": "sha1-TaOAAp6SwMj5dkx3lFGhNLEefMM=" - }, - "bourbon-neat": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/bourbon-neat/-/bourbon-neat-1.7.2.tgz", - "integrity": "sha1-oiixJ0R53iR20yszFTEHylBTzz0=" - }, - "bowser": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", - "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "browserify-aes": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", - "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", - "requires": { - "inherits": "2.0.3" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "requires": { - "pako": "0.2.9" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "requires": { - "caniuse-db": "1.0.30000861", - "electron-to-chromium": "1.3.50" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.12", - "isarray": "1.0.0" - } - }, - "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "requires": { - "callsites": "0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" - } - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - } - } - }, - "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000861", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" - } - }, - "caniuse-db": { - "version": "1.0.30000861", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000861.tgz", - "integrity": "sha1-byeEChMMEMCx4A+rdynB+vj0zNM=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "cdnizer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/cdnizer/-/cdnizer-1.1.6.tgz", - "integrity": "sha1-wVGF0b7UKwPppFqp+lWObYcr0Sw=", - "requires": { - "cdnjs-cdn-data": "0.1.2", - "google-cdn-data": "0.1.25", - "jsdelivr-cdn-data": "0.1.1", - "lodash": "2.4.2", - "minimatch": "3.0.4", - "nomnom": "1.8.1" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=" - } - } - }, - "cdnjs-cdn-data": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cdnjs-cdn-data/-/cdnjs-cdn-data-0.1.2.tgz", - "integrity": "sha1-hl00uk5I3Rtz/WaOJKYaWt+biyE=", - "requires": { - "semver": "5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=" - } - } - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chain-function": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz", - "integrity": "sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "change-case": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-2.3.1.tgz", - "integrity": "sha1-LE/ePwY7tB0AzWjg1aCdthy+iU8=", - "requires": { - "camel-case": "1.2.2", - "constant-case": "1.1.2", - "dot-case": "1.1.2", - "is-lower-case": "1.1.3", - "is-upper-case": "1.1.2", - "lower-case": "1.1.4", - "lower-case-first": "1.0.2", - "param-case": "1.1.2", - "pascal-case": "1.1.2", - "path-case": "1.1.2", - "sentence-case": "1.1.3", - "snake-case": "1.1.2", - "swap-case": "1.1.2", - "title-case": "1.1.2", - "upper-case": "1.1.3", - "upper-case-first": "1.1.2" - }, - "dependencies": { - "camel-case": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz", - "integrity": "sha1-Gsp8TRlTWaLOmVV5NDPG5VQlEfI=", - "requires": { - "sentence-case": "1.1.3", - "upper-case": "1.1.3" - } - }, - "param-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-1.1.2.tgz", - "integrity": "sha1-3LCRpDwlm5Io8cNB57akTqC/l0M=", - "requires": { - "sentence-case": "1.1.3" - } - } - } - }, - "change-emitter": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz", - "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=" - }, - "character-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", - "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.2.9", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" - }, - "cjsx-loader": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cjsx-loader/-/cjsx-loader-2.1.0.tgz", - "integrity": "sha1-14OVnJfX4dN0tE2qvvZcoIs6Ozs=", - "requires": { - "coffee-react-transform": "3.3.0", - "loader-utils": "0.2.17" - } - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "requires": { - "chalk": "1.1.3" - } - }, - "classnames": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", - "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" - }, - "clean-css": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", - "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", - "requires": { - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "requires": { - "restore-cursor": "1.0.1" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", - "requires": { - "q": "1.5.1" - } - }, - "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=" - }, - "coffee-loader": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/coffee-loader/-/coffee-loader-0.7.3.tgz", - "integrity": "sha1-+tvG79b8fsyIxbMEaiwpIGa8tUo=", - "requires": { - "loader-utils": "1.1.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - } - } - }, - "coffee-react-transform": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/coffee-react-transform/-/coffee-react-transform-3.3.0.tgz", - "integrity": "sha1-8fkPoi3o12f8onk+O3Dw99ei5Gc=" - }, - "coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==" - }, - "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", - "requires": { - "clone": "1.0.4", - "color-convert": "1.9.2", - "color-string": "0.3.0" - } - }, - "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "requires": { - "color-name": "1.1.1" - } - }, - "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=" - }, - "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "requires": { - "color-name": "1.1.1" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", - "requires": { - "color": "0.11.4", - "css-color-names": "0.0.4", - "has": "1.0.3" - } - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", - "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==" - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" - }, - "commoner": { - "version": "0.10.8", - "resolved": "https://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", - "integrity": "sha1-NPw2cs0kOT6LtH5wyqApOBH08sU=", - "requires": { - "commander": "2.16.0", - "detective": "4.7.1", - "glob": "5.0.15", - "graceful-fs": "4.1.11", - "iconv-lite": "0.4.23", - "mkdirp": "0.5.1", - "private": "0.1.8", - "q": "1.5.1", - "recast": "0.11.23" - } - }, - "component-classes": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz", - "integrity": "sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE=", - "requires": { - "component-indexof": "0.0.3" - } - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" - }, - "component-indexof": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz", - "integrity": "sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=" - }, - "compressible": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", - "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", - "requires": { - "mime-db": "1.34.0" - }, - "dependencies": { - "mime-db": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.34.0.tgz", - "integrity": "sha1-RS0Oz/XDA0am3B5kseruDTcZ/5o=" - } - } - }, - "compression": { - "version": "1.7.2", - "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", - "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", - "requires": { - "accepts": "1.3.5", - "bytes": "3.0.0", - "compressible": "2.0.14", - "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.1", - "vary": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - } - } - }, - "compression-webpack-plugin": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-0.2.0.tgz", - "integrity": "sha1-zkVTpHitScvVN0yqopLJ8WvrBV8=", - "requires": { - "async": "0.2.10" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "1.1.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - } - }, - "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "requires": { - "date-now": "0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constant-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-1.1.2.tgz", - "integrity": "sha1-jsLKW6ND4Aqjjb9OIA/VrJB+/WM=", - "requires": { - "snake-case": "1.1.2", - "upper-case": "1.1.3" - } - }, - "constantinople": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", - "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", - "requires": { - "acorn": "2.7.0" - }, - "dependencies": { - "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" - } - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" - }, - "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" - }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" - }, - "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=" - }, - "create-react-class": { - "version": "15.6.3", - "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.3.tgz", - "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", - "requires": { - "fbjs": "0.8.17", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - }, - "dependencies": { - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.18" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "requires": { - "lru-cache": "4.1.3", - "which": "1.3.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.10.1" - } - }, - "crypto-browserify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", - "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=", - "requires": { - "browserify-aes": "0.4.0", - "pbkdf2-compat": "2.0.1", - "ripemd160": "0.2.0", - "sha.js": "2.2.6" - } - }, - "crypto-js": { - "version": "3.1.9-1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", - "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" - }, - "css": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", - "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", - "requires": { - "css-parse": "1.0.4", - "css-stringify": "1.0.5" - } - }, - "css-animation": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/css-animation/-/css-animation-1.4.1.tgz", - "integrity": "sha1-W4gTEl3g+7uwu+G0cq6EIhRpt6g=", - "requires": { - "babel-runtime": "6.26.0", - "component-classes": "1.2.6" - } - }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" - }, - "css-in-js-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", - "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", - "requires": { - "hyphenate-style-name": "1.0.3", - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" - } - } - }, - "css-loader": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.23.1.tgz", - "integrity": "sha1-n6I/K1wJZSNZEK1ezvO4o2OQ/lA=", - "requires": { - "css-selector-tokenizer": "0.5.4", - "cssnano": "3.10.0", - "loader-utils": "0.2.17", - "lodash.camelcase": "3.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.1.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "source-list-map": "0.1.8" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "css-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", - "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", - "domutils": "1.5.1", - "nth-check": "1.0.1" - } - }, - "css-selector-tokenizer": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.5.4.tgz", - "integrity": "sha1-E5uv00o1/QwUKEhwSeBpnm9qLCE=", - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1" - } - }, - "css-stringify": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", - "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" - }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.3", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.3", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", - "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "1.0.2" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "requires": { - "es5-ext": "0.10.45" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "deep-diff": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.4.tgz", - "integrity": "sha1-qsXDmVIjar5fA3ojSQYLoBsArkg=" - }, - "deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.0.tgz", - "integrity": "sha512-ZbfWJq/wN1Z273o7mUSjILYqehAktR2NVoSrOukDkU9kg2v/Uv89yU4Cvz8seJeAmtN5oqiefKq8FPuXOboqLw==", - "requires": { - "is-arguments": "1.0.4", - "is-date-object": "1.0.1", - "is-regex": "1.0.4", - "object-is": "1.0.1", - "object-keys": "1.1.1", - "regexp.prototype.flags": "1.2.0" - }, - "dependencies": { - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - } - } - }, - "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=" - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "1.0.12" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.1", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "requires": { - "repeating": "2.0.1" - } - }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "requires": { - "acorn": "5.7.1", - "defined": "1.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" - } - }, - "dom-align": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.8.0.tgz", - "integrity": "sha512-B85D4ef2Gj5lw0rK0KM2+D5/pH7yqNxg2mB+E8uzFaolpm7RQmsxEfjyEuNiF8UBBkffumYDeKRzTzc3LePP+w==" - }, - "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", - "requires": { - "utila": "0.3.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" - } - } - }, - "dom-helpers": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", - "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", - "requires": { - "@babel/runtime": "7.6.3" - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" - } - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" - }, - "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", - "requires": { - "domelementtype": "1.3.0" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } - }, - "dot-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-1.1.2.tgz", - "integrity": "sha1-HnOCaQDeKNbeVIC8HeMdCEKwa+w=", - "requires": { - "sentence-case": "1.1.3" - } - }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "requires": { - "readable-stream": "1.1.14" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "electron-to-chromium": { - "version": "1.3.50", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.50.tgz", - "integrity": "sha1-dDi3b5K0G5GfP73TUPvQdX2s3fc=" - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "requires": { - "iconv-lite": "0.4.23" - } - }, - "enhanced-resolve": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", - "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.2.0", - "tapable": "0.1.10" - }, - "dependencies": { - "memory-fs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz", - "integrity": "sha1-8rslNovBIeORwlIN6Slpyu4KApA=" - } - } - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" - }, - "envify": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/envify/-/envify-3.4.1.tgz", - "integrity": "sha1-1xIjKejfFoi6dxsSUBkXyc5cvOg=", - "requires": { - "jstransform": "11.0.3", - "through": "2.3.8" - } - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "requires": { - "prr": "1.0.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es-abstract": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", - "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", - "requires": { - "es-to-primitive": "1.2.0", - "function-bind": "1.1.1", - "has": "1.0.3", - "has-symbols": "1.0.0", - "is-callable": "1.1.4", - "is-regex": "1.0.4", - "object-inspect": "1.6.0", - "object-keys": "1.1.1", - "string.prototype.trimleft": "2.1.0", - "string.prototype.trimright": "2.1.0" - }, - "dependencies": { - "object-inspect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", - "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - } - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.2" - } - }, - "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "next-tick": "1.0.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "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=" - }, - "escodegen": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.3.3.tgz", - "integrity": "sha1-8CQBb1qI4Eb9EgBQVek5gC5sXyM=", - "requires": { - "esprima": "1.1.1", - "estraverse": "1.5.1", - "esutils": "1.0.0", - "source-map": "0.1.43" - }, - "dependencies": { - "esprima": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.1.1.tgz", - "integrity": "sha1-W28VR/TRAuZw4UDFCb5ncdautUk=" - }, - "esutils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", - "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=" - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "optional": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - } - } - }, - "eslint": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", - "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", - "requires": { - "chalk": "1.1.3", - "concat-stream": "1.6.2", - "debug": "2.6.9", - "doctrine": "1.5.0", - "es6-map": "0.1.5", - "escope": "3.6.0", - "espree": "3.5.4", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "1.3.1", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.10", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.17.2", - "is-resolvable": "1.1.0", - "js-yaml": "3.7.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.10", - "mkdirp": "0.5.1", - "optionator": "0.8.2", - "path-is-absolute": "1.0.1", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.6.1", - "strip-json-comments": "1.0.4", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "requires": { - "acorn": "5.7.1", - "acorn-jsx": "3.0.1" - } - }, - "esprima-fb": { - "version": "15001.1.0-dev-harmony-fb", - "resolved": "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz", - "integrity": "sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=" - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "requires": { - "estraverse": "4.2.0" - }, - "dependencies": { - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" - } - } - }, - "estraverse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", - "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.45" - } - }, - "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==" - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, - "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "requires": { - "original": "1.0.1" - } - }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "requires": { - "fill-range": "2.2.4" - } - }, - "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "requires": { - "accepts": "1.3.5", - "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "1.1.2", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.1", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.3", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", - "utils-merge": "1.0.1", - "vary": "1.1.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - } - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "extract-text-webpack-plugin": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-0.9.1.tgz", - "integrity": "sha1-723FCMs17Q3PikAJq76FP3p2IrU=", - "requires": { - "async": "1.5.2", - "loader-utils": "0.2.17" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "falafel": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", - "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", - "requires": { - "acorn": "5.7.1", - "foreach": "2.0.5", - "isarray": "0.0.1", - "object-keys": "1.0.12" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" - }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "requires": { - "websocket-driver": "0.7.0" - } - }, - "fbjs": { - "version": "0.8.17", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", - "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.18" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "requires": { - "pend": "1.2.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "file-entry-cache": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", - "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", - "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "file-loader": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.8.5.tgz", - "integrity": "sha1-knXQMf54DyfUf19K8CvUNxPMFRs=", - "requires": { - "loader-utils": "0.2.17" - } - }, - "file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "filestack-js": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/filestack-js/-/filestack-js-1.14.6.tgz", - "integrity": "sha512-mcME182eOUy3OyU0F9rcATQf3/YY3N1suXYVv3hcS1RxeVHIIkM9XI6N9Qg5t04y0qOGud9xv/GO+oKhreCSIw==", - "requires": { - "abab": "2.0.0", - "ajv": "6.10.2", - "file-type": "8.1.0", - "filestack-loader": "3.0.4", - "is-svg": "3.0.0", - "isutf8": "2.0.4", - "spark-md5": "3.0.0", - "superagent": "3.8.3", - "tcomb-validation": "3.4.1", - "tslib": "1.10.0" - }, - "dependencies": { - "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", - "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "requires": { - "html-comment-regex": "1.1.1" - } - }, - "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==" - } - } - }, - "filestack-loader": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/filestack-loader/-/filestack-loader-3.0.4.tgz", - "integrity": "sha512-b6uOCWHd1gM0+5KBA1rA4qfEgTqyTr5umLM4bBWT4z98WUwxa6KzCiq+z0VnR4rN+NCx6kyZ/wLXjGcPU32TxQ==" - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.0.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.4.0", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "find-cache-dir": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "findit2": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", - "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=" - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" - } - }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" - }, - "follow-redirects": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz", - "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==", - "requires": { - "debug": "3.1.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "form-data-to-object": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/form-data-to-object/-/form-data-to-object-0.2.0.tgz", - "integrity": "sha1-96jmjd2RChEApl4lrGpIQUP/gWg=" - }, - "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", - "requires": { - "samsam": "1.1.2" - } - }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" - }, - "formsy-react": { - "version": "0.19.5", - "resolved": "https://registry.npmjs.org/formsy-react/-/formsy-react-0.19.5.tgz", - "integrity": "sha1-dgpXrAETRC499MMJw2ON2SlX544=", - "requires": { - "form-data-to-object": "0.2.0" - } - }, - "forwarded": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "optional": true, - "requires": { - "nan": "2.14.0", - "node-pre-gyp": "0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": false, - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": false, - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": false, - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": false, - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": false, - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": false, - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": false, - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "optional": true, - "requires": { - "minipass": "2.3.5" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": false, - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" - } - }, - "glob": { - "version": "7.1.3", - "resolved": false, - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "optional": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": false, - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "optional": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": false, - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": false, - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": false, - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": false, - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": false, - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": false, - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.3" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": false, - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "optional": true, - "requires": { - "minipass": "2.3.5" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": false, - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": false, - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "optional": true - }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": false, - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": false, - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "optional": true, - "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.3.0", - "nopt": "4.0.1", - "npm-packlist": "1.4.1", - "npmlog": "4.1.2", - "rc": "1.2.8", - "rimraf": "2.6.3", - "semver": "5.7.0", - "tar": "4.4.8" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": false, - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": false, - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": false, - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": false, - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, - "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": false, - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": false, - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": false, - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": false, - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": false, - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "optional": true, - "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": false, - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": false, - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": false, - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "optional": true, - "requires": { - "glob": "7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": false, - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": false, - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": false, - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": false, - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": false, - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": false, - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": false, - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "optional": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": false, - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": false, - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": false, - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "optional": true, - "requires": { - "chownr": "1.1.1", - "fs-minipass": "1.2.5", - "minipass": "2.3.5", - "minizlib": "1.2.1", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": false, - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": false, - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "yallist": { - "version": "3.0.3", - "resolved": false, - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" - } - } - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "requires": { - "globule": "1.2.1" - } - }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "requires": { - "is-property": "1.0.2" - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", - "requires": { - "glob": "7.1.2", - "lodash": "4.17.10", - "minimatch": "3.0.4" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "google-cdn-data": { - "version": "0.1.25", - "resolved": "https://registry.npmjs.org/google-cdn-data/-/google-cdn-data-0.1.25.tgz", - "integrity": "sha1-nDwxSasYp8LV7V8PC07ovEWZK3E=" - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-color": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", - "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" - }, - "history": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/history/-/history-1.17.0.tgz", - "integrity": "sha1-xUg8qlodH+oAoafY0ZuHQBZxHSk=", - "requires": { - "deep-equal": "1.1.0", - "invariant": "2.2.4", - "query-string": "3.0.3", - "warning": "2.1.0" - }, - "dependencies": { - "query-string": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-3.0.3.tgz", - "integrity": "sha1-ri4UtNBQcdTpuetIc8NbDc1C5jg=", - "requires": { - "strict-uri-encode": "1.1.0" - } - } - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "hosted-git-info": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz", - "integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==" - }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" - }, - "html-minifier": { - "version": "3.5.17", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.17.tgz", - "integrity": "sha512-O+StuKL0UWfwX5Zv4rFxd60DPcT5DVjGq1AlnP6VQ8wzudft/W4hx5Wl98aSYNwFBHY6XWJreRw/BehX4l+diQ==", - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.11", - "commander": "2.15.1", - "he": "1.1.1", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.4.2" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - } - } - }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.17", - "loader-utils": "0.2.17", - "lodash": "4.17.10", - "pretty-error": "2.1.1", - "toposort": "1.0.7" - } - }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" - }, - "dependencies": { - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "requires": { - "domelementtype": "1.3.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "requires": { - "depd": "1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": "1.4.0" - } - }, - "http-parser-js": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", - "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=" - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "requires": { - "eventemitter3": "3.1.0", - "follow-redirects": "1.5.0", - "requires-port": "1.0.0" - } - }, - "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", - "requires": { - "http-proxy": "1.17.0", - "is-glob": "3.1.0", - "lodash": "4.17.10", - "micromatch": "2.3.11" - }, - "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=" - }, - "humps": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/humps/-/humps-0.6.0.tgz", - "integrity": "sha1-phchA4bwRF0SLOtNlBSho5saHpQ=" - }, - "hyphenate-style-name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", - "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==" - }, - "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", - "requires": { - "safer-buffer": "2.1.2" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=" - }, - "idtoken-verifier": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/idtoken-verifier/-/idtoken-verifier-1.2.0.tgz", - "integrity": "sha512-8jmmFHwdPz8L73zGNAXHHOV9yXNC+Z0TUBN5rafpoaFaLFltlIFr1JkQa3FYAETP23eSsulVw0sBiwrE8jqbUg==", - "requires": { - "base64-js": "1.3.0", - "crypto-js": "3.1.9-1", - "jsbn": "0.1.1", - "superagent": "3.8.3", - "url-join": "1.1.0" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "2.0.1" - } - }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "inline-style-prefixer": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-3.0.8.tgz", - "integrity": "sha1-hVG45bTVcyROZqNLBPfTIHaitTQ=", - "requires": { - "bowser": "1.9.4", - "css-in-js-utils": "2.0.1" - } - }, - "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", - "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.17.10", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" - } - }, - "interpret": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-0.6.6.tgz", - "integrity": "sha1-/s16GOfOXKar+5U+H4YhOknxYls=" - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" - }, - "is-absolute-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", - "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" - }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "requires": { - "binary-extensions": "1.11.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "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=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=", - "requires": { - "lower-case": "1.1.4" - } - }, - "is-my-ip-valid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==" - }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", - "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "is-my-ip-valid": "1.0.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - } - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "3.2.2" - } - }, - "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=" - }, - "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==", - "requires": { - "is-path-inside": "1.0.1" - } - }, - "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=", - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "requires": { - "has": "1.0.3" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" - }, - "is-retina": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-retina/-/is-retina-1.0.3.tgz", - "integrity": "sha1-10AbKGvqKuN/Ykd1iN5QTQuGR+M=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", - "requires": { - "html-comment-regex": "1.1.1" - } - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "requires": { - "has-symbols": "1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=", - "requires": { - "upper-case": "1.1.3" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.4" - }, - "dependencies": { - "whatwg-fetch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", - "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" - } - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "isutf8": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isutf8/-/isutf8-2.0.4.tgz", - "integrity": "sha512-4DvnF8CTx4QYN5UD7VtScvQEJq910d09V2yArkAvc62BUxnuFTnVhkq3iPR802ruiibPG4lQm/I8FNAxPYx5fw==" - }, - "jade": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", - "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", - "requires": { - "character-parser": "1.2.1", - "clean-css": "3.4.28", - "commander": "2.6.0", - "constantinople": "3.0.2", - "jstransformer": "0.0.2", - "mkdirp": "0.5.1", - "transformers": "2.1.0", - "uglify-js": "2.8.29", - "void-elements": "2.0.1", - "with": "4.0.3" - }, - "dependencies": { - "clean-css": { - "version": "3.4.28", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", - "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", - "requires": { - "commander": "2.8.1", - "source-map": "0.4.4" - }, - "dependencies": { - "commander": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", - "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", - "requires": { - "graceful-readlink": "1.0.1" - } - } - } - }, - "commander": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", - "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - } - } - }, - "jade-html-loader": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/jade-html-loader/-/jade-html-loader-0.0.3.tgz", - "integrity": "sha1-ggSLSG55YiZ5OPWM0er9nMAAPsw=", - "requires": { - "loader-utils": "0.2.17" - } - }, - "jade-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/jade-loader/-/jade-loader-0.8.0.tgz", - "integrity": "sha1-0bCZcam/kKKymLCvWxrQMA0QnC4=", - "requires": { - "loader-utils": "0.2.17" - } - }, - "jade-react-loader": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jade-react-loader/-/jade-react-loader-1.0.2.tgz", - "integrity": "sha1-MxgiARamZZzJxsMO7qqHLSMKioQ=", - "requires": { - "loader-utils": "0.2.17", - "react-jade": "2.5.0" - } - }, - "js-base64": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", - "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==" - }, - "js-cookie": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.0.tgz", - "integrity": "sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s=" - }, - "js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", - "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" - } - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "jsdelivr-cdn-data": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsdelivr-cdn-data/-/jsdelivr-cdn-data-0.1.1.tgz", - "integrity": "sha1-pFDi3G7O57t7b2pylOUYCsvJwQo=", - "requires": { - "semver": "2.2.1" - }, - "dependencies": { - "semver": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.2.1.tgz", - "integrity": "sha1-eUEYKz/8xYC/8cF5QqzfeVHA0hM=" - } - } - }, - "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "0.0.0" - } - }, - "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=" - }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "jstransform": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/jstransform/-/jstransform-11.0.3.tgz", - "integrity": "sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=", - "requires": { - "base62": "1.2.8", - "commoner": "0.10.8", - "esprima-fb": "15001.1.0-dev-harmony-fb", - "object-assign": "2.1.1", - "source-map": "0.4.4" - } - }, - "jstransformer": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", - "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", - "requires": { - "is-promise": "2.1.0", - "promise": "6.1.0" - }, - "dependencies": { - "asap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", - "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" - }, - "promise": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", - "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", - "requires": { - "asap": "1.0.0" - } - } - } - }, - "jwt-decode": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-1.5.1.tgz", - "integrity": "sha1-vajYcxubc57otKMaDQJcqUrpLTs=", - "requires": { - "Base64": "0.1.4" - } - }, - "keycode": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", - "integrity": "sha1-PQr1bce4uOXLqNCpfxByBO7CKwQ=" - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "1.1.6" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "libphonenumber-js": { - "version": "1.7.26", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.7.26.tgz", - "integrity": "sha512-23y9szw5sCrko0i4bO+jv6B3fFJkr0+bZ/5DLyY7TxBDJ04ACw+obdOdR3d2aOwbnOW+eevcgt8HqYgvjrfD/A==", - "requires": { - "minimist": "1.2.0", - "xml2js": "0.4.22" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "xml2js": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", - "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", - "requires": { - "sax": "1.2.4", - "util.promisify": "1.0.0", - "xmlbuilder": "11.0.1" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - } - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" - }, - "lodash-es": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.10.tgz", - "integrity": "sha512-iesFYPmxYYGTcmQK0sL8bX3TGHyM6b2qREaB4kamHfQyfPJP0xgoGxp19nsH16nsfquLdiyKyX3mQkfiSGV8Rg==" - }, - "lodash._createcompounder": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._createcompounder/-/lodash._createcompounder-3.0.0.tgz", - "integrity": "sha1-XdLLVTctbnDg4jkvsjBNZjEJEHU=", - "requires": { - "lodash.deburr": "3.2.0", - "lodash.words": "3.2.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" - }, - "lodash.camelcase": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-3.0.1.tgz", - "integrity": "sha1-kyyLh/ikN3iXxnGXUzKC+Xrqwpg=", - "requires": { - "lodash._createcompounder": "3.0.0" - } - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" - }, - "lodash.deburr": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-3.2.0.tgz", - "integrity": "sha1-baj1QzSjZqfPTEx2742Aqhs2XtU=", - "requires": { - "lodash._root": "3.0.1" - } - }, - "lodash.frompairs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.frompairs/-/lodash.frompairs-4.0.1.tgz", - "integrity": "sha1-vE5SB/onV8E25XNhTpZkUGsrG9I=" - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" - }, - "lodash.words": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.words/-/lodash.words-3.2.0.tgz", - "integrity": "sha1-TiqGSbwIdFsXxpWxo86P7llmI7M=", - "requires": { - "lodash._root": "3.0.1" - } - }, - "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=" - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "requires": { - "js-tokens": "3.0.2" - } - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" - }, - "lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=", - "requires": { - "lower-case": "1.1.4" - } - }, - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "material-ui": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/material-ui/-/material-ui-0.20.2.tgz", - "integrity": "sha512-VeqgQkdvtK193w+FFvXDEwlVxI4rWk83eWbpYLeOIHDPWr3rbB9B075JRnJt/8IsI2X8q5Aia5W3+7m4KkleDg==", - "requires": { - "babel-runtime": "6.26.0", - "inline-style-prefixer": "3.0.8", - "keycode": "2.2.0", - "lodash.merge": "4.6.2", - "lodash.throttle": "4.1.1", - "prop-types": "15.6.2", - "react-event-listener": "0.6.6", - "react-transition-group": "1.2.1", - "recompose": "0.26.0", - "simple-assign": "0.1.0", - "warning": "3.0.0" - }, - "dependencies": { - "react-transition-group": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-1.2.1.tgz", - "integrity": "sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q==", - "requires": { - "chain-function": "1.0.1", - "dom-helpers": "3.4.0", - "loose-envify": "1.3.1", - "prop-types": "15.6.2", - "warning": "3.0.0" - } - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "1.3.1" - } - } - } - }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=" - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" - }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "1.1.6" - } - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "memory-fs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", - "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", - "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" - }, - "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "requires": { - "mime-db": "1.33.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "moment": { - "version": "2.10.6", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.10.6.tgz", - "integrity": "sha1-bLIZZ8ecunsMpeZmRPFzZis++nc=" - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" - }, - "natives": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.4.tgz", - "integrity": "sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg==" - }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", - "requires": { - "xml-char-classes": "1.0.0" - } - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "ng-onload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ng-onload/-/ng-onload-0.2.1.tgz", - "integrity": "sha1-ycc0Zi4qJqAqAy4TBwr7vay23g0=" - }, - "ngcomponent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ngcomponent/-/ngcomponent-4.1.0.tgz", - "integrity": "sha512-cGL3iVoqMWTpCfaIwgRKhdaGqiy2Z+CCG0cVfjlBvdqE8saj8xap9B4OTf+qwObxLVZmDTJPDgx3bN6Q/lZ7BQ==", - "requires": { - "@types/angular": "1.6.50", - "@types/lodash": "4.14.116", - "angular": "1.7.2", - "lodash": "4.17.10" - } - }, - "ngreact": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ngreact/-/ngreact-0.2.0.tgz", - "integrity": "sha1-PaQ6SIFYPFTMUDXim7SNnhFnVYc=", - "requires": { - "angular": "1.7.2", - "react": "15.6.2", - "react-dom": "15.6.2" - } - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "requires": { - "lower-case": "1.1.4" - } - }, - "node-bourbon": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/node-bourbon/-/node-bourbon-4.2.8.tgz", - "integrity": "sha1-5ETx8JQ0q3ZQ6jGMKOLhA9P5Qs0=", - "requires": { - "bourbon": "4.3.4" - } - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "node-gyp": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz", - "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==", - "requires": { - "fstream": "1.0.11", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "npmlog": "4.1.2", - "osenv": "0.1.5", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.1" - }, - "dependencies": { - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.2", - "stringstream": "0.0.6", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" - } - } - }, - "node-libs-browser": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", - "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.3.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "0.0.1", - "os-browserify": "0.2.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.3", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.10", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.4", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "node-neat": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-neat/-/node-neat-1.7.2.tgz", - "integrity": "sha1-OEcpELgV4mG4sbmbpRmZRGWhXCE=", - "requires": { - "bourbon-neat": "1.7.2", - "node-bourbon": "4.2.8" - } - }, - "node-sass": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-3.13.1.tgz", - "integrity": "sha1-ckD7v/I5YwS0IjUn7TAgWJwAT8I=", - "requires": { - "async-foreach": "0.1.3", - "chalk": "1.1.3", - "cross-spawn": "3.0.1", - "gaze": "1.1.3", - "get-stdin": "4.0.1", - "glob": "7.1.2", - "in-publish": "2.0.0", - "lodash.assign": "4.2.0", - "lodash.clonedeep": "4.5.0", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.10.0", - "node-gyp": "3.7.0", - "npmlog": "4.1.2", - "request": "2.87.0", - "sass-graph": "2.2.4" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "nomnom": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", - "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", - "requires": { - "chalk": "0.4.0", - "underscore": "1.6.0" - }, - "dependencies": { - "ansi-styles": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", - "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" - }, - "chalk": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", - "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", - "requires": { - "ansi-styles": "1.0.0", - "has-color": "0.1.7", - "strip-ansi": "0.1.1" - } - }, - "strip-ansi": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", - "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" - } - } - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1.1.1" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "requires": { - "hosted-git-info": "2.6.1", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" - }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "normalizr": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-1.4.1.tgz", - "integrity": "sha1-qjh8JGXxNhHK86rkK6+Y9wXoos4=", - "requires": { - "lodash": "3.10.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - } - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "requires": { - "boolbase": "1.0.0" - } - }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" - }, - "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=" - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", - "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" - }, - "object-inspect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-0.4.0.tgz", - "integrity": "sha1-9RV8EWwUVbJDsG7pdwM5LFrYn+w=" - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=" - }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==" - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.16.0" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" - }, - "open": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", - "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=" - }, - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "requires": { - "wordwrap": "0.0.3" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" - } - } - }, - "original": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", - "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", - "requires": { - "url-parse": "1.4.1" - } - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=" - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "requires": { - "no-case": "2.3.2" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "1.3.2" - } - }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" - }, - "pascal-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-1.1.2.tgz", - "integrity": "sha1-Pl1kogBDgwp8STRMLXS0G+DJyZs=", - "requires": { - "camel-case": "1.2.2", - "upper-case-first": "1.1.2" - }, - "dependencies": { - "camel-case": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz", - "integrity": "sha1-Gsp8TRlTWaLOmVV5NDPG5VQlEfI=", - "requires": { - "sentence-case": "1.1.3", - "upper-case": "1.1.3" - } - } - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" - }, - "path-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-1.1.2.tgz", - "integrity": "sha1-UM5roNO+090LXCqcRVNpdDRAlRQ=", - "requires": { - "sentence-case": "1.1.3" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "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=" - }, - "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=" - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pbkdf2-compat": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz", - "integrity": "sha1-tuDI+plJTZTgURV1gCpZpcFC8og=" - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "requires": { - "find-up": "1.1.2" - } - }, - "pluralize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", - "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=" - }, - "popper.js": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.0.tgz", - "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==" - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.5", - "source-map": "0.5.7", - "supports-color": "3.2.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" - } - }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", - "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" - } - }, - "postcss-filter-plugins": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz", - "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", - "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", - "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.2" - } - }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=" - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", - "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" - } - }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", - "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" - } - }, - "postcss-modules-extract-imports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", - "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", - "requires": { - "postcss": "6.0.23" - }, - "dependencies": { - "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==", - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.23" - }, - "dependencies": { - "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==", - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" - } - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", - "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.23" - }, - "dependencies": { - "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==", - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" - } - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", - "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.23" - }, - "dependencies": { - "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==", - "requires": { - "color-convert": "1.9.2" - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", - "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", - "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", - "requires": { - "postcss": "5.2.18" - } - }, - "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", - "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", - "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" - } - }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", - "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" - } - }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", - "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" - } - }, - "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=" - }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", - "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "uniqs": "2.0.0" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "2.0.6" - } - }, - "prop-types": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", - "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", - "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", - "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.6.0" - } - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" - }, - "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==" - }, - "quote-stream": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-0.0.0.tgz", - "integrity": "sha1-zeKelMQJsW4Z3HCYuJtmWPlyHTs=", - "requires": { - "minimist": "0.0.8", - "through2": "0.4.2" - } - }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "unpipe": "1.0.0" - }, - "dependencies": { - "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - } - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" - } - } - }, - "rc-align": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-2.4.3.tgz", - "integrity": "sha512-h5KgyB5IXYR7iKpYFcMr54cuQ2eozPCZ11kbXPG5+6CWvmyJ+c0R/yjndVndiNk2G3MKcTMbJNdDv5DIckLAxQ==", - "requires": { - "babel-runtime": "6.26.0", - "dom-align": "1.8.0", - "prop-types": "15.6.2", - "rc-util": "4.5.1" - } - }, - "rc-animate": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/rc-animate/-/rc-animate-2.4.4.tgz", - "integrity": "sha512-DjJLTUQj7XKKcuS8cczN0uOLfuSmgrVXFGieP1SZc87xUUTFGh8B/KjNmEtlfvxkSrSuVfb2rrEPER4SqKUtEA==", - "requires": { - "babel-runtime": "6.26.0", - "css-animation": "1.4.1", - "prop-types": "15.6.2" - } - }, - "rc-slider": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-8.6.2.tgz", - "integrity": "sha512-IZf/zSTXlvOoseOBjRgSGQywhxEUYiwhMrGOyTYraoihG7N5lKZZJtVM519eLMRG+SHYkpp7j7wAnGYnQ1TxUQ==", - "requires": { - "babel-runtime": "6.26.0", - "classnames": "2.2.6", - "prop-types": "15.6.2", - "rc-tooltip": "3.7.2", - "rc-util": "4.5.1", - "shallowequal": "1.1.0", - "warning": "3.0.0" - }, - "dependencies": { - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "requires": { - "loose-envify": "1.3.1" - } - } - } - }, - "rc-tooltip": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-3.7.2.tgz", - "integrity": "sha512-vsF29ohlfgr7lEP12aJ5j4U/4hzqSBYjWQo8I09re+q95v1o4nDjH1q/B3qFkf9aml2FbgdkJw9KYz/zXUgApA==", - "requires": { - "babel-runtime": "6.26.0", - "prop-types": "15.6.2", - "rc-trigger": "2.5.4" - } - }, - "rc-trigger": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-2.5.4.tgz", - "integrity": "sha512-clgXOdazDW2qg4vTZSAExpvOuojPNuMoamG+SxAm5Ih+rpVcrtEiDlDZWY4yUHyfEWJZBzgbrr4np/z2FK6RfA==", - "requires": { - "babel-runtime": "6.26.0", - "classnames": "2.2.6", - "prop-types": "15.6.2", - "rc-align": "2.4.3", - "rc-animate": "2.4.4", - "rc-util": "4.5.1" - } - }, - "rc-util": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-4.5.1.tgz", - "integrity": "sha512-PdCmHyBBodZdw6Oaikt0l+/R79IcRXpYkTrqD/Rbl4ZdoOi61t5TtEe40Q+A7rkWG5U1xjcN+h8j9H6GdtnICw==", - "requires": { - "add-dom-event-listener": "1.0.2", - "babel-runtime": "6.26.0", - "prop-types": "15.6.2", - "shallowequal": "0.2.2" - }, - "dependencies": { - "shallowequal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", - "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", - "requires": { - "lodash.keys": "3.1.2" - } - } - } - }, - "react": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", - "integrity": "sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI=", - "requires": { - "create-react-class": "15.6.3", - "fbjs": "0.8.17", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.2" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "react-addons-pure-render-mixin": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-addons-pure-render-mixin/-/react-addons-pure-render-mixin-15.6.2.tgz", - "integrity": "sha1-a4P0C2s27kBzXL1hJes/E84c3ck=", - "requires": { - "fbjs": "0.8.17", - "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "react-addons-update": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-addons-update/-/react-addons-update-15.6.2.tgz", - "integrity": "sha1-5TdTxbNIh5dFEMiC1/sHWFHV5QQ=", - "requires": { - "fbjs": "0.8.17", - "object-assign": "4.1.1" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "react-avatar": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/react-avatar/-/react-avatar-2.5.1.tgz", - "integrity": "sha512-bwH5pWY6uxaKZt+IZBfD+SU3Dpy3FaKbmAzrOI4N8SATUPLXOdGaJHWUl6Vl8hHSwWSsoLh/m7xYHdnn0lofZw==", - "requires": { - "babel-runtime": "6.26.0", - "is-retina": "1.0.3", - "md5": "2.2.1" - } - }, - "react-datetime": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/react-datetime/-/react-datetime-2.16.3.tgz", - "integrity": "sha512-amWfb5iGEiyqjLmqCLlPpu2oN415jK8wX1qoTq7qn6EYiU7qQgbNHglww014PT4O/3G5eo/3kbJu/M/IxxTyGw==", - "requires": { - "create-react-class": "15.6.3", - "object-assign": "3.0.0", - "prop-types": "15.6.2", - "react-onclickoutside": "6.9.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" - } - } - }, - "react-dom": { - "version": "15.6.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-15.6.2.tgz", - "integrity": "sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA=", - "requires": { - "fbjs": "0.8.17", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.2" - }, - "dependencies": { - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "react-dropzone": { - "version": "3.13.4", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-3.13.4.tgz", - "integrity": "sha1-hNomgVxAM5aRxJtFRMLvehaRLMw=", - "requires": { - "attr-accept": "1.1.3", - "prop-types": "15.6.2" - } - }, - "react-event-listener": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/react-event-listener/-/react-event-listener-0.6.6.tgz", - "integrity": "sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==", - "requires": { - "@babel/runtime": "7.6.3", - "prop-types": "15.6.2", - "warning": "4.0.3" - }, - "dependencies": { - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "1.3.1" - } - } - } - }, - "react-input-autosize": { - "version": "0.6.13", - "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-0.6.13.tgz", - "integrity": "sha1-OG/3qdLD3AFsJlvy5Z05cFD2Wvc=" - }, - "react-is": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.11.0.tgz", - "integrity": "sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==" - }, - "react-jade": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-jade/-/react-jade-2.5.0.tgz", - "integrity": "sha1-w02dLdPuoB9S/UnMKIpcGmh8lIw=", - "requires": { - "acorn": "1.2.2", - "constantinople": "3.0.2", - "ent": "2.2.0", - "jade": "1.9.2", - "js-stringify": "1.0.2", - "resolve": "1.8.1", - "static-module": "1.5.0", - "uglify-js": "2.8.29", - "with": "5.1.1" - }, - "dependencies": { - "acorn": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", - "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" - }, - "commander": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", - "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" - }, - "jade": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/jade/-/jade-1.9.2.tgz", - "integrity": "sha1-C4n5xg1OrSc46Ca6eyzKyaVwKr4=", - "requires": { - "character-parser": "1.2.1", - "commander": "2.6.0", - "constantinople": "3.0.2", - "mkdirp": "0.5.1", - "transformers": "2.1.0", - "void-elements": "2.0.1", - "with": "4.0.3" - }, - "dependencies": { - "with": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", - "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", - "requires": { - "acorn": "1.2.2", - "acorn-globals": "1.0.9" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "with": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", - "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", - "requires": { - "acorn": "3.3.0", - "acorn-globals": "3.1.0" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - }, - "acorn-globals": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", - "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" - } - } - } - } - } - } - }, - "react-lazy-cache": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/react-lazy-cache/-/react-lazy-cache-3.0.1.tgz", - "integrity": "sha1-DcZNON8XZ+93Z4xclBkAZMsRsM0=", - "requires": { - "deep-equal": "1.1.0" - } - }, - "react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "react-onclickoutside": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.9.0.tgz", - "integrity": "sha512-8ltIY3bC7oGhj2nPAvWOGi+xGFybPNhJM0V1H8hY/whNcXgmDeaeoCMPPd8VatrpTsUWjb/vGzrmu6SrXVty3A==" - }, - "react-popper": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-0.7.5.tgz", - "integrity": "sha512-ya9dhhGCf74JTOB2uyksEHhIGw7w9tNZRUJF73lEq2h4H5JT6MBa4PdT4G+sx6fZwq+xKZAL/sVNAIuojPn7Dg==", - "requires": { - "popper.js": "1.16.0", - "prop-types": "15.6.2" - } - }, - "react-portal": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/react-portal/-/react-portal-4.2.0.tgz", - "integrity": "sha512-Zf+vGQ/VEAb5XAy+muKEn48yhdCNYPZaB1BWg1xc8sAZWD8pXTgPtQT4ihBdmWzsfCq8p8/kqf0GWydSBqc+Eg==", - "requires": { - "prop-types": "15.6.2" - } - }, - "react-redux": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-4.4.9.tgz", - "integrity": "sha512-3XS7mjTOcvaP2H5OE/LxEgDHRuEyTZxBRlwvXHzNqYkZdYd7Ra98AimWoDSHP9OcLoydjA1ocgiZxxcqeXj0Sw==", - "requires": { - "create-react-class": "15.6.3", - "hoist-non-react-statics": "2.5.5", - "invariant": "2.2.4", - "lodash": "4.17.10", - "loose-envify": "1.3.1", - "prop-types": "15.6.2" - } - }, - "react-router": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-1.0.3.tgz", - "integrity": "sha1-mA7KoFW4bkfIZUjCMq4FqIpB8Lc=", - "requires": { - "invariant": "2.2.4", - "warning": "2.1.0" - } - }, - "react-router-dom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-4.3.1.tgz", - "integrity": "sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==", - "requires": { - "history": "4.10.1", - "invariant": "2.2.4", - "loose-envify": "1.3.1", - "prop-types": "15.6.2", - "react-router": "4.3.1", - "warning": "4.0.3" - }, - "dependencies": { - "history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "requires": { - "@babel/runtime": "7.6.3", - "loose-envify": "1.3.1", - "resolve-pathname": "3.0.0", - "tiny-invariant": "1.0.6", - "tiny-warning": "1.0.3", - "value-equal": "1.0.1" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "requires": { - "isarray": "0.0.1" - } - }, - "react-router": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", - "integrity": "sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==", - "requires": { - "history": "4.10.1", - "hoist-non-react-statics": "2.5.5", - "invariant": "2.2.4", - "loose-envify": "1.3.1", - "path-to-regexp": "1.7.0", - "prop-types": "15.6.2", - "warning": "4.0.3" - } - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "1.3.1" - } - } - } - }, - "react-select": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-0.9.1.tgz", - "integrity": "sha1-4yKi0KBjlqSCBrBVPfXsR9Fgg7o=", - "requires": { - "classnames": "2.2.6", - "react-input-autosize": "0.6.13" - } - }, - "react-switch-button": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/react-switch-button/-/react-switch-button-1.1.2.tgz", - "integrity": "sha1-jOhPaUa046k3PnttasjngNl/L08=" - }, - "react-textarea-autosize": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-5.2.1.tgz", - "integrity": "sha512-bx6z2I35aapr71ggw2yZIA4qhmqeTa4ZVsSaTeFvtf9kfcZppDBh2PbMt8lvbdmzEk7qbSFhAxR9vxEVm6oiMg==", - "requires": { - "prop-types": "15.6.2" - } - }, - "react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", - "requires": { - "dom-helpers": "3.4.0", - "loose-envify": "1.4.0", - "prop-types": "15.6.2", - "react-lifecycles-compat": "3.0.4" - }, - "dependencies": { - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "3.0.2" - } - } - } - }, - "react2angular": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/react2angular/-/react2angular-4.0.4.tgz", - "integrity": "sha1-UB51p8oZHEr29VglE8RanuA3VgI=", - "requires": { - "@types/lodash.frompairs": "4.0.4", - "angular": "1.7.2", - "lodash.frompairs": "4.0.1", - "ngcomponent": "4.1.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.6", - "set-immediate-shim": "1.0.1" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "mute-stream": "0.0.5" - } - }, - "recast": { - "version": "0.11.23", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", - "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", - "requires": { - "ast-types": "0.9.6", - "esprima": "3.1.3", - "private": "0.1.8", - "source-map": "0.5.7" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "recompose": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.26.0.tgz", - "integrity": "sha512-KwOu6ztO0mN5vy3+zDcc45lgnaUoaQse/a5yLVqtzTK13czSWnFGmXbQVmnoMgDkI5POd1EwIKSbjU1V7xdZog==", - "requires": { - "change-emitter": "0.1.6", - "fbjs": "0.8.17", - "hoist-non-react-statics": "2.5.5", - "symbol-observable": "1.2.0" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", - "requires": { - "balanced-match": "0.4.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" - } - } - }, - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "requires": { - "lodash": "4.17.10", - "lodash-es": "4.17.10", - "loose-envify": "1.3.1", - "symbol-observable": "1.2.0" - } - }, - "redux-form": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/redux-form/-/redux-form-4.2.2.tgz", - "integrity": "sha1-uK43pAcJBvRdvTCwcinxoQvyXLA=", - "requires": { - "deep-equal": "1.1.0", - "hoist-non-react-statics": "1.2.0", - "is-promise": "2.1.0", - "react-lazy-cache": "3.0.1" - }, - "dependencies": { - "hoist-non-react-statics": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz", - "integrity": "sha1-qkSM8JhtVcxAdzsXF0t90GbLfPs=" - } - } - }, - "redux-logger": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-2.10.2.tgz", - "integrity": "sha1-PFpfCm8yV3wd6t9mVfJX+CxsOTc=", - "requires": { - "deep-diff": "0.3.4" - } - }, - "redux-router": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redux-router/-/redux-router-1.0.0.tgz", - "integrity": "sha1-PBZ240Qb7FD+jZJFfAF8tjaZM08=", - "requires": { - "deep-equal": "1.1.0" - } - }, - "redux-thunk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz", - "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==" - }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==" - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" - }, - "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" - } - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regexp.prototype.flags": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.2.0.tgz", - "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", - "requires": { - "define-properties": "1.1.3" - } - }, - "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", - "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", - "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=" - } - } - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "1.0.2" - } - }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.7.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.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.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "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=" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.2" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "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=" - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "requires": { - "path-parse": "1.0.5" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" - }, - "resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "ripemd160": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-0.2.0.tgz", - "integrity": "sha1-K/GYveFnys+lHAqSjoS2i74XH84=" - }, - "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", - "requires": { - "once": "1.4.0" - } - }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" - }, - "s3": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/s3/-/s3-4.4.0.tgz", - "integrity": "sha1-VqT3dVFae2ucjlxrGrUfkDdmnx8=", - "requires": { - "aws-sdk": "2.0.31", - "fd-slicer": "1.0.1", - "findit2": "2.2.3", - "graceful-fs": "3.0.11", - "mime": "1.2.11", - "mkdirp": "0.5.1", - "pend": "1.2.0", - "rimraf": "2.2.8", - "streamsink": "1.2.0" - }, - "dependencies": { - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "requires": { - "natives": "1.1.4" - } - }, - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=" - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" - } - } - }, - "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==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=" - }, - "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", - "requires": { - "glob": "7.1.2", - "lodash": "4.17.10", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "5.0.0" - } - } - } - }, - "sass-loader": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-3.2.3.tgz", - "integrity": "sha1-dC6B/YFwqHcal54YYiUBZ0qI41U=", - "requires": { - "async": "1.5.2", - "loader-utils": "0.2.17", - "object-assign": "4.1.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - } - } - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "scss-tokenizer": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", - "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", - "requires": { - "js-base64": "2.4.5", - "source-map": "0.4.4" - } - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "requires": { - "debug": "2.6.9", - "depd": "1.1.2", - "destroy": "1.0.4", - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "etag": "1.8.1", - "fresh": "0.5.2", - "http-errors": "1.6.3", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - } - } - }, - "sentence-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz", - "integrity": "sha1-gDSq/CFFdy06vhUJqkLJ4QQtwTk=", - "requires": { - "lower-case": "1.1.4" - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "requires": { - "accepts": "1.3.5", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.3", - "mime-types": "2.1.18", - "parseurl": "1.3.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.2" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "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=" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "sha.js": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.2.6.tgz", - "integrity": "sha1-F93t3F9yL7ZlAWWIlUYZd4ZzFbo=" - }, - "shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=" - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shelljs": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", - "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "simple-assign": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/simple-assign/-/simple-assign-0.1.0.tgz", - "integrity": "sha1-F/0wZqXz13OPUDIbsPFMooHMS6o=" - }, - "sinon": { - "version": "2.0.0-pre", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.0.0-pre.tgz", - "integrity": "sha1-GCk7APsvFVyZ6OW0bjH36t4ygV0=", - "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "text-encoding": "0.5.2", - "util": "0.11.0" - } - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" - }, - "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=" - }, - "snake-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-1.1.2.tgz", - "integrity": "sha1-DC8l4wUVjZoY09l3BmGH/vilpmo=", - "requires": { - "sentence-case": "1.1.3" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.16.3" - } - }, - "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", - "requires": { - "faye-websocket": "0.10.0", - "uuid": "3.3.2" - } - }, - "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", - "requires": { - "debug": "2.6.9", - "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.4.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", - "requires": { - "websocket-driver": "0.7.0" - } - } - } - }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "requires": { - "is-plain-obj": "1.1.0" - } - }, - "source-list-map": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", - "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=" - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "requires": { - "amdefine": "1.0.1" - } - }, - "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==", - "requires": { - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } - } - }, - "spark-md5": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.0.tgz", - "integrity": "sha1-NyIifFTi+vJLHcbZM8wUTm9xv+8=" - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.2", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "safer-buffer": "2.1.2", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "static-eval": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-0.2.4.tgz", - "integrity": "sha1-t9NNg4k3uWn5ZBygfUj47eJj6ns=", - "requires": { - "escodegen": "0.0.28" - }, - "dependencies": { - "escodegen": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-0.0.28.tgz", - "integrity": "sha1-Dk/xcV8yh3XWyrUaxEpAbNer/9M=", - "requires": { - "esprima": "1.0.4", - "estraverse": "1.3.2", - "source-map": "0.4.4" - } - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=" - }, - "estraverse": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.3.2.tgz", - "integrity": "sha1-N8K4k+8T1yPydth41g2FNRUqbEI=" - } - } - }, - "static-module": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-1.5.0.tgz", - "integrity": "sha1-J9qYg8QajNCSNvhC8MHrxu32PYY=", - "requires": { - "concat-stream": "1.6.2", - "duplexer2": "0.0.2", - "escodegen": "1.3.3", - "falafel": "2.1.0", - "has": "1.0.3", - "object-inspect": "0.4.0", - "quote-stream": "0.0.0", - "readable-stream": "1.0.34", - "shallow-copy": "0.0.1", - "static-eval": "0.2.4", - "through2": "0.4.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" - } - }, - "stream-cache": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stream-cache/-/stream-cache-0.0.2.tgz", - "integrity": "sha1-GsWtaDJCjKVWZ9ve45Xa1ObbEY8=" - }, - "stream-consume": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz", - "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==" - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - }, - "dependencies": { - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" - } - } - }, - "streamsink": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/streamsink/-/streamsink-1.2.0.tgz", - "integrity": "sha1-76/unx4i01ke1949yqlcP1559zw=" - }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string.prototype.trimleft": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", - "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", - "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", - "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", - "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" - } - }, - "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.2" - } - }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "4.0.1" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=" - }, - "style-loader": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.13.2.tgz", - "integrity": "sha1-dFMzhM9pjHEEx5URULSXF63C87s=", - "requires": { - "loader-utils": "1.1.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - } - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.2", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.2", - "formidable": "1.2.1", - "methods": "1.1.2", - "mime": "1.6.0", - "qs": "6.5.2", - "readable-stream": "2.3.6" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", - "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" - } - }, - "swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=", - "requires": { - "lower-case": "1.1.4", - "upper-case": "1.1.3" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "table": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", - "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", - "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.17.10", - "slice-ansi": "0.0.4", - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "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=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "tapable": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz", - "integrity": "sha1-KcNXB8K3DlDQdIK10gLo7URtr9Q=" - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tcomb": { - "version": "3.2.29", - "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz", - "integrity": "sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==" - }, - "tcomb-validation": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tcomb-validation/-/tcomb-validation-3.4.1.tgz", - "integrity": "sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==", - "requires": { - "tcomb": "3.2.29" - } - }, - "text-encoding": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.5.2.tgz", - "integrity": "sha1-hbRmCBnwiHd2CUZVUWkP6hN9gko=" - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz", - "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=", - "requires": { - "readable-stream": "1.0.34", - "xtend": "2.1.2" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - } - } - }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" - }, - "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "requires": { - "setimmediate": "1.0.5" - } - }, - "tiny-invariant": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.0.6.tgz", - "integrity": "sha512-FOyLWWVjG+aC0UqG76V53yAWdXfH8bO6FNmyZOuUrzDzK8DI3/JRY25UD7+g49JWM1LXwymsKERB+DzI0dTEQA==" - }, - "tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "title-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-1.1.2.tgz", - "integrity": "sha1-+uSmrlRr+iLQg6DuqRCkDRLtT1o=", - "requires": { - "sentence-case": "1.1.3", - "upper-case": "1.1.3" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" - }, - "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" - }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=" - }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", - "requires": { - "punycode": "1.4.1" - } - }, - "transform-loader": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/transform-loader/-/transform-loader-0.2.4.tgz", - "integrity": "sha1-5ch4d7qW1R0/IlNoWHtG4ibRzsk=", - "requires": { - "loader-utils": "1.1.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - } - } - }, - "transformers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", - "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", - "requires": { - "css": "1.0.8", - "promise": "2.0.0", - "uglify-js": "2.2.5" - }, - "dependencies": { - "is-promise": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", - "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" - }, - "promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", - "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", - "requires": { - "is-promise": "1.0.1" - } - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "requires": { - "amdefine": "1.0.1" - } - }, - "uglify-js": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", - "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", - "requires": { - "optimist": "0.3.7", - "source-map": "0.1.43" - } - } - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" - }, - "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "requires": { - "prelude-ls": "1.1.2" - } - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.18" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "ua-parser-js": { - "version": "0.7.18", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", - "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==" - }, - "uglify-js": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.2.tgz", - "integrity": "sha512-/kVQDzwiE9Vy7Y63eMkMozF4jIt0C2+xHctF9YpqNWdE/NLOuMurshkpoYGUlAbeYhACPv0HJPIHJul0Ak4/uw==", - "requires": { - "commander": "2.15.1", - "source-map": "0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" - }, - "uncontrollable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-4.1.0.tgz", - "integrity": "sha1-4DWCkSUuGGUiLZCTmxny9J+Bwak=", - "requires": { - "invariant": "2.2.4" - } - }, - "underscore": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", - "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" - }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" - }, - "uniqs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", - "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" - }, - "upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=", - "requires": { - "upper-case": "1.1.3" - } - }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "requires": { - "punycode": "2.1.1" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - } - } - }, - "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=" - }, - "url-parse": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", - "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", - "requires": { - "querystringify": "2.0.0", - "requires-port": "1.0.0" - } - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "requires": { - "os-homedir": "1.0.2" - } - }, - "util": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.0.tgz", - "integrity": "sha512-5n12uMzKCjvB2HPFHnbQSjaqAa98L5iIXmHrZCLavuZVe0qe/SJGbDGWlpaHk5lnBkWRDO+dRu1/PgmUYKPPTw==", - "requires": { - "inherits": "2.0.3" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "requires": { - "define-properties": "1.1.3", - "object.getownpropertydescriptors": "2.0.3" - } - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, - "value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "vendors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz", - "integrity": "sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "requires": { - "indexof": "0.0.1" - } - }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" - }, - "warning": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-2.1.0.tgz", - "integrity": "sha1-ISINnGOvx3qMkhEeARr3Bc4MaQE=", - "requires": { - "loose-envify": "1.3.1" - } - }, - "watchpack": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", - "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", - "requires": { - "async": "0.9.2", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - }, - "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - } - } - }, - "webpack": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz", - "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", - "requires": { - "acorn": "3.3.0", - "async": "1.5.2", - "clone": "1.0.4", - "enhanced-resolve": "0.9.1", - "interpret": "0.6.6", - "loader-utils": "0.2.17", - "memory-fs": "0.3.0", - "mkdirp": "0.5.1", - "node-libs-browser": "0.7.0", - "optimist": "0.6.1", - "supports-color": "3.2.3", - "tapable": "0.1.10", - "uglify-js": "2.7.5", - "watchpack": "0.2.9", - "webpack-core": "0.6.9" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } - }, - "uglify-js": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", - "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", - "requires": { - "async": "0.2.10", - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" - } - } - } - } - }, - "webpack-core": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", - "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", - "requires": { - "source-list-map": "0.1.8", - "source-map": "0.4.4" - } - }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", - "requires": { - "memory-fs": "0.4.1", - "mime": "1.6.0", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" - }, - "dependencies": { - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" - } - } - } - }, - "webpack-dev-server": { - "version": "1.16.5", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-1.16.5.tgz", - "integrity": "sha1-DL1fLSrI1OWTqs1clwLnu9XlmJI=", - "requires": { - "compression": "1.7.2", - "connect-history-api-fallback": "1.5.0", - "express": "4.16.3", - "http-proxy-middleware": "0.17.4", - "open": "0.0.5", - "optimist": "0.6.1", - "serve-index": "1.9.1", - "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "stream-cache": "0.0.2", - "strip-ansi": "3.0.1", - "supports-color": "3.2.3", - "webpack-dev-middleware": "1.12.2" - }, - "dependencies": { - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "webpack-s3-plugin": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/webpack-s3-plugin/-/webpack-s3-plugin-0.6.7.tgz", - "integrity": "sha1-ABLVqFLwPYmz0gj8I3dA6K0iAyA=", - "requires": { - "aws-sdk": "2.0.31", - "cdnizer": "1.1.6", - "lodash": "4.17.10", - "progress": "1.1.8", - "s3": "4.4.0" - } - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "requires": { - "http-parser-js": "0.4.13", - "websocket-extensions": "0.1.3" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" - }, - "whatwg-fetch": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-0.9.0.tgz", - "integrity": "sha1-DjaExsuZlbQ+/J3wPkw2XZX9nMA=" - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "1.0.2" - } - }, - "winchan": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.2.0.tgz", - "integrity": "sha1-OGMCjn+XSw2hQS8oQXukJJcqvZQ=" - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" - }, - "with": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", - "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", - "requires": { - "acorn": "1.2.2", - "acorn-globals": "1.0.9" - }, - "dependencies": { - "acorn": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", - "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" - } - } - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "requires": { - "mkdirp": "0.5.1" - } - }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=" - }, - "xml2js": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.6.tgz", - "integrity": "sha1-0gnE5N2h/JxFIUHvQcB39a399sQ=", - "requires": { - "sax": "0.4.2" - }, - "dependencies": { - "sax": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.4.2.tgz", - "integrity": "sha1-OfO2AXM9a+yXEFskKipA/Wl4rDw=" - } - } - }, - "xmlbuilder": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.2.tgz", - "integrity": "sha1-F3bWXz/brUcKCNhgTN6xxOVA/4M=" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "0.4.0" - }, - "dependencies": { - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" - } - } - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - }, - "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "requires": { - "camelcase": "3.0.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" - } - } - }, - "zepto": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/zepto/-/zepto-0.0.4.tgz", - "integrity": "sha1-m7++DxwvVzvvqqz/6fVSzLP6J9I=" - } + "config": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/config/-/config-3.3.3.tgz", + "integrity": "sha512-T3RmZQEAji5KYqUQpziWtyGJFli6Khz7h0rpxDwYNjSkr5ynyTWwO7WpfjHzTXclNCDfSWQRcwMb+NwxJesCKw==", + "requires": { + "json5": "2.1.3" } }, - "tc-core-library-js": { - "version": "github:appirio-tech/tc-core-library-js#d16413db30b1eed21c0cf426e185bedb2329ddab", + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { - "auth0-js": "9.13.4", - "axios": "0.12.0", - "bunyan": "1.8.12", - "jsonwebtoken": "8.5.1", - "jwks-rsa": "1.8.0", - "le_node": "1.8.0", - "lodash": "4.17.15", - "millisecond": "0.1.2", - "request": "2.88.2" - }, - "dependencies": { - "auth0-js": { - "version": "9.13.4", - "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.13.4.tgz", - "integrity": "sha512-G7wXTtEUe8OG5UMdcFPoS47odorEZ3WerNyWLLhoGlLqYcPgv0t+B0ECHv/rVLULbpctbSBrRFFYa43/bJV4+Q==", - "requires": { - "base64-js": "1.3.1", - "idtoken-verifier": "2.0.3", - "js-cookie": "2.2.1", - "qs": "6.9.4", - "superagent": "3.8.3", - "url-join": "4.0.1", - "winchan": "0.2.2" - } - }, - "winchan": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.2.2.tgz", - "integrity": "sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ==" - } + "react-is": "16.13.1" } }, - "topcoder-react-lib": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/topcoder-react-lib/-/topcoder-react-lib-0.17.0.tgz", - "integrity": "sha512-XxLAMdEHPCmKqIIKTPKajbKzkz0lWW+tQJ6leG33d0xF5Quo1eiefd8SpQ+pBbQ8yEJ8aA2z2SQuZVruJzKDzQ==", + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", "requires": { - "auth0-js": "6.8.4", - "config": "3.3.1", - "isomorphic-fetch": "2.2.1", - "le_node": "1.8.0", - "lodash": "4.17.15", - "moment": "2.25.3", - "moment-duration-format": "2.3.2", - "moment-timezone": "0.5.31", - "qs": "6.9.4", - "react": "16.13.1", - "react-dom": "16.13.1", - "react-ga": "2.7.0", - "react-redux": "6.0.1", - "redux": "3.7.2", - "redux-actions": "2.6.5", - "to-capital-case": "1.0.0", - "topcoder-react-utils": "0.7.5" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "requires": { - "ms": "2.1.2" - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "1.2.5" - } - }, - "redux": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/redux/-/redux-3.7.2.tgz", - "integrity": "sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==", - "requires": { - "lodash": "4.17.15", - "lodash-es": "4.17.15", - "loose-envify": "1.4.0", - "symbol-observable": "1.2.0" - } - }, - "superagent": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", - "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", - "requires": { - "component-emitter": "1.3.0", - "cookiejar": "2.1.2", - "debug": "4.2.0", - "fast-safe-stringify": "2.0.7", - "form-data": "3.0.0", - "formidable": "1.2.2", - "methods": "1.1.2", - "mime": "2.4.6", - "qs": "6.9.4", - "readable-stream": "3.6.0", - "semver": "7.3.2" - } - }, - "tc-core-library-js": { - "version": "github:appirio-tech/tc-core-library-js#d16413db30b1eed21c0cf426e185bedb2329ddab", - "requires": { - "auth0-js": "9.14.0", - "axios": "0.12.0", - "bunyan": "1.8.12", - "jsonwebtoken": "8.5.1", - "jwks-rsa": "1.8.0", - "le_node": "1.8.0", - "lodash": "4.17.15", - "millisecond": "0.1.2", - "request": "2.88.2" - }, - "dependencies": { - "auth0-js": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.14.0.tgz", - "integrity": "sha512-40gIBUejmYAYse06ck6sxdNO0KU0pX+KDIQsWAkcyFtI0HU6dY5aeHxZfVYkYjtbArKr5s13LuZFdKrUiGyCqQ==", - "requires": { - "base64-js": "1.3.1", - "idtoken-verifier": "2.0.3", - "js-cookie": "2.2.1", - "qs": "6.9.4", - "superagent": "5.3.1", - "url-join": "4.0.1", - "winchan": "0.2.2" - } - } - } - }, - "topcoder-react-utils": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/topcoder-react-utils/-/topcoder-react-utils-0.7.5.tgz", - "integrity": "sha512-/jolO/UUCC/FL/MniBMFi9d7Wc1KbzwvgT5STGs4T+7u7R26bQugGPpGVISEPuglsmW0Xybh6iRi+pT/muOkbg==", - "requires": { - "babel-runtime": "6.26.0", - "body-parser": "1.19.0", - "command-line-args": "5.1.1", - "command-line-usage": "5.0.5", - "compression": "1.7.4", - "config": "1.31.0", - "cookie-parser": "1.4.5", - "express": "4.17.1", - "helmet": "3.22.0", - "lodash": "4.17.15", - "moment": "2.25.3", - "morgan": "1.10.0", - "node-forge": "0.7.6", - "prop-types": "15.7.2", - "raf": "3.4.1", - "react": "16.13.1", - "react-css-super-themr": "2.3.0", - "react-dom": "16.13.1", - "react-helmet": "5.2.1", - "react-redux": "5.1.2", - "react-router-dom": "4.3.1", - "redux": "3.7.2", - "redux-actions": "2.6.5", - "redux-devtools": "3.5.0", - "redux-devtools-dock-monitor": "1.1.3", - "redux-devtools-log-monitor": "1.4.0", - "redux-promise": "0.6.0", - "request-ip": "2.1.3", - "serialize-javascript": "1.9.1", - "serve-favicon": "2.5.0", - "shortid": "2.2.15", - "url-parse": "1.4.7" - }, - "dependencies": { - "config": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/config/-/config-1.31.0.tgz", - "integrity": "sha512-Ep/l9Rd1J9IPueztJfpbOqVzuKHQh4ZODMNt9xqTYdBBNRXbV4oTu34kCkkfdRVcDq0ohtpaeXGgb+c0LQxFRA==", - "requires": { - "json5": "1.0.1" - } - }, - "react-redux": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-5.1.2.tgz", - "integrity": "sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==", - "requires": { - "@babel/runtime": "7.9.6", - "hoist-non-react-statics": "3.3.2", - "invariant": "2.2.4", - "loose-envify": "1.4.0", - "prop-types": "15.7.2", - "react-is": "16.13.1", - "react-lifecycles-compat": "3.0.4" - } - } - } - }, - "winchan": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.2.2.tgz", - "integrity": "sha512-pvN+IFAbRP74n/6mc6phNyCH8oVkzXsto4KCHPJ2AScniAnA1AmeLI03I2BzjePpaClGSI4GUMowzsD3qz5PRQ==" - } + "minimist": "1.2.5" + } + }, + "react-redux": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-6.0.1.tgz", + "integrity": "sha512-T52I52Kxhbqy/6TEfBv85rQSDz6+Y28V/pf52vDWs1YRXG19mcFOGfHnY2HsNFHyhP+ST34Aih98fvt6tqwVcQ==", + "requires": { + "@babel/runtime": "7.9.6", + "hoist-non-react-statics": "3.3.2", + "invariant": "2.2.4", + "loose-envify": "1.4.0", + "prop-types": "15.7.2", + "react-is": "16.13.1" + } + }, + "redux": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", + "requires": { + "loose-envify": "1.4.0", + "symbol-observable": "1.2.0" } }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" + }, "topcoder-react-utils": { "version": "0.7.9", "resolved": "https://registry.npmjs.org/topcoder-react-utils/-/topcoder-react-utils-0.7.9.tgz", @@ -25032,7 +14763,7 @@ "command-line-args": "5.1.1", "command-line-usage": "5.0.5", "compression": "1.7.4", - "config": "3.3.1", + "config": "3.3.3", "cookie-parser": "1.4.5", "cross-env": "5.2.1", "express": "4.17.1", @@ -25061,19 +14792,6 @@ "shortid": "2.2.15", "url-parse": "1.4.7" } - }, - "winchan": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.1.4.tgz", - "integrity": "sha1-iPoSQRzVQutiYBjDihlry7F5k7s=" - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "requires": { - "object-keys": "0.4.0" - } } } }, @@ -33526,11 +23244,11 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "topcoder-react-lib": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/topcoder-react-lib/-/topcoder-react-lib-1.1.4.tgz", - "integrity": "sha512-SnzmumXAyYNUt9c8IHxF9Mt3lNx4PX9i79UfG9fz539JX1BpuNcrZSNvZksj9BgWBKwCQbAa+2H81SgSCiRK0A==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/topcoder-react-lib/-/topcoder-react-lib-1.1.5.tgz", + "integrity": "sha512-XD1QPxuaD4w6plhYhU/q4bnwAd498HYCHAANkXt6bztrm0hmmwZFHIJGOtVEozwz1B8EnOsHfVlyn12j5EtEXQ==", "requires": { - "@topcoder-platform/tc-auth-lib": "git+https://github.com/topcoder-platform/tc-auth-lib.git#fbd62f7c65f0e7eecccf2c131b07e84104505754", + "@topcoder-platform/tc-auth-lib": "git+https://github.com/topcoder-platform/tc-auth-lib.git#68fdc22464810c51b703a33e529cdbd6d09437de", "auth0-js": "6.8.4", "config": "3.3.3", "isomorphic-fetch": "2.2.1", @@ -33551,7 +23269,7 @@ }, "dependencies": { "@topcoder-platform/tc-auth-lib": { - "version": "git+https://github.com/topcoder-platform/tc-auth-lib.git#fbd62f7c65f0e7eecccf2c131b07e84104505754", + "version": "git+https://github.com/topcoder-platform/tc-auth-lib.git#68fdc22464810c51b703a33e529cdbd6d09437de", "requires": { "lodash": "4.17.20" }, diff --git a/src/shared/components/challenge-listing/Filters/FiltersPanel/index.jsx b/src/shared/components/challenge-listing/Filters/FiltersPanel/index.jsx index d20e5ddc75..e7966c7064 100644 --- a/src/shared/components/challenge-listing/Filters/FiltersPanel/index.jsx +++ b/src/shared/components/challenge-listing/Filters/FiltersPanel/index.jsx @@ -559,6 +559,7 @@ export default function FiltersPanel({ events: [], endDateStart: null, startDateEnd: null, + status: 'Active', reviewOpportunityTypes: _.keys(REVIEW_OPPORTUNITY_TYPES), customDate: false, });