diff --git a/.gitignore b/.gitignore index 6aefb44220..b39ceac3b7 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,3 @@ node_modules/ *.db ye-olde-project /bin/ -# ignore local BIT artifacts -.bit -.bitmap -bit.json diff --git a/CHANGELOG.md b/CHANGELOG.md index ac8eae4cc3..60e8ed50ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,45 @@ # Change Log +## [v4.1.0](https://github.com/marklogic/marklogic-data-hub/releases/tag/4.1.0) (2018-12-19) + +Bug + + [DHFPROD-1193] - #1261 ⁃ "gradle createEntity" does not create an entity descriptor file + [DHFPROD-1263] - DataHub.runPreInstallCheck() returning incorrect results + [DHFPROD-1304] - mlDeploySecurity is not deploying protected-paths and query-rolesets + [DHFPROD-1328] - Able to create duplicate flow (input or harmonize) + [DHFPROD-1400] - Gradle Tasks using incorrect datahub.isInstalled() check to verify DHF installation + [DHFPROD-1433] - QuickStart entity editor: too many properties, buttons are hidden + [DHFPROD-1557] - Memory leak on gradle runFlow + [DHFPROD-1561] - DataHub installation fails + [DHFPROD-1576] - ./gradlew build fails with no user provided error + [DHFPROD-1592] - hubUpdate should work even when the project fails an initialization check + [DHFPROD-1595] - mlDeploy fails post hubUpdate in 4.1-rc1 DHF version + [DHFPROD-1601] - Deploy fails when mlModulePermissions does not exist in gradle.properties + [DHFPROD-1605] - mlDeploy fails when an amp exists under src/main/ml-config + [DHFPROD-1608] - QuickStart 4.1.0-rc fails to display flows + [DHFPROD-1615] - Upgrade issues in DHF with versions 4.0.x + [DHFPROD-1617] - Update documentation for 4.1.0 + [DHFPROD-1636] - hubGeneratePii task is failing + [DHFPROD-1637] - Docs: "Independent STAGING and FINAL App Server Stacks Stacks" link redirection error + [DHFPROD-1640] - Triggers config from hub-internal-config is making post request to data-hub-final-TRIGGERS database + [DHFPROD-1645] - 4.1.0 'mlUpdateIndexes' command is giving error with in provisioned environment + [DHFPROD-1646] - Deployment fails with non default hub admin role and user + + +Story + + [DHFPROD-1338] - Create spring application context and make properties file a singleton configuration + [DHFPROD-1339] - Rework application architecture to use Spring IoC + [DHFPROD-1422] - Clarify through the QuickStart UI the origin of the source URI field in the Mapping Screen + [DHFPROD-1436] - Upgrade to Java 10 and OpenJDK + [DHFPROD-1518] - Design the ml-gradle solution + [DHFPROD-1519] - Separation of DHF override code from vanilla ml-gradle tasks + [DHFPROD-1524] - Stitch together quick-start Spring Context with core . + [DHFPROD-1554] - Release Notes and Upgrade guidance for 4.1 + + + ## [v4.0.3](https://github.com/marklogic/marklogic-data-hub/tree/v4.0.3) (2018-11-19) Bug diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000000..f753fb0816 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,377 @@ +@Library('shared-libraries') _ +import groovy.json.JsonSlurper +import groovy.json.JsonSlurperClassic +def gitDataHubRepo="https://github.com/kkanthet/marklogic-data-hub.git" +def JAVA_HOME="/opt/jdk1.8.0_201/" +def GRADLE_USER_HOME="/.gradle" +def MAVEN_HOME="/usr/local/maven" +def JIRA_ID=""; +def commitMessage=""; +def prResponse=""; +def prNumber; +pipeline{ + agent none; + options { + checkoutToSubdirectory 'data-hub' + } + stages{ + stage('Build-datahub'){ + agent { label 'dhfLinuxAgent'} + steps{ + script{ + if(env.CHANGE_TITLE){ + JIRA_ID=env.CHANGE_TITLE.split(':')[0]; + def transitionInput =[transition: [id: '41']] + jiraTransitionIssue idOrKey: JIRA_ID, input: transitionInput, site: 'JIRA' + } + } + println(BRANCH_NAME) + sh 'echo '+JAVA_HOME+'export '+JAVA_HOME+' export $WORKSPACE/data-hub'+GRADLE_USER_HOME+' export '+MAVEN_HOME+' export PATH=$PATH:$MAVEN_HOME/bin; cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;./gradlew build -x test -Pskipui=true;' + archiveArtifacts artifacts: 'data-hub/marklogic-data-hub/build/libs/* , data-hub/ml-data-hub-plugin/build/libs/* , data-hub/quick-start/build/libs/', onlyIfSuccessful: true } + } + stage('Unit-Tests'){ + agent { label 'dhfLinuxAgent'} + steps{ + //copyRPM 'Latest' + //setUpML '$WORKSPACE/xdmp/src/Mark*.rpm' + //setUpML '/space/Mark*.rpm' + sh 'echo '+JAVA_HOME+'export '+JAVA_HOME+' export $WORKSPACE/data-hub'+GRADLE_USER_HOME+'export '+MAVEN_HOME+'export PATH=$PATH:$MAVEN_HOME/bin; cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;./gradlew clean' + //junit '**/TEST-*.xml' + script{ + if(env.CHANGE_TITLE){ + JIRA_ID=env.CHANGE_TITLE.split(':')[0] + jiraAddComment comment: 'Jenkins Unit Test Results For PR Available', idOrKey: JIRA_ID, site: 'JIRA' + } + } + } + post{ + success { + println("Unit Tests Completed") + sendMail 'kkanthet@marklogic.com','Check: ${BUILD_URL}/console',false,'Unit Tests for $BRANCH_NAME Passed' + } + failure { + println("Unit Tests Failed") + sendMail 'kkanthet@marklogic.com','Check: ${BUILD_URL}/console',false,'Unit Tests for $BRANCH_NAME Failed' + } + } + } + stage('code-review'){ + when { + allOf { + changeRequest author: '', authorDisplayName: '', authorEmail: '', fork: '', id: '', target: '', title: '', url: '' + } + beforeAgent true + } + agent {label 'master'}; + steps{ + script{ + if(env.CHANGE_TITLE.split(':')[1].contains("Automated PR")){ + println("Automated PR") + sh 'exit 0' + }else{ + + sendMail 'kkanthet@marklogic.com','Check: ${BUILD_URL}/console',false,'Waiting for code review $BRANCH_NAME ' + try{ + timeout(time:5, unit:'MINUTES') { + input message:'Review Done?' + } + }catch(err){ + currentBuild.result = "SUCCESS" + } + } + } + } + } + stage('PR'){ + when { + changeRequest() + beforeAgent true + } + agent {label 'master'}; + steps{ + retry(5){ + withCredentials([usernameColonPassword(credentialsId: 'a0ec09aa-f339-44de-87c4-1a4936df44f5', variable: 'Credentials')]) { + script{ + JIRA_ID=env.CHANGE_TITLE.split(':')[0] + def response = sh (returnStdout: true, script:'''curl -u $Credentials --header "application/vnd.github.merge-info-preview+json" "https://api.github.com/repos/kkanthet/marklogic-data-hub/pulls/$CHANGE_ID" | grep '"mergeable_state":' | cut -d ':' -f2 | cut -d ',' -f1 | tr -d '"' ''') + response=response.trim(); + println(response) + if(response.equals("clean")){ + println("merging can be done") + sh "curl -o - -s -w \"\n%{http_code}\n\" -X PUT -d '{\"commit_title\": \"$JIRA_ID: merging PR\"}' -u $Credentials https://api.github.com/repos/kkanthet/marklogic-data-hub/pulls/$CHANGE_ID/merge | tail -1 > mergeResult.txt" + def mergeResult = readFile('mergeResult.txt').trim() + if(mergeResult==200){ + println("Merge successful") + }else{ + println("Merge Failed") + } + }else if(response.equals("blocked")){ + println("retry blocked"); + sleep time: 1, unit: 'MINUTES' + throw new Exception("Waiting for all the status checks to pass"); + }else if(response.equals("unstable")){ + println("retry unstable") + sh "curl -o - -s -w \"\n%{http_code}\n\" -X PUT -d '{\"commit_title\": \"$JIRA_ID: merging PR\"}' -u $Credentials https://api.github.com/repos/kkanthet/marklogic-data-hub/pulls/$CHANGE_ID/merge | tail -1 > mergeResult.txt" + def mergeResult = readFile('mergeResult.txt').trim() + println("Result is"+ mergeResult) + }else{ + println("merging not possible") + currentBuild.result = "FAILURE" + sh 'exit 1'; + } + } + } + } + } + post{ + success { + println("Merge Successful") + script{ + sendMail 'kkanthet@marklogic.com','Check: ${BUILD_URL}/console',false,' $BRANCH_NAME is Merged' + } + } + failure { + println("Retried 5times") + sendMail 'stadikon@marklogic.com','Check: ${BUILD_URL}/console',false,' $BRANCH_NAME Cannot be Merged' + } + } + } + stage('E2E Single Tests'){ + when { + branch 'FeatureBranch' + } + agent { label 'dhfLinuxAgent'} + steps{ + //copyRPM 'Latest' + //setUpML '$WORKSPACE/xdmp/src/Mark*.rpm' + //setUpML '/space/Mark*.rpm' + sh 'echo '+JAVA_HOME+'export '+JAVA_HOME+' export $WORKSPACE/data-hub'+GRADLE_USER_HOME+'export '+MAVEN_HOME+'export PATH=$PATH:$MAVEN_HOME/bin; cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;./gradlew clean' + //junit '**/TEST-*.xml' + script{ + commitMessage = sh (returnStdout: true, script:''' + curl -u $Credentials -X GET "https://api.github.com/repos/kkanthet/marklogic-data-hub/git/commits/${GIT_COMMIT}" ''') + def slurper = new JsonSlurperClassic().parseText(commitMessage.toString().trim()) + def commit=slurper.message.toString().trim(); + JIRA_ID=commit.split(("\\n"))[0].split(':')[0].trim(); + JIRA_ID=JIRA_ID.split(" ")[0]; + commitMessage=null; + jiraAddComment comment: 'Jenkins End-End Unit Test Results For PR Available', idOrKey: JIRA_ID, site: 'JIRA' + } + } + post{ + success { + println("End-End Tests Completed") + sendMail 'stadikon@marklogic.com','Check: ${BUILD_URL}/console',false,'End-End Tests for $BRANCH_NAME Passed' + + } + failure { + println("End-End Tests Failed") + sendMail 'stadikon@marklogic.com','Check: ${BUILD_URL}/console',false,'End-End Tests for $BRANCH_NAME Failed' + } + } + } + stage('Merge PR to Integration Branch'){ + when { + branch 'FeatureBranch' + beforeAgent true + } + agent {label 'master'} + steps{ + withCredentials([usernameColonPassword(credentialsId: 'a0ec09aa-f339-44de-87c4-1a4936df44f5', variable: 'Credentials')]) { + script{ + //JIRA_ID=env.CHANGE_TITLE.split(':')[0] + prResponse = sh (returnStdout: true, script:''' + curl -u $Credentials -X POST -H 'Content-Type:application/json' -d '{\"title\": \"Automated PR for Integration Branch\" , \"head\": \"FeatureBranch\" , \"base\": \"IntegrationBranch\" }' https://api.github.com/repos/kkanthet/marklogic-data-hub/pulls ''') + println(prResponse) + def slurper = new JsonSlurper().parseText(prResponse) + println(slurper.number) + prNumber=slurper.number; + } + } + withCredentials([usernameColonPassword(credentialsId: 'rahul-git', variable: 'Credentials')]) { + sh "curl -u $Credentials -X POST -d '{\"event\": \"APPROVE\"}' https://api.github.com/repos/kkanthet/marklogic-data-hub/pulls/${prNumber}/reviews" + } + withCredentials([usernameColonPassword(credentialsId: 'a0ec09aa-f339-44de-87c4-1a4936df44f5', variable: 'Credentials')]) { + script{ + sh "curl -o - -s -w \"\n%{http_code}\n\" -X PUT -d '{\"commit_title\": \"$JIRA_ID: Merge pull request\"}' -u $Credentials https://api.github.com/repos/kkanthet/marklogic-data-hub/pulls/${prNumber}/merge | tail -1 > mergeResult.txt" + def mergeResult = readFile('mergeResult.txt').trim() + if(mergeResult==200){ + println("Merge successful") + }else{ + println("Merge Failed") + } + } + } + + } + post{ + success { + println("Automated PR For Integration branch Completed") + } + failure { + println("Creation of Automated PR Failed") + + } + } + } + stage('Parallel Execution'){ + parallel{ + stage('Upgrade Tests'){ + when { + branch 'IntegrationBranch' + beforeAgent true + } + agent { label 'dhfLinuxAgent'} + steps{ + //copyRPM 'Latest' + //setUpML '$WORKSPACE/xdmp/src/Mark*.rpm' + //setUpML '/space/Mark*.rpm' + sh 'echo '+JAVA_HOME+'export '+JAVA_HOME+' export $WORKSPACE/data-hub'+GRADLE_USER_HOME+'export '+MAVEN_HOME+'export PATH=$PATH:$MAVEN_HOME/bin; cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;./gradlew clean' + //junit '**/TEST-*.xml' + script{ + commitMessage = sh (returnStdout: true, script:''' + curl -u $Credentials -X GET "https://api.github.com/repos/kkanthet/marklogic-data-hub/git/commits/${GIT_COMMIT}" ''') + def slurper = new JsonSlurperClassic().parseText(commitMessage.toString().trim()) + def commit=slurper.message.toString().trim(); + JIRA_ID=commit.split(("\\n"))[0].split(':')[0].trim(); + JIRA_ID=JIRA_ID.split(" ")[0]; + commitMessage=null; + jiraAddComment comment: 'Jenkins Upgrade Test Results For PR Available', idOrKey: JIRA_ID, site: 'JIRA' + } + } + post{ + success { + println("Upgrade Tests Completed") + sendMail 'stadikon@marklogic.com','Check: ${BUILD_URL}/console',false,'Upgrade Tests for $BRANCH_NAME Passed' + // sh './gradlew publish' + } + failure { + println("Upgrade Tests Failed") + sendMail 'stadikon@marklogic.com','Check: ${BUILD_URL}/console',false,'Upgrade Tests for $BRANCH_NAME Failed' + } + } + } + stage('End2End all Tests'){ + when { + branch 'IntegrationBranch' + beforeAgent true + } + agent { label 'dhfWindowsAgent'} + steps{ + //copyRPM 'Latest' + //setUpML '$WORKSPACE/xdmp/src/Mark*.rpm' + //setUpML '/space/Mark*.rpm' + sh 'echo '+JAVA_HOME+'export '+JAVA_HOME+' export $WORKSPACE/data-hub'+GRADLE_USER_HOME+'export '+MAVEN_HOME+'export PATH=$PATH:$MAVEN_HOME/bin; cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;./gradlew clean; -Pskipui=true' + //junit '**/TEST-*.xml' + script{ + commitMessage = sh (returnStdout: true, script:''' + curl -u $Credentials -X GET "https://api.github.com/repos/kkanthet/marklogic-data-hub/git/commits/${GIT_COMMIT}" ''') + def slurper = new JsonSlurperClassic().parseText(commitMessage.toString().trim()) + def commit=slurper.message.toString().trim(); + JIRA_ID=commit.split(("\\n"))[0].split(':')[0].trim(); + JIRA_ID=JIRA_ID.split(" ")[0]; + commitMessage=null; + jiraAddComment comment: 'Jenkins End-End All Test Results For PR Available', idOrKey: JIRA_ID, site: 'JIRA' + } + } + post{ + success { + println("Upgrade Tests Completed") + sendMail 'stadikon@marklogic.com','Check: ${BUILD_URL}/console',false,'End-End all Tests for $BRANCH_NAME Passed' + // sh './gradlew publish' + } + failure { + println("Upgrade Tests Failed") + sendMail 'stadikon@marklogic.com','Check: ${BUILD_URL}/console',false,'End-End All Tests for $BRANCH_NAME Failed' + } + } + } + } + } + stage('Merge PR to Release Branch'){ + when { + branch 'IntegrationBranch' + beforeAgent true + } + agent {label 'master'} + steps{ + withCredentials([usernameColonPassword(credentialsId: 'a0ec09aa-f339-44de-87c4-1a4936df44f5', variable: 'Credentials')]) { + script{ + //JIRA_ID=env.CHANGE_TITLE.split(':')[0] + prResponse = sh (returnStdout: true, script:''' + curl -u $Credentials -X POST -H 'Content-Type:application/json' -d '{\"title\": \"Automated PR for Integration Branch\" , \"head\": \"IntegrationBranch\" , \"base\": \"ReleaseBranch\" }' https://api.github.com/repos/kkanthet/marklogic-data-hub/pulls ''') + println(prResponse) + def slurper = new JsonSlurper().parseText(prResponse) + println(slurper.number) + prNumber=slurper.number; + } + } + withCredentials([usernameColonPassword(credentialsId: 'rahul-git', variable: 'Credentials')]) { + sh "curl -u $Credentials -X POST -d '{\"event\": \"APPROVE\"}' https://api.github.com/repos/kkanthet/marklogic-data-hub/pulls/${prNumber}/reviews" + } + withCredentials([usernameColonPassword(credentialsId: 'a0ec09aa-f339-44de-87c4-1a4936df44f5', variable: 'Credentials')]) { + script{ + sh "curl -o - -s -w \"\n%{http_code}\n\" -X PUT -d '{\"commit_title\": \"$JIRA_ID: Merge pull request\"}' -u $Credentials https://api.github.com/repos/kkanthet/marklogic-data-hub/pulls/${prNumber}/merge | tail -1 > mergeResult.txt" + def mergeResult = readFile('mergeResult.txt').trim() + if(mergeResult==200){ + println("Merge successful") + }else{ + println("Merge Failed") + } + } + } + + } + post{ + success { + println("Automated PR For Release branch created") + + } + failure { + println("Creation of Automated PR Failed") + } + } + } + stage('Sanity Tests'){ + when { + branch 'ReleaseBranch' + beforeAgent true + } + agent { label 'dhfLinuxAgent'} + steps{ + //copyRPM 'Latest' + //setUpML '$WORKSPACE/xdmp/src/Mark*.rpm' + //setUpML '/space/Mark*.rpm' + sh 'echo '+JAVA_HOME+'export '+JAVA_HOME+' export $WORKSPACE/data-hub'+GRADLE_USER_HOME+'export '+MAVEN_HOME+'export PATH=$PATH:$MAVEN_HOME/bin; cd $WORKSPACE/data-hub;rm -rf $GRADLE_USER_HOME/caches;./gradlew clean;./gradlew clean;./gradlew :marklogic-data-hub:test --tests com.marklogic.hub.processes.ProcessManagerTest -Pskipui=true' + //junit '**/TEST-*.xml' + script{ + commitMessage = sh (returnStdout: true, script:''' + curl -u $Credentials -X GET "https://api.github.com/repos/kkanthet/marklogic-data-hub/git/commits/${GIT_COMMIT}" ''') + def slurper = new JsonSlurperClassic().parseText(commitMessage.toString().trim()) + def commit=slurper.message.toString().trim(); + JIRA_ID=commit.split(("\\n"))[0].split(':')[0].trim(); + JIRA_ID=JIRA_ID.split(" ")[0]; + commitMessage=null; + jiraAddComment comment: 'Jenkins Sanity Test Results For PR Available', idOrKey: JIRA_ID, site: 'JIRA' + } + } + post{ + success { + println("Sanity Tests Completed") + sendMail 'stadikon@marklogic.com','Check: ${BUILD_URL}/console',false,'Sanity Tests for $BRANCH_NAME Passed' + script{ + def transitionInput =[transition: [id: '31']] + //JIRA_ID=env.CHANGE_TITLE.split(':')[0] + jiraTransitionIssue idOrKey: JIRA_ID, input: transitionInput, site: 'JIRA' + } + sendMail 'stadikon@marklogic.com','Click approve to release',false,'Datahub is ready for Release' + + } + failure { + println("Sanity Tests Failed") + sendMail 'stadikon@marklogic.com','Check: ${BUILD_URL}/console',false,'Sanity Tests for $BRANCH_NAME Failed' + } + } + } + } +} diff --git a/NOTICES.txt b/NOTICES.txt index 0308715bfe..f87cff807a 100755 --- a/NOTICES.txt +++ b/NOTICES.txt @@ -1,8 +1,8 @@ -MarkLogic Data Hub Product Notices +MarkLogic Data Hub Product Notices -Last updated: September 14, 2018 +Last updated: November 26, 2018 -Copyright 2018 MarkLogic Corporation. MarkLogic and the MarkLogic logo are trademarks or registered trademarks of MarkLogic Corporation in the United States and other countries. All other trademarks are the property of their respective owners. +Copyright © 2018 MarkLogic Corporation. MarkLogic and the MarkLogic logo are trademarks or registered trademarks of MarkLogic Corporation in the United States and other countries. All other trademarks are the property of their respective owners. This project is licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with the License. You may obtain a copy of the License at @@ -20,6 +20,7 @@ Open source software required to be made available under license is included her The following software may be included in this project: @angular-mdl/core 4.0.8 + Attribution Statements http://mseemann.io/angular2-mdl/ @@ -50,7 +51,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/mseemann/angular2-mdl + @angular-mdl/popover 0.10.0 + Attribution Statements https://www.npmjs.com/package/@angular-mdl/popover @@ -81,7 +84,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/mseemann/angular2-mdl-ext + @angular-mdl/select 0.13.0 + Attribution Statements https://www.npmjs.com/package/@angular-mdl/select @@ -112,7 +117,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/mseemann/angular2-mdl-ext + Angular 4.4.6 + Attribution Statements https://angular.io/ @@ -143,7 +150,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/angular/angular + Angular DevKit 0.0.22 + Attribution Statements https://www.npmjs.com/package/@angular-devkit/build-optimizer @@ -174,11 +183,13 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/angular/devkit -Apache Commons CSV 1.4 + +Apache Commons CSV™ 1.4 + Attribution Statements http://commons.apache.org/proper/commons-csv/ -Modifications copyright 2017 MarkLogic Corporation. +Modifications copyright © 2017 MarkLogic Corporation. September 2017 MarkLogic modified the parser to include the byte count of the original data read. Copyright Statements @@ -188,7 +199,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/apache/commons-csv -Apache Commons IO 2.4 + +Apache Commons IO™ 2.4 + Attribution Statements http://commons.apache.org/proper/commons-io/ @@ -199,7 +212,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://git-wip-us.apache.org/repos/asf?p=commons-io.git -Apache Commons Text 1.1 + +Apache Commons Text™ 1.1 + Attribution Statements http://commons.apache.org/proper/commons-text/ @@ -213,7 +228,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache Licnese 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/apache/commons-text -Apache HttpComponents HttpClient 4.5.3 + +Apache HttpComponents™ HttpClient 4.3.5 + Attribution Statements https://hc.apache.org/httpcomponents-client-ga/index.html @@ -224,23 +241,27 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/apache/httpcomponents-client + AspectJ 1.8.9 + Attribution Statements https://www.eclipse.org/aspectj/ Copyright Statements -Copyright 2018 The Eclipse Foundation. All Rights Reserved. +Copyright © 2018 The Eclipse Foundation. All Rights Reserved. License Text (https://spdx.org/licenses/EPL-1.0.html) Made available under the Eclipse Public License 1.0. See Appendix for full text. Source materials are available for download at: http://git.eclipse.org/c/aspectj/org.aspectj.git + Azure Resource Manager + Attribution Statements https://azure.microsoft.com/en-us/features/resource-manager/ Copyright Statements - 2017 Microsoft +© 2017 Microsoft License Text (https://azure.microsoft.com/en-us/support/legal/) https://azure.microsoft.com/en-us/support/legal/ @@ -249,6 +270,7 @@ https://azure.microsoft.com/en-us/support/legal/marketplace-terms/ https://azure.microsoft.com/en-us/support/legal/preview-supplemental-terms/ CentOS (for Microsoft Azure Linux Agent) 7.3 + Attribution Statements https://azuremarketplace.microsoft.com/en-us/marketplace/apps/RogueWave.CentOSbased73?tab=Overview @@ -293,7 +315,7 @@ You will be billed by Windows Azure under the terms of the Windows Azure Custome 4.1. Intellectual Property Rights. Intellectual property rights includes, without limitation, all copyrights, trademarks, service marks, trade secrets, patents, moral rights, and any and all other legal rights protecting intangible proprietary information ("IPR"). All pre-existing intellectual property rights owned or licensed by either party are and will remain the exclusive property of that party. - 4.2. License. During the term of this Agreement, you may choose to provide OpenLogic with access to Your IPR to facilitate OpenLogic in providing the Services, in which case you grant to OpenLogic all rights and licenses in and to the Your Technology as may be necessary for OpenLogic to complete its obligations under this Agreement. It should be noted that OpenLogic does not have access to Your Technology deployed on Windows Azure unless you choose to give OpenLogic access as part of providing the Services. OpenLogic hereby grants to you a non-exclusive, non-transferable, worldwide license to use, reproduce, and modify any OpenLogic IPR provided to you during the course of performing the Services for your own internal business purposes. To the extent any deliverable hereunder is a derivative work, modification, patch, or script of or directly relating to an open source software project (each an Open Source Deliverable), OpenLogic will license such Open Source Deliverable under the same open source software license as the open source project to which it relates. + 4.2. License. During the term of this Agreement, you may choose to provide OpenLogic with access to Your IPR to facilitate OpenLogic in providing the Services, in which case you grant to OpenLogic all rights and licenses in and to the Your Technology as may be necessary for OpenLogic to complete its obligations under this Agreement. It should be noted that OpenLogic does not have access to Your Technology deployed on Windows Azure unless you choose to give OpenLogic access as part of providing the Services. OpenLogic hereby grants to you a non-exclusive, non-transferable, worldwide license to use, reproduce, and modify any OpenLogic IPR provided to you during the course of performing the Services for your own internal business purposes. To the extent any deliverable hereunder is a derivative work, modification, patch, or script of or directly relating to an open source software project (each an “Open Source Deliverable”), OpenLogic will license such Open Source Deliverable under the same open source software license as the open source project to which it relates. 4.3. OSS Stacks License. The OSS Stacks are comprised of open source software, which is subject to the terms of the open source software license(s) accompanying or otherwise applicable to that open source software. Any other code created and supplied directly by OpenLogic is governed by the MIT License. The terms of the open source software licenses apply to the open source software independent of the terms of the MIT License or this agreement. Nothing in this agreement limits your rights under or grants rights to you that supersede the terms of any applicable open source software license. @@ -307,9 +329,9 @@ In the course of OpenLogic providing you with technical support, you may provide 6. Warranties. - 6.1. General. Each party represents and warrants to the other party that: the performance of such partys obligations hereunder do not and will not violate any law, rule or regulation applicable to such party. + 6.1. General. Each party represents and warrants to the other party that: the performance of such party’s obligations hereunder do not and will not violate any law, rule or regulation applicable to such party. - 6.2. OpenLogic. OpenLogic will perform all Services as stated under this Agreement. If OpenLogic fails to comply with the previous sentence, OpenLogic will, at its sole discretion and as Clients sole remedy and OpenLogics sole obligation for any such failure: (a) re-perform the Services in a manner that resolves the alleged failure; or (b) refund any Fees paid by Client attributable to the Services that are the subject of the failure. + 6.2. OpenLogic. OpenLogic will perform all Services as stated under this Agreement. If OpenLogic fails to comply with the previous sentence, OpenLogic will, at its sole discretion and as Client’s sole remedy and OpenLogic’s sole obligation for any such failure: (a) re-perform the Services in a manner that resolves the alleged failure; or (b) refund any Fees paid by Client attributable to the Services that are the subject of the failure. 7. Disclaimer @@ -321,11 +343,11 @@ OPENLOGIC WILL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENT 9. Confidential Information. - 9.1. Confidential Information. For purposes of this Agreement, Confidential Information means any data or information regarding the business, finances, services or technology of either party provided to or otherwise obtained by the other party, including, without limitation, technical, marketing, financial, pricing, employee, and planning information, and any other data or information received or otherwise obtained under this Agreement that a reasonable person should have known, under the circumstances, was confidential or proprietary. + 9.1. Confidential Information. For purposes of this Agreement, “Confidential Information” means any data or information regarding the business, finances, services or technology of either party provided to or otherwise obtained by the other party, including, without limitation, technical, marketing, financial, pricing, employee, and planning information, and any other data or information received or otherwise obtained under this Agreement that a reasonable person should have known, under the circumstances, was confidential or proprietary. - 9.2. Protection. Each party (the Receiving Party) may from time to time receive or otherwise obtain Confidential Information from the other party (the Disclosing Party). The Receiving Party will not use any Confidential Information of the Disclosing Party for any purpose not expressly permitted by this Agreement, and will disclose the Confidential Information of the Disclosing Party only to the employees or contractors of the Receiving Party who have a need to know such Confidential Information for purposes of this Agreement and who are under a duty of confidentiality no less restrictive than the Receiving Partys duty hereunder. The Receiving Party will protect the Disclosing Partys Confidential Information in the same manner as the Receiving Party protects its own confidential information of a similar nature and with no less than reasonable care. + 9.2. Protection. Each party (the “Receiving Party”) may from time to time receive or otherwise obtain Confidential Information from the other party (the “Disclosing Party”). The Receiving Party will not use any Confidential Information of the Disclosing Party for any purpose not expressly permitted by this Agreement, and will disclose the Confidential Information of the Disclosing Party only to the employees or contractors of the Receiving Party who have a need to know such Confidential Information for purposes of this Agreement and who are under a duty of confidentiality no less restrictive than the Receiving Party’s duty hereunder. The Receiving Party will protect the Disclosing Party’s Confidential Information in the same manner as the Receiving Party protects its own confidential information of a similar nature and with no less than reasonable care. - 9.3. Exceptions. The Receiving Partys obligations with respect to any Confidential Information of the Disclosing Party will terminate if such information: (a) was already lawfully known to the Receiving Party as of the Effective Date; (b) is disclosed to the Receiving Party after the Effective Date by a third party who had the right to make such disclosure without any confidentiality restrictions; (c) is, or through no fault of the Receiving Party becomes, generally available to the public; or (d) is independently developed by the Receiving Party without access to, use of, or reference to, the Disclosing Partys Confidential Information. In addition, the Receiving Party will be allowed to disclose Confidential Information of the Disclosing Party to the extent that such disclosure is: (i) necessary for the Receiving Party to enforce its rights under this Agreement in connection with a legal proceeding; or (ii) required by law or by the order of a court of similar judicial, regulatory or administrative body, provided that the Receiving Party notifies the Disclosing Party in advance of such required disclosure promptly and in writing and cooperates with the Disclosing Party, at the Disclosing Partys reasonable request and expense, in any lawful action to contest or limit the scope of such required disclosure. + 9.3. Exceptions. The Receiving Party’s obligations with respect to any Confidential Information of the Disclosing Party will terminate if such information: (a) was already lawfully known to the Receiving Party as of the Effective Date; (b) is disclosed to the Receiving Party after the Effective Date by a third party who had the right to make such disclosure without any confidentiality restrictions; (c) is, or through no fault of the Receiving Party becomes, generally available to the public; or (d) is independently developed by the Receiving Party without access to, use of, or reference to, the Disclosing Party’s Confidential Information. In addition, the Receiving Party will be allowed to disclose Confidential Information of the Disclosing Party to the extent that such disclosure is: (i) necessary for the Receiving Party to enforce its rights under this Agreement in connection with a legal proceeding; or (ii) required by law or by the order of a court of similar judicial, regulatory or administrative body, provided that the Receiving Party notifies the Disclosing Party in advance of such required disclosure promptly and in writing and cooperates with the Disclosing Party, at the Disclosing Party’s reasonable request and expense, in any lawful action to contest or limit the scope of such required disclosure. 10. General @@ -346,7 +368,9 @@ OPENLOGIC WILL NOT BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENT -- Last updated 5 June 2012. Source materials are available for download at: https://azuremarketplace.microsoft.com/en-us/marketplace/apps/RogueWave.CentOSbased73?tab=Overview + classList.js 1.1.20150312 + Attribution Statements https://www.npmjs.com/package/classlist.js @@ -365,25 +389,29 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI For more information, please refer to http://unlicense.org/ Source materials are available for download at: https://github.com/eligrey/classList.js + clipboard.js 1.7.1 + Attribution Statements https://clipboardjs.com/ Copyright Statements -Copyright 2018 Zeno Rocha +Copyright © 2018 Zeno Rocha License Text (http://spdx.org/licenses/MIT) The MIT License (MIT) -Copyright 2018 Zeno Rocha +Copyright © 2018 Zeno Rocha -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/zenorocha/clipboard.js/ + CodeMirror 5.30.0 + Attribution Statements http://codemirror.net/ @@ -414,36 +442,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/codemirror/codemirror -core-js 2.4.1 -Attribution Statements -https://github.com/zloirock/core-js - -Copyright Statements -Copyright (c) 2014-2016 Denis Pushkarev - -License Text (http://spdx.org/licenses/MIT) -Copyright (c) 2014-2016 Denis Pushkarev - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +core-js 2.4.1 -Source materials are available for download at: https://github.com/zloirock/core-js -core-js 2.5.1 Attribution Statements https://github.com/zloirock/core-js @@ -472,37 +473,43 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/zloirock/core-js + date-fns 1.29.0 + Attribution Statements https://date-fns.org Copyright Statements -Copyright 2018 Sasha Koss +Copyright © 2018 Sasha Koss License Text (http://spdx.org/licenses/MIT) The MIT License (MIT) -Copyright 2018 Sasha Koss +Copyright © 2018 Sasha Koss -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/date-fns/date-fns + Document Object Model (org.w3.dom) + Attribution Statements https://www.w3.org/DOM/ Copyright Statements -Copyright 1997-2005 W3C +Copyright © 1997-2005 W3C® License Text (https://spdx.org/licenses/W3C-20150513.html) Made available under the W3C Software and Document Notice and License (2015-05-13). See Appendix for full text. Source materials are available for download at: https://www.w3.org/DOM/Activity + Font Awesome 4.7.0 + Attribution Statements http://fontawesome.io @@ -513,7 +520,9 @@ License Text (http://spdx.org/licenses/OFL-1.1.html) Made available under the SIL Open Font License 1.1. See Appendix for license text. Source materials are available for download at: https://github.com/FortAwesome/Font-Awesome + Gradle 3.4 + Attribution Statements https://gradle.org/ @@ -777,13 +786,15 @@ JCIFS License Version 2.1, February 1999 Copyright Statements - Gradle Inc. 2017 +© Gradle Inc. 2017 License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://services.gradle.org/distributions/gradle-3.4-bin.zip + Gradle Bintray Plugin 1.7.2 + Attribution Statements https://plugins.gradle.org/plugin/com.jfrog.bintray/1.7.2 @@ -794,7 +805,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/bintray/gradle-bintray-plugin + Gradle Plugin for Node 1.1.1 + Attribution Statements https://plugins.gradle.org/plugin/com.moowork.node/1.1.1 @@ -805,7 +818,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/srs/gradle-node-plugin + Gradle Properties Plugin 1.4.6 + Attribution Statements https://plugins.gradle.org/plugin/net.saliman.properties @@ -816,7 +831,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/stevesaliman/gradle-properties-plugin + H2 Database Engine 1.4.193 + Attribution Statements http://www.h2database.com/html/main.html @@ -827,18 +844,22 @@ License Text (http://spdx.org/licenses/EPL-1.0) Made available under the Eclipse Public License 1.0. See Appendix for full text. Source materials are available for download at: https://github.com/h2database/h2database -Jackson Databind 2.9.4 + +Jackson Databind 2.9.7 + Attribution Statements http://wiki.fasterxml.com/JacksonHome Copyright Statements -Copyright 2009 FasterXML, LLC +Copyright ©2009 FasterXML, LLC License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/FasterXML/jackson-databind + Java SE Runtime Environment (JRE) 7 + Attribution Statements http://docs.oracle.com/javase/ @@ -1131,7 +1152,7 @@ Oracle Binary Code License Agreement for the Java SE Platform Products and JavaF ORACLE AMERICA, INC. ("ORACLE"), FOR AND ON BEHALF OF ITSELF AND ITS SUBSIDIARIES AND AFFILIATES UNDER COMMON CONTROL, IS WILLING TO LICENSE THE SOFTWARE TO YOU ONLY UPON THE CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS BINARY CODE LICENSE AGREEMENT AND SUPPLEMENTAL LICENSE TERMS (COLLECTIVELY "AGREEMENT"). PLEASE READ THE AGREEMENT CAREFULLY. BY SELECTING THE "ACCEPT LICENSE AGREEMENT" (OR THE EQUIVALENT) BUTTON AND/OR BY USING THE SOFTWARE YOU ACKNOWLEDGE THAT YOU HAVE READ THE TERMS AND AGREE TO THEM. IF YOU ARE AGREEING TO THESE TERMS ON BEHALF OF A COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL AUTHORITY TO BIND THE LEGAL ENTITY TO THESE TERMS. IF YOU DO NOT HAVE SUCH AUTHORITY, OR IF YOU DO NOT WISH TO BE BOUND BY THE TERMS, THEN SELECT THE "DECLINE LICENSE AGREEMENT" (OR THE EQUIVALENT) BUTTON AND YOU MUST NOT USE THE SOFTWARE ON THIS SITE OR ANY OTHER MEDIA ON WHICH THE SOFTWARE IS CONTAINED. -1. DEFINITIONS. "Software" means the software identified above in binary form that you selected for download, install or use (in the version You selected for download, install or use) from Oracle or its authorized licensees, any other machine readable materials (including, but not limited to, libraries, source files, header files, and data files), any updates or error corrections provided by Oracle, and any user manuals, programming guides and other documentation provided to you by Oracle under this Agreement. "General Purpose Desktop Computers and Servers" means computers, including desktop and laptop computers, or servers, used for general computing functions under end user control (such as but not specifically limited to email, general purpose Internet browsing, and office suite productivity tools). The use of Software in systems and solutions that provide dedicated functionality (other than as mentioned above) or designed for use in embedded or function-specific software applications, for example but not limited to: Software embedded in or bundled with industrial control systems, wireless mobile telephones, wireless handheld devices, kiosks, TV/STB, Blu-ray Disc devices, telematics and network control switching equipment, printers and storage management systems, and other related systems are excluded from this definition and not licensed under this Agreement. "Programs" means (a) Java technology applets and applications intended to run on the Java Platform, Standard Edition platform on Java-enabled General Purpose Desktop Computers and Servers; and (b) JavaFX technology applications intended to run on the JavaFX Runtime on JavaFX-enabled General Purpose Desktop Computers and Servers. Commercial Features means those features identified in Table 1-1 (Commercial Features In Java SE Product Editions) of the Java SE documentation accessible at http://www.oracle.com/technetwork/java/javase/documentation/index.html. README File means the README file for the Software accessible at http://www.oracle.com/technetwork/java/javase/documentation/index.html. +1. DEFINITIONS. "Software" means the software identified above in binary form that you selected for download, install or use (in the version You selected for download, install or use) from Oracle or its authorized licensees, any other machine readable materials (including, but not limited to, libraries, source files, header files, and data files), any updates or error corrections provided by Oracle, and any user manuals, programming guides and other documentation provided to you by Oracle under this Agreement. "General Purpose Desktop Computers and Servers" means computers, including desktop and laptop computers, or servers, used for general computing functions under end user control (such as but not specifically limited to email, general purpose Internet browsing, and office suite productivity tools). The use of Software in systems and solutions that provide dedicated functionality (other than as mentioned above) or designed for use in embedded or function-specific software applications, for example but not limited to: Software embedded in or bundled with industrial control systems, wireless mobile telephones, wireless handheld devices, kiosks, TV/STB, Blu-ray Disc devices, telematics and network control switching equipment, printers and storage management systems, and other related systems are excluded from this definition and not licensed under this Agreement. "Programs" means (a) Java technology applets and applications intended to run on the Java Platform, Standard Edition platform on Java-enabled General Purpose Desktop Computers and Servers; and (b) JavaFX technology applications intended to run on the JavaFX Runtime on JavaFX-enabled General Purpose Desktop Computers and Servers. “Commercial Features” means those features identified in Table 1-1 (Commercial Features In Java SE Product Editions) of the Java SE documentation accessible at http://www.oracle.com/technetwork/java/javase/documentation/index.html. “README File” means the README file for the Software accessible at http://www.oracle.com/technetwork/java/javase/documentation/index.html. 2. LICENSE TO USE. Subject to the terms and conditions of this Agreement including, but not limited to, the Java Technology Restrictions of the Supplemental License Terms, Oracle grants you a non-exclusive, non-transferable, limited license without license fees to reproduce and use internally the Software complete and unmodified for the sole purpose of running Programs. THE LICENSE SET FORTH IN THIS SECTION 2 DOES NOT EXTEND TO THE COMMERCIAL FEATURES. YOUR RIGHTS AND OBLIGATIONS RELATED TO THE COMMERCIAL FEATURES ARE AS SET FORTH IN THE SUPPLEMENTAL TERMS ALONG WITH ADDITIONAL LICENSES FOR DEVELOPERS AND PUBLISHERS. @@ -1171,15 +1192,15 @@ C. LICENSE TO DISTRIBUTE SOFTWARE. Subject to the terms and conditions of this A D. LICENSE TO DISTRIBUTE REDISTRIBUTABLES. Subject to the terms and conditions of this Agreement and restrictions and exceptions set forth in the README File, including but not limited to the Java Technology Restrictions and Limitations on Redistribution of these Supplemental Terms, Oracle grants you a non-exclusive, non-transferable, limited license without fees to reproduce and distribute those files specifically identified as redistributable in the README File ("Redistributables") provided that: (i) you distribute the Redistributables complete and unmodified, and only bundled as part of Programs, (ii) the Programs add significant and primary functionality to the Redistributables, (iii) you do not distribute additional software intended to supersede any component(s) of the Redistributables (unless otherwise specified in the applicable README File), (iv) you do not remove or alter any proprietary legends or notices contained in or on the Redistributables, (v) you only distribute the Redistributables pursuant to a license agreement that: (a) is a complete, unmodified reproduction of this Agreement; or (b) protects Oracle's interests consistent with the terms contained in the Agreement and includes the notice set forth in Section H, (vi) you agree to defend and indemnify Oracle and its licensors from and against any damages, costs, liabilities, settlement amounts and/or expenses (including attorneys' fees) incurred in connection with any claim, lawsuit or action by any third party that arises or results from the use or distribution of any and all Programs and/or Software. The license set forth in this Section D does not extend to the Software identified in Section G. -E. DISTRIBUTION BY PUBLISHERS. This section pertains to your distribution of the JavaTM SE Development Kit Software (JDK) with your printed book or magazine (as those terms are commonly used in the industry) relating to Java technology ("Publication"). Subject to and conditioned upon your compliance with the restrictions and obligations contained in the Agreement, Oracle hereby grants to you a non-exclusive, nontransferable limited right to reproduce complete and unmodified copies of the JDK on electronic media (the "Media") for the sole purpose of inclusion and distribution with your Publication(s), subject to the following terms: (i) You may not distribute the JDK on a stand-alone basis; it must be distributed with your Publication(s); (ii) You are responsible for downloading the JDK from the applicable Oracle web site; (iii) You must refer to the JDK as JavaTM SE Development Kit; (iv) The JDK must be reproduced in its entirety and without any modification whatsoever (including with respect to all proprietary notices) and distributed with your Publication subject to a license agreement that is a complete, unmodified reproduction of this Agreement; (v) The Media label shall include the following information: Copyright [YEAR], Oracle America, Inc. All rights reserved. Use is subject to license terms. ORACLE and JAVA trademarks and all ORACLE- and JAVA-related trademarks, service marks, logos and other brand designations are trademarks or registered trademarks of Oracle in the U.S. and other countries. [YEAR] is the year of Oracle's release of the Software; the year information can typically be found in the Softwares About box or screen. This information must be placed on the Media label in such a manner as to only apply to the JDK; (vi) You must clearly identify the JDK as Oracle's product on the Media holder or Media label, and you may not state or imply that Oracle is responsible for any third-party software contained on the Media; (vii) You may not include any third party software on the Media which is intended to be a replacement or substitute for the JDK; (viii) You agree to defend and indemnify Oracle and its licensors from and against any damages, costs, liabilities, settlement amounts and/or expenses (including attorneys' fees) incurred in connection with any claim, lawsuit or action by any third party that arises or results from the use or distribution of the JDK and/or the Publication; ; and (ix) You shall provide Oracle with a written notice for each Publication; such notice shall include the following information: (1) title of Publication, (2) author(s), (3) date of Publication, and (4) ISBN or ISSN numbers. Such notice shall be sent to Oracle America, Inc., 500 Oracle Parkway, Redwood Shores, California 94065 U.S.A , Attention: General Counsel. +E. DISTRIBUTION BY PUBLISHERS. This section pertains to your distribution of the JavaTM SE Development Kit Software (“JDK”) with your printed book or magazine (as those terms are commonly used in the industry) relating to Java technology ("Publication"). Subject to and conditioned upon your compliance with the restrictions and obligations contained in the Agreement, Oracle hereby grants to you a non-exclusive, nontransferable limited right to reproduce complete and unmodified copies of the JDK on electronic media (the "Media") for the sole purpose of inclusion and distribution with your Publication(s), subject to the following terms: (i) You may not distribute the JDK on a stand-alone basis; it must be distributed with your Publication(s); (ii) You are responsible for downloading the JDK from the applicable Oracle web site; (iii) You must refer to the JDK as JavaTM SE Development Kit; (iv) The JDK must be reproduced in its entirety and without any modification whatsoever (including with respect to all proprietary notices) and distributed with your Publication subject to a license agreement that is a complete, unmodified reproduction of this Agreement; (v) The Media label shall include the following information: “Copyright [YEAR], Oracle America, Inc. All rights reserved. Use is subject to license terms. ORACLE and JAVA trademarks and all ORACLE- and JAVA-related trademarks, service marks, logos and other brand designations are trademarks or registered trademarks of Oracle in the U.S. and other countries.” [YEAR] is the year of Oracle's release of the Software; the year information can typically be found in the Software’s “About” box or screen. This information must be placed on the Media label in such a manner as to only apply to the JDK; (vi) You must clearly identify the JDK as Oracle's product on the Media holder or Media label, and you may not state or imply that Oracle is responsible for any third-party software contained on the Media; (vii) You may not include any third party software on the Media which is intended to be a replacement or substitute for the JDK; (viii) You agree to defend and indemnify Oracle and its licensors from and against any damages, costs, liabilities, settlement amounts and/or expenses (including attorneys' fees) incurred in connection with any claim, lawsuit or action by any third party that arises or results from the use or distribution of the JDK and/or the Publication; ; and (ix) You shall provide Oracle with a written notice for each Publication; such notice shall include the following information: (1) title of Publication, (2) author(s), (3) date of Publication, and (4) ISBN or ISSN numbers. Such notice shall be sent to Oracle America, Inc., 500 Oracle Parkway, Redwood Shores, California 94065 U.S.A , Attention: General Counsel. -F. JAVA TECHNOLOGY RESTRICTIONS. You may not create, modify, or change the behavior of, or authorize your licensees to create, modify, or change the behavior of, classes, interfaces, or subpackages that are in any way identified as "java", "javax", "sun", oracle or similar convention as specified by Oracle in any naming convention designation. +F. JAVA TECHNOLOGY RESTRICTIONS. You may not create, modify, or change the behavior of, or authorize your licensees to create, modify, or change the behavior of, classes, interfaces, or subpackages that are in any way identified as "java", "javax", "sun", “oracle” or similar convention as specified by Oracle in any naming convention designation. G. LIMITATIONS ON REDISTRIBUTION. You may not redistribute or otherwise transfer patches, bug fixes or updates made available by Oracle through Oracle Premier Support, including those made available under Oracle's Java SE Support program. H. COMMERCIAL FEATURES NOTICE. For purpose of complying with Supplemental Term Section C.(v)(b) and D.(v)(b), your license agreement shall include the following notice, where the notice is displayed in a manner that anyone using the Software will see the notice: -Use of the Commercial Features for any commercial or production purpose requires a separate license from Oracle. Commercial Features means those features identified Table 1-1 (Commercial Features In Java SE Product Editions) of the Java SE documentation accessible at http://www.oracle.com/technetwork/java/javase/documentation/index.html +Use of the Commercial Features for any commercial or production purpose requires a separate license from Oracle. “Commercial Features” means those features identified Table 1-1 (Commercial Features In Java SE Product Editions) of the Java SE documentation accessible at http://www.oracle.com/technetwork/java/javase/documentation/index.html @@ -1198,7 +1219,9 @@ Redwood Shores, California 94065, USA. Last updated 02 April 2013 Source materials are available for download at: http://www.oracle.com/technetwork/indexes/downloads/index.html + Jersey 1.9 + Attribution Statements https://jersey.java.net/ @@ -1261,7 +1284,9 @@ License Text (http://www.spdx.org/licenses/CDDL-1.1.html) Made available under the Common Development and Distribution License 1.1. See Appendix for full text. Source materials are available for download at: https://github.com/jersey/jersey/ + JSON 20080701 + Attribution Statements http://www.json.org/ @@ -1280,20 +1305,24 @@ The Software shall be used for Good, not Evil. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/douglascrockford/JSON-java + JUnit 4.12 + Attribution Statements http://junit.org The JUnit depends on Java Hamcrest (http://hamcrest.org/JavaHamcrest/). Copyright Statements -Copyright 2002-2015 JUnit. All Rights Reserved. +Copyright © 2002-2015 JUnit. All Rights Reserved. License Text (http://spdx.org/licenses/EPL-1.0) Made available under the Eclipse Public License 1.0. See Appendix for full text. Source materials are available for download at: https://github.com/junit-team/junit4 + Lodash 4.17.4 + Attribution Statements https://lodash.com/ @@ -1339,7 +1368,9 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/lodash/lodash + Logback 1.1.8 + Attribution Statements http://logback.qos.ch @@ -1350,7 +1381,9 @@ License Text (http://spdx.org/licenses/EPL-1.0) Made available under the Eclipse Public License 1.0. See Appendix for full text. Source materials are available for download at: https://github.com/qos-ch/logback + Material Design Icons (MDI) Iconfont 3.0.3 + Attribution Statements http://google.github.io/material-design-icons/ @@ -1361,7 +1394,9 @@ License Text (https://spdx.org/licenses/Apache-2.0.html) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/jossef/material-design-icons-iconfont + Material Design Icons (MDI) Webfont 2.0.46 + Attribution Statements https://materialdesignicons.com/ @@ -1374,7 +1409,9 @@ License Text (https://spdx.org/licenses/OFL-1.1.html) Made available under the SIL Open Font License 1.1. See Appendix for full text. Source materials are available for download at: https://github.com/Templarian/MaterialDesign-Webfont + Material Design Lite 1.3.0 + Attribution Statements http://getmdl.io @@ -1385,12 +1422,14 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/google/material-design-lite + Namespaces in XML 1.0 + Attribution Statements https://www.w3.org/TR/REC-xml-names/ Copyright Statements -Copyright 2009 W3C (MIT, ERCIM, Keio), All Rights Reserved. +Copyright © 2009 W3C® (MIT, ERCIM, Keio), All Rights Reserved. License Text (https://www.w3.org/Consortium/Legal/2015/doc-license) License @@ -1399,17 +1438,17 @@ By using and/or copying this document, or the W3C document from which this state Permission to copy, and distribute the contents of this document, or the W3C document from which this statement is linked, in any medium for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the document, or portions thereof, that you use: A link or URL to the original W3C document. -The pre-existing copyright notice of the original author, or if it doesn't exist, a notice (hypertext is preferred, but a textual representation is permitted) of the form: "Copyright [$date-of-document] World Wide Web Consortium, (MIT, ERCIM, Keio, Beihang). http://www.w3.org/Consortium/Legal/2015/doc-license" +The pre-existing copyright notice of the original author, or if it doesn't exist, a notice (hypertext is preferred, but a textual representation is permitted) of the form: "Copyright © [$date-of-document] World Wide Web Consortium, (MIT, ERCIM, Keio, Beihang). http://www.w3.org/Consortium/Legal/2015/doc-license" If it exists, the STATUS of the W3C document. When space permits, inclusion of the full text of this NOTICE should be provided. We request that authorship attribution be provided in any software, documents, or other items or products that you create pursuant to the implementation of the contents of this document, or any portion thereof. No right to create modifications or derivatives of W3C documents is granted pursuant to this license, except as follows: To facilitate implementation of the technical specifications set forth in this document, anyone may prepare and distribute derivative works and portions of this document in software, in supporting materials accompanying software, and in documentation of software, PROVIDED that all such works include the notice below. HOWEVER, the publication of derivative works of this document for use as a technical specification is expressly prohibited. -In addition, "Code Components" Web IDL in sections clearly marked as Web IDL; and W3C-defined markup (HTML, CSS, etc.) and computer programming language code clearly marked as code examples are licensed under the W3C Software License. +In addition, "Code Components" —Web IDL in sections clearly marked as Web IDL; and W3C-defined markup (HTML, CSS, etc.) and computer programming language code clearly marked as code examples— are licensed under the W3C Software License. The notice is: -"Copyright 2015 W3C (MIT, ERCIM, Keio, Beihang). This software or document includes material copied from or derived from [title and URI of the W3C document]." +"Copyright © 2015 W3C® (MIT, ERCIM, Keio, Beihang). This software or document includes material copied from or derived from [title and URI of the W3C document]." Disclaimers THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. @@ -1426,7 +1465,9 @@ This version grants limited permission to create and distribute derivative works This version licenses Code Components under the W3C Software License. Source materials are available for download at: https://www.w3.org/TR/REC-xml-names/ + ng2-device-detector 1.0.0 + Attribution Statements https://github.com/KoderLabs/ng2-device-detector @@ -1457,7 +1498,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/KoderLabs/ng2-device-detector + Protractor + Attribution Statements http://www.protractortest.org/#/ @@ -1488,7 +1531,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/angular/protractor + RxJS 5.4.2 + Attribution Statements http://reactivex.io/rxjs/ @@ -1501,7 +1546,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/ReactiveX/RxJS + RxJS 5.4.3 + Attribution Statements http://reactivex.io/rxjs/ @@ -1514,7 +1561,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/ReactiveX/RxJS + semver(1) 5.4.1 + Attribution Statements https://www.npmjs.com/package/semver @@ -1539,7 +1588,9 @@ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. Source materials are available for download at: https://github.com/npm/node-semver + SLF4J 1.7.22 + Attribution Statements http://www.slf4j.org @@ -1570,7 +1621,9 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/qos-ch/slf4j/tree/master/slf4j-api + SockJS-client 1.1.4 + Attribution Statements http://sockjs.org @@ -1601,7 +1654,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/sockjs/sockjs-client + Spock Framework + Attribution Statements http://spockframework.org/ @@ -1624,7 +1679,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/spockframework/spock + Spring Boot 1.5.6 + Attribution Statements https://projects.spring.io/spring-boot/ @@ -1635,7 +1692,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/spring-projects/spring-boot + Spring Framework 5.0.4 + Attribution Statements https://projects.spring.io/spring-framework/ @@ -1646,7 +1705,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/spring-projects/spring-framework + STOMP.js 2.3.3 + Attribution Statements http://jmesnil.net/stomp-websocket/doc/ @@ -1657,7 +1718,9 @@ License Text (http://spdx.org/licenses/Apache-2.0) Made available under the Apache License 2.0. See Appendix for full text. Source materials are available for download at: https://github.com/jmesnil/stomp-websocket + trace-ui 2.0.4 + Attribution Statements https://github.com/ancestorcloud/trace-ui @@ -1688,7 +1751,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/ancestorcloud/trace-ui + XMLUnit 1.3 + Attribution Statements http://www.xmlunit.org/ @@ -1729,7 +1794,9 @@ ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Source materials are available for download at: https://github.com/xmlunit/xmlunit/tree/master/xmlunit-legacy + Zone.js 0.8.14 + Attribution Statements https://github.com/angular/zone.js @@ -1762,7 +1829,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/angular/zone.js + Zone.js 0.8.18 + Attribution Statements https://github.com/angular/zone.js @@ -1795,7 +1864,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source materials are available for download at: https://github.com/angular/zone.js - + +  Appendix License Text @@ -1879,30 +1949,30 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.  https://spdx.org/licenses/CDDL-1.0.html COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 1. Definitions. -1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications. +1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications. -1.2. Contributor Version means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. +1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. -1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. +1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. -1.4. Executable means the Covered Software in any form other than Source Code. +1.4. “Executable” means the Covered Software in any form other than Source Code. -1.5. Initial Developer means the individual or entity that first makes Original Software available under this License. +1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License. -1.6. Larger Work means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. +1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. -1.7. License means this document. +1.7. “License” means this document. -1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. +1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. -1.9. Modifications means the Source Code and Executable form of any of the following: +1.9. “Modifications” means the Source Code and Executable form of any of the following: A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; @@ -1910,13 +1980,13 @@ B. Any new file that contains any part of the Original Software or previous Modi C. Any new file that is contributed or otherwise made available under the terms of this License. -1.10. Original Software means the Source Code and Executable form of computer software code that is originally released under this License. +1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License. -1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. +1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. -1.12. Source Code means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. +1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. -1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, control means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. +1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants. @@ -1954,10 +2024,10 @@ The Modifications that You create or to which You contribute are governed by the You must include a notice in each of Your Modifications that identifies You as the Contributor of the Modification. You may not remove or alter any copyright, patent or trademark notices contained within the Covered Software, or any notices of licensing or any descriptive text giving attribution to any Contributor or the Initial Developer. 3.4. Application of Additional Terms. -You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. +You may not offer or impose any terms on any Covered Software in Source Code form that alters or restricts the applicable version of this License or the recipients’ rights hereunder. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, you may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear that any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.5. Distribution of Executable Versions. -You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipients rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. +You may distribute the Executable form of the Covered Software under the terms of this License or under the terms of a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable form does not attempt to limit or alter the recipient’s rights in the Source Code form from the rights set forth in this License. If You distribute the Covered Software in Executable form under a different license, You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.6. Larger Works. You may create a Larger Work by combining Covered Software with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Software. @@ -1975,55 +2045,55 @@ When You are an Initial Developer and You want to create a new license for Your 5. DISCLAIMER OF WARRANTY. -COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. +COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 6. TERMINATION. 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. -6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as Participant) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. +6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. 6.3. In the event of termination under Sections 6.1 or 6.2 above, all end user licenses that have been validly granted by You or any distributor hereunder prior to termination (excluding licenses granted to You by any distributor) shall survive termination. 7. LIMITATION OF LIABILITY. -UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTYS NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED SOFTWARE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOST PROFITS, LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY’S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 8. U.S. GOVERNMENT END USERS. -The Covered Software is a commercial item, as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer software (as that term is defined at 48 C.F.R. 252.227-7014(a)(1)) and commercial computer software documentation as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. +The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. 9. MISCELLANEOUS. -This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdictions conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by the law of the jurisdiction specified in a notice contained within the Original Software (except to the extent applicable law, if any, provides otherwise), excluding such jurisdiction’s conflict-of-law provisions. Any litigation relating to this License shall be subject to the jurisdiction of the courts located in the jurisdiction and venue specified in a notice contained within the Original Software, with the losing party responsible for costs, including, without limitation, court costs and reasonable attorneys’ fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. You agree that You alone are responsible for compliance with the United States export administration regulations (and the export control laws and regulation of any other countries) when You use, distribute or otherwise make available any Covered Software. 10. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. - +  https://spdx.org/licenses/CDDL-1.1.html COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.1 1. Definitions. -1.1. Contributor means each individual or entity that creates or contributes to the creation of Modifications. +1.1. “Contributor” means each individual or entity that creates or contributes to the creation of Modifications. -1.2. Contributor Version means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. +1.2. “Contributor Version” means the combination of the Original Software, prior Modifications used by a Contributor (if any), and the Modifications made by that particular Contributor. -1.3. Covered Software means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. +1.3. “Covered Software” means (a) the Original Software, or (b) Modifications, or (c) the combination of files containing Original Software with files containing Modifications, in each case including portions thereof. -1.4. Executable means the Covered Software in any form other than Source Code. +1.4. “Executable” means the Covered Software in any form other than Source Code. -1.5. Initial Developer means the individual or entity that first makes Original Software available under this License. +1.5. “Initial Developer” means the individual or entity that first makes Original Software available under this License. -1.6. Larger Work means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. +1.6. “Larger Work” means a work which combines Covered Software or portions thereof with code not governed by the terms of this License. -1.7. License means this document. +1.7. “License” means this document. -1.8. Licensable means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. +1.8. “Licensable” means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. -1.9. Modifications means the Source Code and Executable form of any of the following: +1.9. “Modifications” means the Source Code and Executable form of any of the following: A. Any file that results from an addition to, deletion from or modification of the contents of a file containing Original Software or previous Modifications; @@ -2031,13 +2101,13 @@ B. Any new file that contains any part of the Original Software or previous Modi C. Any new file that is contributed or otherwise made available under the terms of this License. -1.10. Original Software means the Source Code and Executable form of computer software code that is originally released under this License. +1.10. “Original Software” means the Source Code and Executable form of computer software code that is originally released under this License. -1.11. Patent Claims means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. +1.11. “Patent Claims” means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. -1.12. Source Code means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. +1.12. “Source Code” means (a) the common form of computer software code in which modifications are made and (b) associated documentation included in or with such code. -1.13. You (or Your) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, You includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, control means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. +1.13. “You” (or “Your”) means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License. For legal entities, “You” includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, “control” means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants. @@ -2095,13 +2165,13 @@ You may always continue to use, distribute or otherwise make the Covered Softwar When You are an Initial Developer and You want to create a new license for Your Original Software, You may create and use a modified version of this License if You: (a) rename the license and remove any references to the name of the license steward (except to note that the license differs from this License); and (b) otherwise make it clear that the license contains terms which differ from this License. 5. DISCLAIMER OF WARRANTY. -COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. +COVERED SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN “AS IS” BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED SOFTWARE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED SOFTWARE IS WITH YOU. SHOULD ANY COVERED SOFTWARE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 6. TERMINATION. 6.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. -6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as Participant) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. +6.2. If You assert a patent infringement claim (excluding declaratory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You assert such claim is referred to as “Participant”) alleging that the Participant Software (meaning the Contributor Version where the Participant is a Contributor or the Original Software where the Participant is the Initial Developer) directly or indirectly infringes any patent, then any and all rights granted directly or indirectly to You by such Participant, the Initial Developer (if the Initial Developer is not the Participant) and all Contributors under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively and automatically at the expiration of such 60 day notice period, unless if within such 60 day period You withdraw Your claim with respect to the Participant Software against such Participant either unilaterally or pursuant to a written agreement with Participant. 6.3. If You assert a patent infringement claim against Participant alleging that the Participant Software directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. @@ -2113,7 +2183,7 @@ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIG 8. U.S. GOVERNMENT END USERS. -The Covered Software is a commercial item, as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of commercial computer software (as that term is defined at 48 C.F.R. 252.227-7014(a)(1)) and commercial computer software documentation as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. +The Covered Software is a “commercial item,” as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of “commercial computer software” (as that term is defined at 48 C.F.R. § 252.227-7014(a)(1)) and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Software with only those rights set forth herein. This U.S. Government Rights clause is in lieu of, and supersedes, any other FAR, DFAR, or other clause or provision that addresses Government rights in computer software under this License. 9. MISCELLANEOUS. @@ -2125,7 +2195,7 @@ As between Initial Developer and the Contributors, each party is responsible for NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) The code released under the CDDL shall be governed by the laws of the State of California (excluding conflict-of-law provisions). Any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California and the state courts of the State of California, with venue lying in Santa Clara County, California. - +  https://spdx.org/licenses/CC-BY-3.0.html Creative Commons Attribution 3.0 Unported @@ -2219,24 +2289,24 @@ Creative Commons is not a party to this License, and makes no warranty whatsoeve Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. Creative Commons may be contacted at http://creativecommons.org/. - +  https://spdx.org/licenses/CC-BY-4.0.html Creative Commons Attribution 4.0 International -Creative Commons Corporation (Creative Commons) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an as-is basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. +Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. Using Creative Commons Public Licenses Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. -Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensors permission is not necessary for any reasonfor example, because of any applicable exception or limitation to copyrightthen that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. +Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. Creative Commons Attribution 4.0 International Public License By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. -Section 1 Definitions. +Section 1 – Definitions. a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. @@ -2260,7 +2330,7 @@ j. Sui Generis Database Rights means rights other than copyright resulting from k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. -Section 2 Scope. +Section 2 – Scope. a. License grant. @@ -2278,7 +2348,7 @@ B. produce, reproduce, and Share Adapted Material. 5. Downstream recipients. -A. Offer from the Licensor Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. +A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. @@ -2292,7 +2362,7 @@ b. Other rights. 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. -Section 3 License Conditions. +Section 3 – License Conditions. Your exercise of the Licensed Rights is expressly made subject to the following conditions. @@ -2322,7 +2392,7 @@ C. indicate the Licensed Material is licensed under this Public License, and inc 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. -Section 4 Sui Generis Database Rights. +Section 4 – Sui Generis Database Rights. Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: @@ -2333,7 +2403,7 @@ b. if You include all or a substantial portion of the database contents in a dat c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. -Section 5 Disclaimer of Warranties and Limitation of Liability. +Section 5 – Disclaimer of Warranties and Limitation of Liability. a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. @@ -2341,7 +2411,7 @@ b. To the extent possible, in no event will the Licensor be liable to You on any c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. -Section 6 Term and Termination. +Section 6 – Term and Termination. a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. @@ -2357,13 +2427,13 @@ d. For the avoidance of doubt, the Licensor may also offer the Licensed Material e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. -Section 7 Other Terms and Conditions. +Section 7 – Other Terms and Conditions. a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. -Section 8 Interpretation. +Section 8 – Interpretation. a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. @@ -2373,8 +2443,8 @@ c. No term or condition of this Public License will be waived and no failure to d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. -Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the Licensor. Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark Creative Commons or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.??Creative Commons may be contacted at creativecommons.org. - +Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.

Creative Commons may be contacted at creativecommons.org. +  https://spdx.org/licenses/CC-BY-SA-3.0.html Creative Commons Attribution-ShareAlike 3.0 Unported @@ -2440,7 +2510,7 @@ Creative Commons is not a party to this License, and makes no warranty whatsoeve Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of the License. -Creative Commons may be contacted at http://creativecommons.org/. +Creative Commons may be contacted at http://creativecommons.org/.  https://spdx.org/licenses/EPL-1.0.html Eclipse Public License - v 1.0 @@ -2515,7 +2585,7 @@ All Recipient's rights under this Agreement shall terminate if it fails to compl Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. - +  https://spdx.org/licenses/EPL-2.0.html Eclipse Public License - v 2.0 @@ -2597,7 +2667,7 @@ Simply including a copy of this Agreement, including this Exhibit A is not suffi If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. - +  https://spdx.org/licenses/Libpng.html libpng License @@ -2677,7 +2747,7 @@ Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a cer Glenn Randers-Pehrson glennrp at users.sourceforge.net December 9, 2010 - +  https://spdx.org/licenses/MPL-1.0.html MOZILLA PUBLIC LICENSE @@ -2811,7 +2881,7 @@ The Original Code is _____ . The Initial Developer of the Original Code is _____ . Portions created by _____ are Copyright (C) _____ . All Rights Reserved. Contributor(s): _____ . - +  https://spdx.org/licenses/MPL-1.1.html Mozilla Public License Version 1.1 @@ -2968,7 +3038,7 @@ The Initial Developer of the Original Code is _____ . Portions created by _____ Contributor(s): _____ . Alternatively, the contents of this file may be used under the terms of the _____ license (the " [____] License"), in which case the provisions of [____] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [____] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [____] ] License." - +  https://spdx.org/licenses/OLDAP-2.8.html The OpenLDAP Public License @@ -2990,7 +3060,7 @@ The names of the authors and copyright holders must not be used in advertising o OpenLDAP is a registered trademark of the OpenLDAP Foundation. Copyright 1999-2003 The OpenLDAP Foundation, Redwood City, California, USA. All Rights Reserved. Permission to copy and distribute verbatim copies of this document is granted. - +  https://spdx.org/licenses/OpenSSL.html OpenSSL License @@ -3040,14 +3110,14 @@ The word 'cryptographic' can be left out if the rouines from the library being u THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The licence and distribution terms for any publically available version or derivative of this code cannot be changed. i.e. this code cannot simply be copied and put under another distribution licence [including the GNU Public Licence.] - +  http://www.oracle.com/technetwork/java/javase/terms/license/index.html Oracle Binary Code License Agreement for Java SE and JavaFX Technologies ORACLE AMERICA, INC. ("ORACLE"), FOR AND ON BEHALF OF ITSELF AND ITS SUBSIDIARIES AND AFFILIATES UNDER COMMON CONTROL, IS WILLING TO LICENSE THE SOFTWARE TO YOU ONLY UPON THE CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS BINARY CODE LICENSE AGREEMENT AND SUPPLEMENTAL LICENSE TERMS (COLLECTIVELY "AGREEMENT"). PLEASE READ THE AGREEMENT CAREFULLY. BY SELECTING THE "ACCEPT LICENSE AGREEMENT" (OR THE EQUIVALENT) BUTTON AND/OR BY USING THE SOFTWARE YOU ACKNOWLEDGE THAT YOU HAVE READ THE TERMS AND AGREE TO THEM. IF YOU ARE AGREEING TO THESE TERMS ON BEHALF OF A COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL AUTHORITY TO BIND THE LEGAL ENTITY TO THESE TERMS. IF YOU DO NOT HAVE SUCH AUTHORITY, OR IF YOU DO NOT WISH TO BE BOUND BY THE TERMS, THEN SELECT THE "DECLINE LICENSE AGREEMENT" (OR THE EQUIVALENT) BUTTON AND YOU MUST NOT USE THE SOFTWARE ON THIS SITE OR ANY OTHER MEDIA ON WHICH THE SOFTWARE IS CONTAINED. -1. DEFINITIONS. "Software" means the software identified above in binary form that you selected for download, install or use (in the version You selected for download, install or use) from Oracle or its authorized licensees, any other machine readable materials (including, but not limited to, libraries, source files, header files, and data files), any updates or error corrections provided by Oracle, and any user manuals, programming guides and other documentation provided to you by Oracle under this Agreement. "General Purpose Desktop Computers and Servers" means computers, including desktop and laptop computers, or servers, used for general computing functions under end user control (such as but not specifically limited to email, general purpose Internet browsing, and office suite productivity tools). The use of Software in systems and solutions that provide dedicated functionality (other than as mentioned above) or designed for use in embedded or function-specific software applications, for example but not limited to: Software embedded in or bundled with industrial control systems, wireless mobile telephones, wireless handheld devices, netbooks, kiosks, TV/STB, Blu-ray Disc devices, telematics and network control switching equipment, printers and storage management systems, and other related systems are excluded from this definition and not licensed under this Agreement. "Programs" means: (a) Java technology applets and applications intended to run on the Java Platform, Standard Edition platform on Java-enabled General Purpose Desktop Computers and Servers, and (b) JavaFX technology applications intended to run on the JavaFX Runtime on JavaFX-enabled General Purpose Desktop Computers and Servers. README File means the README file for the Software set forth in the Software or otherwise available from Oracle at or through the following URL: http://www.oracle.com/technetwork/java/javase/documentation/index.html +1. DEFINITIONS. "Software" means the software identified above in binary form that you selected for download, install or use (in the version You selected for download, install or use) from Oracle or its authorized licensees, any other machine readable materials (including, but not limited to, libraries, source files, header files, and data files), any updates or error corrections provided by Oracle, and any user manuals, programming guides and other documentation provided to you by Oracle under this Agreement. "General Purpose Desktop Computers and Servers" means computers, including desktop and laptop computers, or servers, used for general computing functions under end user control (such as but not specifically limited to email, general purpose Internet browsing, and office suite productivity tools). The use of Software in systems and solutions that provide dedicated functionality (other than as mentioned above) or designed for use in embedded or function-specific software applications, for example but not limited to: Software embedded in or bundled with industrial control systems, wireless mobile telephones, wireless handheld devices, netbooks, kiosks, TV/STB, Blu-ray Disc devices, telematics and network control switching equipment, printers and storage management systems, and other related systems are excluded from this definition and not licensed under this Agreement. "Programs" means: (a) Java technology applets and applications intended to run on the Java Platform, Standard Edition platform on Java-enabled General Purpose Desktop Computers and Servers, and (b) JavaFX technology applications intended to run on the JavaFX Runtime on JavaFX-enabled General Purpose Desktop Computers and Servers. “README File” means the README file for the Software set forth in the Software or otherwise available from Oracle at or through the following URL: http://www.oracle.com/technetwork/java/javase/documentation/index.html 2. LICENSE TO USE. Subject to the terms and conditions of this Agreement including, but not limited to, the Java Technology Restrictions of the Supplemental License Terms, Oracle grants you a non-exclusive, non-transferable, limited license without license fees to reproduce and use internally the Software complete and unmodified for the sole purpose of running Programs. @@ -3081,7 +3151,7 @@ B. LICENSE TO DISTRIBUTE SOFTWARE. Subject to the terms and conditions of this A C. LICENSE TO DISTRIBUTE REDISTRIBUTABLES. Subject to the terms and conditions of this Agreement and restrictions and exceptions set forth in the README File, including but not limited to the Java Technology Restrictions of these Supplemental Terms, Oracle grants you a non-exclusive, non-transferable, limited license without fees to reproduce and distribute those files specifically identified as redistributable in the README File ("Redistributables") provided that: (i) you distribute the Redistributables complete and unmodified, and only bundled as part of Programs, (ii) the Programs add significant and primary functionality to the Redistributables, (iii) you do not distribute additional software intended to supersede any component(s) of the Redistributables (unless otherwise specified in the applicable README File), (iv) you do not remove or alter any proprietary legends or notices contained in or on the Redistributables, (v) you only distribute the Redistributables pursuant to a license agreement that protects Oracle's interests consistent with the terms contained in the Agreement, (vi) you agree to defend and indemnify Oracle and its licensors from and against any damages, costs, liabilities, settlement amounts and/or expenses (including attorneys' fees) incurred in connection with any claim, lawsuit or action by any third party that arises or results from the use or distribution of any and all Programs and/or Software. The license set forth in this Section C does not extend to the Software identified in Section D. -D. JAVA TECHNOLOGY RESTRICTIONS. You may not create, modify, or change the behavior of, or authorize your licensees to create, modify, or change the behavior of, classes, interfaces, or subpackages that are in any way identified as "java", "javax", "javafx", "sun", oracle or similar convention as specified by Oracle in any naming convention designation. You shall not redistribute the Software listed on Schedule 1. +D. JAVA TECHNOLOGY RESTRICTIONS. You may not create, modify, or change the behavior of, or authorize your licensees to create, modify, or change the behavior of, classes, interfaces, or subpackages that are in any way identified as "java", "javax", "javafx", "sun", “oracle” or similar convention as specified by Oracle in any naming convention designation. You shall not redistribute the Software listed on Schedule 1. E. SOURCE CODE. Software may contain source code that, unless expressly licensed for other purposes, is provided solely for reference purposes pursuant to the terms of this Agreement. Source code may not be redistributed unless expressly provided for in this Agreement. @@ -3113,7 +3183,7 @@ Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files Jvmstat -Any patches, bug fixes or updates made available by Oracle through Oracle Premier Support, including those made available under Oracle's Java SE Support program +Any patches, bug fixes or updates made available by Oracle through Oracle Premier Support, including those made available under Oracle's Java SE Support program  https://spdx.org/licenses/OFL-1.1.html SIL OPEN FONT LICENSE @@ -3133,7 +3203,7 @@ DEFINITIONS "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). -"Modified Version" refers to any derivative made by adding to, deleting, or substituting in part or in whole any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. +"Modified Version" refers to any derivative made by adding to, deleting, or substituting — in part or in whole — any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. @@ -3158,7 +3228,7 @@ This license becomes null and void if any of the above conditions are not met. DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. - +  http://www.unicode.org/copyright.html#License UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE @@ -3179,14 +3249,14 @@ BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S DATA FILES COPYRIGHT AND PERMISSION NOTICE -Copyright 1991-2018 Unicode, Inc. All rights reserved. +Copyright © 1991-2018 Unicode, Inc. All rights reserved. Distributed under the Terms of Use in http://www.unicode.org/copyright.html. Permission is hereby granted, free of charge, to any person obtaining a copy of the Unicode data files and any associated documentation (the "Data Files") or Unicode software and any associated documentation (the "Software") to deal in the Data Files or Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, and/or sell copies of the Data Files or Software, and to permit persons to whom the Data Files or Software are furnished to do so, provided that either (a) this copyright and permission notice appear with all copies of the Data Files or Software, or (b) this copyright and permission notice appear in associated Documentation. THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THE DATA FILES OR SOFTWARE. -Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder. +Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in these Data Files or Software without prior written authorization of the copyright holder.  https://spdx.org/licenses/W3C-20150513.html W3C Software and Document Notice and License (2015-05-13) @@ -3197,9 +3267,9 @@ By obtaining and/or copying this work, you (the licensee) agree that you have re Permission to copy, modify, and distribute this work, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the work or portions thereof, including modifications: - The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. - Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included. - Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright (c) [YEAR] W3C (MIT, ERCIM, Keio, Beihang)." +• The full text of this NOTICE in a location viewable to users of the redistributed or derivative work. +• Any pre-existing intellectual property disclaimers, notices, or terms and conditions. If none exist, the W3C Software and Document Short Notice should be included. +• Notice of any changes or modifications, through a copyright statement on the new code or document such as "This software or document includes material copied from or derived from [title and URI of the W3C document]. Copyright (c) [YEAR] W3C® (MIT, ERCIM, Keio, Beihang)." Disclaimers THIS WORK IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENT WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. @@ -3209,7 +3279,7 @@ The name and trademarks of copyright holders may NOT be used in advertising or p Standard License Header -[$name_of_software: $distribution_URI] Copyright (c) [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of Technology, European Research Consortium for Informatics and Mathematics, Keio University, Beihang). All Rights Reserved. This work is distributed under the W3C Software License [1] in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [1] http://www.w3.org/Consortium/Legal/copyright-software +[$name_of_software: $distribution_URI] Copyright (c) [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of Technology, European Research Consortium for Informatics and Mathematics, Keio University, Beihang). All Rights Reserved. This work is distributed under the W3C® Software License [1] in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [1] http://www.w3.org/Consortium/Legal/copyright-software  https://spdx.org/licenses/Zlib.html zlib License @@ -3221,5 +3291,4 @@ Permission is granted to anyone to use this software for any purpose, including 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. -3. This notice may not be removed or altered from any source distribution. - +3. This notice may not be removed or altered from any source distribution. \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 3299d0d430..61abaeea1a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,3 +14,4 @@ services: - "8000-8020:8000-8020" volumes: - .:/marklogic-data-hub + diff --git a/examples/DHS-e2e/DHS/build.gradle b/examples/DHS-e2e/DHS/build.gradle index 30953fa6d2..c6f17808f3 100644 --- a/examples/DHS-e2e/DHS/build.gradle +++ b/examples/DHS-e2e/DHS/build.gradle @@ -1,73 +1,77 @@ -/* - * This file was generated by the Gradle 'init' task. - * - * This is a general purpose Gradle build. - * Learn how to create Gradle builds at https://guides.gradle.org/creating-new-gradle-builds/ - */ - -plugins { - id 'java' - id 'eclipse' - id 'idea' - - // This plugin allows you to create different environments - // for your gradle deploy. Each environment is represented - // by a gradle-${env}.properties file - // See https://github.com/stevesaliman/gradle-properties-plugin - // specify the env on the command line with: - // gradle -PenvironmentName=x ... - id 'net.saliman.properties' version '1.4.6' - - // This gradle plugin extends the ml-gradle plugin with - // commands that make the Data Hub Framework do its magic - id 'com.marklogic.ml-data-hub' version '4.0.1' -} - -configurations { - mlcp { - resolutionStrategy { - force "xml-apis:xml-apis:1.4.01" - } - } -} -repositories { - jcenter() - mavenLocal() - // Needed for gradle plugins - maven { url "https://plugins.gradle.org/m2/" } - // Needed for mlcp dependencies - maven { url "https://developer.marklogic.com/maven2/" } - // Needed for hadoop dependencies for mlcp - maven { url "http://repository.cloudera.com/artifactory/cloudera-repos/" } -} - -dependencies { - // this allows you to write custom java code that depends - // on the Data Hub Framework library - compile 'com.marklogic:marklogic-data-hub:4.0.1' - compile 'com.marklogic:marklogic-xcc:9.0.7' - mlcp "com.marklogic:mlcp:9.0.7" - mlcp files("lib") -} - -task importAllCustomers(type: com.marklogic.gradle.task.MlcpTask) { - doFirst { - classpath = configurations.mlcp - input_file_path = "/home/ec2-user/space/DHS/input/json/customers/" - input_file_type = "documents" - output_collections = "Customer,DHS" - output_permissions = "flowDeveloper,read,flowDeveloper,execute,flowDeveloper,insert,flowDeveloper,update,flowOperator,read,flowOperator,update,flowOperator,execute,flowOperator,insert" - output_uri_replace = "/home/ec2-user/space/DHS/input/json,''" - document_type = "json" - transform_module = "/data-hub/4/transforms/mlcp-flow-transform.sjs" - transform_namespace = "http://marklogic.com/data-hub/mlcp-flow-transform" - transform_param = "entity-name=Customer,flow-name=custInput" - command = "IMPORT" - mode = "local" - host = "internal-mlaas-icalb-1owe6oc6du7uo-1452370097.us-east-1.elb.amazonaws.com" - port = 8006 - username = "dhfoperator" - password = "M@rkl0gic" - restrict_hosts = true - } -} +/* + * This file was generated by the Gradle 'init' task. + * + * This is a general purpose Gradle build. + * Learn how to create Gradle builds at https://guides.gradle.org/creating-new-gradle-builds/ + */ + +plugins { + id 'java' + id 'eclipse' + id 'idea' + + // This plugin allows you to create different environments + // for your gradle deploy. Each environment is represented + // by a gradle-${env}.properties file + // See https://github.com/stevesaliman/gradle-properties-plugin + // specify the env on the command line with: + // gradle -PenvironmentName=x ... + id 'net.saliman.properties' version '1.4.6' + + // This gradle plugin extends the ml-gradle plugin with + // commands that make the Data Hub Framework do its magic + id 'com.marklogic.ml-data-hub' version '4.1.0' +} + +apply plugin: "com.marklogic.ml-data-hub" + +configurations { + mlcp { + resolutionStrategy { + force "xml-apis:xml-apis:1.4.01" + } + } +} +repositories { + jcenter() + mavenLocal() + // Needed for gradle plugins + maven { url "https://plugins.gradle.org/m2/" } + // Needed for mlcp dependencies + maven { url "https://developer.marklogic.com/maven2/" } + // Needed for hadoop dependencies for mlcp + maven { url "http://repository.cloudera.com/artifactory/cloudera-repos/" } +} + +dependencies { + // this allows you to write custom java code that depends + // on the Data Hub Framework library + compile 'com.marklogic:marklogic-data-hub:4.1.0' + compile 'com.marklogic:marklogic-xcc:9.0.7' + mlcp "com.marklogic:mlcp:9.0.7" + mlcp files("lib") +} + + +task importAllCustomers(type: com.marklogic.gradle.task.MlcpTask) { + doFirst { + classpath = configurations.mlcp + input_file_path = "$mlInput" + "$customersPath" + input_file_type = "documents" + output_collections = "Customer,DHS" + output_permissions = "flowDeveloper,read,flowDeveloper,execute,flowDeveloper,insert,flowDeveloper,update,flowOperator,read,flowOperator,update,flowOperator,execute,flowOperator,insert" + output_uri_replace = input_file_path + ",''" + document_type = "json" + transform_module = "/data-hub/4/transforms/mlcp-flow-transform.sjs" + transform_namespace = "http://marklogic.com/data-hub/mlcp-flow-transform" + transform_param = "entity-name=Customer,flow-name=customerInput" + command = "IMPORT" + mode = "local" + host = "$mlHost" + port = 8006 + username = "$mlUsername" + password = "$mlPassword" + restrict_hosts = true + } +} + diff --git a/examples/DHS-e2e/DHS/gradle.properties b/examples/DHS-e2e/DHS/gradle.properties new file mode 100644 index 0000000000..5a95de47ce --- /dev/null +++ b/examples/DHS-e2e/DHS/gradle.properties @@ -0,0 +1,49 @@ +mlDHFVersion=4.1.0 +mlHost= +mlIsHostLoadBalancer=true + +#mlUsername=dhfoperator +mlUsername=flowdev +mlPassword=SomePass#123 +mlManageUsername=flowdev +mlManagePassword=SomePass#123 +#mlSecurityUsername +#mlSecurityPassword + +#mlHubUserRole=flowOperator +mlHubUserName=flowdev +mlHubUserPassword=SomePass#123 +#mlHubAdminRole=flowDeveloper +#mlHubAdminUserName=flowdev +#mlHubAdminPassword=SomePass#123 + +mlStagingAppserverName=data-hub-STAGING +mlStagingPort=8006 +mlStagingDbName=data-hub-STAGING +mlStagingForestsPerHost=1 + +mlFinalAppserverName=data-hub-ADMIN +mlFinalPort=8004 +mlFinalDbName=data-hub-FINAL +mlFinalForestsPerHost=1 + +mlJobAppserverName=data-hub-JOBS +mlJobPort=8007 +mlJobDbName=data-hub-JOBS +mlJobForestsPerHost=1 + +mlModulesDbName=data-hub-MODULES +mlStagingTriggersDbName=data-hub-staging-TRIGGERS +mlStagingSchemasDbName=data-hub-staging-SCHEMAS + +mlFinalTriggersDbName=data-hub-final-TRIGGERS +mlFinalSchemasDbName=data-hub-final-SCHEMAS + +mlModulePermissions=flowDeveloper,read,flowDeveloper,execute,flowDeveloper,insert,flowOperator,read,flowOperator,execute,flowOperator,insert +#mlNoRestServer=true +#mlReplaceTokensInModules=false +mlIsProvisionedEnvironment=true + +#mlcpInput +mlInput=input +customersPath=/json/customers/ diff --git a/examples/DHS-e2e/DHS/gradle/wrapper/gradle-wrapper.jar b/examples/DHS-e2e/DHS/gradle/wrapper/gradle-wrapper.jar index edf37f90ea..29953ea141 100644 Binary files a/examples/DHS-e2e/DHS/gradle/wrapper/gradle-wrapper.jar and b/examples/DHS-e2e/DHS/gradle/wrapper/gradle-wrapper.jar differ diff --git a/examples/DHS-e2e/DHS/gradle/wrapper/gradle-wrapper.properties b/examples/DHS-e2e/DHS/gradle/wrapper/gradle-wrapper.properties index 10ddd09d37..115e6ac0aa 100644 --- a/examples/DHS-e2e/DHS/gradle/wrapper/gradle-wrapper.properties +++ b/examples/DHS-e2e/DHS/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Wed Sep 06 15:50:41 EDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.4-bin.zip diff --git a/examples/DHS-e2e/DHS/gradlew b/examples/DHS-e2e/DHS/gradlew index 4453ccea33..cccdd3d517 100755 --- a/examples/DHS-e2e/DHS/gradlew +++ b/examples/DHS-e2e/DHS/gradlew @@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { +warn () { echo "$*" } -die ( ) { +die () { echo echo "$*" echo @@ -155,7 +155,7 @@ if $cygwin ; then fi # Escape application args -save ( ) { +save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/collector.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/collector.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/collector.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/collector.sjs diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/content.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/content.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/content.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/content.sjs diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/custESJJ.properties b/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/customerHarmonize.properties similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/custESJJ.properties rename to examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/customerHarmonize.properties diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/headers.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/headers.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/headers.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/headers.sjs diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/main.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/main.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/main.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/main.sjs diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/triples.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/triples.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/triples.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/triples.sjs diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/writer.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/writer.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/custESJJ/writer.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/harmonize/customerHarmonize/writer.sjs diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/content.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/content.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/content.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/content.sjs diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/custInput.properties b/examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/customerInput.properties similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/custInput.properties rename to examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/customerInput.properties diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/headers.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/headers.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/headers.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/headers.sjs diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/main.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/main.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/main.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/main.sjs diff --git a/examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/triples.sjs b/examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/triples.sjs similarity index 100% rename from examples/DHS-e2e/DHS/plugins/entities/Customer/input/custInput/triples.sjs rename to examples/DHS-e2e/DHS/plugins/entities/Customer/input/customerInput/triples.sjs diff --git a/examples/DHS-e2e/DSF/build.gradle b/examples/DHS-e2e/DSF/build.gradle index 82ecd278dd..b5297f159c 100644 --- a/examples/DHS-e2e/DSF/build.gradle +++ b/examples/DHS-e2e/DSF/build.gradle @@ -1,31 +1,31 @@ -plugins { - id 'com.marklogic.ml-development-tools' version '4.1.1' - id "com.marklogic.ml-gradle" version "3.9.0" -} - - -group 'com.marklogic.APIs.Customer' - -apply plugin: 'java' -apply plugin: 'application' - -mainClassName = "testCustomer" -sourceCompatibility = 1.8 - -repositories { - mavenCentral() - jcenter() -} -task generateCustomerSearcher(type: com.marklogic.client.tools.gradle.EndpointProxiesGenTask) { - serviceDeclarationFile = 'src/main/ml-modules/root/APIs/Customer/service.json' -} - -task (runMain, dependsOn: 'classes', type: JavaExec) { - main = 'com.marklogic.APIs.testCustomer' - classpath = sourceSets.main.runtimeClasspath -} - -dependencies { - compile group: 'com.marklogic', name: 'marklogic-client-api', version:'4.1.1' - //testCompile group: 'junit', name: 'junit', version:'4.12' -} +plugins { + id 'com.marklogic.ml-development-tools' version '4.1.1' + id "com.marklogic.ml-gradle" version "3.9.0" +} + + +group 'com.marklogic.APIs.Customer' + +apply plugin: 'java' +apply plugin: 'application' + +mainClassName = "TestCustomer" +sourceCompatibility = 1.8 + +repositories { + mavenCentral() + jcenter() +} +task generateCustomerSearcher(type: com.marklogic.client.tools.gradle.EndpointProxiesGenTask) { + serviceDeclarationFile = 'src/main/ml-modules/root/APIs/Customer/service.json' +} + +task (runMain, dependsOn: 'classes', type: JavaExec) { + main = 'com.marklogic.APIs.TestCustomer' + classpath = sourceSets.main.runtimeClasspath +} + +dependencies { + compile group: 'com.marklogic', name: 'marklogic-client-api', version:'4.1.1' + //testCompile group: 'junit', name: 'junit', version:'4.12' +} diff --git a/examples/DHS-e2e/DSF/gradle.properties b/examples/DHS-e2e/DSF/gradle.properties new file mode 100644 index 0000000000..653c4975c2 --- /dev/null +++ b/examples/DHS-e2e/DSF/gradle.properties @@ -0,0 +1,16 @@ +mlHost= +operationsEndpoint= +mlAppName=data-hub + +# Your MarkLogic Username and Password +mlAppServicesUsername=endpointdev +mlAppServicesPassword=SomePass#123 + +mlModulesDatabaseName=data-hub-MODULES +mlAppServicesPort=8004 + +mlNoRestServer=true +mlReplaceTokensInModules=false + +mlModulePermissions=endpointDeveloper,read,endpointDeveloper,update,endpointDeveloper,execute,endpointUser,execute + diff --git a/examples/DHS-e2e/DSF/gradle/wrapper/gradle-wrapper.jar b/examples/DHS-e2e/DSF/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..ed88a042a2 Binary files /dev/null and b/examples/DHS-e2e/DSF/gradle/wrapper/gradle-wrapper.jar differ diff --git a/examples/DHS-e2e/DSF/gradle/wrapper/gradle-wrapper.properties b/examples/DHS-e2e/DSF/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..74bb77845e --- /dev/null +++ b/examples/DHS-e2e/DSF/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip diff --git a/examples/DHS-e2e/DSF/gradlew b/examples/DHS-e2e/DSF/gradlew new file mode 100755 index 0000000000..cccdd3d517 --- /dev/null +++ b/examples/DHS-e2e/DSF/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/examples/DHS-e2e/DSF/gradlew.bat b/examples/DHS-e2e/DSF/gradlew.bat new file mode 100644 index 0000000000..e95643d6a2 --- /dev/null +++ b/examples/DHS-e2e/DSF/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/Customer.java b/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/Customer.java index 6b89a44095..49edaec14c 100644 --- a/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/Customer.java +++ b/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/Customer.java @@ -1,104 +1,107 @@ -package com.marklogic.APIs; - -// IMPORTANT: Do not edit. This file is generated. - -import com.marklogic.client.io.Format; -import java.io.Reader; - - -import com.marklogic.client.DatabaseClient; - -import com.marklogic.client.impl.BaseProxy; - -/** - * Provides a set of operations on the database server - */ -public interface Customer { - /** - * Creates a Customer object for executing operations on the database server. - * - * The DatabaseClientFactory class can create the DatabaseClient parameter. A single - * client object can be used for any number of requests and in multiple threads. - * - * @param db provides a client for communicating with the database server - * @return an object for session state - */ - static Customer on(DatabaseClient db) { - final class CustomerImpl implements Customer { - private BaseProxy baseProxy; - - private CustomerImpl(DatabaseClient dbClient) { - baseProxy = new BaseProxy(dbClient, "/APIs/Customer/"); - } - - @Override - public Integer customerDocsCount(String collectionName) { - return BaseProxy.IntegerType.toInteger( - baseProxy - .request("customerDocsCount.sjs", BaseProxy.ParameterValuesKind.SINGLE_ATOMIC) - .withSession() - .withParams( - BaseProxy.atomicParam("collectionName", false, BaseProxy.StringType.fromString(collectionName))) - .withMethod("POST") - .responseSingle(false, null) - ); - } - - - @Override - public Reader customerWithChInCompanyName(String keyword) { - return BaseProxy.JsonDocumentType.toReader( - baseProxy - .request("customerWithChInCompanyName.sjs", BaseProxy.ParameterValuesKind.SINGLE_ATOMIC) - .withSession() - .withParams( - BaseProxy.atomicParam("keyword", false, BaseProxy.StringType.fromString(keyword))) - .withMethod("POST") - .responseSingle(false, Format.JSON) - ); - } - - - @Override - public Reader customerWithSalesAsTitle(String title) { - return BaseProxy.JsonDocumentType.toReader( - baseProxy - .request("customerWithSalesAsTitle.sjs", BaseProxy.ParameterValuesKind.SINGLE_ATOMIC) - .withSession() - .withParams( - BaseProxy.atomicParam("title", false, BaseProxy.StringType.fromString(title))) - .withMethod("POST") - .responseSingle(false, Format.JSON) - ); - } - - } - - return new CustomerImpl(db); - } - - /** - * Invokes the customerDocsCount operation on the database server - * - * @param collectionName provides input - * @return as output - */ - Integer customerDocsCount(String collectionName); - - /** - * Invokes the customerWithChInCompanyName operation on the database server - * - * @param keyword provides input - * @return as output - */ - Reader customerWithChInCompanyName(String keyword); - - /** - * Invokes the customerWithSalesAsTitle operation on the database server - * - * @param title provides input - * @return as output - */ - Reader customerWithSalesAsTitle(String title); - -} +package com.marklogic.APIs; + +// IMPORTANT: Do not edit. This file is generated. + +import com.marklogic.client.io.Format; +import java.io.Reader; + + +import com.marklogic.client.DatabaseClient; + +import com.marklogic.client.impl.BaseProxy; + +/** + * Provides a set of operations on the database server + */ +public interface Customer { + /** + * Creates a Customer object for executing operations on the database server. + * + * The DatabaseClientFactory class can create the DatabaseClient parameter. A single + * client object can be used for any number of requests and in multiple threads. + * + * @param db provides a client for communicating with the database server + * @return an object for session state + */ + static Customer on(DatabaseClient db) { + final class CustomerImpl implements Customer { + private BaseProxy baseProxy; + + private CustomerImpl(DatabaseClient dbClient) { + baseProxy = new BaseProxy(dbClient, "/APIs/Customer/"); + } + + @Override + public Integer customerDocsCount(String collectionName) { + System.out.println("\n Should return count of documents in the collection " + collectionName + " \n"); + return BaseProxy.IntegerType.toInteger( + baseProxy + .request("customerDocsCount.sjs", BaseProxy.ParameterValuesKind.SINGLE_ATOMIC) + .withSession() + .withParams( + BaseProxy.atomicParam("collectionName", false, BaseProxy.StringType.fromString(collectionName))) + .withMethod("POST") + .responseSingle(false, null) + ); + } + + + @Override + public Reader customerWithChInCompanyName(String keyword) { + System.out.println("\n Should return all documents that have 'Ch' in CompanyName \n"); + return BaseProxy.JsonDocumentType.toReader( + baseProxy + .request("customerWithChInCompanyName.sjs", BaseProxy.ParameterValuesKind.SINGLE_ATOMIC) + .withSession() + .withParams( + BaseProxy.atomicParam("keyword", false, BaseProxy.StringType.fromString(keyword))) + .withMethod("POST") + .responseSingle(false, Format.TEXT) + ); + } + + + @Override + public Reader customerWithSalesAsTitle(String title) { + System.out.println("\n Should return all documents(5) that have 'Sales' as ContactTitle \n"); + return BaseProxy.JsonDocumentType.toReader( + baseProxy + .request("customerWithSalesAsTitle.sjs", BaseProxy.ParameterValuesKind.SINGLE_ATOMIC) + .withSession() + .withParams( + BaseProxy.atomicParam("title", false, BaseProxy.StringType.fromString(title))) + .withMethod("POST") + .responseSingle(false, Format.TEXT) + ); + } + + } + + return new CustomerImpl(db); + } + + /** + * Invokes the customerDocsCount operation on the database server + * + * @param collectionName provides input + * @return as output + */ + Integer customerDocsCount(String collectionName); + + /** + * Invokes the customerWithChInCompanyName operation on the database server + * + * @param keyword provides input + * @return as output + */ + Reader customerWithChInCompanyName(String keyword); + + /** + * Invokes the customerWithSalesAsTitle operation on the database server + * + * @param title provides input + * @return as output + */ + Reader customerWithSalesAsTitle(String title); + +} diff --git a/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/TestCustomer.java b/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/TestCustomer.java new file mode 100644 index 0000000000..a99000e536 --- /dev/null +++ b/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/TestCustomer.java @@ -0,0 +1,57 @@ +package com.marklogic.APIs; + +import com.marklogic.client.DatabaseClient; +import com.marklogic.client.DatabaseClientFactory; +import com.marklogic.client.io.JacksonHandle; +import com.marklogic.client.io.marker.AbstractReadHandle; +import com.marklogic.client.DatabaseClient.ConnectionType; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.util.Properties; +import java.io.InputStream; +import java.io.FileInputStream; +import java.util.stream.Stream; + +import com.fasterxml.jackson.databind.JsonNode; + + +public class TestCustomer { + public static void main(String [] argv) throws IOException { + + Properties prop = new Properties(); + InputStream input = null; + + input = new FileInputStream("gradle.properties"); + + prop.load(input); + + String username = prop.getProperty("mlAppServicesUsername"); + String password = prop.getProperty("mlAppServicesPassword"); + String operationsEndPoint = prop.getProperty("operationsEndpoint"); + int port = 8009; + + StringBuilder b = new StringBuilder(); + String line = null; + + DatabaseClient dbClient = DatabaseClientFactory.newClient(operationsEndPoint, port, new DatabaseClientFactory.DigestAuthContext(username, password), ConnectionType.GATEWAY); + + + //Reader output = Customer.on(dbClient).customerWithChInCompanyName("Ch"); + //BufferedReader output = new BufferedReader(Customer.on(dbClient).customerWithChInCompanyName("Ch")); + try { + BufferedReader output = new BufferedReader(Customer.on(dbClient).customerWithSalesAsTitle("Sales")); + while ((line = output.readLine()) != null) { + b.append(line+"\n\n"); + } + System.out.println(b); + output.close(); + //System.out.println(Customer.on(dbClient).customerDocsCount("Customer"));//output.readLine()); + } catch (Exception e) { + e.printStackTrace(); + } + + finally{dbClient.release();} + } +} diff --git a/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/testCustomer.java b/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/testCustomer.java deleted file mode 100644 index 992cf7b7e0..0000000000 --- a/examples/DHS-e2e/DSF/src/main/java/com/marklogic/APIs/testCustomer.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.marklogic.APIs; - -import com.marklogic.client.DatabaseClient; -import com.marklogic.client.DatabaseClientFactory; -import com.marklogic.client.io.JacksonHandle; -import com.marklogic.client.io.marker.AbstractReadHandle; -import com.marklogic.client.DatabaseClient.ConnectionType; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.Reader; -import java.util.stream.Stream; - -import com.fasterxml.jackson.databind.JsonNode; - - -public class testCustomer { - public static void main(String [] argv) throws IOException { - - String username = "apiuser"; - String password = "M@rkl0gic"; - String operationsEndPoint = "internal-mlaas-oalb-9whto2c1y3h3-430551021.us-east-1.elb.amazonaws.com"; - int port = 8009; - - StringBuilder b = new StringBuilder(); - String line = null; - - DatabaseClient dbClient = DatabaseClientFactory.newClient(operationsEndPoint, port, new DatabaseClientFactory.DigestAuthContext(username, password), ConnectionType.GATEWAY); - - - //Reader output = Customer.on(dbClient).customerWithChInCompanyName("Ch"); - //BufferedReader output = new BufferedReader(Customer.on(dbClient).customerWithChInCompanyName("Ch")); - try { - BufferedReader output = new BufferedReader(Customer.on(dbClient).customerWithSalesAsTitle("Sales")); - while ((line = output.readLine()) != null) { - b.append(line); - } - System.out.println(b); - output.close(); - //System.out.println(Customer.on(dbClient).customerDocsCount("Customer"));//output.readLine()); - } catch (Exception e) { - e.printStackTrace(); - } - - finally{dbClient.release();} - } -} diff --git a/examples/DHS-e2e/README.md b/examples/DHS-e2e/README.md index ccc543b100..cfc2ca427d 100644 --- a/examples/DHS-e2e/README.md +++ b/examples/DHS-e2e/README.md @@ -1,63 +1,57 @@ -# Running Data Hub Service end-end # - -There are 2 projects one for each DHS and DSF. DHS is the project to run DHF flows in the stack spun up by DHS. Whereas DSF is the project that consumes curated data in the FINAL database. Commands to be executed in sequence are as under: - -## Pre-req ## -Gradle 4.x+ installed globally. -* wget https://services.gradle.org/distributions/gradle-4.2.1-bin.zip -* unzip to a dir of choice -* update env var PATH in bash_profile - * `export PATH=$PATH:/gradle4.2.1/bin` - * source ~/.bash_profile - -There is a gradle task “importAllCustomers” to ingest source documents. So you can either run that task or use your locally installed mlcp.sh as described later. -* Download and Extract mlcp-9.0.7.zip to a directory of your choice - * `export PATH=$PATH:/mlcp-9.0.7/bin` - * source ~/.bash_profile - - -After creating stack in AWS make sure you have created following users with appropriate roles. Set the Password as M@rkl0gic for all the users. - -You can create them with username/password of your own choice. In that case ensure DHS/gradle.properties, DSF/gradle.properties and DSF/src/main/java/com/marklogic/APIs/testCustomer.java files are updated to use them. - -* For DHS project - * User dhfdevelop has flowDeveloper role - * User dhfoperator has flowOperator role -* For DSF project - * User apideveloper has endpointDeveloper role - * User apiuser has endpointUser role - - -## Assumptions and things to note ## -* This project assumes that DHS environment is already provisioned. All the app servers, databases are provisioned and required roles created as described in pre-req above -* This example was executed from bastion host -* Latest DHS release enables you to configure the endpoints to be public. If they are, you can run this project from your laptop. If the endpoints are private, then these hosts are only accessible from the VPC that is peered to the MarkLogic VPC (This can be accessed from your local by ssh tunneling). In either case please update mlHost in DHS/gradle.properties to use Flows endpoint and DSF/gradle.properties and DSF/src/main/java/com/marklogic/APIs/testCustomer.java to use Operations endpoint - - -# Steps to run end to end # - -## Getting your flows in DHS ## -1. cd `` -2. Install data-hub core MODULES - 1. gradle hubInstallModules -3. Load your modules for input/harmoninzation flows - 1. gradle mlLoadModules -4. Run input flow - 1. mlcp.sh import -mode "local" -host "`Ingest/Flows endpoint`" -port "8006" -username "xx" -password "yy" -input_file_path "`path to DHS/input/json/customers/`" -input_file_type "documents" -output_collections "Customer,DHS" -output_permissions "rest-reader,read,rest-writer,update" -output_uri_replace "`path to DHS/input/json,''`" -document_type "json" -transform_module "/data-hub/4/transforms/mlcp-flow-transform.sjs" -transform_namespace "http://marklogic.com/data-hub/mlcp-flow-transform" -transform_param "entity-name=Customer,flow-name=custInput" -restrict_hosts true - - ___Alternately you can run___ - - 2. gradle importAllCustomers - 1. Ensure to update path to input documents in DHS/build.gradle where the task is defined -5. Run harmonization flow - 1. gradle hubRunFlow -PentityName=Customer -PflowName=custESJJ - -## Consuming curated data from FINAL database ## -1. cd `` -2. Load your APIs into data-hub-MODULES database - 1. gradle mlLoadModules -3. Call the API. The API runs a query on FINAL database to return all the Customers who have "Sales" in their title - 1. gradle runMain - - -___You can verify via REST port 8004 for ingested/harmonized docs___ +# Running Data Hub Service end-to-end # + +There are two projects — one for running DHF flows in Data Hub Service (DHS), and one for consuming data from the final database with Data Services (DSF). + +## Prerequisites ## + +Install MarkLogic Content Pump (mlcp). +* Download and Extract mlcp-9.0.7.zip to a directory of your choice + * `export PATH=$PATH:/mlcp-9.0.7/bin` + * `source ~/.bash_profile` + + +After creating your stack in AWS, make sure you have created users with appropriate roles. Update DHS/gradle.properties and DSF/gradle.properties to use them. +For information on DHS roles, refer to the [DHS documentation](https://internal.cloudservices.marklogic.com/help?type=datahub&subtype=user#DHSroles) + + +## Assumptions and things to note ## +* This project assumes that a DHS environment is already provisioned. All the app servers and databases should be provisioned and required roles created as described in the prerequisites above. +* This example was run from bastion host. +* DHS enables you to configure the endpoints to be private or public. If they are public, you can run this project from your laptop. If the endpoints are private, then these hosts are only accessible from the VPC that is peered to the MarkLogic VPC. In either case, please update `mlHost` in DHS/gradle.properties and DSF/gradle.properties to use the Flows endpoint and `operationsEndpoint` in DSF/gradle.properties to use the Operations endpoint. + + +# Steps # + +## Getting your flows in DHS ## +1. `cd ` +2. Install data-hub core MODULES + * `./gradlew hubInstallModules` + * Verify that data-hub-MODULES has 133 documents from your browser: + ___http://CURATION_ENDPOINT:8004/v1/search?database=data-hub-MODULES___ +3. Load your modules for the input and harmonization flows + * `./gradlew mlLoadModules` + * Verify that data-hub-MODULES has 145 documents from your browser: + ___http://CURATION_ENDPOINT:8004/v1/search?database=data-hub-MODULES___ +4. Load your indexes into the databases + * `./gradlew mlUpdateIndexes` +5. Run the input flow in either ways below + * `./gradlew importAllCustomers` OR + * `mlcp.sh import -mode "local" -host "`**Ingest/Flows endpoint**`" -port "8006" -username "`**Your username here**`" -password "`**Your password here**`" -input_file_path "`**path to DHS/input/json/customers/**`" -input_file_type "documents" -output_collections "Customer,DHS" -output_permissions "rest-reader,read,rest-writer,update" -output_uri_replace "`**path to DHS/input/json**`,''" -document_type "json" -transform_module "/data-hub/4/transforms/mlcp-flow-transform.sjs" -transform_namespace "http://marklogic.com/data-hub/mlcp-flow-transform" -transform_param "entity-name=Customer,flow-name=customerInput" -restrict_hosts true` + * Verify there are 11 documents in data-hub-STAGING: + ___http://CURATION_ENDPOINT:8004/v1/search?database=data-hub-STAGING___ +6. Run the harmonization flow + * `./gradlew hubRunFlow -PentityName=Customer -PflowName=customerHarmonize` + * Verify there are 11 documents in data-hub-FINAL: + ___http://CURATION_ENDPOINT:8004/v1/search?database=data-hub-FINAL___ + +## Consuming curated data from the data-hub-FINAL database ## +1. `cd ` +2. Load your APIs into the data-hub-MODULES database + * (Optional) If you are using the same project to run against another AWS stack, delete `module-timestamps.properties` from under the `build/ml-javaclient-util` directory + * `./gradlew mlLoadModules` + * Verify that data-hub-MODULES has 152 documents from your browser: + ___http://CURATION_ENDPOINT:8004/v1/search?database=data-hub-MODULES___ +3. Call the API. The API runs a query on FINAL database to return all the Customers who have "Sales" in their title + * `./gradlew runMain` + + diff --git a/examples/dhf4-with-tests/.gitignore b/examples/dhf4-with-tests/.gitignore new file mode 100644 index 0000000000..5a7f37da40 --- /dev/null +++ b/examples/dhf4-with-tests/.gitignore @@ -0,0 +1,2 @@ +!gradle.properties +!hub-internal-config/ diff --git a/examples/dhf4-with-tests/README.md b/examples/dhf4-with-tests/README.md new file mode 100644 index 0000000000..91bf31e0f6 --- /dev/null +++ b/examples/dhf4-with-tests/README.md @@ -0,0 +1,23 @@ +This project shows an example of running JUnit5 tests against a DHF 4.1 application, including tests +that verify that the application was correctly deployed. + +Before deploying, create gradle-local.properties in this directory and add the following to it: + + mlUsername= + mlPassword= + +Enter values for the properties for a MarkLogic user that is able to deploy an application - the admin user should suffice. + +Then deploy the app; the -i is for info-level logging: + + ./gradlew -i mlDeploy + +You can then run the test cases via: + + ./gradlew test + +That task will run the following test classes in src/test/java: + +- VerifyDeploymentTest, which verifies that the application was correctly deployed +- RunUnitTestsTest, which demonstrates executing tests written using marklogic-unit-test via JUnit5 + diff --git a/examples/dhf4-with-tests/build.gradle b/examples/dhf4-with-tests/build.gradle new file mode 100644 index 0000000000..0e87ce5598 --- /dev/null +++ b/examples/dhf4-with-tests/build.gradle @@ -0,0 +1,31 @@ +plugins { + id "java" + id 'net.saliman.properties' version '1.4.6' + id 'com.marklogic.ml-data-hub' version '4.1.0' +} + +repositories { + jcenter() +} + +dependencies { + // Needed to execute tests written using marklogic-unit-test + mlRestApi "com.marklogic:marklogic-unit-test-modules:0.12.0" + + // Supports testing against MarkLogic via JUnit5 + testCompile "com.marklogic:marklogic-junit:0.11.0" + + // Needed for verifying the deployment in a JUnit5 test + testCompile "com.marklogic:ml-app-deployer:3.10.1" + + // Needed by Gradle 4.6+ to run "gradle test" + testRuntime "org.junit.jupiter:junit-jupiter-engine:5.3.0" +} + +/** + * This is needed in order to run "gradle test" in Gradle 4.6+. + * See https://www.petrikainulainen.net/programming/testing/junit-5-tutorial-running-unit-tests-with-gradle/ + */ +test { + useJUnitPlatform() +} diff --git a/examples/dhf4-with-tests/gradle.properties b/examples/dhf4-with-tests/gradle.properties new file mode 100644 index 0000000000..c9bd830b97 --- /dev/null +++ b/examples/dhf4-with-tests/gradle.properties @@ -0,0 +1,66 @@ +mlDHFVersion=4.1.0-rc2 +mlHost=localhost + +# Demonstrates the use of multiple module paths with 4.1.0 +mlModulePaths=src/main/ml-modules,src/test/ml-modules + +# Demonstrates the use of multiple config paths with 4.1.0 +mlConfigPaths=src/main/hub-internal-config,src/main/ml-config,src/test/ml-config + +# Your MarkLogic Username and Password +mlUsername= +mlPassword= + +mlStagingAppserverName=data-hub-STAGING +mlStagingPort=8010 +mlStagingDbName=data-hub-STAGING +mlStagingForestsPerHost=4 +mlStagingAuth=digest + +mlFinalAppserverName=data-hub-FINAL +mlFinalPort=8011 +mlFinalDbName=data-hub-FINAL +mlFinalForestsPerHost=3 +mlFinalAuth=digest + +mlJobAppserverName=data-hub-JOBS +mlJobPort=8013 +mlJobDbName=data-hub-JOBS +mlJobForestsPerHost=2 +mlJobAuth=digest + +mlModulesDbName=data-hub-MODULES +mlModulesForestsPerHost=1 + +mlStagingTriggersDbName=data-hub-staging-TRIGGERS +mlStagingTriggersForestsPerHost=1 + +mlStagingSchemasDbName=data-hub-staging-SCHEMAS +mlStagingSchemasForestsPerHost=1 + +mlFinalTriggersDbName=data-hub-final-TRIGGERS +mlFinalTriggersForestsPerHost=1 + +mlFinalSchemasDbName=data-hub-final-SCHEMAS +mlFinalSchemasForestsPerHost=1 + + +# The name of the Role to create for Hub Access +mlHubUserRole=data-hub-role +mlHubUserName=data-hub-user +# this password is autogenerated for you via the 'gradle hubInit' task +mlHubUserPassword=4{m^Z3H>}G0q>}m~dWsh + +# The name of the role to create for hub deployment/development +mlHubAdminRole=hub-admin-role +mlHubAdminUserName=hub-admin-user +mlHubAdminUserPassword=5RvzEXMDm#}m%$fsuuwg + +# Default module permissions which allow data-hub-role to execute flows +mlModulePermissions=rest-reader,read,rest-writer,insert,rest-writer,update,rest-extension-user,execute,data-hub-role,read,data-hub-role,execute + +# Properties for test resources +# For now, the final database and app server are used for running tests, as none of the tests involve manipulating data +# in a database, which would typically require a separate app server and database +mlTestDbName=data-hub-FINAL +mlTestPort=8011 diff --git a/examples/dhf4-with-tests/gradle/wrapper/gradle-wrapper.jar b/examples/dhf4-with-tests/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..29953ea141 Binary files /dev/null and b/examples/dhf4-with-tests/gradle/wrapper/gradle-wrapper.jar differ diff --git a/examples/dhf4-with-tests/gradle/wrapper/gradle-wrapper.properties b/examples/dhf4-with-tests/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..115e6ac0aa --- /dev/null +++ b/examples/dhf4-with-tests/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/examples/dhf4-with-tests/gradlew b/examples/dhf4-with-tests/gradlew new file mode 100755 index 0000000000..4453ccea33 --- /dev/null +++ b/examples/dhf4-with-tests/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/examples/dhf4-with-tests/gradlew.bat b/examples/dhf4-with-tests/gradlew.bat new file mode 100755 index 0000000000..f9553162f1 --- /dev/null +++ b/examples/dhf4-with-tests/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/dhf4-with-tests/plugins/entities/Person/Person.entity.json b/examples/dhf4-with-tests/plugins/entities/Person/Person.entity.json new file mode 100644 index 0000000000..906dcf7611 --- /dev/null +++ b/examples/dhf4-with-tests/plugins/entities/Person/Person.entity.json @@ -0,0 +1,18 @@ +{ + "info" : { + "title" : "Person", + "version" : "0.0.1", + "baseUri" : "http://example.com/", + "description" : "An Person entity" + }, + "definitions" : { + "Person" : { + "description" : "The Person entity root.", + "required" : [ ], + "rangeIndex" : [ ], + "wordLexicon" : [ ], + "pii" : [ ], + "properties" : { } + } + } +} diff --git a/examples/dhf4-with-tests/plugins/entities/Person/input/input1/content.sjs b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/content.sjs new file mode 100644 index 0000000000..e8d26d8961 --- /dev/null +++ b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/content.sjs @@ -0,0 +1,74 @@ +'use strict' + +/* +* Create Content Plugin +* +* @param id - the identifier returned by the collector +* @param options - an object containing options. Options are sent from Java +* +* @return - your content +*/ +function createContent(id, rawContent, options) { + + + let source; + + // for xml we need to use xpath + if(rawContent && xdmp.nodeKind(rawContent) === 'element' && rawContent instanceof XMLDocument) { + source = rawContent + } + // for json we need to return the instance + else if(rawContent && rawContent instanceof Document) { + source = fn.head(rawContent.root); + } + // for everything else + else { + source = rawContent; + } + + return extractInstancePerson(source); +} + +/** +* Creates an object instance from some source document. +* @param source A document or node that contains +* data for populating a Person +* @return An object with extracted data and +* metadata about the instance. +*/ +function extractInstancePerson(source) { + let attachments = source; + // now check to see if we have XML or json, then create a node clone to operate of off + if (source instanceof Element || source instanceof ObjectNode) { + let instancePath = '/'; + if(source instanceof Element) { + //make sure we grab content root only + instancePath = '/node()[not(. instance of processing-instruction() or . instance of comment())]'; + } + source = new NodeBuilder().addNode(fn.head(source.xpath(instancePath))).toNode(); + } + else{ + source = new NodeBuilder().addNode(fn.head(source)).toNode(); + } + + + // return the instance object + return { + '$attachments': attachments, + '$type': 'Person', + '$version': '0.0.1' + } +}; + + +function makeReferenceObject(type, ref) { + return { + '$type': type, + '$ref': ref + }; +} + +module.exports = { + createContent: createContent +}; + diff --git a/examples/dhf4-with-tests/plugins/entities/Person/input/input1/headers.sjs b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/headers.sjs new file mode 100644 index 0000000000..2f7d26b073 --- /dev/null +++ b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/headers.sjs @@ -0,0 +1,17 @@ +/* + * Create Headers Plugin + * + * @param id - the identifier returned by the collector + * @param content - the output of your content plugin + * @param options - an object containing options. Options are sent from Java + * + * @return - an object of headers + */ +function createHeaders(id, content, options) { + return {}; +} + +module.exports = { + createHeaders: createHeaders +}; + diff --git a/examples/dhf4-with-tests/plugins/entities/Person/input/input1/input1.properties b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/input1.properties new file mode 100644 index 0000000000..35996dcf69 --- /dev/null +++ b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/input1.properties @@ -0,0 +1,6 @@ +# +#Tue Dec 04 14:50:53 EST 2018 +mainModule=main.sjs +mainCodeFormat=sjs +codeFormat=sjs +dataFormat=json diff --git a/examples/dhf4-with-tests/plugins/entities/Person/input/input1/main.sjs b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/main.sjs new file mode 100644 index 0000000000..83d8bc8caa --- /dev/null +++ b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/main.sjs @@ -0,0 +1,45 @@ +// dhf.sjs exposes helper functions to make your life easier +// See documentation at: +// https://marklogic.github.io/marklogic-data-hub/docs/server-side/ +const dhf = require('/data-hub/4/dhf.sjs'); + +const contentPlugin = require('./content.sjs'); +const headersPlugin = require('./headers.sjs'); +const triplesPlugin = require('./triples.sjs'); + +/* + * Plugin Entry point + * + * @param id - the identifier returned by the collector + * @param rawContent - the raw content being loaded + * @param options - a map containing options. Options are sent from Java + * + */ +function main(id, rawContent, options) { + var contentContext = dhf.contentContext(rawContent); + var content = dhf.run(contentContext, function() { + return contentPlugin.createContent(id, rawContent, options); + }); + + var headerContext = dhf.headersContext(content); + var headers = dhf.run(headerContext, function() { + return headersPlugin.createHeaders(id, content, options); + }); + + var tripleContext = dhf.triplesContext(content, headers); + var triples = dhf.run(tripleContext, function() { + return triplesPlugin.createTriples(id, content, headers, options); + }); + + var envelope = dhf.makeEnvelope(content, headers, triples, options.dataFormat); + + // log the final envelope as a trace + // only fires if tracing is enabled + dhf.logTrace(dhf.writerContext(envelope)); + + return envelope; +} + +module.exports = { + main: main +}; diff --git a/examples/dhf4-with-tests/plugins/entities/Person/input/input1/triples.sjs b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/triples.sjs new file mode 100644 index 0000000000..2bc6de7af0 --- /dev/null +++ b/examples/dhf4-with-tests/plugins/entities/Person/input/input1/triples.sjs @@ -0,0 +1,18 @@ +/* + * Create Triples Plugin + * + * @param id - the identifier returned by the collector + * @param content - the output of your content plugin + * @param headers - the output of your heaaders plugin + * @param options - an object containing options. Options are sent from Java + * + * @return - an array of triples + */ +function createTriples(id, content, headers, options) { + return []; +} + +module.exports = { + createTriples: createTriples +}; + diff --git a/examples/dhf4-with-tests/src/main/entity-config/databases/final-database.json b/examples/dhf4-with-tests/src/main/entity-config/databases/final-database.json new file mode 100644 index 0000000000..5394c3ef5c --- /dev/null +++ b/examples/dhf4-with-tests/src/main/entity-config/databases/final-database.json @@ -0,0 +1,20 @@ +{ + "range-element-index": [ + { + "collation": "http://marklogic.com/collation/codepoint", + "invalid-values": "reject", + "localname": "entityConfigFinal1", + "namespace-uri": null, + "range-value-positions": false, + "scalar-type": "string" + }, + { + "collation": "http://marklogic.com/collation/codepoint", + "invalid-values": "reject", + "localname": "entityConfigFinal2", + "namespace-uri": null, + "range-value-positions": false, + "scalar-type": "string" + } + ] +} diff --git a/examples/dhf4-with-tests/src/main/entity-config/databases/staging-database.json b/examples/dhf4-with-tests/src/main/entity-config/databases/staging-database.json new file mode 100644 index 0000000000..f46cf8ef68 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/entity-config/databases/staging-database.json @@ -0,0 +1,20 @@ +{ + "range-element-index": [ + { + "collation": "http://marklogic.com/collation/codepoint", + "invalid-values": "reject", + "localname": "entityConfigStaging1", + "namespace-uri": null, + "range-value-positions": false, + "scalar-type": "string" + }, + { + "collation": "http://marklogic.com/collation/codepoint", + "invalid-values": "reject", + "localname": "entityConfigStaging2", + "namespace-uri": null, + "range-value-positions": false, + "scalar-type": "string" + } + ] +} diff --git a/examples/dhf4-with-tests/src/main/entity-config/final-entity-options.xml b/examples/dhf4-with-tests/src/main/entity-config/final-entity-options.xml new file mode 100644 index 0000000000..3a11be9d3b --- /dev/null +++ b/examples/dhf4-with-tests/src/main/entity-config/final-entity-options.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + unfiltered + + + //*:instance/(Person) + + + + true + + + \ No newline at end of file diff --git a/examples/dhf4-with-tests/src/main/entity-config/staging-entity-options.xml b/examples/dhf4-with-tests/src/main/entity-config/staging-entity-options.xml new file mode 100644 index 0000000000..3a11be9d3b --- /dev/null +++ b/examples/dhf4-with-tests/src/main/entity-config/staging-entity-options.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + unfiltered + + + //*:instance/(Person) + + + + true + + + \ No newline at end of file diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/databases/job-database.json b/examples/dhf4-with-tests/src/main/hub-internal-config/databases/job-database.json new file mode 100644 index 0000000000..fdf94a967d --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/databases/job-database.json @@ -0,0 +1,118 @@ +{ + "database-name": "%%mlJobDbName%%", + "range-element-index": [ + { + "scalar-type": "string", + "namespace-uri": "", + "localname": "jobId", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "string", + "namespace-uri": "", + "localname": "jobName", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "dateTime", + "namespace-uri": "", + "localname": "startTime", + "collation": "", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "dateTime", + "namespace-uri": "", + "localname": "endTime", + "collation": "", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "string", + "namespace-uri": "", + "localname": "status", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "string", + "namespace-uri": "", + "localname": "entityName", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "string", + "namespace-uri": "", + "localname": "flowName", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "string", + "namespace-uri": "", + "localname": "flowType", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + } + ], + "range-path-index": [ + { + "scalar-type": "string", + "path-expression": "/trace/hasError", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "string", + "path-expression": "/trace/flowType", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "string", + "path-expression": "/trace/jobId", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "string", + "path-expression": "/trace/traceId", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "string", + "path-expression": "/trace/identifier", + "collation": "http://marklogic.com/collation/codepoint", + "range-value-positions": false, + "invalid-values": "reject" + }, + { + "scalar-type": "dateTime", + "path-expression": "/trace/created", + "collation": "", + "range-value-positions": false, + "invalid-values": "reject" + } + ], + "schema-database": "%%mlStagingSchemasDbName%%", + "triggers-database": "%%mlStagingTriggersDbName%%", + "triple-index": true, + "collection-lexicon": true, + "uri-lexicon": true +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/databases/staging-database.json b/examples/dhf4-with-tests/src/main/hub-internal-config/databases/staging-database.json new file mode 100644 index 0000000000..6e5d682f25 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/databases/staging-database.json @@ -0,0 +1,9 @@ +{ + "database-name": "%%mlStagingDbName%%", + "range-element-index": [], + "schema-database": "%%mlStagingSchemasDbName%%", + "triggers-database": "%%mlStagingTriggersDbName%%", + "triple-index": true, + "collection-lexicon": true, + "uri-lexicon": true +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/databases/staging-schemas-database.json b/examples/dhf4-with-tests/src/main/hub-internal-config/databases/staging-schemas-database.json new file mode 100644 index 0000000000..cf769dfa9b --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/databases/staging-schemas-database.json @@ -0,0 +1,3 @@ +{ + "database-name": "%%mlStagingSchemasDbName%%" +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/databases/staging-triggers-database.json b/examples/dhf4-with-tests/src/main/hub-internal-config/databases/staging-triggers-database.json new file mode 100644 index 0000000000..d757774cf9 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/databases/staging-triggers-database.json @@ -0,0 +1,3 @@ +{ + "database-name": "%%mlStagingTriggersDbName%%" +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/schemas/staging-schema.xsd b/examples/dhf4-with-tests/src/main/hub-internal-config/schemas/staging-schema.xsd new file mode 100644 index 0000000000..fad6024ec1 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/schemas/staging-schema.xsd @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/schemas/tde/StagingPerson-0.0.1.tdex b/examples/dhf4-with-tests/src/main/hub-internal-config/schemas/tde/StagingPerson-0.0.1.tdex new file mode 100644 index 0000000000..42d56141d5 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/schemas/tde/StagingPerson-0.0.1.tdex @@ -0,0 +1,31 @@ + + + +Extraction Template Generated from Entity Type Document +graph uri: http://example.com/Person-0.0.1 + + //*:instance[*:info/*:version = "0.0.1"] + + + + + RDF + "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + + + RDF_TYPE + sem:iri(concat($RDF, "type")) + + + + + es + http://marklogic.com/entity-services + + + + \ No newline at end of file diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-data-hub.json b/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-data-hub.json new file mode 100644 index 0000000000..2b9ccddcb1 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-data-hub.json @@ -0,0 +1,5 @@ +{ + "privilege-name": "dhf-internal-data-hub", + "action": "/data-hub/", + "kind": "uri" +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-entities.json b/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-entities.json new file mode 100644 index 0000000000..610512c0ae --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-entities.json @@ -0,0 +1,5 @@ +{ + "privilege-name": "dhf-internal-entities", + "action": "/entities/", + "kind": "uri" +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-mappings.json b/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-mappings.json new file mode 100644 index 0000000000..3e6ce232d6 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-mappings.json @@ -0,0 +1,5 @@ +{ + "privilege-name": "dhf-internal-mappings", + "action": "/mappings/", + "kind": "uri" +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-trace-ui.json b/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-trace-ui.json new file mode 100644 index 0000000000..01e9450c01 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/security/privileges/dhf-internal-trace-ui.json @@ -0,0 +1,5 @@ +{ + "privilege-name": "dhf-internal-trace-ui", + "action": "/trace-ui/", + "kind": "uri" +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/security/roles/data-hub-role.json b/examples/dhf4-with-tests/src/main/hub-internal-config/security/roles/data-hub-role.json new file mode 100644 index 0000000000..0c52de46f7 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/security/roles/data-hub-role.json @@ -0,0 +1,91 @@ +{ + "role-name": "%%mlHubUserRole%%", + "description": "A role that allows the user to read and write from MarkLogic Data Hub databases", + "role": [ + "rest-reader", + "rest-extension-user", + "rest-writer" + ], + "privilege": [ + { + "privilege-name": "xdmp:set-server-field", + "action": "http://marklogic.com/xdmp/privileges/xdmp-set-server-field", + "kind": "execute" + }, + { + "privilege-name": "xdmp:get-server-field", + "action": "http://marklogic.com/xdmp/privileges/xdmp-get-server-field", + "kind":"execute" + }, + { + "privilege-name": "manage", + "action": "http://marklogic.com/xdmp/privileges/manage", + "kind": "execute" + }, + { + "privilege-name": "xdmp:eval", + "action": "http://marklogic.com/xdmp/privileges/xdmp-eval", + "kind": "execute" + }, + { + "privilege-name": "xdmp:eval-in", + "action": "http://marklogic.com/xdmp/privileges/xdmp-eval-in", + "kind": "execute" + }, + { + "privilege-name": "xdmp:invoke", + "action": "http://marklogic.com/xdmp/privileges/xdmp-invoke", + "kind": "execute" + }, + { + "privilege-name": "xdmp:invoke-in", + "action": "http://marklogic.com/xdmp/privileges/xdmp-invoke-in", + "kind": "execute" + }, + { + "privilege-name": "xdbc:invoke", + "action": "http://marklogic.com/xdmp/privileges/xdbc-invoke", + "kind": "execute" + }, + { + "privilege-name": "xdbc:invoke-in", + "action": "http://marklogic.com/xdmp/privileges/xdbc-invoke-in", + "kind": "execute" + }, + { + "privilege-name": "xdbc:eval", + "action": "http://marklogic.com/xdmp/privileges/xdbc-eval", + "kind":"execute" + }, + { + "privilege-name": "xdbc:eval-in", + "action": "http://marklogic.com/xdmp/privileges/xdbc-eval-in", + "kind":"execute" + }, + { + "privilege-name": "xdmp:document-load", + "action": "http://marklogic.com/xdmp/privileges/xdmp-document-load", + "kind": "execute" + }, + { + "privilege-name": "xdmp:get-server-field-names", + "action": "http://marklogic.com/xdmp/privileges/xdmp-get-server-field-names", + "kind": "execute" + }, + { + "privilege-name": "xdmp:value", + "action": "http://marklogic.com/xdmp/privileges/xdmp-value", + "kind": "execute" + }, + { + "privilege-name": "unprotected-collections", + "action": "http://marklogic.com/xdmp/privileges/unprotected-collections", + "kind": "execute" + }, + { + "privilege-name": "unprotected-uri", + "action": "http://marklogic.com/xdmp/privileges/unprotected-uri", + "kind": "execute" + } + ] +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/security/roles/hub-admin-role.json b/examples/dhf4-with-tests/src/main/hub-internal-config/security/roles/hub-admin-role.json new file mode 100644 index 0000000000..b0ddb391be --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/security/roles/hub-admin-role.json @@ -0,0 +1,84 @@ +{ + "role-name": "%%mlHubAdminRole%%", + "description": "A role can deploy modules to a data hub instance.", + "role": [ + "rest-admin","manage-admin", "tde-admin" + ], + "privilege": [ + { + "privilege-name": "xdmp:set-server-field", + "action": "http://marklogic.com/xdmp/privileges/xdmp-set-server-field", + "kind": "execute" + }, + { + "privilege-name": "xdmp:get-server-field", + "action": "http://marklogic.com/xdmp/privileges/xdmp-get-server-field", + "kind":"execute" + }, + { + "privilege-name": "manage", + "action": "http://marklogic.com/xdmp/privileges/manage", + "kind": "execute" + }, + { + "privilege-name": "xdmp:eval", + "action": "http://marklogic.com/xdmp/privileges/xdmp-eval", + "kind": "execute" + }, + { + "privilege-name": "xdmp:eval-in", + "action": "http://marklogic.com/xdmp/privileges/xdmp-eval-in", + "kind": "execute" + }, + { + "privilege-name": "xdmp:invoke", + "action": "http://marklogic.com/xdmp/privileges/xdmp-invoke", + "kind": "execute" + }, + { + "privilege-name": "xdmp:invoke-in", + "action": "http://marklogic.com/xdmp/privileges/xdmp-invoke-in", + "kind": "execute" + }, + { + "privilege-name": "xdbc:invoke", + "action": "http://marklogic.com/xdmp/privileges/xdbc-invoke", + "kind": "execute" + }, + { + "privilege-name": "xdbc:invoke-in", + "action": "http://marklogic.com/xdmp/privileges/xdbc-invoke-in", + "kind": "execute" + }, + { + "privilege-name": "xdbc:eval", + "action": "http://marklogic.com/xdmp/privileges/xdbc-eval", + "kind":"execute" + }, + { + "privilege-name": "xdbc:eval-in", + "action": "http://marklogic.com/xdmp/privileges/xdbc-eval-in", + "kind":"execute" + }, + { + "privilege-name": "xdmp:document-load", + "action": "http://marklogic.com/xdmp/privileges/xdmp-document-load", + "kind": "execute" + }, + { + "privilege-name": "xdmp:get-server-field-names", + "action": "http://marklogic.com/xdmp/privileges/xdmp-get-server-field-names", + "kind": "execute" + }, + { + "privilege-name": "unprotected-collections", + "action": "http://marklogic.com/xdmp/privileges/unprotected-collections", + "kind": "execute" + }, + { + "privilege-name": "any-uri", + "action": "http://marklogic.com/xdmp/privileges/any-uri", + "kind": "execute" + } + ] +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/security/users/data-hub-user.json b/examples/dhf4-with-tests/src/main/hub-internal-config/security/users/data-hub-user.json new file mode 100644 index 0000000000..51ded8530d --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/security/users/data-hub-user.json @@ -0,0 +1,6 @@ +{ + "user-name": "%%mlHubUserName%%", + "description": "A user that is used for reading and writing from MarkLogic Data Hub databases", + "password": "%%mlHubUserPassword%%", + "role": ["%%mlHubUserRole%%"] +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/security/users/hub-admin-user.json b/examples/dhf4-with-tests/src/main/hub-internal-config/security/users/hub-admin-user.json new file mode 100644 index 0000000000..6dfc31fbb8 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/security/users/hub-admin-user.json @@ -0,0 +1,6 @@ +{ + "user-name": "%%mlHubAdminUserName%%", + "description": "A user that is used for reading and writing from MarkLogic Data Hub databases and for maintaining DHF modules", + "password": "%%mlHubAdminUserPassword%%", + "role": ["%%mlHubAdminRole%%","%%mlHubUserRole%%"] +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/servers/job-server.json b/examples/dhf4-with-tests/src/main/hub-internal-config/servers/job-server.json new file mode 100644 index 0000000000..7d6c8fda40 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/servers/job-server.json @@ -0,0 +1,14 @@ +{ + "server-name": "%%mlJobAppserverName%%", + "server-type": "http", + "root": "/", + "group-name": "%%GROUP%%", + "port": "%%mlJobPort%%", + "modules-database": "%%mlModulesDbName%%", + "content-database": "%%mlJobDbName%%", + "authentication": "%%mlJobAuth%%", + "default-error-format": "json", + "error-handler": "/MarkLogic/rest-api/error-handler.xqy", + "url-rewriter": "/data-hub/4/tracing/tracing-rewriter.xml", + "rewrite-resolves-globally": true +} diff --git a/examples/dhf4-with-tests/src/main/hub-internal-config/servers/staging-server.json b/examples/dhf4-with-tests/src/main/hub-internal-config/servers/staging-server.json new file mode 100644 index 0000000000..aecf2197a7 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/hub-internal-config/servers/staging-server.json @@ -0,0 +1,14 @@ +{ + "server-name": "%%mlStagingAppserverName%%", + "server-type": "http", + "root": "/", + "group-name": "%%GROUP%%", + "port": "%%mlStagingPort%%", + "modules-database": "%%mlModulesDbName%%", + "content-database": "%%mlStagingDbName%%", + "authentication": "%%mlStagingAuth%%", + "default-error-format": "json", + "error-handler": "/data-hub/4/rest-api/error-handler.xqy", + "url-rewriter": "/data-hub/4/rest-api/rewriter.xml", + "rewrite-resolves-globally": true +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/cpf/cpf-configs/sample-cpf-config.json b/examples/dhf4-with-tests/src/main/ml-config/cpf/cpf-configs/sample-cpf-config.json new file mode 100644 index 0000000000..0bbda884df --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/cpf/cpf-configs/sample-cpf-config.json @@ -0,0 +1,17 @@ +{ + "domain-name": "sample-domain", + "restart-user-name": "%%mlHubUserName%%", + "eval-module": "%%MODULES_DATABASE%%", + "eval-root": "/", + "conversion-enabled": false, + "permission": [ + { + "role-name": "rest-reader", + "capability": "read" + }, + { + "role-name": "rest-writer", + "capability": "update" + } + ] +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/cpf/domains/sample-domain.json b/examples/dhf4-with-tests/src/main/ml-config/cpf/domains/sample-domain.json new file mode 100644 index 0000000000..dd16182cf1 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/cpf/domains/sample-domain.json @@ -0,0 +1,12 @@ +{ + "domain-name": "sample-domain", + "description": "Sample CPF domain", + "scope": "collection", + "uri": "cpf-test", + "eval-module": "%%MODULES_DATABASE%%", + "eval-root": "/", + "pipeline": [ + "Status Change Handling", + "Sample Pipeline" + ] +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/cpf/pipelines/sample-pipeline.json b/examples/dhf4-with-tests/src/main/ml-config/cpf/pipelines/sample-pipeline.json new file mode 100644 index 0000000000..9e0155f200 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/cpf/pipelines/sample-pipeline.json @@ -0,0 +1,28 @@ +{ + "pipeline-name": "Sample Pipeline", + "pipeline-description": "Sample CPF pipeline", + "success-action": { + "module": "/MarkLogic/cpf/actions/success-action.xqy" + }, + "failure-action": { + "module": "/MarkLogic/cpf/actions/failure-action.xqy" + }, + "state-transition": [ + { + "annotation": "Just tests a sample condition and action", + "state": "http://marklogic.com/states/initial", + "on-success": "http://marklogic.com/states/done", + "on-failure": "http://marklogic.com/states/error", + "execute": [ + { + "condition": { + "module": "ext/cpf-example/cpf/sample-condition.xqy" + }, + "action": { + "module": "ext/cpf-example/cpf/sample-action.xqy" + } + } + ] + } + ] +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/cpf/pipelines/status-change-handling.xml b/examples/dhf4-with-tests/src/main/ml-config/cpf/pipelines/status-change-handling.xml new file mode 100644 index 0000000000..a55e0340b2 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/cpf/pipelines/status-change-handling.xml @@ -0,0 +1,78 @@ + + Status Change Handling + Out-of-the-box document status handling. + + /MarkLogic/cpf/actions/success-action.xqy + + + /MarkLogic/cpf/actions/failure-action.xqy + + + + New document entering the system: kick it into the appropriate initial state. If is has an initial state, go to that + state. If it doesn't, go to the standard initial state and set the initial timestamp. + + created + http://marklogic.com/states/initial + 100 + + /MarkLogic/cpf/actions/set-updated-action.xqy + + + + /MarkLogic/cpf/actions/changed-type-condition.xqy + + + /MarkLogic/cpf/actions/success-action.xqy + + + + + /MarkLogic/cpf/actions/renamed-links-condition.xqy + + + /MarkLogic/cpf/actions/link-rename-action.xqy + + + + + /MarkLogic/cpf/actions/existing-state-condition.xqy + + + /MarkLogic/cpf/actions/touch-state-action.xqy + + + + + + Clean up dangling links and dependent documents from deleted documents. + + deleted + 100 + + /MarkLogic/cpf/actions/link-coherency-action.xqy + + + + + Update the document time stamp and shift to the updated state. + + updated + http://marklogic.com/states/updated + 100 + + /MarkLogic/cpf/actions/set-updated-action.xqy + + + + + Update the document time stamp and shift to the updated state. + + property-updated + http://marklogic.com/states/property-updated + 100 + + /MarkLogic/cpf/actions/set-property-updated-action.xqy + + + \ No newline at end of file diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-FINAL/temporal/axes/temporal-system-axis.json b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-FINAL/temporal/axes/temporal-system-axis.json new file mode 100644 index 0000000000..250eb5f23f --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-FINAL/temporal/axes/temporal-system-axis.json @@ -0,0 +1,15 @@ +{ + "axis-name": "final-system", + "axis-start": { + "element-reference": { + "namespace-uri": "", + "localname": "systemStart" + } + }, + "axis-end": { + "element-reference": { + "namespace-uri": "", + "localname": "systemEnd" + } + } +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-FINAL/temporal/axes/temporal-valid-axis.json b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-FINAL/temporal/axes/temporal-valid-axis.json new file mode 100644 index 0000000000..748e364a1b --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-FINAL/temporal/axes/temporal-valid-axis.json @@ -0,0 +1,15 @@ +{ + "axis-name": "final-valid", + "axis-start": { + "element-reference": { + "namespace-uri": "", + "localname": "validStart" + } + }, + "axis-end": { + "element-reference": { + "namespace-uri": "", + "localname": "validEnd" + } + } +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-FINAL/temporal/collections/temporal-collection.json b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-FINAL/temporal/collections/temporal-collection.json new file mode 100644 index 0000000000..9a5fd6de6d --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-FINAL/temporal/collections/temporal-collection.json @@ -0,0 +1,8 @@ +{ + "collection-name": "final-temporal-collection", + "system-axis": "final-system", + "valid-axis": "final-valid", + "option": [ + "updates-safe" + ] +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-STAGING/temporal/axes/temporal-system-axis.json b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-STAGING/temporal/axes/temporal-system-axis.json new file mode 100644 index 0000000000..0062159a34 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-STAGING/temporal/axes/temporal-system-axis.json @@ -0,0 +1,15 @@ +{ + "axis-name": "staging-system", + "axis-start": { + "element-reference": { + "namespace-uri": "", + "localname": "systemStart" + } + }, + "axis-end": { + "element-reference": { + "namespace-uri": "", + "localname": "systemEnd" + } + } +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-STAGING/temporal/axes/temporal-valid-axis.json b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-STAGING/temporal/axes/temporal-valid-axis.json new file mode 100644 index 0000000000..e9ae60faf5 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-STAGING/temporal/axes/temporal-valid-axis.json @@ -0,0 +1,15 @@ +{ + "axis-name": "staging-valid", + "axis-start": { + "element-reference": { + "namespace-uri": "", + "localname": "validStart" + } + }, + "axis-end": { + "element-reference": { + "namespace-uri": "", + "localname": "validEnd" + } + } +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-STAGING/temporal/collections/temporal-collection.json b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-STAGING/temporal/collections/temporal-collection.json new file mode 100644 index 0000000000..12ece6a7c4 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-STAGING/temporal/collections/temporal-collection.json @@ -0,0 +1,8 @@ +{ + "collection-name": "staging-temporal-collection", + "system-axis": "staging-system", + "valid-axis": "staging-valid", + "option": [ + "updates-safe" + ] +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-final-TRIGGERS/triggers/final-trigger.json b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-final-TRIGGERS/triggers/final-trigger.json new file mode 100644 index 0000000000..ab70017e9c --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-final-TRIGGERS/triggers/final-trigger.json @@ -0,0 +1,21 @@ +{ + "name": "final-trigger", + "description": "Example", + "event": { + "data-event": { + "collection-scope": { + "uri": "some-collection" + }, + "document-content": { + "update-kind": ["create"] + }, + "when": "pre-commit" + } + }, + "module": "/some/trigger.xqy", + "module-db": "%%mlModulesDbName%%", + "module-root": "/", + "enabled": true, + "recursive": false, + "task-priority": "normal" +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-staging-TRIGGERS/triggers/staging-trigger.json b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-staging-TRIGGERS/triggers/staging-trigger.json new file mode 100644 index 0000000000..2d9ca6b496 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/data-hub-staging-TRIGGERS/triggers/staging-trigger.json @@ -0,0 +1,21 @@ +{ + "name": "staging-trigger", + "description": "Example", + "event": { + "data-event": { + "collection-scope": { + "uri": "some-collection" + }, + "document-content": { + "update-kind": ["create"] + }, + "when": "pre-commit" + } + }, + "module": "/some/trigger.xqy", + "module-db": "%%mlModulesDbName%%", + "module-root": "/", + "enabled": true, + "recursive": false, + "task-priority": "normal" +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/final-database.json b/examples/dhf4-with-tests/src/main/ml-config/databases/final-database.json new file mode 100644 index 0000000000..45dc2477d4 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/final-database.json @@ -0,0 +1,26 @@ +{ + "database-name": "%%mlFinalDbName%%", + "range-element-index": [ + { + "collation": "http://marklogic.com/collation/codepoint", + "invalid-values": "reject", + "localname": "userConfigFinal1", + "namespace-uri": null, + "range-value-positions": false, + "scalar-type": "string" + }, + { + "collation": "http://marklogic.com/collation/codepoint", + "invalid-values": "reject", + "localname": "userConfigFinal2", + "namespace-uri": null, + "range-value-positions": false, + "scalar-type": "string" + } + ], + "schema-database": "%%mlFinalSchemasDbName%%", + "triggers-database": "%%mlFinalTriggersDbName%%", + "triple-index": true, + "collection-lexicon": true, + "uri-lexicon": true +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/final-schemas-database.json b/examples/dhf4-with-tests/src/main/ml-config/databases/final-schemas-database.json new file mode 100644 index 0000000000..7db14e3546 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/final-schemas-database.json @@ -0,0 +1,3 @@ +{ + "database-name": "%%mlFinalSchemasDbName%%" +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/final-triggers-database.json b/examples/dhf4-with-tests/src/main/ml-config/databases/final-triggers-database.json new file mode 100644 index 0000000000..e9cccf69e9 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/final-triggers-database.json @@ -0,0 +1,3 @@ +{ + "database-name": "%%mlFinalTriggersDbName%%" +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/modules-database.json b/examples/dhf4-with-tests/src/main/ml-config/databases/modules-database.json new file mode 100644 index 0000000000..f1c7230a02 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/modules-database.json @@ -0,0 +1,5 @@ +{ + "database-name": "%%mlModulesDbName%%", + "collection-lexicon": true, + "uri-lexicon": true +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/databases/staging-database.json b/examples/dhf4-with-tests/src/main/ml-config/databases/staging-database.json new file mode 100644 index 0000000000..cdc21cda3a --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/databases/staging-database.json @@ -0,0 +1,22 @@ +{ + "database-name": "%%mlStagingDbName%%", + "word-positions": true, + "range-element-index": [ + { + "collation": "http://marklogic.com/collation/codepoint", + "invalid-values": "reject", + "localname": "userConfigStaging1", + "namespace-uri": null, + "range-value-positions": false, + "scalar-type": "string" + }, + { + "collation": "http://marklogic.com/collation/codepoint", + "invalid-values": "reject", + "localname": "userConfigStaging2", + "namespace-uri": null, + "range-value-positions": false, + "scalar-type": "string" + } + ] +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/security/amps/echo.json b/examples/dhf4-with-tests/src/main/ml-config/security/amps/echo.json new file mode 100644 index 0000000000..d049ac525f --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/security/amps/echo.json @@ -0,0 +1,7 @@ +{ + "namespace": "org:example", + "local-name": "echo", + "document-uri": "/example/example-lib.xqy", + "modules-database": "%%MODULES_DATABASE%%", + "role": ["admin"] +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/security/privileges/example-privilege1.json b/examples/dhf4-with-tests/src/main/ml-config/security/privileges/example-privilege1.json new file mode 100644 index 0000000000..dd8dc15b5e --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/security/privileges/example-privilege1.json @@ -0,0 +1,5 @@ +{ + "privilege-name":"example-privilege1", + "action": "example-privilege1", + "kind":"execute" +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/security/roles/example-role1.xml b/examples/dhf4-with-tests/src/main/ml-config/security/roles/example-role1.xml new file mode 100644 index 0000000000..bf9dcf2ef7 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/security/roles/example-role1.xml @@ -0,0 +1,4 @@ + + example-role1 + Test role for example application + diff --git a/examples/dhf4-with-tests/src/main/ml-config/security/users/example-user1.json b/examples/dhf4-with-tests/src/main/ml-config/security/users/example-user1.json new file mode 100644 index 0000000000..c6bd623b7f --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/security/users/example-user1.json @@ -0,0 +1,4 @@ +{ + "user-name": "example-user1", + "password": "password" +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/servers/README.md b/examples/dhf4-with-tests/src/main/ml-config/servers/README.md new file mode 100644 index 0000000000..b585fd0a71 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/servers/README.md @@ -0,0 +1,4 @@ +The job-server.json and staging-server.json files show examples of overriding the +configuration defined by the same files under hub-internal-config. The names of these +files do not matter; they can be anything. They will be processed after the hub-internal-config files +are processed, thereby providing a chance to override anything in the hub-internal-config files. diff --git a/examples/dhf4-with-tests/src/main/ml-config/servers/final-server.json b/examples/dhf4-with-tests/src/main/ml-config/servers/final-server.json new file mode 100644 index 0000000000..2080945373 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/servers/final-server.json @@ -0,0 +1,14 @@ +{ + "server-name": "%%mlFinalAppserverName%%", + "server-type": "http", + "root": "/", + "group-name": "%%GROUP%%", + "port": "%%mlFinalPort%%", + "modules-database": "%%mlModulesDbName%%", + "content-database": "%%mlFinalDbName%%", + "authentication": "%%mlFinalAuth%%", + "default-error-format": "json", + "error-handler": "/MarkLogic/rest-api/error-handler.xqy", + "url-rewriter": "/MarkLogic/rest-api/rewriter.xml", + "rewrite-resolves-globally": true +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/servers/job-server.json b/examples/dhf4-with-tests/src/main/ml-config/servers/job-server.json new file mode 100644 index 0000000000..3574a03f66 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/servers/job-server.json @@ -0,0 +1,4 @@ +{ + "server-name": "%%mlJobAppserverName%%", + "default-error-format": "xml" +} diff --git a/examples/dhf4-with-tests/src/main/ml-config/servers/staging-server.json b/examples/dhf4-with-tests/src/main/ml-config/servers/staging-server.json new file mode 100644 index 0000000000..d854e086db --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-config/servers/staging-server.json @@ -0,0 +1,4 @@ +{ + "server-name": "%%mlStagingAppserverName%%", + "default-error-format": "xml" +} diff --git a/examples/dhf4-with-tests/src/main/ml-modules/root/example/example-lib.xqy b/examples/dhf4-with-tests/src/main/ml-modules/root/example/example-lib.xqy new file mode 100644 index 0000000000..4183448ca0 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-modules/root/example/example-lib.xqy @@ -0,0 +1,8 @@ +xquery version "1.0-ml"; + +module namespace example = "org:example"; + +declare function echo($str as xs:string) as xs:string +{ + "You said: " || $str +}; diff --git a/examples/dhf4-with-tests/src/main/ml-modules/services/example-service.sjs b/examples/dhf4-with-tests/src/main/ml-modules/services/example-service.sjs new file mode 100644 index 0000000000..95dc0545da --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-modules/services/example-service.sjs @@ -0,0 +1,20 @@ +function get(context, params) { + // return zero or more document nodes +}; + +function post(context, params, input) { + // return zero or more document nodes +}; + +function put(context, params, input) { + // return at most one document node +}; + +function deleteFunction(context, params) { + // return at most one document node +}; + +exports.GET = get; +exports.POST = post; +exports.PUT = put; +exports.DELETE = deleteFunction; diff --git a/examples/dhf4-with-tests/src/main/ml-modules/transforms/example-transform.xsl b/examples/dhf4-with-tests/src/main/ml-modules/transforms/example-transform.xsl new file mode 100644 index 0000000000..a1424783eb --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-modules/transforms/example-transform.xsl @@ -0,0 +1,7 @@ + + + + + + + diff --git a/examples/dhf4-with-tests/src/main/ml-schemas/db-final-schema.xsd b/examples/dhf4-with-tests/src/main/ml-schemas/db-final-schema.xsd new file mode 100644 index 0000000000..8c00d9fe15 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-schemas/db-final-schema.xsd @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/dhf4-with-tests/src/main/ml-schemas/tde/Person-0.0.1.tdex b/examples/dhf4-with-tests/src/main/ml-schemas/tde/Person-0.0.1.tdex new file mode 100644 index 0000000000..42d56141d5 --- /dev/null +++ b/examples/dhf4-with-tests/src/main/ml-schemas/tde/Person-0.0.1.tdex @@ -0,0 +1,31 @@ + + + +Extraction Template Generated from Entity Type Document +graph uri: http://example.com/Person-0.0.1 + + //*:instance[*:info/*:version = "0.0.1"] + + + + + RDF + "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + + + RDF_TYPE + sem:iri(concat($RDF, "type")) + + + + + es + http://marklogic.com/entity-services + + + + \ No newline at end of file diff --git a/examples/dhf4-with-tests/src/test/java/org/example/RunUnitTestsTest.java b/examples/dhf4-with-tests/src/test/java/org/example/RunUnitTestsTest.java new file mode 100644 index 0000000000..9abb885bde --- /dev/null +++ b/examples/dhf4-with-tests/src/test/java/org/example/RunUnitTestsTest.java @@ -0,0 +1,17 @@ +package org.example; + +import com.marklogic.junit5.dhf.DataHubUnitTestsTest; + +/** + * This class must exist on the test classpath so that JUnit5 is able to run something that knows how to + * execute marklogic-unit-test test modules and aggregate the results into a format that JUnit 5 understands and + * can include in its report. + * + * Note that this test won't pass when the app is only installed with QuickStart, as QuickStart is not aware of + * mlRestApi dependencies like marklogic-unit-test. If you install with QuickStart, you'll need to then run + * Gradle's mlReloadModules task to get marklogic-unit-test loaded. + */ +public class RunUnitTestsTest extends DataHubUnitTestsTest { + +} + diff --git a/examples/dhf4-with-tests/src/test/java/org/example/VerifyDeploymentTest.java b/examples/dhf4-with-tests/src/test/java/org/example/VerifyDeploymentTest.java new file mode 100644 index 0000000000..11cd4dbb86 --- /dev/null +++ b/examples/dhf4-with-tests/src/test/java/org/example/VerifyDeploymentTest.java @@ -0,0 +1,301 @@ +package org.example; + +import com.marklogic.client.DatabaseClient; +import com.marklogic.client.DatabaseClientFactory; +import com.marklogic.client.io.DocumentMetadataHandle; +import com.marklogic.client.io.StringHandle; +import com.marklogic.junit5.XmlNode; +import com.marklogic.junit5.dhf.AbstractDataHubTest; +import com.marklogic.junit5.dhf.DataHubTestConfig; +import com.marklogic.mgmt.ManageClient; +import com.marklogic.mgmt.ManageConfig; +import com.marklogic.mgmt.api.API; +import com.marklogic.mgmt.api.database.Database; +import com.marklogic.mgmt.api.server.Server; +import com.marklogic.mgmt.mapper.DefaultResourceMapper; +import com.marklogic.mgmt.mapper.ResourceMapper; +import com.marklogic.mgmt.resource.appservers.ServerManager; +import com.marklogic.mgmt.resource.cpf.DomainManager; +import com.marklogic.mgmt.resource.cpf.PipelineManager; +import com.marklogic.mgmt.resource.databases.DatabaseManager; +import com.marklogic.mgmt.resource.security.AmpManager; +import com.marklogic.mgmt.resource.security.PrivilegeManager; +import com.marklogic.mgmt.resource.security.RoleManager; +import com.marklogic.mgmt.resource.security.UserManager; +import com.marklogic.mgmt.resource.temporal.TemporalAxesManager; +import com.marklogic.mgmt.resource.temporal.TemporalCollectionManager; +import com.marklogic.mgmt.resource.triggers.TriggerManager; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * Run this test after deploying the app to verify that all aspects of the deployment completed successfully. + */ +public class VerifyDeploymentTest extends AbstractDataHubTest { + + @Autowired + DataHubTestConfig dataHubTestConfig; + + private ManageClient manageClient; + private DatabaseClient databaseClient; + private ResourceMapper resourceMapper; + + @BeforeEach + public void setup() { + ManageConfig config = new ManageConfig(dataHubTestConfig.getHost(), 8002, dataHubTestConfig.getUsername(), + dataHubTestConfig.getPassword()); + manageClient = new ManageClient(config); + + resourceMapper = new DefaultResourceMapper(new API(manageClient)); + } + + @AfterEach + public void teardown() { + if (databaseClient != null) { + databaseClient.release(); + } + } + + @Test + public void verifyDatabasesWereDeployed() { + DatabaseManager mgr = new DatabaseManager(manageClient); + assertTrue(mgr.exists("data-hub-FINAL")); + assertTrue(mgr.exists("data-hub-final-SCHEMAS")); + assertTrue(mgr.exists("data-hub-final-TRIGGERS")); + assertTrue(mgr.exists("data-hub-JOBS")); + assertTrue(mgr.exists("data-hub-MODULES")); + assertTrue(mgr.exists("data-hub-STAGING")); + assertTrue(mgr.exists("data-hub-staging-SCHEMAS")); + assertTrue(mgr.exists("data-hub-staging-TRIGGERS")); + } + + @Test + public void verifyStagingDatabaseIsOverridden() { + String json = new DatabaseManager(manageClient).getPropertiesAsJson("data-hub-STAGING"); + Database db = resourceMapper.readResource(json, Database.class); + assertEquals(4, db.getRangeElementIndex().size(), + "There should be 4 range indexes - 2 from the entity-config file, and 2 from the user's ml-config file."); + + assertEquals("entityConfigStaging1", db.getRangeElementIndex().get(0).getLocalname()); + assertEquals("entityConfigStaging2", db.getRangeElementIndex().get(1).getLocalname()); + assertEquals("userConfigStaging1", db.getRangeElementIndex().get(2).getLocalname()); + assertEquals("userConfigStaging2", db.getRangeElementIndex().get(3).getLocalname()); + + assertTrue(db.getWordPositions(), "The user's staging-database file overrides this an sets it to true"); + } + + /** + * Deploying from QS currently has a bug where the existing final-database.json file is overwritten. So this test + * fails because only 2 range indexes are found instead of 4. + */ + @Test + public void verifyFinalDatabaseIsOverridden() { + String json = new DatabaseManager(manageClient).getPropertiesAsJson("data-hub-FINAL"); + Database db = resourceMapper.readResource(json, Database.class); + assertEquals(4, db.getRangeElementIndex().size(), + "There should be 4 range indexes - 2 from the entity-config file, and 2 from the user's ml-config file."); + + assertEquals("entityConfigFinal1", db.getRangeElementIndex().get(0).getLocalname()); + assertEquals("entityConfigFinal2", db.getRangeElementIndex().get(1).getLocalname()); + assertEquals("userConfigFinal1", db.getRangeElementIndex().get(2).getLocalname()); + assertEquals("userConfigFinal2", db.getRangeElementIndex().get(3).getLocalname()); + } + + /** + * As of 4.1.0, CPF resources under ml-config/cpf are deployed to the final database by default. + */ + @Test + public void verifyCpfResourcesWereDeployedToFinalDatabase() { + DomainManager domainManager = new DomainManager(manageClient, "data-hub-final-TRIGGERS"); + assertTrue(domainManager.exists("sample-domain")); + + PipelineManager pipelineManager = new PipelineManager(manageClient, "data-hub-final-TRIGGERS"); + assertTrue(pipelineManager.exists("Sample Pipeline")); + assertTrue(pipelineManager.exists("Status Change Handling")); + } + + @Test + public void verifySecurityResourcesWereDeployed() { + UserManager userManager = new UserManager(manageClient); + assertTrue(userManager.exists("data-hub-user")); + assertTrue(userManager.exists("example-user1")); + assertTrue(userManager.exists("example-user2"), + "This verifies that all locations in mlConfigPaths are being processed, as this user is defined in src/test/ml-config"); + + RoleManager roleManager = new RoleManager(manageClient); + assertTrue(roleManager.exists("data-hub-role")); + assertTrue(roleManager.exists("hub-admin-role")); + assertTrue(roleManager.exists("example-role1")); + + PrivilegeManager privilegeManager = new PrivilegeManager(manageClient); + assertTrue(privilegeManager.exists("dhf-internal-data-hub")); + assertTrue(privilegeManager.exists("dhf-internal-entities")); + assertTrue(privilegeManager.exists("dhf-internal-mappings")); + assertTrue(privilegeManager.exists("dhf-internal-trace-ui")); + assertTrue(privilegeManager.exists("example-privilege1")); + + AmpManager ampManager = new AmpManager(manageClient); + final String payload = "{" + + " \"namespace\": \"org:example\"," + + " \"local-name\": \"echo\"," + + " \"document-uri\": \"/example/example-lib.xqy\"," + + " \"modules-database\": \"data-hub-MODULES\"," + + " \"role\": [\"admin\"]" + + "}"; + assertTrue(ampManager.ampExists(payload)); + } + + @Test + public void verifyServersWereDeployed() { + ServerManager mgr = new ServerManager(manageClient); + assertTrue(mgr.exists("data-hub-FINAL")); + assertTrue(mgr.exists("data-hub-JOBS")); + assertTrue(mgr.exists("data-hub-STAGING")); + } + + @Test + public void verifyStagingServerIsOverridden() { + String json = new ServerManager(manageClient).getPropertiesAsJson("data-hub-STAGING"); + Server server = resourceMapper.readResource(json, Server.class); + assertEquals("xml", server.getDefaultErrorFormat(), + "The hub-internal-config file defaults this to json, but the ml-config file overrides it to be xml"); + } + + @Test + public void verifyJobServerIsOverridden() { + String json = new ServerManager(manageClient).getPropertiesAsJson("data-hub-JOBS"); + Server server = resourceMapper.readResource(json, Server.class); + assertEquals("xml", server.getDefaultErrorFormat(), + "The hub-internal-config file defaults this to json, but the ml-config file overrides it to be xml"); + } + + @Test + public void verifyModulesDatabase() { + databaseClient = newClient("data-hub-MODULES"); + + boolean wasInstalledViaQuickStart = wasInstalledViaQuickStart(databaseClient); + + assertEquals(107, getModuleCountInDirectory("/data-hub/4/"), "DHF 4.1.0 has 107 modules in this directory"); + + + if (wasInstalledViaQuickStart) { + assertEquals(3, getModuleCountInDirectory("/com.marklogic.hub/"), "DHF 4.1.0 has 3 modules in this directory when installed via QS"); + } else { + assertEquals(2, getModuleCountInDirectory("/com.marklogic.hub/"), "DHF 4.1.0 has 2 modules in this directory"); + } + + assertEquals(5, getModuleCountInDirectory("/entities/"), "The Person entity has an input flow with 5 modules"); + + assertEquals(24, getModuleCountInDirectory("/trace-ui/"), "DHF 4.1.0 has 24 modules in this directory"); + + if (wasInstalledViaQuickStart) { + // This is failing with QS, need to figure out why it doesn't read from a second module path (logging indicates that it does) + assertEquals(1, getModuleCountInDirectory("/test/"), "QS doesn't know about mlRestApi dependencies; those are specific to Gradle; " + + "but the 1 module under src/test/ml-modules should still be loaded"); + } else { + assertEquals(24, getModuleCountInDirectory("/test/"), + "marklogic-unit-test 0.12.0 has 23 modules in this directory. These modules are loaded via an ml-gradle mlRestApi dependency. " + + "The user then has a single module in this directory that's defined under src/test/ml-modules."); + + assertEquals(2, getModuleCountInDirectory("/marklogic.rest.resource/marklogic-unit-test/"), + "The marklogic-unit-test resource extension should be installed via a Gradle deployment, but not via QS"); + } + + assertEquals(1, getModuleCountInDirectory("/example/"), "The src/main/ml-modules directory has one module in this directory"); + assertEquals(3, getModuleCountInDirectory("/marklogic.rest.resource/example-service/")); + assertEquals(3, getModuleCountInDirectory("/marklogic.rest.transform/example-transform/")); + + + assertEquals(6, getModuleCountInDirectory("/Default/"), "6 search options are expected in this directory; " + + "final/default.xml; final/final-entity-options.xml; jobs/jobs.xml; jobs/traces.xml; " + + "staging/default.xml; and staging/staging-entity-options.xml"); + + if (wasInstalledViaQuickStart) { + assertEquals(153, getModuleCountInDirectory("/")); + } else { + assertEquals(177, getModuleCountInDirectory("/")); + } + } + + /** + * Staging schemas are loaded from src/main/hub-internal-config/schemas. + */ + @Test + public void verifyStagingSchemas() { + databaseClient = newClient("data-hub-staging-SCHEMAS"); + + final String schemaUri = "/staging-schema.xsd"; + new XmlNode(databaseClient.newXMLDocumentManager().read(schemaUri, new StringHandle()).get()).assertElementExists("/staging"); + + final String tdeUri = "/tde/StagingPerson-0.0.1.tdex"; + DocumentMetadataHandle metadata = databaseClient.newDocumentManager().readMetadata(tdeUri, new DocumentMetadataHandle()); + assertEquals("http://marklogic.com/xdmp/tde", metadata.getCollections().iterator().next()); + } + + /** + * Final schemas are loaded from src/main/ml-schemas. + */ + @Test + public void verifyFinalSchemas() { + databaseClient = newClient("data-hub-final-SCHEMAS"); + + final String schemaUri = "/db-final-schema.xsd"; + new XmlNode(databaseClient.newXMLDocumentManager().read(schemaUri, new StringHandle()).get()).assertElementExists("/database-final-schema"); + + final String tdeUri = "/tde/Person-0.0.1.tdex"; + DocumentMetadataHandle metadata = databaseClient.newDocumentManager().readMetadata(tdeUri, new DocumentMetadataHandle()); + assertEquals("http://marklogic.com/xdmp/tde", metadata.getCollections().iterator().next()); + } + + @Test + public void verifyTriggers() { + TriggerManager mgr = new TriggerManager(manageClient, "data-hub-final-TRIGGERS"); + assertTrue(mgr.exists("final-trigger")); + assertFalse(mgr.exists("staging-trigger")); + + mgr = new TriggerManager(manageClient, "data-hub-staging-TRIGGERS"); + assertFalse(mgr.exists("final-trigger")); + assertTrue(mgr.exists("staging-trigger")); + } + + @Test + public void verifyFinalTemporal() { + final String db = "data-hub-FINAL"; + + assertTrue(new TemporalCollectionManager(manageClient, db).exists("final-temporal-collection")); + + TemporalAxesManager axesManager = new TemporalAxesManager(manageClient, db); + assertTrue(axesManager.exists("final-system")); + assertTrue(axesManager.exists("final-valid")); + } + + @Test + public void verifyStagingTemporal() { + final String db = "data-hub-STAGING"; + + assertTrue(new TemporalCollectionManager(manageClient, db).exists("staging-temporal-collection")); + + TemporalAxesManager axesManager = new TemporalAxesManager(manageClient, db); + assertTrue(axesManager.exists("staging-system")); + assertTrue(axesManager.exists("staging-valid")); + } + + private int getModuleCountInDirectory(String directory) { + String query = String.format("cts.estimate(cts.directoryQuery('%s', 'infinity'))", directory); + return Integer.parseInt(databaseClient.newServerEval().javascript(query).evalAs(String.class)); + } + + private DatabaseClient newClient(String database) { + return DatabaseClientFactory.newClient(dataHubTestConfig.getHost(), dataHubTestConfig.getStagingPort(), database, + new DatabaseClientFactory.DigestAuthContext(dataHubTestConfig.getUsername(), dataHubTestConfig.getPassword())); + } + + private boolean wasInstalledViaQuickStart(DatabaseClient client) { + String query = "cts.exists(cts.documentQuery('/com.marklogic.hub/settings/__tracing_enabled__.xml'))"; + return Boolean.parseBoolean(client.newServerEval().javascript(query).evalAs(String.class)); + } +} diff --git a/examples/dhf4-with-tests/src/test/ml-config/security/users/example-user2.json b/examples/dhf4-with-tests/src/test/ml-config/security/users/example-user2.json new file mode 100644 index 0000000000..f501437af5 --- /dev/null +++ b/examples/dhf4-with-tests/src/test/ml-config/security/users/example-user2.json @@ -0,0 +1,4 @@ +{ + "user-name": "example-user2", + "password": "password" +} diff --git a/examples/dhf4-with-tests/src/test/ml-modules/root/test/suites/input1-tests/content-test.sjs b/examples/dhf4-with-tests/src/test/ml-modules/root/test/suites/input1-tests/content-test.sjs new file mode 100644 index 0000000000..69ec850974 --- /dev/null +++ b/examples/dhf4-with-tests/src/test/ml-modules/root/test/suites/input1-tests/content-test.sjs @@ -0,0 +1,17 @@ +const contentLib = require('/entities/Person/input/input1/content.sjs'); +const test = require('/test/test-helper.xqy'); + +let assertions = []; + +const rawInput = { + "hello": "world" +}; + +const content = contentLib.createContent("id123", rawInput); + +assertions.push( + test.assertEqual("Person", content["$type"]), + test.assertEqual("0.0.1", content["$version"]) +); + +assertions diff --git a/examples/dhf4-with-tests/src/test/resources/logback.xml b/examples/dhf4-with-tests/src/test/resources/logback.xml new file mode 100644 index 0000000000..28ccbf75fb --- /dev/null +++ b/examples/dhf4-with-tests/src/test/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/gradle-tasks-demo/docs/gradle.properties b/examples/gradle-tasks-demo/docs/gradle.properties index 800fed4f0a..ff58056c78 100644 --- a/examples/gradle-tasks-demo/docs/gradle.properties +++ b/examples/gradle-tasks-demo/docs/gradle.properties @@ -1,5 +1,5 @@ # -# Copyright 2012-2018 MarkLogic Corporation +# Copyright 2012-2019 MarkLogic Corporation # #  Licensed under the Apache License, Version 2.0 (the "License"); #  you may not use this file except in compliance with the License. diff --git a/examples/online-store/entity-config/databases/final-database.json b/examples/online-store/entity-config/databases/final-database.json new file mode 100644 index 0000000000..10849361e5 --- /dev/null +++ b/examples/online-store/entity-config/databases/final-database.json @@ -0,0 +1 @@ +{"path-namespace":[{"prefix":"es", "namespace-uri":"http://marklogic.com/entity-services"}], "range-element-index":[{"collation":"http://marklogic.com/collation/codepoint", "invalid-values":"reject", "localname":"sku", "namespace-uri":null, "range-value-positions":false, "scalar-type":"string"}]} \ No newline at end of file diff --git a/examples/online-store/entity-config/databases/staging-database.json b/examples/online-store/entity-config/databases/staging-database.json new file mode 100644 index 0000000000..10849361e5 --- /dev/null +++ b/examples/online-store/entity-config/databases/staging-database.json @@ -0,0 +1 @@ +{"path-namespace":[{"prefix":"es", "namespace-uri":"http://marklogic.com/entity-services"}], "range-element-index":[{"collation":"http://marklogic.com/collation/codepoint", "invalid-values":"reject", "localname":"sku", "namespace-uri":null, "range-value-positions":false, "scalar-type":"string"}]} \ No newline at end of file diff --git a/examples/online-store/entity-config/final-entity-options.xml b/examples/online-store/entity-config/final-entity-options.xml new file mode 100644 index 0000000000..cb861f22c5 --- /dev/null +++ b/examples/online-store/entity-config/final-entity-options.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + //*:instance/Order/id + + + + + + + + + + + unfiltered + + + //*:instance/(Product|Order) + + + + true + + + \ No newline at end of file diff --git a/examples/online-store/entity-config/staging-entity-options.xml b/examples/online-store/entity-config/staging-entity-options.xml new file mode 100644 index 0000000000..cb861f22c5 --- /dev/null +++ b/examples/online-store/entity-config/staging-entity-options.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + //*:instance/Order/id + + + + + + + + + + + unfiltered + + + //*:instance/(Product|Order) + + + + true + + + \ No newline at end of file diff --git a/examples/online-store/gradle/wrapper/gradle-wrapper.jar b/examples/online-store/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..29953ea141 Binary files /dev/null and b/examples/online-store/gradle/wrapper/gradle-wrapper.jar differ diff --git a/examples/online-store/gradlew b/examples/online-store/gradlew new file mode 100644 index 0000000000..4453ccea33 --- /dev/null +++ b/examples/online-store/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/examples/online-store/gradlew.bat b/examples/online-store/gradlew.bat new file mode 100644 index 0000000000..f9553162f1 --- /dev/null +++ b/examples/online-store/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/examples/online-store/plugins/entities/Product/harmonize/123/123.properties b/examples/online-store/plugins/entities/Product/harmonize/123/123.properties new file mode 100644 index 0000000000..a48af9149e --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/123/123.properties @@ -0,0 +1,8 @@ +# +#Thu Jan 03 14:14:30 MST 2019 +collectorModule=collector.xqy +dataFormat=xml +codeFormat=xqy +mainCodeFormat=xqy +mainModule=main.xqy +collectorCodeFormat=xqy diff --git a/examples/online-store/plugins/entities/Product/harmonize/123/collector.xqy b/examples/online-store/plugins/entities/Product/harmonize/123/collector.xqy new file mode 100644 index 0000000000..cacecd88fa --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/123/collector.xqy @@ -0,0 +1,20 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare option xdmp:mapping "false"; + +(:~ + : Collect IDs plugin + : + : @param $options - a map containing options. Options are sent from Java + : + : @return - a sequence of ids or uris + :) +declare function plugin:collect( + $options as map:map) as xs:string* +{ + (: by default we return the URIs in the same collection as the Entity name :) + cts:uris((), (), cts:collection-query('entity')) +}; + diff --git a/examples/online-store/plugins/entities/Product/harmonize/123/content.xqy b/examples/online-store/plugins/entities/Product/harmonize/123/content.xqy new file mode 100644 index 0000000000..cf6a81cb7e --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/123/content.xqy @@ -0,0 +1,29 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare namespace es = "http://marklogic.com/entity-services"; + +declare option xdmp:mapping "false"; + +(:~ + : Create Content Plugin + : + : @param $id - the identifier returned by the collector + : @param $options - a map containing options. Options are sent from Java + : + : @return - your transformed content + :) +declare function plugin:create-content( + $id as xs:string, + $options as map:map) as item()? +{ + let $doc := fn:doc($id) + return + if ($doc/es:envelope) then + $doc/es:envelope/es:instance/node() + else if ($doc/envelope/instance) then + $doc/envelope/instance + else + $doc +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/123/headers.xqy b/examples/online-store/plugins/entities/Product/harmonize/123/headers.xqy new file mode 100644 index 0000000000..d8ee319d1c --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/123/headers.xqy @@ -0,0 +1,24 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare namespace es = "http://marklogic.com/entity-services"; + +declare option xdmp:mapping "false"; + +(:~ + : Create Headers Plugin + : + : @param $id - the identifier returned by the collector + : @param $content - the output of your content plugin + : @param $options - a map containing options. Options are sent from Java + : + : @return - zero or more header nodes + :) +declare function plugin:create-headers( + $id as xs:string, + $content as item()?, + $options as map:map) as node()* +{ + () +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/123/main.xqy b/examples/online-store/plugins/entities/Product/harmonize/123/main.xqy new file mode 100644 index 0000000000..981eeeb456 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/123/main.xqy @@ -0,0 +1,55 @@ +xquery version "1.0-ml"; + +(: Your plugin must be in this namespace for the DHF to recognize it:) +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +(: + : This module exposes helper functions to make your life easier + : See documentation at: + : https://github.com/marklogic/marklogic-data-hub/wiki/dhf-lib + :) +import module namespace dhf = "http://marklogic.com/dhf" + at "/com.marklogic.hub/dhf.xqy"; + +(: include modules to construct various parts of the envelope :) +import module namespace content = "http://marklogic.com/data-hub/plugins" at "content.xqy"; +import module namespace headers = "http://marklogic.com/data-hub/plugins" at "headers.xqy"; +import module namespace triples = "http://marklogic.com/data-hub/plugins" at "triples.xqy"; + +(: include the writer module which persists your envelope into MarkLogic :) +import module namespace writer = "http://marklogic.com/data-hub/plugins" at "writer.xqy"; + +declare option xdmp:mapping "false"; + +(:~ + : Plugin Entry point + : + : @param $id - the identifier returned by the collector + : @param $options - a map containing options. Options are sent from Java + : + :) +declare function plugin:main( + $id as xs:string, + $options as map:map) +{ + let $content-context := dhf:content-context() + let $content := dhf:run($content-context, function() { + content:create-content($id, $options) + }) + + let $header-context := dhf:headers-context($content) + let $headers := dhf:run($header-context, function() { + headers:create-headers($id, $content, $options) + }) + + let $triple-context := dhf:triples-context($content, $headers) + let $triples := dhf:run($triple-context, function() { + triples:create-triples($id, $content, $headers, $options) + }) + + let $envelope := dhf:make-envelope($content, $headers, $triples, map:get($options, "dataFormat")) + return + (: writers must be invoked this way. + see: https://github.com/marklogic/marklogic-data-hub/wiki/dhf-lib#run-writer :) + dhf:run-writer(xdmp:function(xs:QName("writer:write")), $id, $envelope, $options) +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/123/triples.xqy b/examples/online-store/plugins/entities/Product/harmonize/123/triples.xqy new file mode 100644 index 0000000000..e2d7e1bdd0 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/123/triples.xqy @@ -0,0 +1,26 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare namespace es = "http://marklogic.com/entity-services"; + +declare option xdmp:mapping "false"; + +(:~ + : Create Triples Plugin + : + : @param $id - the identifier returned by the collector + : @param $content - the output of your content plugin + : @param $headers - the output of your headers plugin + : @param $options - a map containing options. Options are sent from Java + : + : @return - zero or more triples + :) +declare function plugin:create-triples( + $id as xs:string, + $content as item()?, + $headers as item()*, + $options as map:map) as sem:triple* +{ + () +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/123/writer.xqy b/examples/online-store/plugins/entities/Product/harmonize/123/writer.xqy new file mode 100644 index 0000000000..c817114a1a --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/123/writer.xqy @@ -0,0 +1,22 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare option xdmp:mapping "false"; + +(:~ + : Writer Plugin + : + : @param $id - the identifier returned by the collector + : @param $envelope - the final envelope + : @param $options - a map containing options. Options are sent from Java + : + : @return - nothing + :) +declare function plugin:write( + $id as xs:string, + $envelope as item(), + $options as map:map) as empty-sequence() +{ + xdmp:document-insert($id, $envelope, xdmp:default-permissions(), 'entity') +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/Test/Test.properties b/examples/online-store/plugins/entities/Product/harmonize/Test/Test.properties new file mode 100644 index 0000000000..259defc3bf --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/Test/Test.properties @@ -0,0 +1,9 @@ +# +#Fri Jan 18 09:03:33 MST 2019 +mainModule=main.sjs +collectorCodeFormat=sjs +mapping=Test-2 +mainCodeFormat=sjs +codeFormat=sjs +collectorModule=collector.sjs +dataFormat=json diff --git a/examples/online-store/plugins/entities/Product/harmonize/Test/collector.sjs b/examples/online-store/plugins/entities/Product/harmonize/Test/collector.sjs new file mode 100644 index 0000000000..c48fdc8102 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/Test/collector.sjs @@ -0,0 +1,15 @@ +/* + * Collect IDs plugin + * + * @param options - a map containing options. Options are sent from Java + * + * @return - an array of ids or uris + */ +function collect(options) { + // by default we return the URIs in the same collection as the Entity name + return cts.uris(null, null, cts.collectionQuery(options.entity)); +} + +module.exports = { + collect: collect +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/Test/content.sjs b/examples/online-store/plugins/entities/Product/harmonize/Test/content.sjs new file mode 100644 index 0000000000..965b57a9e3 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/Test/content.sjs @@ -0,0 +1,81 @@ +'use strict' + +/* +* Create Content Plugin +* +* @param id - the identifier returned by the collector +* @param options - an object containing options. Options are sent from Java +* +* @return - your content +*/ +function createContent(id, options) { + let doc = cts.doc(id); + + let source; + + // for xml we need to use xpath + if(doc && xdmp.nodeKind(doc) === 'element' && doc instanceof XMLDocument) { + source = doc + } + // for json we need to return the instance + else if(doc && doc instanceof Document) { + source = fn.head(doc.root); + } + // for everything else + else { + source = doc; + } + + return extractInstanceProduct(source); +} + +/** +* Creates an object instance from some source document. +* @param source A document or node that contains +* data for populating a Product +* @return An object with extracted data and +* metadata about the instance. +*/ +function extractInstanceProduct(source) { + // the original source documents + let attachments = source; + // now check to see if we have XML or json, then create a node clone from the root of the instance + if (source instanceof Element || source instanceof ObjectNode) { + let instancePath = '/*:envelope/*:instance'; + if(source instanceof Element) { + //make sure we grab content root only + instancePath += '/node()[not(. instance of processing-instruction() or . instance of comment())]'; + } + source = new NodeBuilder().addNode(fn.head(source.xpath(instancePath))).toNode(); + } + else{ + source = new NodeBuilder().addNode(fn.head(source)).toNode(); + } + /* These mappings were generated using mapping: Test, version: 2 on 2019-01-18T16:03:33.128249Z.*/ + let sku = !fn.empty(fn.head(source.xpath('//SKU'))) ? xs.string(fn.head(fn.head(source.xpath('//SKU')))) : null; + let title = !fn.empty(fn.head(source.xpath('//title'))) ? xs.string(fn.head(fn.head(source.xpath('//title')))) : null; + let price = !fn.empty(fn.head(source.xpath('//price'))) ? xs.decimal(fn.head(fn.head(source.xpath('//price')))) : null; + + // return the instance object + return { + '$attachments': attachments, + '$type': 'Product', + '$version': '0.0.1', + 'sku': sku, + 'title': title, + 'price': price + } +}; + + +function makeReferenceObject(type, ref) { + return { + '$type': type, + '$ref': ref + }; +} + +module.exports = { + createContent: createContent +}; + diff --git a/examples/online-store/plugins/entities/Product/harmonize/Test/headers.sjs b/examples/online-store/plugins/entities/Product/harmonize/Test/headers.sjs new file mode 100644 index 0000000000..efb96d569d --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/Test/headers.sjs @@ -0,0 +1,16 @@ +/* + * Create Headers Plugin + * + * @param id - the identifier returned by the collector + * @param content - the output of your content plugin + * @param options - an object containing options. Options are sent from Java + * + * @return - an object of headers + */ +function createHeaders(id, content, options) { + return {}; +} + +module.exports = { + createHeaders: createHeaders +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/Test/main.sjs b/examples/online-store/plugins/entities/Product/harmonize/Test/main.sjs new file mode 100644 index 0000000000..adf3ab8fb3 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/Test/main.sjs @@ -0,0 +1,43 @@ +// dhf.sjs exposes helper functions to make your life easier +// See documentation at: +// https://marklogic.github.io/marklogic-data-hub/docs/server-side/ +const dhf = require('/data-hub/4/dhf.sjs'); + +const contentPlugin = require('./content.sjs'); +const headersPlugin = require('./headers.sjs'); +const triplesPlugin = require('./triples.sjs'); +const writerPlugin = require('./writer.sjs'); + +/* + * Plugin Entry point + * + * @param id - the identifier returned by the collector + * @param options - a map containing options. Options are sent from Java + * + */ +function main(id, options) { + var contentContext = dhf.contentContext(); + var content = dhf.run(contentContext, function() { + return contentPlugin.createContent(id, options); + }); + + var headerContext = dhf.headersContext(content); + var headers = dhf.run(headerContext, function() { + return headersPlugin.createHeaders(id, content, options); + }); + + var tripleContext = dhf.triplesContext(content, headers); + var triples = dhf.run(tripleContext, function() { + return triplesPlugin.createTriples(id, content, headers, options); + }); + + var envelope = dhf.makeEnvelope(content, headers, triples, options.dataFormat); + + // writers must be invoked this way. + // see: https://github.com/marklogic/marklogic-data-hub/wiki/dhf-lib#run-writer + dhf.runWriter(writerPlugin, id, envelope, options); +} + +module.exports = { + main: main +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/Test/triples.sjs b/examples/online-store/plugins/entities/Product/harmonize/Test/triples.sjs new file mode 100644 index 0000000000..2bc6de7af0 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/Test/triples.sjs @@ -0,0 +1,18 @@ +/* + * Create Triples Plugin + * + * @param id - the identifier returned by the collector + * @param content - the output of your content plugin + * @param headers - the output of your heaaders plugin + * @param options - an object containing options. Options are sent from Java + * + * @return - an array of triples + */ +function createTriples(id, content, headers, options) { + return []; +} + +module.exports = { + createTriples: createTriples +}; + diff --git a/examples/online-store/plugins/entities/Product/harmonize/Test/writer.sjs b/examples/online-store/plugins/entities/Product/harmonize/Test/writer.sjs new file mode 100644 index 0000000000..a957b56137 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/Test/writer.sjs @@ -0,0 +1,14 @@ +/*~ + * Writer Plugin + * + * @param id - the identifier returned by the collector + * @param envelope - the final envelope + * @param options - an object options. Options are sent from Java + * + * @return - nothing + */ +function write(id, envelope, options) { + xdmp.documentInsert(id, envelope, xdmp.defaultPermissions(), options.entity); +} + +module.exports = write; diff --git a/examples/online-store/plugins/entities/Product/harmonize/abc/abc.properties b/examples/online-store/plugins/entities/Product/harmonize/abc/abc.properties new file mode 100644 index 0000000000..101a55863d --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/abc/abc.properties @@ -0,0 +1,8 @@ +# +#Thu Jan 03 14:20:06 MST 2019 +collectorModule=collector.xqy +dataFormat=xml +codeFormat=xqy +mainCodeFormat=xqy +mainModule=main.xqy +collectorCodeFormat=xqy diff --git a/examples/online-store/plugins/entities/Product/harmonize/abc/collector.xqy b/examples/online-store/plugins/entities/Product/harmonize/abc/collector.xqy new file mode 100644 index 0000000000..999fd43c74 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/abc/collector.xqy @@ -0,0 +1,20 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare option xdmp:mapping "false"; + +(:~ + : Collect IDs plugin + : + : @param $options - a map containing options. Options are sent from Java + : + : @return - a sequence of ids or uris + :) +declare function plugin:collect( + $options as map:map) as xs:string* +{ + (: by default we return the URIs in the same collection as the Entity name :) + cts:uris((), (), cts:collection-query(map:get($options, "entity"))) +}; + diff --git a/examples/online-store/plugins/entities/Product/harmonize/abc/content.xqy b/examples/online-store/plugins/entities/Product/harmonize/abc/content.xqy new file mode 100644 index 0000000000..cf6a81cb7e --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/abc/content.xqy @@ -0,0 +1,29 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare namespace es = "http://marklogic.com/entity-services"; + +declare option xdmp:mapping "false"; + +(:~ + : Create Content Plugin + : + : @param $id - the identifier returned by the collector + : @param $options - a map containing options. Options are sent from Java + : + : @return - your transformed content + :) +declare function plugin:create-content( + $id as xs:string, + $options as map:map) as item()? +{ + let $doc := fn:doc($id) + return + if ($doc/es:envelope) then + $doc/es:envelope/es:instance/node() + else if ($doc/envelope/instance) then + $doc/envelope/instance + else + $doc +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/abc/headers.xqy b/examples/online-store/plugins/entities/Product/harmonize/abc/headers.xqy new file mode 100644 index 0000000000..d8ee319d1c --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/abc/headers.xqy @@ -0,0 +1,24 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare namespace es = "http://marklogic.com/entity-services"; + +declare option xdmp:mapping "false"; + +(:~ + : Create Headers Plugin + : + : @param $id - the identifier returned by the collector + : @param $content - the output of your content plugin + : @param $options - a map containing options. Options are sent from Java + : + : @return - zero or more header nodes + :) +declare function plugin:create-headers( + $id as xs:string, + $content as item()?, + $options as map:map) as node()* +{ + () +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/abc/main.xqy b/examples/online-store/plugins/entities/Product/harmonize/abc/main.xqy new file mode 100644 index 0000000000..981eeeb456 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/abc/main.xqy @@ -0,0 +1,55 @@ +xquery version "1.0-ml"; + +(: Your plugin must be in this namespace for the DHF to recognize it:) +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +(: + : This module exposes helper functions to make your life easier + : See documentation at: + : https://github.com/marklogic/marklogic-data-hub/wiki/dhf-lib + :) +import module namespace dhf = "http://marklogic.com/dhf" + at "/com.marklogic.hub/dhf.xqy"; + +(: include modules to construct various parts of the envelope :) +import module namespace content = "http://marklogic.com/data-hub/plugins" at "content.xqy"; +import module namespace headers = "http://marklogic.com/data-hub/plugins" at "headers.xqy"; +import module namespace triples = "http://marklogic.com/data-hub/plugins" at "triples.xqy"; + +(: include the writer module which persists your envelope into MarkLogic :) +import module namespace writer = "http://marklogic.com/data-hub/plugins" at "writer.xqy"; + +declare option xdmp:mapping "false"; + +(:~ + : Plugin Entry point + : + : @param $id - the identifier returned by the collector + : @param $options - a map containing options. Options are sent from Java + : + :) +declare function plugin:main( + $id as xs:string, + $options as map:map) +{ + let $content-context := dhf:content-context() + let $content := dhf:run($content-context, function() { + content:create-content($id, $options) + }) + + let $header-context := dhf:headers-context($content) + let $headers := dhf:run($header-context, function() { + headers:create-headers($id, $content, $options) + }) + + let $triple-context := dhf:triples-context($content, $headers) + let $triples := dhf:run($triple-context, function() { + triples:create-triples($id, $content, $headers, $options) + }) + + let $envelope := dhf:make-envelope($content, $headers, $triples, map:get($options, "dataFormat")) + return + (: writers must be invoked this way. + see: https://github.com/marklogic/marklogic-data-hub/wiki/dhf-lib#run-writer :) + dhf:run-writer(xdmp:function(xs:QName("writer:write")), $id, $envelope, $options) +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/abc/triples.xqy b/examples/online-store/plugins/entities/Product/harmonize/abc/triples.xqy new file mode 100644 index 0000000000..e2d7e1bdd0 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/abc/triples.xqy @@ -0,0 +1,26 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare namespace es = "http://marklogic.com/entity-services"; + +declare option xdmp:mapping "false"; + +(:~ + : Create Triples Plugin + : + : @param $id - the identifier returned by the collector + : @param $content - the output of your content plugin + : @param $headers - the output of your headers plugin + : @param $options - a map containing options. Options are sent from Java + : + : @return - zero or more triples + :) +declare function plugin:create-triples( + $id as xs:string, + $content as item()?, + $headers as item()*, + $options as map:map) as sem:triple* +{ + () +}; diff --git a/examples/online-store/plugins/entities/Product/harmonize/abc/writer.xqy b/examples/online-store/plugins/entities/Product/harmonize/abc/writer.xqy new file mode 100644 index 0000000000..9c7dfeec99 --- /dev/null +++ b/examples/online-store/plugins/entities/Product/harmonize/abc/writer.xqy @@ -0,0 +1,22 @@ +xquery version "1.0-ml"; + +module namespace plugin = "http://marklogic.com/data-hub/plugins"; + +declare option xdmp:mapping "false"; + +(:~ + : Writer Plugin + : + : @param $id - the identifier returned by the collector + : @param $envelope - the final envelope + : @param $options - a map containing options. Options are sent from Java + : + : @return - nothing + :) +declare function plugin:write( + $id as xs:string, + $envelope as item(), + $options as map:map) as empty-sequence() +{ + xdmp:document-insert($id, $envelope, xdmp:default-permissions(), map:get($options, "entity")) +}; diff --git a/examples/online-store/plugins/mappings/Test/Test-0.mapping.json b/examples/online-store/plugins/mappings/Test/Test-0.mapping.json new file mode 100644 index 0000000000..bbcc9ffc61 --- /dev/null +++ b/examples/online-store/plugins/mappings/Test/Test-0.mapping.json @@ -0,0 +1,10 @@ +{ + "language" : "zxx", + "name" : "Test", + "description" : "This is a test mapping", + "version" : 0, + "targetEntityType" : "http://example.org/Product-0.0.1/Product", + "sourceContext" : "", + "sourceURI" : "", + "properties" : { } +} \ No newline at end of file diff --git a/examples/online-store/plugins/mappings/Test/Test-1.mapping.json b/examples/online-store/plugins/mappings/Test/Test-1.mapping.json new file mode 100644 index 0000000000..856754a572 --- /dev/null +++ b/examples/online-store/plugins/mappings/Test/Test-1.mapping.json @@ -0,0 +1,10 @@ +{ + "language" : "zxx", + "name" : "Test", + "description" : "This is a test mapping", + "version" : 1, + "targetEntityType" : "http://example.org/Product-0.0.1/Product", + "sourceContext" : "//", + "sourceURI" : "1000200", + "properties" : { } +} \ No newline at end of file diff --git a/examples/online-store/plugins/mappings/Test/Test-2.mapping.json b/examples/online-store/plugins/mappings/Test/Test-2.mapping.json new file mode 100644 index 0000000000..461766993e --- /dev/null +++ b/examples/online-store/plugins/mappings/Test/Test-2.mapping.json @@ -0,0 +1,20 @@ +{ + "language" : "zxx", + "name" : "Test", + "description" : "This is a test mapping", + "version" : 2, + "targetEntityType" : "http://example.org/Product-0.0.1/Product", + "sourceContext" : "//", + "sourceURI" : "1000200", + "properties" : { + "price" : { + "sourcedFrom" : "price" + }, + "sku" : { + "sourcedFrom" : "SKU" + }, + "title" : { + "sourcedFrom" : "title" + } + } +} \ No newline at end of file diff --git a/examples/online-store/src/main/entity-config/final-entity-options.xml b/examples/online-store/src/main/entity-config/final-entity-options.xml new file mode 100644 index 0000000000..398aacabfd --- /dev/null +++ b/examples/online-store/src/main/entity-config/final-entity-options.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + //*:instance/Order/id + + + + + + + + + + + unfiltered + + + //*:instance/(Product|Order) + + + + true + + + \ No newline at end of file diff --git a/examples/online-store/src/main/entity-config/staging-entity-options.xml b/examples/online-store/src/main/entity-config/staging-entity-options.xml new file mode 100644 index 0000000000..398aacabfd --- /dev/null +++ b/examples/online-store/src/main/entity-config/staging-entity-options.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + //*:instance/Order/id + + + + + + + + + + + unfiltered + + + //*:instance/(Product|Order) + + + + true + + + \ No newline at end of file diff --git a/examples/online-store/src/main/ml-config/databases/final-database.json b/examples/online-store/src/main/ml-config/databases/final-database.json index 4f42a88457..ea41677303 100644 --- a/examples/online-store/src/main/ml-config/databases/final-database.json +++ b/examples/online-store/src/main/ml-config/databases/final-database.json @@ -1,9 +1,9 @@ -{ - "database-name": "%%mlFinalDbName%%", - "range-element-index": [], - "schema-database": "%%mlFinalSchemasDbName%%", - "triggers-database": "%%mlFinalTriggersDbName%%", - "triple-index": true, - "collection-lexicon": true, - "uri-lexicon": true -} +{ + "database-name": "%%mlFinalDbName%%", + "range-element-index": [], + "schema-database": "%%mlFinalSchemasDbName%%", + "triggers-database": "%%mlFinalTriggersDbName%%", + "triple-index": true, + "collection-lexicon": true, + "uri-lexicon": true +} diff --git a/examples/online-store/src/main/ml-config/databases/final-schemas-database.json b/examples/online-store/src/main/ml-config/databases/final-schemas-database.json index 44dd21e151..7db14e3546 100644 --- a/examples/online-store/src/main/ml-config/databases/final-schemas-database.json +++ b/examples/online-store/src/main/ml-config/databases/final-schemas-database.json @@ -1,3 +1,3 @@ -{ - "database-name": "%%mlFinalSchemasDbName%%" -} +{ + "database-name": "%%mlFinalSchemasDbName%%" +} diff --git a/examples/online-store/src/main/ml-config/databases/final-triggers-database.json b/examples/online-store/src/main/ml-config/databases/final-triggers-database.json index 24ec643ea7..e9cccf69e9 100644 --- a/examples/online-store/src/main/ml-config/databases/final-triggers-database.json +++ b/examples/online-store/src/main/ml-config/databases/final-triggers-database.json @@ -1,3 +1,3 @@ -{ - "database-name": "%%mlFinalTriggersDbName%%" -} +{ + "database-name": "%%mlFinalTriggersDbName%%" +} diff --git a/examples/online-store/src/main/ml-config/databases/modules-database.json b/examples/online-store/src/main/ml-config/databases/modules-database.json index 7b323207b3..f1c7230a02 100644 --- a/examples/online-store/src/main/ml-config/databases/modules-database.json +++ b/examples/online-store/src/main/ml-config/databases/modules-database.json @@ -1,5 +1,5 @@ -{ - "database-name": "%%mlModulesDbName%%", - "collection-lexicon": true, - "uri-lexicon": true -} +{ + "database-name": "%%mlModulesDbName%%", + "collection-lexicon": true, + "uri-lexicon": true +} diff --git a/examples/online-store/src/main/ml-config/servers/final-server.json b/examples/online-store/src/main/ml-config/servers/final-server.json index 7a86236390..2080945373 100644 --- a/examples/online-store/src/main/ml-config/servers/final-server.json +++ b/examples/online-store/src/main/ml-config/servers/final-server.json @@ -1,14 +1,14 @@ -{ - "server-name": "%%mlFinalAppserverName%%", - "server-type": "http", - "root": "/", - "group-name": "%%GROUP%%", - "port": "%%mlFinalPort%%", - "modules-database": "%%mlModulesDbName%%", - "content-database": "%%mlFinalDbName%%", - "authentication": "%%mlFinalAuth%%", - "default-error-format": "json", - "error-handler": "/MarkLogic/rest-api/error-handler.xqy", - "url-rewriter": "/MarkLogic/rest-api/rewriter.xml", - "rewrite-resolves-globally": true -} +{ + "server-name": "%%mlFinalAppserverName%%", + "server-type": "http", + "root": "/", + "group-name": "%%GROUP%%", + "port": "%%mlFinalPort%%", + "modules-database": "%%mlModulesDbName%%", + "content-database": "%%mlFinalDbName%%", + "authentication": "%%mlFinalAuth%%", + "default-error-format": "json", + "error-handler": "/MarkLogic/rest-api/error-handler.xqy", + "url-rewriter": "/MarkLogic/rest-api/rewriter.xml", + "rewrite-resolves-globally": true +} diff --git a/gradle.properties b/gradle.properties index bac47bab10..698fb79541 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -version=4.0-SNAPSHOT +version=5.0-SNAPSHOT publishUrl=file:../marklogic-data-hub/releases diff --git a/marklogic-data-hub/build.gradle b/marklogic-data-hub/build.gradle index c159ebd0a8..69571633d3 100644 --- a/marklogic-data-hub/build.gradle +++ b/marklogic-data-hub/build.gradle @@ -3,7 +3,7 @@ plugins { id 'java' id 'maven-publish' id 'com.jfrog.bintray' version '1.7.2' - id 'com.marklogic.ml-gradle' version '3.8.2' + id 'com.marklogic.ml-gradle' version '3.11.0' id 'com.moowork.node' version '1.1.1' id 'org.springframework.boot' version '2.0.6.RELEASE' id "io.spring.dependency-management" version "1.0.5.RELEASE" @@ -27,8 +27,8 @@ ext.junitPlatformVersion = '1.3.1' ext.junitJupiterVersion = '5.3.1' dependencies { - compile 'com.marklogic:marklogic-client-api:4.1.1' - compile('com.marklogic:ml-app-deployer:3.10.1'){ + compile 'com.marklogic:marklogic-client-api:4.1.2' + compile('com.marklogic:ml-app-deployer:3.11.0'){ exclude group: 'org.springframework', module: 'spring-context' } compile group: 'org.springframework.boot', name: 'spring-boot-starter', version: '2.0.6.RELEASE' diff --git a/marklogic-data-hub/gradle-dhs.properties b/marklogic-data-hub/gradle-dhs.properties new file mode 100644 index 0000000000..8edb73e6bd --- /dev/null +++ b/marklogic-data-hub/gradle-dhs.properties @@ -0,0 +1,45 @@ +mlDHFVersion=5.0-SNAPSHOT +mlHost= + +mlIsHostLoadBalancer=true + +mlUsername=flowdev +mlPassword=SomePass#123 +mlManageUsername=flowdev +mlManagePassword=SomePass#123 +mlSecurityUsername=flowdev +mlSecurityPassword=SomePass#123 + +mlHubUserRole=flowOperator +mlHubUserName=flowop +mlHubUserPassword=SomePass#123 + +mlStagingAppserverName=data-hub-STAGING +mlStagingPort=8006 +mlStagingDbName=data-hub-STAGING +mlStagingForestsPerHost=1 + +mlFinalAppserverName=data-hub-ADMIN +mlFinalPort=8004 +mlFinalDbName=data-hub-FINAL +mlFinalForestsPerHost=1 + +mlJobAppserverName=data-hub-JOBS +mlJobPort=8007 +mlJobDbName=data-hub-JOBS +mlJobForestsPerHost=1 + +mlModulesDbName=data-hub-MODULES +mlStagingTriggersDbName=data-hub-staging-TRIGGERS +mlStagingSchemasDbName=data-hub-staging-SCHEMAS + +mlFinalTriggersDbName=data-hub-final-TRIGGERS +mlFinalSchemasDbName=data-hub-final-SCHEMAS + +mlModulePermissions=flowDeveloper,read,flowDeveloper,execute,flowDeveloper,insert,flowOperator,read,flowOperator,execute,flowOperator,insert,rest-reader,read,rest-writer,insert,rest-writer,update,rest-extension-user,execute + +mlHubAdminRole=flowDeveloper +mlHubAdminUserName=flowdev +mlHubAdminUserPassword=SomePass#123 + +mlIsProvisionedEnvironment=true diff --git a/marklogic-data-hub/gradle.properties b/marklogic-data-hub/gradle.properties index cb249b402c..b2d1d79b3a 100644 --- a/marklogic-data-hub/gradle.properties +++ b/marklogic-data-hub/gradle.properties @@ -1,5 +1,5 @@ # -# Copyright 2012-2018 MarkLogic Corporation +# Copyright 2012-2019 MarkLogic Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,7 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -mlDHFVersion=4.0-SNAPSHOT +mlDHFVersion=5.0-SNAPSHOT mlHost=localhost mlAppName=data-hub diff --git a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/file/CacheBusterDocumentFileProcessor.java b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/file/CacheBusterDocumentFileProcessor.java index 4a53d00354..d059e9f604 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/file/CacheBusterDocumentFileProcessor.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/file/CacheBusterDocumentFileProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/EntityDefModulesFinder.java b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/EntityDefModulesFinder.java index c06788eb13..4d92ce3920 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/EntityDefModulesFinder.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/EntityDefModulesFinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/MappingDefModulesFinder.java b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/MappingDefModulesFinder.java index 0be7e52b09..e8d728a16a 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/MappingDefModulesFinder.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/MappingDefModulesFinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/SearchOptionsFinder.java b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/SearchOptionsFinder.java index d10936c66e..4368702583 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/SearchOptionsFinder.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/SearchOptionsFinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/UserModulesFinder.java b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/UserModulesFinder.java index 4663ee5a7b..f1b05e5b40 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/UserModulesFinder.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/client/ext/modulesloader/impl/UserModulesFinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/ApplicationConfig.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/ApplicationConfig.java index 0237b67652..ba348b119b 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/ApplicationConfig.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/ApplicationConfig.java @@ -11,7 +11,7 @@ * This application configuration is an entry point to using the DHF from a set property */ @Configuration -@ComponentScan(basePackages = {"com.marklogic.hub.impl", "com.marklogic.hub.deploy.commands"}) +@ComponentScan(basePackages = {"com.marklogic.hub.impl", "com.marklogic.hub.legacy.impl", "com.marklogic.hub.deploy.commands"}) @EnableAutoConfiguration public class ApplicationConfig { diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/DataHub.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/DataHub.java index 6958b19bf0..6bdadc8ecd 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/DataHub.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/DataHub.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/DatabaseKind.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/DatabaseKind.java index c32b7bb264..bb1a94269e 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/DatabaseKind.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/DatabaseKind.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/EntityManager.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/EntityManager.java index d8b153bf38..fab4dfa7cf 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/EntityManager.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/EntityManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,11 @@ package com.marklogic.hub; -import com.marklogic.hub.impl.EntityManagerImpl; +import com.marklogic.hub.entity.HubEntity; +import java.io.IOException; import java.util.HashMap; +import java.util.List; /** * Manages existing entities' MarkLogic Server database index settings and query options. @@ -57,4 +59,10 @@ public interface EntityManager { boolean deployFinalQueryOptions(); boolean deployStagingQueryOptions(); + + List getEntities(); + + HubEntity saveEntity(HubEntity entity, Boolean rename) throws IOException; + + void deleteEntity(String entity) throws IOException; } diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/FlowManager.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/FlowManager.java index 17fe96fd09..c5e65295fc 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/FlowManager.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/FlowManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,100 +16,79 @@ package com.marklogic.hub; +import com.fasterxml.jackson.databind.JsonNode; +import com.marklogic.hub.error.DataHubProjectException; import com.marklogic.hub.flow.Flow; -import com.marklogic.hub.flow.FlowRunner; -import com.marklogic.hub.flow.FlowType; -import com.marklogic.hub.flow.impl.FlowImpl; -import org.w3c.dom.Element; -import java.nio.file.Path; import java.util.List; /** - * Manages existing flows and creates flow runners to execute flows. + * Manages CRUD operations for flows */ public interface FlowManager { /** - * Turns an XML document into a flow - * @param doc - the xml document representing a flow - * @return a Flow instance + * String value for the flow file extension */ - static Flow flowFromXml(Element doc) { - return FlowImpl.fromXml(doc); - } + String FLOW_FILE_EXTENSION = ".flow.json"; /** - * retrieves a list of all the flows on the local files systems - * @return a list of Flows + * Retrieves a named flow + * @param flowName - name of the flow + * @return a flow object */ - List getLocalFlows(); + Flow getFlow(String flowName); /** - * retrieves a list of all the flows on the local files systems - * @param entityName - string name of the entity for the flow - * @return a list of Flows + * Returns a flow based on the provided name as JSON string + * @param flowName - name of the flow + * @return string json representation of the flow object */ - List getLocalFlowsForEntity(String entityName); + String getFlowAsJSON(String flowName); /** - * retrieves a list of all the flows on the local files systems - * @param entityName - string name of the entity for the flow - * @param flowType - the FlowType enum, eg: ingest or harmonize - * @return a list of Flows + * Retrieves a list of flows installed on the MarkLogic server + * @return - a list of all flows */ - List getLocalFlowsForEntity(String entityName, FlowType flowType); + List getFlows(); /** - * Obtains a flow from a property file - * @param propertiesFile - the Path to the property file - * @return - a flow object + * Retrieves a list of names of flows installed on the MarkLogic server + * @return - a list of names of all flows */ - Flow getFlowFromProperties(Path propertiesFile); + List getFlowNames(); /** - * Retrieves a list of flows installed on the MarkLogic server - * @param entityName - the entity from which to fetch the flows - * @return - a list of flows for the given entity + * Creates a flow + * @param flowName - name of the flow */ - List getFlows(String entityName); + Flow createFlow(String flowName); /** - * Retrieves a named flow from a given entity - * - * @param entityName - the entity that the flow belongs to - * @param flowName - the name of the flow to get - * @return the flow + * Creates a flow from a given JSON string + * @param json - string representation of the flow + * @return - a Flow object */ - Flow getFlow(String entityName, String flowName); + Flow createFlowFromJSON(String json); /** - * Retrieves a named flow from a given entity - * - * @param entityName - the entity that the flow belongs to - * @param flowName - the name of the flow to get - * @param flowType - the type of flow (ingest/harmonize) - * @return the flow + * Creates a flow from a given JsonNode + * @param json - JsonNode representation of the flow + * @return - a Flow object */ - Flow getFlow(String entityName, String flowName, FlowType flowType); + Flow createFlowFromJSON(JsonNode json); /** - * Updates the indexes in the database based on the project - * @return - a list of names for all the flows that are legacy + * Deletes a flow + * @param flowName - name of the flow */ - - List getLegacyFlows(); + void deleteFlow(String flowName); /** - * Sets the version that the legacy flow is to be updated from - * @param fromVersion - string representation of DHF version - * @return a list of updated flow names that were updated + * Saves a flow to disk + * @param flow - the flow object to be saved */ - List updateLegacyFlows(String fromVersion); + void saveFlow(Flow flow); + - /** - * Creates and returns a new FlowRunner object using the FlowManager's hubconfig - * @return FlowRunner object with current hubconfig already set - */ - FlowRunner newFlowRunner(); } diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/HubConfig.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/HubConfig.java index 06e091f44f..e11af8242e 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/HubConfig.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/HubConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,6 +22,7 @@ import com.marklogic.client.DatabaseClient; import com.marklogic.client.DatabaseClientFactory; import com.marklogic.hub.impl.HubConfigImpl; +import com.marklogic.hub.processes.Process; import javax.net.ssl.SSLContext; import javax.net.ssl.X509TrustManager; @@ -408,6 +409,8 @@ public interface HubConfig { */ Path getHubMappingsDir(); + Path getProcessDir(Process.ProcessType type); + /** * Gets the path for the hub's config directory * @return the path for the hub's config directory @@ -468,6 +471,13 @@ public interface HubConfig { */ Path getEntityDatabaseDir(); + /** + * Gets the path for the flows directory + * + * @return the path for the flows directory + */ + Path getFlowsDir(); + /** * Returns the current AppConfig object attached to the HubConfig * @return Returns current AppConfig object set for HubConfig diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/HubProject.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/HubProject.java index 9720e1f6ce..c89735aa55 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/HubProject.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/HubProject.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,7 @@ package com.marklogic.hub; -import com.marklogic.hub.impl.HubProjectImpl; -import org.springframework.core.io.ProtocolResolver; +import com.marklogic.hub.processes.Process; import java.io.IOException; import java.nio.file.Path; @@ -48,6 +47,8 @@ public interface HubProject { */ Path getHubPluginsDir(); + Path getProcessesDir(); + /** * Gets the path for the hub entities directory * @@ -62,6 +63,8 @@ public interface HubProject { */ Path getHubMappingsDir(); + Path getProcessDir(Process.ProcessType type); + /** * Gets the path for the hub's config directory * @@ -76,13 +79,6 @@ public interface HubProject { */ Path getHubDatabaseDir(); - /** - * Gets the path for the hub/staging schemas directory - * - * @return the path for the hub/staging schemas directory - */ - Path getHubSchemasDir(); - /** * Gets the path for the hub servers directory * @@ -97,6 +93,13 @@ public interface HubProject { */ Path getHubSecurityDir(); + /** + * Gets the path for the hub's triggers directory + * + * @return the path for the hub's triggers directory + */ + Path getHubTriggersDir(); + /** * Gets the path for the user config directory * @@ -146,6 +149,13 @@ public interface HubProject { */ Path getEntityDatabaseDir(); + /** + * Gets the path for the flows directory + * + * @return the path for the flows directory + */ + Path getFlowsDir(); + /** * Gets the path for the hub staging modules * @@ -204,12 +214,15 @@ public interface HubProject { String getUserModulesDeployTimestampFile(); + void setUserModulesDeployTimestampFile(String userModulesDeployTimestampFile); + Path getEntityDir(String entityName); Path getMappingDir(String mappingName); /** * Returns the base directory for this project + * * @return the project's directory as a Path */ Path getProjectDir(); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/InstallInfo.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/InstallInfo.java index 73c5754f4d..81c786761e 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/InstallInfo.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/InstallInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/MappingManager.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/MappingManager.java index a7dcaceb72..f9683da004 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/MappingManager.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/MappingManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/ProcessManager.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/ProcessManager.java new file mode 100644 index 0000000000..c47fdcd2e1 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/ProcessManager.java @@ -0,0 +1,84 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.marklogic.hub; + +import com.fasterxml.jackson.databind.JsonNode; +import com.marklogic.hub.processes.Process; + +import java.util.ArrayList; + +public interface ProcessManager { + + /** + * String value for the mapping file extension + */ + String PROCESSES_FILE_EXTENSION = ".processes.json"; + + /** + * Saves a Process to disk + * + * @param process - the Process object to be saved + */ + void saveProcess(Process process); + + /** + * Deletes a Process from disk + * + * @param process - the Process object to be deleted + */ + void deleteProcess(Process process); + + /** + * Returns a list of all Processes currently defined + * + * @return - an ArrayList of all Process objects from disk + */ + ArrayList getProcesses(); + + /** + * Returns a single Process given a name and a type + * + * @param name - name of the Process + * @param type - type of the Process + * @return the Process object + */ + Process getProcess(String name, Process.ProcessType type); + + /** + * Returns a list of Processes that have the given type + * + * @param type - type of the Process + * @return an ArrayList of Process objects of a given type + */ + ArrayList getProcessesByType(Process.ProcessType type); + + /** + * Returns a list of Process names that have the given type + * + * @param type - type of the Process + * @return an ArrayList of Process names of a given type + */ + ArrayList getProcessNamesByType(Process.ProcessType type); + + /** + * Creates a Process from a given JsonNode + * + * @param json - a JsonNode + * @return a Process object + */ + Process createProcessFromJSON(JsonNode json); +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/HubAppDeployer.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/HubAppDeployer.java index 2bbacd7370..4b8123b28e 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/HubAppDeployer.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/HubAppDeployer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,15 +23,14 @@ import com.marklogic.client.DatabaseClient; import com.marklogic.client.FailedRequestException; import com.marklogic.client.eval.ServerEvaluationCall; +import com.marklogic.hub.deploy.util.CMASettings; import com.marklogic.hub.deploy.util.HubDeployStatusListener; import com.marklogic.mgmt.ManageClient; import com.marklogic.mgmt.admin.AdminManager; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - +/** + * Extends ml-app-deployer's SimpleAppDeployer to provide progress reporting. + */ public class HubAppDeployer extends SimpleAppDeployer { private ManageClient manageClient; @@ -40,6 +39,10 @@ public class HubAppDeployer extends SimpleAppDeployer { // this is for the telemetry hook to use mlUsername/mlPassword private DatabaseClient databaseClient; + private String mlVersion = null; + // Keeps track of completion percentage + private int completed = 0; + public HubAppDeployer(ManageClient manageClient, AdminManager adminManager, HubDeployStatusListener listener, DatabaseClient databaseClient) { super(manageClient, adminManager); this.manageClient = manageClient; @@ -50,94 +53,52 @@ public HubAppDeployer(ManageClient manageClient, AdminManager adminManager, HubD @Override public void deploy(AppConfig appConfig) { - logger.info(format("Deploying app %s with config dir of: %s\n", appConfig.getName(), appConfig.getFirstConfigDir() - .getBaseDir().getAbsolutePath())); - - List commands = getCommands(); - Collections.sort(commands, new Comparator() { - @Override - public int compare(Command o1, Command o2) { - return o1.getExecuteSortOrder().compareTo(o2.getExecuteSortOrder()); - } - - @Override - public boolean equals(Object obj) { - return this.equals(obj); - } - }); - - CommandContext context = new CommandContext(appConfig, manageClient, adminManager); - - int count = commands.size(); - int completed = 0; + this.completed = 0; onStatusChange(0, "Installing..."); - for (Command command : commands) { - String name = command.getClass().getName(); - logger.info(format("Executing command [%s] with sort order [%d]", name, command.getExecuteSortOrder())); - float percent = ((float)completed / (float)count) * 100; - onStatusChange((int)percent, format("[Step %d of %d] %s", completed + 1, count, name)); - command.execute(context); - logger.info(format("Finished executing command [%s]\n", name)); - completed++; - } + super.deploy(appConfig); onStatusChange(100, "Installation Complete"); - //Below is telemetry metric code for tracking successful dhf installs - //TODO: when more uses of telemetry are defined, change this to a more e-node based method - ServerEvaluationCall eval = databaseClient.newServerEval(); - String query = "xdmp:feature-metric-increment(xdmp:feature-metric-register(\"datahub.core.install.count\"))"; - try { - eval.xquery(query).eval().close(); - } - catch(FailedRequestException e) { - logger.error("Failed to increment feature metric telemetry count: " + query, e); - e.printStackTrace(); + if (databaseClient != null) { + //Below is telemetry metric code for tracking successful dhf installs + //TODO: when more uses of telemetry are defined, change this to a more e-node based method + ServerEvaluationCall eval = databaseClient.newServerEval(); + String query = "xdmp:feature-metric-increment(xdmp:feature-metric-register(\"datahub.core.install.count\"))"; + try { + eval.xquery(query).eval().close(); + } catch (FailedRequestException e) { + logger.error("Failed to increment feature metric telemetry count: " + query, e); + e.printStackTrace(); + } } - logger.info(format("Deployed app %s", appConfig.getName())); } @Override - public void undeploy(AppConfig appConfig) { - logger.info(format("Undeploying app %s with config dir: %s\n", appConfig.getName(), appConfig.getFirstConfigDir() - .getBaseDir().getAbsolutePath())); - - List commands = getCommands(); - - List undoableCommands = new ArrayList<>(); - for (Command command : commands) { - if (command instanceof UndoableCommand) { - undoableCommands.add((UndoableCommand) command); - } - } - - Collections.sort(undoableCommands, new Comparator() { - @Override - public int compare(UndoableCommand o1, UndoableCommand o2) { - return o1.getUndoSortOrder().compareTo(o2.getUndoSortOrder()); - } - - @Override - public boolean equals(Object obj) { - return this.equals(obj); - } - }); + protected void executeCommand(Command command, CommandContext context) { + reportStatus(command); + super.executeCommand(command, context); + completed++; + } - int count = undoableCommands.size(); - int completed = 0; + @Override + public void undeploy(AppConfig appConfig) { + this.completed = 0; onStatusChange(0, "Uninstalling..."); - - for (UndoableCommand command : undoableCommands) { - String name = command.getClass().getName(); - logger.info(format("Undoing command [%s] with sort order [%d]", name, command.getUndoSortOrder())); - float percent = ((float)completed / (float)count) * 100; - onStatusChange((int)percent, format("[Step %d of %d] %s", completed + 1, count, name)); - command.undo(new CommandContext(appConfig, manageClient, adminManager)); - logger.info(format("Finished undoing command [%s]\n", name)); - completed++; - } + super.undeploy(appConfig); onStatusChange(100, "Installation Complete"); + } + + @Override + protected void undoCommand(UndoableCommand command, CommandContext context) { + reportStatus(command); + super.undoCommand(command, context); + completed++; + } - logger.info(format("Undeployed app %s", appConfig.getName())); + protected void reportStatus(Command command) { + int count = getCommands().size(); + float percent = ((float) completed / (float) count) * 100; + String name = command.getClass().getName(); + onStatusChange((int) percent, format("[Step %d of %d] %s", completed + 1, count, name)); } private void onStatusChange(int percentComplete, String message) { diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/DeployHubAmpsCommand.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/DeployHubAmpsCommand.java deleted file mode 100644 index 1b0e0b4420..0000000000 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/DeployHubAmpsCommand.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright 2012-2018 MarkLogic Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.marklogic.hub.deploy.commands; - -import com.marklogic.appdeployer.command.CommandContext; -import com.marklogic.appdeployer.command.security.DeployAmpsCommand; -import com.marklogic.client.DatabaseClient; -import com.marklogic.client.DatabaseClientFactory; -import com.marklogic.client.eval.ServerEvaluationCall; -import com.marklogic.hub.HubConfig; -import com.marklogic.hub.error.DataHubConfigurationException; -import com.marklogic.hub.impl.Versions; -import com.marklogic.mgmt.ManageClient; -import com.marklogic.mgmt.ManageConfig; -import org.apache.commons.io.IOUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.ClassPathResource; -import org.springframework.stereotype.Component; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; - -@Component -public class DeployHubAmpsCommand extends DeployAmpsCommand { - - @Autowired - private HubConfig hubConfig; - - @Autowired - private Versions versions; - - public DeployHubAmpsCommand() { - super(); - } - - /** - * This is still needed by the Gradle tasks. - * - * @param hubConfig - */ - public DeployHubAmpsCommand(HubConfig hubConfig) { - this.hubConfig = hubConfig; - this.versions = new Versions(hubConfig); - } - - /** - * Installs the amps for DHF via CMA endpoint - * @param context The command context for execution. - */ - @Override - public void execute(CommandContext context) { - - // this is a place to optimize -- is there a way to get - // server versions without an http call? - String serverVersion = versions.getMarkLogicVersion(); - - - logger.info("Choosing amp installation based on server version " + serverVersion); - - if (serverVersion.matches("^[789]\\.0-[1234]\\.\\d+")) { - throw new DataHubConfigurationException("DHF " + hubConfig.getDHFVersion() +" cannot deploy security to server version " + serverVersion); - } - if (serverVersion.startsWith("9.0-5")) { - logger.info("Using non-SSL-compatible method for 9.0-5 servers, for demos only"); - String modulesDatabaseName = hubConfig.getAppConfig().getModulesDatabaseName(); - ManageConfig manageConfig = context.getManageClient().getManageConfig(); - String securityUsername = manageConfig.getSecurityUsername(); - String securityPassword = manageConfig.getSecurityPassword(); - DatabaseClient installerClient = DatabaseClientFactory.newClient( - hubConfig.getHost(), - 8000, - "Security", - new DatabaseClientFactory.DigestAuthContext(securityUsername, securityPassword) - ); - //new AmpsInstaller(securityStagingClient).installAmps(modulesDatabaseName); - ServerEvaluationCall call = installerClient.newServerEval(); - try (InputStream is = new ClassPathResource("installer-util/install-amps.xqy").getInputStream()) { - String ampCall = IOUtils.toString(is, "utf-8"); - is.close(); - ampCall = ampCall.replaceAll("data-hub-MODULES", modulesDatabaseName); - call.xquery(ampCall); - call.eval(); - } catch (IOException e) { - throw new DataHubConfigurationException(e); - } - } else { - logger.info("Using CMA for servers starting with 9.0-6"); - String modulesDatabaseName = hubConfig.getAppConfig().getModulesDatabaseName(); - ManageClient manageClient = context.getManageClient(); - - try (InputStream is = new ClassPathResource("hub-internal-config/configurations/amps.json").getInputStream()) { - String payload = IOUtils.toString(is, "utf-8"); - payload = payload.replaceAll("data-hub-MODULES", modulesDatabaseName); - manageClient.postJsonAsSecurityUser("/manage/v3", payload); - } catch (IOException e) { - throw new DataHubConfigurationException(e); - } - } - } - - @Override - public void undo(CommandContext context) { - // this is a place to optimize -- is there a way to get - // server versions without an http call? - String serverVersion = versions.getMarkLogicVersion(); - logger.info("Choosing amp uninstall based on server version " + serverVersion); - - if (serverVersion.startsWith("9.0-5")) { - logger.info("Using non-SSL-compatable method for 9.0-5 servers"); - String modulesDatabaseName = hubConfig.getAppConfig().getModulesDatabaseName(); - ManageConfig manageConfig = context.getManageClient().getManageConfig(); - String securityUsername = manageConfig.getSecurityUsername(); - String securityPassword = manageConfig.getSecurityPassword(); - DatabaseClient installerClient = DatabaseClientFactory.newClient( - hubConfig.getHost(), - 8000, - "Security", - new DatabaseClientFactory.DigestAuthContext(securityUsername, securityPassword) - ); - //new AmpsInstaller(securityStagingClient).unInstallAmps(modulesDatabaseName); - ServerEvaluationCall call = installerClient.newServerEval(); - try (InputStream is = new ClassPathResource("installer-util/uninstall-amps.xqy").getInputStream()) { - String ampCall = IOUtils.toString(is, "utf-8"); - is.close(); - ampCall = ampCall.replaceAll("data-hub-MODULES", modulesDatabaseName); - call.xquery(ampCall); - call.eval(); - } catch (IOException e) { - throw new DataHubConfigurationException(e); - } - } - else { - // only on 9.0-5 are amps uninstalled at all. - logger.warn("Amps from uninstalled data hub framework to remain, but are disabled."); - } - } - - @Override - protected File[] getResourceDirs(CommandContext context) { - return new File[] { - }; - } - - - public void setHubConfig(HubConfig hubConfig) { - this.hubConfig = hubConfig; - } -} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/GenerateHubTDETemplateCommand.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/GenerateHubTDETemplateCommand.java index 7f60e55918..e6c3a25de1 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/GenerateHubTDETemplateCommand.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/GenerateHubTDETemplateCommand.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,14 +19,19 @@ import com.marklogic.appdeployer.command.CommandContext; import com.marklogic.appdeployer.command.es.GenerateModelArtifactsCommand; import com.marklogic.client.DatabaseClient; +import com.marklogic.client.eval.EvalResultIterator; import com.marklogic.client.ext.es.CodeGenerationRequest; import com.marklogic.client.ext.es.EntityServicesManager; import com.marklogic.client.ext.es.GeneratedCode; import com.marklogic.hub.HubConfig; +import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; import java.nio.file.Path; import java.util.*; import java.util.function.Function; @@ -70,7 +75,31 @@ public void execute(CommandContext context) { entityNameFileMap.keySet(), hubConfig.getAppConfig().getSchemasPath()); for (File f : entityNameFileMap.values()) { - GeneratedCode code = loadModelDefinition(request, f, mgr); + File esModel; + try { + //Write the ES model to a temp file + String tempDir = System.getProperty("java.io.tmpdir"); + String fileName = f.getName(); + esModel = new File(tempDir, fileName); + String modelString = generateModel(f); + if(modelString == null) { + logger.warn(f.getName() + " is not deployed to the database"); + continue; + } + FileUtils.writeStringToFile(esModel, generateModel(f)); + } catch (IOException e) { + throw new RuntimeException("Unable to generate ES model"); + } + + GeneratedCode code; + try { + code = loadModelDefinition(request, esModel, mgr); + } catch (RuntimeException e) { + throw new RuntimeException("Unable to read model definition from file: " + f.getAbsolutePath(), e); + } + finally { + FileUtils.deleteQuietly(esModel); + } generateExtractionTemplate(appConfig, code); } @@ -83,6 +112,18 @@ public void execute(CommandContext context) { } + //Method to obtain es-style model + private String generateModel(File f) { + String xquery = "import module namespace hent = \"http://marklogic.com/data-hub/hub-entities\"\n" + + "at \"/data-hub/4/impl/hub-entities.xqy\";\n" + + String.format("hent:get-model(\"%s\")", extactEntityNameFromFilename(f.getName()).get()); + EvalResultIterator resp = hubConfig.newStagingClient().newServerEval().xquery(xquery).eval(); + if (resp.hasNext()) { + return resp.next().getString(); + } + return null ; + } + public String getEntityNames() { return entityNames; } diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadHubModulesCommand.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadHubModulesCommand.java index 75d8ccea2d..abd17d2942 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadHubModulesCommand.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadHubModulesCommand.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadUserArtifactsCommand.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadUserArtifactsCommand.java new file mode 100644 index 0000000000..93ad61a192 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadUserArtifactsCommand.java @@ -0,0 +1,195 @@ +/* + * Copyright 2012-2018 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.marklogic.hub.deploy.commands; + +import com.marklogic.appdeployer.AppConfig; +import com.marklogic.appdeployer.command.AbstractCommand; +import com.marklogic.appdeployer.command.CommandContext; +import com.marklogic.appdeployer.command.SortOrderConstants; +import com.marklogic.client.DatabaseClient; +import com.marklogic.client.document.DocumentWriteSet; +import com.marklogic.client.document.JSONDocumentManager; +import com.marklogic.client.ext.modulesloader.Modules; +import com.marklogic.client.ext.modulesloader.impl.EntityDefModulesFinder; +import com.marklogic.client.ext.modulesloader.impl.MappingDefModulesFinder; +import com.marklogic.client.ext.util.DefaultDocumentPermissionsParser; +import com.marklogic.client.ext.util.DocumentPermissionsParser; +import com.marklogic.client.io.DocumentMetadataHandle; +import com.marklogic.client.io.StringHandle; +import com.marklogic.hub.HubConfig; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +import org.springframework.stereotype.Component; +import com.marklogic.client.ext.modulesloader.impl.PropertiesModuleManager; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.Date; +import java.util.regex.Pattern; + +/** + * Loads user artifacts like mappings and entities. This will be deployed after triggers + */ +@Component +public class LoadUserArtifactsCommand extends AbstractCommand { + + @Autowired + private HubConfig hubConfig; + + private DocumentPermissionsParser documentPermissionsParser = new DefaultDocumentPermissionsParser(); + + public void setForceLoad(boolean forceLoad) { + this.forceLoad = forceLoad; + } + + private boolean forceLoad = false; + + public LoadUserArtifactsCommand() { + super(); + setExecuteSortOrder(SortOrderConstants.DEPLOY_TRIGGERS + 1); + } + + boolean isArtifactDir(Path dir, Path startPath) { + String dirStr = dir.toString(); + String startPathStr = Pattern.quote(startPath.toString()); + String regex = startPathStr + "[/\\\\][^/\\\\]+$"; + return dirStr.matches(regex); + } + + private PropertiesModuleManager getModulesManager() { + String timestampFile = hubConfig.getHubProject().getUserModulesDeployTimestampFile(); + PropertiesModuleManager pmm = new PropertiesModuleManager(timestampFile); + + // Need to delete ml-javaclient-utils timestamp file as well as modules present in the standard gradle locations are now + // loaded by the modules loader in the parent class which adds these entries to the ml-javaclient-utils timestamp file + String filePath = hubConfig.getAppConfig().getModuleTimestampsPath(); + File defaultTimestampFile = new File(filePath); + + if (forceLoad) { + pmm.deletePropertiesFile(); + if (defaultTimestampFile.exists()){ + defaultTimestampFile.delete(); + } + } + return pmm; + } + + @Override + public void execute(CommandContext context) { + AppConfig config = context.getAppConfig(); + + DatabaseClient stagingClient = hubConfig.newStagingClient(); + DatabaseClient finalClient = hubConfig.newFinalClient(); + + Path userModulesPath = hubConfig.getHubPluginsDir(); + String baseDir = userModulesPath.normalize().toAbsolutePath().toString(); + Path startPath = userModulesPath.resolve("entities"); + Path mappingPath = userModulesPath.resolve("mappings"); + + JSONDocumentManager finalDocMgr = finalClient.newJSONDocumentManager(); + JSONDocumentManager stagingDocMgr = stagingClient.newJSONDocumentManager(); + + DocumentWriteSet finalEntityDocumentWriteSet = finalDocMgr.newWriteSet(); + DocumentWriteSet stagingEntityDocumentWriteSet = stagingDocMgr.newWriteSet(); + DocumentWriteSet finalMappingDocumentWriteSet = finalDocMgr.newWriteSet(); + DocumentWriteSet stagingMappingDocumentWriteSet = stagingDocMgr.newWriteSet(); + PropertiesModuleManager propertiesModuleManager = getModulesManager(); + + try { + if (startPath.toFile().exists()) { + //first let's do the entities + Files.walkFileTree(startPath, new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + String currentDir = dir.normalize().toAbsolutePath().toString(); + if (isArtifactDir(dir, startPath.toAbsolutePath())) { + Modules modules = new EntityDefModulesFinder().findModules(dir.toString()); + DocumentMetadataHandle meta = new DocumentMetadataHandle(); + meta.getCollections().add("http://marklogic.com/entity-services/models"); + documentPermissionsParser.parsePermissions(hubConfig.getModulePermissions(), meta.getPermissions()); + for (Resource r : modules.getAssets()) { + if (forceLoad || propertiesModuleManager.hasFileBeenModifiedSinceLastLoaded(r.getFile())) { + InputStream inputStream = r.getInputStream(); + StringHandle handle = new StringHandle(IOUtils.toString(inputStream)); + inputStream.close(); + finalEntityDocumentWriteSet.add("/entities/" + r.getFilename(), meta, handle); + stagingEntityDocumentWriteSet.add("/entities/" + r.getFilename(), meta, handle); + propertiesModuleManager.saveLastLoadedTimestamp(r.getFile(), new Date()); + } + } + return FileVisitResult.CONTINUE; + } else { + return FileVisitResult.CONTINUE; + } + } + }); + + //now let's do the mappings path + if (mappingPath.toFile().exists()) { + Files.walkFileTree(mappingPath, new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + String currentDir = dir.normalize().toAbsolutePath().toString(); + + if (isArtifactDir(dir, mappingPath.toAbsolutePath())) { + Modules modules = new MappingDefModulesFinder().findModules(dir.toString()); + DocumentMetadataHandle meta = new DocumentMetadataHandle(); + meta.getCollections().add("http://marklogic.com/data-hub/mappings"); + documentPermissionsParser.parsePermissions(hubConfig.getModulePermissions(), meta.getPermissions()); + for (Resource r : modules.getAssets()) { + if (forceLoad || propertiesModuleManager.hasFileBeenModifiedSinceLastLoaded(r.getFile())) { + InputStream inputStream = r.getInputStream(); + StringHandle handle = new StringHandle(IOUtils.toString(inputStream)); + inputStream.close(); + finalMappingDocumentWriteSet.add("/mappings/" + r.getFile().getParentFile().getName() + "/" + r.getFilename(), meta, handle); + stagingMappingDocumentWriteSet.add("/mappings/" + r.getFile().getParentFile().getName() + "/" + r.getFilename(), meta, handle); + propertiesModuleManager.saveLastLoadedTimestamp(r.getFile(), new Date()); + } + } + return FileVisitResult.CONTINUE; + } else { + return FileVisitResult.CONTINUE; + } + } + }); + } + if (stagingEntityDocumentWriteSet.size() > 0) { + finalDocMgr.write(finalEntityDocumentWriteSet); + stagingDocMgr.write(stagingEntityDocumentWriteSet); + } + if (stagingMappingDocumentWriteSet.size() > 0) { + finalDocMgr.write(finalMappingDocumentWriteSet); + stagingDocMgr.write(stagingMappingDocumentWriteSet); + } + } + + } catch (IOException e) { + e.printStackTrace(); + //throw new RuntimeException(e); + } + } + + public void setHubConfig(HubConfig hubConfig) { + this.hubConfig = hubConfig; + } + +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadUserModulesCommand.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadUserModulesCommand.java index f9a50a31c7..ecc372c6d2 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadUserModulesCommand.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/commands/LoadUserModulesCommand.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,43 +21,31 @@ import com.marklogic.appdeployer.command.modules.LoadModulesCommand; import com.marklogic.client.DatabaseClient; import com.marklogic.client.document.DocumentWriteSet; -import com.marklogic.client.document.JSONDocumentManager; import com.marklogic.client.document.XMLDocumentManager; -import com.marklogic.client.ext.modulesloader.Modules; +import com.marklogic.client.ext.file.CacheBusterDocumentFileProcessor; import com.marklogic.client.ext.modulesloader.ModulesManager; -import com.marklogic.client.ext.modulesloader.impl.AssetFileLoader; -import com.marklogic.client.ext.modulesloader.impl.DefaultModulesLoader; -import com.marklogic.client.ext.modulesloader.impl.PropertiesModuleManager; +import com.marklogic.client.ext.modulesloader.impl.*; import com.marklogic.client.ext.util.DefaultDocumentPermissionsParser; import com.marklogic.client.ext.util.DocumentPermissionsParser; -import com.marklogic.client.io.DocumentMetadataHandle; import com.marklogic.client.io.Format; import com.marklogic.client.io.StringHandle; -import com.marklogic.client.ext.file.CacheBusterDocumentFileProcessor; -import com.marklogic.client.ext.modulesloader.impl.EntityDefModulesFinder; -import com.marklogic.client.ext.modulesloader.impl.MappingDefModulesFinder; -import com.marklogic.client.ext.modulesloader.impl.SearchOptionsFinder; -import com.marklogic.client.ext.modulesloader.impl.UserModulesFinder; import com.marklogic.hub.EntityManager; -import com.marklogic.hub.FlowManager; +import com.marklogic.hub.legacy.LegacyFlowManager; import com.marklogic.hub.HubConfig; import com.marklogic.hub.deploy.util.HubFileFilter; import com.marklogic.hub.error.LegacyFlowsException; -import com.marklogic.hub.flow.Flow; -import org.apache.commons.io.IOUtils; +import com.marklogic.hub.legacy.flow.LegacyFlow; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.io.Resource; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Component; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.Date; import java.util.List; -import java.util.regex.Pattern; + /** * Extends ml-app-deployer's LoadModulesCommand, which expects to load from every path defined by "mlModulePaths", so @@ -75,8 +63,7 @@ public class LoadUserModulesCommand extends LoadModulesCommand { private EntityManager entityManager; @Autowired - private FlowManager flowManager; - + private LegacyFlowManager flowManager; private DocumentPermissionsParser documentPermissionsParser = new DefaultDocumentPermissionsParser(); private ThreadPoolTaskExecutor threadPoolTaskExecutor; @@ -116,6 +103,7 @@ private PropertiesModuleManager getModulesManager() { private AssetFileLoader getAssetFileLoader(AppConfig config, PropertiesModuleManager moduleManager) { AssetFileLoader assetFileLoader = new AssetFileLoader(hubConfig.newModulesDbClient(), moduleManager); assetFileLoader.addDocumentFileProcessor(new CacheBusterDocumentFileProcessor()); + //Add file extensions to HubFileFilter.accept() to prevent mappings, entities files being loaded to Modules db assetFileLoader.addFileFilter(new HubFileFilter()); assetFileLoader.setPermissions(config.getModulePermissions()); return assetFileLoader; @@ -148,20 +136,6 @@ boolean isHarmonizeRestDir(Path dir) { return dir.endsWith("REST") && dir.toString().matches(".*[/\\\\]harmonize[/\\\\].*"); } - boolean isEntityDir(Path dir, Path startPath) { - String dirStr = dir.toString(); - String startPathStr = Pattern.quote(startPath.toString()); - String regex = startPathStr + "[/\\\\][^/\\\\]+$"; - return dirStr.matches(regex); - } - - boolean isMappingDir(Path dir, Path startPath) { - String dirStr = dir.toString(); - String startPathStr = Pattern.quote(startPath.toString()); - String regex = startPathStr + "[/\\\\][^/\\\\]+$"; - return dirStr.matches(regex); - } - boolean isFlowPropertiesFile(Path dir) { Path parent = dir.getParent(); return dir.toFile().isFile() && @@ -217,14 +191,6 @@ public void execute(CommandContext context) { modulesLoader.loadModules("classpath*:/ml-modules-final", new SearchOptionsFinder(), finalClient); } - //for now we'll use two different document managers - JSONDocumentManager finalEntityDocMgr = finalClient.newJSONDocumentManager(); - JSONDocumentManager stagingEntityDocMgr = stagingClient.newJSONDocumentManager(); - JSONDocumentManager finalMappingDocMgr = finalClient.newJSONDocumentManager(); - JSONDocumentManager stagingMappingDocMgr = stagingClient.newJSONDocumentManager(); - DocumentWriteSet finalMappingDocumentWriteSet = finalMappingDocMgr.newWriteSet(); - DocumentWriteSet stagingMappingDocumentWriteSet = stagingMappingDocMgr.newWriteSet(); - AllButAssetsModulesFinder allButAssetsModulesFinder = new AllButAssetsModulesFinder(); Path dir = Paths.get(hubConfig.getHubProject().getProjectDirString(), HubConfig.ENTITY_CONFIG_DIR); @@ -258,25 +224,6 @@ else if (isHarmonizeRestDir(dir)) { modulesLoader.loadModules(currentDir, allButAssetsModulesFinder, finalClient); return FileVisitResult.SKIP_SUBTREE; } - else if (isEntityDir(dir, startPath.toAbsolutePath())) { - Modules modules = new EntityDefModulesFinder().findModules(dir.toString()); - DocumentMetadataHandle meta = new DocumentMetadataHandle(); - meta.getCollections().add("http://marklogic.com/entity-services/models"); - documentPermissionsParser.parsePermissions(hubConfig.getModulePermissions(), meta.getPermissions()); - for (Resource r : modules.getAssets()) { - if (forceLoad || modulesManager.hasFileBeenModifiedSinceLastLoaded(r.getFile())) { - InputStream inputStream = r.getInputStream(); - StringHandle handle = new StringHandle(IOUtils.toString(inputStream)); - inputStream.close(); - finalEntityDocMgr.write("/entities/" + r.getFilename(), meta, handle); - - // Uncomment to send entity model to staging db as well - stagingEntityDocMgr.write("/entities/" + r.getFilename(), meta, handle); - modulesManager.saveLastLoadedTimestamp(r.getFile(), new Date()); - } - } - return FileVisitResult.CONTINUE; - } else { return FileVisitResult.CONTINUE; } @@ -287,7 +234,7 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { if (isFlowPropertiesFile(file) && modulesManager.hasFileBeenModifiedSinceLastLoaded(file.toFile())) { - Flow flow = flowManager.getFlowFromProperties(file); + LegacyFlow flow = flowManager.getFlowFromProperties(file); StringHandle handle = new StringHandle(flow.serialize()); handle.setFormat(Format.XML); documentWriteSet.add(flow.getFlowDbPath(), handle); @@ -296,58 +243,9 @@ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) return FileVisitResult.CONTINUE; } }); - - //now let's do the mappings path - if (mappingPath.toFile().exists()) { - Files.walkFileTree(mappingPath, new SimpleFileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { - String currentDir = dir.normalize().toAbsolutePath().toString(); - - if (isMappingDir(dir, mappingPath.toAbsolutePath())) { - Modules modules = new MappingDefModulesFinder().findModules(dir.toString()); - DocumentMetadataHandle meta = new DocumentMetadataHandle(); - meta.getCollections().add("http://marklogic.com/data-hub/mappings"); - documentPermissionsParser.parsePermissions(hubConfig.getModulePermissions(), meta.getPermissions()); - for (Resource r : modules.getAssets()) { - if (forceLoad || modulesManager.hasFileBeenModifiedSinceLastLoaded(r.getFile())) { - InputStream inputStream = r.getInputStream(); - StringHandle handle = new StringHandle(IOUtils.toString(inputStream)); - inputStream.close(); - finalMappingDocumentWriteSet.add("/mappings/" + r.getFile().getParentFile().getName() + "/" + r.getFilename(), meta, handle); - stagingMappingDocumentWriteSet.add("/mappings/" + r.getFile().getParentFile().getName() + "/" + r.getFilename(), meta, handle); - modulesManager.saveLastLoadedTimestamp(r.getFile(), new Date()); - } - } - return FileVisitResult.CONTINUE; - } else { - return FileVisitResult.CONTINUE; - } - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - if (isFlowPropertiesFile(file) && modulesManager.hasFileBeenModifiedSinceLastLoaded(file.toFile())) { - Flow flow = flowManager.getFlowFromProperties(file); - StringHandle handle = new StringHandle(flow.serialize()); - handle.setFormat(Format.XML); - documentWriteSet.add(flow.getFlowDbPath(), handle); - modulesManager.saveLastLoadedTimestamp(file.toFile(), new Date()); - } - return FileVisitResult.CONTINUE; - } - }); - } - if (documentWriteSet.size() > 0) { documentManager.write(documentWriteSet); } - - if (stagingMappingDocumentWriteSet.size() > 0) { - finalMappingDocMgr.write(finalMappingDocumentWriteSet); - stagingMappingDocMgr.write(stagingMappingDocumentWriteSet); - } } threadPoolTaskExecutor.shutdown(); } catch (IOException e) { diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/CMASettings.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/CMASettings.java new file mode 100644 index 0000000000..555235418d --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/CMASettings.java @@ -0,0 +1,62 @@ +package com.marklogic.hub.deploy.util; + +import com.marklogic.appdeployer.AppConfig; +import com.marklogic.hub.impl.Versions; +import org.apache.commons.lang3.StringUtils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.GregorianCalendar; + +public class CMASettings { + private String mlVersion = null; + private static CMASettings cmaSettings = null; + + public static synchronized CMASettings getInstance() { + if (cmaSettings == null) { + cmaSettings = new CMASettings(); + } + return cmaSettings; + } + + public void setCmaSettings(AppConfig appConfig) { + if (mlVersion == null) { + this.mlVersion = new Versions(appConfig).getMarkLogicVersion(); + } + + int major = Integer.parseInt(mlVersion.replaceAll("([^.]+)\\..*", "$1")); + + boolean isNightly = mlVersion.matches("[^-]+-(\\d{4})(\\d{2})(\\d{2})"); + if (major == 9) { + String alteredString = mlVersion.replaceAll("[^\\d]+", ""); + if (alteredString.length() < 4) { + alteredString = StringUtils.rightPad(alteredString, 4, "0"); + } + int ver = Integer.parseInt(alteredString.substring(0, 4)); + if (!isNightly && ver >= 9050 ) { + appConfig.setDeployForestsWithCma(true); + appConfig.setDeployPrivilegesWithCma(true); + } + if (!isNightly && ver >= 9060 ) { + appConfig.setDeployAmpsWithCma(true); + } + } + //Setting all true for nightly build after 07/01/2018 + if (isNightly) { + String dateString = mlVersion.replaceAll("[^-]+-(\\d{4})(\\d{2})(\\d{2})", "$1-$2-$3"); + Date minDate = new GregorianCalendar(2018, 6, 1).getTime(); + Date date = null; + try { + date = new SimpleDateFormat("y-M-d").parse(dateString); + } catch (ParseException e) { + throw new RuntimeException("Unable to set CMA settings for nightly build"); + } + if (date.after(minDate)) { + appConfig.setDeployForestsWithCma(true); + appConfig.setDeployPrivilegesWithCma(true); + appConfig.setDeployAmpsWithCma(true); + } + } + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/EntityDeploymentUtil.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/EntityDeploymentUtil.java new file mode 100644 index 0000000000..fab982559a --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/EntityDeploymentUtil.java @@ -0,0 +1,101 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.marklogic.hub.deploy.util; + +import com.marklogic.client.datamovement.WriteEvent; +import com.marklogic.client.io.DocumentMetadataHandle; +import com.marklogic.client.io.marker.AbstractWriteHandle; +import com.marklogic.client.io.marker.DocumentMetadataWriteHandle; +import com.marklogic.client.io.marker.JSONWriteHandle; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/* + * Singleton to aid with Entity deployment. Needed as bridge between walking the entities file structure + * on modules deploy and inserting entity JSON models in the database after triggers are created. + */ +public class EntityDeploymentUtil { + private ConcurrentHashMap metaMap = new ConcurrentHashMap(); + private ConcurrentHashMap contentMap = new ConcurrentHashMap(); + + private static EntityDeploymentUtil instance; + + public static synchronized EntityDeploymentUtil getInstance() { + if(instance == null){ + instance = new EntityDeploymentUtil(); + } + return instance; + } + + public Set getEntityURIs() { + return contentMap.keySet(); + } + + public void enqueueEntity(String uri, DocumentMetadataHandle meta, JSONWriteHandle content) { + metaMap.put(uri, meta); + contentMap.put(uri, content); + } + + public WriteEvent dequeueEntity(String uri) { + DocumentMetadataHandle meta = metaMap.get(uri); + JSONWriteHandle content = contentMap.get(uri); + return new WriteEventImpl(uri, meta, content); + } + + public void reset() { + metaMap.clear(); + contentMap.clear(); + } + + private class WriteEventImpl implements WriteEvent { + private String uri; + private DocumentMetadataHandle meta; + private JSONWriteHandle content; + + public WriteEventImpl(String uri, DocumentMetadataHandle meta, JSONWriteHandle content) { + this.uri = uri; + this.meta = meta; + this.content = content; + } + + @Override + public String getTargetUri() { + return uri; + } + + @Override + public AbstractWriteHandle getContent() { + return content; + } + + @Override + public DocumentMetadataWriteHandle getMetadata() { + return meta; + } + + @Override + public long getJobRecordNumber() { + return 0; + } + + @Override + public long getBatchRecordNumber() { + return 0; + } + } + +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/HubDeployStatusListener.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/HubDeployStatusListener.java index fa70a4eca7..8c4d7d2bd4 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/HubDeployStatusListener.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/HubDeployStatusListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/HubFileFilter.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/HubFileFilter.java index 5dc8b18768..2b2482e5f7 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/HubFileFilter.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/deploy/util/HubFileFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ public boolean accept(File f) { boolean result = f != null && !f.getName().startsWith(".") && !f.getName().endsWith("entity.json") && + !f.getName().endsWith("mapping.json") && !f.getName().equals(f.getParentFile().getName() + ".properties") && !f.toString().matches(".*[/\\\\]REST[/\\\\].*") && diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/AbstractEntity.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/AbstractEntity.java deleted file mode 100644 index 7e30d8fd26..0000000000 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/AbstractEntity.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2012-2018 MarkLogic Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.marklogic.hub.entity; - -import com.marklogic.hub.FlowManager; -import com.marklogic.hub.flow.Flow; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -import java.util.ArrayList; -import java.util.List; - -/** - * Abstract Base class for entities - */ -public abstract class AbstractEntity implements Entity { - - private String name; - private ArrayList flows = new ArrayList(); - - public AbstractEntity(Element xml) { - deserialize(xml); - } - - public AbstractEntity(String name) { - this.name = name; - } - - private void deserialize(Node xml) { - NodeList children = xml.getChildNodes(); - for (int i = 0; i < children.getLength(); i++) { - Node node = children.item(i); - if (node.getNodeType() != Node.ELEMENT_NODE) { - continue; - } - - String nodeName = node.getLocalName(); - switch(nodeName) { - case "name": - this.name = node.getTextContent(); - break; - case "flows": - deserialize(node); - break; - case "flow": - flows.add(FlowManager.flowFromXml((Element)node)); - break; - } - } - } - - @Override - public String getName() { - return name; - } - - @Override - public String serialize() { - return null; - } - - @Override - public List getFlows() { - return flows; - } - -} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/DefinitionType.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/DefinitionType.java new file mode 100644 index 0000000000..67767f9de9 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/DefinitionType.java @@ -0,0 +1,214 @@ +/* + * Copyright 2012-2018 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.marklogic.hub.entity; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class DefinitionType extends JsonPojo { + protected String name; + protected String description; + protected String primaryKey; + protected List required; + protected List pii; + protected List elementRangeIndex; + protected List rangeIndex; + protected List wordLexicon; + + protected List properties; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getPrimaryKey() { + return primaryKey; + } + + public void setPrimaryKey(String primaryKey) { + this.primaryKey = primaryKey; + } + + public List getRequired() { + return required; + } + + public void setRequired(List required) { + this.required = required; + } + + public List getPii() { + return pii; + } + + public void setPii(List pii) { + this.pii = pii; + } + + public List getRangeIndex() { + return rangeIndex; + } + + public void setRangeIndex(List rangeIndex) { + this.rangeIndex = rangeIndex; + } + + public List getElementRangeIndex() { + return elementRangeIndex; + } + + public void setElementRangeIndex(List elementRangeIndex) { + this.elementRangeIndex = elementRangeIndex; + } + + public List getWordLexicon() { + return wordLexicon; + } + + public void setWordLexicon(List wordLexicon) { + this.wordLexicon = wordLexicon; + } + + public List getProperties() { + return properties; + } + + public void setProperties(List properties) { + this.properties = properties; + } + + public static DefinitionType fromJson(String name, JsonNode node) { + DefinitionType definitionType = new DefinitionType(); + definitionType.setName(name); + + definitionType.setDescription(getValue(node, "description")); + definitionType.setPrimaryKey(getValue(node, "primaryKey")); + + ArrayList required = new ArrayList<>(); + JsonNode requiredNodes = node.get("required"); + if (requiredNodes != null) { + for (final JsonNode n : requiredNodes) { + required.add(n.asText()); + } + } + definitionType.setRequired(required); + + ArrayList pii = new ArrayList<>(); + JsonNode piiNodes = node.get("pii"); + if (piiNodes != null) { + for (final JsonNode n : piiNodes) { + pii.add(n.asText()); + } + } + definitionType.setPii(pii); + + ArrayList elementRangeIndexes = new ArrayList<>(); + JsonNode elementRangeIndexNodes = node.get("elementRangeIndex"); + if (elementRangeIndexNodes != null) { + for (final JsonNode n : elementRangeIndexNodes) { + elementRangeIndexes.add(n.asText()); + } + } + definitionType.setElementRangeIndex(elementRangeIndexes); + + ArrayList rangeIndexes = new ArrayList<>(); + JsonNode rangeIndexNodes = node.get("rangeIndex"); + if (rangeIndexNodes != null) { + for (final JsonNode n : rangeIndexNodes) { + rangeIndexes.add(n.asText()); + } + } + definitionType.setRangeIndex(rangeIndexes); + + ArrayList wordLexicons = new ArrayList<>(); + JsonNode wordLexiconNodes = node.get("wordLexicon"); + if (wordLexiconNodes != null) { + for (final JsonNode n : wordLexiconNodes) { + wordLexicons.add(n.asText()); + } + } + definitionType.setWordLexicon(wordLexicons); + + ArrayList properties = new ArrayList<>(); + JsonNode propertiesNode = node.get("properties"); + if (propertiesNode != null) { + Iterator fieldItr = propertiesNode.fieldNames(); + while(fieldItr.hasNext()) { + String key = fieldItr.next(); + JsonNode propertyNode = propertiesNode.get(key); + if (propertyNode != null) { + properties.add(PropertyType.fromJson(key, propertyNode)); + } + } + } + definitionType.setProperties(properties); + + return definitionType; + } + + public JsonNode toJson() { + ObjectNode node = JsonNodeFactory.instance.objectNode(); + writeStringIf(node, "description", description); + writeStringIf(node, "primaryKey", primaryKey); + + ArrayNode requiredArray = JsonNodeFactory.instance.arrayNode(); + required.forEach(requiredArray::add); + node.set("required", requiredArray); + + ArrayNode piiArray = JsonNodeFactory.instance.arrayNode(); + pii.forEach(piiArray::add); + node.set("pii", piiArray); + + ArrayNode elementRangeIndexArray = JsonNodeFactory.instance.arrayNode(); + elementRangeIndex.forEach(elementRangeIndexArray ::add); + node.set("elementRangeIndex", elementRangeIndexArray); + + ArrayNode rangeIndexArray = JsonNodeFactory.instance.arrayNode(); + rangeIndex.forEach(rangeIndexArray ::add); + node.set("rangeIndex", rangeIndexArray); + + ArrayNode wordLexiconArray = JsonNodeFactory.instance.arrayNode(); + wordLexicon.forEach(wordLexiconArray::add); + node.set("wordLexicon", wordLexiconArray); + + ObjectNode propertiesObj = JsonNodeFactory.instance.objectNode(); + + for (PropertyType prop : properties) { + propertiesObj.set(prop.getName(), prop.toJson()); + } + node.set("properties", propertiesObj); + return node; + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/DefinitionsType.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/DefinitionsType.java new file mode 100644 index 0000000000..2451132077 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/DefinitionsType.java @@ -0,0 +1,43 @@ +package com.marklogic.hub.entity; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import java.util.HashMap; +import java.util.Map; + +public class DefinitionsType extends JsonPojo { + protected Map definitions; + + public Map getDefinitions() { + if (definitions == null) { + definitions = new HashMap<>(); + } + return this.definitions; + } + + public void addDefinition(String name, DefinitionType definitionType) { + getDefinitions().put(name, definitionType); + } + + public void removeDefinition(String name) { + getDefinitions().remove(name); + } + + public static DefinitionsType fromJson(JsonNode json) { + DefinitionsType definitionsType = new DefinitionsType(); + json.fields().forEachRemaining((Map.Entry field) -> { + definitionsType.addDefinition(field.getKey(), DefinitionType.fromJson(field.getKey(), field.getValue())); + }); + return definitionsType; + } + + public JsonNode toJson() { + ObjectNode node = JsonNodeFactory.instance.objectNode(); + this.getDefinitions().forEach((definitionName, definitionType) -> { + node.set(definitionName, definitionType.toJson()); + }); + return node; + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/Entity.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/Entity.java deleted file mode 100644 index e217934d87..0000000000 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/Entity.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2012-2018 MarkLogic Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.marklogic.hub.entity; - -import com.marklogic.hub.flow.Flow; - -import java.util.List; - -/** - * Entity interface, holds basics about a defined entity object - */ -public interface Entity { - /** - * Gets the Entity name - * - * @return the entity name - */ - String getName(); - - /** - * Serializes the Entity as an XML string - * - * @return the serialized XML string - */ - String serialize(); - - /** - * Returns all flows registered to the entity - * - * @return a list of flows - */ - List getFlows(); -} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/HubEntity.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/HubEntity.java new file mode 100644 index 0000000000..541325b458 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/HubEntity.java @@ -0,0 +1,73 @@ +/* + * Copyright 2012-2018 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.marklogic.hub.entity; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + + +public class HubEntity extends JsonPojo { + + protected String filename; + protected InfoType info; + protected DefinitionsType definitions; + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public InfoType getInfo() { + return info; + } + + public void setInfo(InfoType info) { + this.info = info; + } + + public DefinitionsType getDefinitions() { + return definitions; + } + + public void setDefinitions(DefinitionsType definition) { + this.definitions = definition; + } + + + @Override + public JsonNode toJson() { + ObjectNode node = JsonNodeFactory.instance.objectNode(); + writeObjectIf(node, "info", info); + + node.set("definitions",definitions.toJson()); + + return node; + } + + public static HubEntity fromJson(String filename, JsonNode node) { + HubEntity hubEntity = new HubEntity(); + hubEntity.setFilename(filename); + hubEntity.setInfo(InfoType.fromJson(node.get("info"))); + + String title = hubEntity.getInfo().getTitle(); + hubEntity.setDefinitions(DefinitionsType.fromJson(node.get("definitions"))); + return hubEntity; + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/InfoType.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/InfoType.java new file mode 100644 index 0000000000..e68ad78e63 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/InfoType.java @@ -0,0 +1,144 @@ +/* + * Copyright 2012-2018 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.marklogic.hub.entity; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public class InfoType extends JsonPojo { + + protected String title; + protected String version; + protected String baseUri; + protected String description; + + /** + * Gets the value of the title property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getTitle() { + return title; + } + + /** + * Sets the value of the title property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setTitle(String value) { + this.title = value; + } + + /** + * Gets the value of the version property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getVersion() { + return version; + } + + /** + * Sets the value of the version property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setVersion(String value) { + this.version = value; + } + + /** + * Gets the value of the baseUri property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getBaseUri() { + return baseUri; + } + + /** + * Sets the value of the baseUri property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setBaseUri(String value) { + this.baseUri = value; + } + + /** + * Gets the value of the description property. + * + * @return + * possible object is + * {@link String } + * + */ + public String getDescription() { + return description; + } + + /** + * Sets the value of the description property. + * + * @param value + * allowed object is + * {@link String } + * + */ + public void setDescription(String value) { + this.description = value; + } + + public static InfoType fromJson(JsonNode node) { + InfoType infoType = new InfoType(); + infoType.title = getValue(node, "title"); + infoType.version = getValue(node, "version"); + infoType.baseUri = getValue(node, "baseUri"); + infoType.description = getValue(node, "description"); + return infoType; + } + + public JsonNode toJson() { + ObjectNode node = JsonNodeFactory.instance.objectNode(); + writeStringIf(node, "title", title); + writeStringIf(node, "version", version); + writeStringIf(node, "baseUri", baseUri); + writeStringIf(node, "description", description); + return node; + } + +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/ItemType.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/ItemType.java new file mode 100644 index 0000000000..69bc1a053f --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/ItemType.java @@ -0,0 +1,77 @@ +/* + * Copyright 2012-2018 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.marklogic.hub.entity; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public class ItemType extends JsonPojo { + @JsonProperty(value = "$ref") + protected String ref; + protected String datatype; + protected String collation; + + public String getRef() { + return ref; + } + + public void setRef(String ref) { + this.ref = ref; + } + + public String getDatatype() { + return datatype; + } + + public void setDatatype(String datatype) { + this.datatype = datatype; + } + + public String getCollation() { + return collation; + } + + public void setCollation(String collation) { + this.collation = collation; + } + + public boolean hasValues() { + return ( + (ref != null && !ref.isEmpty()) || + (datatype != null && !datatype.isEmpty()) || + (collation != null && !collation.isEmpty()) + ); + } + + public static ItemType fromJson(JsonNode node) { + ItemType itemType = new ItemType(); + itemType.setRef(getValue(node, "$ref")); + itemType.setDatatype(getValue(node, "datatype")); + itemType.setCollation(getValue(node, "collation")); + return itemType; + } + + public JsonNode toJson() { + ObjectNode node = JsonNodeFactory.instance.objectNode(); + writeStringIf(node, "$ref", ref); + writeStringIf(node, "datatype", datatype); + writeStringIf(node, "collation", collation); + return node; + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/JsonPojo.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/JsonPojo.java new file mode 100644 index 0000000000..8439c02ed8 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/JsonPojo.java @@ -0,0 +1,66 @@ +/* + * Copyright 2012-2018 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.marklogic.hub.entity; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.NullNode; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public abstract class JsonPojo { + + protected static String getValue(JsonNode node, String key) { + String value = null; + JsonNode n = node.get(key); + if (n != null && !(n instanceof NullNode)) { + value = n.asText(); + } + return value; + } + + protected static Integer getIntValue(JsonNode node, String key) { + return getIntValue(node, key, null); + } + + protected static Integer getIntValue(JsonNode node, String key, Integer defaultValue) { + Integer value = defaultValue; + JsonNode n = node.get(key); + if (n != null && !(n instanceof NullNode)) { + value = n.asInt(); + } + return value; + } + + public abstract JsonNode toJson(); + + protected static void writeObjectIf(ObjectNode node, String key, JsonPojo o) { + if (o != null) { + node.set(key, o.toJson()); + } + } + + protected static void writeStringIf(ObjectNode node, String key, String value) { + if (value != null) { + node.put(key, value); + } + } + + protected static void writeNumberIf(ObjectNode node, String key, Integer value) { + if (value != null) { + node.put(key, value); + } + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/PropertyType.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/PropertyType.java new file mode 100644 index 0000000000..b40046d8a5 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/entity/PropertyType.java @@ -0,0 +1,114 @@ +/* + * Copyright 2012-2018 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.marklogic.hub.entity; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + +public class PropertyType extends JsonPojo { + + protected String name; + protected String datatype; + protected String description; + + @JsonProperty(value="$ref") + protected String ref; + + protected String collation; + + ItemType items; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDatatype() { + return datatype; + } + + public void setDatatype(String datatype) { + this.datatype = datatype; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getRef() { + return ref; + } + + public void setRef(String ref) { + this.ref = ref; + } + + public String getCollation() { + return collation; + } + + public void setCollation(String collation) { + this.collation = collation; + } + + public ItemType getItems() { + return items; + } + + public void setItems(ItemType items) { + this.items = items; + } + + public static PropertyType fromJson(String name, JsonNode defs) { + PropertyType propertyType = new PropertyType(); + propertyType.name = name; + propertyType.datatype = getValue(defs, "datatype"); + propertyType.description = getValue(defs, "description"); + propertyType.ref = getValue(defs, "$ref"); + propertyType.collation = getValue(defs, "collation"); + + JsonNode itemsNode = defs.get("items"); + if (itemsNode != null) { + propertyType.setItems(ItemType.fromJson(itemsNode)); + } + return propertyType; + } + + public JsonNode toJson() { + ObjectNode node = JsonNodeFactory.instance.objectNode(); + + writeStringIf(node, "datatype", datatype); + writeStringIf(node, "description", description); + writeStringIf(node, "$ref", ref); + writeStringIf(node, "collation", collation); + + if (items != null && items.hasValues()) { + node.set("items", items.toJson()); + } + + return node; + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/CantUpgradeException.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/CantUpgradeException.java index 39758a43c3..31e8e62a46 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/CantUpgradeException.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/CantUpgradeException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/DataHubConfigurationException.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/DataHubConfigurationException.java index 4696d6fcda..18f9738e05 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/DataHubConfigurationException.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/DataHubConfigurationException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/DataHubProjectException.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/DataHubProjectException.java index e65dacb161..6ef6e135f9 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/DataHubProjectException.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/DataHubProjectException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/EntityServicesGenerationException.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/EntityServicesGenerationException.java index 41ce0ccbc0..6bb8a20c87 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/EntityServicesGenerationException.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/EntityServicesGenerationException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/InvalidDBOperationError.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/InvalidDBOperationError.java index d11c8ac8f9..2153110566 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/InvalidDBOperationError.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/InvalidDBOperationError.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/LegacyFlowsException.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/LegacyFlowsException.java index 69d0c9007e..388dd50424 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/LegacyFlowsException.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/LegacyFlowsException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/ScaffoldingValidationException.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/ScaffoldingValidationException.java index 72abe0b61f..8ceb803855 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/ScaffoldingValidationException.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/ScaffoldingValidationException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/ServerValidationException.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/ServerValidationException.java index aeb6dfae06..98be8bc1f3 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/error/ServerValidationException.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/error/ServerValidationException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/Flow.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/Flow.java index a3d95c058d..3283f4d569 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/Flow.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/Flow.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,127 +15,35 @@ */ package com.marklogic.hub.flow; -import com.marklogic.hub.collector.Collector; -import com.marklogic.hub.main.MainPlugin; +import com.fasterxml.jackson.databind.JsonNode; -import java.util.Properties; - -/** - * Manages the creation and configuration of flow objects - */ public interface Flow { - - /** - * Sets the entity name for the flow - * @param entityName the string name of the entity to use in the flow - */ - void setEntityName(String entityName); - - /** - * Returns the name of the entity that's been set for the flow in strong form - * @return entity name in string form - */ - String getEntityName(); - - /** - * Sets the name of the flow - * @param name - string representing the name of the flow - */ - void setName(String name); - /** - * Gets the name of the flow - * @return the name of the flow in string form + * Returns the name of the flow + * + * @return a flow name */ String getName(); /** - * Sets the mapping name used to generate the flow - * @param mappingName - string representing the mapping name for the flow - */ - void setMappingName(String mappingName); - - /** - * Gets the mapping name used for the flow - * @return the mapping name of the flow in string form - */ - String getMappingName(); - - /** - * Sets the type of the flow - * @param type - FlowType enum for harmonize or input - */ - void setType(FlowType type); - - /** - * Gets the FlowType enum for the flow - * @return FlowType of ingest or harmonize - */ - FlowType getType(); - - /** - * Sets the DataFormat for the flow - * @param dataFormat - DataFormat enum of json or xml - */ - void setDataFormat(DataFormat dataFormat); - - /** - * Returns the DataForm enum of the flow - * @return DataForm enum of json or xml - */ - DataFormat getDataFormat(); - - /** - * Sets the CodeFormat enum of the flow - * @param codeFormat enum of sjs or xqy - */ - void setCodeFormat(CodeFormat codeFormat); - - /** - * Returns the CodeFormat enum of the flow - * @return CodeFormat enum of sjs or xqy + * Sets the name of the flow + * + * @param flowName - a flow name */ - CodeFormat getCodeFormat(); + void setName(String flowName); /** - * Serializes the flow into an xml string - * @return a serialized xml string of the flow + * Serializes the flow as a json string + * + * @return the serialized JSON string */ String serialize(); /** - * Creates a properties object representing the flow - * @return a Properties object representation of the flow - */ - Properties toProperties(); - - /** - * Gets the DbPath (uri) for the flow in string form - * @return a uri path as a string - */ - String getFlowDbPath(); - - /** - * Gets the collector to be used for the flow - * @return the collector object that is used for the flow - */ - Collector getCollector(); - - /** - * Sets the collector to be used for the flow - * @param collector the collector to be used for the flow - */ - void setCollector(Collector collector); - - /** - * Gets the main plugin module that the flow is set to use - * @return MainPlugin object - */ - MainPlugin getMain(); - - /** - * Sets the main plugin module for the flow - * @param main - a MainPlugin object that defines the main plugin to be used + * Deserialize a json response and applies it to this flow + * + * @param json - the JsonNode you want deserialize + * @return this mapping */ - void setMain(MainPlugin main); + Flow deserialize(JsonNode json); } diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowImpl.java new file mode 100644 index 0000000000..81f1bc8a0f --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowImpl.java @@ -0,0 +1,63 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.marklogic.hub.flow; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.marklogic.hub.error.DataHubProjectException; + +public class FlowImpl implements Flow { + private String name; + // Storing the entire JSON node for serialization; + private JsonNode rawValue; + + public String getName() { return this.name; } + + public void setName(String flowName) { this.name = flowName; } + + @Override + public String serialize() { + ObjectMapper mapper = new ObjectMapper(); + // Using this approach, as we aren't de-serializing all data into Java Objects + if (rawValue != null) { + ObjectNode objNode = mapper.createObjectNode(); + rawValue.fields().forEachRemaining((field) -> { + objNode.set(field.getKey(), field.getValue()); + }); + // Setters should be serialized into JSON + objNode.put("name", this.name); + return objNode.toString(); + } else { + try { + return mapper.writeValueAsString(this); + } + catch (JsonProcessingException e) { + throw new DataHubProjectException("Unable to serialize flow object."); + } + } + } + + @Override + public Flow deserialize(JsonNode json) { + this.rawValue = json; + if (json.has("name")) { + setName(json.get("name").asText()); + } + return this; + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/DataHubImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/DataHubImpl.java index bdf954d249..3979403b8c 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/DataHubImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/DataHubImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,8 +42,10 @@ import com.marklogic.hub.*; import com.marklogic.hub.deploy.HubAppDeployer; import com.marklogic.hub.deploy.commands.*; +import com.marklogic.hub.deploy.util.CMASettings; import com.marklogic.hub.deploy.util.HubDeployStatusListener; import com.marklogic.hub.error.*; +import com.marklogic.hub.legacy.impl.LegacyFlowManagerImpl; import com.marklogic.mgmt.ManageClient; import com.marklogic.mgmt.admin.AdminManager; import com.marklogic.mgmt.resource.appservers.ServerManager; @@ -66,6 +68,8 @@ import javax.annotation.PostConstruct; import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.util.*; @@ -91,13 +95,13 @@ public class DataHubImpl implements DataHub { private LoadUserModulesCommand loadUserModulesCommand; @Autowired - private DeployHubAmpsCommand deployHubAmpsCommand; + private LoadUserArtifactsCommand loadUserArtifactsCommand; @Autowired private Versions versions; @Autowired - private FlowManagerImpl flowManager; + private LegacyFlowManagerImpl flowManager; private AdminManager _adminManager; @@ -491,10 +495,12 @@ public void install(HubDeployStatusListener listener) { throw new DataHubConfigurationException(e); } } + AppConfig appConfig = hubConfig.getAppConfig(); + CMASettings.getInstance().setCmaSettings(appConfig); HubAppDeployer finalDeployer = new HubAppDeployer(getManageClient(), getAdminManager(), listener, hubConfig.newStagingClient()); finalDeployer.setCommands(buildListOfCommands()); - finalDeployer.deploy(hubConfig.getAppConfig()); + finalDeployer.deploy(appConfig); } /** @@ -549,10 +555,14 @@ public void uninstall() { @Override public void uninstall(HubDeployStatusListener listener) { logger.warn("Uninstalling the Data Hub and Final Databases/Servers from MarkLogic"); + List commandMap = buildListOfCommands(); + + AppConfig appConfig = hubConfig.getAppConfig(); + CMASettings.getInstance().setCmaSettings(appConfig); HubAppDeployer finalDeployer = new HubAppDeployer(getManageClient(), getAdminManager(), listener, hubConfig.newStagingClient()); - finalDeployer.setCommands(buildListOfCommands()); - finalDeployer.undeploy(hubConfig.getAppConfig()); + finalDeployer.setCommands(commandMap); + finalDeployer.undeploy(appConfig); } private void runInDatabase(String query, String databaseName) { @@ -571,20 +581,10 @@ private void runInDatabase(String query, String databaseName) { public Map> buildCommandMap() { Map> commandMap = new CommandMapBuilder().buildCommandMap(); - /** - * This kept separate from mlSecurityCommands because hub amps are stored in the DHF jar, while the commands - * in the mlSecurityCommands list deploy resources defined by users. - */ - List hubAmpsCommands = new ArrayList<>(); - hubAmpsCommands.add(deployHubAmpsCommand); - commandMap.put("mlHubAmpsCommand", hubAmpsCommands); - updateDatabaseCommandList(commandMap); updateServerCommandList(commandMap); - updateSchemaCommandList(commandMap); - updateModuleCommandList(commandMap); // DHF has no use case for the "deploy REST API server" commands provided by ml-gradle @@ -642,19 +642,6 @@ private void updateServerCommandList(Map> commandMap) { commandMap.put(key, newCommands); } - /** - * The existing "LoadSchemasCommand" is based on the ml-config path and the AppConfig object should set the default - * schemas database name to that of the final schemas database. Thus, we just need to add a hub-specific command for - * loading staging schemas from a different path and into the staging schemas database. - * - * @param commandMap - */ - private void updateSchemaCommandList(Map> commandMap) { - List commands = commandMap.get("mlSchemaCommands"); - final String hubSchemasPath = hubConfig.getHubConfigDir().resolve("schemas").toString(); - commands.add(new LoadHubSchemasCommand(hubSchemasPath, hubConfig.getStagingSchemasDbName())); - } - /** * This affects what mlLoadModules does. We want it to load all modules, including hub modules. This supports a * scenario where a user may clear her modules database; mlLoadModules should then load everything in. @@ -665,6 +652,7 @@ private void updateModuleCommandList(Map> commandsMap) { List commands = new ArrayList(); commands.add(loadHubModulesCommand); commands.add(loadUserModulesCommand); + commands.add(loadUserArtifactsCommand); for (Command c : commandsMap.get("mlModuleCommands")) { if (c instanceof LoadModulesCommand) { @@ -822,7 +810,8 @@ public boolean upgradeHub(List updatedFlows) throws CantUpgradeException throw new CantUpgradeException(currentVersion, MIN_UPGRADE_VERSION); } boolean result = false; - boolean alreadyInitialized = project.isInitialized(); + boolean alreadyInitialized = project.isInitialized(); + String gradleVersion = versions.getDHFVersion(); try { /*Ideally this should move to HubProject.upgradeProject() method * But since it requires 'hubConfig' and 'versions', for now @@ -830,7 +819,7 @@ public boolean upgradeHub(List updatedFlows) throws CantUpgradeException */ if(alreadyInitialized) { // The version provided in "mlDHFVersion" property in gradle.properties. - String gradleVersion = versions.getDHFVersion(); + File buildGradle = Paths.get(project.getProjectDirString(), "build.gradle").toFile(); // Back up the hub-internal-config and user-config directories in versions > 4.0 @@ -853,6 +842,28 @@ public boolean upgradeHub(List updatedFlows) throws CantUpgradeException } hubConfig.initHubProject(); + + /* DHFPROD- 1694 + Copy contents from hub-internal-config-version/schemas to ml-config/databases//schemas + This has to be done in DataHubImpl as we require HubConfigImpl for getting the staging schemas db name + */ + if(alreadyInitialized) { + Path sourceSchemasDir = project.getProjectDir().resolve(HubProject.HUB_CONFIG_DIR + "-" + gradleVersion).resolve("schemas"); + Path destSchemasDir = project.getUserDatabaseDir().resolve(hubConfig.getStagingSchemasDbName()).resolve("schemas"); + if (sourceSchemasDir.toFile().exists()) { + Files.walk(Paths.get(sourceSchemasDir.toUri())) + .filter(f -> !Files.isDirectory(f)) + .forEach(f -> { + try { + FileUtils.copyInputStreamToFile(Files.newInputStream(f), destSchemasDir.resolve(sourceSchemasDir.relativize(f)).toFile()); + } catch (IOException e) { + logger.error("Unable to copy file " + f.getFileName()); + throw new RuntimeException(e); + } + }); + + } + } //now let's try to upgrade the directory structure hubConfig.getHubProject().upgradeProject(); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/EntityManagerImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/EntityManagerImpl.java index 3ebaf6ac40..938ab6ff3c 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/EntityManagerImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/EntityManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +33,9 @@ import com.marklogic.hub.EntityManager; import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubProject; +import com.marklogic.hub.entity.HubEntity; import com.marklogic.hub.error.EntityServicesGenerationException; +import com.marklogic.hub.util.FileUtil; import com.marklogic.hub.util.HubModuleManager; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -243,6 +245,85 @@ private List getModifiedRawEntities(long minimumFileTimestampToLoad) { return entities; } + public List getEntities() { + List entities = new ArrayList<>(); + Path entitiesPath = hubConfig.getHubEntitiesDir(); + List entityNames = FileUtil.listDirectFolders(entitiesPath.toFile()); + ObjectMapper objectMapper = new ObjectMapper(); + for (String entityName : entityNames) { + File[] entityDefs = entitiesPath.resolve(entityName).toFile().listFiles((dir, name) -> name.endsWith(ENTITY_FILE_EXTENSION)); + for (File entityDef : entityDefs) { + try { + FileInputStream fileInputStream = new FileInputStream(entityDef); + JsonNode node = objectMapper.readTree(fileInputStream); + entities.add(HubEntity.fromJson(entityDef.getAbsolutePath(), node)); + fileInputStream.close(); + } + catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + return entities; + } + + public HubEntity saveEntity(HubEntity entity, Boolean rename) throws IOException { + JsonNode node = entity.toJson(); + ObjectMapper objectMapper = new ObjectMapper(); + String fullpath = entity.getFilename(); + String title = entity.getInfo().getTitle(); + + if (rename) { + String filename = new File(fullpath).getName(); + String entityFromFilename = filename.substring(0, filename.indexOf(ENTITY_FILE_EXTENSION)); + if (!entityFromFilename.equals(entity.getInfo().getTitle())) { + // The entity name was changed since the files were created. Update + // the path. + + // Update the name of the entity definition file + File origFile = new File(fullpath); + File newFile = new File(origFile.getParent() + File.separator + title + ENTITY_FILE_EXTENSION); + if (!origFile.renameTo(newFile)) { + throw new IOException("Unable to rename " + origFile.getAbsolutePath() + " to " + + newFile.getAbsolutePath()); + } + ; + + // Update the directory name + File origDirectory = new File(origFile.getParent()); + File newDirectory = new File(origDirectory.getParent() + File.separator + title); + if (!origDirectory.renameTo(newDirectory)) { + throw new IOException("Unable to rename " + origDirectory.getAbsolutePath() + " to " + + newDirectory.getAbsolutePath()); + } + + fullpath = newDirectory.getAbsolutePath() + File.separator + title + ENTITY_FILE_EXTENSION; + entity.setFilename(fullpath); + } + } + else { + Path dir = hubConfig.getHubEntitiesDir().resolve(title); + if (!dir.toFile().exists()) { + dir.toFile().mkdirs(); + } + fullpath = Paths.get(dir.toString(), title + ENTITY_FILE_EXTENSION).toString(); + } + + + String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(node); + FileUtils.writeStringToFile(new File(fullpath), json); + + return entity; + } + + public void deleteEntity(String entity) throws IOException { + Path dir = hubConfig.getHubEntitiesDir().resolve(entity); + if (dir.toFile().exists()) { + FileUtils.deleteDirectory(dir.toFile()); + } + } + private class PiiGenerator extends ResourceManager { private static final String NAME = "ml:piiGenerator"; private RequestParameters params = new RequestParameters(); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/FlowManagerImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/FlowManagerImpl.java index 4051f39e40..de84a802e5 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/FlowManagerImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/FlowManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,277 +13,180 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.marklogic.hub.impl; -import com.marklogic.client.DatabaseClient; -import com.marklogic.client.extensions.ResourceManager; -import com.marklogic.client.extensions.ResourceServices.ServiceResult; -import com.marklogic.client.extensions.ResourceServices.ServiceResultIterator; -import com.marklogic.client.io.DOMHandle; -import com.marklogic.client.util.RequestParameters; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.marklogic.hub.FlowManager; import com.marklogic.hub.HubConfig; -import com.marklogic.hub.collector.impl.CollectorImpl; -import com.marklogic.hub.flow.*; -import com.marklogic.hub.flow.impl.FlowRunnerImpl; -import com.marklogic.hub.main.impl.MainPluginImpl; -import com.marklogic.hub.scaffold.Scaffolding; +import com.marklogic.hub.error.DataHubProjectException; +import com.marklogic.hub.flow.Flow; +import com.marklogic.hub.flow.FlowImpl; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import javax.annotation.PostConstruct; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; +import java.io.*; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import java.util.Properties; -import java.util.regex.Pattern; +import java.util.stream.Collectors; @Component -public class FlowManagerImpl extends ResourceManager implements FlowManager { - - private static final String NAME = "ml:flow"; - - private DatabaseClient stagingClient; - +public class FlowManagerImpl implements FlowManager { @Autowired private HubConfig hubConfig; - @Autowired - private Scaffolding scaffolding; - - public FlowManagerImpl() { - super(); - } - - - public void setupClient() { - this.stagingClient = hubConfig.newStagingClient(); - this.stagingClient.init(NAME, this); - } - - @Override public List getLocalFlows() { - List flows = new ArrayList<>(); - - Path entitiesDir = hubConfig.getHubEntitiesDir(); - File[] entities = entitiesDir.toFile().listFiles((pathname -> pathname.isDirectory())); - if (entities != null) { - for (File entity : entities) { - String entityName = entity.getName(); - flows.addAll(getLocalFlowsForEntity(entityName)); - } + @Override + public Flow getFlow(String flowName) { + Path flowPath = Paths.get(hubConfig.getFlowsDir().toString(), flowName + FLOW_FILE_EXTENSION); + FileInputStream fileInputStream = null; + try { + fileInputStream = FileUtils.openInputStream(flowPath.toFile()); + } catch (IOException e) { + // return null if it doesn't exist, so we can check for it. + return null; } - return flows; - } - - @Override public List getLocalFlowsForEntity(String entityName) { - return getLocalFlowsForEntity(entityName, null); - } - - @Override public List getLocalFlowsForEntity(String entityName, FlowType flowType) { - - List flows = new ArrayList<>(); - Path entitiesDir = hubConfig.getHubEntitiesDir(); - Path entityDir = entitiesDir.resolve(entityName); - Path inputDir = entityDir.resolve("input"); - Path harmonizeDir = entityDir.resolve("harmonize"); - boolean getInputFlows = false; - boolean getHarmonizeFlows = false; - if (flowType == null) { - getInputFlows = getHarmonizeFlows = true; + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode node; + try { + node = objectMapper.readTree(fileInputStream); + } catch (IOException e) { + throw new DataHubProjectException("Unable to read flow: " + e.getMessage()); } - else if (flowType.equals(FlowType.INPUT)) { - getInputFlows = true; + Flow newFlow = createFlowFromJSON(node); + if(newFlow != null && newFlow.getName().length() > 0){ + return newFlow; } - else if (flowType.equals(FlowType.HARMONIZE)) { - getHarmonizeFlows = true; + else { + throw new DataHubProjectException(flowName +" is not a valid flow"); } - if (getInputFlows) { - File[] inputFlows = inputDir.toFile().listFiles((pathname) -> pathname.isDirectory() && !pathname.getName().equals("REST")); - if (inputFlows != null) { - for (File inputFlow : inputFlows) { - Flow flow = getLocalFlow(entityName, inputFlow.toPath(), FlowType.INPUT); - if (flow != null) { - flows.add(flow); - } - } - } - } + } - if (getHarmonizeFlows) { - File[] harmonizeFlows = harmonizeDir.toFile().listFiles((pathname) -> pathname.isDirectory() && !pathname.getName().equals("REST")); - if (harmonizeFlows != null) { - for (File harmonizeFlow : harmonizeFlows) { - Flow flow = getLocalFlow(entityName, harmonizeFlow.toPath(), FlowType.HARMONIZE); - if (flow != null) { - flows.add(flow); - } + @Override + public String getFlowAsJSON(String flowName) { + return getFlow(flowName).serialize(); + } - } - } + @Override + public List getFlows() { + List flowNames = getFlowNames(); + List flows = new ArrayList<>(); + for(String flow : flowNames){ + flows.add(getFlow(flow)); } return flows; } - @Override public Flow getFlowFromProperties(Path propertiesFile) { - String quotedSeparator = Pattern.quote(File.separator); - String flowTypeRegex = ".+" + quotedSeparator + "(input|harmonize)" + quotedSeparator + ".+"; - FlowType flowType = propertiesFile.toString().replaceAll(flowTypeRegex, "$1").equals("input") - ? FlowType.INPUT : FlowType.HARMONIZE; + @Override + public List getFlowNames() { + // Get all the files with flow.json extension from flows dir + List files = (List) FileUtils.listFiles(hubConfig.getFlowsDir().toFile(), new String[] {"flow.json"} , false ); + List flowNames = files.stream().map(f ->{ + String fileName = f.getName(); + fileName = fileName.replaceAll("(.+)\\.flow\\.json" , "$1"); + return fileName; + }).collect(Collectors.toList()); + + return flowNames; + } - String entityName = propertiesFile.toString().replaceAll(".+" + quotedSeparator + "([^/\\\\]+)" + quotedSeparator + "(input|harmonize)" + quotedSeparator + ".+", "$1"); - return getLocalFlow(entityName, propertiesFile.getParent(), flowType); + @Override + public Flow createFlow(String flowName) { + Flow flow = createFlowFromJSON(getFlowScaffolding()); + flow.setName(flowName); + return flow; } - private Flow getLocalFlow(String entityName, Path flowDir, FlowType flowType) { + @Override + public Flow createFlowFromJSON(String json) { + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = null; try { - String flowName = flowDir.getFileName().toString(); - File propertiesFile = flowDir.resolve(flowName + ".properties").toFile(); - if (propertiesFile.exists()) { - Properties properties = new Properties(); - FileInputStream fis = new FileInputStream(propertiesFile); - properties.load(fis); - - // trim trailing whitespaces for properties. - for (String key : properties.stringPropertyNames()){ - properties.put(key, properties.get(key).toString().trim()); - } - fis.close(); - - FlowBuilder flowBuilder = FlowBuilder.newFlow() - .withEntityName(entityName) - .withName(flowName) - .withType(flowType) - .withCodeFormat(CodeFormat.getCodeFormat((String) properties.get("codeFormat"))) - .withDataFormat(DataFormat.getDataFormat((String) properties.get("dataFormat"))) - .withMain(new MainPluginImpl((String) properties.get("mainModule"), CodeFormat.getCodeFormat((String) properties.get("mainCodeFormat")))); - - if (flowType.equals(FlowType.HARMONIZE)) { - flowBuilder.withCollector(new CollectorImpl((String) properties.get("collectorModule"), CodeFormat.getCodeFormat((String) properties.get("collectorCodeFormat")))); - } + node = mapper.readValue(json, JsonNode.class); + } catch (JsonParseException e) { + throw new DataHubProjectException("Unable to parse flow json string : "+ e.getMessage()); + } catch (JsonMappingException e1) { + throw new DataHubProjectException("Unable to parse flow json string : "+ e1.getMessage()); + } catch (IOException e2) { + throw new DataHubProjectException("Unable to parse flow json string : "+ e2.getMessage()); + } + return createFlowFromJSON(node); + } - return flowBuilder.build(); - } - } - catch(Exception e) { - e.printStackTrace(); - } - return null; + @Override + public Flow createFlowFromJSON(JsonNode json) { + Flow flow = new FlowImpl(); + flow.deserialize(json); + return flow; } - @Override public List getFlows(String entityName) { - RequestParameters params = new RequestParameters(); - params.add("entity-name", entityName); - ServiceResultIterator resultItr = this.getServices().get(params); - if (resultItr == null || ! resultItr.hasNext()) { - return null; + @Override + public void deleteFlow(String flowName) { + File flowFile = Paths.get(hubConfig.getFlowsDir().toString(), flowName + FLOW_FILE_EXTENSION).toFile(); + if (flowFile.exists()) { + try { + FileUtils.forceDelete(flowFile); + } catch (IOException e){ + throw new DataHubProjectException("Could not delete flow "+ flowName); + } } - ServiceResult res = resultItr.next(); - DOMHandle handle = new DOMHandle(); - Document parent = res.getContent(handle).get(); - NodeList children = parent.getDocumentElement().getChildNodes(); - - ArrayList flows = null; - if (children.getLength() > 0) { - flows = new ArrayList<>(); + else { + throw new DataHubProjectException("The specified flow doesn't exist."); } - Node node; - for (int i = 0; i < children.getLength(); i++) { - node = children.item(i); - if (node.getNodeType() == Node.ELEMENT_NODE) { - flows.add(FlowManager.flowFromXml((Element)children.item(i))); - } - } - return flows; } - @Override public Flow getFlow(String entityName, String flowName) { - return getFlow(entityName, flowName, null); - } + @Override + public void saveFlow(Flow flow) { + String flowString = flow.serialize(); + String flowFileName = flow.getName() + FLOW_FILE_EXTENSION; + File file = Paths.get(hubConfig.getFlowsDir().toString(), flowFileName).toFile(); + ObjectNode rootNode; + FileOutputStream fileOutputStream = null; + ObjectMapper objectMapper = new ObjectMapper(); - @Override public Flow getFlow(String entityName, String flowName, FlowType flowType) { - RequestParameters params = new RequestParameters(); - params.add("entity-name", entityName); - params.add("flow-name", flowName); - if (flowType != null) { - params.add("flow-type", flowType.toString()); + try { + rootNode = (ObjectNode)objectMapper.readTree(flowString); + objectMapper.enable(SerializationFeature.INDENT_OUTPUT); + fileOutputStream = new FileOutputStream(file); + fileOutputStream.write(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode).getBytes()); + fileOutputStream.flush(); + fileOutputStream.close(); } - ServiceResultIterator resultItr = this.getServices().get(params); - if (resultItr == null || ! resultItr.hasNext()) { - return null; + catch (JsonProcessingException e) { + throw new DataHubProjectException("Could not serialize flow."); } - ServiceResult res = resultItr.next(); - DOMHandle handle = new DOMHandle(); - Document parent = res.getContent(handle).get(); - return FlowManager.flowFromXml(parent.getDocumentElement()); - } - - @Override public List getLegacyFlows() { - List oldFlows = new ArrayList<>(); - Path entitiesDir = hubConfig.getHubEntitiesDir(); - - File[] entityDirs = entitiesDir.toFile().listFiles(pathname -> pathname.isDirectory()); - if (entityDirs != null) { - for (File entityDir : entityDirs) { - Path inputDir = entityDir.toPath().resolve("input"); - Path harmonizeDir = entityDir.toPath().resolve("harmonize"); - - File[] inputFlows = inputDir.toFile().listFiles((pathname) -> pathname.isDirectory() && !pathname.getName().equals("REST")); - addLegacyFlowToList(oldFlows, entityDir, inputFlows); - - File[] harmonizeFlows = harmonizeDir.toFile().listFiles((pathname) -> pathname.isDirectory() && !pathname.getName().equals("REST")); - addLegacyFlowToList(oldFlows, entityDir, harmonizeFlows); - } + catch (IOException e) { + throw new DataHubProjectException("Could not save flow to disk."); } - - return oldFlows; } - private void addLegacyFlowToList(List oldFlows, File entityDir, File[] flows) { - if (flows != null) { - for (File flow : flows) { - File[] mainFiles = flow.listFiles((dir, name) -> name.matches("main\\.(sjs|xqy)")); - File[] flowFiles = flow.listFiles((dir, name) -> name.matches(flow.getName() + "\\.xml")); - if (mainFiles.length < 1 && flowFiles.length == 1) { - oldFlows.add(entityDir.getName() + " => " + flow.getName()); - } else if (mainFiles.length == 1 && mainFiles[0].getName().contains(".sjs")) { - try { - String mainFile = FileUtils.readFileToString(mainFiles[0]); - if (mainFile.contains("dhf.xqy")) { - oldFlows.add(entityDir.getName() + " => " + flow.getName()); - } - } - catch(IOException e) {} - } + private JsonNode flowScaffolding = null; + + private JsonNode getFlowScaffolding() { + if (flowScaffolding != null) { + return flowScaffolding; + } else { + String flowScaffoldingSrcFile = "scaffolding/flowName.flow.json"; + InputStream inputStream = FlowManagerImpl.class.getClassLoader() + .getResourceAsStream(flowScaffoldingSrcFile); + ObjectMapper objectMapper = new ObjectMapper(); + try { + this.flowScaffolding = objectMapper.readTree(inputStream); + return this.flowScaffolding; + } catch (IOException e) { + throw new DataHubProjectException("Unable to parse flow json string : "+ e.getMessage()); } } } - - @Override public List updateLegacyFlows(String fromVersion) { - - List updatedFlows = new ArrayList<>(); - File[] entityDirs = hubConfig.getHubEntitiesDir().toFile().listFiles(pathname -> pathname.isDirectory()); - if (entityDirs != null) { - for (File entityDir : entityDirs) { - updatedFlows.addAll(scaffolding.updateLegacyFlows(fromVersion, entityDir.getName())); - } - } - - return updatedFlows; - } - - @Override public FlowRunner newFlowRunner() { - return new FlowRunnerImpl(hubConfig); - } - } diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/HubConfigImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/HubConfigImpl.java index ac6deb04b9..8a6715aa3c 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/HubConfigImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/HubConfigImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,8 @@ import com.marklogic.hub.error.DataHubConfigurationException; import com.marklogic.hub.error.DataHubProjectException; import com.marklogic.hub.error.InvalidDBOperationError; +import com.marklogic.hub.legacy.impl.LegacyFlowManagerImpl; +import com.marklogic.hub.processes.Process; import com.marklogic.mgmt.DefaultManageConfigFactory; import com.marklogic.mgmt.ManageClient; import com.marklogic.mgmt.ManageConfig; @@ -77,7 +79,7 @@ public class HubConfigImpl implements HubConfig Properties projectProperties = null; @Autowired - FlowManagerImpl flowManager; + LegacyFlowManagerImpl flowManager; @Autowired DataHubImpl dataHub; @Autowired @@ -178,7 +180,8 @@ public class HubConfigImpl implements HubConfig private ObjectMapper objmapper; - private String envString; + // By default, DHF uses gradle-local.properties for your local environment. + private String envString = "local"; public HubConfigImpl() { objmapper = new ObjectMapper(); @@ -807,7 +810,7 @@ public String getMlUsername() { public String getMlPassword() { return mlPassword; } - + public void setMlUsername(String mlUsername) { this.mlUsername = mlUsername; } @@ -966,6 +969,7 @@ public void loadConfigurationFromProperties(Properties properties, boolean loadG logger.info("Loading additional properties from " + envPropertiesFile.getAbsolutePath()); } loadPropertiesFromFile(envPropertiesFile, projectProperties); + hubProject.setUserModulesDeployTimestampFile(envString + "-" + USER_MODULES_DEPLOY_TIMESTAMPS_PROPERTIES); } } } @@ -1282,7 +1286,7 @@ public void loadConfigurationFromProperties(Properties properties, boolean loadG else { projectProperties.setProperty("mlHubUserName", hubUserName); } - + if (hubAdminRoleName == null) { hubAdminRoleName = getEnvPropString(projectProperties, "mlHubAdminRole", environment.getProperty("mlHubAdminRole")); } @@ -1531,6 +1535,12 @@ public DatabaseClient newModulesDbClient() { @JsonIgnore @Override public Path getHubMappingsDir() { return hubProject.getHubMappingsDir(); } + @JsonIgnore + @Override + public Path getProcessDir(Process.ProcessType type) { + return hubProject.getProcessDir(type); + } + @JsonIgnore @Override public Path getHubConfigDir() { return hubProject.getHubConfigDir(); @@ -1574,6 +1584,9 @@ public DatabaseClient newModulesDbClient() { return hubProject.getEntityDatabaseDir(); } + @Override + public Path getFlowsDir() { return hubProject.getFlowsDir(); } + @JsonIgnore @Override public Path getUserServersDir() { return hubProject.getUserServersDir(); @@ -1609,7 +1622,7 @@ public DatabaseClient newModulesDbClient() { // this lets debug builds work from an IDE if (version.equals("${project.version}")) { - version = "4.0-SNAPSHOT"; + version = "5.0-SNAPSHOT"; } return version; } @@ -1710,8 +1723,10 @@ private Map getCustomTokens(AppConfig appConfig, Map forestCounts = config.getForestCounts(); forestCounts.put(jobDbName, jobForestsPerHost); forestCounts.put(modulesDbName, modulesForestsPerHost); @@ -1758,7 +1780,7 @@ private void updateAppConfig(AppConfig config) { * * But if the config paths have been customized - most likely via mlConfigPaths in gradle.properties - then this * method just ensures that they're relative to the DHF project directory. - * + * * @param config */ protected void initializeConfigDirs(AppConfig config) { @@ -1897,6 +1919,7 @@ public void refreshProject(Properties properties, boolean loadGradleProperties) @JsonIgnore public HubConfig withPropertiesFromEnvironment(String environment) { this.envString = environment; + hubProject.setUserModulesDeployTimestampFile(envString + "-" + USER_MODULES_DEPLOY_TIMESTAMPS_PROPERTIES); return this; } diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/HubProjectImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/HubProjectImpl.java index 758e450692..9f77a8735b 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/HubProjectImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/HubProjectImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,13 +20,16 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.marklogic.hub.HubProject; +import com.marklogic.hub.error.DataHubProjectException; +import com.marklogic.hub.processes.Process; import com.marklogic.hub.util.FileUtil; import com.marklogic.rest.util.JsonNodeUtil; - import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.stereotype.Component; import java.io.File; @@ -37,11 +40,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.PosixFilePermission; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -61,6 +60,8 @@ public class HubProjectImpl implements HubProject { private String projectDirString; private Path projectDir; private Path pluginsDir; + private Path processesDir; + private String userModulesDeployTimestampFile = USER_MODULES_DEPLOY_TIMESTAMPS_PROPERTIES; protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @@ -75,12 +76,44 @@ public void createProject(String projectDirString) { this.projectDirString = projectDirString; this.projectDir = Paths.get(projectDirString).toAbsolutePath(); this.pluginsDir = this.projectDir.resolve("plugins"); + this.processesDir = this.projectDir.resolve("processes"); } @Override public Path getHubPluginsDir() { return this.pluginsDir; } + @Override + public Path getProcessesDir() { + return this.processesDir; + } + + @Override + public Path getProcessDir(Process.ProcessType type) { + Path path; + + if (type == null) { + throw new DataHubProjectException("Invalid Process type"); + } + else { + switch (type) { + case CUSTOM: + path = this.processesDir.resolve("custom"); + break; + case INGEST: + path = this.processesDir.resolve("ingest"); + break; + case MAPPING: + path = this.processesDir.resolve("mapping"); + break; + default: + throw new DataHubProjectException("Invalid Process type"); + } + } + + return path; + } + @Override public Path getHubEntitiesDir() { return this.pluginsDir.resolve("entities"); } @@ -105,7 +138,9 @@ public void createProject(String projectDirString) { return getHubConfigDir().resolve("security"); } - @Override public Path getHubSchemasDir() { return getHubConfigDir().resolve("schemas"); } + @Override public Path getHubTriggersDir() { + return getHubConfigDir().resolve("triggers"); + } @Override public Path getUserConfigDir() { return this.projectDir.resolve(USER_CONFIG_DIR); @@ -133,6 +168,10 @@ public void createProject(String projectDirString) { return getEntityConfigDir().resolve("databases"); } + @Override public Path getFlowsDir() { + return this.projectDir.resolve("flows"); + } + @Override public Path getHubStagingModulesDir() { return this.projectDir.resolve(MODULES_DIR); } @@ -178,6 +217,7 @@ public void createProject(String projectDirString) { @Override public void init(Map customTokens) { this.pluginsDir.toFile().mkdirs(); + this.processesDir.toFile().mkdirs(); Path userModules = this.projectDir.resolve(MODULES_DIR); userModules.toFile().mkdirs(); @@ -212,6 +252,7 @@ public void createProject(String projectDirString) { Path userSecurityDir = getUserSecurityDir(); Path rolesDir = hubSecurityDir.resolve("roles"); Path usersDir = hubSecurityDir.resolve("users"); + Path ampsDir = hubSecurityDir.resolve("amps"); Path privilegesDir = hubSecurityDir.resolve("privileges"); Path userRolesDir = userSecurityDir.resolve("roles"); @@ -226,6 +267,20 @@ public void createProject(String projectDirString) { userUsersDir.toFile().mkdirs(); userPrivilegesDir.toFile().mkdirs(); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + + // Ant-style path matching + Resource[] resources = new Resource[0]; + try { + resources = resolver.getResources("classpath:hub-internal-config/security/amps/*.json"); + for (Resource resource : resources) { + InputStream is = resource.getInputStream(); + FileUtil.copy(is, ampsDir.resolve(resource.getFilename()).toFile()); + } + } catch (IOException e) { + logger.error("Failed to load amp resource", e); + } + writeResourceFile("hub-internal-config/security/roles/data-hub-role.json", rolesDir.resolve("data-hub-role.json"), true); writeResourceFile("hub-internal-config/security/users/data-hub-user.json", usersDir.resolve("data-hub-user.json"), true); writeResourceFile("hub-internal-config/security/roles/hub-admin-role.json", rolesDir.resolve("hub-admin-role.json"), true); @@ -240,9 +295,19 @@ public void createProject(String projectDirString) { getUserDatabaseDir().toFile().mkdirs(); //scaffold schemas - getHubSchemasDir().toFile().mkdirs(); + getUserDatabaseDir().resolve(customTokens.get("%%mlStagingSchemasDbName%%")).resolve("schemas").toFile().mkdirs(); getUserSchemasDir().toFile().mkdirs(); + //create flow dir + getFlowsDir().toFile().mkdirs(); + + //create hub triggers + Path hubTriggersDir = getHubTriggersDir(); + hubTriggersDir.toFile().mkdirs(); + writeResourceFile("hub-internal-config/triggers/ml-dh-entity-create.json", hubTriggersDir.resolve("ml-dh-entity-create.json"), true); + writeResourceFile("hub-internal-config/triggers/ml-dh-entity-modify.json", hubTriggersDir.resolve("ml-dh-entity-modify.json"), true); + writeResourceFile("hub-internal-config/triggers/ml-dh-entity-delete.json", hubTriggersDir.resolve("ml-dh-entity-delete.json"), true); + Path gradlew = projectDir.resolve("gradlew"); writeResourceFile("scaffolding/gradlew", gradlew); makeExecutable(gradlew); @@ -346,6 +411,9 @@ public void upgradeProject() throws IOException { deleteObsoleteServerFilesFromHubInternalConfig(); deleteObsoleteDatabaseFilesFromMlConfig(); + //remove hub-internal-config/schemas dir + deleteObsoleteDirsFromHubInternalConfig(); + } @Override public String getHubModulesDeployTimestampFile() { @@ -353,7 +421,12 @@ public void upgradeProject() throws IOException { } @Override public String getUserModulesDeployTimestampFile() { - return Paths.get(projectDirString, ".tmp", USER_MODULES_DEPLOY_TIMESTAMPS_PROPERTIES).toString(); + return Paths.get(projectDirString, ".tmp", userModulesDeployTimestampFile).toString(); + } + + @Override + public void setUserModulesDeployTimestampFile(String userModulesDeployTimestampFile) { + this.userModulesDeployTimestampFile = userModulesDeployTimestampFile; } /* copying only the required old hub-internal-config db and server files to new locations @@ -655,6 +728,22 @@ private void deleteObsoleteServerFilesFromHubInternalConfig() { } } + private void deleteObsoleteDirsFromHubInternalConfig() { + File dir = getHubConfigDir().resolve("schemas").toFile(); + if (dir.exists()) { + if (logger.isInfoEnabled()) { + logger.info("Deleting hub-internal-config/schemas dir because it is no longer used"); + } + try { + FileUtils.deleteDirectory(dir); + } catch (IOException e) { + logger.error("Unable to delete "+ dir.getAbsolutePath()); + throw new RuntimeException(e); + } + } + + } + @Override public Path getEntityDir(String entityName) { return getHubEntitiesDir().resolve(entityName); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/InstallInfoImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/InstallInfoImpl.java index c602158901..5d6e584a98 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/InstallInfoImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/InstallInfoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/MappingManagerImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/MappingManagerImpl.java index 282b76ae70..7e92674610 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/MappingManagerImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/MappingManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -158,7 +158,10 @@ private Mapping getMappingVersion(String mappingName, int version){ ){ continue; } - String parsedFileNameVersion = fileName.replace(mappingName, "").replace(MAPPING_FILE_EXTENSION, "").replaceAll("-", ""); + /* Captures the number between that is in between "-" and ".mapping.json" + * as in test-mapping-5.mapping.json would set parsedFileNameVersion to "5" + */ + String parsedFileNameVersion = fileName.replaceAll(".+\\-([0-9]+)\\.mapping\\.json" , "$1"); int fileNameVersion = Integer.parseInt(parsedFileNameVersion); if( version == -1 && fileNameVersion > highestVersion){ highestVersion = fileNameVersion; diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ProcessManagerImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ProcessManagerImpl.java new file mode 100644 index 0000000000..5a7e924685 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ProcessManagerImpl.java @@ -0,0 +1,142 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.marklogic.hub.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.marklogic.hub.HubConfig; +import com.marklogic.hub.ProcessManager; +import com.marklogic.hub.error.DataHubProjectException; +import com.marklogic.hub.processes.Process; +import com.marklogic.hub.util.FileUtil; +import org.apache.commons.io.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.*; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; + +@Component +public class ProcessManagerImpl implements ProcessManager { + + @Autowired + private HubConfig hubConfig; + + @Override + public void saveProcess(Process process) { + try { + String processString = process.serialize(); + Path dir = resolvePath(hubConfig.getProcessDir(process.getType()), process.getName()); + if (!dir.toFile().exists()) { + dir.toFile().mkdirs(); + } + String processFileName = process.getName() + PROCESSES_FILE_EXTENSION; + File file = Paths.get(dir.toString(), processFileName).toFile(); + //create the object mapper to pretty print to disk + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.enable(SerializationFeature.INDENT_OUTPUT); + Object json = objectMapper.readValue(processString, Object.class); + FileOutputStream fileOutputStream = new FileOutputStream(file); + fileOutputStream.write(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(json).getBytes()); + fileOutputStream.flush(); + fileOutputStream.close(); + } + catch (JsonProcessingException e) { + throw new DataHubProjectException("Could not serialize Process for project."); + } + catch (IOException e) { + throw new DataHubProjectException("Could not write Process to disk for project."); + } + } + + @Override + public void deleteProcess(Process process) { + Path dir = resolvePath(hubConfig.getProcessDir(process.getType()), process.getName()); + if (dir.toFile().exists()) { + try { + FileUtils.deleteDirectory(dir.toFile()); + } + catch (IOException e) { + throw new DataHubProjectException("Could not delete Process for project."); + } + } + } + + @Override + public ArrayList getProcesses() { + ArrayList processList = new ArrayList<>(); + for (Process.ProcessType processType : Process.ProcessType.getProcessTypes()) { + for (String name : getProcessNamesByType(processType)) { + processList.add(getProcess(name, processType)); + } + } + return processList; + } + + @Override + public Process getProcess(String name, Process.ProcessType type) { + Path processPath = resolvePath(hubConfig.getProcessDir(type), name); + + try { + String targetFileName = name + PROCESSES_FILE_EXTENSION; + FileInputStream fileInputStream = new FileInputStream(processPath.resolve(targetFileName).toFile()); + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode node = objectMapper.readTree(fileInputStream); + Process newProcess = createProcessFromJSON(node); + if (newProcess != null && newProcess.getName().length() > 0) { + return newProcess; + } + } + catch (FileNotFoundException e) { + return null; + } + catch (IOException e) { + throw new DataHubProjectException("Could not read Process on disk."); + } + + return null; + } + + @Override + public ArrayList getProcessesByType(Process.ProcessType type) { + ArrayList processList = new ArrayList<>(); + for (String name : getProcessNamesByType(type)) { + processList.add(getProcess(name, type)); + } + return processList; + } + + @Override + public ArrayList getProcessNamesByType(Process.ProcessType type) { + return (ArrayList) FileUtil.listDirectFolders(hubConfig.getProcessDir(type)); + } + + @Override + public Process createProcessFromJSON(JsonNode json) { + Process process = Process.create("default", Process.ProcessType.INGEST); + process.deserialize(json); + return process; + } + + private Path resolvePath(Path path, String more) { + return path.resolve(more); + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ScaffoldingImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ScaffoldingImpl.java index e9f4605b8d..efa222e403 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ScaffoldingImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ScaffoldingImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,9 +22,9 @@ import com.marklogic.client.util.RequestParameters; import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubProject; -import com.marklogic.hub.collector.impl.CollectorImpl; +import com.marklogic.hub.legacy.collector.impl.LegacyCollectorImpl; import com.marklogic.hub.error.ScaffoldingValidationException; -import com.marklogic.hub.flow.*; +import com.marklogic.hub.legacy.flow.*; import com.marklogic.hub.main.impl.MainPluginImpl; import com.marklogic.hub.scaffold.Scaffolding; import com.marklogic.hub.util.FileUtil; @@ -38,7 +38,6 @@ import org.w3c.dom.NodeList; import org.xml.sax.SAXException; -import javax.annotation.PostConstruct; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -140,7 +139,7 @@ public static String getAbsolutePath(String first, String... more) { writeFile("scaffolding/" + flowType + "/" + codeFormat + "/main." + codeFormat, flowDir.resolve("main." + codeFormat)); - Flow flow = FlowBuilder.newFlow() + LegacyFlow flow = LegacyFlowBuilder.newFlow() .withEntityName(entityName) .withName(flowName) .withType(flowType) @@ -259,7 +258,7 @@ else if(update2xFlow(entityName, harmonizeFlow.getName(), FlowType.HARMONIZE)) { file.delete(); - FlowBuilder flowBuilder = FlowBuilder.newFlow() + LegacyFlowBuilder flowBuilder = LegacyFlowBuilder.newFlow() .withEntityName(entityName) .withName(flowName) .withType(flowType) @@ -268,14 +267,14 @@ else if(update2xFlow(entityName, harmonizeFlow.getName(), FlowType.HARMONIZE)) { .withMain(new MainPluginImpl("main." + codeFormat, codeFormat)); if (flowType.equals(FlowType.HARMONIZE)) { - flowBuilder.withCollector(new CollectorImpl("collector/collector." + codeFormat, codeFormat)); + flowBuilder.withCollector(new LegacyCollectorImpl("collector/collector." + codeFormat, codeFormat)); if (codeFormat.equals(CodeFormat.JAVASCRIPT)) { updateLegacySjsWriter(flowDir); } } - Flow flow = flowBuilder.build(); + LegacyFlow flow = flowBuilder.build(); try { FileWriter fw = new FileWriter(flowDir.resolve(flowName + ".properties").toFile()); flow.toProperties().store(fw, ""); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ScaffoldingValidator.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ScaffoldingValidator.java index 1ae869229a..add673a9c0 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ScaffoldingValidator.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/ScaffoldingValidator.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/Versions.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/Versions.java index 8b8c6d5b3e..a2f85594b7 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/Versions.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/Versions.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ package com.marklogic.hub.impl; +import com.marklogic.appdeployer.AppConfig; import com.marklogic.client.DatabaseClient; import com.marklogic.client.eval.EvalResultIterator; import com.marklogic.client.eval.ServerEvaluationCall; @@ -31,6 +32,7 @@ public class Versions extends ResourceManager { private static final String NAME = "ml:hubversion"; DatabaseClient stagingClient; + private AppConfig appConfig; @Autowired private HubConfig hubConfig; @@ -42,10 +44,20 @@ public Versions() { /** * Needed for the Gradle tasks. * - * @param hubConfig + * @param hubConfig HubConfig */ public Versions(HubConfig hubConfig) { this.hubConfig = hubConfig; + this.appConfig = hubConfig.getAppConfig(); + } + + /** + * Needed for the Gradle tasks. + * + * @param appConfig AppConfig + */ + public Versions(AppConfig appConfig) { + this.appConfig = appConfig; } public void setupClient() { @@ -74,8 +86,11 @@ public String getHubVersion() { } public String getMarkLogicVersion() { + if (this.appConfig == null) { + this.appConfig = hubConfig.getAppConfig(); + } // this call specifically needs to access marklogic without a known database - ServerEvaluationCall eval = hubConfig.getAppConfig().newAppServicesDatabaseClient(null).newServerEval(); + ServerEvaluationCall eval = appConfig.newAppServicesDatabaseClient(null).newServerEval(); String xqy = "xdmp:version()"; EvalResultIterator result = eval.xquery(xqy).eval(); if (result.hasNext()) { diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/Debugging.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/LegacyDebugging.java similarity index 80% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/Debugging.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/LegacyDebugging.java index 58e74375bb..402a144f9e 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/Debugging.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/LegacyDebugging.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,23 +14,23 @@ * limitations under the License. */ -package com.marklogic.hub; +package com.marklogic.hub.legacy; import com.marklogic.client.DatabaseClient; -import com.marklogic.hub.impl.DebuggingImpl; +import com.marklogic.hub.legacy.impl.LegacyDebuggingImpl; /** * Enables or disables debugging in the DHF for the specified database using the supplied client. */ -public interface Debugging { +public interface LegacyDebugging { /** * Creates and returns a debugging object * @param client - the databaseclient that will be used * @return the debugging object */ - static Debugging create(DatabaseClient client){ - return new DebuggingImpl(client); + static LegacyDebugging create(DatabaseClient client){ + return new LegacyDebuggingImpl(client); } /** diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/LegacyFlowManager.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/LegacyFlowManager.java new file mode 100644 index 0000000000..c3bcb50baf --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/LegacyFlowManager.java @@ -0,0 +1,115 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.marklogic.hub.legacy; + +import com.marklogic.hub.legacy.flow.LegacyFlow; +import com.marklogic.hub.legacy.flow.LegacyFlowRunner; +import com.marklogic.hub.legacy.flow.FlowType; +import com.marklogic.hub.legacy.flow.impl.LegacyFlowImpl; +import org.w3c.dom.Element; + +import java.nio.file.Path; +import java.util.List; + +/** + * Manages existing flows and creates flow runners to execute flows. + */ +public interface LegacyFlowManager { + + /** + * Turns an XML document into a flow + * @param doc - the xml document representing a flow + * @return a LegacyFlow instance + */ + static LegacyFlow flowFromXml(Element doc) { + return LegacyFlowImpl.fromXml(doc); + } + + /** + * retrieves a list of all the flows on the local files systems + * @return a list of Flows + */ + List getLocalFlows(); + + /** + * retrieves a list of all the flows on the local files systems + * @param entityName - string name of the entity for the flow + * @return a list of Flows + */ + List getLocalFlowsForEntity(String entityName); + + /** + * retrieves a list of all the flows on the local files systems + * @param entityName - string name of the entity for the flow + * @param flowType - the FlowType enum, eg: ingest or harmonize + * @return a list of Flows + */ + List getLocalFlowsForEntity(String entityName, FlowType flowType); + + /** + * Obtains a flow from a property file + * @param propertiesFile - the Path to the property file + * @return - a flow object + */ + LegacyFlow getFlowFromProperties(Path propertiesFile); + + /** + * Retrieves a list of flows installed on the MarkLogic server + * @param entityName - the entity from which to fetch the flows + * @return - a list of flows for the given entity + */ + List getFlows(String entityName); + + /** + * Retrieves a named flow from a given entity + * + * @param entityName - the entity that the flow belongs to + * @param flowName - the name of the flow to get + * @return the flow + */ + LegacyFlow getFlow(String entityName, String flowName); + + /** + * Retrieves a named flow from a given entity + * + * @param entityName - the entity that the flow belongs to + * @param flowName - the name of the flow to get + * @param flowType - the type of flow (ingest/harmonize) + * @return the flow + */ + LegacyFlow getFlow(String entityName, String flowName, FlowType flowType); + + /** + * Updates the indexes in the database based on the project + * @return - a list of names for all the flows that are legacy + */ + + List getLegacyFlows(); + + /** + * Sets the version that the legacy flow is to be updated from + * @param fromVersion - string representation of DHF version + * @return a list of updated flow names that were updated + */ + List updateLegacyFlows(String fromVersion); + + /** + * Creates and returns a new LegacyFlowRunner object using the FlowManager's hubconfig + * @return LegacyFlowRunner object with current hubconfig already set + */ + LegacyFlowRunner newFlowRunner(); +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/Tracing.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/LegacyTracing.java similarity index 79% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/Tracing.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/LegacyTracing.java index 111b0e5621..58b98a3adc 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/Tracing.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/LegacyTracing.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,24 +14,24 @@ * limitations under the License. */ -package com.marklogic.hub; +package com.marklogic.hub.legacy; import com.marklogic.client.DatabaseClient; -import com.marklogic.hub.impl.TracingImpl; +import com.marklogic.hub.legacy.impl.LegacyTracingImpl; /** * Enables or disables tracing in the DHF for the specified database using the supplied client. * * Please keep tracing disabled against a production environment. */ -public interface Tracing { +public interface LegacyTracing { /** * Creates and returns a tracing object * @param client - the databaseclient that will be used - * @return the Tracing object + * @return the LegacyTracing object */ - static Tracing create(DatabaseClient client){ - return new TracingImpl(client); + static LegacyTracing create(DatabaseClient client){ + return new LegacyTracingImpl(client); }; /** diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/collector/DiskQueue.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/collector/DiskQueue.java similarity index 99% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/collector/DiskQueue.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/collector/DiskQueue.java index a62ac4da2c..355433161d 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/collector/DiskQueue.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/collector/DiskQueue.java @@ -22,7 +22,7 @@ * * Modifications copyright (c) 2016 MarkLogic Corporation * */ -package com.marklogic.hub.collector; +package com.marklogic.hub.legacy.collector; import java.io.*; import java.security.InvalidParameterException; diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/collector/Collector.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/collector/LegacyCollector.java similarity index 92% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/collector/Collector.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/collector/LegacyCollector.java index 03d99336ba..1e84e3cffe 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/collector/Collector.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/collector/LegacyCollector.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,18 +13,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.collector; +package com.marklogic.hub.legacy.collector; import com.marklogic.client.DatabaseClient; import com.marklogic.hub.HubConfig; -import com.marklogic.hub.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.CodeFormat; import java.util.Map; /** * Manages config and client for the collector, as well as runs the collector for the associated entity and flow */ -public interface Collector { +public interface LegacyCollector { /** * Obtains the code format for the collector in use diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/collector/impl/CollectorImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/collector/impl/LegacyCollectorImpl.java similarity index 95% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/collector/impl/CollectorImpl.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/collector/impl/LegacyCollectorImpl.java index 7dd39b0461..49aefcb144 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/collector/impl/CollectorImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/collector/impl/LegacyCollectorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.collector.impl; +package com.marklogic.hub.legacy.collector.impl; import com.fasterxml.jackson.databind.ObjectMapper; import com.marklogic.client.DatabaseClient; @@ -21,9 +21,9 @@ import com.marklogic.client.MarkLogicIOException; import com.marklogic.client.DatabaseClientFactory.SSLHostnameVerifier; import com.marklogic.hub.HubConfig; -import com.marklogic.hub.collector.Collector; -import com.marklogic.hub.collector.DiskQueue; -import com.marklogic.hub.flow.CodeFormat; +import com.marklogic.hub.legacy.collector.LegacyCollector; +import com.marklogic.hub.legacy.collector.DiskQueue; +import com.marklogic.hub.legacy.flow.CodeFormat; import com.marklogic.hub.impl.HubConfigImpl; import com.marklogic.rest.util.MgmtResponseErrorHandler; import org.apache.http.auth.AuthScope; @@ -58,18 +58,18 @@ import java.security.cert.X509Certificate; import java.util.*; -public class CollectorImpl implements Collector { +public class LegacyCollectorImpl implements LegacyCollector { private DatabaseClient client = null; private HubConfig hubConfig = null; private CodeFormat codeFormat; - private static Logger logger = LoggerFactory.getLogger(CollectorImpl.class); + private static Logger logger = LoggerFactory.getLogger(LegacyCollectorImpl.class); private String module; - public CollectorImpl() {} + public LegacyCollectorImpl() {} - public CollectorImpl(String module, CodeFormat codeFormat) { + public LegacyCollectorImpl(String module, CodeFormat codeFormat) { this.module = module; this.codeFormat = codeFormat; } diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/CodeFormat.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/CodeFormat.java similarity index 92% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/CodeFormat.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/CodeFormat.java index 5ee27f4594..3124b5f67a 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/CodeFormat.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/CodeFormat.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; public enum CodeFormat { JAVASCRIPT("sjs"), XQUERY("xqy"); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/DataFormat.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/DataFormat.java similarity index 92% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/DataFormat.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/DataFormat.java index a69851b820..443671b7e0 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/DataFormat.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/DataFormat.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; public enum DataFormat { XML("xml"), JSON("json"); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowType.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/FlowType.java similarity index 92% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowType.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/FlowType.java index 68df6c3591..6d78c87100 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowType.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/FlowType.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; public enum FlowType { INPUT("input"), HARMONIZE("harmonize"); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlow.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlow.java new file mode 100644 index 0000000000..53a09f861c --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlow.java @@ -0,0 +1,141 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.marklogic.hub.legacy.flow; + +import com.marklogic.hub.legacy.collector.LegacyCollector; +import com.marklogic.hub.main.MainPlugin; + +import java.util.Properties; + +/** + * Manages the creation and configuration of flow objects + */ +public interface LegacyFlow { + + /** + * Sets the entity name for the flow + * @param entityName the string name of the entity to use in the flow + */ + void setEntityName(String entityName); + + /** + * Returns the name of the entity that's been set for the flow in strong form + * @return entity name in string form + */ + String getEntityName(); + + /** + * Sets the name of the flow + * @param name - string representing the name of the flow + */ + void setName(String name); + + /** + * Gets the name of the flow + * @return the name of the flow in string form + */ + String getName(); + + /** + * Sets the mapping name used to generate the flow + * @param mappingName - string representing the mapping name for the flow + */ + void setMappingName(String mappingName); + + /** + * Gets the mapping name used for the flow + * @return the mapping name of the flow in string form + */ + String getMappingName(); + + /** + * Sets the type of the flow + * @param type - FlowType enum for harmonize or input + */ + void setType(FlowType type); + + /** + * Gets the FlowType enum for the flow + * @return FlowType of ingest or harmonize + */ + FlowType getType(); + + /** + * Sets the DataFormat for the flow + * @param dataFormat - DataFormat enum of json or xml + */ + void setDataFormat(DataFormat dataFormat); + + /** + * Returns the DataForm enum of the flow + * @return DataForm enum of json or xml + */ + DataFormat getDataFormat(); + + /** + * Sets the CodeFormat enum of the flow + * @param codeFormat enum of sjs or xqy + */ + void setCodeFormat(CodeFormat codeFormat); + + /** + * Returns the CodeFormat enum of the flow + * @return CodeFormat enum of sjs or xqy + */ + CodeFormat getCodeFormat(); + + /** + * Serializes the flow into an xml string + * @return a serialized xml string of the flow + */ + String serialize(); + + /** + * Creates a properties object representing the flow + * @return a Properties object representation of the flow + */ + Properties toProperties(); + + /** + * Gets the DbPath (uri) for the flow in string form + * @return a uri path as a string + */ + String getFlowDbPath(); + + /** + * Gets the collector to be used for the flow + * @return the collector object that is used for the flow + */ + LegacyCollector getCollector(); + + /** + * Sets the legacyCollector to be used for the flow + * @param collector the legacyCollector to be used for the flow + */ + void setCollector(LegacyCollector collector); + + /** + * Gets the main plugin module that the flow is set to use + * @return MainPlugin object + */ + MainPlugin getMain(); + + /** + * Sets the main plugin module for the flow + * @param main - a MainPlugin object that defines the main plugin to be used + */ + void setMain(MainPlugin main); +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowBuilder.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowBuilder.java similarity index 57% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowBuilder.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowBuilder.java index b33690ceb9..c477cdee5f 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowBuilder.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,71 +13,71 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; -import com.marklogic.hub.collector.Collector; -import com.marklogic.hub.collector.impl.CollectorImpl; -import com.marklogic.hub.flow.impl.FlowImpl; +import com.marklogic.hub.legacy.collector.LegacyCollector; +import com.marklogic.hub.legacy.collector.impl.LegacyCollectorImpl; +import com.marklogic.hub.legacy.flow.impl.LegacyFlowImpl; import com.marklogic.hub.main.MainPlugin; import com.marklogic.hub.main.impl.MainPluginImpl; -public class FlowBuilder { +public class LegacyFlowBuilder { - Flow flow; + LegacyFlow flow; - private FlowBuilder() { - this.flow = new FlowImpl(); + private LegacyFlowBuilder() { + this.flow = new LegacyFlowImpl(); } - static public FlowBuilder newFlow() { - return new FlowBuilder(); + static public LegacyFlowBuilder newFlow() { + return new LegacyFlowBuilder(); } - public FlowBuilder withName(String flowName) { + public LegacyFlowBuilder withName(String flowName) { flow.setName(flowName); return this; } - public FlowBuilder withEntityName(String entityName) { + public LegacyFlowBuilder withEntityName(String entityName) { flow.setEntityName(entityName); return this; } - public FlowBuilder withType(FlowType type) { + public LegacyFlowBuilder withType(FlowType type) { flow.setType(type); return this; } - public FlowBuilder withDataFormat(DataFormat dataFormat) { + public LegacyFlowBuilder withDataFormat(DataFormat dataFormat) { flow.setDataFormat(dataFormat); return this; } - public FlowBuilder withCodeFormat(CodeFormat codeFormat) { + public LegacyFlowBuilder withCodeFormat(CodeFormat codeFormat) { flow.setCodeFormat(codeFormat); return this; } - public FlowBuilder withCollector(Collector collector) { - flow.setCollector(collector); + public LegacyFlowBuilder withCollector(LegacyCollector legacyCollector) { + flow.setCollector(legacyCollector); return this; } - public FlowBuilder withMain(MainPlugin main) { + public LegacyFlowBuilder withMain(MainPlugin main) { flow.setMain(main); return this; } - public FlowBuilder withMapping(String mappingName) { + public LegacyFlowBuilder withMapping(String mappingName) { flow.setMappingName(mappingName); return this; } - public Flow build() { + public LegacyFlow build() { if (flow.getCollector() == null && flow.getType().equals(FlowType.HARMONIZE)) { String collectorModule = "collector." + flow.getCodeFormat().toString(); - flow.setCollector(new CollectorImpl(collectorModule, flow.getCodeFormat())); + flow.setCollector(new LegacyCollectorImpl(collectorModule, flow.getCodeFormat())); } if (flow.getMain() == null) { diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowFinishedListener.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowFinishedListener.java similarity index 83% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowFinishedListener.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowFinishedListener.java index 8431670e09..3631498f74 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowFinishedListener.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowFinishedListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; -public interface FlowFinishedListener { +public interface LegacyFlowFinishedListener { /** * Listens for when the flow is complete */ diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowItemCompleteListener.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowItemCompleteListener.java similarity index 85% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowItemCompleteListener.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowItemCompleteListener.java index b79d74c403..4b8b15950d 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowItemCompleteListener.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowItemCompleteListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; -public interface FlowItemCompleteListener { +public interface LegacyFlowItemCompleteListener { /** * Listener interface for each flow item completing successfully * @param jobId - the id of the job as a string diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowItemFailureListener.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowItemFailureListener.java similarity index 85% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowItemFailureListener.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowItemFailureListener.java index afcdfcbee1..aade92b68d 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowItemFailureListener.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowItemFailureListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; -public interface FlowItemFailureListener { +public interface LegacyFlowItemFailureListener { /** * Listener interface for each flow item that failed * @param jobId - the id of the job as a string diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowRunner.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowRunner.java similarity index 80% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowRunner.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowRunner.java index 244c6cedae..bd8e0caaca 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowRunner.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowRunner.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; import com.marklogic.client.DatabaseClient; import com.marklogic.client.datamovement.JobTicket; @@ -24,84 +24,84 @@ /** * Executes a flow with options */ -public interface FlowRunner { +public interface LegacyFlowRunner { /** * Sets the flow to be used with the flow runner * @param flow the flow object to be used * @return the flow runner object */ - FlowRunner withFlow(Flow flow); + LegacyFlowRunner withFlow(LegacyFlow flow); /** * Sets the batch size for the flow runner * @param batchSize - the size of the batch in integer form * @return the flow runner object */ - FlowRunner withBatchSize(int batchSize); + LegacyFlowRunner withBatchSize(int batchSize); /** * Sets the thread count for the flowrunner * @param threadCount - the number of threads for the flow runner to use * @return the flow runner object */ - FlowRunner withThreadCount(int threadCount); + LegacyFlowRunner withThreadCount(int threadCount); /** * Sets the source client on the flow runner. The source client determines which database to run against for building the envelope. * @param sourceClient - the client that will be used * @return the flow runner object */ - FlowRunner withSourceClient(DatabaseClient sourceClient); + LegacyFlowRunner withSourceClient(DatabaseClient sourceClient); /** * Sets the database where flow output data will be presisted to * @param destinationDatabase - the name of the database * @return the flow runner object */ - FlowRunner withDestinationDatabase(String destinationDatabase); + LegacyFlowRunner withDestinationDatabase(String destinationDatabase); /** * Sets the options to be passed into the xqy or sjs flow in the $options or options variables of main. * @param options - the object map of options as string/object pair * @return the flow runner object */ - FlowRunner withOptions(Map options); + LegacyFlowRunner withOptions(Map options); /** * Sets if this will stop the job on a failure, or if it will continue on * @param stopOnFailure - true to stop the job if a failure happens * @return the flow runner object */ - FlowRunner withStopOnFailure(boolean stopOnFailure); + LegacyFlowRunner withStopOnFailure(boolean stopOnFailure); /** * Sets a listener on each item completing * @param listener the listen object to set * @return the flow runner object */ - FlowRunner onItemComplete(FlowItemCompleteListener listener); + LegacyFlowRunner onItemComplete(LegacyFlowItemCompleteListener listener); /** * Sets the failure listener for each item in the flow * @param listener the listener for the failures in the flow * @return the flow runner object */ - FlowRunner onItemFailed(FlowItemFailureListener listener); + LegacyFlowRunner onItemFailed(LegacyFlowItemFailureListener listener); /** * Sets the status change listener on the flowrunner object * @param listener - the listener for when the status changes * @return the flow runner object */ - FlowRunner onStatusChanged(FlowStatusListener listener); + LegacyFlowRunner onStatusChanged(LegacyFlowStatusListener listener); /** * Sets the finished listener for when the item has processed (similar to a finally) * @param listener - the listener for the flow item when it finishes * @return the flow runner object */ - FlowRunner onFinished(FlowFinishedListener listener); + LegacyFlowRunner onFinished(LegacyFlowFinishedListener listener); /** * Blocks until the job is complete. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowStatusListener.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowStatusListener.java similarity index 87% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowStatusListener.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowStatusListener.java index c106541d67..d637c0025b 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/FlowStatusListener.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/LegacyFlowStatusListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; -public interface FlowStatusListener { +public interface LegacyFlowStatusListener { /** * * @param jobId - the id of the job to change diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/RunFlowResponse.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/RunFlowResponse.java similarity index 92% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/RunFlowResponse.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/RunFlowResponse.java index d0af1b209e..4b72de7ea3 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/RunFlowResponse.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/RunFlowResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; import com.fasterxml.jackson.databind.JsonNode; diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/impl/FlowImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/impl/LegacyFlowImpl.java similarity index 91% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/impl/FlowImpl.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/impl/LegacyFlowImpl.java index 1d05d8977b..338948263d 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/impl/FlowImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/impl/LegacyFlowImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow.impl; +package com.marklogic.hub.legacy.flow.impl; import com.marklogic.client.MarkLogicIOException; -import com.marklogic.hub.collector.Collector; -import com.marklogic.hub.collector.impl.CollectorImpl; -import com.marklogic.hub.flow.*; +import com.marklogic.hub.legacy.collector.LegacyCollector; +import com.marklogic.hub.legacy.collector.impl.LegacyCollectorImpl; +import com.marklogic.hub.legacy.flow.*; import com.marklogic.hub.main.MainPlugin; import com.marklogic.hub.main.impl.MainPluginImpl; import org.w3c.dom.Document; @@ -39,18 +39,18 @@ import java.io.*; import java.util.Properties; -public class FlowImpl implements Flow { +public class LegacyFlowImpl implements LegacyFlow { private String entityName; private String name; private FlowType type; private DataFormat dataFormat; private CodeFormat codeFormat; - private Collector collector; + private LegacyCollector collector; private MainPlugin main; private String mappingName; - public FlowImpl() {} + public LegacyFlowImpl() {} @Override public void setEntityName(String entityName) { @@ -113,12 +113,12 @@ public CodeFormat getCodeFormat() { } @Override - public Collector getCollector() { + public LegacyCollector getCollector() { return collector; } @Override - public void setCollector(Collector collector) { + public void setCollector(LegacyCollector collector) { this.collector = collector; } @@ -236,8 +236,8 @@ public Properties toProperties() { return flowProperties; } - public static Flow loadFromFile(File file) { - Flow flow = null; + public static LegacyFlow loadFromFile(File file) { + LegacyFlow flow = null; FileInputStream is = null; try { is = new FileInputStream(file); @@ -245,7 +245,7 @@ public static Flow loadFromFile(File file) { factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(is); - flow = FlowImpl.fromXml(doc.getDocumentElement()); + flow = LegacyFlowImpl.fromXml(doc.getDocumentElement()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { @@ -268,8 +268,8 @@ public static Flow loadFromFile(File file) { } - public static Flow fromXml(Node xml) { - FlowBuilder flowBuilder = FlowBuilder.newFlow(); + public static LegacyFlow fromXml(Node xml) { + LegacyFlowBuilder flowBuilder = LegacyFlowBuilder.newFlow(); NodeList children = xml.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); @@ -295,11 +295,11 @@ public static Flow fromXml(Node xml) { flowBuilder.withEntityName(node.getTextContent()); break; case "collector": - Collector collector = new CollectorImpl( + LegacyCollector legacyCollector = new LegacyCollectorImpl( node.getAttributes().getNamedItem("module").getNodeValue(), CodeFormat.getCodeFormat(node.getAttributes().getNamedItem("code-format").getNodeValue()) ); - flowBuilder.withCollector(collector); + flowBuilder.withCollector(legacyCollector); break; case "main": MainPlugin main = new MainPluginImpl( diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/impl/FlowRunnerImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/impl/LegacyFlowRunnerImpl.java similarity index 83% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/flow/impl/FlowRunnerImpl.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/impl/LegacyFlowRunnerImpl.java index 647d84c091..bf76458fdf 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/flow/impl/FlowRunnerImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/flow/impl/LegacyFlowRunnerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow.impl; +package com.marklogic.hub.legacy.flow.impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; @@ -28,12 +28,12 @@ import com.marklogic.client.util.RequestParameters; import com.marklogic.hub.DatabaseKind; import com.marklogic.hub.HubConfig; -import com.marklogic.hub.collector.Collector; -import com.marklogic.hub.collector.DiskQueue; -import com.marklogic.hub.flow.*; -import com.marklogic.hub.job.Job; -import com.marklogic.hub.job.JobManager; -import com.marklogic.hub.job.JobStatus; +import com.marklogic.hub.legacy.collector.LegacyCollector; +import com.marklogic.hub.legacy.collector.DiskQueue; +import com.marklogic.hub.legacy.job.Job; +import com.marklogic.hub.legacy.job.LegacyJobManager; +import com.marklogic.hub.legacy.job.JobStatus; +import com.marklogic.hub.legacy.flow.*; import java.io.PrintWriter; import java.io.StringWriter; @@ -43,12 +43,12 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; -public class FlowRunnerImpl implements FlowRunner { +public class LegacyFlowRunnerImpl implements LegacyFlowRunner { private static final int DEFAULT_BATCH_SIZE = 100; private static final int DEFAULT_THREAD_COUNT = 4; private static final int MAX_ERROR_MESSAGES = 10; - private Flow flow; + private LegacyFlow flow; private int batchSize = DEFAULT_BATCH_SIZE; private int threadCount = DEFAULT_THREAD_COUNT; private DatabaseClient stagingClient; @@ -57,82 +57,82 @@ public class FlowRunnerImpl implements FlowRunner { private int previousPercentComplete; private boolean stopOnFailure = false; - private List flowItemCompleteListeners = new ArrayList<>(); - private List flowItemFailureListeners = new ArrayList<>(); - private List flowStatusListeners = new ArrayList<>(); - private List flowFinishedListeners = new ArrayList<>(); + private List flowItemCompleteListeners = new ArrayList<>(); + private List flowItemFailureListeners = new ArrayList<>(); + private List flowStatusListeners = new ArrayList<>(); + private List flowFinishedListeners = new ArrayList<>(); private HubConfig hubConfig; private Thread runningThread = null; - public FlowRunnerImpl(HubConfig hubConfig) { + public LegacyFlowRunnerImpl(HubConfig hubConfig) { this.hubConfig = hubConfig; this.stagingClient = hubConfig.newStagingClient(); this.destinationDatabase = hubConfig.getDbName(DatabaseKind.FINAL); } @Override - public FlowRunner withFlow(Flow flow) { + public LegacyFlowRunner withFlow(LegacyFlow flow) { this.flow = flow; return this; } @Override - public FlowRunner withBatchSize(int batchSize) { + public LegacyFlowRunner withBatchSize(int batchSize) { this.batchSize = batchSize; return this; } @Override - public FlowRunner withThreadCount(int threadCount) { + public LegacyFlowRunner withThreadCount(int threadCount) { this.threadCount = threadCount; return this; } @Override - public FlowRunner withSourceClient(DatabaseClient stagingClient) { + public LegacyFlowRunner withSourceClient(DatabaseClient stagingClient) { this.stagingClient = stagingClient; return this; } @Override - public FlowRunner withDestinationDatabase(String destinationDatabase) { + public LegacyFlowRunner withDestinationDatabase(String destinationDatabase) { this.destinationDatabase = destinationDatabase; return this; } @Override - public FlowRunner withStopOnFailure(boolean stopOnFailure) { + public LegacyFlowRunner withStopOnFailure(boolean stopOnFailure) { this.stopOnFailure = stopOnFailure; return this; } @Override - public FlowRunner withOptions(Map options) { + public LegacyFlowRunner withOptions(Map options) { this.options = options; return this; } @Override - public FlowRunner onItemComplete(FlowItemCompleteListener listener) { + public LegacyFlowRunner onItemComplete(LegacyFlowItemCompleteListener listener) { this.flowItemCompleteListeners.add(listener); return this; } @Override - public FlowRunner onItemFailed(FlowItemFailureListener listener) { + public LegacyFlowRunner onItemFailed(LegacyFlowItemFailureListener listener) { this.flowItemFailureListeners.add(listener); return this; } @Override - public FlowRunner onStatusChanged(FlowStatusListener listener) { + public LegacyFlowRunner onStatusChanged(LegacyFlowStatusListener listener) { this.flowStatusListeners.add(listener); return this; } @Override - public FlowRunner onFinished(FlowFinishedListener listener) { + public LegacyFlowRunner onFinished(LegacyFlowFinishedListener listener) { this.flowFinishedListeners.add(listener); return this; } @@ -155,13 +155,13 @@ public void awaitCompletion(long timeout, TimeUnit unit) throws InterruptedExcep @Override public JobTicket run() { String jobId = UUID.randomUUID().toString(); - JobManager jobManager = JobManager.create(hubConfig.newJobDbClient()); + LegacyJobManager jobManager = LegacyJobManager.create(hubConfig.newJobDbClient()); Job job = Job.withFlow(flow) .withJobId(jobId); jobManager.saveJob(job); - Collector c = flow.getCollector(); + LegacyCollector c = flow.getCollector(); c.setHubConfig(hubConfig); c.setClient(stagingClient); @@ -177,7 +177,7 @@ public JobTicket run() { options.put("flow", this.flow.getName()); options.put("flowType", this.flow.getType().toString()); - flowStatusListeners.forEach((FlowStatusListener listener) -> { + flowStatusListeners.forEach((LegacyFlowStatusListener listener) -> { listener.onStatusChange(jobId, 0, "running collector"); }); @@ -198,7 +198,7 @@ public JobTicket run() { return new JobTicketImpl(jobId, JobTicket.JobType.QUERY_BATCHER); } - flowStatusListeners.forEach((FlowStatusListener listener) -> { + flowStatusListeners.forEach((LegacyFlowStatusListener listener) -> { listener.onStatusChange(jobId, 0, "starting harmonization"); }); @@ -252,14 +252,14 @@ public JobTicket run() { if (percentComplete != previousPercentComplete && (percentComplete % 5 == 0)) { previousPercentComplete = percentComplete; - flowStatusListeners.forEach((FlowStatusListener listener) -> { + flowStatusListeners.forEach((LegacyFlowStatusListener listener) -> { listener.onStatusChange(jobId, percentComplete, ""); }); } if (flowItemCompleteListeners.size() > 0) { response.completedItems.forEach((String item) -> { - flowItemCompleteListeners.forEach((FlowItemCompleteListener listener) -> { + flowItemCompleteListeners.forEach((LegacyFlowItemCompleteListener listener) -> { listener.processCompletion(jobId, item); }); }); @@ -267,7 +267,7 @@ public JobTicket run() { if (flowItemFailureListeners.size() > 0) { response.failedItems.forEach((String item) -> { - flowItemFailureListeners.forEach((FlowItemFailureListener listener) -> { + flowItemFailureListeners.forEach((LegacyFlowItemFailureListener listener) -> { listener.processFailure(jobId, item); }); }); @@ -300,11 +300,11 @@ public JobTicket run() { runningThread = new Thread(() -> { queryBatcher.awaitCompletion(); - flowStatusListeners.forEach((FlowStatusListener listener) -> { + flowStatusListeners.forEach((LegacyFlowStatusListener listener) -> { listener.onStatusChange(jobId, 100, ""); }); - flowFinishedListeners.forEach((FlowFinishedListener::onFlowFinished)); + flowFinishedListeners.forEach((LegacyFlowFinishedListener::onFlowFinished)); dataMovementManager.stopJob(queryBatcher); @@ -353,9 +353,9 @@ class FlowResource extends ResourceManager { private DatabaseClient srcClient; private String targetDatabase; - private Flow flow; + private LegacyFlow flow; - public FlowResource(DatabaseClient srcClient, String targetDatabase, Flow flow) { + public FlowResource(DatabaseClient srcClient, String targetDatabase, LegacyFlow flow) { super(); this.flow = flow; this.srcClient = srcClient; diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/DebuggingImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/impl/LegacyDebuggingImpl.java similarity index 87% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/impl/DebuggingImpl.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/impl/LegacyDebuggingImpl.java index f033833eae..38e2b5018f 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/DebuggingImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/impl/LegacyDebuggingImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.marklogic.hub.impl; +package com.marklogic.hub.legacy.impl; import com.marklogic.client.DatabaseClient; import com.marklogic.client.extensions.ResourceManager; @@ -23,12 +23,12 @@ import com.marklogic.client.io.Format; import com.marklogic.client.io.StringHandle; import com.marklogic.client.util.RequestParameters; -import com.marklogic.hub.Debugging; +import com.marklogic.hub.legacy.LegacyDebugging; -public class DebuggingImpl extends ResourceManager implements Debugging { +public class LegacyDebuggingImpl extends ResourceManager implements LegacyDebugging { private static final String NAME = "ml:debug"; - public DebuggingImpl(DatabaseClient client) { + public LegacyDebuggingImpl(DatabaseClient client) { super(); client.init(NAME, this); } diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/impl/LegacyFlowManagerImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/impl/LegacyFlowManagerImpl.java new file mode 100644 index 0000000000..aaf6d42558 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/impl/LegacyFlowManagerImpl.java @@ -0,0 +1,292 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.marklogic.hub.legacy.impl; + +import com.marklogic.client.DatabaseClient; +import com.marklogic.client.extensions.ResourceManager; +import com.marklogic.client.extensions.ResourceServices.ServiceResult; +import com.marklogic.client.extensions.ResourceServices.ServiceResultIterator; +import com.marklogic.client.io.DOMHandle; +import com.marklogic.client.util.RequestParameters; +import com.marklogic.hub.legacy.LegacyFlowManager; +import com.marklogic.hub.HubConfig; +import com.marklogic.hub.legacy.collector.impl.LegacyCollectorImpl; +import com.marklogic.hub.legacy.flow.*; +import com.marklogic.hub.legacy.flow.impl.LegacyFlowRunnerImpl; +import com.marklogic.hub.main.impl.MainPluginImpl; +import com.marklogic.hub.scaffold.Scaffolding; +import org.apache.commons.io.FileUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.regex.Pattern; + +@Component +public class LegacyFlowManagerImpl extends ResourceManager implements LegacyFlowManager { + + private static final String NAME = "ml:flow"; + + private DatabaseClient stagingClient; + + + @Autowired + private HubConfig hubConfig; + + @Autowired + private Scaffolding scaffolding; + + public LegacyFlowManagerImpl() { + super(); + } + + + public void setupClient() { + this.stagingClient = hubConfig.newStagingClient(); + this.stagingClient.init(NAME, this); + } + + @Override public List getLocalFlows() { + List flows = new ArrayList<>(); + + Path entitiesDir = hubConfig.getHubEntitiesDir(); + File[] entities = entitiesDir.toFile().listFiles((pathname -> pathname.isDirectory())); + if (entities != null) { + for (File entity : entities) { + String entityName = entity.getName(); + flows.addAll(getLocalFlowsForEntity(entityName)); + } + } + return flows; + } + + @Override public List getLocalFlowsForEntity(String entityName) { + return getLocalFlowsForEntity(entityName, null); + } + + @Override public List getLocalFlowsForEntity(String entityName, FlowType flowType) { + + List flows = new ArrayList<>(); + Path entitiesDir = hubConfig.getHubEntitiesDir(); + Path entityDir = entitiesDir.resolve(entityName); + Path inputDir = entityDir.resolve("input"); + Path harmonizeDir = entityDir.resolve("harmonize"); + boolean getInputFlows = false; + boolean getHarmonizeFlows = false; + if (flowType == null) { + getInputFlows = getHarmonizeFlows = true; + } + else if (flowType.equals(FlowType.INPUT)) { + getInputFlows = true; + } + else if (flowType.equals(FlowType.HARMONIZE)) { + getHarmonizeFlows = true; + } + + if (getInputFlows) { + File[] inputFlows = inputDir.toFile().listFiles((pathname) -> pathname.isDirectory() && !pathname.getName().equals("REST")); + if (inputFlows != null) { + for (File inputFlow : inputFlows) { + LegacyFlow flow = getLocalFlow(entityName, inputFlow.toPath(), FlowType.INPUT); + if (flow != null) { + flows.add(flow); + } + } + } + } + + if (getHarmonizeFlows) { + File[] harmonizeFlows = harmonizeDir.toFile().listFiles((pathname) -> pathname.isDirectory() && !pathname.getName().equals("REST")); + if (harmonizeFlows != null) { + for (File harmonizeFlow : harmonizeFlows) { + LegacyFlow flow = getLocalFlow(entityName, harmonizeFlow.toPath(), FlowType.HARMONIZE); + if (flow != null) { + flows.add(flow); + } + + } + } + } + return flows; + } + + @Override public LegacyFlow getFlowFromProperties(Path propertiesFile) { + String quotedSeparator = Pattern.quote(File.separator); + /* Extract flowName and entityName from ..../plugins/entities// + * input|harmonize//flowName.properties + */ + String floweRegex = ".+" + "plugins" + quotedSeparator + "entities" + quotedSeparator + "(.+)"+ quotedSeparator + +"(input|harmonize)" + quotedSeparator + "(.+)" + quotedSeparator + ".+"; + FlowType flowType = propertiesFile.toString().replaceAll(floweRegex, "$2").equals("input") + ? FlowType.INPUT : FlowType.HARMONIZE; + + String entityName = propertiesFile.toString().replaceAll(floweRegex, "$1"); + return getLocalFlow(entityName, propertiesFile.getParent(), flowType); + } + + private LegacyFlow getLocalFlow(String entityName, Path flowDir, FlowType flowType) { + try { + String flowName = flowDir.getFileName().toString(); + File propertiesFile = flowDir.resolve(flowName + ".properties").toFile(); + if (propertiesFile.exists()) { + Properties properties = new Properties(); + FileInputStream fis = new FileInputStream(propertiesFile); + properties.load(fis); + + // trim trailing whitespaces for properties. + for (String key : properties.stringPropertyNames()){ + properties.put(key, properties.get(key).toString().trim()); + } + fis.close(); + + LegacyFlowBuilder flowBuilder = LegacyFlowBuilder.newFlow() + .withEntityName(entityName) + .withName(flowName) + .withType(flowType) + .withCodeFormat(CodeFormat.getCodeFormat((String) properties.get("codeFormat"))) + .withDataFormat(DataFormat.getDataFormat((String) properties.get("dataFormat"))) + .withMain(new MainPluginImpl((String) properties.get("mainModule"), CodeFormat.getCodeFormat((String) properties.get("mainCodeFormat")))); + + if (flowType.equals(FlowType.HARMONIZE)) { + flowBuilder.withCollector(new LegacyCollectorImpl((String) properties.get("collectorModule"), CodeFormat.getCodeFormat((String) properties.get("collectorCodeFormat")))); + } + + return flowBuilder.build(); + } + } + catch(Exception e) { + e.printStackTrace(); + } + return null; + } + + @Override public List getFlows(String entityName) { + RequestParameters params = new RequestParameters(); + params.add("entity-name", entityName); + ServiceResultIterator resultItr = this.getServices().get(params); + if (resultItr == null || ! resultItr.hasNext()) { + return null; + } + ServiceResult res = resultItr.next(); + DOMHandle handle = new DOMHandle(); + Document parent = res.getContent(handle).get(); + NodeList children = parent.getDocumentElement().getChildNodes(); + + ArrayList flows = null; + if (children.getLength() > 0) { + flows = new ArrayList<>(); + } + + Node node; + for (int i = 0; i < children.getLength(); i++) { + node = children.item(i); + if (node.getNodeType() == Node.ELEMENT_NODE) { + flows.add(LegacyFlowManager.flowFromXml((Element)children.item(i))); + } + } + return flows; + } + + @Override public LegacyFlow getFlow(String entityName, String flowName) { + return getFlow(entityName, flowName, null); + } + + @Override public LegacyFlow getFlow(String entityName, String flowName, FlowType flowType) { + RequestParameters params = new RequestParameters(); + params.add("entity-name", entityName); + params.add("flow-name", flowName); + if (flowType != null) { + params.add("flow-type", flowType.toString()); + } + ServiceResultIterator resultItr = this.getServices().get(params); + if (resultItr == null || ! resultItr.hasNext()) { + return null; + } + ServiceResult res = resultItr.next(); + DOMHandle handle = new DOMHandle(); + Document parent = res.getContent(handle).get(); + return LegacyFlowManager.flowFromXml(parent.getDocumentElement()); + } + + @Override public List getLegacyFlows() { + List oldFlows = new ArrayList<>(); + Path entitiesDir = hubConfig.getHubEntitiesDir(); + + File[] entityDirs = entitiesDir.toFile().listFiles(pathname -> pathname.isDirectory()); + if (entityDirs != null) { + for (File entityDir : entityDirs) { + Path inputDir = entityDir.toPath().resolve("input"); + Path harmonizeDir = entityDir.toPath().resolve("harmonize"); + + File[] inputFlows = inputDir.toFile().listFiles((pathname) -> pathname.isDirectory() && !pathname.getName().equals("REST")); + addLegacyFlowToList(oldFlows, entityDir, inputFlows); + + File[] harmonizeFlows = harmonizeDir.toFile().listFiles((pathname) -> pathname.isDirectory() && !pathname.getName().equals("REST")); + addLegacyFlowToList(oldFlows, entityDir, harmonizeFlows); + } + } + + return oldFlows; + } + + private void addLegacyFlowToList(List oldFlows, File entityDir, File[] flows) { + if (flows != null) { + for (File flow : flows) { + File[] mainFiles = flow.listFiles((dir, name) -> name.matches("main\\.(sjs|xqy)")); + File[] flowFiles = flow.listFiles((dir, name) -> name.matches(flow.getName() + "\\.xml")); + if (mainFiles.length < 1 && flowFiles.length == 1) { + oldFlows.add(entityDir.getName() + " => " + flow.getName()); + } else if (mainFiles.length == 1 && mainFiles[0].getName().contains(".sjs")) { + try { + String mainFile = FileUtils.readFileToString(mainFiles[0]); + if (mainFile.contains("dhf.xqy")) { + oldFlows.add(entityDir.getName() + " => " + flow.getName()); + } + } + catch(IOException e) {} + } + } + } + } + + @Override public List updateLegacyFlows(String fromVersion) { + + List updatedFlows = new ArrayList<>(); + File[] entityDirs = hubConfig.getHubEntitiesDir().toFile().listFiles(pathname -> pathname.isDirectory()); + if (entityDirs != null) { + for (File entityDir : entityDirs) { + updatedFlows.addAll(scaffolding.updateLegacyFlows(fromVersion, entityDir.getName())); + } + } + + return updatedFlows; + } + + @Override public LegacyFlowRunner newFlowRunner() { + return new LegacyFlowRunnerImpl(hubConfig); + } + +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/TracingImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/impl/LegacyTracingImpl.java similarity index 88% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/impl/TracingImpl.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/impl/LegacyTracingImpl.java index 21bf832524..8f86c83972 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/impl/TracingImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/impl/LegacyTracingImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.impl; +package com.marklogic.hub.legacy.impl; import com.marklogic.client.DatabaseClient; import com.marklogic.client.extensions.ResourceManager; @@ -22,12 +22,12 @@ import com.marklogic.client.io.Format; import com.marklogic.client.io.StringHandle; import com.marklogic.client.util.RequestParameters; -import com.marklogic.hub.Tracing; +import com.marklogic.hub.legacy.LegacyTracing; -public class TracingImpl extends ResourceManager implements Tracing { +public class LegacyTracingImpl extends ResourceManager implements LegacyTracing { private static final String NAME = "ml:tracing"; - public TracingImpl(DatabaseClient client) { + public LegacyTracingImpl(DatabaseClient client) { super(); client.init(NAME, this); } diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/Job.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/Job.java similarity index 95% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/job/Job.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/Job.java index bad586ea9a..2dfc1e7e47 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/Job.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/Job.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.job; +package com.marklogic.hub.legacy.job; import com.marklogic.client.pojo.annotation.Id; -import com.marklogic.hub.flow.Flow; +import com.marklogic.hub.legacy.flow.LegacyFlow; import java.util.ArrayList; import java.util.Date; @@ -47,7 +47,7 @@ public Job withJobId(String jobId) { return this; } - public static Job withFlow(Flow flow) { + public static Job withFlow(LegacyFlow flow) { Job job = new Job(); job.flowType = flow.getType().toString(); job.flowName = flow.getName(); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobDeleteResponse.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/JobDeleteResponse.java similarity index 93% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobDeleteResponse.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/JobDeleteResponse.java index b9a23c5116..5517c4a12c 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobDeleteResponse.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/JobDeleteResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.job; +package com.marklogic.hub.legacy.job; import com.fasterxml.jackson.databind.JsonNode; diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobExportResponse.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/JobExportResponse.java similarity index 89% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobExportResponse.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/JobExportResponse.java index f059af0aeb..30e941170d 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobExportResponse.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/JobExportResponse.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.marklogic.hub.job; +package com.marklogic.hub.legacy.job; public class JobExportResponse { public long totalJobs = 0; diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobStatus.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/JobStatus.java similarity index 93% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobStatus.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/JobStatus.java index 1127c42c44..5a49c4edd3 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobStatus.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/JobStatus.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.job; +package com.marklogic.hub.legacy.job; public enum JobStatus { diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobManager.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/LegacyJobManager.java similarity index 84% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobManager.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/LegacyJobManager.java index 9882cfa9f9..d09744bda9 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/JobManager.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/LegacyJobManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,11 +14,11 @@ * limitations under the License. */ -package com.marklogic.hub.job; +package com.marklogic.hub.legacy.job; import com.marklogic.client.DatabaseClient; import com.marklogic.client.Transaction; -import com.marklogic.hub.job.impl.JobManagerImpl; +import com.marklogic.hub.legacy.job.impl.LegacyJobManagerImpl; import java.io.IOException; import java.nio.file.Path; @@ -26,15 +26,15 @@ /** * Handles jobs and their creation, status, and deletion. */ -public interface JobManager { +public interface LegacyJobManager { /** - * Creates and returns a JobManager object + * Creates and returns a LegacyJobManager object * @param jobClient the database client that is used to connect to the jobs database - * @return JobManager object + * @return LegacyJobManager object */ - static JobManager create(DatabaseClient jobClient){ - return new JobManagerImpl(jobClient); + static LegacyJobManager create(DatabaseClient jobClient){ + return new LegacyJobManagerImpl(jobClient); } /** diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/impl/JobManagerImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/impl/LegacyJobManagerImpl.java similarity index 96% rename from marklogic-data-hub/src/main/java/com/marklogic/hub/job/impl/JobManagerImpl.java rename to marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/impl/LegacyJobManagerImpl.java index 641364dd3d..c794f0c349 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/job/impl/JobManagerImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/legacy/job/impl/LegacyJobManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.job.impl; +package com.marklogic.hub.legacy.job.impl; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; @@ -36,10 +36,10 @@ import com.marklogic.client.query.StructuredQueryBuilder; import com.marklogic.client.query.StructuredQueryDefinition; import com.marklogic.client.util.RequestParameters; -import com.marklogic.hub.job.Job; -import com.marklogic.hub.job.JobDeleteResponse; -import com.marklogic.hub.job.JobExportResponse; -import com.marklogic.hub.job.JobManager; +import com.marklogic.hub.legacy.job.Job; +import com.marklogic.hub.legacy.job.JobDeleteResponse; +import com.marklogic.hub.legacy.job.JobExportResponse; +import com.marklogic.hub.legacy.job.LegacyJobManager; import javax.xml.namespace.QName; import java.io.File; @@ -53,7 +53,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -public class JobManagerImpl implements JobManager { +public class LegacyJobManagerImpl implements LegacyJobManager { private DatabaseClient jobClient; private JSONDocumentManager docMgr; @@ -81,7 +81,7 @@ public class JobManagerImpl implements JobManager { .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) .setDateFormat(simpleDateFormat8601); - public JobManagerImpl(DatabaseClient jobClient) { + public LegacyJobManagerImpl(DatabaseClient jobClient) { this.jobClient = jobClient; this.docMgr = jobClient.newJSONDocumentManager(); this.jobDeleteRunner = new JobDeleteResource(jobClient); diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/main/MainPlugin.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/main/MainPlugin.java index d5eafbe73f..d6e7cb2881 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/main/MainPlugin.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/main/MainPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ package com.marklogic.hub.main; -import com.marklogic.hub.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.CodeFormat; /** * Interface to the in-memory representation of the main plugin module (main.sjs or main.xqy) diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/main/impl/MainPluginImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/main/impl/MainPluginImpl.java index 7c3c1287de..48fe88455e 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/main/impl/MainPluginImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/main/impl/MainPluginImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ package com.marklogic.hub.main.impl; -import com.marklogic.hub.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.CodeFormat; import com.marklogic.hub.main.MainPlugin; public class MainPluginImpl implements MainPlugin { diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/mapping/MappingImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/mapping/MappingImpl.java index 8e26e05ddd..8796395ba6 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/mapping/MappingImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/mapping/MappingImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/processes/Process.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/processes/Process.java new file mode 100644 index 0000000000..2f7f084ddc --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/processes/Process.java @@ -0,0 +1,107 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.marklogic.hub.processes; + +import com.fasterxml.jackson.databind.JsonNode; + +import java.util.ArrayList; +import java.util.Arrays; + +public interface Process { + + enum ProcessType { + INGEST("ingest"), + MAPPING("mapping"), + CUSTOM("custom"); + + private String type; + + ProcessType(String type) { + this.type = type; + } + + public static ProcessType getProcessType(String type) { + for (ProcessType processType : ProcessType.values()) { + if (processType.toString().equalsIgnoreCase(type)) { + return processType; + } + } + return null; + } + + public static ArrayList getProcessTypes() { + return new ArrayList<>(Arrays.asList(ProcessType.values())); + } + + public String toString() { + return this.type; + } + } + + /** + * Creates an in-memory default instance of a Process given a name and a type + * + * @param name - the name of the Process + * @param type - the type of the mapping + * @return a Process object + */ + static Process create(String name, ProcessType type) { + return new ProcessImpl(name, type); + } + + /** + * Returns the name of the processes + * + * @return a processes name + */ + String getName(); + + /** + * Sets the name of the processes + * + * @param name - a processes name + */ + void setName(String name); + + /** + * Returns the type of the Process + * + * @return - a processes type + */ + ProcessType getType(); + + /** + * Sets the type of the processes + * + * @param type - a processes type + */ + void setType(ProcessType type); + + /** + * Serializes the mapping as a json string + * + * @return the serialized JSON string + */ + String serialize(); + + /** + * Deserialize a json response and applies it to this mapping + * + * @param json - the JsonNode you want deserialize + */ + void deserialize(JsonNode json); +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/processes/ProcessImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/processes/ProcessImpl.java new file mode 100644 index 0000000000..3a6c8711e7 --- /dev/null +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/processes/ProcessImpl.java @@ -0,0 +1,99 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.marklogic.hub.processes; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.marklogic.hub.error.DataHubProjectException; + +public class ProcessImpl implements Process { + private String name; + private ProcessType type; + private int version; + private JsonNode options; + + ProcessImpl(String name, ProcessType type) { + this.name = name; + this.type = type; + this.version = 1; + this.options = JsonNodeFactory.instance.objectNode(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ProcessType getType() { + return type; + } + + public void setType(ProcessType type) { + this.type = type; + } + + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + public JsonNode getOptions() { + return options; + } + + public void setOptions(JsonNode options) { + this.options = options; + } + + @Override + public String serialize() { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } + catch (JsonProcessingException e) { + throw new DataHubProjectException("Unable to serialize processes object."); + } + } + + @Override + public void deserialize(JsonNode json) { + if (json.has("name")) { + setName(json.get("name").asText()); + } + + if (json.has("type")) { + setType(ProcessType.getProcessType(json.get("type").asText())); + } + + if (json.has("version")) { + setVersion(json.get("version").asInt()); + } + + if (json.has("options")) { + setOptions(json.get("options")); + } + } +} diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/scaffold/Scaffolding.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/scaffold/Scaffolding.java index eb442f18f4..4e468f375e 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/scaffold/Scaffolding.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/scaffold/Scaffolding.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,13 +16,11 @@ package com.marklogic.hub.scaffold; -import com.marklogic.client.DatabaseClient; import com.marklogic.hub.HubProject; import com.marklogic.hub.error.ScaffoldingValidationException; -import com.marklogic.hub.flow.CodeFormat; -import com.marklogic.hub.flow.DataFormat; -import com.marklogic.hub.flow.FlowType; -import com.marklogic.hub.impl.ScaffoldingImpl; +import com.marklogic.hub.legacy.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.DataFormat; +import com.marklogic.hub.legacy.flow.FlowType; import java.nio.file.Path; import java.util.List; diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/FileUtil.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/FileUtil.java index f3f3bcc9dc..90e5407b67 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/FileUtil.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/FileUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/HubModuleManager.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/HubModuleManager.java index d4568d7c22..69e5c55d1a 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/HubModuleManager.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/HubModuleManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/JsonXor.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/JsonXor.java index c4e0b372da..e0ee54232f 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/JsonXor.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/JsonXor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/MlcpConsumer.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/MlcpConsumer.java index 5f7f2617eb..3317740198 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/MlcpConsumer.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/MlcpConsumer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ package com.marklogic.hub.util; -import com.marklogic.hub.flow.FlowStatusListener; +import com.marklogic.hub.legacy.flow.LegacyFlowStatusListener; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; @@ -29,10 +29,10 @@ public class MlcpConsumer implements Consumer { private static final Pattern FAILED_EVENTS_PATTERN = Pattern.compile("^.+OUTPUT_RECORDS_FAILED\\s+(\\d+).*$"); private AtomicLong successfulEvents; private AtomicLong failedEvents; - private FlowStatusListener statusListener; + private LegacyFlowStatusListener statusListener; private String jobId; - public MlcpConsumer(AtomicLong successfulEvents, AtomicLong failedEvents, FlowStatusListener statusListener, + public MlcpConsumer(AtomicLong successfulEvents, AtomicLong failedEvents, LegacyFlowStatusListener statusListener, String jobId) { this.successfulEvents = successfulEvents; diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/MlcpRunner.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/MlcpRunner.java index 044330e417..9f2592beb5 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/MlcpRunner.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/MlcpRunner.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,11 +20,11 @@ import com.marklogic.client.DatabaseClient; import com.marklogic.contentpump.bean.MlcpBean; import com.marklogic.hub.HubConfig; -import com.marklogic.hub.flow.Flow; -import com.marklogic.hub.flow.FlowStatusListener; -import com.marklogic.hub.job.Job; -import com.marklogic.hub.job.JobManager; -import com.marklogic.hub.job.JobStatus; +import com.marklogic.hub.legacy.flow.LegacyFlow; +import com.marklogic.hub.legacy.flow.LegacyFlowStatusListener; +import com.marklogic.hub.legacy.job.Job; +import com.marklogic.hub.legacy.job.LegacyJobManager; +import com.marklogic.hub.legacy.job.JobStatus; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,24 +38,24 @@ public class MlcpRunner extends ProcessRunner { private static Logger logger = LoggerFactory.getLogger(MlcpRunner.class); - private JobManager jobManager; - private Flow flow; + private LegacyJobManager jobManager; + private LegacyFlow flow; private JsonNode mlcpOptions; private String jobId = UUID.randomUUID().toString(); private AtomicLong successfulEvents = new AtomicLong(0); private AtomicLong failedEvents = new AtomicLong(0); - FlowStatusListener flowStatusListener; + LegacyFlowStatusListener flowStatusListener; private String mlcpPath; private String mainClass; private DatabaseClient databaseClient; private String database = null; - public MlcpRunner(String mlcpPath, String mainClass, HubConfig hubConfig, Flow flow, DatabaseClient databaseClient, JsonNode mlcpOptions, FlowStatusListener statusListener) { + public MlcpRunner(String mlcpPath, String mainClass, HubConfig hubConfig, LegacyFlow flow, DatabaseClient databaseClient, JsonNode mlcpOptions, LegacyFlowStatusListener statusListener) { super(); this.withHubconfig(hubConfig); - this.jobManager = JobManager.create(hubConfig.newJobDbClient()); + this.jobManager = LegacyJobManager.create(hubConfig.newJobDbClient()); this.flowStatusListener = statusListener; this.flow = flow; this.mlcpOptions = mlcpOptions; diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/PerformanceLogger.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/PerformanceLogger.java index 80a59d67ec..15a55b9aae 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/PerformanceLogger.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/PerformanceLogger.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/ProcessRunner.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/ProcessRunner.java index 678e3a7ec7..20f9553e9c 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/ProcessRunner.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/ProcessRunner.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/StreamGobbler.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/StreamGobbler.java index b2fdbc0fa1..ff604c0fe4 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/util/StreamGobbler.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/util/StreamGobbler.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/validate/EntitiesValidator.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/validate/EntitiesValidator.java index d05b93553a..281cb45e01 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/validate/EntitiesValidator.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/validate/EntitiesValidator.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/java/com/marklogic/hub/validate/impl/EntitiesValidatorImpl.java b/marklogic-data-hub/src/main/java/com/marklogic/hub/validate/impl/EntitiesValidatorImpl.java index a60ad5241b..f455a8a24a 100644 --- a/marklogic-data-hub/src/main/java/com/marklogic/hub/validate/impl/EntitiesValidatorImpl.java +++ b/marklogic-data-hub/src/main/java/com/marklogic/hub/validate/impl/EntitiesValidatorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/configurations/amps.json b/marklogic-data-hub/src/main/resources/hub-internal-config/configurations/amps.json deleted file mode 100644 index 6be1561019..0000000000 --- a/marklogic-data-hub/src/main/resources/hub-internal-config/configurations/amps.json +++ /dev/null @@ -1,600 +0,0 @@ -{ - "config": { - "amp": [ - { - "namespace": "", - "local-name": "addResponseHeader", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.sjs", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/db-util", - "local-name": "access-config", - "document-uri": "/data-hub/4/rest-api/lib/db-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/db-util", - "local-name": "update-config", - "document-uri": "/data-hub/4/rest-api/lib/db-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/db-util", - "local-name": "rest-modules-database", - "document-uri": "/data-hub/4/rest-api/lib/db-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/db-util", - "local-name": "do-set-transaction-time-limit", - "document-uri": "/data-hub/4/rest-api/lib/db-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "add-cookie", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "add-response-header", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "default-page-with-transform", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "delete-cookie", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "get-mimetypes", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "get-server-field", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "invoke-module", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "set-server-field", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "xslt-invoke", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/endpoint-util", - "local-name": "lookup-role-ids", - "document-uri": "/data-hub/4/rest-api/lib/endpoint-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-common", - "local-name": "read-collections", - "document-uri": "/data-hub/4/rest-api/models/document-model-common.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-common", - "local-name": "read-permissions", - "document-uri": "/data-hub/4/rest-api/models/document-model-common.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-common", - "local-name": "read-properties", - "document-uri": "/data-hub/4/rest-api/models/document-model-common.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-common", - "local-name": "read-quality", - "document-uri": "/data-hub/4/rest-api/models/document-model-common.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-common", - "local-name": "lookup-role-names", - "document-uri": "/data-hub/4/rest-api/models/document-model-common.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-query", - "local-name": "get", - "document-uri": "/data-hub/4/rest-api/models/document-model-query.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-query-get", - "local-name": "get", - "document-uri": "/data-hub/4/rest-api/models/document-model-query-get.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-query-head", - "local-name": "head", - "document-uri": "/data-hub/4/rest-api/models/document-model-query-head.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-query", - "local-name": "read-content", - "document-uri": "/data-hub/4/rest-api/models/document-model-query.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-query", - "local-name": "check-document-exists", - "document-uri": "/data-hub/4/rest-api/models/document-model-query.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "put", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update-put", - "local-name": "put", - "document-uri": "/data-hub/4/rest-api/models/document-model-update-put.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update-delete", - "local-name": "delete", - "document-uri": "/data-hub/4/rest-api/models/document-model-update-delete.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "patch", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "delete", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "apply-content-patch", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "apply-metadata-patch", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "delete-document", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "write-content", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "load-content", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "write-collections", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "write-permissions", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "write-properties", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "write-quality", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "replace-role-permissions", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "replace-named-properties", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "remove-collections", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "reset-permissions", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "remove-properties", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "reset-quality", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/document-model-update", - "local-name": "cpf-config", - "document-uri": "/data-hub/4/rest-api/models/document-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "manage-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/config-query", - "local-name": "put", - "document-uri": "/MarkLogic/rest-api/models/config-query-model.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/config-query", - "local-name": "post", - "document-uri": "/MarkLogic/rest-api/models/config-query-model.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/config-query", - "local-name": "put-child", - "document-uri": "/MarkLogic/rest-api/models/config-query-model.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/config-query", - "local-name": "post-child", - "document-uri": "/MarkLogic/rest-api/models/config-query-model.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/config-query", - "local-name": "get", - "document-uri": "/MarkLogic/rest-api/models/config-query-model.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/config-query", - "local-name": "get-child", - "document-uri": "/MarkLogic/rest-api/models/config-query-model.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/config-query", - "local-name": "get-options", - "document-uri": "/MarkLogic/rest-api/models/config-query-model.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/search-util", - "local-name": "search-to-json", - "document-uri": "/MarkLogic/rest-api/lib/search-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/search-util", - "local-name": "search-from-json", - "document-uri": "/MarkLogic/rest-api/lib/search-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/forestinfo", - "local-name": "get-forest-info", - "document-uri": "/data-hub/4/rest-api/models/forest-info-model.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/search-model-update", - "local-name": "delete", - "document-uri": "/data-hub/4/rest-api/models/search-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-writer-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/models/search-model-update", - "local-name": "clear", - "document-uri": "/data-hub/4/rest-api/models/search-model-update.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/extensions-util", - "local-name": "do-directory-delete", - "document-uri": "/data-hub/4/rest-api/lib/extensions-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/extensions-util", - "local-name": "do-document-delete", - "document-uri": "/data-hub/4/rest-api/lib/extensions-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/extensions-util", - "local-name": "do-document-insert", - "document-uri": "/data-hub/4/rest-api/lib/extensions-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/extensions-util", - "local-name": "do-eval", - "document-uri": "/data-hub/4/rest-api/lib/extensions-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/extensions-util", - "local-name": "do-js-eval", - "document-uri": "/data-hub/4/rest-api/lib/extensions-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/extensions-util", - "local-name": "do-list-extension-metadata", - "document-uri": "/data-hub/4/rest-api/lib/extensions-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/extensions-util", - "local-name": "execute-transform", - "document-uri": "/data-hub/4/rest-api/lib/extensions-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-admin-internal" - ] - }, - { - "namespace": "http://marklogic.com/rest-api/lib/extensions-util", - "local-name": "invoke-service", - "document-uri": "/data-hub/4/rest-api/lib/extensions-util.xqy", - "modules-database": "data-hub-MODULES", - "role": [ - "rest-reader-internal" - ] - } - ] - } -} diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-1.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-1.json new file mode 100755 index 0000000000..9cbbe4c55f --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-1.json @@ -0,0 +1,7 @@ +{ + "namespace" : "", + "local-name" : "addResponseHeader", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.sjs", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-10.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-10.json new file mode 100755 index 0000000000..9db2ebf7a3 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-10.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "get-mimetypes", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-11.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-11.json new file mode 100755 index 0000000000..9835b90a31 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-11.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "get-server-field", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-12.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-12.json new file mode 100755 index 0000000000..a6e79a7c0c --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-12.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "invoke-module", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-13.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-13.json new file mode 100755 index 0000000000..6fd3aa8007 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-13.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "set-server-field", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-14.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-14.json new file mode 100755 index 0000000000..1f4423f367 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-14.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "xslt-invoke", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-15.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-15.json new file mode 100755 index 0000000000..b570fd83bf --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-15.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "lookup-role-ids", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-16.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-16.json new file mode 100755 index 0000000000..6571a59d54 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-16.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-common", + "local-name" : "read-collections", + "document-uri" : "/data-hub/4/rest-api/models/document-model-common.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-17.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-17.json new file mode 100755 index 0000000000..16c28a2e84 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-17.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-common", + "local-name" : "read-permissions", + "document-uri" : "/data-hub/4/rest-api/models/document-model-common.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-18.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-18.json new file mode 100755 index 0000000000..b32b94fe4b --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-18.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-common", + "local-name" : "read-properties", + "document-uri" : "/data-hub/4/rest-api/models/document-model-common.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-19.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-19.json new file mode 100755 index 0000000000..3dc1423291 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-19.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-common", + "local-name" : "read-quality", + "document-uri" : "/data-hub/4/rest-api/models/document-model-common.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-2.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-2.json new file mode 100755 index 0000000000..c812ec488b --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-2.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/db-util", + "local-name" : "access-config", + "document-uri" : "/data-hub/4/rest-api/lib/db-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-20.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-20.json new file mode 100755 index 0000000000..f6adb1ac1d --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-20.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-common", + "local-name" : "lookup-role-names", + "document-uri" : "/data-hub/4/rest-api/models/document-model-common.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-21.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-21.json new file mode 100755 index 0000000000..68e8cb93ae --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-21.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-query", + "local-name" : "get", + "document-uri" : "/data-hub/4/rest-api/models/document-model-query.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-22.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-22.json new file mode 100755 index 0000000000..f6d686d93a --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-22.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-query-get", + "local-name" : "get", + "document-uri" : "/data-hub/4/rest-api/models/document-model-query-get.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-23.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-23.json new file mode 100755 index 0000000000..5b5e35ef12 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-23.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-query-head", + "local-name" : "head", + "document-uri" : "/data-hub/4/rest-api/models/document-model-query-head.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-24.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-24.json new file mode 100755 index 0000000000..6388b39f6c --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-24.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-query", + "local-name" : "read-content", + "document-uri" : "/data-hub/4/rest-api/models/document-model-query.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-25.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-25.json new file mode 100755 index 0000000000..0ff2f206a3 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-25.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-query", + "local-name" : "check-document-exists", + "document-uri" : "/data-hub/4/rest-api/models/document-model-query.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-26.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-26.json new file mode 100755 index 0000000000..c80e8a62df --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-26.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "put", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-27.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-27.json new file mode 100755 index 0000000000..9145772c23 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-27.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update-put", + "local-name" : "put", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update-put.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-28.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-28.json new file mode 100755 index 0000000000..93dd668716 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-28.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update-delete", + "local-name" : "delete", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update-delete.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-29.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-29.json new file mode 100755 index 0000000000..cae6426d90 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-29.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "patch", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-3.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-3.json new file mode 100755 index 0000000000..121bb1c8f5 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-3.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/db-util", + "local-name" : "update-config", + "document-uri" : "/data-hub/4/rest-api/lib/db-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-30.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-30.json new file mode 100755 index 0000000000..38ac369432 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-30.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "delete", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-31.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-31.json new file mode 100755 index 0000000000..aa7d146507 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-31.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "apply-content-patch", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-32.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-32.json new file mode 100755 index 0000000000..b9a6500aca --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-32.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "apply-metadata-patch", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-33.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-33.json new file mode 100755 index 0000000000..54213d5a09 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-33.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "delete-document", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-34.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-34.json new file mode 100755 index 0000000000..348938b92a --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-34.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "write-content", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-35.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-35.json new file mode 100755 index 0000000000..625fe6c1ee --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-35.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "load-content", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-36.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-36.json new file mode 100755 index 0000000000..887c60df49 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-36.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "write-collections", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-37.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-37.json new file mode 100755 index 0000000000..586513eae3 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-37.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "write-permissions", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-38.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-38.json new file mode 100755 index 0000000000..a18cf70654 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-38.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "write-properties", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-39.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-39.json new file mode 100755 index 0000000000..90b1aa3f5e --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-39.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "write-quality", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-4.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-4.json new file mode 100755 index 0000000000..1a82211bf9 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-4.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/db-util", + "local-name" : "rest-modules-database", + "document-uri" : "/data-hub/4/rest-api/lib/db-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-40.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-40.json new file mode 100755 index 0000000000..58ac19a717 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-40.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "replace-role-permissions", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-41.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-41.json new file mode 100755 index 0000000000..bfb7466cc7 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-41.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "replace-named-properties", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-42.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-42.json new file mode 100755 index 0000000000..1b1fd300ac --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-42.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "remove-collections", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-43.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-43.json new file mode 100755 index 0000000000..093f828ef1 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-43.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "reset-permissions", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-44.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-44.json new file mode 100755 index 0000000000..1efa5eb7f9 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-44.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "remove-properties", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-45.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-45.json new file mode 100755 index 0000000000..d23ae9373e --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-45.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "reset-quality", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-46.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-46.json new file mode 100755 index 0000000000..932d6a8c42 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-46.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/document-model-update", + "local-name" : "cpf-config", + "document-uri" : "/data-hub/4/rest-api/models/document-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "manage-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-47.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-47.json new file mode 100755 index 0000000000..e62681d1d7 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-47.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/config-query", + "local-name" : "put", + "document-uri" : "/MarkLogic/rest-api/models/config-query-model.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-48.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-48.json new file mode 100755 index 0000000000..bb08f91901 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-48.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/config-query", + "local-name" : "post", + "document-uri" : "/MarkLogic/rest-api/models/config-query-model.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-49.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-49.json new file mode 100755 index 0000000000..81d83e4c09 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-49.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/config-query", + "local-name" : "put-child", + "document-uri" : "/MarkLogic/rest-api/models/config-query-model.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-5.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-5.json new file mode 100755 index 0000000000..1372c4bc34 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-5.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/db-util", + "local-name" : "do-set-transaction-time-limit", + "document-uri" : "/data-hub/4/rest-api/lib/db-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-50.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-50.json new file mode 100755 index 0000000000..e6dab507b0 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-50.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/config-query", + "local-name" : "post-child", + "document-uri" : "/MarkLogic/rest-api/models/config-query-model.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-51.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-51.json new file mode 100755 index 0000000000..272fa4ed54 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-51.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/config-query", + "local-name" : "get", + "document-uri" : "/MarkLogic/rest-api/models/config-query-model.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-52.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-52.json new file mode 100755 index 0000000000..7c99412aaf --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-52.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/config-query", + "local-name" : "get-child", + "document-uri" : "/MarkLogic/rest-api/models/config-query-model.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-53.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-53.json new file mode 100755 index 0000000000..bc0b75c32e --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-53.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/config-query", + "local-name" : "get-options", + "document-uri" : "/MarkLogic/rest-api/models/config-query-model.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-54.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-54.json new file mode 100755 index 0000000000..beaafeccbe --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-54.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/search-util", + "local-name" : "search-to-json", + "document-uri" : "/MarkLogic/rest-api/lib/search-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-55.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-55.json new file mode 100755 index 0000000000..ca1ea3fc8a --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-55.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/search-util", + "local-name" : "search-from-json", + "document-uri" : "/MarkLogic/rest-api/lib/search-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-56.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-56.json new file mode 100755 index 0000000000..aa74723b40 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-56.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/forestinfo", + "local-name" : "get-forest-info", + "document-uri" : "/data-hub/4/rest-api/models/forest-info-model.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-57.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-57.json new file mode 100755 index 0000000000..440418174c --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-57.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/search-model-update", + "local-name" : "delete", + "document-uri" : "/data-hub/4/rest-api/models/search-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-writer-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-58.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-58.json new file mode 100755 index 0000000000..b86b8e89de --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-58.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/models/search-model-update", + "local-name" : "clear", + "document-uri" : "/data-hub/4/rest-api/models/search-model-update.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-59.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-59.json new file mode 100755 index 0000000000..1b3a64b121 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-59.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/extensions-util", + "local-name" : "do-directory-delete", + "document-uri" : "/data-hub/4/rest-api/lib/extensions-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-6.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-6.json new file mode 100755 index 0000000000..106398f1a6 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-6.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "add-cookie", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-60.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-60.json new file mode 100755 index 0000000000..bf8288eb15 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-60.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/extensions-util", + "local-name" : "do-document-delete", + "document-uri" : "/data-hub/4/rest-api/lib/extensions-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-61.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-61.json new file mode 100755 index 0000000000..69d6b4eb3d --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-61.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/extensions-util", + "local-name" : "do-document-insert", + "document-uri" : "/data-hub/4/rest-api/lib/extensions-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-62.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-62.json new file mode 100755 index 0000000000..c0bb7da57a --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-62.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/extensions-util", + "local-name" : "do-eval", + "document-uri" : "/data-hub/4/rest-api/lib/extensions-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-63.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-63.json new file mode 100755 index 0000000000..5f1157e0a5 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-63.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/extensions-util", + "local-name" : "do-js-eval", + "document-uri" : "/data-hub/4/rest-api/lib/extensions-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-64.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-64.json new file mode 100755 index 0000000000..9a56feaf6d --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-64.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/extensions-util", + "local-name" : "do-list-extension-metadata", + "document-uri" : "/data-hub/4/rest-api/lib/extensions-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-65.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-65.json new file mode 100755 index 0000000000..8a8daabf7e --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-65.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/extensions-util", + "local-name" : "execute-transform", + "document-uri" : "/data-hub/4/rest-api/lib/extensions-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-admin-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-66.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-66.json new file mode 100755 index 0000000000..657f557a35 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-66.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/extensions-util", + "local-name" : "invoke-service", + "document-uri" : "/data-hub/4/rest-api/lib/extensions-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-7.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-7.json new file mode 100755 index 0000000000..a1e33f079c --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-7.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "add-response-header", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-8.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-8.json new file mode 100755 index 0000000000..407fe3301b --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-8.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "default-page-with-transform", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-9.json b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-9.json new file mode 100755 index 0000000000..89aec9d38a --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/security/amps/dhf-amp-9.json @@ -0,0 +1,7 @@ +{ + "namespace" : "http://marklogic.com/rest-api/lib/endpoint-util", + "local-name" : "delete-cookie", + "document-uri" : "/data-hub/4/rest-api/lib/endpoint-util.xqy", + "modules-database" : "%%mlModulesDbName%%", + "role" : [ "rest-reader-internal" ] +} \ No newline at end of file diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/triggers/ml-dh-entity-create.json b/marklogic-data-hub/src/main/resources/hub-internal-config/triggers/ml-dh-entity-create.json new file mode 100644 index 0000000000..430363be68 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/triggers/ml-dh-entity-create.json @@ -0,0 +1,31 @@ +{ + "name": "ml-dh-entity-create", + "description": "MarkLogic Data Hub entity model creation trigger", + "event": { + "data-event": { + "collection-scope": { + "uri": "http://marklogic.com/entity-services/models" + }, + "document-content": { + "update-kind": "create" + }, + "when": "post-commit" + } + }, + "module": "data-hub/4/triggers/entity-model-trigger.xqy", + "module-db": "%%mlModulesDbName%%", + "module-root": "/", + "enabled": true, + "recursive": true, + "task-priority": "normal", + "permission": [ + { + "role-name": "%%mlHubAdminRole%%", + "capability": "update" + }, + { + "role-name": "%%mlHubUserRole%%", + "capability": "read" + } + ] +} diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/triggers/ml-dh-entity-delete.json b/marklogic-data-hub/src/main/resources/hub-internal-config/triggers/ml-dh-entity-delete.json new file mode 100644 index 0000000000..9e1275abf1 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/triggers/ml-dh-entity-delete.json @@ -0,0 +1,31 @@ +{ + "name": "ml-dh-entity-delete", + "description": "MarkLogic Data Hub entity model delete trigger", + "event": { + "data-event": { + "collection-scope": { + "uri": "http://marklogic.com/entity-services/models" + }, + "document-content": { + "update-kind": "delete" + }, + "when": "post-commit" + } + }, + "module": "data-hub/4/triggers/entity-model-delete-trigger.xqy", + "module-db": "%%mlModulesDbName%%", + "module-root": "/", + "enabled": true, + "recursive": true, + "task-priority": "normal", + "permission": [ + { + "role-name": "%%mlHubAdminRole%%", + "capability": "update" + }, + { + "role-name": "%%mlHubUserRole%%", + "capability": "read" + } + ] +} diff --git a/marklogic-data-hub/src/main/resources/hub-internal-config/triggers/ml-dh-entity-modify.json b/marklogic-data-hub/src/main/resources/hub-internal-config/triggers/ml-dh-entity-modify.json new file mode 100644 index 0000000000..5b35490faf --- /dev/null +++ b/marklogic-data-hub/src/main/resources/hub-internal-config/triggers/ml-dh-entity-modify.json @@ -0,0 +1,31 @@ +{ + "name": "ml-dh-entity-modify", + "description": "MarkLogic Data Hub entity model update trigger", + "event": { + "data-event": { + "collection-scope": { + "uri": "http://marklogic.com/entity-services/models" + }, + "document-content": { + "update-kind": "modify" + }, + "when": "post-commit" + } + }, + "module": "data-hub/4/triggers/entity-model-trigger.xqy", + "module-db": "%%mlModulesDbName%%", + "module-root": "/", + "enabled": true, + "recursive": true, + "task-priority": "normal", + "permission": [ + { + "role-name": "%%mlHubAdminRole%%", + "capability": "update" + }, + { + "role-name": "%%mlHubUserRole%%", + "capability": "read" + } + ] +} diff --git a/marklogic-data-hub/src/main/resources/installer-util/install-amps.xqy b/marklogic-data-hub/src/main/resources/installer-util/install-amps.xqy deleted file mode 100644 index af6ed28579..0000000000 --- a/marklogic-data-hub/src/main/resources/installer-util/install-amps.xqy +++ /dev/null @@ -1,80 +0,0 @@ -xquery version "1.0-ml"; - -import module namespace sec="http://marklogic.com/xdmp/security" -at "/MarkLogic/security.xqy"; - -declare variable $modules-db-name := xdmp:database("data-hub-MODULES"); - -declare function local:check-then-create-amp($namespace, $local-name, $document-uri, $database-name, $role-names) { - if(sec:amp-exists($namespace, $local-name, $document-uri, $database-name)) then () - else ( - sec:create-amp($namespace, $local-name, $document-uri, $database-name, $role-names) - ) -}; - -local:check-then-create-amp("", "addResponseHeader", "/data-hub/4/rest-api/lib/endpoint-util.sjs", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/db-util", "access-config", "/data-hub/4/rest-api/lib/db-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/db-util", "update-config", "/data-hub/4/rest-api/lib/db-util.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/db-util", "rest-modules-database", "/data-hub/4/rest-api/lib/db-util.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/db-util", "do-set-transaction-time-limit", "/data-hub/4/rest-api/lib/db-util.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "add-cookie", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "add-response-header", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "default-page-with-transform", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "delete-cookie", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "get-mimetypes", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "get-server-field", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "invoke-module", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "set-server-field", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "xslt-invoke", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/endpoint-util", "lookup-role-ids", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-common", "read-collections", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-common", "read-permissions", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-common", "read-properties", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-common", "read-quality", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-common", "lookup-role-names", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-query", "get", "/data-hub/4/rest-api/models/document-model-query.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-query-get", "get", "/data-hub/4/rest-api/models/document-model-query-get.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-query-head", "head", "/data-hub/4/rest-api/models/document-model-query-head.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-query", "read-content", "/data-hub/4/rest-api/models/document-model-query.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-query", "check-document-exists", "/data-hub/4/rest-api/models/document-model-query.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "put", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update-put", "put", "/data-hub/4/rest-api/models/document-model-update-put.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update-delete", "delete", "/data-hub/4/rest-api/models/document-model-update-delete.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "patch", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "delete", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "apply-content-patch", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "apply-metadata-patch", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "delete-document", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "write-content", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "load-content", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "write-collections", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "write-permissions", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "write-properties", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "write-quality", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "replace-role-permissions", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "replace-named-properties", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "remove-collections", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "reset-permissions", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "remove-properties", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "reset-quality", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/document-model-update", "cpf-config", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name, ("manage-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/config-query", "put", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/config-query", "post", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/config-query", "put-child", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/config-query", "post-child", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/config-query", "get", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/config-query", "get-child", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/config-query", "get-options", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name, ("rest-reader")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/search-util", "search-to-json", "/MarkLogic/rest-api/lib/search-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/search-util", "search-from-json", "/MarkLogic/rest-api/lib/search-util.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/forestinfo", "get-forest-info", "/data-hub/4/rest-api/models/forest-info-model.xqy", $modules-db-name, ("rest-reader-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/search-model-update", "delete", "/data-hub/4/rest-api/models/search-model-update.xqy", $modules-db-name, ("rest-writer-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/models/search-model-update", "clear", "/data-hub/4/rest-api/models/search-model-update.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-directory-delete", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-document-delete", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-document-insert", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-eval", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-js-eval", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-list-extension-metadata", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/extensions-util", "execute-transform", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name, ("rest-admin-internal")), -local:check-then-create-amp("http://marklogic.com/rest-api/lib/extensions-util", "invoke-service", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name, ("rest-reader-internal")) diff --git a/marklogic-data-hub/src/main/resources/installer-util/uninstall-amps.xqy b/marklogic-data-hub/src/main/resources/installer-util/uninstall-amps.xqy deleted file mode 100644 index dc3af370a3..0000000000 --- a/marklogic-data-hub/src/main/resources/installer-util/uninstall-amps.xqy +++ /dev/null @@ -1,81 +0,0 @@ -xquery version "1.0-ml"; - -import module namespace sec="http://marklogic.com/xdmp/security" -at "/MarkLogic/security.xqy"; - -declare variable $modules-db-name := xdmp:database("data-hub-MODULES"); - -declare function local:check-then-remove-amp($namespace, $local-name, $document-uri, $database-name) { - if(sec:amp-exists($namespace, $local-name, $document-uri, $database-name)) then ( - sec:remove-amp($namespace, $local-name, $document-uri, $database-name) - ) else () -}; - -local:check-then-remove-amp("", "addResponseHeader", "/data-hub/4/rest-api/lib/endpoint-util.sjs", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/db-util", "access-config", "/data-hub/4/rest-api/lib/db-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/db-util", "update-config", "/data-hub/4/rest-api/lib/db-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/db-util", "rest-modules-database", "/data-hub/4/rest-api/lib/db-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/db-util", "do-set-transaction-time-limit", "/data-hub/4/rest-api/lib/db-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "add-cookie", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "add-response-header", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "default-page-with-transform", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "delete-cookie", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "get-mimetypes", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "get-server-field", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "invoke-module", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "set-server-field", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "xslt-invoke", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/endpoint-util", "lookup-role-ids", "/data-hub/4/rest-api/lib/endpoint-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-common", "read-collections", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-common", "read-permissions", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-common", "read-properties", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-common", "read-quality", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-common", "lookup-role-names", "/data-hub/4/rest-api/models/document-model-common.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-query", "get", "/data-hub/4/rest-api/models/document-model-query.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-query-get", "get", "/data-hub/4/rest-api/models/document-model-query-get.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-query-head", "head", "/data-hub/4/rest-api/models/document-model-query-head.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-query", "read-content", "/data-hub/4/rest-api/models/document-model-query.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-query", "check-document-exists", "/data-hub/4/rest-api/models/document-model-query.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "put", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update-put", "put", "/data-hub/4/rest-api/models/document-model-update-put.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update-delete", "delete", "/data-hub/4/rest-api/models/document-model-update-delete.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "patch", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "delete", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "apply-content-patch", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "apply-metadata-patch", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "delete-document", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "write-content", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "load-content", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "write-collections", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "write-permissions", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "write-properties", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "write-quality", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "replace-role-permissions", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "replace-named-properties", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "remove-collections", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "reset-permissions", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "remove-properties", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "reset-quality", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/document-model-update", "cpf-config", "/data-hub/4/rest-api/models/document-model-update.xqy", $modules-db-name), - -local:check-then-remove-amp("http://marklogic.com/rest-api/models/config-query", "put", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/config-query", "post", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/config-query", "put-child", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/config-query", "post-child", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/config-query", "get", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/config-query", "get-child", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/config-query", "get-options", "/MarkLogic/rest-api/models/config-query-model.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/search-util", "search-to-json", "/MarkLogic/rest-api/lib/search-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/search-util", "search-from-json", "/MarkLogic/rest-api/lib/search-util.xqy", $modules-db-name), - -local:check-then-remove-amp("http://marklogic.com/rest-api/forestinfo", "get-forest-info", "/data-hub/4/rest-api/models/forest-info-model.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/search-model-update", "delete", "/data-hub/4/rest-api/models/search-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/models/search-model-update", "clear", "/data-hub/4/rest-api/models/search-model-update.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-directory-delete", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-document-delete", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-document-insert", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-eval", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-js-eval", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/extensions-util", "do-list-extension-metadata", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/extensions-util", "execute-transform", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name), -local:check-then-remove-amp("http://marklogic.com/rest-api/lib/extensions-util", "invoke-service", "/data-hub/4/rest-api/lib/extensions-util.xqy", $modules-db-name) diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/dhf.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/dhf.sjs index 7bd64916cf..e69f1daacd 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/dhf.sjs +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/dhf.sjs @@ -1,5 +1,5 @@ /* - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/dhf.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/dhf.xqy index 8679ed50fe..e7c4ce317d 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/dhf.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/dhf.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/endpoints/collector.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/endpoints/collector.xqy index c639c82151..bc4a6b321b 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/endpoints/collector.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/endpoints/collector.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/db-configs.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/db-configs.xqy index 66531dea3a..a6c2d36480 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/db-configs.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/db-configs.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/debug.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/debug.xqy index 32c5c04b86..346c37855e 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/debug.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/debug.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/delete-jobs.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/delete-jobs.xqy index 75a3f6d571..fd8b4b6bde 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/delete-jobs.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/delete-jobs.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/entity.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/entity.xqy index 4b0758b10d..4eb85ddbd8 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/entity.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/entity.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/flow.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/flow.xqy index 7b6e5bae04..5f0473439a 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/flow.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/flow.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -38,7 +38,7 @@ import module namespace perf = "http://marklogic.com/data-hub/perflog-lib" import module namespace trace = "http://marklogic.com/data-hub/trace" at "/data-hub/4/impl/trace-lib.xqy"; -declare namespace rapi = "http://marklogic.com/rest-api"; +declare namespace error = "http://marklogic.com/xdmp/error"; declare namespace hub = "http://marklogic.com/data-hub"; @@ -130,13 +130,32 @@ declare function post( json:array-push($errors, $ex/err:error-to-json(.)) } (: run writers :) + let $before := xdmp:elapsed-time() let $_ := try { flow:run-writers($identifiers) } catch($ex) { xdmp:log(("error in run-writers", $ex)), - json:array-push($errors, $ex/err:error-to-json(.)) + json:array-push($errors, $ex/err:error-to-json(.)), + + let $batch-error := + let $msg := $ex/error:message + let $stack := $ex/error:stack + return {$ex/@*, + $msg/preceding-sibling::*, + {fn:concat("BATCH-FAILED: ", $ex//error:message/fn:string())}, + $msg/following-sibling::* intersect $stack/preceding-sibling::*, + {fn:concat("BATCH-FAILED: ", $ex//error:stack/fn:string())}, + $stack/following-sibling::*} + + + for $identifier in $identifiers + let $item-context := map:get($flow:context-queue, $identifier) + let $datum := $ex//error:data/error:datum/fn:string() + return if (fn:not($datum = $identifier)) + then trace:error-trace($item-context, $batch-error, xdmp:elapsed-time() - $before) + else trace:error-trace($item-context, $ex, xdmp:elapsed-time() - $before) } let $resp := document { diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/hubstats.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/hubstats.xqy index 7ec161a057..9ee5e7491c 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/hubstats.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/hubstats.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/hubversion.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/hubversion.xqy index cdea94ff3d..3306445185 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/hubversion.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/hubversion.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/pii-generator.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/pii-generator.xqy index 0da4d0f8b7..eff81db39d 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/pii-generator.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/pii-generator.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/scaffold-content.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/scaffold-content.xqy index 1675d444da..8a7e7834d1 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/scaffold-content.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/scaffold-content.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -338,6 +338,9 @@ service:generate-lets($model, $entity-type-name, $mapping, $entity) let $properties := map:get($entity-type, "properties") let $required-properties := ( map:get($entity-type, "primaryKey"), + if (fn:empty(map:get($entity-type, "required"))) then + () + else json:array-values(map:get($entity-type, "required")) ) for $property-name in map:keys($properties) diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/search-options-generator.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/search-options-generator.xqy index f8e41ff9e6..f22e2ad987 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/search-options-generator.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/search-options-generator.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/sjsflow.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/sjsflow.sjs index c8deb1f5dc..b466e93fc5 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/sjsflow.sjs +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/sjsflow.sjs @@ -1,5 +1,5 @@ /** - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -85,12 +85,32 @@ function post(context, params, input) { } } + let before = xdmp.elapsedTime(); try { flowlib.runWriters(identifiers); } catch(ex) { xdmp.log(["error in runWriters", ex.toString()]); errors.push(ex); + const batchFailedError = { + "message": "BATCH-FAILED: " + ex.message, + "stack": "BATCH-FAILED: " + ex.stack, + "stackFrames": ex.stackFrames + }; + const unmodifiedError = { + "message": ex.message, + "stack": ex.stack, + "stackFrames": ex.stackFrames + }; + for (const identifier of identifiers) { + let err = batchFailedError; + // check if the error is connected to this specific document + if (Array.isArray(ex.data) && !!ex.data.find((val) => val === identifier)) { + // if so, pass the original error unmodified + err = unmodifiedError; + } + tracelib.errorTrace(flowlib.contextQueue[identifier], err, xdmp.elapsedTime().subtract(before)); + } } resp = { diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/sjsflow.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/sjsflow.xqy index c1d9a87961..2bd661e37f 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/sjsflow.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/sjsflow.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/tracing.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/tracing.xqy index f5681fcd5b..42fd50fb74 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/tracing.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/tracing.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/validate.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/validate.xqy index fa811bd889..fa88892e66 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/validate.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/extensions/validate.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/consts.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/consts.sjs index 95c6949e93..355dcc1816 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/consts.sjs +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/consts.sjs @@ -1,5 +1,5 @@ /** - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/debug-lib.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/debug-lib.xqy index 9bd04ceec5..3da9313b04 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/debug-lib.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/debug-lib.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/error-lib.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/error-lib.xqy index f2dc9319dc..54b9684cfe 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/error-lib.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/error-lib.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/flow-lib.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/flow-lib.sjs index 2c2bbadaa0..3a09e61107 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/flow-lib.sjs +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/flow-lib.sjs @@ -1,5 +1,5 @@ /** - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -386,7 +386,7 @@ function instanceToCanonicalJson(entityInstance) { if (key === '$attachments' || key === '$type' || key === '$version') { } else { let instanceProperty = entityInstance[key]; - if (instanceProperty instanceof Array) { + if (instanceProperty instanceof Array) { let a = []; let i = 0; for (i = 0; i < instanceProperty.length; i++) { @@ -405,7 +405,11 @@ function instanceToCanonicalJson(entityInstance) { } } let rootObject = {}; - rootObject[entityInstance['$type']] = o; + if (entityInstance['$type'] != undefined) { + rootObject[entityInstance['$type']] = o; + } else { + rootObject = o; + } return rootObject; } @@ -596,6 +600,7 @@ function runWriter(writerFunction, itemContext, identifier, envelope, options) { tracelib.setPluginLabel("writer", currentTrace); tracelib.resetPluginInput(currentTrace); tracelib.setPluginInput("envelope", envelope, currentTrace); + tracelib.getCurrentTraceSettings(); let resp = null; try { // resp = xdmp.apply(writerFunction, identifier, envelope, options); diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/flow-lib.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/flow-lib.xqy index d8e5088eab..88b2f60844 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/flow-lib.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/flow-lib.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -529,7 +529,6 @@ declare function flow:make-legacy-envelope($content, $headers, $triples, $data-f declare function flow:instance-to-canonical-json( $entity-instance as map:map) as json:object { - let $root-object := json:object() let $o := if ( map:contains($entity-instance, "$ref") ) then map:get($entity-instance, "$ref") @@ -569,7 +568,13 @@ declare function flow:instance-to-canonical-json( ) return $o - let $_ := map:put($root-object, map:get($entity-instance, "$type"), $o) + let $root-object := + if (map:contains($entity-instance, "$type")) then + let $object := json:object() + let $_ := map:put($object, map:get($entity-instance, "$type"), $o) + return $object + else + $o return $root-object }; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/hub-entities.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/hub-entities.xqy index 51de87cb33..70186003eb 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/hub-entities.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/hub-entities.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -38,16 +38,19 @@ declare function hent:get-model($entity-name as xs:string, $used-models as xs:st return let $model-map as map:map? := $model let $refs := $model//*[fn:local-name(.) = '$ref'][fn:starts-with(., "#/definitions")] ! fn:replace(., "#/definitions/", "") - let $_ := - let $definitions := map:get($model-map, "definitions") - for $ref in $refs[fn:not(. = $used-models)] - let $other-model as map:map? := hent:get-model($ref, ($used-models, $entity-name)) - let $other-defs := map:get($other-model, "definitions") - for $key in map:keys($other-defs) - return - map:put($definitions, $key, map:get($other-defs, $key)) - return - $model-map + let $definitions := map:get($model-map, "definitions") + let $_ := + for $ref in $refs[fn:not(. = $used-models)] + let $m := + if (fn:empty(map:get($definitions, $ref))) then + let $other-model as map:map? := hent:get-model($ref, ($used-models, $entity-name)) + let $other-defs := map:get($other-model, "definitions") + for $key in map:keys($other-defs) + return + map:put($definitions, $key, map:get($other-defs, $key)) + else () + return () + return $model-map }; declare function hent:uber-model() as map:map @@ -100,6 +103,7 @@ declare %private function hent:fix-options($nodes as node()*) typeswitch($n) case element(search:options) return element { fn:node-name($n) } { + $n/namespace::node(), , @@ -108,7 +112,10 @@ declare %private function hent:fix-options($nodes as node()*) case element(search:additional-query) return () case element(search:return-facets) return true case element() return - element { fn:node-name($n) } { hent:fix-options(($n/@*, $n/node())) } + element { fn:node-name($n) } { + $n/namespace::node(), + hent:fix-options(($n/@*, $n/node())) + } case text() return fn:replace($n, "es:", "*:") default return $n diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/hub-utils-lib.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/hub-utils-lib.xqy index b68fd2b2bd..57d4aec030 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/hub-utils-lib.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/hub-utils-lib.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/job-lib.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/job-lib.xqy index 730064d79f..653fafaa5e 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/job-lib.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/job-lib.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/perflog-lib.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/perflog-lib.xqy index 8068bb9a8f..5804449c2b 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/perflog-lib.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/perflog-lib.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/run-flow-context.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/run-flow-context.sjs index 3d07d5455c..04b6f178b7 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/run-flow-context.sjs +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/run-flow-context.sjs @@ -1,5 +1,5 @@ /** - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/run-flow-context.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/run-flow-context.xqy index ff36724bc2..314230507c 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/run-flow-context.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/run-flow-context.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/trace-lib.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/trace-lib.sjs index 61305987fa..00c45d9893 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/trace-lib.sjs +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/trace-lib.sjs @@ -1,5 +1,5 @@ /** - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -73,7 +73,7 @@ function hasErrors() { function incrementErrorCount() { let ts = getCurrentTraceSettings(); - ts.errorCount = tracelib.getErrorCount() + 1; + ts.errorCount = getErrorCount() + 1; } function getErrorCount() { @@ -197,7 +197,7 @@ function writeErrorTrace(itemContext) { created: currentTrace.created, identifier: rfc.getId(itemContext), flowType: rfc.getFlowType(), - hasError: hasErrors(), + hasError: false, steps: [] } }; @@ -205,6 +205,9 @@ function writeErrorTrace(itemContext) { for (i = 0; i < currentTrace.traceSteps.length; i++) { let step = currentTrace.traceSteps[i]; trace.trace.steps.push(step); + if(step.error){ + trace.trace.hasError = true; + } } } else { @@ -229,9 +232,7 @@ function writeErrorTrace(itemContext) { nb.startElement("flowType"); nb.addText(rfc.getFlowType().toString()); nb.endElement(); - nb.startElement("hasError"); - nb.addText(hasErrors().toString()); - nb.endElement(); + let hasErrors = false; nb.startElement("steps"); let i; for (i = 0; i < currentTrace.traceSteps.length; i++) { @@ -270,6 +271,7 @@ function writeErrorTrace(itemContext) { nb.endElement(); nb.startElement("error"); if (step.error) { + hasErrors = true; if (isXmlNode(step.error)) { nb.addNode(step.error); } @@ -296,6 +298,9 @@ function writeErrorTrace(itemContext) { nb.endElement(); } nb.endElement(); + nb.startElement("hasError"); + nb.addText(hasErrors.toString()); + nb.endElement(); nb.endElement(); nb.endDocument(); trace = nb.toNode(); diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/trace-lib.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/trace-lib.xqy index edd21788be..b9fbeedd22 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/trace-lib.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/impl/trace-lib.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/lib/endpoint-util.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/lib/endpoint-util.sjs index 11f7dc7d21..61a0ebb8ff 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/lib/endpoint-util.sjs +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/lib/endpoint-util.sjs @@ -1,5 +1,5 @@ /* - * Copyright 2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-common.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-common.xqy index 48dce6dddc..d9ebe5de64 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-common.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-common.xqy @@ -1,6 +1,6 @@ xquery version "1.0-ml"; -(: Copyright 2012-2018 MarkLogic Corporation. All Rights Reserved. :) +(: Copyright 2012-2019 MarkLogic Corporation. All Rights Reserved. :) module namespace rsrcmodcom = "http://marklogic.com/rest-api/models/resource-model-common"; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-query.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-query.xqy index 5a18f39583..8cdd544a37 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-query.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-query.xqy @@ -1,6 +1,6 @@ xquery version "1.0-ml"; -(: Copyright 2012-2018 MarkLogic Corporation. All Rights Reserved. :) +(: Copyright 2012-2019 MarkLogic Corporation. All Rights Reserved. :) module namespace rsrcmodqry = "http://marklogic.com/rest-api/models/resource-model-query"; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-update.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-update.xqy index 771a3006c6..cc42e6f52f 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-update.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/resource-model-update.xqy @@ -1,6 +1,6 @@ xquery version "1.0-ml"; -(: Copyright 2012-2018 MarkLogic Corporation. All Rights Reserved. :) +(: Copyright 2012-2019 MarkLogic Corporation. All Rights Reserved. :) module namespace rsrcmodupd = "http://marklogic.com/rest-api/models/resource-model-update"; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/transform-model.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/transform-model.xqy index 0f44d31ea1..984fee03ab 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/transform-model.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/rest-api/models/transform-model.xqy @@ -1,6 +1,6 @@ xquery version "1.0-ml"; -(: Copyright 2012-2018 MarkLogic Corporation. All Rights Reserved. :) +(: Copyright 2012-2019 MarkLogic Corporation. All Rights Reserved. :) module namespace tformod = "http://marklogic.com/rest-api/models/transform-model"; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/error-handler.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/error-handler.xqy index da040819cd..db843088fd 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/error-handler.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/error-handler.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-ids.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-ids.xqy index 98245bfb50..359f51e1b4 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-ids.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-ids.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-trace.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-trace.xqy index dcefc8f2da..0d05c65621 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-trace.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-trace.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-traces.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-traces.xqy index 01a0c4f4a7..58d0f32bc2 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-traces.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/get-traces.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/search.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/search.xqy index d746fda269..4b656ac122 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/search.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/search.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/trace-ui.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/trace-ui.xqy index 82441cd529..e0236c7423 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/trace-ui.xqy +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/trace-ui.xqy @@ -1,5 +1,5 @@ (: - Copyright 2012-2018 MarkLogic Corporation + Copyright 2012-2019 MarkLogic Corporation Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/tracing-rewriter.xml b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/tracing-rewriter.xml index 5a9f04b9ec..b83c29cd35 100644 --- a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/tracing-rewriter.xml +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/4/tracing/tracing-rewriter.xml @@ -1,5 +1,5 @@ + + RESTAPI-EXTNERR + errut:render-extension-error + + + + RESTAPI-SRVEXERR + errut:render-extension-error + + + REST-UNSUPPORTEDMETHOD + 405 + Method not allowed + + + REST-UNACCEPTABLETYPE + 406 + Unacceptable Type + + + RESTAPI-INTERNALERROR + 500 + Internal Server Error + + + ADMIN-NOSUCHDATABASE + SVC-SOCCONN + SVC-SOCRECV + XDMP-ACCEPT + XDMP-FORESTNOT + XDMP-LICKEYEXP + XDMP-PRERELEXP + XDMP-XDQPDISC + 503 + Service Unavailable + +; + +(: supplemental for eval-invoke contexts -- don't duplicate $errut:handler :) +declare variable $errut:code-handlers := + + + JS-JAVASCRIPT + XDMP-INVOKEPATH + XDMP-DIVBYZERO + XDMP-EXTVAL + XDMP-MISSINGCONTEXT + XDMP-UNDVAR + 400 + Bad Request + +; + +declare function errut:get-status-code( + $error-code as xs:string? +) as xs:int? +{ + if (empty($error-code)) then () + else $errut:handlers/error[code/string(.) = $error-code]/status/xs:int(.) +}; + +declare function errut:get-status-message( + $status-code as xs:string? +) as xs:string? +{ + if (empty($status-code)) then () + else $errut:handlers/error[status/string(.) eq $status-code]/message/string(.) +}; + +declare function errut:log-errors( + $errors as element(error:error)*, + $code as item()* +) as empty-sequence() +{ + if (empty($errors)) then () + else + let $first-err := head($errors) + let $msg := head(( + $first-err/error:format-string/string(), + $first-err/error:message/string() + )) + let $error-code := $first-err/error:code/string(.) + let $not-found := ($error-code = $errut:not-found-handler/code/string(.)) + return ( + if ($not-found) then () + else xdmp:log("Status " || head($code) || ": " || $msg), + + if ($is-untraced or errut:check-untraced()) then () + else lid:log( + $errut:trace-id,"restapi-error-handler", + if ($not-found) + then map:entry("status", head($code) || ": " || $msg) + else map:entry("errors", $errors) + ) + ) +}; + +declare function errut:preferred-format( +) as xs:string? +{ + let $accept := + let $accept-types := + let $normalized-map := map:map() + return ( + for $header-name in xdmp:get-request-header-names() + let $normalized-name := lower-case($header-name) + return + if (not($normalized-name = ("x-error-accept", "accept"))) then () + else map:put( + $normalized-map,$normalized-name,xdmp:get-request-header($header-name,()) + ), + + let $error-accept-types := map:get($normalized-map,"x-error-accept") + return + if (exists($error-accept-types)) + then $error-accept-types + else map:get($normalized-map,"accept") + ) + return + if (empty($accept-types)) then () + else + head( + for $accept-type in $accept-types + return + if (matches($accept-type,"^(application|text)/([^+]+\+)?json")) + then "json" + else if (matches($accept-type,"^(text/html|application/xhtml\+xml)$")) + then "html" + else if (matches($accept-type,"^(application|text)/([^+]+\+)?xml")) + then "xml" + else () + ) + return + if (exists($accept)) + then $accept + else xdmp:get-request-error-format() +}; + +declare function errut:render-error-with-status( + $status-code as xs:integer, + $status as xs:string, + $errors as element(error:error)*, + $format as xs:string +) as node() +{ + xdmp:set-response-code($status-code,$status), + errut:render-error($status-code,$status,$errors,$format) +}; +declare function errut:render-error-with-status( + $status-code as xs:integer, + $status as xs:string, + $message-code as xs:string?, + $message as xs:string?, + $format as xs:string +) as node() +{ + xdmp:set-response-code($status-code,$status), + errut:render-error($status-code,$status,$message-code,$message,$format) +}; + +declare function errut:render-error( + $status-code as xs:integer, + $status as xs:string, + $errors as element(error:error)*, + $format as xs:string +) as node() +{ + errut:render-error($status-code,$status, + head($errors)/error:code/string(), + head($errors)/error:format-string/string(), + $format + ) +}; +declare function errut:render-error( + $status-code as xs:integer, + $status as xs:string, + $message-code as xs:string?, + $message as xs:string?, + $format as xs:string +) as node() +{ + switch($format) + case "xml" return + + {$status-code} + {$status} + {$message-code} + {$message} + + case "html" return + + + {concat($status-code, " ", $status)} + + + + +

{concat($status-code, " ", $status)}

+

{concat($message-code, " ", $message)}

+ + + default return + object-node {"errorResponse": object-node { + "statusCode": $status-code, + "status": $status, + "messageCode": head(($message-code, null-node {})), + "message": $message}} +}; + +declare function errut:render-auth( + $errors as element(error:error), + $preferred-error-format as xs:string +) as node() +{ + errut:render-error-with-status( + 403, + "Forbidden", + head($errors)/error:code/string(), + "You do not have permission to this method and URL.", + $preferred-error-format + ) +}; + +declare function errut:render-extension-error( + $errors as element(error:error), + $preferred-error-format as xs:string +) as node() +{ + let $error-data := head($errors)/error:data/error:datum/data() + let $error-count := count($error-data) + (: NOTE: 4 datums in the data for the deprecated RESTAPI-EXTNERR error + $error-data[3] used to specify the format but is now a noop because + $preferred-error-format takes precedence :) + return errut:render-error-with-status( + if ($error-count lt 1) then 400 else xs:int(subsequence($error-data,1,1)), + if ($error-count lt 2) then "RESTAPI-SRVEXERR" else string(subsequence($error-data,2,1)), + if ($error-count gt 3) then "RESTAPI-EXTNERR" else "RESTAPI-SRVEXERR", + subsequence($error-data,$error-count,1), + $preferred-error-format + ) +}; + +declare function errut:render-404( + $errors as element(error:error)*, + $preferred-error-format as xs:string +) as node() +{ + errut:render-error-with-status( + 404, + "Not Found", + head($errors)/error:code/string(), + if ($errors) + then head($errors)/error:format-string/string() + else concat("Not found: ", xdmp:get-request-path()), + $preferred-error-format + ) +}; + +declare function errut:error-body( + $error:errors as element(error:error)*, + $code as item()*, + $preferred-error-format as xs:string +) as node()? +{ + errut:error-body($error:errors,$code,$preferred-error-format,xdmp:get-original-url()) +}; + +declare function errut:error-body( + $error:errors as element(error:error)*, + $code as item()*, + $preferred-error-format as xs:string, + $path as xs:string +) as node()? +{ + if (empty($error:errors)) then () + else + let $error-code := $error:errors[1]/error:code/string() + let $format-string := ($error:errors)[1]/error:format-string/string() + return + let $handlers := + if (matches($path,"^/(v1|LATEST)/(eval|invoke)")) then + if ($error-code = ("RESTAPI-SRVEXERR", "RESTAPI-EXTNERR")) + then $errut:handlers + else () + else if (empty($error:errors/error:stack/error:frame[ + string(error:uri) eq "../lib/extensions-util.xqy" + ])) + then $errut:handlers + else if (not(matches($path,"^/(v1|LATEST)/resources/"))) + then ($errut:handlers|$errut:code-handlers) + else if ($error-code = ("RESTAPI-SRVEXERR", "RESTAPI-EXTNERR")) + then $errut:handlers + else () + let $response-handler := + if (exists($error-code)) + then head($handlers/error[code/string(.) = $error-code]) + else if (exists($code)) + then head($handlers/error[status/string(.) = string(head($code))]) + else () + let $response := + if (exists($response-handler)) then + let $intercept := $response-handler/function/text() + return + if (exists($intercept)) + then xdmp:apply(xdmp:function($intercept), + $error:errors, + $preferred-error-format + ) + else errut:render-error-with-status( + $response-handler/status/xs:integer(string(.)), + $response-handler/message/string(.), + $error:errors, + $preferred-error-format + ) + else if ($error:errors/error:retryable/xs:boolean(string(.))) + then ( + xdmp:set-response-code(503, "Service Unavailable"), + eput:add-response-header("Retry-After", "1"), + let $message := + if ($error:errors) + then $format-string + else concat(string($code[1])," ",$code[2]," internal error") + return errut:render-error(503,"SERVICE UNAVAILABLE (RETRYABLE)", + $error-code,$message,$preferred-error-format) + ) + else if (head($code) eq 404) + then ( + xdmp:set-response-code(404, "Not Found"), + errut:render-404($error:errors,$preferred-error-format) + ) + else if (head($code) eq 401) + then errut:render-error-with-status( + 401, "Unauthorized","","Unauthorized",$preferred-error-format + ) + else ( + xdmp:set-response-code(500, $code[2]), + let $message := + if ($error:errors) + then $format-string + else concat(string($code[1])," ",$code[2]," internal error") + return errut:render-error(500,"Internal Server Error","INTERNAL ERROR", + concat($message, " . See the MarkLogic server error log for further detail."), + $preferred-error-format) + ) + return $response +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/extensions-util.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/extensions-util.sjs new file mode 100644 index 0000000000..3ef2479a90 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/extensions-util.sjs @@ -0,0 +1,135 @@ +/* + * Copyright 2018 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +const arrayKeys = new Set(['input-types', 'acceptTypes']); + +function getExtName(extName, modPath) { + if (extName !== void 0 && extName !== null) { + return extName; + } + return modPath.replace(/^\/[^\/]+\/([^\/]+)\/.*$/, '$1'); +} +function hyphenToCamel(hychar) { + return hychar.charAt(1).toUpperCase(); +} +function camelToHyphen(cap) { + return cap.charAt(0).concat('-', cap.charAt(1).toLowerCase()); +} +function contextMapping(context) { + const mappedKeys = {}; + const mappedContext = {}; + const keyRegEx = /-[a-z]/g; + for (const key of Object.keys(context)) { + const mappedKey = key.replace(keyRegEx, hyphenToCamel); + mappedKeys[mappedKey] = key; + const val = context[key]; + mappedContext[mappedKey] = + (val instanceof Sequence) ? val.toArray() : + arrayKeys.has(key) ? [val] : + val; + } + return {keys: mappedKeys, context: mappedContext}; +} +function paramMapping(params) { + for (const key of Object.keys(params)) { + const val = params[key]; + if (val instanceof Sequence) { + params[key] = val.toArray(); + } + } + return params; +} +function makeResult(result) { + if (result instanceof Document) { + return result; + } else if (result instanceof Node) { + const builder = new NodeBuilder(); + builder.startDocument(); + builder.addNode(result); + builder.endDocument(); + return builder.toNode(); + } else if (result === void 0 || result === null) { + return null; + } + return xdmp.toJSON(result); +} +function makeOutput(mapping, results) { + const mappedKeys = mapping.keys; + const mappedContext = mapping.context; + const context = {}; + const mappedKeyRegEx = /[a-z][A-Z](?=[a-z])/g; + for (const mappedKey of Object.keys(mappedContext)) { + let key = mappedKeys[mappedKey] + if (key === void 0) { + key = mappedKey.replace(mappedKeyRegEx, camelToHyphen); + } + const val = mappedContext[mappedKey]; + context[key] = Array.isArray(val) ? Sequence.from(val) : val; + } + const resultNodes = + (results instanceof Sequence) ? Sequence.from(results.toArray().map(result => makeResult(result))) : + makeResult(results); + const output = (results === void 0) ? + {context: context} : + {context: context, result: resultNodes}; + return output; +} +function callExtension(func, context, params, input) { + const mapping = contextMapping(context); + return makeOutput(mapping, func(mapping.context, params, input)); +} +function getExtension(extName, modPath, funcName) { + let mod = null; + try { + mod = require(modPath); + } catch(e) { + fn.error(null, 'RESTAPI-INVALIDREQ', + `cannot read module ${modPath} for extension ${getExtName(extName, modPath)}`); + } + const func = mod[funcName]; + if (func === void 0) { + fn.error(null, 'RESTAPI-INVALIDREQ', + `cannot read function ${funcName} from module ${modPath} for extension ${getExtName(extName, modPath)}`); + } + return func; +} +function applyOnce(extName, modPath, funcName, context, params, input) { + return callExtension( + getExtension(extName, modPath, funcName), context, paramMapping(params), input + ); +} +function applyList(extName, modPath, funcName, requests, params) { + if (requests === void 0 || requests === null) { + return {response: null}; + } + + const func = getExtension(extName, modPath, funcName); + const mappedParams = paramMapping(params); + requests = (requests instanceof Sequence) ? requests.toArray() : requests; + return {response: + Array.isArray(requests) ? + Sequence.from( + requests.map(request => callExtension(func, request.context, mappedParams, request.input)) + ) : + callExtension(func, requests.context, mappedParams, requests.input) + }; +} + +module.exports = { + applyList: applyList, + applyOnce: applyOnce +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/extensions-util.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/extensions-util.xqy new file mode 100644 index 0000000000..7d06d5b191 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/extensions-util.xqy @@ -0,0 +1,1409 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "endpoint-util.xqy"; + +import module namespace hof = "http://marklogic.com/higher-order" + at "/MarkLogic/appservices/utils/higher-order.xqy"; + +declare namespace xsl = "http://www.w3.org/1999/XSL/Transform"; +declare namespace rapi = "http://marklogic.com/rest-api"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $extut:trace-id := "restapi.extensions"; + +declare private variable $is-untraced := (); + +declare private variable $system-transforms := map:map() + =>map:with("ml:extractContent", "get-content") + =>map:with("ml:inputFlow", "run-flow") + =>map:with("ml:sjsInputFlow", "run-sjs-flow") + =>map:with("ml:jobSearchResults", "job-search") + =>map:with("ml:traceSearchResults", "trace-search") + =>map:with("ml:traceUISearchResults", "trace-json") + =>map:with("ml:prettifyXML", "prettify"); + +declare private variable $system-resource-extensions := map:map() + =>map:with("ml:dbConfigs", "db-configs") + =>map:with("ml:debug", "debug") + =>map:with("ml:deleteJobs", "delete-jobs") + =>map:with("ml:entity", "entity") + =>map:with("ml:flow", "flow") + =>map:with("ml:sjsFlow", "sjsflow") + =>map:with("ml:hubstats", "hubstats") + =>map:with("ml:hubversion", "hubversion") + =>map:with("ml:piiGenerator", "pii-generator") + =>map:with("ml:scaffoldContent", "scaffold-content") + =>map:with("ml:searchOptionsGenerator", "search-options-generator") + =>map:with("ml:tracing", "tracing") + =>map:with("ml:validate", "validate"); + +declare function extut:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, lid:is-disabled($extut:trace-id, ("restapi"))), + + $is-untraced +}; + +declare private variable $valid-extension-types := ("transform","resource"); + +declare private variable $function-cache := map:map(); + +declare function extut:establish-format( + $headers as map:map, + $params as map:map, + $allowed as xs:string* +) as xs:string +{ + let $format-param := map:get($params,"format") + return + if (exists($format-param)) then + if (not($format-param = $allowed)) + then error((),"REST-INVALIDPARAM",( + "only javascript, xquery and xslt allowed. Received format: "||$format-param + )) + else $format-param + else + let $content-type := eput:get-inbound-content-type($params, $headers) + let $format := + if ($allowed = "xquery" and ( + empty($content-type) or + $content-type = ("application/xquery","application/vnd.marklogic-xdmp") + )) + then "xquery" + else if ($allowed = "xslt" and $content-type = ("application/xslt+xml")) + then "xslt" + else if ($allowed = "javascript" and $content-type = ("application/javascript", "application/vnd.marklogic-javascript")) + then "javascript" + else error((),"RESTAPI-INVALIDMIMETYPE",( + if ($allowed = "xslt") + then "mime type must be application/xquery, application/vnd.marklogic-xdmp, or application/xslt+xml" + else if ($allowed = "javascript") + then "mime type must be application/javascript or application/vnd.marklogic-javascript" + else "mime type must be application/xquery or application/vnd.marklogic-xdmp", + $content-type, + () + )) + return ( + map:put($params,"format",$format), + $format + ) +}; + +declare function extut:get-parse-format( + $format as xs:string +) as xs:string +{ + if (empty($format) or $format eq "xquery") + then "text" + else if ($format eq "javascript") + then "text" + else if ($format eq "xslt") + then "xml" + else error((),"RESTAPI-INTERNALERROR",concat("unknown format: ",$format)) +}; + +declare function extut:get-extension-name( + $extension-type as xs:string, + $params as map:map +) as xs:string +{ + let $name := map:get($params,"name") + return + if (exists($name)) + then $name + else error((),"RESTAPI-INVALIDREQ",concat( + "cannot get ",$extension-type," extension without name" + )) +}; + +declare function extut:install-extension( + $extension-type as xs:string, + $service-defs as map:map, + $extension-name as xs:string, + $metadata as element()*, + $source-format as xs:string, + $source-doc as document-node() +) as xs:boolean +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + extut:check-extension-type($extension-type), + + let $wrapper-doc := + switch($extension-type) + case "resource" return + switch($source-format) + case "javascript" return extut:javascript-wrapper-module($extension-type, $extension-name) + default return () + case "transform" return + switch($source-format) + case "javascript" return extut:javascript-wrapper-module($extension-type, $extension-name) + case "xslt" return extut:make-transform-wrapper($extension-name) + default return () + default return () + let $base-uri := extut:make-base-uri($extension-type,$extension-name) + let $source-uri := extut:make-source-uri($base-uri,$extension-type,$source-format) + let $wrapper-uri := + if (empty($wrapper-doc)) then () + else + (: new case, javascript wrapper :) + (: and old case, xquery wrapper for xslt :) + extut:make-source-uri($base-uri,$extension-type,"xquery") + (: clean up from ML 6 :) + let $manifest-uri := concat($base-uri,"manifest.xml") + let $lib-extension := + switch($source-format) + case "javascript" return ".sjs" + case "xquery" return ".xqy" + default return () + let $lib-uri := + if (exists($lib-extension)) + then concat($base-uri,"lib/",$extension-type,$lib-extension) + else () + let $success := dbut:update-config( + function() { + let $uris := ($source-uri, $wrapper-uri) + let $docs := ($source-doc, $wrapper-doc) + for $i in 1 to count($uris) + return extut:do-document-insert( + subsequence($uris,$i,1), + subsequence($docs,$i,1), + ( + xdmp:permission("rest-admin-internal", "update"), + xdmp:permission("rest-extension-user", "execute"), + xdmp:permission("rest-extension-user", "read"), + xdmp:permission("rest-reader-internal", "execute"), + xdmp:permission("rest-reader-internal", "read"), + (: backward compatability for ML 6 and 7.0-2 :) + (: for backward compatability with ML 6 :) + xdmp:permission("application-plugin-registrar", "update"), + xdmp:permission("application-plugin-registrar", "read"), + xdmp:permission("application-plugin-registrar", "execute") + ), + (), + (), + () + ), + + (: clean up from ML 6 :) + if (not(doc-available($manifest-uri))) then () + else extut:do-document-delete($manifest-uri), + if (empty($lib-uri) or not(doc-available($lib-uri))) then () + else extut:do-document-delete($lib-uri), + + true() + } + ) + return + if (not($success)) then false() + else extut:refresh-extension( + $extension-type,$service-defs,$extension-name,$metadata, + $source-format,$base-uri,($wrapper-uri,$source-uri)[1] + ) +}; + +declare private function extut:refresh-extension( + $extension-type as xs:string, + $service-defs as map:map, + $extension-name as xs:string, + $metadata as element()*, + $source-format as xs:string, + $base-uri as xs:string, + $source-uri as xs:string +) as xs:boolean +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + let $metadata-uri := extut:make-metadata-uri($base-uri) + let $source-ns := extut:get-extension-namespace($extension-type,$extension-name) + let $error-list := json:array() + return ( + if ($source-format eq "javascript") then + let $services := extut:extract-javascript-services( + $service-defs,$extension-name,replace($source-uri,".xqy",".sjs"),$error-list + ) + return ( + if (count($services) gt 0) then () + else json:array-push($error-list,concat( + $extension-name, + " either is not a valid JavaScript module or does not export functions (", + string-join(map:keys($service-defs),", "),")")), + let $success := ( + extut:write-extension-metadata( + $extension-type,$extension-name,$metadata,$source-format, + $services,$error-list,$metadata-uri + ) + ) + return $success + ) + else if ($source-format eq "xquery") then + let $services := extut:extract-xquery-services( + $service-defs,$extension-name,$source-ns,$source-uri,$error-list + ) + return ( + if (count($services) gt 0) then () + else json:array-push($error-list,concat( + $extension-name, + " either is not a valid module or does not provide extension functions (", + string-join(map:keys($service-defs),", "),") in the ", + $source-ns," namespace" + )), + + let $success := ( + extut:write-extension-metadata( + $extension-type,$extension-name,$metadata,$source-format, + $services,$error-list,$metadata-uri + ) + ) + return $success + ) + else if ($source-format eq "xslt") then ( + let $success := try { + extut:do-eval(concat('xquery version "1.0-ml"; +import module namespace test = "', $source-ns, '" at "', $source-uri, '"; +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; +let $context as map:map := map:map() +let $params as map:map := map:map() +let $content as document-node() := document {} +let $result as document-node() := test:transform($context,$params,$content) +return $result +'), + (), + + true + true + + ), + true() + } catch($e) { + xdmp:log($e), + json:array-push($error-list,concat( + "could not parse XSLT extension ",$extension-name, + "; please see the server error log for detail ", + $e/error:format-string!string(.) + )) + } + return + if (empty($success)) + then false() + else extut:write-extension-metadata( + $extension-type,$extension-name,$metadata,$source-format, + "transform",$error-list,$metadata-uri + ) + ) + else error((),"RESTAPI-INTERNALERROR",concat( + "unsupported source type: ",$source-format + )), + + if (json:array-size($error-list) eq 0) then () + else error((),"RESTAPI-INVALIDCONTENT",concat( + "invalid ",$extension-name," extension: ", + string-join(json:array-values($error-list,true()), "; ") + )) + ) +}; + +declare function extut:uninstall-extension( + $extension-type as xs:string, + $extension-name as xs:string, + $check as xs:string? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + let $extension-base := extut:make-base-uri($extension-type,$extension-name) + let $metadata-uri := + if (not($check = "exists")) then () + else extut:make-metadata-uri( + extut:make-base-uri($extension-type,$extension-name) + ) + return dbut:update-config( + function() { + extut:do-directory-delete( + $extension-type,$extension-name,$extension-base,$metadata-uri + ) + } + ) +}; + +declare function extut:extension-exists( + $extension-type as xs:string, + $extension-name as xs:string +) as xs:boolean +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + let $metadata-uri := extut:make-metadata-uri( + extut:make-base-uri($extension-type,$extension-name) + ) + return dbut:access-config( + function() { + doc-available($metadata-uri) + } + ) +}; + +declare function extut:list-extension-metadata( + $extension-type as xs:string, + $service-defs as map:map?, + $with-refresh as xs:boolean +) as document-node()* +{ + extut:do-list-extension-metadata($extension-type,$service-defs,$with-refresh) +}; + +declare function extut:get-extension-metadata( + $extension-type as xs:string, + $extension-name as xs:string +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + let $metadata-uri := extut:make-metadata-uri( + extut:make-base-uri($extension-type,$extension-name) + ) + return ( + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"get-extension-metadata",map:entry("metadata-uri",$metadata-uri) + ), + + dbut:access-config( + function() { + doc($metadata-uri) + } + ) + ) +}; + +declare function extut:get-extension-source-document( + $extension-type as xs:string, + $extension-name as xs:string, + $source-formats as xs:string+ +) as document-node()? +{ + let $found := + extut:get-extension-source($extension-type,$extension-name,$source-formats) + return + if (count($found) lt 2) + then + error((), "RESTAPI-NODOCUMENT", ("No extension with name " || $extension-name || " found.")) + else tail($found) +}; + +declare function extut:get-extension-source( + $extension-type as xs:string, + $extension-name as xs:string, + $source-formats as xs:string+ +) as item()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + let $base-uri := extut:make-base-uri($extension-type,$extension-name) + return ( + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"get-extension-source", + map:entry("base-uri",$base-uri) + =>map:with("extension-type",$extension-type) + =>map:with("source-formats",$source-formats) + ), + + dbut:access-config( + function() { + let $found := subsequence( + for $source-format in $source-formats + let $source-uri := + extut:make-source-uri($base-uri,$extension-type,$source-format) + return + if (not(doc-available($source-uri))) then () + else ($source-format, $source-uri), + 1, + 2 + ) + return + if (empty($found)) then () + else (head($found), doc(tail($found))) + } + ) + ) +}; + +declare function extut:get-extension-function( + $extension-type as xs:string, + $extension-name as xs:string, + $function-name as xs:string +) as xdmp:function? +{ + if ($extension-type eq "transform-all") then + let $source-format := try { + xdmp:apply( + extut:get-extension-function( + "transform",$extension-name,"source-format","xquery" + ) + ) + } catch($e) { } + return + if ($source-format eq "javascript") + then extut:transform-all-js($extension-name, ?, ?) + else extut:transform-all( + extut:get-extension-function( + "transform",$extension-name,$function-name,"xquery" + ), + ?, + ?) + else extut:get-extension-function( + $extension-type,$extension-name,$function-name,"xquery" + ) +}; + +declare private function extut:get-extension-function( + $extension-type as xs:string, + $extension-name as xs:string, + $function-name as xs:string, + $source-format as xs:string +) as xdmp:function? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + let $fkey := string-join(($extension-type,$extension-name,$function-name),"/") + let $fcached := map:get($function-cache,$fkey) + return + if (exists($fcached)) + then $fcached + else + let $system-module := + if ($extension-type eq "transform") + then map:get($system-transforms,$extension-name) + else map:get($system-resource-extensions,$extension-name) + let $function := + if (empty($system-module)) + then xdmp:function( + if ($source-format eq "xquery") + then QName(extut:get-extension-namespace($extension-type,$extension-name), $function-name) + else xs:QName($function-name), + extut:make-source-uri( + extut:make-base-uri($extension-type,$extension-name), $extension-type, $source-format + ) + ) + else if ($extension-type eq "transform") + then xdmp:function( + QName(concat("http://marklogic.com/rest-api/transform/",$system-module), $function-name), + concat("/data-hub/5/transforms/",$system-module,".xqy") + ) + else xdmp:function( + QName(concat("http://marklogic.com/rest-api/extensions/",$system-module), $function-name), + concat("/data-hub/5/extensions/",$system-module,".xqy") + ) + return ( + if (empty($function)) then () + else map:put($function-cache,$fkey,$function), + + $function + ) +}; + +declare function extut:make-transform-wrapper( + $transform-name as xs:string +) as document-node() +{ + let $transform-uri := extut:get-source-uri("transform",$transform-name,"xslt") + let $transform-ns := extut:get-extension-namespace("transform",$transform-name) + return document {text {concat('xquery version "1.0-ml"; +module namespace ',$transform-name,' = "',$transform-ns,'"; +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "../lib/extensions-util.xqy"; +declare namespace xsl = "http://www.w3.org/1999/XSL/Transform"; +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; +declare private variable $transform-uri := "',$transform-uri,'"; +declare function ',$transform-name,':transform( + $context as map:map, + $params as map:map, + $content as document-node() +) as document-node()? +{ + extut:execute-transform($transform-uri,$context,$params,$content) +}; +' )}} +}; + +declare function extut:execute-transform( + $transform as item(), + $context as map:map, + $params as map:map, + $content as document-node() +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"execute-transform", + map:entry("transform",$transform)=>map:with("context",$context) + =>map:with("params",$params), + map:entry("content",$content) + ), + + let $map := map:entry("context", $context) + => map:with("params", $params) + return + typeswitch($transform) + case xs:string return xdmp:xslt-invoke($transform,$content,$map, + + true + ) + (: backward compatibility where wrapper contains transform :) + case element() return xdmp:xslt-eval($transform,$content,$map, + + true + ) + default return error((),"RESTAPI-INTERNALERROR",concat( + "unsupported transform type: ",xdmp:describe($transform) + )) +}; + +declare function extut:get-extension-namespace( + $extension-type as xs:string, + $extension-name as xs:string +) as xs:string +{ + concat("http://marklogic.com/rest-api/",$extension-type,"/",$extension-name) +}; + +declare function extut:get-source-uri( + $extension-type as xs:string, + $extension-name as xs:string, + $source-format as xs:string +) as xs:string +{ + extut:make-source-uri( + extut:make-base-uri($extension-type,$extension-name), + $extension-type, + $source-format + ) +}; + +declare private function extut:check-extension-type( + $extension-type as xs:string +) as empty-sequence() +{ + if ($extension-type = $valid-extension-types) then () + else error((),"RESTAPI-INTERNALERROR",concat( + "unsupported extension-type: ",$extension-type + )) +}; + +declare private function extut:make-extension-type-uri( + $extension-type as xs:string +) as xs:string +{ + concat("/marklogic.rest.",$extension-type,"/") +}; + +declare private function extut:make-base-uri( + $extension-type as xs:string, + $extension-name as xs:string +) as xs:string +{ + concat("/marklogic.rest.",$extension-type,"/",$extension-name,"/") +}; + +declare private function extut:make-metadata-uri( + $base-uri as xs:string +) as xs:string +{ + concat($base-uri,"assets/metadata.xml") +}; + +declare private function extut:make-source-uri( + $base-uri as xs:string, + $extension-type as xs:string, + $source-format as xs:string +) as xs:string +{ + concat($base-uri,"assets/",$extension-type,".", + switch($source-format) + case "xquery" return "xqy" + case "xslt" return "xsl" + case "javascript" return "sjs" + default return error((),"RESTAPI-INTERNALERROR",concat( + "could not specify extension for unknown source type: ",$source-format + )) + ) +}; + +declare private function extut:extract-metadata( + $desc-root as element() +) as element()* +{ + let $filter := ( + xs:QName("rapi:name"), + xs:QName("rapi:source-format"), + xs:QName("rapi:method"), + xs:QName("rapi:errors") + ) + return $desc-root/*[not(node-name(.) = $filter)] +}; + +declare private function extut:extract-xquery-services( + $service-defs as map:map, + $extension-name as xs:string, + $source-ns as xs:string, + $xquery-uri as xs:string, + $error-list as json:array +) as xs:string* +{ + (: TODO: rewrite as xdmp:invoke-function() :) + try { + extut:do-eval(concat('xquery version "1.0-ml"; +import module namespace test = "', $source-ns, '" at "', $xquery-uri, '"; +declare namespace rapi = "http://marklogic.com/rest-api"; +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare variable $service-defs as map:map external; +declare variable $extension-name as xs:string external; +declare variable $source-ns as xs:string external; +declare variable $xquery-uri as xs:string external; +declare variable $error-list as json:array external; +declare option xdmp:mapping "false"; +for $service-name in map:keys($service-defs) +let $service-def := map:get($service-defs,$service-name) +let $sreturn-type := head($service-def) +let $sparam-types := tail($service-def) +let $function := function-lookup( + QName($source-ns,$service-name), count($sparam-types) + ) +where exists($function) +return + if (0 lt count(( + (: overloads are not a problem because xdmp:apply() binds on arity :) + + for $sparam-type at $i in $sparam-types + let $fparam-type := xdmp:function-parameter-type($function,$i) + (: match the specified cardinality or any valid narrowing :) + let $sparam-len := string-length($sparam-type) + let $last-char := substring($sparam-type, $sparam-len, 1) + let $sparam-match := + switch ($last-char) + case "?" return + let $root := substring($sparam-type, 1, $sparam-len - 1) + return ($sparam-type, $root) + case "+" return + let $root := substring($sparam-type, 1, $sparam-len - 1) + return ($root, $sparam-type) + case "*" return + let $root := substring($sparam-type, 1, $sparam-len - 1) + return ($root||"?", $root, $sparam-type, $root||"+") + default return + $sparam-type + return + if ($fparam-type = $sparam-match) then () + else ( + json:array-push($error-list,concat( + "in ",$service-name," function of ",$extension-name," extension, ", + " parameter ",$i," named ",xdmp:function-parameter-name($function,$i), + " has ",$fparam-type," instead of ",$sparam-type," datatype" + )), + 1 + ), + + let $freturn-type := xdmp:function-return-type($function) + let $sreturn-len := string-length($sreturn-type) + let $last-char := substring($sreturn-type, $sreturn-len, 1) + let $sreturn-match := + (: valid narrowing of cardinality :) + switch ($last-char) + case "?" return + let $root := substring($sreturn-type, 1, $sreturn-len - 1) + return ($sreturn-type, $root) + case "+" return + let $root := substring($sreturn-type, 1, $sreturn-len - 1) + return ($root, $sreturn-type) + case "*" return + let $root := substring($sreturn-type, 1, $sreturn-len - 1) + return ($root||"?", $root, $sreturn-type, $root||"+") + default return + $sreturn-type + return + if ($freturn-type = $sreturn-match) then () + else ( + json:array-push($error-list,concat( + "in ",$service-name," function of ",$extension-name," extension, ", + " returns ",$freturn-type," instead of ",$sreturn-type," datatype" + )), + 1 + ), + + let $txn-mode := xdmp:annotation($function, xs:QName("rapi:transaction-mode")) + return + if (empty($txn-mode) or $txn-mode = ("query","update")) then () + else ( + json:array-push($error-list,concat( + "in ",$service-name," function of ",$extension-name," extension, ", + " annotation declares unknown transaction-mode ",$txn-mode + )), + 1 + ) + ))) + then () + else $service-name +'), + +(: TODO: generate metadata from optional annotations for metadata and parameters (like Roxy) :) + ( + xs:QName("service-defs"), $service-defs, + xs:QName("extension-name"), $extension-name, + xs:QName("source-ns"), $source-ns, + xs:QName("source-uri"), $xquery-uri, + xs:QName("error-list"), $error-list + ), + () + ) + } catch($e) { + xdmp:log($e), + json:array-push($error-list,concat( + "could not parse XQuery extension ",$extension-name, + "; please see the server error log for detail ", + $e/error:format-string!string(.) + )) + } +}; + +declare private function extut:extract-javascript-services( + $service-defs as map:map, + $extension-name as xs:string, + $source-uri as xs:string, + $error-list as json:array +) as xs:string* +{ + (: first test, list contents of js extension :) + (: but even before that, allor to go through :) + try { + for $key in map:keys(extut:do-js-eval( + 'require("' || $source-uri || '")', (), () + )) + (: javascript uses upper case module names to export functions :) + return lower-case($key) + } catch ($e) { + xdmp:log($e), + json:array-push($error-list,concat( + "could not parse JavaScript extension ",$extension-name, + "; please see the server error log for detail ", + $e/error:format-string!string(.) + )) + } +}; + +declare private function extut:write-extension-metadata( + $extension-type as xs:string, + $extension-name as xs:string, + $metadata as element()*, + $source-format as xs:string, + $services as xs:string* +) as xs:boolean +{ + let $metadata-uri := extut:make-metadata-uri( + extut:make-base-uri($extension-type,$extension-name) + ) + return extut:write-extension-metadata( + $extension-type,$extension-name,$metadata,$source-format, + $services,(),$metadata-uri + ) +}; + +declare private function extut:write-extension-metadata( + $extension-type as xs:string, + $extension-name as xs:string, + $metadata as element()*, + $source-format as xs:string, + $services as xs:string*, + $error-list as json:array?, + $metadata-uri as xs:string +) as xs:boolean +{ + dbut:update-config( + function() { + let $all-metadata := + if (exists($metadata)) + then $metadata + else if (doc-available($metadata-uri)) + then doc($metadata-uri)!extut:extract-metadata(rapi:*) + else () + return extut:do-metadata-insert( + $metadata-uri, + extut:make-metadata-doc( + $extension-type,$extension-name,$all-metadata, + $source-format,$services,$error-list + ) + ), + + true() + } + ) +}; + +declare function extut:invoke-service( + $extension-name as xs:string, + $method as xs:string, + $default-txn-mode as xs:string?, + $service as xdmp:function, + $context as map:map, + $service-params as map:map, + $input as document-node()*, + $in-txn as xs:boolean +) as map:map +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + try { + let $txn-curr := + if ($in-txn) then () + else if (empty(xdmp:request-timestamp())) + then "update" + else "query" + let $txn-mode := + if ($in-txn) then () + else head(( + xdmp:annotation($service, xs:QName("rapi:transaction-mode")), + $default-txn-mode, + $txn-curr + )) + return ( + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"invoke-service", + map:entry("extension-name",$extension-name)=>map:with("method",$method) + =>map:with("context",$context)=>map:with("service-params",$service-params) + =>map:with("default-txn-mode",$default-txn-mode)=>map:with("in-txn",$in-txn) + =>map:with("txn-curr",$txn-curr)=>map:with("txn-mode",$txn-mode), + map:entry("input",$input) + ), + + xdmp:invoke-function( + function() { + extut:call-service( + $extension-name,$method,$service,$context,$service-params,$input + ) + }, + if ($in-txn or $txn-mode eq $txn-curr) then + + same-statement + true + + else + + different-transaction + true + auto + {string($txn-mode eq "update")} + + ) + ) + } catch ($e) { + if ($e/error:code/string() eq "XDMP-MODNOTFOUND") + then error((), "RESTAPI-INVALIDREQ", concat( + "Extension ",$extension-name," or a dependency does not exist", + $e/error:format-string!concat(": ", string(.)) + )) + else ( + xdmp:log($e, "debug"), + xdmp:rethrow() + ) + } +}; + +declare private function extut:call-service( + $extension-name as xs:string, + $method as xs:string, + $service as xdmp:function, + $context as map:map, + $service-params as map:map, + $input as document-node()* +) as map:map +{ + extut:make-output( + $context, + switch ($method) + case "TRANSFORM-ALL" return $service($context,$service-params) + case "TRANSFORM" return $service($context,$service-params,$input) + case "DELETE" return $service($context,$service-params) + case "GET" return $service($context,$service-params) + case "POST" return $service($context,$service-params,$input) + case "PUT" return $service($context,$service-params,$input) + default return error((),"RESTAPI-INTERNALERROR",concat( + "unknown method ",$method," for call on resource ",$extension-name + )) + ) +}; + +declare private function extut:transform-all( + $func as xdmp:function, + $context as map:map, + $params as map:map +) as map:map +{ + map:entry("response", + for $request in map:get($context,"requests") + let $context := map:get($request,"context") + return extut:make-output( + $context, + xdmp:apply($func, $context, $params, map:get($request,"input")) + ) + ) +}; + +declare private function extut:transform-all-js( + $extension-name as xs:string, + $context as map:map, + $params as map:map +) as map:map +{ + xdmp:apply( + xdmp:function( + xs:QName("applyList"), "../lib/extensions-util.sjs" + ), + $extension-name, + extut:make-source-uri( + extut:make-base-uri("transform",$extension-name), "transform", "javascript" + ), + "transform", + map:get($context,"requests"), + $params + ) +}; + +declare private function extut:make-output( + $context as map:map, + $results as item()* +) as map:map +{ + if (empty($results)) + then map:entry("context", $context) + (: extension already created the return :) + else if (count($results) gt 1 or not($results instance of map:map)) + then extut:put-result(map:entry("context", $context), $results) + else if (map:contains($results,"context")) + then extut:put-result($results, map:get($results,"result")) + else if (map:contains($results,"response")) + then $results + else extut:put-result(map:entry("context", $context), $results) +}; +declare private function extut:put-result( + $output as map:map, + $results as item()* +) as map:map +{ + if (empty($results)) + then $output + else + typeswitch(head($results)) + case document-node() return + map:with($output,"result",$results) + case json:array return + map:with($output,"result", + for $result in $results + return document { xdmp:to-json($result) } + ) + case json:object return + map:with($output,"result", + for $result in $results + return document { xdmp:to-json($result) } + ) + default return + map:with($output,"result", + for $result in $results + return document { $result } + ) +}; + +declare private function extut:do-eval( + $xquery as xs:string, + $vars as item()*, + $options as node()? +) as item()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"do-eval", + map:entry("xquery",$xquery)=>map:with("vars",$vars)=>map:with("options",$options) + ), + + if (exists($options)) + then xdmp:eval($xquery,$vars,$options) + else if (exists($vars)) + then xdmp:eval($xquery,$vars) + else xdmp:eval($xquery) +}; + +declare private function extut:do-js-eval( + $code as xs:string, + $vars as item()*, + $options as node()? +) as item()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"do-js-eval", + map:entry("code",$code)=>map:with("vars",$vars)=>map:with("options",$options) + ), + + if (exists($options)) + then xdmp:javascript-eval($code,$vars,$options) + else if (exists($vars)) + then xdmp:javascript-eval($code,$vars) + else xdmp:javascript-eval($code) +}; + +declare private function extut:make-metadata-doc( + $extension-type as xs:string, + $extension-name as xs:string, + $metadata as element()*, + $source-format as xs:string, + $services as xs:string*, + $error-list as json:array? +) as document-node() +{ + let $methods-name := xs:QName("rapi:methods") + let $methods-metadata := $metadata[node-name(.) eq $methods-name] + return + document { + element {xs:QName(concat("rapi:",$extension-type,"-metadata"))} { + {$extension-name}, + {$source-format}, + + if (empty($metadata)) then () + else if (exists($methods-metadata)) + then ($metadata except $methods-metadata) + else $metadata, + + if ($extension-type eq "transform") then () + else if ($extension-type eq "resource") then + { + for $service in $services + let $method := $methods-metadata / + rapi:method[string(rapi:method-name) eq $service] + return + if (exists($method)) + then $method + else + + {$service} + + } + else error((),"RESTAPI-INTERNALERROR",concat( + "unsupported extension type: ",$extension-type + )), + + if (empty($error-list) or json:array-size($error-list) eq 0) then () + else + { + for $error in json:array-values($error-list) + return {$error} + } + } + } +}; + +declare private function extut:do-metadata-insert( + $metadata-uri as xs:string, + $metadata-doc as document-node() +) as empty-sequence() +{ + extut:do-document-insert( + $metadata-uri, + $metadata-doc, + ( + xdmp:permission("rest-extension-user", "update"), + xdmp:permission("rest-extension-user", "read"), + (: backward compatability for ML 6 and 7.0-2 :) + xdmp:permission("rest-reader", "execute"), + (: for backward compatability with ML 6 :) + xdmp:permission("application-plugin-registrar", "update"), + xdmp:permission("application-plugin-registrar", "read") + ), + (), + (), + () + ) +}; + +declare private function extut:do-document-insert( + $uri as xs:string, + $root as node(), + $permissions as element(sec:permission)*, + $collections as xs:string*, + $quality as xs:int?, + $forest-ids as xs:unsignedLong* +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"do-document-insert", + map:entry("uri",$uri)=>map:with("permissions",$permissions) + =>map:with("collections",$collections)=>map:with("quality",$quality) + =>map:with("forest-ids",$forest-ids), + map:entry("root",$root) + ), + + if (exists($forest-ids)) + then xdmp:document-insert($uri,$root,$permissions,$collections,$quality,$forest-ids) + else if (exists($quality)) + then xdmp:document-insert($uri,$root,$permissions,$collections,$quality) + else if (exists($collections)) + then xdmp:document-insert($uri,$root,$permissions,$collections) + else xdmp:document-insert($uri,$root,$permissions) +}; + +declare private function extut:do-document-delete( + $uri as xs:string +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"do-document-delete",map:entry("uri",$uri) + ), + + xdmp:document-delete($uri) +}; + +declare private function extut:do-directory-delete( + $extension-type as xs:string, + $extension-name as xs:string, + $uri as xs:string, + $metadata-uri as xs:string? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"do-directory-delete", + map:entry("uri",$uri)=>map:with("metadata-uri",$metadata-uri) + ), + + if (empty($metadata-uri) or doc-available($metadata-uri)) + then xdmp:directory-delete($uri) + else error((),"RESTAPI-NOTFOUND",concat( + $extension-type," extension does not exist: ",$extension-name + )) +}; + +declare private function extut:do-list-extension-metadata( + $extension-type as xs:string, + $service-defs as map:map?, + $with-refresh as xs:boolean +) as document-node()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or extut:check-untraced()) then () + else lid:log( + $extut:trace-id,"do-list-extension-metadata", + map:entry("extension-type",$extension-type) + ), + + let $meta-docs := dbut:access-config( + function() { + cts:search( + collection(), + cts:and-query(( + cts:directory-query( + extut:make-extension-type-uri($extension-type), + "infinity" + ), + cts:element-query( + xs:QName(concat("rapi:",$extension-type,"-metadata")), + cts:and-query(()) + ) + )), + ("unfiltered", "score-zero", "unchecked", "unfaceted"), + 0 + ) + } + ) + return + if (empty($meta-docs) or empty($service-defs) or not($with-refresh)) + then $meta-docs + else + let $xquery-docs := + $meta-docs[rapi:*/rapi:source-format/string(.) eq "xquery"] + let $xslt-docs := $meta-docs except $xquery-docs + let $error-map := map:map() + let $services-map := map:map() + return ( + for $xquery-doc in $xquery-docs + let $doc-uri := document-uri($xquery-doc) + let $extension-name := $xquery-doc/rapi:*/rapi:name/string(.) + let $error-list := json:array() + let $services := extut:extract-xquery-services( + $service-defs, + $extension-name, + extut:get-extension-namespace( + $extension-type,$extension-name + ), + extut:make-source-uri( + extut:make-base-uri($extension-type,$extension-name), + $extension-type, + "xquery" + ), + $error-list + ) + return ( + if (json:array-size($error-list) eq 0) then () + else map:put($error-map,$doc-uri,$error-list), + + if (empty($services)) then () + else map:put($services-map,$doc-uri,$services) + ), + + $xslt-docs, + + extut:do-refresh-extension-metadata( + $extension-type,$services-map,$error-map,$xquery-docs + ) + ) +}; + +declare private function extut:do-refresh-extension-metadata( + $extension-type as xs:string, + $services-map as map:map, + $error-map as map:map, + $xquery-docs as document-node()* +) as document-node()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if (empty($xquery-docs)) then () + else hof:apply-in( + xdmp:modules-database(), + 0, + function() { + for $xquery-doc in $xquery-docs + let $doc-uri := document-uri($xquery-doc) + let $doc-root := $xquery-doc/rapi:* + let $refresh := extut:make-metadata-doc( + $extension-type, + $doc-root/rapi:name/string(.), + extut:extract-metadata($doc-root), + $doc-root/rapi:source-format/string(.), + map:get($services-map,$doc-uri), + map:get($error-map,$doc-uri) + ) + return ( + extut:do-metadata-insert($doc-uri,$refresh), + + $refresh + ) + }, + "update-auto-commit" + ) +}; + +(: for backward compatibility :) +declare function extut:make-javascript-wrapper( + $func-name as xs:string, + $module-path as xs:string +) +{ + if ($func-name = ("GET", "DELETE")) + then function( + $context as map:map, + $params as map:map + ) as map:map { + xdmp:apply( + xdmp:function( + xs:QName("applyOnce"), "../lib/extensions-util.sjs" + ), + (), $module-path, $func-name, $context, $params, () + ) + } + else function( + $context as map:map, + $params as map:map, + $input as item()* + ) as map:map { + xdmp:apply( + xdmp:function( + xs:QName("applyOnce"), "../lib/extensions-util.sjs" + ), + (), $module-path, $func-name, $context, $params, $input + ) + } +}; + +declare private function extut:javascript-wrapper-module( + $extension-type as xs:string, + $extension-name as xs:string +) as document-node() +{ + let $base-uri := extut:make-base-uri($extension-type,$extension-name) + let $module-uri := extut:make-source-uri($base-uri,$extension-type,"javascript") + let $extension-ns := extut:get-extension-namespace($extension-type,$extension-name) + let $module-body := string(xquery version "1.0-ml"; +module namespace {$extension-name} = "{$extension-ns}"; + +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "../lib/extensions-util.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare private variable $extName := "{$extension-name}"; +declare private variable $modPath := "{$module-uri}"; +declare private variable $caller := xdmp:function( + xs:QName("applyOnce"), "../lib/extensions-util.sjs" + ); + +declare function {$extension-name}:source-format() as xs:string {{ + "javascript" +}}; +declare function {$extension-name}:get( + $context as map:map, $params as map:map +) as map:map {{ + xdmp:apply($caller,$extName,$modPath,"GET",$context,$params) +}}; +declare function {$extension-name}:delete( + $context as map:map, $params as map:map +) as map:map {{ + xdmp:apply($caller,$extName,$modPath,"DELETE",$context,$params) +}}; +declare function {$extension-name}:post( + $context as map:map, $params as map:map, $input as document-node()* +) as map:map {{ + xdmp:apply($caller,$extName,$modPath,"POST",$context,$params,$input) +}}; +declare function { + $extension-name}:put($context as map:map, $params as map:map, $input as document-node()* +) as map:map {{ + xdmp:apply($caller,$extName,$modPath,"PUT",$context,$params,$input) +}}; +declare function {$extension-name}:transform( + $context as map:map, $params as map:map, $input as document-node()? +) as map:map {{ + xdmp:apply($caller,$extName,$modPath,"transform",$context,$params,$input) +}}; +) + return document { $module-body } +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/json-build.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/json-build.xqy new file mode 100644 index 0000000000..7356bd432f --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/json-build.xqy @@ -0,0 +1,117 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace jsonbld = "http://marklogic.com/rest-api/lib/json-build"; + +import module namespace json="http://marklogic.com/xdmp/json" + at "/MarkLogic/json/json.xqy"; + +declare namespace xsi = "http://www.w3.org/2001/XMLSchema-instance"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +(: TODO: retire this module and use /MarkLogic/json/json.xqy :) + +declare function jsonbld:object( + $pairs as xs:anyAtomicType* +) as xs:string +{ + concat( + "{", + string-join( + let $item-count := count($pairs) + let $pair-count := + if ($item-count mod 2 ne 0) + then error((),"RESTAPI-INTERNALERROR", ("JSON build, unbalanced pairs: ",string-join($pairs," | "))) + else $item-count idiv 2 + for $i in 1 to $pair-count + let $val-num := $i * 2 + let $key := string(subsequence($pairs, $val-num - 1, 1)) + let $value := string(subsequence($pairs, $val-num, 1)) + return concat( + jsonbld:key($key), + ":", + $value + ), + "," + ), + "}" + ) +}; + +declare function jsonbld:array( + $items as xs:anyAtomicType* +) as xs:string +{ + concat( + "[", + string-join( + for $item in $items + return string($item), + "," + ), + "]" + ) +}; + +declare function jsonbld:key( + $key as xs:string +) as xs:string +{ + if (starts-with($key,'"')) then $key + else jsonbld:string($key) +}; + +declare function jsonbld:element-value( + $elem as element() +) as xs:anyAtomicType +{ + xdmp:to-json-string(data($elem)) +}; + +declare function jsonbld:value( + $value as xs:anyAtomicType +) as xs:anyAtomicType +{ + xdmp:to-json-string($value) +}; + +declare function jsonbld:value( + $value as xs:anyAtomicType, + $type as xs:string? +) as xs:anyAtomicType +{ + xdmp:to-json-string($value) +}; + +declare function jsonbld:strings( + $values as xs:anyAtomicType* +) as xs:string* +{ + for $value in $values + return jsonbld:string($value) +}; + +declare function jsonbld:string( + $value as xs:anyAtomicType +) as xs:string +{ + xdmp:to-json-string(string($value)) +}; + +declare function jsonbld:get-map-sequence( + $map as map:map, + $key as xs:string +) as item()* +{ + if (empty($map)) then () + else + let $value := map:get($map,$key) + return + if (empty($value)) then () + else if ($value instance of json:array) + then json:array-values($value) + else $value +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/logger.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/logger.xqy new file mode 100644 index 0000000000..baf5c460c9 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/logger.xqy @@ -0,0 +1,78 @@ +xquery version "1.0-ml"; + +(: Copyright 2002-2018 MarkLogic Corporation. All Rights Reserved. :) +module namespace logger="http://marklogic.com/rest-api/logger_DELETE_IF_UNUSED"; + +import module namespace rest-impl="http://marklogic.com/appservices/rest-impl" + at "/MarkLogic/appservices/utils/rest-impl.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $logger:LEVEL := "info"; +declare variable $logger:server-flag := "debug"; + +declare function logger:log( + $message as xs:string* +) +{ + if (logger:logger-on()) + then + xdmp:log( ($message), $logger:LEVEL ) + else + () +}; + +declare function logger:dump-request-environment( +) as empty-sequence() +{ + logger:dump-request-environment((),()) +}; + +declare function logger:dump-request-environment( + $local-function as function(*)*, + $local-args as item()* +) as empty-sequence() +{ + if (logger:logger-on()) + then + let $reqenv := rest-impl:request-environment() + let $uri := map:get($reqenv, "uri") + let $path := map:get($reqenv, "path") + let $method := map:get($reqenv, "method") + let $accept := map:get($reqenv, "accept") + let $params := map:get($reqenv, "params") + let $local-msg := + for $fn in $local-function + return $fn($local-args) + return + ( + logger:log("Request environment:"), + logger:log(concat($method, " ", $path)), + logger:log(concat("Rewritten to: ", $uri)), + logger:log(concat("ACCEPT ", $accept)), + logger:log("PARAMS:"), + for $name in map:keys($params) + return + logger:log(concat(" ", $name, ": (", string-join(map:get($params, $name), ", "), ")")), + logger:log(""), + if (empty($local-msg)) + then () + else + (logger:log("Endpoint Details: "), + logger:log($local-msg)) + ) + else + () +}; + +(: function to see if logging is on :) +declare function logger:logger-on() +as xs:boolean +{ + let $log-on := map:get(eput:get-properties-map(),$logger:server-flag) + return if (fn:exists($log-on) and (xs:boolean($log-on) eq true())) then true() else false() +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/replace-lib.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/replace-lib.xqy new file mode 100644 index 0000000000..03d8192d92 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/replace-lib.xqy @@ -0,0 +1,395 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace replib = "http://marklogic.com/rest-api/lib/replace-lib"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +(: NOTE: This list is used to validate apply calls in document patch and so + must be kept current with the exposed built-in functions. :) +declare variable $replib:export := ( + "ml.add", "ml.subtract", "ml.multiply", "ml.divide", + "ml.concat-before", "ml.concat-after", "ml.concat-between", + "ml.substring-before", "ml.substring-after", "ml.replace-regex" + ); + +(: The caller is responsible for datatyping. + For datetime/duration arithmetic, the following operations are valid: + datetime +/- duration + duration +/- duration + duration */div number + datetime - datetime + duration div duration + :) +declare function replib:ml.add( + $node as node()?, + $content as item()* +) as node()* +{ + let $content-count := replib:check-input($node,$content,1,3) + return replib:construct-node( + $node, + replib:cast-datetime-duration-numeric( + $content,$content-count,2,data($node) + ) + + replib:cast-datetime-duration-numeric( + $content,$content-count,3,data(subsequence($content,1,1)) + ) + ) +}; + +declare function replib:ml.subtract( + $node as node()?, + $content as item()* +) as node()* +{ + let $content-count := replib:check-input($node,$content,1,3) + return replib:construct-node( + $node, + replib:cast-datetime-duration-numeric( + $content,$content-count,2,data($node) + ) + - replib:cast-datetime-duration-numeric( + $content,$content-count,3,data(subsequence($content,1,1)) + ) + ) +}; +declare function replib:ml.multiply( + $node as node()?, + $content as item()* +) as node()* +{ + let $content-count := replib:check-input($node,$content,1,3) + return replib:construct-node( + $node, + replib:cast-datetime-duration-numeric( + $content,$content-count,2,data($node) + ) + * replib:cast-datetime-duration-numeric( + $content,$content-count,3,data(subsequence($content,1,1)) + ) + ) +}; +declare function replib:ml.divide( + $node as node()?, + $content as item()* +) as node()* +{ + let $content-count := replib:check-input($node,$content,1,3) + return replib:construct-node( + $node, + replib:cast-datetime-duration-numeric( + $content,$content-count,2,data($node) + ) + div replib:cast-datetime-duration-numeric( + $content,$content-count,3,data(subsequence($content,1,1)) + ) + ) +}; + +declare function replib:ml.concat-before( + $node as node()?, + $content as item()* +) as node()* +{ + replib:check-input($node,$content,1,1)[false()], + replib:construct-node( + $node, + concat(string($content), string($node)) + ) +}; +declare function replib:ml.concat-after( + $node as node()?, + $content as item()* +) as node()* +{ + replib:check-input($node,$content,1,1)[false()], + replib:construct-node( + $node, + concat(string($node), string($content)) + ) +}; +declare function replib:ml.concat-between( + $node as node()?, + $content as item()* +) as node()* +{ + replib:check-input($node,$content,2,2)[false()], + replib:construct-node( + $node, + concat(string(head($content)), string($node), string(tail($content))) + ) +}; +declare function replib:ml.substring-before( + $node as node()?, + $content as item()* +) as node()* +{ + replib:check-input($node,$content,1,1)[false()], + replib:construct-node( + $node, + substring-before(string($node), string($content)) + ) +}; +declare function replib:ml.substring-after( + $node as node()?, + $content as item()* +) as node()* +{ + replib:check-input($node,$content,1,1)[false()], + replib:construct-node( + $node, + substring-after(string($node), string($content)) + ) +}; +declare function replib:ml.replace-regex( + $node as node()?, + $content as item()* +) as node()* +{ + let $content-count := replib:check-input($node,$content,2,3) + return replib:construct-node( + $node, + if ($content-count eq 2) + then replace( + string($node), + string(head($content)), + string(tail($content)) + ) + else replace( + string($node), + string(subsequence($content,1,1)), + string(subsequence($content,2,1)), + string(subsequence($content,3,1)) + ) + ) +}; + +declare private function replib:datatype( + $content as item()*, + $count as xs:int, + $position as xs:int +) as xs:string? +{ + if ($count lt $position) then () + else + let $datatype := string(subsequence($content,$position,1)) + return + if (starts-with($datatype,"xs:")) + then substring-after($datatype,"xs:") + else $datatype +}; + +declare private function replib:cast-datetime-duration-numeric( + $content as item()*, + $count as xs:int, + $position as xs:int, + $value as item() +) as item() +{ + typeswitch($value) + case xs:untypedAtomic return + replib:datetime-duration-numeric-string($content,$count,$position,$value) + case xs:string return + replib:datetime-duration-numeric-string($content,$count,$position,$value) + case json:array return error((),"RESTAPI-INVALIDCONTENT", + concat("operation does not support JSON array values") + ) + case json:object return error((),"RESTAPI-INVALIDCONTENT", + concat("operation does not support JSON object values") + ) + default return $value +}; + +declare private function replib:datetime-duration-numeric-string( + $content as item()*, + $count as xs:int, + $position as xs:int, + $value as item() +) as item() +{ + let $datatype := replib:datatype($content,$count,$position) + return + if (empty($datatype)) + then replib:default-numeric-cast($value) + else replib:cast-datetime-duration-numeric($datatype, $value) +}; + +declare function replib:cast-value( + $datatype as xs:string, + $value as item() +) as item() +{ + let $type := + if (starts-with($datatype,"xs:")) + then substring-after($datatype,"xs:") + else $datatype + return + if ($type eq 'string') + then xs:string($value) + else replib:cast-datetime-duration-numeric($type, $value) +}; + +declare private function replib:cast-datetime-duration-numeric( + $datatype as xs:string, + $value as item() +) as item() +{ + let $numeric := replib:cast-numeric-datatype($datatype,$value) + return + if (exists($numeric)) + then $numeric + else + let $datetime := replib:cast-datetime-datatype($datatype,$value) + return + if (exists($datetime)) + then $datetime + else + let $duration := replib:cast-duration-datatype($datatype,$value) + return + if (exists($duration)) + then $duration + else error((),"RESTAPI-INVALIDCONTENT", + concat("operation does not support datatype: ",$datatype) + ) +}; + +declare private function replib:cast-datetime-datatype( + $datatype as xs:string, + $value as item() +) +{ + if ($datatype eq "date" ) then xs:date($value) + else if ($datatype eq "dateTime" ) then xs:dateTime($value) + else if ($datatype eq "time" ) then xs:time($value) + else if ($datatype eq "gDay" ) then xs:gDay($value) + else if ($datatype eq "gMonth" ) then xs:gMonth($value) + else if ($datatype eq "gMonthDay" ) then xs:gMonthDay($value) + else if ($datatype eq "gYear" ) then xs:gYear($value) + else if ($datatype eq "gYearMonth") then xs:gYearMonth($value) + else () +}; + +declare private function replib:cast-duration-datatype( + $datatype as xs:string, + $value as item() +) +{ + if ($datatype eq "yearMonthDuration") then xs:yearMonthDuration($value) + else if ($datatype eq "dayTimeDuration" ) then xs:dayTimeDuration($value) + else () +}; + +declare private function replib:cast-numeric-datatype( + $datatype as xs:string, + $value as item() +) +{ + if ($datatype eq "decimal" ) then xs:decimal($value) + else if ($datatype eq "double" ) then xs:double($value) + else if ($datatype eq "float" ) then xs:float($value) + else if ($datatype eq "int" ) then xs:int($value) + else if ($datatype eq "integer" ) then xs:integer($value) + else if ($datatype eq "long" ) then xs:long($value) + else if ($datatype eq "short" ) then xs:short($value) + else if ($datatype eq "unsignedInt" ) then xs:unsignedInt($value) + else if ($datatype eq "unsignedLong" ) then xs:unsignedLong($value) + else if ($datatype eq "unsignedShort") then xs:unsignedShort($value) + else () +}; + +declare private function replib:default-numeric-cast( + $value as item() +) +{ + if ($value castable as xs:double) + then xs:double($value) + else error((),"RESTAPI-INVALIDCONTENT", + concat("cannot cast ",string($value)," for numeric operation")) +}; + +declare private function replib:check-input( + $node as node()?, + $content as item()*, + $min as xs:int, + $max as xs:int +) as xs:int +{ + if (exists($node)) then () + else error((),"RESTAPI-INVALIDCONTENT", + "function usable only for replace and not insert" + ), + + let $count := count($content) + return + if ($count ge $min and $count le $max) + then $count + else error((),"RESTAPI-INVALIDCONTENT", + if ($min eq $max) + then concat("requires exactly ",$min," additional arguments") + else concat( + "requires between ",$min," and ",$max," additional arguments" + ) + ) +}; + +declare private function replib:construct-node( + $node as node(), + $content as item()? +) as node() +{ + typeswitch($node) + case text() return + replib:name-node($node, text{$content}) + case number-node() return + replib:name-node($node, number-node{$content}) + case boolean-node() return + replib:name-node($node, boolean-node{$content}) + case element() return + element {node-name($node)} { + $node/(@* except @xsi:type), + + let $is-untyped := empty($node/@xsi:type) + return ( + if ($is-untyped or empty($content) or + $content instance of node()) then () + else + let $type := data($node/@xsi:type) + return + if (xdmp:castable-as(namespace-uri-from-QName($type),local-name-from-QName($type),$content)) + then attribute xsi:type { $type } + else attribute xsi:type { substring-after(xdmp:describe(sc:type($content)),"#") }, + + if ($is-untyped and $content instance of xs:double and + ceiling($content) eq floor($content) and + $content castable as xs:integer) + then xs:integer($content) + else $content + ) + } + case attribute() return + attribute {node-name($node)} {$content} + default return error((),"RESTAPI-INVALIDCONTENT", + "can only operate on elements, attributes, text, or numbers" + ) +}; + +declare private function replib:name-node( + $node as node(), + $content as node() +) as node() +{ + let $name := string(node-name($node)) + return + if (empty($name)) + then $content + else + let $object := json:object() + return ( + map:put($object,$name,$content), + + xdmp:to-json($object)/object-node()/node() + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/rest-result-decorator.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/rest-result-decorator.xqy new file mode 100644 index 0000000000..c7d3cddf3c --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/rest-result-decorator.xqy @@ -0,0 +1,65 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace dec = "http://marklogic.com/rest-api/lib/href-decorator"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "endpoint-util.xqy"; + +declare namespace search = "http://marklogic.com/appservices/search"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $dec:DECORATOR-APPLY as xs:string := "href-decorator"; +declare variable $dec:DECORATOR-NS as xs:string := "http://marklogic.com/rest-api/lib/href-decorator"; +declare variable $dec:DECORATOR-AT as xs:string := "/MarkLogic/rest-api/lib/rest-result-decorator.xqy"; + +declare variable $dec:result-decorator as element(search:result-decorator) := + element search:result-decorator { + attribute apply { $dec:DECORATOR-APPLY }, + attribute ns { $dec:DECORATOR-NS }, + attribute at { $dec:DECORATOR-AT } + }; + +declare function dec:href-decorator( + $uri as xs:string, + $result as node() +) as node()* +{ + let $db-param := xdmp:get-request-field("database") + let $uri-mimetype := xdmp:uri-content-type($uri) + let $is-unknown := ($uri-mimetype eq "application/x-unknown-content-type") + let $format := + let $mimetype-format := + if ($is-unknown) then () + else eput:get-outbound-type-format($uri-mimetype) + let $uri-format := + if ($is-unknown) then () + else if (exists($mimetype-format)) + then $mimetype-format + else xdmp:uri-format($uri) + return + if (exists($uri-format)) + then $uri-format + else eput:get-node-format($result) + let $mimetype := + if ($is-unknown or empty($uri-mimetype)) + then eput:get-format-type($format) + else $uri-mimetype + return ( + if (empty($db-param)) + then + attribute href { concat("/v1/documents?uri=", encode-for-uri($uri)) } + else + attribute href { concat("/v1/documents?uri=", encode-for-uri($uri), + "&database=", $db-param)}, + + if (empty($mimetype)) then () + else attribute mimetype {$mimetype}, + + if (empty($format)) then () + else attribute format { $format } + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/search-util.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/search-util.xqy new file mode 100644 index 0000000000..e7b7c6b454 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/search-util.xqy @@ -0,0 +1,1227 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace sut = "http://marklogic.com/rest-api/lib/search-util"; + +import module namespace config-query = "http://marklogic.com/rest-api/models/config-query" + at "../models/config-query-model.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "endpoint-util.xqy"; + +import module namespace jsonbld = "http://marklogic.com/rest-api/lib/json-build" + at "json-build.xqy"; + +import module namespace json="http://marklogic.com/xdmp/json" + at "/MarkLogic/json/json.xqy"; + +import module namespace search = "http://marklogic.com/appservices/search" + at "/MarkLogic/appservices/search/search.xqy"; + +import module namespace search-impl = "http://marklogic.com/appservices/search-impl" + at "/MarkLogic/appservices/search/search-impl.xqy"; + +import module namespace csu = "http://marklogic.com/rest-api/config-query-util" + at "config-query-util.xqy"; + +import module namespace dec = "http://marklogic.com/rest-api/lib/href-decorator" + at "rest-result-decorator.xqy"; + +import module namespace qbemod = "http://marklogic.com/rest-api/models/qbe-model" + at "/MarkLogic/rest-api/models/qbe-model.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +declare namespace json-basic = "http://marklogic.com/xdmp/json/basic"; +declare namespace qry = "http://marklogic.com/cts/query"; +declare namespace rapi = "http://marklogic.com/rest-api"; +declare namespace qbe = "http://marklogic.com/appservices/querybyexample"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare private variable $unquoted-datatypes := ( + "xs:boolean", "xs:double", "xs:float", "xs:int", "xs:short", "xs:unsignedInt", "xs:unsignedShort" + ); + +declare private variable $sometimes-quoted-datatypes := ( + "xs:decimal", "xs:integer", "xs:long", "xs:unsignedLong" + ); + +declare variable $sut:trace-id := "restapi.documents.search"; + +declare private variable $is-untraced := (); + +declare function sut:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, lid:is-disabled($sut:trace-id, ("restapi.documents", "restapi"))), + + $is-untraced +}; + +(: Fall back to global default if no stored options can be retrieved. + : For now, view (metadata, facets, search) is handled by brute + : force manipulation of options. + : TODO: we need to investigate options caching and merge methods for performance. +:) + +(: supports both search and key-value endpoints :) +declare function sut:make-options( + $params as map:map, + $combined-query as element(search:search)? +) as element(search:options) +{ + let $options-parameter := map:get($params,"options") + let $param-options := + if (exists($combined-query) and (empty($options-parameter) or $options-parameter eq "")) + then sut:selective-options($params, ()) + else sut:selective-options($params) + let $combined-options := $combined-query/search:options + return + if (exists($combined-options)) + then sut:merge-options($param-options, $combined-options) + else $param-options +}; + +(: Separate access to stored options from the final fallback + : to make unit testing easier :) +declare function sut:options( + $params as map:map +) as element(search:options) +{ + sut:selective-options($params) +}; +declare function sut:options( + $params as map:map, + $stored-options as element(search:options)? +) as element(search:options) +{ + sut:selective-options($params,$stored-options) +}; + +declare function sut:selective-options( + $params as map:map +) as element(search:options) +{ + let $options := map:get($params,"options") + let $stored-options := + if (empty($options) or ($options eq "")) + then config-query:get-options("default") + else + let $try := config-query:get-options($options) + return + if (empty($try)) + then error((),"REST-INVALIDPARAM",concat("No configured options: ",$options)) + else $try + return sut:selective-options($params,$stored-options) +}; +declare function sut:selective-options( + $params as map:map, + $stored-options as element(search:options)? +) as element(search:options) +{ + let $opts := + if (exists($stored-options)) + then $stored-options + else $config-query:default-options + let $delta-opts := sut:options-override($params,$opts) + return sut:merge-options($opts,$delta-opts) +}; + +declare private function sut:options-override( + $params as map:map, + $opts as element(search:options) +) as element(search:options)? +{ + let $view := map:get($params,"view") + let $forest-ids := + for $forest-name in map:get($params, "forest-name") + return xdmp:forest($forest-name) + return + if (empty($opts/search:additional-query) and empty($view) and empty($forest-ids)) + then () + else + { + $opts/search:additional-query, + switch($view) + case "all" return ( + true, + true, + true + ) + case "facets" return ( + true, + false, + false + ) + case "metadata" return ( + false, + true, + false + ) + case "results" return ( + false, + false, + true + ) + case "aggregate" return ( + true, + false + ) + case "values" return ( + false, + true + ) + default return (), + for $forest-id in $forest-ids + return { $forest-id } + } +}; + +(: This merge uses local-name/@name for uniqueness. :) +declare function sut:merge-options( + $core as element(search:options), + $delta as element(search:options)? +) as element(search:options) +{ + sut:merge-options( + $core, + $delta, + if (empty($core/search:result-decorator) and empty($delta/search:result-decorator)) + then $dec:result-decorator + else ()) +}; + +declare function sut:merge-options( + $core as element(search:options), + $delta as element(search:options)?, + $result-decorator as element(search:result-decorator)? +) as element(search:options) +{ + { (: element {node-name($core)} loses the prefix :) + $core/@*, + + if (empty($delta)) + then $core/search:* + else + let $subdelta := $delta/search:* + let $extended := $subdelta/node-name(.) + let $protected-names := ( + xs:QName("search:constraint"), xs:QName("search:values"), xs:QName("search:tuples"),xs:QName("search:additional-query") + ) + let $extended-named-nodes := + $delta/(search:constraint | search:values | search:tuples)/@name/string(.) + let $deltaopts := $delta/search:search-option/replace(string(.), "=.*$", "") + let $optgroup := + if (empty($deltaopts)) then () + else + let $groupmap := map:map() + return ( + for $member in $search-impl:search-options-group/exact-value + return map:put($groupmap, $member/string(.), $member/@group/string(.)), + $groupmap + ) + let $optmap := + if (empty($deltaopts)) then () + else + let $omap := map:map() + return ( + for $deltaopt in $deltaopts + return map:put( + $omap, + head((map:get($optgroup,$deltaopt), $deltaopt)), + true() + ), + $omap + ) + return ( + $subdelta, + (: filter options based on the option name string :) + if (empty($optmap)) then () + else + for $opt in $core/search:search-option + let $optname := replace(string($opt), "=.*$", "") + return + if (map:contains( + $optmap, + head((map:get($optgroup,$optname), $optname)) + )) + then () + else $opt, + $core/search:*[ + not( (: elements to be suppressed from core and replaced by deltas :) + node-name(.) = ($extended) (: suppress all elements with a corresponding name in delta :) + and + not( (: except :) + not(node-name(.) = $protected-names and ./@name/string(.) = $extended-named-nodes) (: DO suppress constraints that are namewise replaced :) + and + node-name(.) = $protected-names and not(./@name/string(.) = $extended-named-nodes) (: but keep the ones that don't have namewise replacements in delta :) + ))]), + $result-decorator + } +}; + +declare function sut:build-json-config-relevance-info( +) as map:map +{ + json:config("custom") + =>map:with("array-element-names", ("term")) + =>map:with("element-namespace", "http://marklogic.com/cts/query") + =>map:with("element-namespace-prefix", "qry") + =>map:with("text-value", "value") + =>map:with("attribute-names", ("warning","name")) +}; + +declare function sut:build-val-results-config( +) as map:map +{ + let $config := json:config("custom") + return $config + =>map:with("array-element-names", ("aggregate-result","distinct-value","type","tuple")) + =>map:with("element-namespace", "http://marklogic.com/appservices/search") + =>map:with("element-prefix", "search") + =>map:with("element-to-json", + sut:val-element-to-json(map:get($config,"element-to-json"), ?, ?) + ) +}; + +declare private function sut:val-element-to-json( + $base-function as function(map:map, element()) as item()?, + $config as map:map, + $element as element() +) as item()? +{ + typeswitch($element) + case element(search:values-response) return + sut:val-child-keys($base-function,$config,$element) + case schema-element(map:map) return map:map($element) + case schema-element(json:array) return json:array($element) + default return $base-function($config,$element) +}; +declare private function sut:val-child-keys( + $base-function as function(map:map, element()) as item()?, + $config as map:map, + $container-elem as element() +) as json:object +{ + let $container-obj := json:object() + let $contained-obj := json:object() + return ( + let $json-name-from-attribute-qname := + map:get($config,"json-name-from-attribute-qname") + for $child-attr in $container-elem/@* + return map:put( + $contained-obj, + $json-name-from-attribute-qname($config, node-name($child-attr)), + if (xdmp:atomizable($child-attr)) + then data($child-attr) + else string($child-attr) + ), + + for $child-elem in $container-elem/* + let $child-name := local-name($child-elem) + let $child-val := map:get( + sut:val-element-to-json($base-function,$config,$child-elem), + $child-name + ) + let $curr-val := map:get($contained-obj,$child-name) + return + if (empty($curr-val)) + then map:put($contained-obj,$child-name,$child-val) + else + let $add-val := + if ($child-val instance of json:array) + then json:array-values($child-val) + else $child-val + return + if ($curr-val instance of json:array) then + json:array-push($curr-val,$add-val) + else + map:put($contained-obj, $child-name, json:to-array($curr-val,$add-val)), + + map:put($container-obj, local-name($container-elem), $contained-obj), + + $container-obj + ) +}; + +declare function sut:build-val-config( +) as map:map +{ + json:config("custom") + =>map:with("array-element-names", ("values")) + =>map:with("element-namespace", "http://marklogic.com/rest-api") + =>map:with("element-prefix", "rapi") +}; + +declare function sut:make-structured-query( + $sq as node()?, + $qtext as xs:string*, + $options as element(search:options) +) as element()? +{ + sut:make-structured-query($sq,$qtext,$options,()) +}; + +declare function sut:make-structured-query( + $sq as node()?, + $qtext as xs:string*, + $options as element(search:options), + $params as map:map? +) as element()? +{ + typeswitch($sq) + case schema-element(cts:query) return + sut:handle-cts( + if (empty($sq/parent::search:search)) + then $sq + else sut:copy($sq, "http://marklogic.com/appservices/search"), + $params, + $qtext, + $options + ) + case element(search:query) return + sut:handle-query($sq,$params,$qtext) + case element(qbe:query) return + sut:handle-cts( + document {qbemod:xml-to-cts-query($sq)}/*, $params, $qtext, $options + ) + case element(search:search) return + let $queries := $sq/* except $sq/(search:options|search:qtext|search:sparql) + return + if (count($queries) gt 1) + then error((),"REST-INVALIDPARAM", ("Too many subqueries: "|| xdmp:quote($sq))) + else sut:make-structured-query( + $queries, ($qtext, $sq/search:qtext/string(.)), $options, $params + ) + case object-node("ctsquery") return + sut:handle-cts( + document {cts:query($sq)}/*, $params, $qtext, $options + ) + case object-node("query") return + sut:handle-query( + sut:search-from-json($sq/..)/search:query, $params, $qtext + ) + case object-node("$query") return + sut:handle-cts( + document {qbemod:json-to-cts-query($sq)}/*, $params, $qtext, $options + ) + case object-node("search") return + let $queries := $sq/(* except (options|qtext|sparql)) + return + if (count($queries) gt 1) + then error((),"REST-INVALIDPARAM", ("Too many subqueries: "|| xdmp:quote($sq))) + else sut:make-structured-query( + $queries, ($qtext, $sq/qtext/string(.)), $options, $params + ) + case object-node() return + if (exists($sq/..[not(. instance of document-node())])) + then error((),"REST-INVALIDPARAM", ("Invalid query nested object structure: "|| xdmp:quote($sq/..))) + else + let $queries := $sq/(* except (options|qtext|sparql)) + return + if (count($queries) gt 1) + then error((),"REST-INVALIDPARAM", ("Invalid query root object structure: "|| xdmp:quote($sq))) + else sut:make-structured-query($queries, ($qtext, $sq/qtext/string(.)), $options, $params) + case document-node() return + let $queries := $sq/* + return + if (count($queries) gt 1) + then error((),"REST-INVALIDPARAM", ("Invalid query root structure: "|| xdmp:quote($sq))) + else sut:make-structured-query($queries, $qtext, $options, $params) + case text() return + if (empty($sq/..[not(. instance of document-node())])) + then sut:make-structured-query(xdmp:unquote(string($sq))/*, $qtext, $options, $params) + else error((),"REST-INVALIDPARAM",("Invalid query text structure: "|| xdmp:quote($sq/..))) + case xs:string return + sut:make-structured-query(xdmp:unquote($sq)/*, $qtext, $options, $params) + case element() return + error((),"REST-INVALIDPARAM",("Invalid XML query structure (check namespace): "|| xdmp:quote($sq))) + case node() return + error((),"REST-INVALIDPARAM",("Invalid query structure: "|| xdmp:quote($sq))) + default return sut:handle-query((),$params,$qtext) +}; + +declare private function sut:copy( + $elem as element(), + $except as xs:string* +) as element() +{ + element {node-name($elem)} { + if (empty($except)) + then $elem/ancestor-or-self::element()/namespace::* + else $elem/ancestor-or-self::element()/namespace::*[not(string(.) = $except)], + $elem/@*, + $elem/node() + } +}; + +declare function sut:make-structured-query-node( + $structuredQuery as item()? +) as node()? +{ + typeswitch($structuredQuery) + case element() return $structuredQuery + case text() return $structuredQuery + case object-node() return $structuredQuery + case xs:string return + if ($structuredQuery eq "") then () + else + try { + xdmp:unquote($structuredQuery)/node() + } + catch($e) { + text { $structuredQuery } + } + default return () +}; + +declare function sut:wrap-queries( + $queries as cts:query* +) as cts:query? +{ + if(count($queries) lt 2) + then $queries + else cts:and-query($queries) +}; + +declare private function sut:make-cts-param( + $params as map:map? +) as cts:query* +{ + if (empty($params)) then () + else ( + let $directory := map:get($params, "directory") + return + if (empty($directory)) then () + else cts:directory-query( + if (ends-with($directory, "/")) + then $directory + else concat($directory, "/"), + "infinity" + ), + + let $collections := map:get($params, "collection") + return + if (empty($collections)) then () + else cts:collection-query($collections) + ) +}; + +declare function sut:make-search-param( + $params as map:map? +) as element()* +{ + if (empty($params)) then () + else ( + let $collections := map:get($params, "collection") + return + if (empty($collections)) then () + else + { + for $collection in $collections + return {$collection} + }, + + let $directories := map:get($params, "directory") + return + if (empty($directories)) then () + else + { + for $directory in $directories + let $directory := + if (ends-with($directory, "/")) + then $directory + else concat($directory, "/") + return {$directory}, + true + } + ) +}; + +declare private function sut:handle-cts( + $sq as schema-element(cts:query), + $params as map:map?, + $qtext as xs:string*, + $options as element(search:options) +) as schema-element(cts:query) +{ + sut:validate-query( + if (empty($qtext) or (count($qtext) eq 1 and $qtext eq "")) + then $sq + else + + {search:parse($qtext,$options)} + {sut:make-cts-param($params)} + {$sq} + + ) +}; + +declare private function sut:handle-query( + $sq as element(search:query)?, + $params as map:map?, + $qtext as xs:string* +) as element(search:query)? +{ + let $qlist := $qtext[. ne ""] + let $pq := sut:make-search-param($params) + return sut:validate-query( + if (empty($qlist) and empty($pq)) + then $sq + else + { + for $qitem in $qlist + return {$qitem}, + $pq, + $sq/* + } + ) +}; + +declare function sut:validate-query( + $q as element()? +) as element()? +{ + if (empty($q)) then () + else + let $rest-properties := eput:get-properties-map() + let $debug := not($is-untraced or sut:check-untraced()) + let $validate-queries := head((map:get($rest-properties,"validate-queries"),false())) + let $validate := + if (exists($q) and ($validate-queries or $debug)) then + try { validate strict {$q}} + catch ($e) { $e } + else $q + return + typeswitch($validate) + case empty-sequence() return () + case element(search:query) return $validate + case schema-element(cts:query) return $validate + default return + let $errorString := $validate/error:format-string/string(.) + let $msg := + if (empty($errorString)) + then "Invalid query" + else concat("Invalid query: ", $errorString) + return ( + if (not($debug)) then () + else xdmp:log(concat( + "WARNING: ",$msg,", query terms may have been dropped." + )), + + if (not($validate-queries)) then () + else error((),"REST-INVALIDPARAM",$msg), + + $q) +}; + + +(: this function is for handling a json structured query :) +declare function sut:handle-text( + $sq as node()?, + $params as map:map?, + $qtext as xs:string* +) as element(search:query)? +{ + sut:handle-query( + sut:search-from-json($sq)/search:query, + $params, + $qtext + ) +}; + +(: Existing json serialization drops attributes. Special-case for existing search wrapper, to be replaced when + : Plex JSON support comes online. :) +declare function sut:json-serialize( + $response as element(), + $view as xs:string? +) as xs:string +{ + jsonbld:object(sut:serialize-response($response,$view)) +}; + +declare function sut:response-to-json-object( + $response as element(), + $view as xs:string? +) as item()* +{ + xdmp:unquote(sut:json-serialize($response, $view)) +}; + +declare private function sut:serialize-response( + $response as element(), + $view as xs:string? +) as item()* +{ + if ($is-untraced or sut:check-untraced()) then () + else lid:log( + $sut:trace-id,"serialize-response",map:entry("response", $response)=>map:with("view",$view) + ), + + let $results := $response/(search:result|search:distinct-value) + let $facets := $response/(search:facet|search:boxes) + let $query := $response/search:query + let $qtext := $response/search:qtext + return ( + sut:unwrap-attributes($response/@*), + + if (empty($results) and not($view = ("results","all"))) then () + else sut:serialize-results($results), + + if (empty($facets) and not($view = ("facets","all"))) then () + else sut:serialize-facets($facets), + + if (empty($query)) then () + else ("query", xdmp:to-json-string(cts:query($query/node()))), + + if (empty($qtext)) then () + else ("qtext", jsonbld:string(string($qtext))), + + for $child in $response/(* except ($results|$facets|$query|$qtext)) + return sut:serialize-element($child) + ) +}; + + +declare private function sut:serialize-results( + $results as element()* +) as item()* +{ + jsonbld:key("results"), + jsonbld:array( + for $result in $results + let $extracted := $result/search:extracted + let $extracted-none := + if (exists($extracted)) then () + else $result/search:extracted-none + let $metadata := $result/search:metadata + let $snippets := $result/search:snippet + let $relevance-info := $result/qry:relevance-info + let $raw-nodes := $result/(node() except ( + $extracted|$extracted-none|$metadata|$relevance-info|$snippets + )) + let $raw-elem := $raw-nodes[. instance of element()][1] + let $raw-text := + if (empty($raw-nodes) or exists($raw-elem)) then () + else $raw-nodes[. instance of text()][1] + let $format := $result/@format/string(.)[string-length(.) gt 0] + return jsonbld:object(( + sut:unwrap-attributes($result/@*), + $snippets/sut:translate-snippet(.), + if (empty($metadata)) then () + else sut:translate-metadata($metadata), + if (exists($extracted)) + then sut:translate-extracted($format,$extracted) + else if (exists($extracted-none)) + then sut:translate-extracted-none($extracted-none) + else (), + $relevance-info/sut:translate-relevance-info(.), + if (exists($raw-elem)) then ( + jsonbld:key("content"), + jsonbld:value(xdmp:quote($raw-elem)) + ) + else if (exists($raw-text)) then ( + jsonbld:key("content"), + let $format := + let $af := $result/@format/string(.) + return + if (exists($af)) + then $af + else + let $uri := $result/@uri/string(.) + let $mf := eput:get-outbound-type-format( + xdmp:uri-content-type($uri) + ) + return + if (exists($mf)) + then $mf + else xdmp:uri-format($uri) + return + if ($format eq "json") + then string($raw-text) + else jsonbld:value(string($raw-text)) + ) + (: no JSON representation of binary, comment, or processing instruction :) + else () + )) + ) +}; + +declare function sut:translate-snippet( + $snippet as element(search:snippet) +) as item()* +{ + let $custom-snippet-format := $snippet/@format/data() + let $matches := $snippet/search:match + return + if (exists($matches)) then ( + jsonbld:key("matches"), + jsonbld:array( + for $match in $matches + return jsonbld:object(( + jsonbld:key("path"), + jsonbld:value(string($match/@path)), + jsonbld:key("match-text"), + jsonbld:array(( + for $subnode in $match/node() + return + typeswitch($subnode) + case element() return + sut:translate-subelement($subnode) + case text() return + jsonbld:string($subnode) + default return + jsonbld:string(xdmp:quote($subnode)) + )) + )) (: end jsonbld:object :) + ) (: ends jsonbld:array :) + ) (: ends if exists($matches) then :) + else + let $snippet-text := $snippet/text() + return + (: empty snippeting case :) + if (empty($snippet-text)) + then (jsonbld:key("matches"), "null") + (: custom snippeting case -- function returned a quoted JSON string :) + else if ($custom-snippet-format eq "json") + then (jsonbld:key("matches"), string($snippet-text)) + else (jsonbld:key("matches"), jsonbld:value($snippet-text)) +}; + +declare function sut:translate-metadata( + $meta as element()* +) as item()* +{ + if (empty($meta)) then () + else ( + jsonbld:key("metadata"), + jsonbld:array( + for $m in $meta/* + let $local-name := local-name($m) + let $ns-uri := namespace-uri($m)[not(. eq "")] + let $meta-type := + if (empty($ns-uri) or $ns-uri ne "http://marklogic.com/appservices/search") + then "element" + else if ($local-name eq "attribute-meta") + then "attribute" + else if ($local-name eq "constraint-meta") + then "constraint" + else "element" + let $key := + switch ($meta-type) + case "attribute" return + concat( + sut:clarkify($m/@parent-ns/string(.), $m/@parent-name/string(.)), + "_", + sut:clarkify($m/@ns/string(.), $m/@name/string(.)) + ) + case "constraint" return + $m/@name/string(.) + default return + if (empty($ns-uri)) + then $local-name + else if ($ns-uri ne "http://marklogic.com/xdmp/json/basic") + then sut:clarkify($ns-uri,$local-name) + else xdmp:decode-from-NCName($local-name) + return + if (empty($key)) then () + else jsonbld:object(( + jsonbld:key($key), jsonbld:element-value($m), + jsonbld:key("metadata-type"), jsonbld:value($meta-type) + )) + ) + ) +}; + +declare function sut:translate-extracted-none( + $extracted as element(search:extracted-none) +) as item()* +{ + jsonbld:key("extracted-none"), + jsonbld:object(sut:unwrap-attributes($extracted/@*)) +}; + +declare function sut:translate-extracted( + $format as xs:string?, + $extracted as element(search:extracted) +) as item()* +{ + jsonbld:key("extracted"), + jsonbld:object(( + sut:unwrap-attributes($extracted/@*), + jsonbld:key("content"), + let $subnodes := $extracted/node() + let $subcount := count($subnodes) + return + switch($format) + case "json" return + if ($extracted/@kind/string(.) eq "array") + then string($extracted) + else jsonbld:array(string($extracted)) + case "text" return jsonbld:array(jsonbld:string(string($extracted))) + case "binary" return jsonbld:array(()) (: should never have subnodes :) + default return jsonbld:array(( + for $subnode in $subnodes + return + typeswitch($subnode) + case element() return jsonbld:string(xdmp:quote( + (: strip unused namespaces :) + element {node-name($subnode)} { + $subnode/@*, + $subnode/node() + } + )) + case text() return jsonbld:value($subnode) + default return jsonbld:string(xdmp:quote($subnode)) + )) + )) +}; + +declare function sut:translate-subelement( + $subelem as element() +) as item()* +{ + typeswitch($subelem) + case element(json:array) return + xdmp:quote(xdmp:to-json(json:array($subelem))) + case element(json:object) return + xdmp:quote(xdmp:to-json(json:object($subelem))) + case element(json-basic:json) return + json:transform-to-json-string($subelem,json:config("basic")) + default return + jsonbld:object(( + jsonbld:key(local-name($subelem)), + if (empty($subelem/element())) + then jsonbld:element-value($subelem) + else jsonbld:string(xdmp:quote($subelem/node())) + )) +}; + +declare private function sut:clarkify( + $ns-uri as xs:string?, + $local-name as xs:string +) as xs:string +{ + if (empty($ns-uri) or $ns-uri eq "") + then $local-name + else concat("{",$ns-uri,"}",$local-name) +}; + +declare function sut:translate-relevance-info( + $relevance-info as element(qry:relevance-info) +) as item()* +{ + jsonbld:key("relevance-info"), + map:get( + json:transform-to-json-object($relevance-info, sut:build-json-config-relevance-info()), + "relevance-info" + ) +}; + +declare function sut:serialize-element( + $element as element() +) as item()* +{ + let $childElem := $element/* + let $childAtt := $element/@* + let $hasChildElem := exists($childElem) + let $hasChildAtt := exists($childAtt) + let $hasChildText := exists($element/text()) + return + if ($hasChildElem and not($hasChildText)) then ( + (: this is a bit brain dead, does not do proper arrays :) + jsonbld:key(local-name($element)), + jsonbld:object(( + if (not($hasChildAtt)) then () + else sut:unwrap-attributes($childAtt), + (: does not detect arrays :) + for $child in $childElem + return sut:serialize-element($child) + ))) + else if ($hasChildElem and $hasChildText) + then () (: There should be no mixed content to handle outside of snippets, which are special-cased for now :) + else if (not($hasChildText) and $hasChildAtt) + then (jsonbld:key(local-name($element)),jsonbld:object((sut:unwrap-attributes($childAtt)))) + else if ($hasChildText) + then (jsonbld:key(local-name($element)),jsonbld:value(data($element))) + (: completely empty :) + else (jsonbld:key(local-name($element)), "null") +}; + +declare function sut:serialize-facets( + $facets as element()* +) as item()* +{ + jsonbld:key("facets"), + jsonbld:object(( + for $facet in $facets + return + typeswitch($facet) + case element(search:facet) return sut:serialize-facet($facet) + case element(search:boxes) return sut:serialize-boxes($facet) + default return () + )) +}; + +declare function sut:serialize-facet( + $facet as element(search:facet) +) as item()* +{ + (jsonbld:key($facet/@name/string()), + jsonbld:object(( + sut:unwrap-attributes($facet/(@* except @name)), + jsonbld:key("facetValues"), + jsonbld:array(( + let $facet-type := $facet/@type/string() + for $facet-value in $facet/search:facet-value + return jsonbld:object(( + sut:unwrap-attributes($facet-value/(@* except $facet-value/(@count|@name))), + jsonbld:key("name"), + jsonbld:string($facet-value/@name), + $facet-value/@count/( + jsonbld:key("count"), + data(.) + ), + jsonbld:key("value"), + if (empty($facet-type)) + then jsonbld:value(data($facet-value)) + else if ($facet-type = $unquoted-datatypes) + then string($facet-value) + else if ($facet-type = $sometimes-quoted-datatypes) + then jsonbld:value(xs:decimal(data($facet-value))) + else jsonbld:string(string($facet-value)) + )) + )) + ))) +}; + +declare function sut:serialize-boxes( + $boxes as element(search:boxes) +) as item()* +{ + (jsonbld:key($boxes/@name/string()), + jsonbld:object(( + sut:unwrap-attributes($boxes/(@* except @name)), + jsonbld:key("boxes"), + jsonbld:array(( + for $box in $boxes/search:box + return jsonbld:object((sut:unwrap-attributes($box/@*))) + )) + ))) +}; + +(: TODO: investigate better handling of plan :) +declare function sut:serialize-plan( + $plan as element(search:plan) +) as item()* +{ + jsonbld:object(( + jsonbld:key("plan"), + jsonbld:value(xdmp:quote($plan/qry:query-plan)) + )) +}; + +declare private function sut:unwrap-attributes( + $attributes as attribute()* +) as item()* +{ + for $attr in $attributes + return ( + jsonbld:key(local-name($attr)), jsonbld:value(data($attr)) + ) +}; + +declare function sut:log-effective-options( + $params as map:map +) as xs:string* +{ + concat("PERSISTED OPTIONS (",head((map:get($params,"options")[. ne ""], "DEFAULT")),"): "), + xdmp:quote(sut:options($params)) +}; + + +(: transform search:search payload to json :) +declare function sut:search-to-json( + $search-criteria as element(search:search) +) +{ + csu:options-to-json-object($search-criteria) +}; + +declare function sut:search-from-json( + $json-raw as node()? +) as element(search:search)? +{ + let $json := + let $search := $json-raw/search + let $except := $search/(ctsquery|node("$query")) + return + if (empty($except)) + then $json-raw + else + let $keep := $search/* except $except + return + if (empty($keep)) then () + else + let $json-obj := json:object() + return ( + for $json-node in $keep + return map:put($json-obj, name($json-node), $json-node), + + xdmp:to-json(map:entry("search", $json-obj)) + ) + return + if (empty($json)) then () + else + let $xml := csu:options-from-json($json) + return + if ($xml instance of element(search:search)) + then $xml + else if (empty($xml)) + then () + else {$xml} +}; + +(: returns empty-sequence() if there's no combined query payload :) +declare function sut:make-combined-query( + $input as node()? +) as element(search:search)? +{ + let $combined-query := + typeswitch($input) + case document-node() return sut:make-combined-query($input/node()) + case element(search:search) return $input + case object-node("search") return sut:search-from-json($input/parent::node()) + case object-node() return + if (exists($input/search)) + then sut:search-from-json($input) + else if (exists($input/(qtext|query))) + then sut:search-from-json(object-node {"search" : $input}) + else () + default return () + return + if (empty($combined-query/*)) then () + else sut:validate-combined-query($combined-query) +}; + +declare private function sut:validate-combined-query( + $input as element(search:search) +) as element(search:search)? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + let $rest-properties := eput:get-properties-map() + let $debug := not($is-untraced or sut:check-untraced()) + let $validate-queries := head((map:get($rest-properties,"validate-queries"), false())) + let $validate-options := head((map:get($rest-properties,"validate-options"), false())) + let $options := $input/search:options + let $validate-errors := json:array() + return ( + if (($validate-queries or $debug) and exists($input/search:query)) then + try { + sut:validate-query($input/search:query)[false()] + } catch ($e) { json:array-push($validate-errors, $e) } + else (), + + if (exists($options)) then ( + sut:check-extract-paths($options), + + if ($validate-options or $debug) then + try { + sut:validate-options($options)[false()] + } catch ($e) { json:array-push($validate-errors, $e) } + else () + ) + else (), + + if (json:array-size($validate-errors) gt 0) then + let $msg := string-join(( + "Invalid combined search", + json:array-values($validate-errors)//error:format-string/string(.) + ), + " " + ) + return ( + if (not($debug)) then () + else xdmp:log(concat( + "WARNING: ",$msg,", query terms may have been dropped." + )), + + if ($validate-queries or $validate-options) + then error((),"REST-INVALIDPARAM",$msg) + else () + ) + else (), + + $input + ) +}; + +declare function sut:check-extract-paths( + $options as element(search:options) +) as empty-sequence() +{ + let $invalid-paths := + for $extracter in $options/search:extract-document-data/search:extract-path + let $bindings := eput:collect-bindings($extracter) + let $path := string($extracter) + return + if (sut:is-valid-extract-path($bindings,$path)) then () + else $path + return + if (empty($invalid-paths)) then () + else error((), "RESTAPI-INVALIDCONTENT", + "invalid paths to extract document data: "||string-join($invalid-paths,", ") + ) +}; +declare private function sut:is-valid-extract-path( + $bindings as map:map?, + $path as xs:string +) as xs:boolean +{ + if (exists($bindings)) + then cts:valid-extract-path($path,$bindings) + else cts:valid-extract-path($path) +}; + +declare function sut:validate-options( + $options as element(search:options) +) as element(search:options) +{ + if (map:get(eput:get-properties-map(),"validate-options") eq false()) + then $options + else + if (empty($options)) + then error((), "RESTAPI-INVALIDCONTENT", "Empty search configuration") + else + let $check := try { + if ($is-untraced or sut:check-untraced()) then () + else lid:log($sut:trace-id,"validate-options",map:entry("options", $options)), + + search:check-options($options) + } catch * { + error((), "RESTAPI-INVALIDCONTENT", "Operation results in invalid Options: " || $err:description) + } + return + if (empty($check)) + then $options + else error((),"RESTAPI-INVALIDCONTENT","Operation results in invalid Options: "|| string-join($check, "")) +}; + +declare private variable $sut:cts-array-element-names := ( + "and-query", "and-not-query", "annotation", "boost-query", "collection-query", + "directory-query", "document-query", "document-fragment-query", + "element-query", "element-attribute-range-query", "element-attribute-value-query", "element-attribute-word-query", + "element-attribute-pair-geospatial-query", "element-child-geospatial-query", "element-geospatial-query", + "element-pair-geospatial-query", "element-range-query", "element-value-query", "element-word-query", + "field-range-query", "field-value-query", "field-word-query", + "json-property-pair-geospatial-query", "json-property-child-geospatial-query", "json-property-geospatial-query", + "locks-fragment-query", "near-query", "not-in-query", "or-query", + "path-geospatial-query", "path-range-query", "properties-fragment-query", "query", + "registered-query", "reverse-query", "similar-query", "term-query", "triple-range-query", "value", "word-query", + "uri" + ); +declare private variable $sut:cts-attribute-names := ("operator", "weight"); diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/strict-util.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/strict-util.xqy new file mode 100644 index 0000000000..ac7f9ac264 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/lib/strict-util.xqy @@ -0,0 +1,14 @@ +xquery version "1.0"; (: MUST NOT BE "1.0-ml" -- requires strict behaviours :) + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace strict = "http://marklogic.com/rest-api/lib/strict-util"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; + +declare function strict:is-uri( + $uri as xs:string +) as xs:boolean +{ + exists(QName($uri,"x")) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/config-query-model.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/config-query-model.xqy new file mode 100644 index 0000000000..122b3d7c9a --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/config-query-model.xqy @@ -0,0 +1,482 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace config-query = "http://marklogic.com/rest-api/models/config-query"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace csu = "http://marklogic.com/rest-api/config-query-util" + at "../lib/config-query-util.xqy"; + +import module namespace sut = "http://marklogic.com/rest-api/lib/search-util" + at "../lib/search-util.xqy"; + +import schema namespace rapi = "http://marklogic.com/rest-api" + at "restapi.xsd"; + +declare namespace search = "http://marklogic.com/appservices/search"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +(: Use this to formulate a prefix for the REST API instance :) +declare variable $id := xdmp:server(); + +declare variable $storage-prefix := "/rest-api/options/"; + +declare variable $config-query:default-options := + + unfiltered + 0 + true + true + ; + +declare variable $config-query:trace-id := "restapi.documents.search"; + +declare private variable $is-untraced := (); + +declare function config-query:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($config-query:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +declare function config-query:get-list( + $headers as map:map, + $params as map:map +) +{ + let $accept := eput:get-content-type($params, $headers) + let $all-options := config-query:options() + return + if ($accept eq "application/json") + then concat("[", + string-join( + for $option in $all-options + return + '{"name":"' || $option || '","uri":"/v1/config/query/' || $option || '"}' + , ",") + , "]") + else + + { + for $option in $all-options + return + + {$option} + /v1/config/query/{$option} + + } + +}; + +declare function config-query:get( + $headers as map:map, + $params as map:map +) as item()? +{ + let $named-option := map:get($params, "named-option") + let $accept := eput:get-content-type($params, $headers) + let $persisted-opts := config-query:get-options($named-option) + let $opts := + if (empty($persisted-opts) and $named-option eq "default") + then $config-query:default-options + else $persisted-opts + return + if (empty($opts)) + then error((), "RESTAPI-NODOCUMENT", ("options", "Options configuration '"||$named-option||"' not found")) + else csu:negotiate($accept,$opts) +}; + +declare function config-query:get-child( + $headers as map:map, + $params as map:map +) as item()* +{ + let $named-option := map:get($params, "named-option") + let $child-name := map:get($params, "child-name") + let $accept := eput:get-content-type($params, $headers) + let $doc := config-query:get-options($named-option) + let $child := $doc/*[local-name(.) = $child-name] + return + if (exists($child)) + then + csu:negotiate($accept, {$child}) + else error((), "RESTAPI-NODOCUMENT", ("options", "Child of options node at '"||$named-option||"/"||$child-name||"' not found")) +}; + +declare function config-query:post( + $headers as map:map, + $params as map:map, + $input as node()?, + $callback as function(*)? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + let $content-type := eput:get-inbound-content-type($params, $headers) + let $named-option := map:get($params, "named-option") + let $existing-options := config-query:get-options($named-option) + let $body := csu:accept-data($content-type, $input) + let $child-name := ($body/*/local-name(.))[1] + let $putative-result := if (exists($existing-options)) then $eput:CONTENT_UPDATED else $eput:CONTENT_CREATED + let $_ := if (empty($child-name)) then error((), "RESTAPI-INVALIDCONTENT", "Unexpected Payload: " || $body) else () + return + ( + if (empty($callback)) + then () + else + $callback($putative-result, ""), + config-query:append-child-to-options($named-option, $child-name, $body, ()) + ) + +}; + +declare function config-query:put( + $headers as map:map, + $params as map:map, + $input as node()?, + $callback as function(*)? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + let $content-type := eput:get-inbound-content-type($params, $headers) + let $body := csu:accept-data($content-type, $input) + let $named-option := map:get($params, "named-option") + let $existing-options := config-query:get-options($named-option) + let $putative-result := if (exists($existing-options)) then $eput:CONTENT_UPDATED else $eput:CONTENT_CREATED + return + typeswitch($body) + case element(search:options) return + ( + if (empty($callback)) + then () + else + $callback($putative-result, ""), + config-query:set-options($named-option, $body) + ) + default return error((), "RESTAPI-INVALIDCONTENT", "Unexpected Payload: " || $body ) +}; + +declare function config-query:put-child( + $headers as map:map, + $params as map:map, + $input as node()?, + $callback as function(*)? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + let $content-type := eput:get-inbound-content-type($params, $headers) + let $named-option := map:get($params, "named-option") + let $child-name := map:get($params, "child-name") + let $body := csu:accept-data($content-type, $input) + return + config-query:add-child-to-options($named-option, $child-name, $body, $callback) +}; + +declare function config-query:post-child( + $headers as map:map, + $params as map:map, + $input as node()?, + $callback as function(*)? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + let $content-type := eput:get-inbound-content-type($params, $headers) + let $named-option := map:get($params, "named-option") + let $child-name := map:get($params, "child-name") + let $body := csu:accept-data($content-type, $input) + let $_ := if (count(distinct-values($body/*/local-name(.))) gt 1) + then error( (), "RESTAPI-INVALIDCONTENT", ("All child elements in URL step must match child element in options payload")) + else () + let $_ := if ($child-name = $body/*/local-name(.)) + then () + else error( (), "RESTAPI-INVALIDCONTENT", ("Child element in URL step must match child element in options payload")) + return + config-query:append-child-to-options($named-option, $child-name, $body, $callback) +}; + + +declare private function config-query:append-child-to-options( + $named-option as xs:string, + $child-name as xs:string, + $body as element(), + $callback as function(*)? +) as empty-sequence() +{ + let $body-child-name := ($body/*/local-name(.))[1] + return if ($body-child-name eq $child-name) + then + if (config-query:options-exists($named-option)) + then + let $existing-options := config-query:get-options($named-option) + let $new-options := + + { + $existing-options/*, + $body/* + } + + return + ( + if (empty($callback)) + then () + else + $callback($eput:CONTENT_CREATED, ""), + config-query:set-options($named-option, $new-options) + ) + else + let $new-doc := {$body/*} + return + ( + if (empty($callback)) + then () + else + $callback($eput:CONTENT_CREATED, ""), + config-query:set-options($named-option, $new-doc) + ) + else error((), "REST-INVALIDPARAM", ("Options node submitted in request does not match options node in URL pattern")) +}; + +declare private function config-query:add-child-to-options( + $named-option as xs:string, + $child-name as xs:string, + $body as element(), + $callback as function(*)? +) as empty-sequence() +{ + let $body-child-name := ($body/*/local-name(.))[1] + return if ($body-child-name eq $child-name) + then + if (config-query:options-exists($named-option)) + then + let $existing-options := config-query:get-options($named-option) + let $new-options := + + { + $existing-options/*[not(local-name(.) eq $child-name)], + $body/* + } + + return + ( + if (empty($callback)) + then () + else + $callback($eput:CONTENT_UPDATED, ""), + config-query:set-options($named-option, $new-options) + ) + else + let $new-doc := {$body/*} + return + ( + if (empty($callback)) + then () + else + $callback($eput:CONTENT_UPDATED, ""), + config-query:set-options($named-option, $new-doc) + ) + else error((), "REST-INVALIDPARAM", ("Options node submitted in request does not match options node in URL pattern")) +}; + + +declare function config-query:delete-all( + $headers as map:map, + $params as map:map, + $callback as function(*)? +) as item()* +{ + if (empty($callback)) then () + else $callback($eput:CONTENT_DELETED, ""), + + let $check := map:get($params,"check") + for $option in config-query:options() + return config-query:delete-options($option,$check) +}; + +declare function config-query:delete( + $headers as map:map, + $params as map:map, + $callback as function(*)? +) as empty-sequence() +{ + if (empty($callback)) then () + else $callback($eput:CONTENT_DELETED, ""), + + config-query:delete-options(map:get($params,"named-option"), map:get($params,"check")) +}; + +declare function config-query:delete-child( + $headers as map:map, + $params as map:map, + $callback as function(*)? +) as empty-sequence() +{ + let $content-type := eput:get-inbound-content-type($params, $headers) + let $named-option := map:get($params, "named-option") + let $child-name := map:get($params, "child-name") + let $existing-options := config-query:get-options($named-option) + let $without-child := + + { + $existing-options/*[not(local-name(.) eq $child-name)] + } + + return + if (exists($existing-options/*[local-name(.) eq $child-name])) + then + ( + if (empty($callback)) + then () + else + $callback($eput:CONTENT_DELETED, ""), + config-query:set-options($named-option, $without-child) + ) + else + if (empty($callback)) + then () + else + $callback($eput:CONTENT_DELETED, "") +}; + + +declare function config-query:options( +) as item()* +{ + let $options := dbut:access-config( function() { + let $sid := xdmp:server() + let $new-path := "/" || xdmp:group-name() || "/" || xdmp:server-name($sid) + let $old-path := "/" || $sid + for $doc in cts:search(/search:options, cts:or-query(( + cts:directory-query($new-path || $config-query:storage-prefix), + cts:directory-query($old-path || $config-query:storage-prefix) + ))) + let $d := config-query:options-name-from-uri(base-uri($doc)) + order by $d + return $d + } ) + return $options +}; + +(: Get named options. Use search endpoint to get effective search options + : () for no options of that name in this stub + :) +declare function config-query:get-options( + $name as xs:string +) as element(search:options)? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or config-query:check-untraced()) then () + else lid:log($config-query:trace-id,"get-options",map:entry("name",$name)), + + dbut:access-config(function() { + doc(eput:make-document-uri($storage-prefix || $name))/node() + }) +}; + +(: a function for XQuery admin clients that need to bypass appserver context + : it ignores options validation. + :) +declare function config-query:set-options( + $rest-group as xs:unsignedLong, + $rest-server as xs:unsignedLong, + $modules-database-id as xs:unsignedLong, + $options-name as xs:string, + $options as element(search:options)? +) as empty-sequence() { + sut:check-extract-paths($options), + + if ($is-untraced or config-query:check-untraced()) then () + else lid:log($config-query:trace-id,"set-options", + map:entry("rest-group",$rest-group)=>map:with("rest-server",$rest-server) + =>map:with("modules-database-id",$modules-database-id) + =>map:with("options-name",$options-name)=>map:with("options",$options) + ), + + dbut:update-config(function() { + xdmp:document-insert( + eput:make-document-uri( + $storage-prefix || $options-name, + xdmp:group-name($rest-group), + xdmp:server-name($rest-server) + ), + $options, + (xdmp:permission("rest-admin-internal", "update"), + xdmp:permission("rest-reader-internal", "read"))) + }, + $modules-database-id + ) +}; + +declare function config-query:set-options( + $name as xs:string, + $options as element(search:options)? +) +as empty-sequence() +{ + let $modules-database-id := xdmp:modules-database() + let $rest-group := xdmp:group() + let $rest-server := xdmp:server() + let $check-opts := sut:validate-options($options) + return config-query:set-options($rest-group, $rest-server, $modules-database-id, $name, $check-opts) +}; + +declare function config-query:delete-options( + $name as xs:string, + $check as xs:string? +) as empty-sequence() +{ + let $doc-name := eput:make-document-uri($storage-prefix || $name) + let $options := map:entry( + "ifNotExists", + if (not($check = "exists")) then "allow" else "error" + ) + return ( + if ($is-untraced or config-query:check-untraced()) then () + else lid:log($config-query:trace-id,"delete-options", + map:entry("name",$name)=>map:with("check",$check) + ), + + dbut:update-config(function() { + xdmp:document-delete($doc-name,$options) + }, + xdmp:modules-database() + ) + ) +}; + + + +declare function config-query:options-name-from-uri( + $uri as xs:string +) as xs:string +{ + substring-before(tokenize($uri, "/")[last()], ".xml") +}; + +declare function config-query:options-exists( + $name as xs:string +) as xs:boolean +{ + if ($is-untraced or config-query:check-untraced()) then () + else lid:log( + $config-query:trace-id, "options-exists", map:entry("name",$name) + ), + + dbut:access-config(function() { + exists(eput:make-document-uri($storage-prefix || $name)) + }) +}; + diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-common.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-common.xqy new file mode 100644 index 0000000000..06b585cee3 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-common.xqy @@ -0,0 +1,1046 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace docmodcom = "http://marklogic.com/rest-api/models/document-model-common"; + +import module namespace jsonbld = "http://marklogic.com/rest-api/lib/json-build" + at "../lib/json-build.xqy"; + +import module namespace json="http://marklogic.com/xdmp/json" + at "/MarkLogic/json/json.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace tformod = "http://marklogic.com/rest-api/models/transform-model" + at "../models/transform-model.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +import schema namespace rapi = "http://marklogic.com/rest-api" + at "restapi.xsd"; + +declare namespace http = "xdmp:http"; +declare namespace multi = "xdmp:multipart"; +declare namespace json-basic = "http://marklogic.com/xdmp/json/basic"; +declare namespace sec = "http://marklogic.com/xdmp/security"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $docmodcom:trace-id := "restapi.documents"; + +declare private variable $is-untraced := (); + +declare function docmodcom:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, lid:is-disabled($docmodcom:trace-id, ("restapi"))), + + $is-untraced +}; + +declare function docmodcom:list-metadata-categories( +) as xs:string* +{ + "collections", "permissions", "properties", "quality", "metadata-values" +}; + +declare function docmodcom:select-category( + $params as map:map +) as xs:string* +{ + let $categories := map:get($params,"category") + return + if (empty($categories) or (count($categories) eq 1 and $categories = "")) + then "content" + else + for $category in $categories + order by $category + return $category +}; + +declare function docmodcom:parse-metadata( + $metadata-format as xs:string, + $metadata-doc as document-node()? +) as item()? +{ + if (empty($metadata-doc)) then () + else if ($metadata-format eq "json") + then xdmp:from-json($metadata-doc) + else $metadata-doc/node() +}; + +declare function docmodcom:parse-collections( + $uri as xs:string, + $meta-parsed as item()? +) as xs:string* +{ + if (empty($meta-parsed)) then () + else + typeswitch($meta-parsed) + case map:map + return docmodcom:convert-json-collection($uri,$meta-parsed) + case element(rapi:metadata) + return $meta-parsed/rapi:collections/rapi:collection/string(.) + default return () +}; + +declare function docmodcom:parse-permissions( + $uri as xs:string, + $meta-parsed as item()? +) as element(sec:permission)* +{ + if (empty($meta-parsed)) then () + else + typeswitch($meta-parsed) + case map:map + return docmodcom:convert-json-permissions($uri,$meta-parsed) + case element(rapi:metadata) + return $meta-parsed/rapi:permissions/docmodcom:convert-permissions($uri,rapi:permission) + default return () +}; + +declare function docmodcom:parse-properties( + $uri as xs:string, + $meta-parsed as item()? +) as element()* +{ + if (empty($meta-parsed)) then () + else + typeswitch($meta-parsed) + case map:map + return docmodcom:convert-json-properties($uri,$meta-parsed) + case element(rapi:metadata) + return $meta-parsed/prop:properties/(* except prop:*) + default return () +}; + +declare function docmodcom:parse-quality( + $uri as xs:string, + $meta-parsed as item()? +) as xs:int? +{ + if (empty($meta-parsed)) then () + else + typeswitch($meta-parsed) + case map:map + return docmodcom:convert-json-quality($uri,$meta-parsed) + case element(rapi:metadata) + return $meta-parsed/rapi:quality/data(.) + default return () +}; + +declare function docmodcom:parse-metadata-values( + $uri as xs:string, + $meta-parsed as item()? +) as map:map? +{ + if (empty($meta-parsed)) then () + else + typeswitch($meta-parsed) + case map:map + return docmodcom:convert-json-metadata-values($uri,$meta-parsed) + case element(rapi:metadata) + return docmodcom:convert-metadata-values($uri,$meta-parsed/rapi:metadata-values/rapi:metadata-value) + default return () +}; + +declare function docmodcom:convert-json-collection( + $uri as xs:string, + $map as map:map? +) as xs:string* +{ + if (empty($map)) then () + else + let $collections := jsonbld:get-map-sequence($map,"collections") + return + if (empty($collections)) then () + else if ($collections = "") + then error((),"RESTAPI-INVALIDCONTENT", "empty collections are not allowed. uri: "||$uri) + else if ($collections instance of xs:string+) + then $collections + else if ($collections instance of xs:untypedAtomic+) then + for $collection in $collections + return xs:string($collection) + else error((),"RESTAPI-INVALIDCONTENT", "collections not strings or untyped atomics. uri: "||$uri) +}; + +declare function docmodcom:convert-json-permissions( + $uri as xs:string, + $map as map:map? +) as element(sec:permission)* +{ + if (empty($map)) then () + else + let $permissions := jsonbld:get-map-sequence($map,"permissions") + return + if (empty($permissions)) then () + else docmodcom:convert-permissions( + $uri, + for $permission in $permissions + let $role-name := map:get($permission,"role-name") + return validate strict { + { + {$role-name}, + for $capability in jsonbld:get-map-sequence($permission,"capabilities") + return {$capability} + } + } + ) +}; + +declare function docmodcom:convert-json-properties( + $uri as xs:string, + $map as map:map? +) as element()* +{ + if (empty($map)) then () + else + let $properties := jsonbld:get-map-sequence($map,"properties") + return + if (empty($properties)) then () + else if (not($properties instance of map:map)) + then error((),"RESTAPI-INVALIDCONTENT",("properties not an object. uri: "||$uri)) + else ( + let $system-props := map:get($properties,"$ml.prop") + return + if (empty($system-props)) then () + else ( + for $system-name in map:keys($system-props) + (: TODO: determine other system properties to filter out :) + where $system-name ne "last-modified" + return element {concat("prop:",$system-name)} { + map:get($system-props,$system-name) + }, + + map:delete($properties,"$ml.prop") + ), + + json:transform-from-json($properties, json:config("basic"))/* + ) +}; + +declare function docmodcom:convert-json-quality( + $uri as xs:string, + $map as map:map? +) as xs:integer? +{ + if (empty($map)) then () + else + let $quality := map:get($map,"quality") + return + if (empty($quality)) then () + else if ($quality instance of xs:integer) + then $quality + else if ($quality castable as xs:integer) + then xs:integer($quality) + else error((),"RESTAPI-INVALIDCONTENT",("quality not an integer. uri: "||$uri)) +}; + +declare function docmodcom:convert-json-metadata-values( + $uri as xs:string, + $map as map:map? +) as map:map +{ + if (empty($map)) then map:new() + else + let $values := jsonbld:get-map-sequence($map,"metadataValues") + return + if (empty($values)) then map:new() + else if (not($values instance of map:map)) + then error((),"RESTAPI-INVALIDCONTENT",("metadataValues not an object. uri: "||$uri)) + else $values +}; + +declare function docmodcom:convert-metadata-values( + $uri as xs:string, + $values as element(rapi:metadata-value)* +) as map:map? +{ + if (empty($values)) then () + else + let $metadata := map:map() + return ( + for $v in $values + return map:put($metadata,string($v/@key),string($v)), + + $metadata + ) +}; + +declare function docmodcom:convert-permissions( + $uri as xs:string, + $permissions as element(rapi:permission)* +) as element(sec:permission)* +{ + if (empty($permissions)) then () + else + for $permission in $permissions + let $capabilities := $permission/rapi:capability + let $role-name := $permission/rapi:role-name/string(.) + let $role-id := eput:lookup-role-ids($role-name) + where exists($role-id) + return + if (empty($role-id)) + then error((),"RESTAPI-INVALIDCONTENT",("no role id for permissions. uri: "||$uri)) + else $capabilities / + { + $role-id, + {string(.)} + } +}; + + +declare function docmodcom:make-role-map( + $permissions as element(sec:permission)* +) as map:map? +{ + if (empty($permissions)) then () + else + let $role-map := map:map() + return ( + for $permission in $permissions + let $role-id := $permission/sec:role-id/string(.) + return map:put( + $role-map, + $role-id, + (map:get($role-map,$role-id), $permission/sec:capability/string(.)) + ), + + $role-map + ) +}; + +declare function docmodcom:input-format( + $uri as xs:string?, + $content-type as xs:string?, + $format as xs:string? +) as xs:string? +{ + if (empty($uri)) then () + else + let $uri-type := eput:uri-content-type($uri) + [. ne "application/x-unknown-content-type"] + return + if (exists($uri-type)) + then docmodcom:get-uri-format($uri) + else + let $type := + if (empty($content-type)) then () + else eput:content-type-format($content-type) + return + if (exists($type)) + then $type + else $format +}; + +(: used when getting request body :) +declare function docmodcom:get-content-format( + $headers as map:map, + $params as map:map +) as xs:string? +{ + let $content-type := head(map:get($headers,"content-type")) + return + if (starts-with($content-type,"multipart/")) + then "binary" + else + let $uri := map:get($params,"uri") + let $uri-type := eput:uri-content-type($uri) + [. ne "application/x-unknown-content-type"] + let $header-format := + if (exists($uri-type)) + then docmodcom:get-uri-format($uri) + else if (empty($content-type) or $content-type eq "*/*") then () + else docmodcom:get-type-format(dbut:tokenize-header($content-type)) + return + if (exists($header-format)) + then $header-format + else map:get($params,"format") +}; + +declare function docmodcom:get-type-format( + $types as xs:string*, + $uri as xs:string? +) as xs:string? +{ + let $type-format := docmodcom:get-type-format($types) + return + if (exists($type-format)) + then $type-format + else docmodcom:get-uri-format($uri) +}; + +declare function docmodcom:get-type-format( + $types as xs:string* +) as xs:string? +{ + if (empty($types)) then () + else + let $format := eput:get-outbound-type-format(head($types)) + return + if (exists($format)) + then $format + else docmodcom:get-type-format(tail($types)) +}; + +declare function docmodcom:get-uri-format( + $uri as xs:string? +) as xs:string? +{ + if (empty($uri)) then () + else xdmp:uri-format($uri) +}; + +declare function docmodcom:get-metadata-input-type( + $headers as map:map, + $params as map:map, + $uri as xs:string, + $default as xs:string? +) as xs:string? +{ + let $types := dbut:tokenize-header(map:get($headers,"content-type")) + let $match-types := $types[. = ("application/xml","text/xml","application/json","text/json")] + return + if (exists($match-types)) + then head($match-types) + else + let $format := map:get($params,"format") + return + if (exists($format)) then + if ($format = ("json","xml")) + then concat("application/",$format) + else error((),"REST-INVALIDPARAM",concat( + "metadata must be JSON or XML. Received format: ",$format," for ",$uri + )) + (: test types after format because types might be defaulted by tools :) + else if (exists($types)) + then error((),"RESTAPI-INVALIDMIMETYPE",concat( + "metadata must match application/json or application/xml. Received mimetype: ", + string-join($types,", "), + " for ", $uri + )) + else if (exists($default)) + then $default + else "application/xml" +}; + +declare function docmodcom:get-metadata-output-type( + $headers as map:map, + $params as map:map, + $uri as xs:string, + $default as xs:string? +) as xs:string? +{ + let $format := map:get($params,"format") + return + if (exists($format)) then + if ($format = ("json","xml")) + then concat("application/",$format) + else error((),"REST-INVALIDPARAM",concat( + "metadata must be JSON or XML. Received format: ",$format," for ",$uri + )) + else + let $types := eput:get-accept-types($headers) + let $match-types := $types[. = ("application/xml","text/xml","application/json","text/json")] + return + if (exists($types)) then + if (exists($match-types)) + then head($match-types) + else error((),"RESTAPI-INVALIDMIMETYPE",concat( + "metadata must match application/json or application/xml. Received mimetype: ", + string-join($types,", "), + " for ", $uri + )) + else if (exists($default)) + then $default + else "application/xml" +}; + +declare function docmodcom:get-default-transform( +) as xs:string? +{ + let $is-writer := (xdmp:get-current-roles() = xdmp:role("rest-writer")) + let $is-transformed := + if (not($is-writer)) then true() + else + let $transformed := + map:get(eput:get-properties-map(),"document-transform-all") + return + if (empty($transformed) or not($transformed instance of xs:boolean)) + then true() + else $transformed + return + if (not($is-transformed)) then () + else map:get(eput:get-properties-map(),"document-transform-out")[not(. eq "")] +}; + +declare function docmodcom:check-metadata-provided( + $uri as xs:string, + $specified-categories as xs:string*, + $provided-categories as xs:string* +) as xs:boolean +{ + if (empty($specified-categories) and empty($provided-categories)) + then false() + else if ($specified-categories = "metadata") + then exists($provided-categories) + else if (exists($specified-categories[not(. = $provided-categories)])) + then error((),"REST-INVALIDPARAM", + "metadata specified but not provided: "|| + string-join($specified-categories[not(. = $provided-categories)],", ")|| + " for uri: "||$uri + ) + else if (exists($provided-categories[not(. = $specified-categories)])) + then error((),"REST-INVALIDPARAM", + "metadata provided but not specified: "|| + string-join($provided-categories[not(. = $specified-categories)],", ")|| + " for uri: "||$uri + ) + else true() +}; + +declare function docmodcom:get-update-policy( +) as xs:string? +{ + let $prop-map := eput:get-properties-map() + let $update-policy := map:get($prop-map,"update-policy") + return + if (exists($update-policy)) + then $update-policy + else + let $content-versions := map:get($prop-map,"content-versions") + return + if (empty($content-versions)) then () + else + switch($content-versions) + case "required" return "version-required" + case "optional" return "version-optional" + case "none" return "merge-metadata" + default return error((),"RESTAPI-INTERNALERROR", concat( + "unknown value of content-versions enumeration: ", + $content-versions + )) +}; + +declare function docmodcom:get-etag( + $headers as map:map, + $hname as xs:string, + $uri as xs:string +) as xs:integer? +{ + let $etag-raw := map:get($headers,$hname) + let $etag := + if (empty($etag-raw) or $etag-raw eq "") then () + else translate($etag-raw, '"', '') + return + if (empty($etag) or $etag eq "") then () + else if ($etag castable as xs:integer) + then xs:integer($etag) + else error((),"REST-INVALIDPARAM", + $hname||"header is not an integer: "||$etag-raw|| + " for uri: "||$uri + ) +}; + +declare function docmodcom:get-multipart-boundary( + $mime-types as xs:string* +) as xs:string? +{ + if (empty($mime-types)) + then error((),"RESTAPI-INVALIDMIMETYPE",( + "multipart request must have multipart/mixed instead of empty mime type", + () + )) + else + let $multipart-types := $mime-types[starts-with(.,"multipart/mixed")] + let $boundaries := $multipart-types!substring-after(.,"boundary=")[. ne ""] + return + if (empty($multipart-types)) + then error((),"RESTAPI-INVALIDMIMETYPE",( + "multipart request must have multipart/mixed mime type instead of: ", + string-join($mime-types,", "), + () + )) + else if (exists($boundaries)) + then replace(head($boundaries), '^\s*"([^"]+)"\s*$', "$1") + else concat("ML_BOUNDARY_", string(xdmp:random())) +}; + +declare function docmodcom:bulk-read-documents( + $params as map:map, + $boundary as xs:string, + $categories as xs:string*, + $metadata-format as xs:string?, + $uris as xs:string+ +) as document-node()? +{ + let $is-content := (empty($categories) or $categories = "content") + let $docs := + if (not($is-content)) then () + else doc($uris) + let $docs-uris := + if ($is-content) then () + else $uris + return docmodcom:bulk-read-documents( + $params,$boundary,$categories,$metadata-format,$docs-uris,$docs,(),() + ) +}; + +declare function docmodcom:bulk-read-documents( + $params as map:map, + $boundary as xs:string, + $categories as xs:string*, + $metadata-format as xs:string?, + $uris as xs:string*, + $docs as document-node()*, + $first-headers as element(http:headers)?, + $first-body as document-node()? +) as document-node()? +{ + if (exists($first-headers) eq exists($first-body)) then () + else error((),"RESTAPI-INTERNALERROR", concat("existence mismatch between ", + exists($first-headers)," first-headers and ",exists($first-body)," first-body")), + + let $doc-array := json:array() + let $headers := docmodcom:make-collection-headers( + $params,$categories,$metadata-format,$uris,$docs,$doc-array + ) + return docmodcom:bulk-read-documents( + $boundary, + ($first-headers, $headers), + ($first-body, json:array-values($doc-array)) + ) +}; + +declare function docmodcom:bulk-read-documents( + $boundary as xs:string, + $headers as element(http:headers)*, + $bodies as document-node()* +) as document-node()? +{ + let $bodies := + if (empty($headers) and empty($bodies)) + then () + else $bodies + return + document { + xdmp:multipart-encode( + $boundary, + { + for $header in $headers + return {$header} + }, + $bodies + ) + } +}; + +declare private function docmodcom:make-collection-headers( + $params as map:map, + $categories as xs:string*, + $metadata-format as xs:string?, + $uris as xs:string*, + $docs as document-node()*, + $doc-array as json:array +) as element(http:headers)* +{ + if (empty($uris) and empty($docs)) then () + else ( + if ($is-untraced or docmodcom:check-untraced()) then () + else lid:log( + $docmodcom:trace-id,"make-collection-headers", + map:entry("params", $params)=>map:with("categories", $categories) + =>map:with("metadata-format", $metadata-format)=>map:with("uris", $uris) + =>map:with("doc-count", count($docs)) + ), + + let $is-content := ($categories = "content") + let $meta-cat := + if ($is-content) + then $categories[. ne "content"] + else $categories + let $is-meta := exists($meta-cat) + let $meta-format := + if (not($is-meta)) then () + else head(($metadata-format,"xml")) + let $meta-type := + if (not($is-meta)) then () + else application/{$meta-format} + let $meta-header := + if (not($is-meta)) then () + else concat( + "category=",string-join($meta-cat,"; category="),"; format=",$meta-format + ) + let $is-meta-xml := + if (not($is-meta)) then () + else ($meta-format eq "xml") + let $doc-items := + if (not($is-content) or exists($docs)) + then $docs + else doc($uris) + let $uri-items := + if (exists($uris) and (not($is-content) or exists($docs))) + then $uris + else + (: $uris order does not affect doc() sequence :) + for $doc in $docs + return document-uri($doc) + let $trans-name := + if (empty($doc-items)) then () + else map:get($params,"transform") + let $trans-items := + if (empty($trans-name)) then () + else tformod:apply-transform-all( + $trans-name, + tformod:extract-transform-params($params), + for $doc at $i in $doc-items + return eput:make-request(subsequence($uri-items,$i,1), $doc) + ) + for $doc-uri at $i in $uri-items + let $timestamp := + if (not($is-content)) then () + else docmodcom:get-timestamp($doc-uri) + let $trans-output := + if (empty($trans-items)) then () + else subsequence($trans-items,$i,1) + let $trans-ctxt := + if (empty($trans-output)) then () + else map:get($trans-output,"context") + let $content-doc := + if (empty($doc-items)) then () + else if (exists($trans-output)) + then map:get($trans-output,"result") + else subsequence($doc-items,$i,1) + let $content-uri := + if (empty($trans-ctxt)) + then $doc-uri + else head((map:get($trans-ctxt,"uri"),$doc-uri)) + let $content-format := + if (not($is-content)) then () + else if (exists($content-doc)) + then eput:get-document-format($content-doc) + else docmodcom:get-uri-format($content-uri) + let $content-type := + if (not($is-content)) then () + else + let $trans-type := + if (empty($trans-ctxt)) then () + else map:get($trans-ctxt,"output-type") + return + if (exists($trans-type)) + then $trans-type + else + let $uri-type := eput:uri-content-type($content-uri) + return + if (exists($uri-type) and $uri-type ne "application/x-unknown-content-type") + then $uri-type + else eput:get-format-type($content-format) + return ( + if (empty($meta-type) or (not($is-content) and not(doc-available($doc-uri)))) + then () + else ( + json:array-push($doc-array, document { + if ($is-meta-xml) + then docmodcom:read-metadata-xml($doc-uri,$meta-cat) + else docmodcom:read-metadata-json($doc-uri,$meta-cat) + }), + + (: Filename must be double quoted and double quotes must be escaped: + http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html and + http://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.1 :) + + {$meta-type} + attachment; filename="{ + docmodcom:escape-quoted($content-uri) + }"; {$meta-header + } + + ), + + if (not($is-content)) then () + else ( + json:array-push($doc-array, + if (exists($content-doc)) + then $content-doc + else document {()} + ), + + {$content-type} + attachment; filename="{ + docmodcom:escape-quoted($content-uri) + }"; category=content; format={$content-format}{ + if (empty($timestamp)) then () + else concat("; versionId=",string($timestamp)) + } + + ) + ) + ) +}; + +(: + collective metadata functions + :) +declare function docmodcom:read-metadata-xml( + $uri as xs:string, + $categories as xs:string* +) as element(rapi:metadata)? +{ + if (empty($categories)) then () + else + { + attribute xsi:schemaLocation {"http://marklogic.com/rest-api restapi.xsd"}, + if (not($categories = ("collections","metadata"))) then () + else + { + docmodcom:read-collections($uri) ! {.} + }, + if (not($categories = ("permissions","metadata"))) then () + else + { + let $permissions := docmodcom:read-permissions($uri) + let $role-map := docmodcom:make-role-map($permissions) + let $role-ids := + if (empty($role-map)) then () + else map:keys($role-map)[. ne ""] + let $role-names := + for $role-id in $role-ids + return xdmp:role-name(xs:unsignedLong($role-id)) + for $role-id at $i in $role-ids + return + { + {subsequence($role-names,$i,1)}, + map:get($role-map,$role-id) ! {.} + } + }, + if (not($categories = ("properties","metadata"))) then () + else + let $properties := docmodcom:read-properties($uri) + return + if (exists($properties)) + then $properties + else , + if (not($categories = ("quality","metadata"))) then () + else + { + head((docmodcom:read-quality($uri), 0)) + }, + if (not($categories = ("metadata-values","metadata"))) then () + else { + let $values := xdmp:document-get-metadata($uri) + return + if (empty($values)) then () + else + for $key in map:keys($values) + return {map:get($values,$key)} + } + } +}; + +declare function docmodcom:read-metadata-json( + $uri as xs:string, + $categories as xs:string* +) as xs:string* +{ + if (empty($categories)) then () + else + jsonbld:object(( + if (not($categories = ("collections","metadata"))) then () + else ("collections", jsonbld:array(jsonbld:strings(docmodcom:read-collections($uri)))), + if (not($categories = ("permissions","metadata"))) then () + else ( + "permissions", + jsonbld:array( + let $permissions := docmodcom:read-permissions($uri) + let $role-map := docmodcom:make-role-map($permissions) + let $role-ids := + if (empty($role-map)) then () + else map:keys($role-map)[. ne ""] + let $role-names := + for $role-id in $role-ids + return xdmp:role-name(xs:unsignedLong($role-id)) + for $role-id at $i in $role-ids + return jsonbld:object(( + "role-name", jsonbld:strings(subsequence($role-names,$i,1)), + "capabilities", jsonbld:array(jsonbld:strings(map:get($role-map,$role-id))) + )) + ) + ), + if (not($categories = ("properties","metadata"))) then () + else ( + "properties", + + (: Assumptions: + : * basic props occur only with system props + : * basic props convert using the basic transform + : * system props contain only text and do not repeat + :) + let $properties := docmodcom:read-properties($uri) + let $system-props := $properties/prop:* + let $system-pair := + if (empty($system-props)) then () + else ( + jsonbld:key("$ml.prop"), + jsonbld:object( + for $system-prop in $system-props + return ( + jsonbld:key(local-name($system-prop)), + jsonbld:value(data($system-prop)) + ) + ) + ) + let $basic-props := $properties/json-basic:* + let $other-props := + if (exists($basic-props)) then () + else $properties/* except $system-props + let $other-map := + if (empty($other-props)) then () + else + let $map := map:map() + return ( + for $other-prop in $other-props + let $other-name := local-name($other-prop) + let $other-value := + if (exists($other-prop/*)) + then $other-prop/* + else data($other-prop) + return map:put( + $map, + $other-name, + (map:get($map,$other-name), $other-value) + ), + + $map + ) + let $full-cfg := + if (empty($other-map)) then () + else json:config("full") + return + if (exists($basic-props)) then + let $object := json:transform-to-json-string( + { + $basic-props + }, + json:config("basic") + ) + return + if (empty($system-pair)) + then $object + else concat( + '{', + (: get the keys from the object :) + substring($object,2,string-length($object)-2), ',', + + string-join($system-pair,':'), + '}' + ) + else jsonbld:object(( + if (empty($other-map)) then () + else + for $other-name in map:keys($other-map) + let $other-values := + for $other-value in map:get($other-map,$other-name) + return + if ($other-value instance of element()) + then json:transform-to-json-string($other-value,$full-cfg) + else jsonbld:value($other-value) + return ( + jsonbld:key($other-name), + + if (count($other-values) gt 1 or $other-values instance of element()) + then jsonbld:array($other-values) + else $other-values + ), + + $system-pair + )) + ), + if (not($categories = ("quality","metadata"))) then () + else ("quality", head((docmodcom:read-quality($uri), 0))), + if (not($categories = ("metadata-values", "metadata"))) then () + else ("metadataValues", + jsonbld:object( + let $values := xdmp:document-get-metadata($uri) + return + if (empty($values)) then () + else + for $key in map:keys($values) + return ($key,jsonbld:value(map:get($values,$key))) )) + + )) +}; + +declare function docmodcom:read-collections( + $uri as xs:string +) as xs:string* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or docmodcom:check-untraced()) then () + else lid:log($docmodcom:trace-id,"read-collections",map:entry("uri",$uri)), + + xdmp:document-get-collections($uri) +}; + +declare function docmodcom:read-permissions( + $uri as xs:string +) as element(sec:permission)* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or docmodcom:check-untraced()) then () + else lid:log($docmodcom:trace-id,"read-permissions",map:entry("uri",$uri)), + + xdmp:document-get-permissions($uri) +}; + +declare function docmodcom:read-properties( + $uri as xs:string +) as element(prop:properties)? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or docmodcom:check-untraced()) then () + else lid:log($docmodcom:trace-id,"read-properties",map:entry("uri",$uri)), + + xdmp:document-properties($uri)/* +}; + +declare function docmodcom:read-quality( + $uri as xs:string +) as xs:integer? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or docmodcom:check-untraced()) then () + else lid:log($docmodcom:trace-id,"read-quality",map:entry("uri",$uri)), + + xdmp:document-get-quality($uri) +}; + +declare function docmodcom:get-timestamp( + $uri as xs:string +) as xs:integer? +{ + if (docmodcom:get-update-policy() = ("merge-metadata","overwrite-metadata")) + then () + else ( + if ($is-untraced or docmodcom:check-untraced()) then () + else lid:log($docmodcom:trace-id,"get-timestamp",map:entry("uri",$uri)), + + xdmp:document-timestamp($uri) + ) +}; + +declare function docmodcom:escape-quoted( + $uri as xs:string +) as xs:string +{ + replace(replace($uri, '\\', '\\\\'), '"', '\\"') +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-query-get.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-query-get.xqy new file mode 100644 index 0000000000..cd412b394e --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-query-get.xqy @@ -0,0 +1,118 @@ +xquery version "1.0-ml"; + +(: Copyright 2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace docmodqryget = "http://marklogic.com/rest-api/models/document-model-query-get"; + +import module namespace docmodcom = "http://marklogic.com/rest-api/models/document-model-common" + at "../models/document-model-common.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace tformod = "http://marklogic.com/rest-api/models/transform-model" + at "../models/transform-model.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $docmodqryget:trace-id := "restapi.documents.query"; + +declare private variable $is-untraced := (); + +declare function docmodqryget:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($docmodqryget:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +declare function docmodqryget:get( + $headers as map:map, + $params as map:map +) as item()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + let $uri := map:get($params,"uri") + let $doc := doc($uri) + let $declared-format := + if (empty($doc)) + then error((),"RESTAPI-NODOCUMENT",("content",$uri)) + else eput:get-document-format($doc) + let $accept-types := dbut:tokenize-header(map:get($headers,"accept")) + let $uri-type := eput:uri-content-type($uri) + let $declared-type := + if ($uri-type ne "application/x-unknown-content-type") + then $uri-type + else eput:get-format-type($declared-format) + let $default-transform := docmodcom:get-default-transform() + let $trans-output := + if (empty($doc) or empty($default-transform)) then () + else tformod:apply-transform( + $default-transform, + eput:make-context($uri,$declared-type,$accept-types), + tformod:extract-transform-params($params), + $doc + ) + let $trans-ctxt := + if (empty($trans-output)) then () + else map:get($trans-output,"context") + let $response-doc := + if (empty($trans-output)) + then $doc + else map:get($trans-output,"result") + let $response-format := + if (empty($trans-output)) + then $declared-format + else eput:get-document-format($response-doc) + let $response-type := head(( + if (empty($trans-ctxt)) then () + else map:get($trans-ctxt,"output-type"), + + if ($declared-type eq "application/x-unknown-content-type") + then $accept-types + else $declared-type + )) + let $version := + if (docmodcom:get-update-policy() = ("merge-metadata","overwrite-metadata")) + then () + else xdmp:document-timestamp($uri) + let $timestamp := xdmp:request-timestamp() + return ( + if ($is-untraced or docmodqryget:check-untraced()) then () + else lid:log( + $docmodqryget:trace-id,"get", + map:entry("uri",$uri)=>map:with("response-format",$response-format) + =>map:with("default-transform",$default-transform), + map:entry("doc",$response-doc) + ), + + if (empty($timestamp)) then () + else eput:add-response-header("ML-Effective-Timestamp",string($timestamp)), + + if (empty($response-format)) then () + else eput:add-response-header("vnd.marklogic.document-format",$response-format), + + if (empty($response-type)) then () + else if (exists($response-format) and not($response-format eq "binary")) + then xdmp:set-response-content-type(concat($response-type,"; charset=utf-8")) + else xdmp:set-response-content-type($response-type), + + if (empty($version)) then () + else eput:add-response-header("ETag", concat('"',string($version),'"')), + + if (not(map:contains($params,"txid"))) then () + else eput:add-host-cookie(xdmp:host()), + + $response-doc + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-query-head.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-query-head.xqy new file mode 100644 index 0000000000..319b9e82fe --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-query-head.xqy @@ -0,0 +1,107 @@ +xquery version "1.0-ml"; + +(: Copyright 2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace docmodqryhead = "http://marklogic.com/rest-api/models/document-model-query-head"; + +import module namespace docmodcom = "http://marklogic.com/rest-api/models/document-model-common" + at "../models/document-model-common.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $docmodqryhead:trace-id := "restapi.documents.query"; + +declare private variable $is-untraced := (); + +declare function docmodqryhead:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($docmodqryhead:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +declare function docmodqryhead:head( + $headers as map:map, + $params as map:map +) as item()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + (: Note: This implementation priorizes speed for the common case over completeness + and accuracy for edge cases. In particular, this implementation doesn't + read the document except to calculate the length of a binary and + doesn't apply the default transform to get the output format, type, or length. :) + let $uri := map:get($params,"uri") + let $uri-format := xdmp:uri-format($uri) + let $accept-type := head(dbut:tokenize-header(map:get($headers,"accept"))) + let $doc := + if ($uri-format eq "binary") + then doc($uri) + else () + let $response-format := + if (exists($doc)) + then eput:get-document-format($doc) + else $uri-format + let $uri-type := + if (exists($accept-type) or empty($uri-format)) then () + else eput:uri-content-type($uri) + let $response-type := + if (exists($accept-type)) + then $accept-type + else if ($uri-type ne "application/x-unknown-content-type") + then $uri-type + else eput:get-format-type($response-format) + let $skip-etag := (docmodcom:get-update-policy() = ("merge-metadata","overwrite-metadata")) + let $version := + if ($skip-etag) then () + else xdmp:document-timestamp($uri) + let $is-available := + if (exists($doc) or exists($version)) + then true() + else if ($response-format eq "binary") + then false() + else doc-available($uri) + let $timestamp := + if (not($is-available)) + then error((),"RESTAPI-NODOCUMENT",("content",$uri)) + else xdmp:request-timestamp() + return ( + if ($is-untraced or docmodqryhead:check-untraced()) then () + else lid:log( + $docmodqryhead:trace-id,"head", + map:entry("uri",$uri)=>map:with("response-format",$response-format) + ), + + if (empty($timestamp)) then () + else eput:add-response-header("ML-Effective-Timestamp",string($timestamp)), + + if (empty($response-format)) then () + else eput:add-response-header("vnd.marklogic.document-format",$response-format), + + if (empty($response-type)) then () + else if (exists($response-format) and not($response-format eq "binary")) + then xdmp:set-response-content-type(concat($response-type,"; charset=utf-8")) + else xdmp:set-response-content-type($response-type), + + if (not($response-format eq "binary")) then () + else eput:add-response-header("Content-Length", string(xdmp:binary-size($doc/binary()))), + + if (empty($version)) then () + else eput:add-response-header("ETag", concat('"',string($version),'"')), + + if (not(map:contains($params,"txid"))) then () + else eput:add-host-cookie(xdmp:host()) + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-query.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-query.xqy new file mode 100644 index 0000000000..b4ff383820 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-query.xqy @@ -0,0 +1,528 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace docmodqry = "http://marklogic.com/rest-api/models/document-model-query"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +import module namespace json="http://marklogic.com/xdmp/json" + at "/MarkLogic/json/json.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace transmod = "http://marklogic.com/rest-api/models/transaction-model" + at "../models/transaction-model.xqy"; + +import module namespace tformod = "http://marklogic.com/rest-api/models/transform-model" + at "../models/transform-model.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace docmodcom = "http://marklogic.com/rest-api/models/document-model-common" + at "../models/document-model-common.xqy"; + +import schema namespace rapi = "http://marklogic.com/rest-api" + at "restapi.xsd"; + +declare namespace http = "xdmp:http"; +declare namespace multi = "xdmp:multipart"; +declare namespace prop = "http://marklogic.com/xdmp/property"; +declare namespace sec = "http://marklogic.com/xdmp/security"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $docmodqry:CONTENT_RETRIEVED := "CONTENT_RETRIEVED"; +declare variable $docmodqry:RANGE_RETRIEVED := "RANGE_RETRIEVED"; +declare variable $docmodqry:CONTENT_UNCHANGED := "CONTENT_UNCHANGED"; +declare variable $docmodqry:METADATA_RETRIEVED := "METADATA_RETRIEVED"; + +declare variable $docmodqry:trace-id := "restapi.documents.query"; + +declare private variable $is-untraced := (); + +declare function docmodqry:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($docmodqry:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +(: + high-level request functions + :) +declare function docmodqry:get( + $headers as map:map, + $params as map:map, + $env as map:map? +) as item()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + let $uris := map:get($params,"uri") + let $categories := docmodcom:select-category($params) + let $is-content := ($categories = "content") + let $_ := eput:response-add-host-cookie($headers, $params, $env) + return + (: many documents or not a combination of metadata and content and multipart :) + if (count($uris) gt 1 or ( + not($is-content and count($categories) gt 1) and + starts-with(map:get($headers,"accept"), "multipart/mixed"))) + then docmodqry:get-bulk-documents($headers,$params,$uris,$categories,true(),$env) + else if ($is-content) +(: TODO: pass in $uris and check for any callers :) + then docmodqry:get-conditional-content($headers,$params,$categories,true(),$env) + else docmodqry:get-metadata($headers,$params,$categories,true(), + if (empty($env)) then () + else map:get($env,"responder")) +}; + +declare function docmodqry:get-metadata( + $headers as map:map, + $params as map:map, + $categories as xs:string+, + $with-read as xs:boolean, + $responder as function(*)? +) as item()* +{ + let $uri := map:get($params,"uri") + return + if (not(doc-available($uri))) + (: modify if necessary to support naked properties :) + then error((),"RESTAPI-NODOCUMENT",(string-join($categories,", "),$uri)) + else docmodqry:produce-metadata( + $headers,$params,$categories,$with-read,$responder,$uri, + docmodcom:get-metadata-output-type($headers,$params,$uri,()), + false() + ) +}; + +declare function docmodqry:produce-metadata( + $headers as map:map, + $params as map:map, + $categories as xs:string+, + $with-read as xs:boolean, + $responder as function(*)?, + $uri as xs:string, + $response-type as xs:string?, + $as-document as xs:boolean +) as item()* +{ + if ($response-type = ("application/xml","text/xml")) then ( + if (empty($responder)) then () + else $responder($docmodqry:METADATA_RETRIEVED,$uri,"xml",$response-type,"UTF-8",(),()), + + if (not($with-read)) then () + else if (not($as-document)) + then docmodcom:read-metadata-xml($uri,$categories) + else document{docmodcom:read-metadata-xml($uri,$categories)} + ) + else if ($response-type = ("application/json","text/json")) then ( + if (empty($responder)) then () + else $responder($docmodqry:METADATA_RETRIEVED,$uri,"json",$response-type,"UTF-8",(),()), + + if (not($with-read)) then () + else if (not($as-document)) + then docmodcom:read-metadata-json($uri,$categories) + else document{text{docmodcom:read-metadata-json($uri,$categories)}} + ) + else error((),"RESTAPI-INVALIDMIMETYPE",( + "mime type for metadata must be application/json or application/xml",$response-type,$uri + )) +}; + +declare function docmodqry:get-conditional-content( + $headers as map:map, + $params as map:map, + $categories as xs:string+, + $with-read as xs:boolean, + $env as map:map? +) as item()* +{ + let $uri := map:get($params,"uri") + let $timestamp := docmodcom:get-timestamp($uri) + let $if-none-match := + if (empty($timestamp)) then () + else docmodcom:get-etag($headers,"if-none-match",$uri) + return + if (exists($if-none-match) and $if-none-match eq $timestamp) + then + let $responder := + if (empty($env)) then () + else map:get($env,"responder") + return + if (empty($responder)) then () + else $responder($docmodqry:CONTENT_UNCHANGED,$uri,(),(),(),$timestamp,()) + else docmodqry:get-content($headers,$params,$uri,$categories,$with-read,$timestamp,$env) +}; + +declare function docmodqry:get-content( + $headers as map:map, + $params as map:map, + $uri as xs:string, + $categories as xs:string+, + $with-read as xs:boolean, + $timestamp as xs:integer?, + $env as map:map? +) as item()* +{ + let $is-multipart := count($categories) gt 1 + let $uri-format := docmodcom:get-uri-format($uri) + let $uri-type := eput:uri-content-type($uri) + let $known-uri-type := ($uri-type ne "application/x-unknown-content-type") + let $trans-name := map:get($params,"transform") + let $trans-default := docmodcom:get-default-transform() + let $has-transform := (exists($trans-name) or exists($trans-default)) + let $range-header := + let $if-range := + if (empty($timestamp)) then () + else docmodcom:get-etag($headers,"if-range",$uri) + return + if (exists($if-range) and not($if-range eq $timestamp)) then () + else map:get($headers,"range") + let $content := + if ($known-uri-type and empty($range-header) and not($has-transform) and + ($with-read or $uri-format ne "binary")) then () + else docmodqry:read-content($uri) + let $actual-format := + if (empty($content)) then () + else eput:get-document-format($content) + let $declared-format := + if ($known-uri-type) + then $uri-format + else $actual-format + let $declared-type := + if ($known-uri-type) + then $uri-type + else eput:get-format-type($actual-format) + let $overridable-type := ($declared-type eq "application/x-unknown-content-type") + let $accept-param := map:get($headers,"accept") + let $accept-types := + if (not($is-multipart) and ($has-transform or $overridable-type)) + then dbut:tokenize-header($accept-param) + else () + let $boundary := + if (not($is-multipart)) then () + else docmodcom:get-multipart-boundary($accept-param) + let $request-charset := + let $accept-charsets := + if (empty($accept-param)) then () + else dbut:tokenize-header(map:get($headers,"accept-charset")) + return + if (empty($accept-charsets)) then () + else subsequence($accept-charsets,1,1) + let $param-format := + if (not($is-multipart)) then () + else map:get($params,"format") + let $metadata-format := + if (not($is-multipart)) then () + else if (exists($param-format)) + then $param-format + else if ($declared-format = ("json", "xml")) + then $declared-format + else "xml" + let $metadata-type := + if (not($is-multipart)) then () + else eput:get-format-type($metadata-format) + let $binary-length := + if (empty($range-header)) then () + else if (not($actual-format = "binary")) + then error((),"REST-INVALIDPARAM", + "range supported only for binary content. Received format: " || + $actual-format || " for uri " || $uri + ) + else xdmp:binary-size($content/binary()) + let $range-list := + if (empty($binary-length)) then () + else + let $list := eput:parse-byte-range( + substring-after($range-header,"bytes="), + $binary-length - 1, + $uri + ) + let $list-count := count($list) + return + if ($list-count eq 2) + then $list + else if ($list-count gt 2) + then error((),"REST-INVALIDPARAM", + "byte range "||$range-header||" with more than one range for " || $uri + ) + else error((),"RESTAPI-NORANGEMATCH", + "byte range "||$range-header||" not matched for binary " || $uri + ) + let $start-range := + if (empty($range-list)) then () + else subsequence($range-list,1,1) + let $end-range := + if (empty($range-list)) then () + else subsequence($range-list,2,1) + let $length-responder := + if ($with-read or not($actual-format = "binary") or empty($env) or $has-transform) + then () + else map:get($env,"length-responder") + let $response := + if (not($with-read) and + (empty($length-responder) or (exists($start-range) and exists($end-range)))) + then docmodqry:check-document-exists($uri) + else docmodqry:produce-content($uri,$start-range,$end-range,$content) + let $context := + if (not($has-transform)) then () + else eput:make-context($uri,$declared-type,$accept-types) + let $trans-params := + if (not($has-transform)) then () + else tformod:extract-transform-params($params) + let $trans-output := + if (empty($response) or not($has-transform)) then () + else if (exists($trans-name) and exists($trans-default)) then + let $default-output := tformod:apply-transform( + $trans-default,$context,$trans-params,$response + ) + let $default-ctxt := map:get($default-output,"context") + let $default-type := map:get($default-ctxt,"output-type") + return ( + if (exists($default-type)) + then map:put($default-ctxt, "input-type", $default-type) + else ( + map:put($default-ctxt, "input-type", $declared-type), + map:put($default-ctxt, "output-type", $declared-type) + ), + + tformod:apply-transform( + $trans-name,$default-ctxt,$trans-params,map:get($default-output,"result") + ) + ) + else tformod:apply-transform( + ($trans-name,$trans-default), $context, $trans-params, $response + ) + let $trans-ctxt := + if (empty($trans-output)) then () + else map:get($trans-output,"context") + let $output := + if (empty($trans-output)) + then $response + else map:get($trans-output,"result") + let $output-uri := + if (empty($trans-ctxt)) + then $uri + else head((map:get($trans-ctxt,"uri"),$uri)) + let $output-type := + if (empty($trans-ctxt)) then () + else map:get($trans-ctxt,"output-type") + let $response-format := + if (empty($trans-ctxt)) + then $declared-format + else + let $transform-format := eput:get-document-format($output) + return + if (exists($transform-format)) + then $transform-format + else head((docmodcom:get-type-format($output-type),$declared-format)) + let $response-type := + if (exists($output-type)) + then $output-type + else if ($overridable-type and exists($accept-types)) + then head($accept-types) + else $declared-type + let $responder := + if (empty($env)) then () + else map:get($env,"responder") + return + if (empty($response-type)) + then error((),"RESTAPI-INTERNALERROR",concat("could not determine response type from ",$response-format," for ",$uri)) + else ( + if (empty($responder)) then () + else $responder( + if (exists($range-list)) + then $docmodqry:RANGE_RETRIEVED + else $docmodqry:CONTENT_RETRIEVED, + $output-uri, + $response-format, + if (empty($boundary)) + then $response-type + else concat("multipart/mixed; boundary=",$boundary), + if (empty($boundary)) + then $request-charset + else (), + $timestamp, + docmodqry:make-content-range-header($start-range,$end-range,$binary-length) + ), + if (empty($trans-name)) then () + else eput:call-header($env, "vnd.marklogic.document-transform", $trans-name), + + if (not($with-read)) then + if (empty($length-responder)) then () + else if (exists($start-range) and exists($end-range)) + then $length-responder($end-range - $start-range + 1) + else if (empty($output)) then () + else $length-responder(xdmp:binary-size($output/binary())) + else if (empty($boundary)) + then $output + else + xdmp:multipart-encode( + $boundary, + + + + {$metadata-type} + attachment; filename="{docmodcom:escape-quoted($output-uri) + }"; category={string-join(distinct-values($categories[not(. eq "content")]), "; category=") + }; format={$metadata-format + } + + + + { + {$response-type}, + attachment; filename="{docmodcom:escape-quoted($output-uri) + }"; category=content; format={$response-format}{ + if (empty($timestamp)) then () + else concat("; versionId=",string($timestamp)) + }, + if (not($actual-format = "binary") or $has-transform) then () + else + { + if (exists($start-range) and exists($end-range)) + then $end-range - $start-range + 1 + else xdmp:binary-size($output/binary()) + } + } + + , + ( + docmodqry:produce-metadata( + $headers,$params,$categories,true(),(),$uri,$metadata-type,true() + ), + if (exists($output)) + then $output + else document {()} + ) + ) + ) +}; + +declare function docmodqry:get-bulk-documents( + $headers as map:map, + $params as map:map, + $uris as xs:string+, + $categories as xs:string+, + $with-read as xs:boolean, + $env as map:map? +) as document-node()? +{ + let $boundary := docmodcom:get-multipart-boundary(map:get($headers,"accept")) + let $metadata-format := head((map:get($params,"format"), "xml")) + let $responder := + if (empty($env)) then () + else map:get($env,"responder") + let $trans-name := + if (not($categories = "content")) then () + else map:get($params,"transform") + return ( + if (empty($responder)) then () + else $responder( + $docmodqry:CONTENT_RETRIEVED, + "bulk read as multipart/mixed", + (), + concat("multipart/mixed; boundary=",$boundary), + (), + (), + () + ), + if (empty($trans-name)) then () + else eput:call-header($env, "vnd.marklogic.document-transform", $trans-name), + + if (not($with-read)) then () + else docmodcom:bulk-read-documents( + $params,$boundary,$categories,$metadata-format,$uris + ) + ) +}; + +declare function docmodqry:produce-content( + $uri as xs:string, + $start-range as xs:long?, + $end-range as xs:long?, + $content as document-node()? +) as document-node()? +{ + if (empty($content)) + then docmodqry:read-content($uri) + else if (exists($start-range)) then + document { + (: HTTP range is zero-based but xdmp:subbinary is one-based :) + xdmp:subbinary($content/binary(), $start-range + 1, $end-range - $start-range + 1) + } + else $content +}; + +declare function docmodqry:head( + $headers as map:map, + $params as map:map, + $env as map:map? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + let $uris := map:get($params,"uri") + let $categories := docmodcom:select-category($params) + let $is-content := ($categories = "content") + let $_ := eput:response-add-host-cookie($headers, $params, $env) + return + (: many documents or not a combination of metadata and content and multipart :) + if (count($uris) gt 1 or ( + not($is-content and count($categories) gt 1) and + starts-with(map:get($headers,"accept"), "multipart/mixed"))) + then docmodqry:get-bulk-documents($headers,$params,$uris,$categories,false(),$env) + else if ($is-content) + then docmodqry:get-conditional-content($headers,$params,$categories,false(),$env) + else docmodqry:get-metadata($headers,$params,$categories,false(), + if (empty($env)) then () + else map:get($env,"responder")) +}; + +(: + Low-level functions for document content and metadata + :) +declare function docmodqry:read-content( + $uri as xs:string +) as document-node() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or docmodqry:check-untraced()) then () + else lid:log($docmodqry:trace-id,"read-content",map:entry("uri",$uri)), + + let $doc := doc($uri) + return + if (exists($doc)) + then $doc + else error((),"RESTAPI-NODOCUMENT",("content",$uri)) +}; + +declare function docmodqry:check-document-exists( + $uri as xs:string +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or docmodqry:check-untraced()) then () + else lid:log($docmodqry:trace-id,"check-document-exists",map:entry("uri",$uri)), + + if (doc-available($uri)) then () + else error((),"RESTAPI-NODOCUMENT",("document",$uri)) +}; + +declare private function docmodqry:make-content-range-header( + $start-range as xs:long?, + $end-range as xs:long?, + $binary-length as xs:long? +) as xs:string? +{ + if (empty($start-range)) then () + else "bytes "||$start-range||"-"||$end-range||"/"||$binary-length +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update-delete.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update-delete.xqy new file mode 100644 index 0000000000..890f618d14 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update-delete.xqy @@ -0,0 +1,61 @@ +xquery version "1.0-ml"; + +(: Copyright 2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace docmoddel = "http://marklogic.com/rest-api/models/document-model-update-delete"; + +import module namespace cook = "http://parthcomp.com/cookies" + at "/MarkLogic/cookies.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +(: TODO: factor out dependency functions from docmodcom and docmodupd into granular libraries :) +import module namespace docmodcom = "http://marklogic.com/rest-api/models/document-model-common" + at "../models/document-model-common.xqy"; +import module namespace docmodupd = "http://marklogic.com/rest-api/models/document-model-update" + at "../models/document-model-update.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $docmoddel:trace-id := "restapi.documents.update"; + +declare private variable $is-untraced := (); + +declare function docmoddel:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($docmoddel:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +declare function docmoddel:delete( + $params as map:map +) +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if ( docmodcom:get-update-policy() eq "version-required" ) + then error((), "RESTAPI-CONTENTNOVERSION", "uri "|| string-join(map:get($params, "uri"), ",")) + else (), + + if (map:contains($params,"txid")) + then cook:add-cookie("HostId", xs:string(xdmp:host()), (),(),(),false()) + else (), + + if ($is-untraced or docmoddel:check-untraced()) then () + else lid:log( + $docmoddel:trace-id,"delete",map:entry("params",$params) + ), + + let $options := map:entry( + "ifNotExists", + if (not(map:get($params, "check") = "exists")) then "allow" else "error" + ) + for $uri in map:get($params, "uri") + for $doc-uri in ($uri, docmodupd:get-metadata-document($uri,true())) + return xdmp:document-delete($doc-uri, $options) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update-put.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update-put.xqy new file mode 100644 index 0000000000..492bae7129 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update-put.xqy @@ -0,0 +1,227 @@ +xquery version "1.0-ml"; + +(: Copyright 2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace docmodupdput = "http://marklogic.com/rest-api/models/document-model-update-put"; + +import module namespace cook = "http://parthcomp.com/cookies" + at "/MarkLogic/cookies.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +(: TODO: factor out dependency functions from docmodcom into granular libraries :) +import module namespace docmodcom = "http://marklogic.com/rest-api/models/document-model-common" + at "../models/document-model-common.xqy"; + +import module namespace strict = "http://marklogic.com/rest-api/lib/strict-util" + at "../lib/strict-util.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $docmodupdput:trace-id := "restapi.documents.update"; + +declare private variable $is-untraced := (); + +declare function docmodupdput:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($docmodupdput:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +declare function docmodupdput:forest-ids($names as xs:string*) as xs:unsignedLong* +{ + try { + for $forest-name in $names + return xdmp:forest($forest-name) + } catch ($e) { + if ($e/error:code = "XDMP-NOSUCHFOREST") + then error((), "REST-INVALIDPARAM", "No such forest: "||$e/error:data/error:datum/string(.)) + else xdmp:rethrow() + } +}; + +declare function docmodupdput:security-permissions($permissions as map:map?) as map:map* +{ + try{ + for $key in + if (empty($permissions)) then () + else map:keys($permissions) + let $id := xdmp:role($key) + for $capability in map:get($permissions,$key) + return map:entry("roleId",$id) + =>map:with("capability",$capability) + } catch ($e) { + if ($e/error:code/string(.) eq "SEC-ROLEDNE") + then error((), "REST-INVALIDPARAM", "Role "||$e/error:data/error:datum[last()]/string(.)|| " does not exist") + else xdmp:rethrow() + } +}; + +declare function docmodupdput:merge-permissions($new-permissions as map:map*, $base-permissions as map:map*) as map:map* +{ + if (empty($new-permissions)) + then $base-permissions + else if (empty($base-permissions)) + then $new-permissions + else ( + $new-permissions, + + let $new-roles := fold-left( + function($new-roles as map:map, $new-permission as map:map) { + map:with( + $new-roles, + string(map:get($new-permission, "roleId")), + true() + ) + }, + map:map(), + $new-permissions + ) + for $base-permission in $base-permissions + return + if (map:contains($new-roles, string(map:get($base-permission,"roleId")))) then () + else $base-permission + ) +}; + +declare function docmodupdput:is-uri( + $uri as xs:string? +) as xs:boolean +{ + if (empty($uri) or string-length($uri) eq 0) + then false() + else + try { + strict:is-uri($uri) + } catch($e) { + false() + } +}; + +declare function docmodupdput:write-property-values( + $uri as xs:string, + $properties as map:map, + $overwrite as xs:boolean +) as empty-sequence() +{ + if ($is-untraced or docmodupdput:check-untraced()) then () + else lid:log( + $docmodupdput:trace-id,"write-property-values",map:entry("properties",$properties) + ), + + let $elements := + for $prop-name in map:keys($properties) + return + if ($prop-name castable as xs:NCName) + then element {$prop-name} {map:get($properties,$prop-name)} + else error((),"REST-INVALIDPARAM", + "Property name must be a valid XML NCName: "||$prop-name + ) + return + if ($overwrite) + then xdmp:document-set-properties($uri,$elements) + else ( + xdmp:document-remove-properties($uri,$elements/node-name(.)), + xdmp:document-add-properties($uri,$elements) + ) +}; + +declare function docmodupdput:put($params as map:map) { + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + let $uri := map:get($params,"uri") + let $created := not(doc-available($uri)) + let $update-policy := docmodcom:get-update-policy() + let $options := map:map() + return ( + (: We only need to check if the version is required because if-match is handled elsewhere :) + if (not($created) and $update-policy = ("version-required")) + then error((), "RESTAPI-CONTENTNOVERSION", "uri "|| $uri) + else (), + + if (not($created) or docmodupdput:is-uri($uri)) then () + else error((), "REST-INVALIDPARAM", "invalid uri: "||$uri), + + xdmp:lock-for-update($uri), + + map:put($options, "uri", $uri), + + let $collections := + let $param-collections := map:get($params,"collection") + return + if (exists($param-collections)) + then $param-collections + else if ($created) + then xdmp:default-collections($uri) + else if ($update-policy eq "overwrite-metadata") + then () + else xdmp:document-get-collections($uri) + return + if (empty($collections)) then () + else map:put($options,"collections",$collections), + + let $permissions := docmodupdput:merge-permissions( + docmodupdput:security-permissions(map:get($params,"permissions")), + if ($created or $update-policy eq "overwrite-metadata") + then xdmp:default-permissions($uri,"objects") + else xdmp:document-get-permissions($uri,"objects") + ) + return + if (empty($permissions)) then () + else map:put($options,"permissions",$permissions), + + let $metadata := + let $param-metadata := map:get($params,"metadata") + return + if (exists($param-metadata)) + then $param-metadata + else if ($created or $update-policy eq "overwrite-metadata") + then () + else xdmp:document-get-metadata($uri) + return + if (empty($metadata)) then () + else map:put($options,"metadata",$metadata), + + let $quality := + let $param-quality := map:get($params,"quality") + return + if (exists($param-quality)) + then xs:integer($param-quality) + else if ($created or $update-policy eq "overwrite-metadata") + then () + else xdmp:document-get-quality($uri) + return + if (empty($quality)) then () + else map:put($options,"quality",$quality), + + let $forest-ids := docmodupdput:forest-ids(map:get($params,"forest-name")) + return + if (empty($forest-ids)) then () + else map:put($options,"forests",$forest-ids), + + if ($is-untraced or docmodupdput:check-untraced()) then () + else lid:log( + $docmodupdput:trace-id,"put",map:entry("options",$options) + ), + + xdmp:document-load("rest::",$options), + + let $properties := map:get($params,"properties") + return + if (empty($properties)) then () + else docmodupdput:write-property-values($uri,$properties,$update-policy eq "overwrite-metadata"), + + if (not(map:contains($params,"txid"))) then () + else cook:add-cookie("HostId", xs:string(xdmp:host()), (),(),(),false()), + + if ($created) then ( + xdmp:set-response-code(201,"Created"), + xdmp:add-response-header("Location","/v1/documents?uri="||$uri) + ) + else xdmp:set-response-code(204,"Content Updated") + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update.sjs new file mode 100644 index 0000000000..9804673757 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update.sjs @@ -0,0 +1,75 @@ +/* + * Copyright 2018 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +function applyOperations(isXml, libAt, calldefs) { + if (!(typeof isXml === 'boolean' || isXml instanceof xs.boolean)) { + fn.error(null, 'RESTAPI-INTERNALERROR', 'invalid isXml parameter: '+isXml); + } + if (libAt === void 0 || libAt === null) { + fn.error(null, 'RESTAPI-INTERNALERROR', 'invalid libAt parameter: '+libAt); + } + if (!Array.isArray(calldefs)) { + fn.error(null, 'RESTAPI-INTERNALERROR', + 'invalid calldefs parameter: '+xdmp.quote(calldefs)); + } + + if (calldefs.length === 0) { + return null; + } + + const errorList = []; + + const lib = require(libAt); + if (lib === void 0) { + errorList.push('could not read library: '+libAt); + } + + const replaceMap = {}; + for (let calldef of calldefs) { + const replacePath = calldef['replace-path']; + const func = lib[calldef.fname]; + if (func === void 0) { + errorList.push('no ',calldef.fname,' in library '+libAt+' for path: '+replacePath); + continue; + } + const content = calldef.content; + const nodes = calldef.nodes; + if (nodes !== void 0 && nodes !== null) { + for (let node of nodes) { + replaceMap[fn.generateId(node)] = func(node, content); + } + } else { + const contexts = calldef.contexts; + if (contexts !== void 0 && contexts !== null) { + for (let context of contexts) { + replaceMap[fn.generateId(context)] = func(null, content); + } + } else { + fn.error(null, 'RESTAPI-INTERNALERROR', 'no nodes or context for: '+replacePath); + } + } + } + + if (errorList.length > 0) { + return errorList; + } + return replaceMap; +} + +module.exports = { + applyOperations: applyOperations +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update.xqy new file mode 100644 index 0000000000..d8cf07cd68 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/document-model-update.xqy @@ -0,0 +1,4484 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace docmodupd = "http://marklogic.com/rest-api/models/document-model-update"; + +import module namespace isys-filter = "http://marklogic.com/isys-filter" + at "/MarkLogic/conversion/isys-filter.xqy"; + +import module namespace lnk = "http://marklogic.com/cpf/links" + at "/MarkLogic/cpf/links.xqy"; + +import module namespace json = "http://marklogic.com/xdmp/json" + at "/MarkLogic/json/json.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace transmod = "http://marklogic.com/rest-api/models/transaction-model" + at "../models/transaction-model.xqy"; + +import module namespace tformod = "http://marklogic.com/rest-api/models/transform-model" + at "../models/transform-model.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace json-path = "http://marklogic.com/appservices/json-path" + at "/MarkLogic/appservices/utils/json-path.xqy"; + +import module namespace replib = "http://marklogic.com/rest-api/lib/replace-lib" + at "../lib/replace-lib.xqy"; + +import schema namespace rapi = "http://marklogic.com/rest-api" + at "restapi.xsd"; + +import module namespace docmodcom = "http://marklogic.com/rest-api/models/document-model-common" + at "../models/document-model-common.xqy"; + +(: needed for patch :) +import module namespace docmodqry = "http://marklogic.com/rest-api/models/document-model-query" + at "../models/document-model-query.xqy"; + +import module namespace temporal = "http://marklogic.com/xdmp/temporal" at "/MarkLogic/temporal.xqy"; + +declare namespace prop = "http://marklogic.com/xdmp/property"; +declare namespace sec = "http://marklogic.com/xdmp/security"; +declare namespace xhtml = "http://www.w3.org/1999/xhtml"; +declare namespace protect = "temporal:document-protect"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $docmodupd:trace-id := "restapi.documents.update"; + +declare private variable $is-untraced := (); + +declare function docmodupd:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($docmodupd:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +declare variable $docmodupd:DOCUMENT_CREATED := "DOCUMENT_CREATED"; +declare variable $docmodupd:CONTENT_UPDATED := "CONTENT_UPDATED"; +declare variable $docmodupd:METADATA_UPDATED := "METADATA_UPDATED"; +declare variable $docmodupd:DOCUMENT_DELETED := "DOCUMENT_DELETED"; +declare variable $docmodupd:METADATA_DELETED := "METADATA_DELETED"; +declare variable $docmodupd:UNCHANGED_PATCH := "UNCHANGED_PATCH"; +declare variable $docmodupd:BULK_CHANGE_WRITTEN := "BULK_CHANGE_WRITTEN"; +declare variable $docmodupd:DOCUMENT_PROTECTED := "DOCUMENT_PROTECTED"; +declare variable $insert-ns := "xdmp:document-insert"; +declare variable $temporal-insert-ns := "xdmp:document-insert"; +declare variable $load-ns := "xdmp:document-load"; +declare variable $temporal-load-ns := "temporal:document-load"; + + +(: + high-level request functions + :) +declare function docmodupd:patch( + $headers as map:map, + $params as map:map, + $env as map:map +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + let $uri := map:get($params,"uri") + let $categories := docmodcom:select-category($params) + let $is-content := ($categories = "content") + let $meta-cat := + if ($is-content) + then $categories[. ne "content"] + else $categories + let $error-list := json:array() + let $patch-type := eput:get-inbound-content-type($params,$headers) + let $patch-format := substring-after($patch-type,"/") + let $patch-content := + if ($patch-format ne "json") then () + else map:map() + let $temporal-collection := map:get($params,"temporal-collection") + let $temporal-document-uri := map:get($params,"temporal-document") + let $source-document-uri := map:get($params,"source-document") + let $_ := if (empty($temporal-collection) and exists($temporal-document-uri)) + then error((),"RESTAPI-INVALIDREQ","The temporal-collection parameter must be specified with the temporal-document parameter.") + else () + let $_ := if (empty($temporal-document-uri) and exists($source-document-uri)) + then error((),"RESTAPI-INVALIDREQ","The temporal-document parameter must be specified with the source-document parameter.") + else () + let $patch-uri := docmodupd:lock-uris(if (empty($source-document-uri)) then $uri else $source-document-uri) + let $patch := + let $raw-patch := + map:get($env,"body-getter")($patch-format)/node() + let $converted-patch := + if (empty($raw-patch)) + then error((),"RESTAPI-INVALIDREQ","empty patch for uri: "||$patch-uri) + else docmodupd:convert-patch($patch-uri,$raw-patch,$patch-content,$error-list) + return + if (json:array-size($error-list) eq 0) + then $converted-patch + else error((),"RESTAPI-INVALIDREQ",concat( + "invalid patch for uri ",$patch-uri,": ", + string-join(json:array-values($error-list,true()), "; ") + )) + let $get-headers := + let $map := map:map() + return ( + map:put($map,"accept",$patch-type), + $map + ) + let $get-params := + let $map := map:map() + return ( + map:put($map, "uri", $patch-uri), + map:put($map, "format", $patch-format), + $map + ) + let $metadata-in := + if (empty($meta-cat)) then () + else + let $metadata-raw := docmodqry:produce-metadata( + $get-headers,$get-params,$categories,true(),(),$patch-uri,$patch-type,true() + ) + return + if (exists($metadata-raw/rapi:metadata)) + then $metadata-raw + else if (exists($metadata-raw/text())) + then $metadata-raw/text()/xdmp:unquote(string(.)) + else error((),"RESTAPI-INTERNALERROR","could not convert metadata") + let $content-in := + if (not($is-content)) then () + else ( + docmodupd:check-content-version($headers,$patch-uri), + + let $content-raw := docmodqry:get-conditional-content( + $get-headers,$get-params,"content",true(),() + ) + let $content-format := + typeswitch($content-raw/node()) + case object-node() return "json" + case array-node() return "json" + case element() return "xml" + default return error((),"RESTAPI-INVALIDCONTENT", + "can only apply patch to JSON or XML content: "||$patch-uri) + return + if ($content-format eq $patch-format) + then $content-raw + else error((),"RESTAPI-INVALIDCONTENT",concat( + "format mismatch for ",$patch-format," patch and ",$content-format," content: ",$patch-uri + )) + ) + let $function-structs := + let $fstructs := docmodupd:make-apply-function-structs($patch,$error-list) + return + if (json:array-size($error-list) gt 0) + then error((),"RESTAPI-INVALIDREQ",concat( + "invalid replace apply operations for uri ",$patch-uri,": ", + string-join(json:array-values($error-list,true()), ", ") + )) + else $fstructs + let $xqy-function-map := + let $xqy-functions := head($function-structs) + return + if (empty($xqy-functions) or map:count($xqy-functions) eq 0) then () + else $xqy-functions + let $sjs-apply-array := + if (empty($function-structs)) then () + else tail($function-structs) + let $metadata-deltas := + if (empty($metadata-in)) then () + else map:map() + let $metadata-out := + if (empty($metadata-in)) then () + else + let $metadata-raw := docmodupd:apply-metadata-patch( + $metadata-in,$patch-format,$patch,$patch-content, + $xqy-function-map,$sjs-apply-array,$error-list + ) + return + if (json:array-size($error-list) gt 0) + then error((),"RESTAPI-INVALIDREQ",concat( + "invalid metadata patch operations for uri ",$patch-uri,": ", + string-join(json:array-values($error-list,true()), ", ") + )) + else if (empty($metadata-raw)) then () + else + if ($metadata-raw instance of element(rapi:metadata)) + then docmodupd:modifiable-xml-metadata($metadata-raw, $metadata-deltas) + else docmodupd:modifiable-json-metadata($metadata-raw, $metadata-deltas) + let $is-content-patched := + if (empty($content-in)) then () + else ( + if (exists($temporal-collection) and exists($temporal-document-uri)) + then temporal:statement-set-document-version-uri($temporal-document-uri,$uri) + else (), + let $is-patched := docmodupd:apply-content-patch( + $temporal-collection,$content-in,$patch-format,$patch,$patch-content, + $xqy-function-map,$sjs-apply-array,$error-list + ) + return + if (json:array-size($error-list) gt 0) + then error((),"RESTAPI-INVALIDREQ",concat( + "invalid content patch operations for uri ",$patch-uri,": ", + string-join(json:array-values($error-list,true()), ", ") + )) + else $is-patched + ) + return + if (empty($metadata-out) and not($is-content-patched)) then ( + if (not(doc-available($patch-uri))) + then error((),"RESTAPI-NODOCUMENT",("document patch",$patch-uri)) + else + let $responder as function(*)? := map:get($env,"responder") + return + if (empty($responder)) then () + else $responder( + $docmodupd:UNCHANGED_PATCH,$patch-uri,(),(),(),(),(),() + ) + ) + else ( + if (empty($metadata-out)) then () + else + let $is-xml := ($patch-format eq "xml") + let $updated-categories := map:get($metadata-deltas,"updated") + let $deleted-categories := map:get($metadata-deltas,"deleted") + let $has-no-updates := empty($updated-categories) + let $has-no-deletes := empty($deleted-categories) + let $patched-params := + let $map := map:map() + return ( + map:put($map, "uri", $patch-uri), + map:put($map, "format", $patch-format), + $map + ) + return + if (exists($temporal-collection)) + then + if ($has-no-updates and $has-no-deletes) + then () + else docmodupd:patch-temporal-metadata($temporal-collection,$patch-uri,$updated-categories,$deleted-categories,$metadata-out) + else + ( + if ($has-no-updates) then () + else ( + map:put($patched-params, "category", $updated-categories), + docmodupd:put-metadata( + $headers,$patched-params,$patch-uri,$updated-categories, + $metadata-out, + () + ) + ), + + if ($has-no-deletes) then () + else docmodupd:delete-metadata($patch-uri,$deleted-categories) + ), + + let $responder as function(*)? := map:get($env,"responder") + return + if (empty($responder)) then () + else if ($is-content-patched) + then $responder( + $docmodupd:CONTENT_UPDATED,$patch-uri,(),(),(),(),(),() + ) + else $responder( + $docmodupd:METADATA_UPDATED,$patch-uri,(),(),(),(),(),() + ) + ) +}; + +declare function docmodupd:modifiable-xml-metadata( + $in as element(rapi:metadata), + $deltas as map:map? +) as element(rapi:metadata) +{ + { + let $collections := $in/rapi:collections + return + if (empty($collections)) then () + else if (empty($collections/*)) then + if (empty($deltas)) then () + else map:put($deltas,"deleted","collections") + else ( + if (empty($deltas)) then () + else map:put($deltas,"updated","collections"), + + $collections + ), + + let $permissions := $in/rapi:permissions/{ + rapi:permission/{ + rapi:role-name, + for $capability in rapi:capability + order by string($capability) + return $capability + } + } + return + if (empty($permissions)) then () + else if (empty($permissions/*)) then + if (empty($deltas)) then () + else map:put($deltas, "deleted", (map:get($deltas,"deleted"),"permissions")) + else ( + if (empty($deltas)) then () + else map:put($deltas, "updated", (map:get($deltas,"updated"),"permissions")), + + $permissions + ), + + let $properties := $in/prop:properties/{ + * except prop:last-modified + } + return + if (empty($properties)) then () + else if (empty($properties/*)) then + if (empty($deltas)) then () + else map:put($deltas, "deleted", (map:get($deltas,"deleted"),"properties")) + else ( + if (empty($deltas)) then () + else map:put($deltas, "updated", (map:get($deltas,"updated"),"properties")), + + $properties + ), + + let $quality := $in/rapi:quality + return + if (empty($quality)) then () + else ( + if (empty($deltas)) then () + else map:put($deltas, "updated", (map:get($deltas,"updated"),"quality")), + + $quality + ), + + let $values := $in/rapi:metadata-values/{ + for $value in rapi:metadata-value + return if (string-length($value/@key)>0) then {$value/text()} else () + } + return + if (empty($values)) then () + else ( + if (empty($deltas)) then () + else map:put($deltas, "updated", (map:get($deltas,"updated"),"metadata-values")), + + $values + ) + + } +}; + +declare function docmodupd:modifiable-json-metadata( + $in as json:object, + $deltas as map:map? +) as object-node() +{ + if (empty($deltas)) then () + else + let $collections := map:get($in,"collections") + return + if (empty($collections)) then () + else if (json:array-size($collections) lt 1) + then map:put($deltas,"deleted","collections") + else map:put($deltas,"updated","collections"), + + let $permissions-in := map:get($in,"permissions") + let $perm-in-size := + if (empty($permissions-in)) then () + else json:array-size($permissions-in) + return + if (empty($permissions-in)) then () + else if ($perm-in-size = 0) then + if (empty($deltas)) then () + else map:put($deltas, "deleted", + (map:get($deltas,"deleted"),"permissions")) + else + let $permissions-out := json:array() + return ( + for $permission in json:array-values($permissions-in) + let $role-name := map:get($permission, "role-name") + return json:array-push($permissions-out, $permission), + + let $perm-out-size := json:array-size($permissions-out) + return + if ($perm-out-size eq 0) then ( + if (empty($deltas)) then () + else map:put($deltas, "deleted", + (map:get($deltas,"deleted"),"permissions")), + map:delete($in,"permissions") + ) + else ( + if (empty($deltas)) then () + else map:put($deltas, "updated", + (map:get($deltas,"updated"),"permissions")), + if ($perm-in-size eq $perm-out-size) then () + else map:put($in,"permissions",$permissions-out) + ) + ), + + let $properties := map:get($in,"properties") + return + if (empty($properties)) then () + else if (map:count($properties) eq 0) then + if (empty($deltas)) then () + else map:put($deltas, "deleted", + (map:get($deltas,"deleted"),"properties")) + else if (not(map:contains($properties,"$ml.prop"))) then + if (empty($deltas)) then () + else map:put($deltas, "updated", + (map:get($deltas,"updated"),"properties")) + else ( + map:delete($properties, "$ml.prop"), + + if (map:count($properties) gt 0) then + if (empty($deltas)) then () + else map:put($deltas, "updated", + (map:get($deltas,"updated"),"properties")) + else ( + if (empty($deltas)) then () + else map:put($deltas, "deleted", + (map:get($deltas,"deleted"),"properties")), + map:delete($in,"properties") + ) + ), + + if (empty($deltas) or not(map:contains($in,"quality"))) then () + else map:put($deltas, "updated", + (map:get($deltas,"updated"),"quality")), + + if (empty($deltas) or not(map:contains($in,"metadataValues"))) then () + else map:put($deltas, "updated", + (map:get($deltas,"updated"),"metadata-values")), + + xdmp:to-json($in)/object-node() +}; + +declare function docmodupd:patch-temporal-metadata( + $temporal-collection as xs:string, + $uri as xs:string, + $updated as xs:string*, + $deleted as xs:string*, + $content as node()? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + if (empty($updated) or $content instance of element(rapi:metadata)) then + let $validated := if (exists($updated)) then validate strict {$content} else () + let $collections := + if ($updated = "collections") + then $validated/rapi:collections/rapi:collection/string(.) + else if ($deleted = "deleted") then () + else xdmp:document-get-collections($uri) + let $permissions := + if ($updated = "permissions") + then $validated/rapi:permissions/docmodcom:convert-permissions($uri,rapi:permission) + else if ($deleted = "permissions") then () + else xdmp:document-get-permissions($uri) + let $properties := + if ($updated = "properties") then $validated/prop:properties/(* except prop:*) + else () + let $quality := + if ($updated = "quality") then $validated/rapi:quality/data() + else if ($deleted = "quality") then () + else xdmp:document-get-quality($uri) + let $metadata-values := + if ($updated = "metadata-values") + then $validated/rapi:metadata-values/docmodcom:convert-metadata-values($uri,rapi:metadata-value) + else if ($deleted = "metadata-values") then () + else xdmp:document-get-metadata($uri) + let $options := docmodupd:temporal-options( + $temporal-collection,$uri,$collections,$permissions,$quality,$metadata-values + ) + return ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"patch-temporal-metadata#insert1", + map:entry("temporal-collection", $temporal-collection) + => map:with("uri",$uri)=> map:with("options",$options), + map:entry("doc",doc($uri)) + ), + + temporal:document-insert($temporal-collection,$uri,doc($uri),$options), + + if (not("properties" = ($updated,$deleted))) then () + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"patch-temporal-metadata#set-properties1", + map:entry("uri",$uri)=> map:with("properties",properties) + ), + xdmp:document-set-properties($uri,$properties) + ) + ) + else if ($content instance of object-node()) then + let $map := xdmp:from-json($content) + let $collections := + if ($updated = "collections") then docmodcom:convert-json-collection($uri,$map) + else if ($deleted = "collections") then () + else xdmp:document-get-collections($uri) + let $permissions := + if ($updated = "permissions") then docmodcom:convert-json-permissions($uri,$map) + else if ($deleted = "permissions") then () + else xdmp:document-get-permissions($uri) + let $properties := + if ($updated = "properties") then docmodcom:convert-json-properties($uri,$map) + else () + let $quality := + if ($updated = "quality") then docmodcom:convert-json-quality($uri,$map) + else if ($deleted = "quality") then () + else xdmp:document-get-quality($uri) + let $metadata-values := + if ($updated = "metadata-values") then docmodcom:convert-json-metadata-values($uri,$map) + else if ($deleted = "metadata-values") then () + else xdmp:document-get-metadata($uri) + let $options := docmodupd:temporal-options( + $temporal-collection,$uri,$collections,$permissions,$quality,$metadata-values + ) + return ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"patch-temporal-metadata#insert2", + map:entry("temporal-collection", $temporal-collection) + => map:with("uri",$uri)=> map:with("options",$options), + map:entry("doc",doc($uri)) + ), + + temporal:document-insert($temporal-collection,$uri,doc($uri),$options), + + if (not("properties" = ($updated,$deleted))) then () + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"patch-temporal-metadata#set-properties2", + map:entry("uri",$uri)=> map:with("properties",properties) + ), + + xdmp:document-set-properties($uri,$properties) + ) + ) + else error((),"REST-INVALIDPARAM","The content for the metdata is neither metadata XML or JSON data.") +}; + +declare function docmodupd:post( + $headers as map:map, + $params as map:map, + $env as map:map +) as item()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + eput:response-add-host-cookie($headers, $params, $env), + let $categories := docmodcom:select-category($params) + return + if (not($categories = "content")) + then error((),"REST-INVALIDPARAM", + "Must provide content when creating a document" + ) + else + let $uri := docmodupd:make-document-uri($params) + return ( + if (exists($uri)) then () + else error((),"REST-REQUIREDPARAM", + "missing required extension parameter" + ), + + map:put($params,"uri",$uri), + + docmodupd:put-content( + $headers,$params,$uri,$categories,docmodcom:get-update-policy(), + $env,map:get($env,"responder") + ) + ) +}; + +declare function docmodupd:post-bulk-documents( + $headers as map:map, + $params as map:map, + $env as map:map +) as item()* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + eput:response-add-host-cookie($headers, $params, $env), + let $header-getter as function(*)? := map:get($env,"header-getter") + let $body-getter as function(*)? := map:get($env,"body-getter") + return ( + if (exists($header-getter)) then () + else error((),"RESTAPI-INTERNALERROR","no function to get header"), + if (exists($body-getter)) then () + else error((),"RESTAPI-INTERNALERROR","no function to get body"), + + let $response-type := + docmodcom:get-metadata-output-type($headers,$params,"bulk POST request",()) + let $results := + docmodupd:write-bulk-documents($params,$header-getter,$body-getter) + let $responder as function(*)? := map:get($env,"responder") + return ( + if (empty($responder)) then () + else $responder( + $docmodupd:BULK_CHANGE_WRITTEN,(), + substring-after($response-type,"application/"), + $response-type,(),(),(), + let $temporal-collection := map:get($params,"temporal-collection") + return + if (empty($temporal-collection)) then () + else + let $system-timestamp := map:get($params,"system-time") + return + if (exists($system-timestamp)) + then $system-timestamp + else temporal:statement-get-system-time() + ), + + if ($response-type eq "application/json") + then concat('{"documents":[', string-join( + for $result in $results + return concat( + '{"uri":"',$result/rapi:uri/string(.), + '", "mime-type":"',$result/rapi:mime-type/string(.), + '", "category":["', + string-join($result/rapi:category/string(.),'", "'),'"]}' + ), + ", " + ), ']}') + else {$results} + ) + ) +}; + +declare function docmodupd:put( + $headers as map:map, + $params as map:map, + $env as map:map +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + eput:response-add-host-cookie($headers, $params, $env), + let $categories := docmodcom:select-category($params) + let $uri := docmodupd:lock-uris(map:get($params,"uri")) + return + if ($categories = "content") + then docmodupd:put-conditional-content($headers,$params,$uri,$categories,$env) + else if (not(doc-available($uri))) + (: modify if necessary to support naked properties :) + then error((),"RESTAPI-NODOCUMENT",(string-join($categories,", "),$uri)) + else + let $meta-format := + let $meta-type := docmodcom:get-metadata-input-type($headers,$params,$uri,()) + return + if ($meta-type = ("application/json","text/json")) + then "json" + else if ($meta-type = ("application/xml","text/xml")) + then "xml" + else error((),"RESTAPI-INTERNALERROR", + concat("unknown metadata type ",$meta-type," for ",$uri) + ) + let $meta-body := + if (map:get($env,"contains-body") eq "true") + then map:get($env,"metadata-body")/node() + else map:get($env,"body-getter")($meta-format)/node() + let $_ := if ($meta-format = "json" or node-name($meta-body) = QName("http://marklogic.com/rest-api","metadata")) then () + else error((),"RESTAPI-INVALIDREQ",("document element {" || namespace-uri($meta-body) || "}" || local-name($meta-body) || " not allowed")) + return docmodupd:put-metadata( + $headers,$params,$uri,$categories,$meta-body,map:get($env,"responder") + ) +}; + +declare function docmodupd:put-metadata( + $headers as map:map, + $params as map:map, + $uri as xs:string, + $categories as xs:string+, + $content as node()?, + $responder as function(*)? +) as empty-sequence() +{ + if (empty($content)) + then error((),"RESTAPI-INVALIDREQ",( + "cannot update metadata from empty request for uri: "||$uri + )) + else + let $param-names := map:keys($params) + return + if ($param-names = "collection" or + exists($param-names[starts-with(.,"perm:")]) or + exists($param-names[starts-with(.,"prop:")]) or + $param-names = "quality" + ) + then error((),"REST-INVALIDPARAM", + "Cannot combine metadata parameters with meta content for "||$uri + ) + else (), + + let $meta-uri := docmodupd:get-metadata-document($uri,false()) + let $meta-type := + docmodcom:get-metadata-input-type($headers,$params,$uri,()) + return + if ($meta-type = ("application/xml","text/xml")) then ( + if (empty($responder)) then () + else $responder($docmodupd:METADATA_UPDATED,$uri,(),(),(),(),(),()), + + docmodupd:write-metadata-xml($uri, $meta-uri, $categories, validate strict {$content}) + ) + else if ($meta-type = ("application/json","text/json")) then ( + if (empty($responder)) then () + else $responder($docmodupd:METADATA_UPDATED,$uri,(),(),(),(),(),()), + + docmodupd:write-metadata-json($uri,$meta-uri,$categories,$content) + ) + else error((),"RESTAPI-INVALIDMIMETYPE",( + "mime type for metadata must be application/json or application/xml",$meta-type,$uri + )) +}; + +declare function docmodupd:put-conditional-content( + $headers as map:map, + $params as map:map, + $uri as xs:string, + $categories as xs:string+, + $env as map:map +) as empty-sequence() +{ + let $update-policy := docmodcom:get-update-policy() + return ( + docmodupd:check-content-version($headers,$uri,$update-policy), + + docmodupd:put-content( + $headers,$params,$uri,$categories,$update-policy,$env,map:get($env,"responder") + ) + ) +}; + +(: metadata can be supplied via URI params, HTTP body (processed in docmodupd:put-metadata()), + first multipart, or $env map + content can be supplied via HTTP body, second multipart, or $env map and is streamed + (using xdmp:document-load("rest::") when possible) when not extracting metadata + from a binary, repairing XML, or converting JSON + format and mime type can be specified by format URI parameter, HTTP Content-Type header, + multipart Content-Type header, or the server mapping for the extension + format for parsing JSON is text + :) +declare function docmodupd:put-content( + $headers as map:map, + $params as map:map, + $uri as xs:string, + $categories as xs:string+, + $update-policy as xs:string?, + $env as map:map, + $responder as function(*)? +) as empty-sequence() +{ + let $with-overwrite := ($update-policy eq "overwrite-metadata") + let $env-body := (map:get($env,"contains-body") eq "true") + let $trans-name := map:get($params,"transform") + let $body-getter as function(*)? := + if ($env-body) then () + else map:get($env,"body-getter") + let $forest-id := docmodupd:get-forest-id(map:get($params,"forest-name")) + let $temporal-collection := map:get($params,"temporal-collection") + let $system-timestamp := map:get($params,"system-time") + let $is-multipart := + if ($env-body) then false() + else count($categories) gt 1 + let $input-type := + if ($is-multipart) + then map:get($headers,"content-type") + else head(dbut:tokenize-header(map:get($headers,"content-type"))) + let $parts-list := + if (not($is-multipart)) then () + else + let $parts-lister as function(*)? := map:get($env,"parts-lister") + return + if (empty($parts-lister)) then () + else $parts-lister($input-type,$body-getter("binary")) + let $part-typer as function(*)? := + if (not($is-multipart)) then () + else map:get($env,"part-typer") + let $param-format := map:get($params,"format") + (: must always get part headers before part content :) + let $meta-part-type := + if (not($is-multipart)) then () + else head(dbut:tokenize-header($part-typer($parts-list,1))) + let $meta-parse := + if (not($is-multipart)) then () + else if ($meta-part-type = ( + "application/json", "text/json", "application/xml", "text/xml" + )) + then substring-after($meta-part-type,"/") + else if ($param-format = ("json","xml")) + then $param-format + else if (exists($meta-part-type)) + then error((),"REST-INVALIDTYPE", + "mime type for meta must be application/xml or application/json: "||$meta-part-type + ) + else if (exists($param-format)) + then error((),"REST-INVALIDPARAM", + "Format parameter must be xml or json for meta: "||$param-format + ) + else "text" + let $part-reader as function(*)? := + if (not($is-multipart)) then () + else map:get($env,"part-reader") + let $metadata-part := + if ($env-body) + then map:get($env,"metadata-body") + else if (not($is-multipart)) then () + else $part-reader( + $parts-list, + 1, + if ($meta-parse eq "xml") then "xml" else "json" + ) + let $con-part-type := + if (not($is-multipart)) then () + else head(dbut:tokenize-header($part-typer($parts-list,2))) + let $content-kind := docmodupd:content-kind( + $uri,$env,$env-body,$trans-name,$is-multipart,$input-type,$param-format,$con-part-type + ) + let $content-type := head($content-kind) + let $content-format := tail($content-kind) + let $meta-format := + if ($env-body) + then map:get($env,"metadata-format") + else if (not($is-multipart)) then () + else if ($meta-parse eq "json" or + ($meta-parse eq "text" and $content-type = ("application/json","text/json"))) + then "json" + else "xml" + let $metadata := + if (empty($metadata-part)) then () + else + let $param-names := map:keys($params) + return + if ($param-names = "collection" or + exists($param-names[starts-with(.,"perm:")]) or + exists($param-names[starts-with(.,"prop:")]) or + $param-names = "quality" + ) + then error((),"REST-INVALIDPARAM", + "Cannot combine metadata parameters with meta content for "||$uri + ) + else docmodcom:parse-metadata($meta-format, $metadata-part) + let $collections := + if (empty($metadata)) + then map:get($params,"collection") + else docmodcom:parse-collections($uri,$metadata) + let $permissions := + if (exists($metadata)) then () + else map:map() + let $properties := + if (exists($metadata)) then () + else map:map() + let $quality := + if (empty($metadata)) + then map:get($params,"quality") + else docmodcom:parse-quality($uri,$metadata) + let $metadata-values := + if (empty($metadata)) + then + let $key-names := for $param-name in map:keys($params) return if (starts-with($param-name,"value:")) then substring-after($param-name,"value:") else () + let $map := map:new() + let $_ := for $key in $key-names return map:put($map,$key,map:get($params,"value:" || $key)) + return $map + else docmodcom:parse-metadata-values($uri,$metadata) + let $role-names := + if (exists($metadata)) then () + else ( + for $param-name in map:keys($params) + return + if (starts-with($param-name,"perm:")) then + let $role-name := substring-after($param-name,"perm:") + return map:put($permissions,$role-name,map:get($params,$param-name)) + else if (starts-with($param-name,"prop:")) + then map:put($properties,substring-after($param-name,"prop:"),map:get($params,$param-name)) + else (), + + if (empty($permissions)) then () + else map:keys($permissions) + ) + let $role-ids := + if (empty($role-names)) then () + else eput:lookup-role-ids( + if (count($role-names) eq 1) + then $role-names + else json:to-array($role-names) + ) + let $perms := + if (empty($metadata)) then + if (empty($role-names)) then () + else + for $role-name at $i in $role-names + for $capability in map:get($permissions,$role-name) + return + + {subsequence($role-ids,$i,1)} + {$capability} + + else docmodcom:parse-permissions($uri,$metadata) + let $rids := + if (empty($role-ids)) then () + else $role-ids/data(.) + let $prop-names := + if (empty($properties)) then () + else map:keys($properties) + let $props := + if (empty($metadata)) then + if (empty($prop-names)) then () + else + for $prop-name in $prop-names + return + if ($prop-name castable as xs:NCName) + then element {$prop-name} {map:get($properties,$prop-name)} + else error((),"REST-INVALIDPARAM", + "Property name must be a valid XML NCName: "||$prop-name + ) + else docmodcom:parse-properties($uri,$metadata) + let $prop-qnames := + if (exists($metadata)) then () + else if (exists($prop-names)) + then $prop-names ! xs:QName(.) + else $props/node-name(.) + let $context := + if (empty($trans-name)) then () + else eput:make-context($uri,$content-type,()) + let $extract := map:get($params,"extract") + let $repair := map:get($params,"repair") + let $content-parse := + if ((exists($repair) and $content-format eq "xml")) + then "text" + else $content-format + let $content := + (: conditions under which content is not streamed :) + if ($env-body) + then map:get($env,"content-body") + else + if (exists($extract) or map:get($env,"buffer") eq "true" or + exists($trans-name) or exists($repair)) + then + if ($is-multipart) + then $part-reader($parts-list,2,$content-parse) + else $body-getter($content-parse) + else () + let $input := + if (empty($content)) then () + else docmodupd:convert-document( + $uri,$content-format,$content-type,$content,$repair + ) + let $trans-output := + if (empty($trans-name)) then () + else tformod:apply-transform( + $trans-name,$context,tformod:extract-transform-params($params),$input + ) + let $trans-ctxt := + if (empty($trans-name)) then () + else map:get($trans-output,"context") + let $output := + if (empty($trans-name)) + then $input + else map:get($trans-output,"result") + let $output-uri := + if (empty($trans-ctxt)) + then $uri + else head((map:get($trans-ctxt,"uri"),$uri)) + let $output-type := + if (empty($trans-ctxt)) + then $content-type + else map:get($trans-ctxt,"output-type") + let $output-format := + if (empty($trans-ctxt)) + then $content-format + else + let $transform-format := eput:get-document-format($output) + return + if (exists($transform-format)) + then $transform-format + else head((docmodcom:get-type-format($output-type),$content-format)) + let $temporal-document-uri := map:get($params,"temporal-document") + let $version-uri := if (empty($temporal-document-uri)) then () else $output-uri + let $output-uri := if (empty($temporal-document-uri)) then $output-uri else $temporal-document-uri + return ( + if (exists($output-type)) then () + else error((),"RESTAPI-INVALIDMIMETYPE",( + "mime type must be declared for content","NONE",$uri + )), + + if (empty($extract) or $output-format eq "binary") then () + else error((),"RESTAPI-INVALIDMIMETYPE",( + "metadata extracted only from binary content",$output-type,$uri + )), + + if (exists($extract)) then ( + docmodupd:write-content( + $output-uri,$version-uri,$output,$collections,$rids,$perms,$quality,$metadata-values, + $forest-id,$with-overwrite,$responder, + $temporal-collection,$system-timestamp + ), + + docmodupd:extract-binary-metadata( + $output-uri,$extract,$output-type,$output,$collections,$rids,$perms, + $quality,$metadata-values,$forest-id,$with-overwrite, + $temporal-collection,$system-timestamp + ) + ) + else if (exists($output)) then + docmodupd:write-content( + $output-uri,$version-uri,$output,$collections,$rids,$perms,$quality,$metadata-values,$forest-id, + $with-overwrite,$responder,$temporal-collection,$system-timestamp + ) +(: TODO: $encoding :) + else docmodupd:load-content( + $output-uri,$version-uri,$output-format,$collections,$rids,$perms,$quality,$metadata-values, + $repair,$forest-id,(),$with-overwrite,$responder, + $temporal-collection,$system-timestamp + ), + + if (exists($extract) or empty($props)) then () + else if ($with-overwrite) + then docmodupd:write-properties($output-uri,$props) + else docmodupd:write-properties( + $output-uri, + docmodupd:get-metadata-document($output-uri,false()), + $prop-qnames, + $props + ) + ) +}; + +declare private function docmodupd:convert-document( + $uri as xs:string, + $format as xs:string, + $mimetype as xs:string?, + $content as document-node()?, + $repair as xs:string? +) as document-node() +{ + if (empty($repair)) + then $content + else ( + if (not($repair = ("full","none"))) + then error((),"RESTAPI-INTERNALERROR", + concat("unknown repair type ",$repair," for ",$uri) + ) + else if (not($format eq "xml")) + then error((),"RESTAPI-INVALIDMIMETYPE",( + "repair parameter supported only for xml content",$mimetype,$uri + )) + else (), + + let $docs := xdmp:unquote( + string($content), + (), + ( + if (empty($repair)) then () + else concat("repair-",$repair), + + concat("format-",$format) + ) + ) + let $doc-num := count($docs) + return + if ($doc-num eq 1) + then $docs + else error((),"RESTAPI-INVALIDRESULT",( + concat("repair produced ",$doc-num," documents"),$uri + )) + ) +}; + +declare private function docmodupd:extract-binary-metadata( + $uri as xs:string, + $extract as xs:string, + $output-type as xs:string, + $document as document-node(), + $collections as xs:string*, + $rids as xs:unsignedLong*, + $permissions as element(sec:permission)*, + $quality as xs:integer?, + $metadata-values as map:map?, + $forest-id as xs:unsignedLong?, + $with-overwrite as xs:boolean, + $temporal-collection as xs:string?, + $system-timestamp as xs:dateTime? +) as empty-sequence() +{ + let $meta-doc := xdmp:document-filter($document) + return ( + if ($extract eq "properties") then + let $meta-props := isys-filter:extract-isys-meta-data($meta-doc) + return docmodupd:write-properties($uri,$meta-props) + else if ($extract eq "document") then + if (ends-with($uri,".xhtml")) + then error((),"RESTAPI-INVALIDREQ",( + "cannot extract metadata as document for document with XHTML extension. Output-type: "||$output-type|| " for uri: " || $uri + )) + else + let $meta-uri := if(matches($uri,"^.*\.[^\\]+$")) + then replace($uri,"\.[^/.]+$",".xhtml") + else concat($uri,".xhtml") + return ( + docmodupd:write-content( + $meta-uri, + document{ + { + { + $meta-doc/xhtml:html/xhtml:head/*, + + }, + $meta-doc/xhtml:html/xhtml:body + } + }, + $collections, + $rids, + $permissions, + $quality, + $metadata-values, + $forest-id, + true(), + (), + $temporal-collection, + $system-timestamp + ), + + (: as in /MarkLogic/filter/actions/filter-xhtml-action.xqy :) + if (not(docmodupd:cpf-installed())) then () + else lnk:create( + $meta-uri,$uri,"source","filter","strong" + ) + ) + else error((),"RESTAPI-INTERNALERROR",concat("unknown extraction type ",$extract," for ",$uri)) + ) +}; + +declare function docmodupd:delete( + $headers as map:map, + $params as map:map, + $env as map:map? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + eput:response-add-host-cookie($headers, $params, $env), + let $uris := docmodupd:lock-uris(map:get($params,"uri")) + let $categories := docmodcom:select-category($params) + let $responder as function(*)? := + if (empty($env)) then () + else map:get($env,"responder") + return + if ($categories = "content") + then docmodupd:delete-conditional-document( + $headers,$params,$uris,$responder + ) + else ( + if (empty($responder)) then () + else $responder($docmodupd:METADATA_DELETED,(),(),(),(),(),(),()), + + docmodupd:delete-metadata($uris,$categories) + ) +}; + +declare function docmodupd:delete-conditional-document( + $headers as map:map, + $params as map:map, + $uris as xs:string+, + $responder as function(*)? +) as empty-sequence() +{ + if (count($uris) eq 1) + then docmodupd:check-content-version($headers,$uris) + else + let $update-policy := docmodcom:get-update-policy() + return + if ($update-policy = ("merge-metadata","overwrite-metadata") or + ($update-policy eq "version-optional" and + empty(map:get($headers,"if-match")[. ne ""])) + ) then () + else error((), "RESTAPI-INVALIDREQ", + "cannot delete multiple documents with optimistic locking"), + + docmodupd:delete-document-responder($uris,$responder, + map:get($params,"temporal-collection"), + map:get($params,"system-time"), + map:get($params,"result") = "wiped", + map:get($params,"check") + ) +}; + +declare function docmodupd:delete-document-responder( + $uris as xs:string+, + $responder as function(*)?, + $temporal-collection as xs:string?, + $system-timestamp as xs:dateTime?, + $wipe as xs:boolean, + $check as xs:string? +) as empty-sequence() +{ + if (empty($responder)) then () + else $responder($docmodupd:DOCUMENT_DELETED,(),(),(),(),(),(), + if (empty($temporal-collection)) then () + else if (exists($system-timestamp)) + then $system-timestamp + else temporal:statement-get-system-time() + ), + + docmodupd:delete-document($uris,$temporal-collection,$system-timestamp,$wipe,$check) +}; + +(: + collective metadata functions + :) +declare function docmodupd:write-metadata-xml( + $uri as xs:string, + $meta-uri as xs:string?, + $categories as xs:string+, + $metadata as element(rapi:metadata)? +) as empty-sequence() +{ + let $provided-categories := $metadata/*/local-name(.) + return + if (not(docmodcom:check-metadata-provided($uri,$categories,$provided-categories))) + then () + else ( + if (not("collections" = $provided-categories)) then () + else $metadata/rapi:collections/docmodupd:write-collections( + $uri, $meta-uri, rapi:collection/string(.) + ), + + if (not("permissions" = $provided-categories)) then () + else $metadata/rapi:permissions/docmodupd:write-permissions( + $uri, $meta-uri, docmodcom:convert-permissions($uri,rapi:permission) + ), + + if (not("properties" = $provided-categories)) then () + else + let $properties := $metadata/prop:properties/(* except prop:*) + let $localized-properties := + for $prop in $properties + return element {node-name($prop)} { + $prop/namespace::*[. != "http://marklogic.com/rest-api"], + $prop/@*, + $prop/node() + } + return docmodupd:write-properties( + $uri, $meta-uri, $localized-properties + ), + if (not("quality" = $provided-categories)) then () + else $metadata/rapi:quality/docmodupd:write-quality( + $uri, $meta-uri, data(.) + ), + + if (not("metadata-values" = $provided-categories)) then () + else $metadata/rapi:metadata-values/docmodupd:write-metadata-values( + $uri, $meta-uri, docmodcom:convert-metadata-values($uri,rapi:metadata-value) + ) + ) +}; + +declare function docmodupd:write-metadata-json( + $uri as xs:string, + $meta-uri as xs:string?, + $categories as xs:string+, + $metadata as node() +) as empty-sequence() +{ + (: depends on json:array for nested arrays :) + let $map := + typeswitch($metadata) + case object-node() return xdmp:from-json($metadata) + case text() return + let $meta-text := string($metadata) + return + if (empty($meta-text)) then () + else xdmp:from-json(xdmp:unquote($meta-text)) + default return error( + (),"RESTAPI-INTERNALERROR","could not parse JSON metadata for uri: "||$uri + ) + let $provided-categories := + if (empty($map)) then () + (: Note: a bit of fixup for names in JSON being camel case ... :) + else for $key in map:keys($map) return if ($key = "metadataValues") then "metadata-values" else $key + return + if (not(docmodcom:check-metadata-provided($uri,$categories,$provided-categories))) + then () + else if (exists($provided-categories[not(. = ("collections","permissions","properties","quality","metadata-values"))])) + then error((),"RESTAPI-INVALIDCONTENT", + "provided key for unknown metadata category: "|| + string-join( + $provided-categories[not(. = ("collections","permissions","properties","quality","metadata-values"))], + ", " + )|| + " for uri: "||$uri + ) + else + let $collections := + if (not("collections" = $provided-categories)) then () + else docmodcom:convert-json-collection($uri,$map) + let $permissions := + if (not("permissions" = $provided-categories)) then () + else docmodcom:convert-json-permissions($uri,$map) + let $properties := + if (not("properties" = $provided-categories)) then () + else docmodcom:convert-json-properties($uri,$map) + let $quality := + if (not("quality" = $provided-categories)) then () + else docmodcom:convert-json-quality($uri,$map) + let $values := + if (not("metadata-values" = $provided-categories)) then () + else docmodcom:convert-json-metadata-values($uri,$map) + return ( + if (empty($collections)) then () + else docmodupd:write-collections($uri,$meta-uri,$collections), + + if (empty($permissions)) then () + else docmodupd:write-permissions($uri,$meta-uri,$permissions), + + if (empty($properties)) then () + else docmodupd:write-properties($uri,$meta-uri,$properties), + + if (empty($quality)) then () + else docmodupd:write-quality($uri,$meta-uri,$quality), + + if (empty($values)) then () + else docmodupd:write-metadata-values($uri,$meta-uri,$values) + ) +}; + +declare function docmodupd:delete-metadata( + $uris as xs:string+, + $categories as xs:string* +) as empty-sequence() +{ + if (empty($categories)) then () + else + for $uri in $uris + let $has-doc := doc-available($uri) + let $meta-uri := docmodupd:get-metadata-document($uri,false()) + return ( + if (not($has-doc)) then () + else ( + if (not($categories = ("collections","metadata"))) then () + else docmodupd:reset-collections($uri,$meta-uri), + + if (not($categories = ("permissions","metadata"))) then () + else docmodupd:reset-permissions($uri,$meta-uri), + + if (not($categories = ("quality","metadata"))) then () + else docmodupd:reset-quality($uri,$meta-uri), + + if (not($categories = ("metadata-values","metadata"))) then () + else docmodupd:reset-metadata-values($uri,$meta-uri) + ), + + if (not($categories = ("properties","metadata"))) then () + else docmodupd:remove-properties($uri,$meta-uri,$has-doc) + ) +}; + +(: + Low-level functions for document content and metadata + :) + +declare function docmodupd:delete-document( + $uris as xs:string+, + $temporal-collection as xs:string?, + $system-timestamp as xs:dateTime?, + $wipe as xs:boolean, + $check as xs:string? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + if (empty($system-timestamp)) then () + else temporal:statement-set-system-time($system-timestamp), + + let $options := map:entry( + "ifNotExists", + if (not($check = "exists")) then "allow" else "error" + ) + return ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"delete-document", + map:entry("temporal-collection", $temporal-collection) + => map:with("uris",$uris)=> map:with("options",$options) + ), + + for $uri in $uris + for $doc-uri in ($uri, docmodupd:get-metadata-document($uri,true())) + return + if (empty($temporal-collection)) + then xdmp:document-delete($doc-uri,$options) + (: idempotent so okay to execute on deleted document :) + else if ($wipe) then + try {temporal:document-wipe($temporal-collection,$doc-uri)} + catch($e) { + if ($e/error:code/string(.) eq "XDMP-DOCNOTFOUND") then () + else xdmp:rethrow() + } + else temporal:document-delete($temporal-collection,$doc-uri,$options) + ) +}; + +declare function docmodupd:get-metadata-document( + $uri as xs:string, + $check-cpf as xs:boolean? +) as xs:string? +{ + if (ends-with($uri,".xhtml") or not(xdmp:uri-format($uri) eq "binary")) then () + else + let $mod-uri := replace($uri,"\.[^/.]+$",".xhtml") + let $meta-uri := + if (ends-with($mod-uri,".xhtml")) + then $mod-uri + else concat($uri,".xhtml") + return + if (not(doc-available($meta-uri))) then () + (: linked metadata is deleted by CPF :) + else if ($check-cpf and docmodupd:cpf-installed()) then () + else if (not(doc($meta-uri) + /xhtml:html/xhtml:head/xhtml:meta + [string(@name)="MarkLogic_Binary_Source"]/@content/string(.) = $uri) + ) then () + else $meta-uri +}; + +declare function docmodupd:write-content( + $uri as xs:string, + $document as document-node(), + $collections as xs:string*, + $rids as xs:unsignedLong*, + $permissions as element(sec:permission)*, + $quality as xs:integer?, + $metadata-values as map:map?, + $forest-id as xs:unsignedLong?, + $with-overwrite as xs:boolean, + $responder as function(*)?, + $temporal-collection as xs:string?, + $system-timestamp as xs:dateTime? +) as empty-sequence() +{ + docmodupd:write-content( + $uri, + (), + $document, + $collections, + $rids, + $permissions, + $quality, + $metadata-values, + $forest-id, + $with-overwrite, + $responder, + $temporal-collection, + $system-timestamp + ) +}; + +declare function docmodupd:write-content( + $uri as xs:string, + $version-uri as xs:string?, + $document as document-node(), + $collections as xs:string*, + $rids as xs:unsignedLong*, + $permissions as element(sec:permission)*, + $quality as xs:integer?, + $metadata-values as map:map?, + $forest-id as xs:unsignedLong?, + $with-overwrite as xs:boolean, + $responder as function(*)?, + $temporal-collection as xs:string?, + $system-timestamp as xs:dateTime? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if (empty($document)) then () + else + let $must-insert := exists($forest-id) or exists($temporal-collection) or + exists($collections) or exists($permissions) or exists($quality) or exists($metadata-values) + let $old-doc := + if ($with-overwrite or $must-insert) then () + else doc($uri) + let $old-collections := + if (not($must-insert) or exists($collections)) then () + else xdmp:document-get-collections($uri) + let $old-permissions := + if (not($must-insert) or (exists($permissions) and empty($rids))) + then () + else xdmp:document-get-permissions($uri) + let $old-quality := + if (not($must-insert) or exists($quality)) then () + else xdmp:document-get-quality($uri) + let $old-metadata-values := + if (not($must-insert) or exists($metadata-values)) then () + else xdmp:document-get-metadata($uri) + let $document-exists := + if ($with-overwrite) + then false() + else if ($must-insert) + then (exists($old-collections) or exists($old-permissions) or + exists($old-quality) or doc-available($uri)) + else exists($old-doc) + return ( + if ($document-exists or dbut:is-uri($uri)) then () + else error((), "REST-INVALIDPARAM", "invalid uri: "||$uri), + + if (empty($responder)) then () + else $responder( + if ($with-overwrite or $document-exists) + then $docmodupd:CONTENT_UPDATED + else $docmodupd:DOCUMENT_CREATED, + $uri,(),(),(),(),(), + if (empty($temporal-collection)) then () + else if (exists($system-timestamp)) + then $system-timestamp + else temporal:statement-get-system-time() + ), + + if ($must-insert) + then docmodupd:write-content( + $uri, + $version-uri, + $document, + if (exists($collections)) + then $collections + else if ($document-exists) + then $old-collections + else xdmp:default-collections($uri), + if (exists($permissions)) then ( + $permissions | ( + if (empty($rids) or not($document-exists)) + then xdmp:default-permissions($uri) + else $old-permissions[not(sec:role-id/data(.) = $rids)] + ) + ) + else if ($document-exists) + then $old-permissions + else xdmp:default-permissions($uri), + if (exists($quality)) + then $quality + else if ($document-exists) + then $old-quality + else 0, + if (exists($metadata-values)) + then $metadata-values + else if ($document-exists) + then $old-metadata-values + else (), + $forest-id, + $temporal-collection, + $system-timestamp + ) + else if ($document-exists) then ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-content#node-replace", + map:entry("uri",$uri), + map:entry("old-doc",$old-doc)=> map:with("document",$document) + ), + + xdmp:node-replace($old-doc,$document) + ) + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-content#document-insert", + map:entry("uri",$uri), + map:entry("document",$document) + ), + + xdmp:document-insert($uri,$document) + ) + ) +}; + +declare function docmodupd:write-content( + $uri as xs:string, + $document as document-node(), + $collections as xs:string*, + $permissions as element(sec:permission)*, + $quality as xs:integer?, + $metadata-values as map:map?, + $forest-id as xs:unsignedLong?, + $temporal-collection as xs:string?, + $system-timestamp as xs:dateTime? +) as empty-sequence() +{ + docmodupd:write-content( + $uri, + (), + $document, + $collections, + $permissions, + $quality, + $metadata-values, + $forest-id, + $temporal-collection, + $system-timestamp + ) +}; + +declare function docmodupd:write-content( + $uri as xs:string, + $version-uri as xs:string?, + $document as document-node(), + $collections as xs:string*, + $permissions as element(sec:permission)*, + $quality as xs:integer?, + $metadata-values as map:map?, + $forest-id as xs:unsignedLong?, + $temporal-collection as xs:string?, + $system-timestamp as xs:dateTime? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + let $ns := + if (exists($temporal-collection)) + then $temporal-insert-ns + else $insert-ns + let $options := element { QName($ns,"options")} { + + (: filter out collections maintained by temporal implementation :) + + let $collection-set := if (empty($temporal-collection)) then $collections else $collections[not(. = ($temporal-collection, "latest", $uri))] + return + if (empty($collection-set)) then () + else element {QName($ns,"collections")} { + for $collection in $collection-set + return element {QName($ns,"collection")} {$collection} + }, + + (: Note: xdmp:default-permissions() are for the amped user :) + element {QName($ns,"permissions")} { + if (empty($permissions)) + then xdmp:default-permissions($uri) + else + let $default-perms := xdmp:default-permissions($uri) + let $default-check := $default-perms/concat(string(sec:capability),string(sec:role-id)) + return ( + $permissions[not(concat(string(sec:capability),string(sec:role-id)) = $default-check)], + + $default-perms + ) + }, + + if (empty($quality)) + then () + else element {QName($ns,"quality")} {$quality}, + + if (empty($metadata-values)) + then () + else element {QName($ns,"metadata")} { $metadata-values }, + + + if (empty($forest-id)) then () + else element {QName($ns,"forests")} { + element {QName($ns,"forest")} {$forest-id} + } + } + return + if (empty($temporal-collection)) then ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-content#document", + map:entry("uri",$uri)=>map:with("options",$options), + map:entry("document",$document) + ), + + xdmp:document-insert($uri,$document,$options) + ) + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-content#temporal", + map:entry("uri",$uri)=>map:with("options",$options)=>map:with("temporal-collection",$temporal-collection) + =>map:with("version-uri",$version-uri)=>map:with("system-timestamp",$system-timestamp), + map:entry("document",$document) + ), + + if (empty($system-timestamp)) then () + else temporal:statement-set-system-time($system-timestamp), + + if (empty($version-uri)) then () + else temporal:statement-set-document-version-uri($uri,$version-uri), + + temporal:document-insert( + $temporal-collection, + $uri, + $document, + $options) + ) +}; + +declare function docmodupd:load-content( + $uri as xs:string, + $format as xs:string, + $collections as xs:string*, + $rids as xs:unsignedLong*, + $permissions as element(sec:permission)*, + $quality as xs:integer?, + $metadata-values as map:map?, + $repair as xs:string?, + $forest-id as xs:unsignedLong?, + $encoding as xs:string?, + $with-overwrite as xs:boolean, + $responder as function(*)?, + $temporal-collection as xs:string?, + $system-timestamp as xs:dateTime? +) as empty-sequence() +{ + docmodupd:load-content( + $uri, + (), + $format, + $collections, + $rids, + $permissions, + $quality, + $metadata-values, + $repair, + $forest-id, + $encoding, + $with-overwrite, + $responder, + $temporal-collection, + $system-timestamp + ) +}; + +declare function docmodupd:load-content( + $uri as xs:string, + $version-uri as xs:string?, + $format as xs:string, + $collections as xs:string*, + $rids as xs:unsignedLong*, + $permissions as element(sec:permission)*, + $quality as xs:integer?, + $metadata-values as map:map?, + $repair as xs:string?, + $forest-id as xs:unsignedLong?, + $encoding as xs:string?, + $with-overwrite as xs:boolean, + $responder as function(*)?, + $temporal-collection as xs:string?, + $system-timestamp as xs:dateTime? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + let $ns := + if (exists($temporal-collection)) + then $temporal-load-ns + else $load-ns + let $old-collections := + if (exists($collections)) then () + else xdmp:document-get-collections($uri) + let $old-permissions := + if (exists($permissions) and empty($rids)) then () + else xdmp:document-get-permissions($uri) + let $old-quality := + if (exists($quality)) then () + else xdmp:document-get-quality($uri) + let $document-exists := + if ($with-overwrite) + then false() + else (exists($old-collections) or exists($old-permissions) or + exists($old-quality) or doc-available($uri)) + let $options := + element { QName($ns,"options")} { + element {QName($ns,"uri")}{$uri}, + + if (exists($collections)) then + element {QName($ns,"collections")} { + for $collection in $collections + return element {QName($ns,"collection")} {$collection} + } + else if ($document-exists) then + element {QName($ns,"collections")} { + for $collection in $old-collections + (: filter out collections maintained by temporal implementation :) + where not($collection = ($temporal-collection, "latest", $uri)) + return element {QName($ns,"collection")} {$collection} + } + else element {QName($ns,"collections")} { + for $collection in xdmp:default-collections($uri) + return element {QName($ns,"collection")} {$collection} + }, + + (: Note: xdmp:default-permissions() are for the amped user :) + element {QName($ns,"permissions")} { + if (exists($permissions)) then ( + $permissions | ( + if (empty($rids) or not($document-exists)) + then xdmp:default-permissions($uri) + else $old-permissions[not(sec:role-id/data(.) = $rids)] + ) + ) + else if ($document-exists) + then $old-permissions + else xdmp:default-permissions($uri) + }, + + if (exists($quality)) + then element {QName($ns,"quality")} {$quality} + else if ($document-exists) + then element {QName($ns,"quality")} {$old-quality} + else (), + + let $values := if (exists($metadata-values)) then $metadata-values else xdmp:document-get-metadata($uri) + return element {QName($ns,"metadata")} { $metadata-values }, + + if ($format ne "xml" or empty($repair)) then () + else element {QName($ns,"repair")} {$repair}, + + element {QName($ns,"format")} {$format}, + + if (empty($forest-id)) then () + else + element {QName($ns,"forests")} { + element {QName($ns,"forest")} {$forest-id} + }, + + if (empty($encoding)) then () + else element {QName($ns,"encoding")} {$encoding} + } + return ( + if ($document-exists or dbut:is-uri($uri)) then () + else error((), "REST-INVALIDPARAM", "invalid uri: "||$uri), + + if (empty($responder)) then () + else $responder( + if ($with-overwrite or $document-exists) + then $docmodupd:CONTENT_UPDATED + else $docmodupd:DOCUMENT_CREATED, + $uri,(),(),(),(),(), + if (empty($temporal-collection)) then () + else if (exists($system-timestamp)) + then $system-timestamp + else temporal:statement-get-system-time() + ), + + if (empty($temporal-collection)) then ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log($docmodupd:trace-id,"load-content#document",map:entry("options",$options)), + + xdmp:document-load("rest::",$options) + ) + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"load-content#temporal", + map:entry("options",$options)=>map:with("temporal-collection",$temporal-collection) + =>map:with("version-uri",$version-uri)=>map:with("system-timestamp",$system-timestamp) + ), + + if (empty($system-timestamp)) then () + else temporal:statement-set-system-time($system-timestamp), + + if (empty($version-uri)) then () + else temporal:statement-set-document-version-uri($uri,$version-uri), + + temporal:document-load($temporal-collection,"rest::",$options) + ) + ) +}; + +declare function docmodupd:write-collections( + $uri as xs:string, + $meta-uri as xs:string?, + $collections as xs:string* +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + if (empty($collections)) then () + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-collections", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri)=>map:with("collections",$collections) + ), + + for $doc-uri in ($uri, $meta-uri) + return xdmp:document-set-collections($doc-uri,$collections) + ) +}; + +declare function docmodupd:write-permissions( + $uri as xs:string, + $meta-uri as xs:string?, + $permissions as element(sec:permission)* +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + if (empty($permissions)) then () + else + let $perms := ($permissions|xdmp:default-permissions($uri)) + return ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-permissions", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri)=>map:with("perms",$perms) + ), + + for $doc-uri in ($uri, $meta-uri) + return xdmp:document-set-permissions($doc-uri, $perms) + ) +}; + +(: overwrite or merge :) +declare function docmodupd:write-properties( + $uri as xs:string, + $meta-uri as xs:string?, + $prop-qnames as xs:QName*, + $properties as element()* +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if (empty($properties)) then () + else if (empty($prop-qnames)) + then docmodupd:write-properties($uri,$meta-uri,$properties) + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-properties#add", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri) + =>map:with("prop-qnames",$prop-qnames)=>map:with("properties",$properties) + ), + + for $doc-uri in ($uri, $meta-uri) + return ( + xdmp:document-remove-properties($doc-uri,$prop-qnames), + xdmp:document-add-properties($doc-uri,$properties) + ) + ) +}; + +(: overwrite :) +declare function docmodupd:write-properties( + $uri as xs:string, + $meta-uri as xs:string?, + $properties as element()* +) as empty-sequence() +{ + if (empty($properties)) then () + else + for $doc-uri in ($uri, $meta-uri) + return docmodupd:write-properties($doc-uri,$properties) +}; + +declare private function docmodupd:write-properties( + $uri as xs:string, + $properties as element()* +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + if (empty($properties)) then () + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-properties#set", + map:entry("uri",$uri)=>map:with("properties",$properties) + ), + + xdmp:document-set-properties($uri,$properties) + ) +}; + +declare function docmodupd:write-quality( + $uri as xs:string, + $meta-uri as xs:string?, + $quality as xs:integer? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + if (empty($quality)) then () + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-quality", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri)=>map:with("quality",$quality) + ), + + for $doc-uri in ($uri, $meta-uri) + return xdmp:document-set-quality($doc-uri,$quality) + ) +}; + +declare function docmodupd:write-metadata-values( + $uri as xs:string, + $meta-uri as xs:string?, + $values as map:map? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + if (empty($values)) then () + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-metadata-values", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri)=>map:with("values",$values) + ), + + for $doc-uri in ($uri, $meta-uri) + return xdmp:document-set-metadata($doc-uri,$values) + ) +}; + +declare function docmodupd:reset-collections( + $uri as xs:string, + $meta-uri as xs:string? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"reset-collections", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri) + ), + + for $doc-uri in ($uri, $meta-uri) + return xdmp:document-set-collections($doc-uri, xdmp:default-collections($doc-uri)) +}; + +declare function docmodupd:reset-permissions( + $uri as xs:string, + $meta-uri as xs:string? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"reset-permissions", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri) + ), + + let $perms := xdmp:default-permissions($uri) + for $doc-uri in ($uri, $meta-uri) + (: xdmp:document-remove-permissions() is problematic because + a document must always have at least one update permission and + the REST API must be able to read and write documents :) + return xdmp:document-set-permissions($doc-uri, $perms) +}; + +declare function docmodupd:remove-properties( + $uri as xs:string, + $meta-uri as xs:string?, + $has-doc as xs:boolean +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + (: for naked properties, delete the document :) + if (not($has-doc)) + then xdmp:document-delete($uri) + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"remove-properties", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri) + ), + + for $doc-uri in ($uri, $meta-uri) + return xdmp:document-remove-properties( + $doc-uri, + xdmp:document-properties($doc-uri)/prop:properties/(* except prop:*)/node-name(.) + ) + ) +}; + +declare function docmodupd:reset-quality( + $uri as xs:string, + $meta-uri as xs:string? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"reset-quality", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri) + ), + + for $doc-uri in ($uri, $meta-uri) + return xdmp:document-set-quality($doc-uri, 0) +}; + +declare function docmodupd:reset-metadata-values( + $uri as xs:string, + $meta-uri as xs:string? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"reset-metadata-values", + map:entry("uri",$uri)=>map:with("meta-uri",$meta-uri) + ), + + for $doc-uri in ($uri, $meta-uri) + return xdmp:document-set-metadata($doc-uri,map:new()) +}; + +declare private function docmodupd:get-forest-id( + $forest-name as xs:string? +) as xs:unsignedLong? +{ + if (empty($forest-name)) then () + else + try { + xdmp:forest($forest-name) + } catch ($e) { + if ($e/error:code eq "XDMP-NOSUCHFOREST") + then error((), "REST-INVALIDPARAM", "No such forest: "||$forest-name) + else xdmp:rethrow() + } +}; + +(: + patch functions + :) +declare function docmodupd:convert-patch( + $uri as xs:string, + $raw-patch as node(), + $patch-content as map:map?, + $error-list as json:array? +) as element(rapi:patch) +{ + if ($raw-patch instance of element(rapi:patch)) + then docmodupd:convert-xml-patch($raw-patch,$error-list) + else if ($raw-patch instance of object-node()) then + if (exists($patch-content)) + then docmodupd:convert-json-patch($raw-patch,$patch-content,$error-list) + else error((),"RESTAPI-INTERNALERROR","JSON patch without patch content map for uri: "||$uri) + else error((),"RESTAPI-INVALIDREQ","patch is not or JSON patch object for uri: "||$uri) +}; + +declare function docmodupd:convert-xml-patch( + $raw-patch as element(rapi:patch), + $error-list as json:array? +) as element(rapi:patch) +{ + { + $raw-patch/@*, + docmodupd:make-namespaces(eput:collect-bindings($raw-patch)), + + (: safe and absolute operation paths :) + for $node in $raw-patch/node() + let $node-bindings := eput:collect-bindings($node) + return + typeswitch($node) + case element(rapi:delete) return ( + let $select-okay := + if (exists($node/@select)) + then true() + else docmodupd:push-error($error-list,"delete without select path") + let $cardinality-okay := docmodupd:has-valid-cardinality( + $node/@cardinality!string(.), $error-list + ) + return + if (not($select-okay or $cardinality-okay)) then () + else docmodupd:convert-xml-operation($node,$node-bindings,$node/@select,$error-list) + ) + case element(rapi:insert) return ( + let $context-okay := + if (exists($node/@context)) + then true() + else docmodupd:push-error($error-list,"insert without context path") + let $position-okay := docmodupd:is-insert-position-valid( + docmodupd:node-insert-position($node), $error-list + ) + let $cardinality-okay := docmodupd:has-valid-cardinality( + $node/@cardinality!string(.), $error-list + ) + let $content-okay := + if (exists($node/node())) + then true() + else docmodupd:push-error($error-list,"insert without content: "||string($node/@context)) + return + if (not($context-okay or $position-okay or $cardinality-okay or $content-okay)) + then () + else docmodupd:convert-xml-operation($node,$node-bindings,$node/@context,$error-list) + ) + case element(rapi:replace) return ( + let $select-okay := + if (exists($node/@select)) + then true() + else docmodupd:push-error($error-list,"replace without select path") + let $cardinality-okay := docmodupd:has-valid-cardinality( + $node/@cardinality!string(.), $error-list + ) + let $content-okay := + if (exists($node/node()) or exists($node/@apply)) + then true() + else docmodupd:push-error($error-list,"replace without apply or content: "||string($node/@select)) + return + if (not($select-okay or $cardinality-okay or $content-okay)) then () + else docmodupd:convert-xml-operation($node,$node-bindings,$node/@select,$error-list) + ) + case element(rapi:replace-insert) return ( + let $select-okay := + if (exists($node/@select)) + then true() + else docmodupd:push-error($error-list,"replace-insert without select path") + let $context := + $node/@context ! docmodupd:get-full-path($node-bindings,string(.),$error-list) + let $context-okay := + if (exists($context)) + then true() + else docmodupd:push-error($error-list,"replace-insert without context path") + let $position-okay := docmodupd:is-insert-position-valid( + docmodupd:node-insert-position($node), $error-list + ) + let $cardinality-okay := docmodupd:has-valid-cardinality( + $node/@cardinality!string(.), $error-list + ) + let $content := $node/node() + let $content-okay := + if (exists($content) or exists($node/@apply)) + then true() + else docmodupd:push-error($error-list,"replace-insert without apply or content: "||string($node/@context)) + return + if (not($select-okay or $context-okay or $position-okay or $cardinality-okay or $content-okay)) + then () + else + { + $node/(@* except (@context|@select)), + attribute context {$context}, + attribute select { + docmodupd:get-context-select-path( + $node-bindings,$context,$node/@select/string(.),$error-list + ) + }, + docmodupd:make-namespaces($node-bindings), + + if (empty($content)) then () + else $content + } + ) + default return $node + } +}; + +declare function docmodupd:convert-xml-operation( + $operation as element(), + $node-bindings as map:map?, + $path-att as attribute(), + $error-list as json:array? +) as element() +{ + element {node-name($operation)} { + $operation/(@* except $path-att), + attribute {node-name($path-att)} { + docmodupd:get-full-path($node-bindings,string($path-att),$error-list) + }, + docmodupd:make-namespaces($node-bindings), + $operation/node() + } +}; + +declare private function docmodupd:make-namespaces( + $bindings as map:map? +) +{ + if (empty($bindings)) then () + else + for $prefix in map:keys($bindings) + return namespace {$prefix} {map:get($bindings,$prefix)} +}; + +declare function docmodupd:convert-json-patch( + $raw-patch as object-node(), + $patch-content as map:map, + $error-list as json:array? +) as element(rapi:patch) +{ + { + let $pathlang := $raw-patch/pathlang!string(.) + let $is-jsonpath := ($pathlang eq 'jsonpath') + let $jsonpath-parser := + if (not($is-jsonpath)) then () + else + let $parser := json-path:make-parser() + return ( + json-path:set-parse-policy($parser,"strict"), + $parser + ) + let $ops := $raw-patch/patch + return ( + for $replaceLibrary in $ops/node("replace-library") + let $ns := $replaceLibrary/ns!string(.) + let $at := $replaceLibrary/at!string(.) + return + if (exists($at)) then + { + if (empty($ns)) then () + else attribute ns {$ns} + } + else docmodupd:push-error($error-list, + "replace library without at ("||$at||")"), + + for $delete-op in $ops/delete + let $select-in := $delete-op/select!string(.) + let $select := + if ($is-jsonpath) + then json-path:parse($jsonpath-parser, $select-in) + else $select-in + let $cardinality := $delete-op/cardinality!string(.) + return + { + if (empty($select)) + then docmodupd:push-error($error-list,"delete without select path") + else ( + if (not($is-jsonpath)) then () + else attribute original-select {$select-in}, + attribute select {docmodupd:get-full-path((),$select,$error-list)} + ), + + if (not( + docmodupd:has-valid-cardinality($cardinality, $error-list) + )) then () + else attribute cardinality {$cardinality} + }, + + for $insert-op in $ops/insert + let $context-in := $insert-op/context!string(.) + let $context := + if ($is-jsonpath) + then json-path:parse($jsonpath-parser, $context-in) + else $context-in + let $position := docmodupd:json-node-insert-position($insert-op) + let $cardinality := $insert-op/cardinality!string(.) + let $content := docmodupd:detach-content($insert-op,$error-list) + let $contentKey := + if (exists($content)) + then string(xdmp:random(1000000)) + else docmodupd:push-error($error-list, + "insert without content: "||$context-in) + let $contentType := + typeswitch($content) + case text() return "string" + case node() return xdmp:node-kind($content) + default return "atomic" + return + { + if (empty($context)) + then docmodupd:push-error($error-list,"insert without context path") + else ( + if (not($is-jsonpath)) then () + else attribute original-context {$context-in}, + attribute context {docmodupd:get-full-path((),$context,$error-list)} + ), + + if (not( + docmodupd:is-insert-position-valid($position, $error-list) + )) then () + else attribute position {$position}, + + if (not( + docmodupd:has-valid-cardinality($cardinality, $error-list) + )) then () + else attribute cardinality {$cardinality}, + + attribute contentKey {$contentKey}, + + if (empty($content)) + then docmodupd:push-error($error-list,"insert without content") + else map:put($patch-content,$contentKey,$content) + }, + + for $replace-op in $ops/replace + let $select-in := $replace-op/select ! string(.) + let $select := + if ($is-jsonpath) + then json-path:parse($jsonpath-parser, $select-in) + else $select-in + let $cardinality := $replace-op/cardinality!string(.) + let $apply := $replace-op/apply!string(.) + let $content := docmodupd:detach-content($replace-op,$error-list) + let $contentKey := + if (exists($content)) + then string(xdmp:random(1000000)) + else if (exists($apply)) then () + else docmodupd:push-error($error-list, + "replace without apply or content: "||$select-in) + let $contentType := + typeswitch($content) + case text() return "string" + case node() return xdmp:node-kind($content) + default return "atomic" + return + { + if (empty($select)) + then docmodupd:push-error($error-list,"replace without select path") + else ( + if (not($is-jsonpath)) then () + else attribute original-select {$select-in}, + attribute select {docmodupd:get-full-path((),$select,$error-list)} + ), + + if (not( + docmodupd:has-valid-cardinality($cardinality, $error-list) + )) then () + else attribute cardinality {$cardinality}, + + if (empty($apply)) then () + else attribute apply {$apply}, + + if (empty($contentKey)) then () + else ( + attribute contentKey {$contentKey}, + + if (empty($content)) + then docmodupd:push-error($error-list,"replace without content") + else map:put($patch-content,$contentKey,$content) + ) + }, + + for $replace-insert-op in $ops/replace-insert + let $select-in := $replace-insert-op/select!string(.) + let $select := + if ($is-jsonpath) + then json-path:parse($jsonpath-parser, $select-in) + else $select-in + let $context-in := $replace-insert-op/context!string(.) + let $context := ( + if ($is-jsonpath) + then json-path:parse($jsonpath-parser, $context-in) + else $context-in + ) ! docmodupd:get-full-path((), ., $error-list) + let $position := docmodupd:json-node-insert-position($replace-insert-op) + let $cardinality := $replace-insert-op/cardinality!string(.) + let $apply := $replace-insert-op/apply!string(.) + let $content := docmodupd:detach-content($replace-insert-op,$error-list) + let $contentKey := + if (exists($content)) + then string(xdmp:random(1000000)) + else if (exists($apply)) then () + else docmodupd:push-error($error-list, + "replace-insert without apply or content: "||$select-in) + let $contentType := + typeswitch($content) + case text() return "string" + case node() return xdmp:node-kind($content) + default return "atomic" + return + { + if (empty($select)) + then docmodupd:push-error($error-list,"replace-insert without select path") + else ( + if (not($is-jsonpath)) then () + else attribute original-select {$select-in}, + attribute select { + docmodupd:get-context-select-path((),$context,$select,$error-list) + } + ), + + if (empty($context)) + then docmodupd:push-error($error-list,"replace-insert without context path") + else ( + if (not($is-jsonpath)) then () + else attribute original-context {$context-in}, + attribute context {docmodupd:get-full-path((),$context,$error-list)} + ), + + if (not( + docmodupd:is-insert-position-valid($position, $error-list) + )) then () + else attribute position {$position}, + + if (not( + docmodupd:has-valid-cardinality($cardinality, $error-list) + )) then () + else attribute cardinality {$cardinality}, + + if (empty($apply)) then () + else attribute apply {$apply}, + + if (empty($contentKey)) then () + else ( + attribute contentKey {$contentKey}, + + if (empty($content)) + then docmodupd:push-error($error-list,"replace-insert without content") + else map:put($patch-content,$contentKey,$content) + ) + } + ) + } +}; + +declare function docmodupd:get-full-path( + $bindings as map:map?, + $raw-path as xs:string, + $error-list as json:array? +) as xs:string? +{ + docmodupd:check-path( + $bindings, + if (starts-with($raw-path,"/")) + then $raw-path + else concat("//",$raw-path), + $error-list + ) +}; +declare private function docmodupd:get-context-select-path( + $bindings as map:map?, + $context as xs:string, + $select as xs:string, + $error-list as json:array? +) as xs:string? +{ + docmodupd:check-path( + $bindings, + if (starts-with($select,"/")) + then $select + else concat($context,"/",$select), + $error-list + ) +}; +declare private function docmodupd:check-path( + $bindings as map:map?, + $path as xs:string, + $error-list as json:array? +) as xs:string? +{ + if (docmodupd:is-valid-patch-path($bindings,$path)) + then $path + else docmodupd:push-error($error-list,"invalid path: "||$path) +}; +declare private function docmodupd:is-valid-patch-path( + $bindings as map:map?, + $path as xs:string +) as xs:boolean +{ + if (exists($bindings)) + then cts:valid-document-patch-path($path,$bindings) + else cts:valid-document-patch-path($path) +}; + +declare private function docmodupd:is-insert-position-valid( + $position as xs:string?, + $error-list as json:array? +) as xs:boolean +{ + if ($position = ("before","after","last-child")) + then true() + else ( + if (exists($position)) + then docmodupd:push-error($error-list,"insert with unknown position: "||$position) + else docmodupd:push-error($error-list,"insert without position"), + + false() + ) +}; + +declare function docmodupd:has-valid-cardinality( + $cardinality as xs:string?, + $error-list as json:array? +) as xs:boolean +{ + if (empty($cardinality)) + then false() + else if ($cardinality = ("?", ".", "*", "+")) + then true() + else ( + docmodupd:push-error($error-list,"unknown cardinality: "||$cardinality), + + false() + ) +}; + +declare function docmodupd:apply-content-patch( + $temporal-collection as xs:string?, + $document as document-node(), + $document-format as xs:string, + $patch as element(rapi:patch), + $patch-content as map:map?, + $xqy-function-map as map:map?, + $sjs-apply-array as json:array?, + $error-list as json:array? +) as xs:boolean +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + let $string2literal := function($s as xs:string?) as xs:string { if (empty($s)) then "()" else "'" || string-join(tokenize($s,"'"),"&apos;") || "'" } + let $is-xml := ($document-format eq "xml") + let $delete-ops := $patch/rapi:delete + let $replace-ops := $patch/rapi:replace + let $replace-insert-ops := $patch/rapi:replace-insert + let $insert-ops := $patch/rapi:insert + let $expression := concat( + "let $sjs-result-map := ",docmodupd:sjs-apply-expression($sjs-apply-array), + "return ( ",string-join(( + + for $delete-op at $i in $delete-ops + let $path := $delete-op/@select/string(.) + return + if (empty($path)) then () + else concat( + "docmodupd:node-delete-operation($is-xml, ", + "$error-list, ", + "subsequence($delete-ops,",$i,",1), ", + "'",string-join(tokenize($path,"'"),"&apos;"),"', ", + $string2literal($temporal-collection), ", ", + $path, + ")" + ), + + for $replace-op at $i in $replace-ops + let $path := $replace-op/@select/string(.) + return + if (empty($path)) then () + else concat( + "docmodupd:node-replace-operation($is-xml, ", + "$patch-content, $xqy-function-map, $sjs-result-map, $error-list, ", + "subsequence($replace-ops,",$i,",1), ", + "'",string-join(tokenize($path,"'"),"&apos;"),"', ", + $string2literal($temporal-collection), ", ", + $path, + ")" + ), + + for $replace-insert-op at $i in $replace-insert-ops + let $replace-path := $replace-insert-op/@select/string(.) + let $insert-path := $replace-insert-op/@context/string(.) + let $position := docmodupd:node-insert-position($replace-insert-op) + return + if (empty($replace-path) or empty($insert-path)) then () + else concat( + "let $replace-nodes := ",$replace-path, + " return ", + "if (exists($replace-nodes)) ", + "then docmodupd:node-replace-operation($is-xml, ", + "$patch-content, $xqy-function-map, $sjs-result-map, $error-list, ", + "subsequence($replace-insert-ops,",$i,",1), ", + "'",string-join(tokenize($replace-path,"'"),"&apos;"),"', ", + $string2literal($temporal-collection), ", ", + "$replace-nodes", + ")", + "else docmodupd:node-insert-",$position,"-operation($is-xml, ", + "$patch-content, $xqy-function-map, $sjs-result-map, $error-list, ", + "subsequence($replace-insert-ops,",$i,",1), ", + "'",string-join(tokenize($insert-path,"'"),"&apos;"),"', ", + $string2literal($temporal-collection), ", ", + $insert-path, + ")" + ), + + for $insert-op at $i in $insert-ops + let $position := docmodupd:node-insert-position($insert-op) + let $path := $insert-op/@context/string(.) + return + if (empty($path)) then () + else concat( + "docmodupd:node-insert-",$position,"-operation($is-xml, ", + "$patch-content, $xqy-function-map, $sjs-result-map, $error-list, ", + "subsequence($insert-ops,",$i,",1), ", + "'",string-join(tokenize($path,"'"),"&apos;"),"', ", + $string2literal($temporal-collection), ", ", + $path, + ")" + ) + + ),", "), + " )") + let $ns-bindings := + for $prefix in in-scope-prefixes($patch) + let $ns-uri := namespace-uri-for-prefix($prefix,$patch) + where $prefix ne "xml" + return + if ($ns-uri = ("http://marklogic.com/rest-api")) then () + else ($prefix, $ns-uri) + return + try { + exists( + if (empty($ns-bindings)) + then $document/xdmp:value($expression) + else xdmp:with-namespaces( + $ns-bindings, + $document/xdmp:value($expression) + ) + ) + } catch($e) { + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"apply-content-patch#catch", + map:entry("error-code",$e/error:code) + =>map:with("expression",$expression)=>map:with("ns-bindings",$ns-bindings), + map:entry("document",$document) + ), + + if ($e/error:code eq "XDMP-UNEXPECTED") + then error((), "RESTAPI-INVALIDCONTENT", + concat("Invalid content patch (maybe missing pathlang property?) or replacement library")) + else xdmp:rethrow() + } +}; + +declare function docmodupd:apply-sjs-operations( + $is-xml as xs:boolean, + $patch as element(rapi:patch), + $patch-content as map:map?, + $sjs-apply-array as json:array?, + $error-list as json:array?, + $matchdefs as map:map* +) as map:map? +{ + if (empty($matchdefs)) then () + else ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"apply-sjs-operations", + map:entry("matchdefs",$matchdefs) + ), + + let $result := xdmp:apply( + xdmp:function(xs:QName("applyOperations"), + "../models/document-model-update.sjs"), + + $is-xml, + + string($patch/rapi:replace-library/@at), + + json:to-array( + for $matchdef in $matchdefs + let $operation := map:get($matchdef,"operation") + let $fname-raw := $operation/@apply/string(.) + let $fname := + if ($fname-raw castable as xs:NMTOKEN) + then xs:NMTOKEN($fname-raw) + else docmodupd:push-error( + $error-list, "cannot apply empty JavaScript function: "||xdmp:quote($operation) + ) + return + if (empty($fname)) then () + else $matchdef + =>map:with("fname", $fname) + =>map:with("content", docmodupd:prepare-content( + $is-xml,$patch-content,$operation,true() + )) + ) + ) + return + if (not($result instance of json:array)) + then $result + else if (empty($error-list)) + then $result + else + for $i in 1 to json:array-size($result) + return json:array-push($error-list, $result[$i]) + ) +}; + +declare function docmodupd:node-delete-operation( + $is-xml as xs:boolean, + $error-list as json:array?, + $operation as element(), + $path as xs:string, + $temporal-collection as xs:string?, + $nodes as node()* +) as xs:int? +{ + if (docmodupd:skip-nodes($error-list,$operation,$path,$nodes)) then () + else ( + 1, + + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"node-delete-operation", + map:entry("operation",$operation)=>map:with("path",$path) + =>map:with("temporal-collection",$temporal-collection)=>map:with("nodes",$nodes) + ), + + for $node in $nodes + return + if (exists($temporal-collection)) + then temporal:node-delete($temporal-collection,$node) + else xdmp:node-delete($node) + ) +}; + +declare function docmodupd:node-replace-operation( + $is-xml as xs:boolean, + $patch-content as map:map?, + $xqy-function-map as map:map?, + $sjs-result-map as map:map?, + $error-list as json:array?, + $operation as element(), + $path as xs:string, + $temporal-collection as xs:string?, + $nodes as node()* +) as xs:int? +{ + if (docmodupd:skip-nodes($error-list,$operation,$path,$nodes)) then () + else ( + 1, + + for $node in $nodes + let $parent := $node/.. + let $addition := docmodupd:produce-content( + $is-xml,true(),$error-list,$patch-content,$xqy-function-map,$sjs-result-map,$parent,$node,$operation + ) + return ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"node-replace-operation", + map:entry("operation",$operation)=>map:with("path",$path) + =>map:with("temporal-collection",$temporal-collection) + =>map:with("node",$node)=>map:with("addition",$addition) + ), + + if (exists($temporal-collection)) + then temporal:node-replace($temporal-collection,$node,$addition) + else xdmp:node-replace($node,$addition) + ) + ) +}; + +declare function docmodupd:node-insert-before-operation( + $is-xml as xs:boolean, + $patch-content as map:map?, + $xqy-function-map as map:map?, + $sjs-result-map as map:map?, + $error-list as json:array?, + $operation as element(), + $path as xs:string, + $temporal-collection as xs:string?, + $nodes as node()* +) as xs:int? +{ + if (docmodupd:skip-nodes($error-list,$operation,$path,$nodes)) then () + else ( + 1, + + for $node in $nodes + for $addition in docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map,$sjs-result-map,$node/..,(),$operation + ) + return ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"node-insert-before-operation", + map:entry("operation",$operation)=>map:with("path",$path) + =>map:with("temporal-collection",$temporal-collection) + =>map:with("node",$node)=>map:with("addition",$addition) + ), + + if (exists($temporal-collection)) + then temporal:node-insert-before($temporal-collection,$node,$addition) + else xdmp:node-insert-before($node, $addition) + ) + ) +}; + +declare function docmodupd:node-insert-after-operation( + $is-xml as xs:boolean, + $patch-content as map:map?, + $xqy-function-map as map:map?, + $sjs-result-map as map:map?, + $error-list as json:array?, + $operation as element(), + $path as xs:string, + $temporal-collection as xs:string?, + $nodes as node()* +) as xs:int? +{ + if (docmodupd:skip-nodes($error-list,$operation,$path,$nodes)) then () + else ( + 1, + + for $node in $nodes + for $addition in docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map,$sjs-result-map,$node/..,(),$operation + ) + return ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"node-insert-after-operation", + map:entry("operation",$operation)=>map:with("path",$path) + =>map:with("temporal-collection",$temporal-collection) + =>map:with("node",$node)=>map:with("addition",$addition) + ), + + if (exists($temporal-collection)) + then temporal:node-insert-after($temporal-collection,$node,$addition) + else xdmp:node-insert-after($node,$addition) + ) + ) +}; + +declare function docmodupd:node-insert-last-child-operation( + $is-xml as xs:boolean, + $patch-content as map:map?, + $xqy-function-map as map:map?, + $sjs-result-map as map:map?, + $error-list as json:array?, + $operation as element(), + $path as xs:string, + $temporal-collection as xs:string?, + $nodes as node()* +) as xs:int? +{ + if (docmodupd:skip-nodes($error-list,$operation,$path,$nodes)) then () + else ( + 1, + + for $node in $nodes + return + if ($is-xml and $node instance of element()) then + for $addition in docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map,$sjs-result-map,$node,(),$operation + ) + return if (exists($temporal-collection)) + then temporal:node-insert-child($temporal-collection,$node,$addition) + else xdmp:node-insert-child($node,$addition) + else if (not($is-xml) and ($node instance of object-node() or + $node instance of array-node())) then + for $addition in docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map,$sjs-result-map,$node,(),$operation + ) + return ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"node-replace-insert-last-child", + map:entry("operation",$operation)=>map:with("path",$path) + =>map:with("temporal-collection",$temporal-collection) + =>map:with("node",$node)=>map:with("addition",$addition) + ), + + if (exists($temporal-collection)) + then temporal:node-insert-child($temporal-collection,$node,$addition) + else xdmp:node-insert-child($node,$addition) + ) + else docmodupd:push-error( + $error-list,"cannot insert last child for "||xdmp:node-kind($node)||" node: "|| + string($operation!(@original-context,@context)[1]) + ) + ) +}; + +declare function docmodupd:skip-nodes( + $error-list as json:array?, + $operation as element(), + $path as xs:string, + $nodes as node()* +) as xs:boolean +{ + let $node-count := count($nodes) + return + (: never skip 1 node, which is always a valid cardinality :) + if ($node-count eq 1) + then false() + else + let $cardinality := $operation/@cardinality ! string(.) + return + (: with permissive cardinality, skip if no nodes :) + if (empty($cardinality) or $cardinality eq "*") + then $node-count eq 0 + (: with invalid cardinality, skip with error :) + else if ( + ($cardinality ne "?" and $node-count eq 0) or + ($cardinality ne "+" and $node-count > 1) + ) then ( + docmodupd:push-error($error-list,concat( + "invalid cardinality of ",string($node-count), + " nodes for: ",$path + )), + true() + ) + (: with valid cardinality, skip if no nodes :) + else $node-count eq 0 +}; + +declare function docmodupd:apply-metadata-patch( + $document as document-node(), + $document-format as xs:string, + $patch as element(rapi:patch), + $patch-content as map:map?, + $xqy-function-map as map:map?, + $sjs-apply-array as json:array?, + $error-list as json:array? +) as item()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + let $is-xml := ($document-format eq "xml") + let $operations := $patch/(rapi:delete|rapi:replace|rapi:replace-insert|rapi:insert) + let $change-map := map:map() + let $insert-map := map:map() + let $sjs-result-map := () + let $expression := concat( + "let $sjs-local-map := ",docmodupd:sjs-apply-expression($sjs-apply-array), + "return ( ", + + "if (empty($sjs-local-map)) then () ", + "else xdmp:set($sjs-result-map,$sjs-local-map), ", + string-join(( + for $operation at $i in $operations + let $select-path := $operation/@select/string(.) + let $context-path := $operation/@context/string(.) + return + if (empty($select-path) and empty($context-path)) + then docmodupd:push-error( + $error-list,"operation without context or select path" + ) + else if (empty($context-path)) + then concat( + "docmodupd:match-operation(", + "$is-xml, $change-map, $error-list, ", + "subsequence($operations,",$i,",1), ", + "'",string-join(tokenize($select-path,"'"),"&apos;"),"', ", + $select-path, + ")" + ) + else if (empty($select-path)) + then concat( + "docmodupd:match-operation(", + "$is-xml, $insert-map, $error-list, ", + "subsequence($operations,",$i,",1), ", + "'",string-join(tokenize($context-path,"'"),"&apos;"),"', ", + $context-path, + ")" + ) + else concat( + "(let $select-nodes := ",$select-path, + " return ", + "if (exists($select-nodes)) ", + "then ", + "docmodupd:match-operation(", + "$is-xml, $change-map, $error-list, ", + "subsequence($operations,",$i,",1), ", + "'",string-join(tokenize($select-path,"'"),"&apos;"),"', ", + "$select-nodes", + ") ", + "else ", + "docmodupd:match-operation(", + "$is-xml, $insert-map, $error-list, ", + "subsequence($operations,",$i,",1), ", + "'",string-join(tokenize($context-path,"'"),"&apos;"),"', ", + $context-path, + "))" + ) + ),"|"), + " )") + let $ns-bindings := + if (not($is-xml)) then () + else + for $prefix in in-scope-prefixes($patch) + let $ns-uri := namespace-uri-for-prefix($prefix,$patch) + where $prefix ne "xml" + return + if ($ns-uri = ("http://marklogic.com/rest-api")) then () + else ($prefix, $ns-uri) + let $root-node := $document/node() + let $quality-node := + if ($is-xml) + then $root-node/rapi:quality + else $root-node/quality + let $category-nodes := try { + if (not($is-xml)) + then ($root-node/object-node()|$root-node/array-node()|$quality-node) + intersect $document/xdmp:value($expression)/( + ancestor-or-self::object-node()|ancestor-or-self::array-node()| + self::number-node() + ) + else $root-node/* intersect ( + if (empty($ns-bindings)) + then $document/xdmp:value($expression)/ancestor-or-self::* + else xdmp:with-namespaces( + $ns-bindings, + $document/xdmp:value($expression)/ancestor-or-self::* + ) + ) + } catch($e) { + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"apply-metadata-patch#catch", + map:entry("error-code",$e/error:code)=>map:with("expression",$expression) + =>map:with("ns-bindings",$ns-bindings), + map:entry("document",$document) + ), + + if ($e/error:code eq "XDMP-UNEXPECTED") + then error((), "RESTAPI-INVALIDCONTENT", + concat("Invalid metadata patch (maybe missing pathlang property?)")) + else xdmp:rethrow() + } + let $match-map := ($change-map + $insert-map) + return + if (empty($category-nodes)) then () + else if (not($is-xml)) then + let $root-map := json:object() + return ( + for $category-node in $category-nodes + let $is-quality := ($category-node is $quality-node) + let $category-name := string(node-name($category-node)) + let $is-object := (not($is-quality) and $category-node instance of object-node()) + let $new-category := + if ($is-quality) then () + else if ($is-object) + then json:object() + else json:array() + let $category-value := + if ($is-quality) then + let $quality-id := generate-id($category-node) + let $change-op := map:get($change-map,$quality-id) + return + if (exists(map:get($insert-map,$quality-id))) + then docmodupd:push-error($error-list,"cannot insert relative to document quality") + else if (empty($change-op)) then () + else if (exists($change-op/self::rapi:delete)) + then docmodupd:push-error($error-list,"cannot delete document quality") + else docmodupd:produce-content( + $is-xml,true(),$error-list,$patch-content,$xqy-function-map,$sjs-result-map, + $root-node,$category-node,$change-op + )!data(.) + else ( + for $child in $category-node/node() + let $child-id := generate-id($child) + return ( + if (not(map:contains($match-map,$child-id))) then + if (not($is-object)) + then json:array-push($new-category, data($child)) + else map:put($new-category, name($child), data($child)) + else ( + let $change-op := map:get($change-map,$child-id) + let $insert-ops := map:get($insert-map,$child-id) + return ( + if (exists($change-op)) then + if (exists($insert-ops)) + then docmodupd:push-error($error-list, + "cannot insert relative to changed node: "||xdmp:quote($child) + ) + else if (count($change-op) gt 1) + then docmodupd:push-error($error-list, + "cannot make multiple changes on node: "||xdmp:quote($child) + ) + else if (exists($change-op/self::rapi:delete)) + then () + else + let $replace-value := docmodupd:produce-content( + $is-xml,true(),$error-list,$patch-content,$xqy-function-map, + $sjs-result-map,$category-node,$child,$change-op + )!data(.) + return + if (empty($replace-value)) + then () + else if (not($is-object)) + then json:array-push($new-category, $replace-value) + else map:put($new-category, name($child), $replace-value) + else if (exists($insert-ops[empty(@position) or @position eq "last-child"])) + then docmodupd:push-error($error-list, + "cannot insert last child in metadata item: "||xdmp:quote($child) + ) + else + let $before := $insert-ops[@position eq "before"]/docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map, + $sjs-result-map,$category-node,(),. + ) + let $after := $insert-ops[@position eq "after"]/docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map, + $sjs-result-map,$category-node,(),. + ) + return + if (not($is-object)) then ( + for $before-value in $before!data(.) + return json:array-push($new-category, $before-value), + + json:array-push($new-category, data($child)), + + for $after-value in $after!data(.) + return json:array-push($new-category, $after-value) + ) + else + for $addition in ($before,$child,$after) + let $addition-name := name($addition) + return + if (empty($addition-name) or $addition-name eq "") + then docmodupd:push-error($error-list, + "can only a insert key values relative to: "||name($child) + ) + else map:put($new-category, $addition-name, $addition!data(.)) + ) + ) + ), + + let $append-ops := map:get($insert-map,generate-id($category-node)) + for $append-node in + if (exists($append-ops[empty(@position) or @position ne "last-child"])) + then docmodupd:push-error($error-list, + "cannot insert before or after metadata category: "||xdmp:quote($category-node) + ) + else $append-ops/docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map,$sjs-result-map, + $category-node,(),. + ) + let $append-value := $append-node!data(.) + let $append-name := + if (empty($append-value)) then () + else name($append-node) + return + if (empty($append-value)) then () + else if (not($is-object)) + then json:array-push($new-category, $append-value) + else if (empty($append-name)) + then docmodupd:push-error($error-list, + "can only append key values to "||$category-name + ) + else map:put($new-category, $append-name, $append-value), + + $new-category + ) + return + if (empty($category-value)) then () + else map:put($root-map, $category-name, $category-value), + + $root-map + ) + else element {node-name($root-node)} { + $root-node/@*, + for $category-node in $category-nodes + return + if ($category-node is $quality-node) then + let $quality-id := generate-id($category-node) + let $change-op := map:get($change-map,$quality-id) + return + if (exists(map:get($insert-map,$quality-id))) + then docmodupd:push-error($error-list,"cannot insert relative to document quality") + else if (empty($change-op)) then () + else if (exists($change-op/self::rapi:delete)) + then docmodupd:push-error($error-list,"cannot delete document quality") + else docmodupd:produce-content( + $is-xml,true(),$error-list,$patch-content,$xqy-function-map,$sjs-result-map, + $root-node,$category-node,$change-op + ) + else element {node-name($category-node)} { + $category-node/@*, + for $child in $category-node/node() + let $child-id := generate-id($child) + return ( + if (not(map:contains($match-map,$child-id))) + then $child + else ( + let $change-op := map:get($change-map,$child-id) + let $insert-ops := map:get($insert-map,$child-id) + return ( + if (exists($change-op)) then + if (exists($insert-ops)) + then docmodupd:push-error($error-list, + "cannot insert relative to changed node: "||xdmp:quote($child) + ) + else if (count($change-op) gt 1) + then docmodupd:push-error($error-list, + "cannot make multiple changes on node: "||xdmp:quote($child) + ) + else if (exists($change-op/self::rapi:delete)) + then () + else docmodupd:produce-content( + $is-xml,true(),$error-list,$patch-content,$xqy-function-map, + $sjs-result-map,$category-node,$child,$change-op + ) + else if (exists($insert-ops[empty(@position) or @position eq "last-child"])) + then docmodupd:push-error($error-list, + "cannot insert last child in metadata item: "||xdmp:quote($child) + ) + else ( + $insert-ops[@position eq "before"]/docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map, + $sjs-result-map,$category-node,(),. + ), + $child, + $insert-ops[@position eq "after"]/docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map, + $sjs-result-map,$category-node,(),. + ) + ) + ) + ) + ), + + let $append-ops := map:get($insert-map,generate-id($category-node)) + return + if (exists($append-ops[empty(@position) or @position ne "last-child"])) + then docmodupd:push-error($error-list, + "cannot insert before or after metadata category: "||xdmp:quote($category-node) + ) + else $append-ops/docmodupd:produce-content( + $is-xml,false(),$error-list,$patch-content,$xqy-function-map, + $sjs-result-map,$category-node,(),. + ) + } + } +}; + +declare private function docmodupd:sjs-apply-expression( + $sjs-apply-array as json:array? +) as xs:string +{ + if (empty($sjs-apply-array) or json:array-size($sjs-apply-array) eq 0) + then "() " + else concat( + "docmodupd:apply-sjs-operations(", + "$is-xml, $patch, $patch-content, $sjs-apply-array, $error-list, (", + + string-join( + for $sjs-apply-op at $i in json:array-values($sjs-apply-array) + let $replace-path := $sjs-apply-op/@select/string(.) + let $insert-path := + if ($sjs-apply-op instance of element(rapi:replace)) then () + else $sjs-apply-op/@context/string(.) + return + if (empty($replace-path)) then () + else concat( + "let $operation := $sjs-apply-array[",string($i),"] ", + "let $replace-path := '",string-join(tokenize($replace-path,"'"), "&apos;"),"'", + "let $matchdef := map:map()", + "=>map:with('operation', $operation)", + "=>map:with('replace-path', $replace-path) ", + "let $nodes := ",$replace-path," ", + "let $contexts := ", + if (empty($insert-path)) + then "()" + else concat("if (exists($nodes)) then () else ",$insert-path," "), + "return ", + "if (docmodupd:skip-nodes($error-list,$operation,$replace-path,$nodes)) then () ", + "else if (exists($nodes)) ", + "then $matchdef", + "=>map:with('nodes', json:to-array($nodes)) ", + "else if (exists($contexts)) ", + "then $matchdef", + "=>map:with('insert-path','", string-join(tokenize($insert-path,"'"), "&apos;"),"')", + "=>map:with('contexts', json:to-array($contexts)) ", + "else ()" + ), + ", " + ), + ")) " + ) +}; + +declare private function docmodupd:match-operation( + $is-xml as xs:boolean, + $map as map:map, + $error-list as json:array?, + $operation as element(), + $path as xs:string, + $nodes as node()* +) as node()* +{ + if (docmodupd:skip-nodes($error-list,$operation,$path,$nodes)) then () + else + for $node in $nodes + let $node-id := generate-id($node) + return ( + map:put($map, $node-id, (map:get($map,$node-id), $operation)), + + $node + ) +}; + +declare function docmodupd:make-apply-function-structs( + $patch as element(rapi:patch), + $error-list as json:array? +) as item()* +{ + let $applies := $patch/(rapi:replace|rapi:replace-insert)[exists(@apply)] + return + if (empty($applies)) then () + else + let $built-ns := "http://marklogic.com/rest-api/lib/replace-lib" + let $lib-def := $patch/rapi:replace-library + let $lib-at := $lib-def/@at/string(.) + let $lib-ns := $lib-def/@ns/string(.) + let $lib-type := + switch (count($lib-def)) + case 0 return () + case 1 return + if (empty($lib-ns)) + then "javascript" + else "xquery" + default return docmodupd:push-error( + $error-list, "multiple library declarations" + ) + let $xq-apply := map:map() + let $js-apply := + if (not($lib-type eq "javascript")) then () + else json:array() + return ( + for $apply in $applies + let $fname-raw := $apply/@apply/string(.) + let $fname := + if ($fname-raw castable as xs:NMTOKEN) + then xs:NMTOKEN($fname-raw) + else docmodupd:push-error( + $error-list, "cannot apply empty function name: "||xdmp:quote($apply) + ) + let $function := + if (empty($fname)) then () + else if (starts-with($fname,"ml.")) then + if ($fname = $replib:export) + then xdmp:function(QName($built-ns,$fname)) + else docmodupd:push-error( + $error-list, "not a built-in function: "||$fname + ) + else if (empty($lib-at)) + then docmodupd:push-error( + $error-list, "missing or incomplete library declaration for: "||$fname + ) + else if ($lib-type eq "javascript") then () + else xdmp:function(QName($lib-ns,$fname), $lib-at) + return + if (empty($fname)) then () + else if (exists($function)) + then map:put($xq-apply, $fname, $function) + else if ($lib-type eq "javascript") + then json:array-push($js-apply, $apply) + else docmodupd:push-error( + $error-list, "could not find function for: "||$fname + ), + + $xq-apply, + + if (empty($js-apply) or json:array-size($js-apply) eq 0) then () + else $js-apply + ) +}; + +declare private function docmodupd:node-insert-position( + $operation as element() +) as xs:string +{ + let $position := $operation/@position/string(.) + return + if (empty($position)) + then "last-child" + else $position +}; + +declare private function docmodupd:json-node-insert-position( + $operation as object-node() +) as xs:string +{ + let $position := $operation/position!string(.) + return + if (empty($position)) + then "last-child" + else $position +}; + +declare private function docmodupd:produce-content( + $is-xml as xs:boolean, + $is-replace as xs:boolean, + $error-list as json:array?, + $patch-content as map:map?, + $xqy-function-map as map:map?, + $sjs-result-map as map:map?, + $context as node()?, + $node as node()?, + $operation as element()? +) +{ + if (empty($operation)) then () + else + let $function-name := + if (empty($xqy-function-map)) then () + else + let $fname-raw := $operation/@apply/string(.) + return + if (not($fname-raw castable as xs:NMTOKEN)) then () + else xs:NMTOKEN($fname-raw) + let $function := + if (empty($function-name)) then () + else map:get($xqy-function-map,$function-name) + let $sjs-result := + if (empty($sjs-result-map) or exists($function)) then () + else if (exists($node)) + then map:get($sjs-result-map,generate-id($node)) + else if (exists($context)) + then map:get($sjs-result-map,generate-id($context)) + else () + let $content := + if (exists($sjs-result)) then () + else docmodupd:prepare-content($is-xml,$patch-content,$operation,exists($function)) + let $attribute := + if (not($is-xml) or exists($function) or exists($sjs-result)) then () + else $content/self::rapi:attribute-list/(@* except @xsi:type) + let $output := + if (exists($function)) + then xdmp:apply($function,$node,$content) + else if (exists($sjs-result)) + then $sjs-result + else if (exists($function-name)) + then error((),"RESTAPI-INVALIDREQ","produce function not found: "||$function-name) + else if (not($is-xml)) then + if ($is-replace) + then $content + else + typeswitch($context) + case object-node() return + typeswitch($node) + case array-node() return $content + case object-node() return + typeswitch($content) + case object-node() return $content/node() + default return $content + default return + typeswitch($content) + case object-node() return $content/node() + default return $content + default return $content + else if (exists($attribute)) + then $attribute + else if ($context instance of attribute() and exists($node)) + then docmodupd:push-error( + $error-list, + concat( + "attribute operation without attribute list: ", + $operation ! ( + if ($is-replace) + then (@original-select, @select )[1] + else (@original-context, @context )[1] + ) ! string(.) + ) + ) + else if (not($is-replace)) + then $content + else + typeswitch($node) + case attribute() return + attribute {node-name($node)} {string-join($content/string(.),'')} + case element() return + typeswitch($content) + case element(rapi:text) return $content/text() + case element() return $content + case text() return element {node-name($node)} {$node/@*, $content} + default return element {node-name($node)} {$node/@*} + default return $content + return + if (not($is-xml) and ( + $output instance of element() or + $output instance of attribute() or + $output instance of processing-instruction() or + $output instance of comment() + )) + then error((),"RESTAPI-INVALIDREQ", + head(($function-name,"patch"))||" returned XML to patch JSON") + else if ($is-xml and ( + $output instance of object-node() or + $output instance of array-node() or + $output instance of number-node() or + $output instance of boolean-node() or + $output instance of null-node() + )) + then error((),"RESTAPI-INVALIDREQ", + head(($function-name,"patch"))||" returned JSON to patch XML") + else $output +}; + +declare private function docmodupd:prepare-content( + $is-xml as xs:boolean, + $patch-content as map:map?, + $operation as element()?, + $is-apply-input as xs:boolean +) +{ + let $contentKey := + if (empty($patch-content)) then () + else $operation/@contentKey!string(.) + (: $patch-content has the original parsed content nodes for a JSON patch payload :) + let $content := + if (exists($contentKey)) + then map:get($patch-content,$contentKey) + else $operation/node() + return + if (not($is-apply-input)) + then $content + else if (not($is-xml)) then + for $item in ( + if ($content instance of array-node()) + then $content/node() + else $content + ) + let $value := $item/node("$value") + let $datatype := + if (empty($value)) then () + else $item/node("$datatype") + return + if (empty($value)) then + typeswitch($item) + case object-node() return $item + case array-node() return $item + default return data($item) + else if (empty($datatype)) + then data($value) + else replib:cast-value($datatype,data($value)) + else + let $content-elements := $content[. instance of element()] + return + if (exists($content-elements)) then + for $elem in $content-elements + return + if ($elem instance of element(rapi:value)) + then $elem/data(.) + else $elem + else if (count($content[. instance of text()]) eq 1) + then data($content/..) + else () +}; + +declare private function docmodupd:check-content-version( + $headers as map:map, + $uri as xs:string +) as empty-sequence() +{ + docmodupd:check-content-version($headers, $uri, docmodcom:get-update-policy()) +}; + +declare private function docmodupd:check-content-version( + $headers as map:map, + $uri as xs:string, + $update-policy as xs:string? +) as empty-sequence() +{ + docmodupd:check-content-version( + $headers, "if-match", $uri, $update-policy + ) +}; + +declare private function docmodupd:check-content-version( + $map as map:map, + $key as xs:string, + $uri as xs:string, + $update-policy as xs:string? +) as empty-sequence() +{ +(: TODO: + policy on error toleration and reporting (append to array)? + payload with per-uri timestamp + :) + if ($update-policy = ("merge-metadata","overwrite-metadata")) then () + else + let $if-match := docmodcom:get-etag($map,$key,$uri) + let $timestamp := xdmp:document-timestamp($uri) + return + (: document must have specified version or must exist with no version :) + if ($if-match gt 0 and ( + $if-match ne $timestamp or + (empty($timestamp) and not(doc-available($uri))) + )) + then error((), "RESTAPI-CONTENTWRONGVERSION", concat( + "uri ",$uri, + if (empty($timestamp)) then () + else concat(" has current version ",$timestamp," that"), + " doesn't match ", $key, ": ",$if-match + )) + (: document must not exist or etag must be optional and not exist :) + else if (exists($timestamp) and ( + $if-match eq 0 or + (empty($if-match) and $update-policy eq "version-required") + )) + then error((), "RESTAPI-CONTENTNOVERSION", "uri "|| $uri) + else if ($if-match lt 0) + then error((), "RESTAPI-CONTENTWRONGVERSION", concat( + "uri ",$uri, + if (empty($timestamp)) then () + else concat(" has current version ",$timestamp," that"), + " doesn't match ", $key, ": ",$if-match + )) + else () +}; + +declare function docmodupd:push-error( + $error-list as json:array?, + $error-msg as xs:string +) as empty-sequence() +{ + if (exists($error-list)) + then json:array-push($error-list,$error-msg) + else error((),"RESTAPI-INVALIDREQ",$error-msg) +}; + +(: + utility functions + :) +(: TODO: move to a cpf model? :) +declare function docmodupd:cpf-installed( +) as xs:boolean +{ + exists(docmodupd:cpf-config(xdmp:database())) +}; + +(: slightly refined from Apps/infostudio/models/cpf-model.xqy#cpf-config() :) +declare private function docmodupd:cpf-config( + $dbid as xs:unsignedLong +) as element()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + let $trigger-dbid := xdmp:triggers-database($dbid) + return + if ($trigger-dbid eq 0) then () + else xdmp:eval( + ' + import module namespace dom="http://marklogic.com/cpf/domains" + at "/MarkLogic/cpf/domains.xqy"; + + try{ + dom:configuration-get() + } + catch ($e) { + () (: Returning empty sequence to indicate that configuration does not exist :) + } + ', + (), + + {$trigger-dbid} + + ) +}; + +declare function docmodupd:write-bulk-documents( + $params as map:map, + $header-getter as function(*), + $body-getter as function(*) +) as element(rapi:document)* +{ + let $trans-name := map:get($params,"transform") + let $trans-params := + if (empty($trans-name)) then () + else tformod:extract-transform-params($params) + let $temporal-collection := map:get($params,"temporal-collection") + let $system-timestamp := + if (empty($temporal-collection)) then () + else map:get($params,"system-time") + return ( + if (empty($system-timestamp)) then () + else temporal:statement-set-system-time($system-timestamp), + + docmodupd:write-bulk-documents( + $header-getter,$body-getter,$trans-name,$trans-params, + docmodupd:get-forest-id(map:get($params,"forest-name")), + map:map(),(), + $temporal-collection + ) + ) +}; + +declare private function docmodupd:write-bulk-documents( + $header-getter as function(*), + $body-getter as function(*), + $trans-name as xs:string?, + $trans-params as map:map?, + $forest-id as xs:unsignedLong?, + $default-metadata as map:map, + $document-metadata as map:map?, + $temporal-collection as xs:string? +) (: NOTE: really return as element(rapi:document)* + but untyped for the sake of tail recursion optimization :) +{ + let $headers := $header-getter() + return + if (empty($headers)) then ( + if (empty($document-metadata)) then () + else + let $meta-uri := map:get($document-metadata, "uri") + return + if (empty($meta-uri)) then () + else ( + docmodupd:write-bulk-metadata($temporal-collection,$meta-uri,$document-metadata), + + + {$meta-uri} + metadata + + ) + ) + else + let $header-keys := map:keys($headers) + let $type-key := $header-keys[lower-case(.) eq "content-type"] + let $disposition-key := $header-keys[lower-case(.) eq "content-disposition"] + let $content-type := + if (empty($type-key)) then () + else head(dbut:tokenize-header(map:get($headers,$type-key))) + let $document-params := + if (empty($disposition-key)) then () + else docmodupd:disposition-map(map:get($headers,$disposition-key)) + let $categories := + if (empty($document-params)) then () + else head((map:get($document-params,"category"), "content")) + let $is-metadata := not($categories = "content") + let $curr-uri := + let $uri := + if (empty($document-params)) then () + else docmodupd:lock-uris(map:get($document-params,"uri")) + return + if (exists($uri)) + then $uri + else if ($is-metadata) then () + else docmodupd:make-document-uri($document-params) + let $content-type := + if (exists($content-type) or $is-metadata) + then $content-type + else eput:uri-content-type($curr-uri) + let $part-type := + if (empty($curr-uri)) + then "default-metadata" + else if ($is-metadata) + then "document-metadata" + else "document-content" + let $meta-uri := + if (empty($document-metadata)) then () + else map:get($document-metadata, "uri") + let $content-format := + if ($is-metadata) + then docmodcom:get-type-format($content-type) + else docmodupd:content-format( + $curr-uri, + $trans-name, + eput:uri-content-type($curr-uri) + [. ne "application/x-unknown-content-type"], + $content-type, + () + ) + let $repair := + if ($content-format ne "xml" or empty($document-params)) then () + else map:get($document-params,"repair") + let $extract := + if ($content-format ne "binary" or empty($document-params)) then () + else map:get($document-params,"extract") + let $body := $body-getter( + if (exists($repair)) + then "text" + else $content-format + ) + let $default-next := + if ($part-type ne "default-metadata") + then $default-metadata + else docmodupd:parse-metadata-map("DEFAULT",$content-type,$body) + let $document-next := + if ($part-type ne "document-metadata") then () + else docmodupd:parse-metadata-map($curr-uri,$content-type,$body) + let $metadata := + if ($part-type ne "document-content") then () + else if ($meta-uri eq $curr-uri) + then $document-metadata + else $default-metadata + return ( + if (empty($document-metadata) or $meta-uri eq $curr-uri) then () + else ( + docmodupd:write-bulk-metadata($temporal-collection,$meta-uri,$document-metadata), + + + {$meta-uri} + metadata + + ), + + if ($part-type ne "document-content") then () + else ( + (: TODO: policy on whether to report or throw errors :) + if (empty($document-params) or $is-metadata) then () + else docmodupd:check-content-version( + $document-params, + "versionId", + $curr-uri, + docmodcom:get-update-policy() + ), + + let $doc-input := + docmodupd:convert-document( + $curr-uri,$content-format,$content-type,$body,$repair + ) + let $trans-output := + if (empty($trans-name)) then () + else tformod:apply-transform( + $trans-name, eput:make-context($curr-uri,$content-type,$content-type), $trans-params, $doc-input + ) + let $trans-ctxt := + if (empty($trans-name)) then () + else map:get($trans-output,"context") + let $curr-doc := + if (empty($trans-name)) + then $doc-input + else map:get($trans-output,"result") + let $doc-uri := + if (empty($trans-name)) + then $curr-uri + else head((map:get($trans-ctxt,"uri"),$curr-uri)) + let $curr-type := + if (empty($trans-name)) + then $content-type + else head((map:get($trans-ctxt,"output-type"),$content-type)) + let $temporal-document-uri := map:get($document-params,"temporal-document") + let $version-uri := if (empty($temporal-document-uri)) then () else $doc-uri + let $doc-uri := if (empty($temporal-document-uri)) then $doc-uri else $temporal-document-uri + let $collections := map:get($metadata,"collections") + let $permissions := map:get($metadata,"permissions") + let $quality := map:get($metadata,"quality") + let $metadata-values := map:get($metadata,"metadata-values") + return ( + docmodupd:write-content( + $doc-uri, + $version-uri, + $curr-doc, + if (exists($collections)) then $collections + else xdmp:default-collections(), + $permissions, + $quality, + $metadata-values, + $forest-id, + $temporal-collection, + () + ), + + let $properties := map:get($metadata,"properties") + return + if (empty($properties)) then () + else docmodupd:write-properties($doc-uri,$properties), + + if (empty($extract)) then () + else docmodupd:extract-binary-metadata( + $doc-uri,$extract,$curr-type,$curr-doc, + $collections,(),$permissions,$quality,$metadata-values,$forest-id,true(), + $temporal-collection,() + ), + + + {$curr-uri} + metadata + content + {$curr-type} + + ) + ), + + docmodupd:write-bulk-documents( + $header-getter,$body-getter,$trans-name,$trans-params,$forest-id, + $default-next,$document-next,$temporal-collection + ) + ) +}; + +declare private function docmodupd:make-document-uri( + $params as map:map? +) as xs:string? +{ + if (empty($params)) then () + else + + let $extension-raw := map:get($params,"extension") + return + if (empty($extension-raw)) then () + else + + let $extension := + let $has-separator := starts-with(head($extension-raw),".") + let $extension-test := + if ($has-separator) + then substring($extension-raw,2) + else $extension-raw + return + if (matches($extension-test,"\W")) + then error((),"REST-INVALIDPARAM", + "Extension may contain only word characters after initial period: "|| + $extension-raw + ) + else if ($has-separator) + then $extension-raw + else concat(".", $extension-raw) + return docmodupd:lock-uris(concat( + map:get($params,"directory"), + string(xdmp:random()), + $extension + )) +}; + +declare private function docmodupd:detach-content( + $operation as object-node(), + $error-list as json:array? +) as node()? +{ + let $content := $operation/node("content") + return + switch(count($content)) + case 0 return () + case 1 return + typeswitch($content) + case array-node() return xdmp:to-json(data($content))/array-node() + case boolean-node() return boolean-node{data($content)} + case object-node() return xdmp:to-json(data($content))/object-node() + case number-node() return number-node{data($content)} + case null-node() return null-node{} + case text() return text{string($content)} + default return docmodupd:push-error($error-list, + "content type not supported for operation: "||xdmp:describe($content) + ) + default return + let $array := json:array() + return ( + for $node in $content + return json:array-push($array,$node), + + xdmp:to-json($array)/array-node() + ) +}; + +declare %private function docmodupd:temporal-options( + $temporal-collection as xs:string, + $uri as xs:string, + $collections as xs:string*, + $permissions as element(sec:permission)*, + $quality as xs:integer?, + $metadata-values as map:map? +) as element() +{ + let $ns := $temporal-insert-ns + return + element { QName($ns,"options")} { + + (: filter out collections maintained by temporal implementation :) + + let $collection-set := $collections[not(. = ($temporal-collection, "latest", $uri))] + return + if (empty($collection-set)) then () + else element {QName($ns,"collections")} { + for $collection in $collection-set + return element {QName($ns,"collection")} {$collection} + }, + + element {QName($ns,"permissions")} { + $permissions + }, + + if (empty($quality)) + then () + else element {QName($ns,"quality")} {$quality}, + + if (empty($metadata-values)) + then () + else element {QName($ns,"metadata")} { $metadata-values } + } + +}; + +declare private function docmodupd:write-bulk-metadata( + $temporal-collection as xs:string?, + $uri as xs:string, + $metadata as map:map +) as empty-sequence() +{ + let $properties := map:get($metadata,"properties") + return + if (empty($properties)) then () + else docmodupd:write-properties($uri,$properties), + + if (empty($temporal-collection)) then ( + docmodupd:write-collections($uri, (), map:get($metadata,"collections")), + docmodupd:write-permissions($uri, (), map:get($metadata,"permissions")), + docmodupd:write-quality($uri, (), map:get($metadata,"quality")), + docmodupd:write-metadata-values($uri, (), map:get($metadata,"metadata-values")) + ) + else + let $collections-specified := map:get($metadata,"collections") + let $permissions-specified := map:get($metadata,"permissions") + let $quality-specified := map:get($metadata,"quality") + let $metadata-values-specified := map:get($metadata,"metadata-values") + return + if (empty(( + $collections-specified,$permissions-specified,$quality-specified,$metadata-values-specified + ))) + then () + else + let $collections := + if (exists($collections-specified)) then $collections-specified + else xdmp:document-get-collections($uri) + let $permissions := + if (exists($permissions-specified)) then $permissions-specified + else xdmp:document-get-permissions($uri) + let $quality := + if (exists($quality-specified)) then $quality-specified + else xdmp:document-get-quality($uri) + let $metadata-values := + if (exists($metadata-values-specified)) then $metadata-values-specified + else xdmp:document-get-metadata($uri) + let $ns := $temporal-insert-ns + let $options := docmodupd:temporal-options( + $temporal-collection,$uri,$collections,$permissions,$quality,$metadata-values + ) + return ( + if ($is-untraced or docmodupd:check-untraced()) then () + else lid:log( + $docmodupd:trace-id,"write-bulk-metadata#temporal", + map:entry("temporal-collection",$temporal-collection) + =>map:with("uri",$uri)=>map:with("options",$options), + map:entry("doc",doc($uri)) + ), + + temporal:document-insert( + $temporal-collection,$uri,doc($uri),$options + ) + ) +}; + +declare private function docmodupd:parse-metadata-map( + $uri as xs:string, + $meta-type as xs:string, + $meta-doc as document-node()? +) as map:map? +{ + let $meta-format := + if ($meta-type = ("application/json","text/json")) + then "json" + else if ($meta-type = ("application/xml","text/xml")) + then "xml" + else error((),"RESTAPI-INVALIDMIMETYPE", concat( + "received metadata type ",$meta-type, + " instead of application/json or application/xml for ",$uri + )) + let $meta-parsed := docmodcom:parse-metadata($meta-format,$meta-doc) + let $collections := docmodcom:parse-collections($uri, $meta-parsed) + let $permissions := docmodcom:parse-permissions($uri, $meta-parsed) + let $properties := docmodcom:parse-properties($uri, $meta-parsed) + let $quality := docmodcom:parse-quality($uri, $meta-parsed) + let $metadata-values := docmodcom:parse-metadata-values($uri, $meta-parsed) + let $meta-map := map:map() + return ( + map:put($meta-map, "uri", $uri), + + if (empty($collections)) then () + else map:put($meta-map, "collections", $collections), + if (empty($permissions)) then () + else map:put($meta-map, "permissions", $permissions), + if (empty($properties)) then () + else map:put($meta-map, "properties", $properties), + if (empty($quality)) then () + else map:put($meta-map, "quality", $quality), + if (empty($metadata-values)) then () + else map:put($meta-map, "metadata-values", $metadata-values), + $meta-map + ) +}; + +declare function docmodupd:default-metadata-map( +) as map:map +{ + let $meta-map := map:map() + return ( + map:put($meta-map, "collections", xdmp:default-collections()), + map:put($meta-map, "permissions", xdmp:default-permissions()), + map:put($meta-map, "quality", 0), + + $meta-map + ) +}; + +declare function docmodupd:disposition-map( + $content-disposition as xs:string? +) as map:map? +{ + let $tokens := + if (empty($content-disposition) or string-length($content-disposition) eq 0) then () + else tokenize($content-disposition, ";") + let $params := + if (empty($tokens)) then() + else map:map() + return ( + if (empty($params)) then() + else docmodupd:collect-params($params, json:to-array($tokens), 1), + + $params + ) +}; +declare private function docmodupd:collect-params( + $params as map:map, + $tokens as json:array, + $next as xs:int +) (: untyped for tail recursion :) +{ + if ($next gt json:array-size($tokens)) then () + else + let $first := $tokens[$next] + let $pos := xdmp:position("=", $first) + let $name := normalize-space( + if ($pos eq 0) + then $first + else substring($first, 1, $pos - 1) + ) + return + if ($pos eq 0 and string-length($name) eq 0) + then docmodupd:collect-params($params, $tokens, $next + 1) + else + let $rawval := + if (string-length($name) eq 0) + then error((),"REST-INVALIDPARAM", concat( + "Could not determine name of param for content disposition: ", + string-join(json:array-values($tokens), ";") + )) + else if ($pos gt 0) + then substring($first, $pos + 1) + else if (not($name = ("attachment","inline"))) + then error((),"REST-INVALIDPARAM", concat( + $name," parameter without value for content disposition: ", + string-join(json:array-values($tokens), ";") + )) + else () + let $normval := + if ($pos eq 0) then () + else normalize-space($rawval) + let $is-quote := + if ($pos eq 0) + then false() + else if (string-length($normval) gt 0) + then starts-with($normval,'"') + else error((),"REST-INVALIDPARAM", concat( + $name," parameter with empty value for content disposition: ", + string-join(json:array-values($tokens), ";") + )) + let $is-apos := ($pos gt 0) and not($is-quote) and starts-with($normval,"'") + let $extratok := + (: reassemble a quoted string with one or more embedded semicolons :) + if ($pos eq 0) then () + else if ($is-quote) then + if (ends-with($normval,'"')) then () + else docmodupd:find-quote-end($tokens, $next + 1) + else if ($is-apos) then + if (ends-with($normval,"'")) then () + else docmodupd:find-apos-end($tokens, $next + 1) + else () + let $extracnt := count($extratok) + let $paramval := + if ($pos eq 0) then () + else if ($is-quote or $is-apos) then + let $delimitval := + if ($extracnt eq 0) + then $normval + else normalize-space(string-join(($rawval, $extratok), ";")) + (: remove preceding backslash on escapes :) + return replace( + (: strip leading and trailing delimiter :) + substring($delimitval, 2, string-length($delimitval) - 2), + "\\(\\|.)", + "$1" + ) + else $normval + return ( + switch($name) + case "attachment" return map:put($params, "type", "attachment") + case "inline" return map:put($params, "type", "inline") + case "filename" return map:put($params, "uri", $paramval) + case "temporal-document" return map:put($params, "temporal-document", $paramval) + default return map:put($params, $name, + (map:get($params,$name), $paramval) + ), + + docmodupd:collect-params($params, $tokens, $next + 1 + $extracnt) + ) +}; +declare private function docmodupd:find-quote-end( + $tokens as json:array, + $next as xs:int +) (: untyped for tail recursion :) +{ + if ($next le json:array-size($tokens)) then () + else error((),"REST-INVALIDPARAM", concat( + "Unclosed quote for content disposition: ", + string-join(json:array-values($tokens), ";") + )), + + let $val := $tokens[$next] + return ( + $val, + + (: found the end of the quoted string :) + if (matches($val, '^(\\.|[^"\\])*"\s*$')) then () + else docmodupd:find-quote-end($tokens, $next + 1) + ) +}; +declare private function docmodupd:find-apos-end( + $tokens as json:array, + $next as xs:int +) (: untyped for tail recursion :) +{ + if ($next le json:array-size($tokens)) then () + else error((),"REST-INVALIDPARAM", concat( + "Unclosed apostrophe quote for content disposition: ", + string-join(json:array-values($tokens), ";") + )), + + let $val := $tokens[$next] + return ( + $val, + + (: found the end of an apostrophe quoted string :) + if (matches($val, "^(\\.|[^'\\])*'\s*$")) then () + else docmodupd:find-apos-end($tokens, $next + 1) + ) +}; + +declare private function docmodupd:content-kind( + $uri as xs:string, + $env as map:map?, + $env-body as xs:boolean?, + $trans-name as xs:string?, + $is-multipart as xs:boolean, + $input-type as xs:string?, + $param-format as xs:string?, + $con-part-type as xs:string? +) as xs:string* +{ + let $uri-type := eput:uri-content-type($uri) + [. ne "application/x-unknown-content-type"] + let $content-type := + if ($env-body) + then map:get($env,"content-mimetype") + else + if (empty($trans-name) and exists($uri-type)) + then $uri-type + else if ($is-multipart and exists($con-part-type)) + then $con-part-type + else if (not($is-multipart) and exists($input-type)) + then $input-type + else if (exists($uri-type)) + then $uri-type + else "application/x-unknown-content-type" + return ( + $content-type, + + if ($env-body) + then map:get($env,"content-format") + else docmodupd:content-format($uri,$trans-name,$uri-type,$content-type,$param-format) + ) +}; + +declare private function docmodupd:content-format( + $uri as xs:string, + $trans-name as xs:string?, + $uri-type as xs:string?, + $content-type as xs:string?, + $param-format as xs:string? +) as xs:string? +{ + let $uri-format := + if (empty($uri-type)) then () + else docmodcom:get-uri-format($uri) + let $content-format := + if (empty($trans-name) and exists($uri-format)) + then $uri-format + else eput:content-type-format($content-type) + return + if (exists($content-format)) + then $content-format + else if (exists($uri-format)) + then $uri-format + else if (exists($param-format)) + then $param-format + else "binary" +}; + +declare private function docmodupd:lock-uris( + $uris as xs:string* +) as xs:string* +{ + if (empty($uris)) then () + else + for $uri in $uris + return xdmp:lock-for-update($uri), + $uris +}; + +declare function docmodupd:convert-protection-to-map( + $content as node() +) as map:map +{ + typeswitch($content) + case object-node() + return let $level := $content/level + let $duration := $content/duration + let $expireTime := $content/expireTime + let $archivePath := $content/archivePath + let $m := map:new() + return ( + if (exists($level)) then map:put($m,"level",$level) else (), + if (exists($duration)) then map:put($m,"duration",$duration) else (), + if (exists($expireTime)) then map:put($m,"expire-time",$expireTime) else (), + if (exists($archivePath)) then map:put($m,"archive-path",$archivePath) else (), + $m + ) + case element() + return let $level := $content/protect:level + let $duration := $content/protect:duration + let $expireTime := $content/protect:expire-time + let $archivePath := $content/protect:archive-path + let $m := map:new() + return ( + if (exists($level)) then map:put($m,"level",string-join($level/text(),'')) else (), + if (exists($duration)) then map:put($m,"duration",string-join($duration/text(),'')) else (), + if (exists($expireTime)) then map:put($m,"expire-time",string-join($expireTime/text(),'')) else (), + if (exists($archivePath)) then map:put($m,"archive-path",string-join($archivePath/text(),'')) else (), + $m + ) + default return error((),"RESTAPI-INVALIDCONTENT","Unrecognized content for protection description.") + +}; + +declare function docmodupd:post-protection( + $headers as map:map, + $params as map:map, + $env as map:map +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + eput:response-add-host-cookie($headers, $params, $env), + let $names := ("level:level","duration:duration","expireTime:expire-time","archivePath:archive-path") + let $content-type := head(dbut:tokenize-header(map:get($headers,"content-type"))) + let $format := + if ($content-type = ("application/json","text/json")) + then "json" + else if ($content-type = ("application/xml","text/xml")) + then "xml" + else if ($content-type = ("application/x-www-form-urlencoded")) + then "form" + else "parameters" + let $content := + if ($format = ("xml","json")) + then let $node := map:get($env,"body-getter")($format)/node() + return if (exists($node)) then docmodupd:convert-protection-to-map(map:get($env,"body-getter")($format)/node()) + else error((),"RESTAPI-INVALIDCONTENT", "Unable to parse content type " || $content-type) + else if ($format = "parameters") + then let $m := map:new() + return ( + for $k in $names + return map:put($m,substring-after($k,":"),map:get($params,substring-before($k,":"))), + $m + ) + else let $m := map:new() + let $_ := for $k in $names + let $v := xdmp:get-request-field(substring-before($k,":")) + return if (exists($v)) then map:put($m,substring-after($k,":"),$v) else () + return $m + let $_ := + if (exists(map:get($content,"duration")) and exists(map:get($content,"expireTime"))) + then error((),"RESTAPI-INVALIDCONTENT","The duration and expire time can not both be specified.") + else () + let $options := { + for $k in $names + let $name := substring-after($k,":") + let $v := map:get($content,$name) + return if (exists($v)) then element { "protect:" || $name } { $v } else () + } + let $responder as function(*)? := map:get($env,"responder") + return ( + docmodupd:document-protection(map:get($params,"temporal-collection"),map:get($params,"uri"),$options), + $responder($docmodupd:DOCUMENT_PROTECTED,"",(),(),(),(),(),()) + ) +}; + +declare function docmodupd:document-protection( + $temporal-collection as xs:string, + $uris as xs:string+, + $options as element(protect:options) +) as empty-sequence() +{ + for $uri in $uris + return temporal:document-protect($temporal-collection,$uri,$options) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/forest-info-model.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/forest-info-model.xqy new file mode 100644 index 0000000000..19cac19cc4 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/forest-info-model.xqy @@ -0,0 +1,135 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +(: This /v1/forestinfo endpoint is not public or documented. It is used by + : Data Movement SDK (DMSDK) QueryHostBatcher to know about forests associated + : with the database. DMSDK assigns each query to match results from just one + : forest so batches of matches can be efficiently manipulated direclty from + : one forest. + : + : This endpoint accepts the following parameter: + : database (String): the database for which to return forest info. If not + : specified, uses the app-server default database. + : + : This endpoint returns the following info about each forest attached to the + : current database: + : id (xs:unsignedLong): from xdmp:database-forests() - the MarkLogic Server + : numeric id for the forest + : name (String): from xdmp:forest-name() - the human-assigned forest name + : updatesAllowed (all, delete-only, read-only, or flash-backup): + : from xdmp:forest-updates-allowed() - (for future use since for now + : only queries are forest-specific) so we won't attempt writes if + : updates aren't allowed + : database (String): from xdmp:database-name() - since we often don't know + : what database is the default for the port + : host (String): from xdmp:host-name() - so we can target future requests to + : the correct host for the forest + : openReplicaHost (String): from xdmp:host-name(xdmp:forest-host( + : xdmp:forest-open-replica())) - only included when the open-replica is + : different than the normal forest so we can target future requests to + : the replica host for the forest + : requestHost (String) : from the request header - included if openReplicaHost is not + : present and the request host name of this request is using a different host + : name than the host name configured for this server. + : alternateHost (String): from $hostStatus/*:host-name/text() - included + : if openReplicaHost is not and (1) the request host name of this + : request is using a different host name than the host name configured + : for this server or (2) the forest host doesn't have an app server + : port on the same port as used for this request + : + : In the event that a host is down or does not have an http server configured + : on the same port as this request was made, this endpoint assigns an + : alternate (available) host for that forest. + :) +module namespace forestinfo="http://marklogic.com/rest-api/forestinfo"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $forestinfo:trace-id := "restapi.config.forests"; + +declare private variable $is-untraced := (); + +declare function forestinfo:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, lid:is-disabled($forestinfo:trace-id, ("restapi.config", "restapi"))), + + $is-untraced +}; + +declare function forestinfo:get-forest-info( + $params as map:map +) as json:array +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + let $forests := + for $forestId in xdmp:database-forests(xdmp:database()) + return json:object() + => map:with("id", $forestId) + => map:with("name", xdmp:forest-name($forestId)) + => map:with("updatesAllowed", xdmp:forest-updates-allowed($forestId)) + => map:with("database", xdmp:database-name(xdmp:database())) + => map:with("host", xdmp:host-name(xdmp:forest-host($forestId))) + let $hostStatuses := + for $hostId in xdmp:hosts() + return xdmp:host-status($hostId) + let $requestPort := xdmp:get-request-port() + let $availableHosts := + for $hostStatus in $hostStatuses + let $hasPort := $hostStatus/*:http-servers//*:port[.=$requestPort] + return + if (empty($hasPort)) then () + else $hostStatus/*:host-name/text() + let $response := json:array() + return ( + (: before we return the forest config, let's check for any hosts that are unavailable :) + for $forest in $forests + let $forestHost := map:get($forest, "host") + let $forestId := map:get($forest, "id") + let $forestHostId := xdmp:forest-host($forestId) + let $currentHostId := xdmp:host() + (: get the request host without the port information :) + let $requestHost := fn:replace(xdmp:get-request-header("Host"), ":\d+", "") + let $hostIsAvailable := ($forestHost = $availableHosts) + let $openReplica := xdmp:forest-open-replica($forestId) + let $openReplicaHost := + if ($forestId = $openReplica) then () + else xdmp:host-name(xdmp:forest-host($openReplica)) + return ( + if ( $openReplicaHost = $availableHosts ) + then + (: Send the open replica host since the normal host for this forest is down :) + map:put($forest, "openReplicaHost", $openReplicaHost) + else if ( $forestHostId = $currentHostId ) + then + if ( $forestHost != $requestHost ) + then ( + (: Use the hostname used for this request as it's obviously working, + : and sometimes the machine name may not be DNS resolvable. + : We are adding the request host name to both alternateHost and requestHost + : in order not to break the existing client API code :) + map:put($forest, "requestHost", $requestHost), + map:put($forest, "alternateHost", $requestHost) + ) + else () + else if ( $hostIsAvailable = false() and count($availableHosts) > 0 ) + then + (: This host doesn't have the required app server (perhaps it's a D-Node), + : so use a host that does. Base the choice on a mod of a hash of the + : forest name so the choice is random but consistent. :) + let $forestNameHash := xdmp:hash32(map:get($forest, "name")) + let $random := math:fmod($forestNameHash, count($availableHosts)) + 1 + let $randomAvailableHost := $availableHosts[$random] + return map:put($forest, "alternateHost", $randomAvailableHost) + else () + , + json:array-push($response, $forest) + ), + + $response + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/internal-uris-model.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/internal-uris-model.xqy new file mode 100644 index 0000000000..d1a51fb6af --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/internal-uris-model.xqy @@ -0,0 +1,141 @@ +xquery version "1.0-ml"; + +(: Copyright 2017-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace urimod = "http://marklogic.com/rest-api/models/uris-model"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace sut = "http://marklogic.com/rest-api/lib/search-util" + at "../lib/search-util.xqy"; + +import module namespace search = "http://marklogic.com/appservices/search" + at "/MarkLogic/appservices/search/search.xqy"; + +import module namespace ast = "http://marklogic.com/appservices/search-ast" + at "/MarkLogic/appservices/search/ast.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $urimod:trace-id := "restapi.documents.search"; + +declare private variable $is-untraced := (); + +declare function urimod:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($urimod:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +(: this endpoint is mostly for use with data movement sdk which will paginate through + : large result sets to get uris, so 1000 is really not a large default :) +declare private variable $DEFAULT_PAGE_LENGTH := 1000; + +declare function urimod:get( + $headers as map:map, + $params as map:map, + $env as map:map? +) as xs:string* +{ + eput:response-add-host-cookie($headers, $params, $env), + eput:to-uri-list(urimod:uris-impl($headers,$params,$env)) +}; + +declare function urimod:post( + $headers as map:map, + $params as map:map, + $env as map:map? +) as xs:string* +{ + eput:response-add-host-cookie($headers, $params, $env), + eput:to-uri-list(urimod:uris-impl($headers, $params, $env)) +}; + +declare private function urimod:uris-impl( + $headers as map:map, + $params as map:map, + $env as map:map? +) as xs:string* +{ + let $start := head((map:get($params,"start"), 1)) + let $pageLength := head((map:get($params,"pageLength"), $DEFAULT_PAGE_LENGTH)) + let $getter := map:get($env,"body-getter") + let $input := + if (empty($getter)) then () + else $getter(eput:get-content-format($headers,$params))/node() + let $combined-query := sut:make-combined-query($input) + let $q := head((map:get($params,"q"),"")) + let $options-parameter := map:get($params,"options")[. ne ""] + let $param-options := + if (empty($options-parameter)) then () + else sut:options($params) + let $combined-options := $combined-query/search:options + let $options := + if (exists($param-options) and exists($combined-options)) + then sut:merge-options($param-options,$combined-options,()) + else if (exists($param-options)) + then $param-options + else if (exists($combined-options)) + then $combined-options + else + let $structuredQuery := + if (exists($combined-query)) + then $combined-query/search:query + else if (exists($input)) + then sut:make-structured-query-node($input) + else sut:make-structured-query-node(map:get($params,"structuredQuery")) + let $sq := head(( + sut:make-structured-query($structuredQuery,$q,$options,$params), + + )) + let $ctsQuery := + typeswitch($sq) + case element(search:query) return + ast:cts-query(ast:to-query($sq,$options,true())) + default return + cts:query($sq) + let $forest-ids := + for $forest-name in map:get($params, "forest-name") + return xdmp:forest($forest-name) + let $isFiltered := head(( + for $search-option in $options//search:search-option + return + if ($search-option eq "filtered") + then true() + else if ($search-option eq "unfiltered") + then false() + else (), + false() + )) + return ( + if ($is-untraced or urimod:check-untraced()) then () + else lid:log( + $urimod:trace-id,"uris-impl", + map:entry("isFiltered",$isFiltered) + =>map:with("start",$start)=>map:with("pageLength",$pageLength) + =>map:with("query",$ctsQuery)=>map:with("forest-ids",$forest-ids) + ), + + if ($isFiltered) then + (: options and quality optimized for speed :) + for $doc in subsequence( + cts:search(collection(),$ctsQuery,("score-zero"),0,$forest-ids), + $start, + $pageLength + ) + return base-uri($doc) + else subsequence( + cts:uris((),("score-zero",concat("limit=", $start + $pageLength - 1)),$ctsQuery,0,$forest-ids), + $start, + $pageLength + ) + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/resource-model-common.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/resource-model-common.xqy new file mode 100644 index 0000000000..d9ebe5de64 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/resource-model-common.xqy @@ -0,0 +1,223 @@ +xquery version "1.0-ml"; + +(: Copyright 2012-2019 MarkLogic Corporation. All Rights Reserved. :) + +module namespace rsrcmodcom = "http://marklogic.com/rest-api/models/resource-model-common"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "../lib/extensions-util.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +declare namespace http = "xdmp:http"; +declare namespace multi = "xdmp:multipart"; +declare namespace rapi = "http://marklogic.com/rest-api"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $rsrcmodcom:resource-base-ns := "http://marklogic.com/rest-api/resource/"; + +declare function rsrcmodcom:make-context( + $headers as map:map, + $params as map:map +) as map:map +{ + let $input-type := map:get($headers,"content-type") + let $accept-types := map:get($headers,"accept") + let $tokenized-input-type := dbut:tokenize-header($input-type) + let $tokenized-accept-types := dbut:tokenize-header($accept-types) + let $first-accept-type := head($accept-types) + let $context := map:map() + return ( + if (empty($input-type)) then () + else if (not(matches($input-type,"^multipart/mixed;\s*boundary="))) + then map:put($context, "input-types", $tokenized-input-type) + else map:put($context, "input-boundary", replace( + substring-after($input-type,"boundary="), + '^\s*"([^"]+)"\s*$', "$1")), + if (empty($accept-types)) then () + else if (not(matches($first-accept-type,"^multipart/mixed;\s*boundary="))) + then map:put($context, "accept-types", $tokenized-accept-types) + else ( + map:put($context, "output-boundary", replace( + substring-after($first-accept-type,"boundary="), + '^\s*"([^"]+)"\s*$', "$1")), + map:put($context, "accept-types", $tokenized-accept-types) + ), + + $context + ) +}; + +declare function rsrcmodcom:make-resource-params( + $headers as map:map, + $endpoint-params as map:map +) as map:map +{ + let $resource-params := map:map() + return ( + for $key in map:keys($endpoint-params) + return + if (not(starts-with($key,"rs:"))) then () + else map:put( + $resource-params, + substring-after($key,"rs:"), + map:get($endpoint-params,$key) + ), + $resource-params + ) +}; + +declare function rsrcmodcom:collect-documents( + $resource-name as xs:string, + $method as xs:string, + $context as map:map, + $results as item()* +) as document-node()? +{ + let $result-count := count($results) + let $output-types := map:get($context,"output-types") + let $output-types := + let $types := map:get($context,"output-types") + return + if (exists($types) or empty($results)) + then $types + else + for $result in $results + return + if (xdmp:to-json($result)/object-node() or xdmp:to-json($result)/array-node()) + then "application/json" + else if (exists($result/element())) + then "application/xml" + else if (exists($result/text())) + then "text/plain" + else "application/x-unknown-content-type" + let $output-count := count($output-types) + let $boundary := + let $declared-boundary := map:get($context,"output-boundary") + return + if ($declared-boundary) + then $declared-boundary + else if ($result-count lt 2) then () + else concat($resource-name,"-get-result") + return ( + if ($result-count = $output-count) then () + else error((),"RESTAPI-INVALIDRESULT",concat( + $method," extension produced ",$result-count," results and ",$output-count, + " mime types: ",$resource-name + )), + + if (empty($boundary)) + then $results + else ( + if (empty($boundary)) + then $output-types + else map:put( + $context,"output-types",concat("multipart/mixed; boundary=",$boundary) + ), + + document { + xdmp:multipart-encode( + $boundary, + { + for $output-type in $output-types + return + + + {$output-type} + + + }, + $results + ) + } + ) + ) +}; + +declare function rsrcmodcom:get-service-defs( +) as map:map +{ + map:entry( "get", ("document-node()*", "map:map", "map:map")) + =>map:with("put", ("document-node()?", "map:map", "map:map", "document-node()*")) + =>map:with("post", ("document-node()*", "map:map", "map:map", "document-node()*")) + =>map:with("delete", ("document-node()?", "map:map", "map:map")) +}; + +declare function rsrcmodcom:extract-documents( + $context as map:map, + $input as document-node()? +) as document-node()* +{ + let $boundary := map:get($context,"input-boundary") + let $parts := + if (empty($boundary)) then () + else xdmp:multipart-decode($boundary,$input/node()) + let $input-types := + if (empty($parts)) then () + else subsequence($parts,1,1)/part/headers/Content-Type/( + dbut:tokenize-header(string(.))[1] + ) + return ( + if (empty($input-types)) then () + else map:put($context,"input-types",$input-types), + + if (empty($parts)) + then $input + else subsequence($parts,2) + ) +}; + +declare function rsrcmodcom:environment( + $plugin-name as xs:string, + $has-content as xs:boolean, + $response-type as xs:string?, + $response-status as xs:anyAtomicType*, + $response-headers as item()* +) as empty-sequence() +{ + if (empty($response-type)) then () + else xdmp:set-response-content-type($response-type), + + if (count($response-status) eq 2) + then xdmp:set-response-code(xs:int(head($response-status)), string(tail($response-status))) + else if (exists($response-status)) + then error((), "RESTAPI-INVALIDREQ", concat( + "invalid output status for ",$plugin-name,": ", + string-join($response-status!string(.),", ") + )) + else if ($has-content) + then xdmp:set-response-code(200,"OK") + else xdmp:set-response-code(204,"No Content"), + + if (empty($response-headers)) then () + else + let $header-count := count($response-headers) + return + if (($header-count mod 2) eq 0) then + for $i in 1 to ($header-count idiv 2) + let $pos := $i * 2 + return eput:add-response-header( + string(subsequence($response-headers, $pos - 1, 1)), + string(subsequence($response-headers, $pos, 1)) + ) + else if ($header-count eq 1 and $response-headers instance of map:map) then + for $key in map:keys($response-headers) + let $value := map:get($response-headers,$key) + return + if (count($value) eq 1) + then eput:add-response-header($key, string($value)) + else error((), "RESTAPI-INVALIDREQ", concat( + "invalid output header for ",$plugin-name,": ",$key, + " key has ",string-join($value!string(.),", ")," values" + )) + else error((), "RESTAPI-INVALIDREQ", concat( + "invalid output headers for ",$plugin-name,": ", + xdmp:quote($response-headers) + )) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/resource-model-query.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/resource-model-query.xqy new file mode 100644 index 0000000000..8cdd544a37 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/resource-model-query.xqy @@ -0,0 +1,290 @@ +xquery version "1.0-ml"; + +(: Copyright 2012-2019 MarkLogic Corporation. All Rights Reserved. :) + +module namespace rsrcmodqry = "http://marklogic.com/rest-api/models/resource-model-query"; + +import module namespace json="http://marklogic.com/xdmp/json" + at "/MarkLogic/json/json.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "../lib/extensions-util.xqy"; + +import module namespace transmod = "http://marklogic.com/rest-api/models/transaction-model" + at "../models/transaction-model.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +import module namespace rsrcmodcom = "http://marklogic.com/rest-api/models/resource-model-common" + at "../models/resource-model-common.xqy"; + +declare namespace rapi = "http://marklogic.com/rest-api"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $rsrcmodqry:RESOURCE_SERVICES_LISTED := "RESOURCE_SERVICES_LISTED"; +declare variable $rsrcmodqry:RESOURCE_SERVICES_RETRIEVED := "RESOURCE_SERVICES_RETRIEVED"; +declare variable $rsrcmodqry:RESOURCE_APPLIED := "RESOURCE_APPLIED"; + +declare variable $rsrcmodqry:RESOURCE_READ := "RESOURCE_READ"; + +declare variable $rsrcmodqry:trace-id := "restapi.extensions.resource"; + +declare private variable $is-untraced := (); + +declare function rsrcmodqry:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($rsrcmodqry:trace-id, ("restapi.extensions", "restapi")) + ), + + $is-untraced +}; + +declare variable $rsrcmodqry:transform-list-config := + let $config := json:config("custom") + return ( + map:put($config, "element-namespace", "http://marklogic.com/rest-api"), + map:put($config, "element-prefix", "rapi"), + map:put($config, "array-element-names", ("resource", "method", "parameter")), + $config + ); + +declare function rsrcmodqry:get-list( + $headers as map:map, + $params as map:map, + $responder as function(*)? +) as document-node() +{ + rsrcmodqry:list-sources( + dbut:get-request-format($headers,$params), + (map:get($params,"refresh"), true())[1], + $responder + ) +}; + +declare function rsrcmodqry:list-sources( + $format as xs:string?, + $responder as function(*)? +) as document-node() +{ + rsrcmodqry:list-sources($format,false(),$responder) +}; + +declare function rsrcmodqry:list-sources( + $format as xs:string?, + $refresh as xs:boolean, + $responder as function(*)? +) as document-node() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if (empty($responder)) then () + else $responder( + $rsrcmodqry:RESOURCE_SERVICES_LISTED, + if (empty($format) or $format = ("","xml")) + then "application/xml" + else if ($format eq "json") + then "application/json" + else error((), + "RESTAPI-INTERNALERROR", + concat("could not determine response type from ",$format) + ) + ), + + let $xml := + document { + { + for $resource-metadata in extut:list-extension-metadata( + "resource", rsrcmodcom:get-service-defs(), $refresh + )/rapi:resource-metadata + let $resource-name := $resource-metadata/rapi:name/string(.) + order by $resource-name + return + { + $resource-metadata ! *, + (: TODO: better way to get version :) + /v1/resources/{$resource-name} + } + } + } + return + if (empty($format) or $format = ("","xml")) + then $xml + else if ($format eq "json") + then document { + json:transform-to-json-string($xml,$rsrcmodqry:transform-list-config) + } + else error((),"RESTAPI-INVALIDMIMETYPE", + "mime type for resources list must be application/json or application/xml: "||$format + ) +}; + +declare function rsrcmodqry:get-item( + $headers as map:map, + $params as map:map, + $responder as function(*)? +) as document-node()? +{ + rsrcmodqry:get-source( + extut:get-extension-name("resource",$params), + $responder, + head(dbut:tokenize-header(map:get($headers,"accept"))[ + matches(.,"(xquery|javascript)$") + ]) + ) +}; + +declare function rsrcmodqry:get-source( + $resource-name as xs:string, + $responder as function(*)? +) as document-node()? +{ + rsrcmodqry:get-source($resource-name, $responder, "application/xquery") +}; + +declare function rsrcmodqry:get-source( + $resource-name as xs:string, + $responder as function(*)?, + $accept-type as xs:string? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + if (empty($responder)) then () + else $responder($rsrcmodqry:RESOURCE_SERVICES_RETRIEVED,$resource-name,$accept-type), + + extut:get-extension-source-document("resource",$resource-name,("javascript","xquery")) +}; + +declare function rsrcmodqry:exec-get( + $headers as map:map, + $endpoint-params as map:map, + $responder as function(*)? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + rsrcmodqry:resource-get( + extut:get-extension-name("resource",$endpoint-params), + rsrcmodcom:make-context($headers,$endpoint-params), + rsrcmodcom:make-resource-params($headers,$endpoint-params), + map:contains($endpoint-params,"txid"), + $responder + ) +}; + +declare function rsrcmodqry:resource-get( + $resource-name as xs:string, + $context as map:map, + $resource-params as map:map, + $in-txn as xs:boolean, + $responder as function(*)? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + let $service := + let $serv := extut:get-extension-function("resource",$resource-name,"get") + return + if (exists($serv)) + then $serv + else if (extut:extension-exists("resource",$resource-name)) + then error((),"RESTAPI-INVALIDREQ", + concat("could not find GET method for resource: ",$resource-name) + ) + else error((),"RESTAPI-INVALIDREQ", + concat("resource extension does not exist: ",$resource-name) + ) + let $output := extut:invoke-service( + $resource-name,"GET","query",$service,$context,$resource-params,(),$in-txn + ) + let $context := map:get($output,"context") + let $result := rsrcmodcom:collect-documents( + $resource-name,"GET",$context,map:get($output,"result") + ) + return ( + if (empty($responder)) then () + else $responder( + $rsrcmodqry:RESOURCE_READ, + $resource-name, + exists($result), + map:get($context,"output-types"), + map:get($context,"output-status"), + map:get($context,"output-headers") + ), + + $result + ) +}; + +declare function rsrcmodqry:exec-post( + $headers as map:map, + $endpoint-params as map:map, + $input as document-node()?, + $responder as function(*)? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + rsrcmodqry:resource-post( + extut:get-extension-name("resource",$endpoint-params), + rsrcmodcom:make-context($headers,$endpoint-params), + rsrcmodcom:make-resource-params($headers,$endpoint-params), + $input, + map:contains($endpoint-params,"txid"), + $responder + ) +}; + +declare function rsrcmodqry:resource-post( + $resource-name as xs:string, + $context as map:map, + $resource-params as map:map, + $input as document-node()?, + $in-txn as xs:boolean, + $responder as function(*)? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + let $service := + let $serv := extut:get-extension-function("resource",$resource-name,"post") + return + if (exists($serv)) + then $serv + else if (extut:extension-exists("resource",$resource-name)) + then error((),"RESTAPI-INVALIDREQ", + concat("could not find POST method for resource: ",$resource-name) + ) + else error((),"RESTAPI-INVALIDREQ", + concat("resource extension does not exist: ",$resource-name) + ) + let $output := extut:invoke-service( + $resource-name,"POST","query",$service,$context,$resource-params, + rsrcmodcom:extract-documents($context,$input),$in-txn + ) + let $context := map:get($output,"context") + let $result := rsrcmodcom:collect-documents( + "POST",$resource-name,$context,map:get($output,"result") + ) + return ( + if (empty($responder)) then () + else $responder( + $rsrcmodqry:RESOURCE_APPLIED, + $resource-name, + exists($result), + map:get($context,"output-types"), + map:get($context,"output-status"), + map:get($context,"output-headers") + ), + + $result + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/resource-model-update.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/resource-model-update.xqy new file mode 100644 index 0000000000..cc42e6f52f --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/resource-model-update.xqy @@ -0,0 +1,321 @@ +xquery version "1.0-ml"; + +(: Copyright 2012-2019 MarkLogic Corporation. All Rights Reserved. :) + +module namespace rsrcmodupd = "http://marklogic.com/rest-api/models/resource-model-update"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "../lib/extensions-util.xqy"; + +import module namespace transmod = "http://marklogic.com/rest-api/models/transaction-model" + at "../models/transaction-model.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +import module namespace rsrcmodcom = "http://marklogic.com/rest-api/models/resource-model-common" + at "../models/resource-model-common.xqy"; + +declare namespace rapi = "http://marklogic.com/rest-api"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $rsrcmodupd:trace-id := "restapi.extensions.resource"; + +declare private variable $is-untraced := (); + +declare function rsrcmodupd:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($rsrcmodupd:trace-id, ("restapi.extensions", "restapi")) + ), + + $is-untraced +}; + +declare variable $rsrcmodupd:RESOURCE_SERVICES_CREATED := "RESOURCE_SERVICES_CREATED"; +declare variable $rsrcmodupd:RESOURCE_SERVICES_UPDATED := "RESOURCE_SERVICES_UPDATED"; +declare variable $rsrcmodupd:RESOURCE_SERVICES_DELETED := "RESOURCE_SERVICES_DELETED"; + +declare variable $rsrcmodupd:RESOURCE_WRITTEN := "RESOURCE_WRITTEN"; +declare variable $rsrcmodupd:RESOURCE_DELETED := "RESOURCE_DELETED"; + +declare function rsrcmodupd:put-item( + $headers as map:map, + $params as map:map, + $document as document-node(), + $responder as function(*)? +) as xs:boolean +{ + let $content-type := eput:get-inbound-content-type($params,$headers) + let $method-list := ("delete", "get", "post", "put") + let $method-params := + let $map := map:map() + return ( + for $method in map:get($params,"method")[. = $method-list] + return map:put($map,$method,map:map()), + $map + ) + let $methods := ( + (: collect the parameters for each method :) + for $key in map:keys($params)[contains(.,":")] + let $method := substring-before($key,":") + return + if (not($method = $method-list)) then () + else + let $method-map := + let $map := map:get($method-params,$method) + return + if (exists($map)) + then $map + else + let $m := map:map() + return ( + map:put($method-params, $method, $m), + $m + ) + let $method-param := substring($key, string-length($method) + 2)[. ne ""] + return + if (empty($method-param)) then () + else map:put( + $method-map, + $method-param, + (map:get($method-map,$method-param), map:get($params,$key)) + ), + + map:keys($method-params) + ) + return ( + rsrcmodupd:put-source( + extut:get-extension-name("resource",$params), + map:get($params,"title"), + map:get($params,"version"), + map:get($params,"provider"), + map:get($params,"description"), + $params, + $methods, + $method-params, + $content-type, + $document, + $responder + ) + ) +}; + + +declare function rsrcmodupd:put-source( + $resource-name as xs:string, + $title as xs:string?, + $version as xs:string?, + $provider as xs:string?, + $description as xs:string?, + $params as map:map, + $methods as xs:string*, + $method-params as map:map, + $content-type as xs:string?, + $document as document-node(), + $responder as function(*)? +) as xs:boolean +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + if (empty($content-type) or + $content-type = ("application/xquery","application/vnd.marklogic-xdmp", + "application/javascript", "application/vnd.marklogic-javascript") ) + then () + else error((),"RESTAPI-INVALIDMIMETYPE", + "mime type must be application/javascript, application/vnd.marklogic-javascript, application/xquery or application/vnd.marklogic-xdmp: "||$content-type||" for "|| + $resource-name + ), + + if (empty($responder)) then () + else $responder( + if (extut:extension-exists("resource",$resource-name)) + then $rsrcmodupd:RESOURCE_SERVICES_UPDATED + else $rsrcmodupd:RESOURCE_SERVICES_CREATED, + $resource-name, + () + ), + + let $service-defs := rsrcmodcom:get-service-defs() + let $metadata := ( + if (empty($title)) then () else {$title}, + if (empty($version)) then () else {$version}, + if (empty($provider)) then () else {$provider}, + if (empty($description)) then () else {$description}, + { + for $method in $methods + return + { + {$method}, + let $method-map := map:get($method-params,$method) + for $key in map:keys($method-map) + return + + {$key} + {map:get($method-map,$key)} + + } + } + ) + let $source-format := + if (contains($content-type, "javascript")) + then "javascript" + else "xquery" + return extut:install-extension( + "resource",$service-defs,$resource-name,$metadata,$source-format,$document + ) +}; + +declare function rsrcmodupd:delete-item( + $headers as map:map, + $params as map:map, + $responder as function(*)? +) as empty-sequence() +{ + rsrcmodupd:delete-source( + extut:get-extension-name("resource",$params),$params,$responder + ) +}; + +declare private function rsrcmodupd:delete-source( + $resource-name as xs:string, + $params as map:map, + $responder as function(*)? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + if (empty($responder)) then () + else $responder($rsrcmodupd:RESOURCE_SERVICES_DELETED,$resource-name,()), + + extut:uninstall-extension("resource",$resource-name,map:get($params,"check")) +}; + +declare function rsrcmodupd:exec-put( + $headers as map:map, + $endpoint-params as map:map, + $input as document-node()?, + $responder as function(*)? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + rsrcmodupd:resource-put( + extut:get-extension-name("resource",$endpoint-params), + rsrcmodcom:make-context($headers,$endpoint-params), + rsrcmodcom:make-resource-params($headers,$endpoint-params), + $input, + map:contains($endpoint-params,"txid"), + $responder + ) +}; + +declare function rsrcmodupd:resource-put( + $resource-name as xs:string, + $context as map:map, + $resource-params as map:map, + $input as document-node()?, + $in-txn as xs:boolean, + $responder as function(*)? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + let $service := + let $serv := extut:get-extension-function("resource",$resource-name,"put") + return + if (exists($serv)) + then $serv + else if (extut:extension-exists("resource",$resource-name)) + then error((),"RESTAPI-INVALIDREQ", + concat("could not find PUT method for resource: ",$resource-name) + ) + else error((),"RESTAPI-INVALIDREQ", + concat("resource extension does not exist: ",$resource-name) + ) + let $output := extut:invoke-service( + $resource-name,"PUT","update",$service,$context,$resource-params, + rsrcmodcom:extract-documents($context,$input), + $in-txn + ) + let $result := map:get($output,"result") + let $context := map:get($output,"context") + return ( + if (empty($responder)) then () + else $responder( + $rsrcmodupd:RESOURCE_WRITTEN, + $resource-name, + exists($result), + map:get($context,"output-types"), + map:get($context,"output-status"), + map:get($context,"output-headers") + ), + + $result + ) +}; + +declare function rsrcmodupd:exec-delete( + $headers as map:map, + $endpoint-params as map:map, + $responder as function(*)? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + rsrcmodupd:resource-delete( + extut:get-extension-name("resource",$endpoint-params), + rsrcmodcom:make-context($headers,$endpoint-params), + rsrcmodcom:make-resource-params($headers,$endpoint-params), + map:contains($endpoint-params,"txid"), + $responder + ) +}; + +declare function rsrcmodupd:resource-delete( + $resource-name as xs:string, + $context as map:map, + $resource-params as map:map, + $in-txn as xs:boolean, + $responder as function(*)? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + let $service := + let $serv := extut:get-extension-function("resource",$resource-name,"delete") + return + if (exists($serv)) + then $serv + else if (extut:extension-exists("resource",$resource-name)) + then error((),"RESTAPI-INVALIDREQ", + concat("could not find DELETE method for resource: ",$resource-name) + ) + else error((),"RESTAPI-INVALIDREQ", + concat("resource extension does not exist: ",$resource-name) + ) + let $output := extut:invoke-service( + $resource-name,"DELETE","update",$service,$context,$resource-params,(),$in-txn + ) + let $result := map:get($output,"result") + let $context := map:get($output,"context") + return ( + if (empty($responder)) then () + else $responder( + $rsrcmodupd:RESOURCE_DELETED, + $resource-name, + exists($result), + map:get($context,"output-types"), + map:get($context,"output-status"), + map:get($context,"output-headers") + ), + + $result + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/search-model-query.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/search-model-query.xqy new file mode 100644 index 0000000000..5e54d4b930 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/search-model-query.xqy @@ -0,0 +1,308 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace searchmodq = "http://marklogic.com/rest-api/models/search-model-query"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +import module namespace search = "http://marklogic.com/appservices/search" + at "/MarkLogic/appservices/search/search.xqy"; + +import module namespace sut = "http://marklogic.com/rest-api/lib/search-util" + at "../lib/search-util.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace docmodcom = "http://marklogic.com/rest-api/models/document-model-common" + at "../models/document-model-common.xqy"; + +import module namespace transmod = "http://marklogic.com/rest-api/models/transaction-model" + at "transaction-model.xqy"; + +import module namespace search-impl = "http://marklogic.com/appservices/search-impl" + at "/MarkLogic/appservices/search/search-impl.xqy"; + +(: Warning: this implementation import is for debugging output :) +import module namespace ast = "http://marklogic.com/appservices/search-ast" + at "/MarkLogic/appservices/search/ast.xqy"; + +declare namespace http = "xdmp:http"; +declare namespace json-basic = "http://marklogic.com/xdmp/json/basic"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $searchmodq:trace-id := "restapi.documents.search"; + +declare private variable $is-untraced := (); + +declare function searchmodq:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($searchmodq:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +(: entry point for GET on /search; invokes for transaction if id supplied :) +declare function searchmodq:search-get( + $headers as map:map, + $params as map:map, + $env as map:map? +) as item()? +{ + eput:response-add-host-cookie($headers, $params, $env), + if (starts-with(head(map:get($headers,"accept")),"multipart/mixed")) + then + let $options := sut:options($params) + let $structured-query := searchmodq:make-query($params,$options) + return searchmodq:get-bulk-results($headers,$params,$env,$structured-query,$options) + else searchmodq:get-response( + searchmodq:resolve-search-get($params),$headers,$params,$env + ) +}; + +(: entry point for POST on /search; invokes for transaction if id supplied :) +declare function searchmodq:search-post( + $headers as map:map, + $params as map:map, + $env as map:map?, + $input as document-node()? +) as item()? +{ + eput:response-add-host-cookie($headers, $params, $env), + if (starts-with(head(map:get($headers,"accept")),"multipart/mixed")) then + let $combined-query := sut:make-combined-query($input/node()) + let $options := sut:make-options($params,$combined-query) + let $structured-query := searchmodq:make-query($params,$input/node(),$combined-query,$options) + return searchmodq:get-bulk-results($headers,$params,$env,$structured-query,$options) + else searchmodq:get-response( + searchmodq:resolve-search-post($headers,$params,$input/node()), + $headers, + $params, + $env + ) +}; + +(: resolve query and options for /search :) +declare function searchmodq:resolve-search-get( + $params as map:map +) as element(search:response) +{ + let $options := sut:options($params) + let $structured-query := searchmodq:make-query($params,$options) + return searchmodq:resolve($structured-query,$options,$params) +}; + +(: resolve query and options for /search :) +declare function searchmodq:resolve-search-post( + $headers as map:map, + $params as map:map, + $input as node()? +) as element(search:response) +{ + let $combined-query := sut:make-combined-query($input) + let $options := sut:make-options($params,$combined-query) + let $structured-query := searchmodq:make-query($params,$input,$combined-query,$options) + return searchmodq:resolve($structured-query,$options,$params) +}; + +declare function searchmodq:make-query( + $params as map:map, + $options as element(search:options) +) as element() +{ + let $q := head((map:get($params,"q"), "")) + return searchmodq:make-structured-query($params,$options,$q) +}; + +declare function searchmodq:make-query( + $params as map:map, + $input as node()?, + $combined-query as element(search:search)?, + $options as element(search:options) +) as element() +{ + let $q := head((map:get($params,"q"), "")) + let $structuredQuery := + if (exists($combined-query/(* except (search:qtext|search:options|search:sparql)))) + then $combined-query + else sut:make-structured-query-node($input) + return head(( + sut:make-structured-query($structuredQuery, $q, $options, $params), + + )) +}; + + +(: Do the search once options and query are resolved :) +declare function searchmodq:resolve( + $query as element(), + $options as element(search:options), + $params as map:map +) as element(search:response) +{ + let $start := map:get($params,"start") + let $page-length := map:get($params,"pageLength") + return ( + if ($is-untraced or searchmodq:check-untraced()) then () + else lid:log( + $searchmodq:trace-id,"resolve", + map:entry("query",$query) + =>map:with("options",$options) + =>map:with("params",$params) + ), + + search:resolve($query,$options,$start,$page-length) + ) +}; + +declare function searchmodq:get-bulk-results( + $headers as map:map, + $params as map:map, + $env as map:map?, + $query as element()?, + $options as element(search:options) +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if ($is-untraced or searchmodq:check-untraced()) then () + else lid:log($searchmodq:trace-id,"get-bulk-results", + map:entry("query",$query)=>map:with("options",$options) + =>map:with("headers",$headers)=>map:with("params",$params) + ), + + let $boundary := docmodcom:get-multipart-boundary(map:get($headers,"accept")) + let $metadata-format := head((map:get($params,"format"), "xml")) + let $metadata-type := eput:get-format-type($metadata-format) + let $categories := docmodcom:select-category($params) + let $view := head((map:get($params,"view"), "none")) + let $start := head((map:get($params,"start"), 1)) + let $page-length := head((map:get($params,"pageLength"), 10)) + + (: start unbundled search implementation :) + let $querydef := search-impl:prepare-querydef( + (),$options,$query,$start,$page-length,false(),() + ) + let $docs := + try { + search-impl:apply-search($querydef) + } catch ($e) { + if ($e/error:code eq "XDMP-EXPNTREECACHEFULL") + then error((), "RESTAPI-INVALIDREQ", + "Caused XDMP-EXPNTREECACHEFULL failure -- search with smaller page length" + ) + else xdmp:rethrow() + } + let $results := + if (empty($docs[not(. instance of document-node())])) + then search-impl:extract-paths($querydef, $docs) + else error((),"RESTAPI-INVALIDREQ", + "searchable expression for bulk document read must qualify documents") + let $uris := + for $doc in $docs + return document-uri($doc) + let $estimate := search-impl:do-result-estimate($querydef,true(),$docs) + let $timestamp := ast:get-annotations($querydef)/@timestamp + let $response := + if ($view = "none") then () + else document { + map:put($querydef,"extract-inline",false()), + searchmodq:get-response( + search-impl:do-response($querydef,$docs,$estimate), + $headers,$params,$env,$metadata-type,false() + ) + } + (: end unbundled search implementation :) + + let $response-header := + if (empty($response)) then () + else + + {$metadata-type} + inline + + let $extracted := head($options/search:extract-document-data)/@selected/string(.) + let $trans-name := + if (not($categories = "content")) then () + else map:get($params,"transform") + return ( + eput:call-response-type($env, concat("multipart/mixed; boundary=",$boundary)), + eput:call-header($env, "vnd.marklogic.start", string($start)), + eput:call-header($env, "vnd.marklogic.pageLength", string($page-length)), + if (empty($estimate)) then () + else + (eput:call-header($env, "vnd.marklogic.result-estimate", string($estimate)), + if ($estimate eq 0) then () + else map:put($env, "has-matches", true()) + ), + if (empty($timestamp)) then () + else eput:call-header($env, "vnd.marklogic.lsqt-query-timestamp", string($timestamp)), + if (empty($extracted)) then () + else eput:call-header($env, "vnd.marklogic.extract-document-data", $extracted), + if (empty($trans-name)) then () + else eput:call-header($env, "vnd.marklogic.document-transform", $trans-name), + + docmodcom:bulk-read-documents( + $params,$boundary,$categories,$metadata-format,$uris,$results,$response-header,$response + ) + ) +}; + +(: Create the final response :) +declare function searchmodq:get-response( + $response as element(), + $headers as map:map, + $params as map:map, + $env as map:map? +) as item()? +{ + searchmodq:get-response( + $response, $headers, $params, $env, eput:get-content-type($params,$headers), true() + ) +}; + +declare function searchmodq:get-response( + $response as element(), + $headers as map:map, + $params as map:map, + $env as map:map?, + $content-type as xs:string?, + $notify-type as xs:boolean +) as item()? +{ + let $response := + if ($content-type = ("application/json", "text/json")) then + let $root := + if ($response instance of document-node()) + then $response/* + else $response + return + if ($root instance of element(search:response)) + then sut:response-to-json-object( + $root, (map:get($params,"view"),"results")[1] + ) + else $response + else $response + return + eput:transform-response($response,$content-type,$headers,$params,$env,(),$notify-type) +}; + +declare private function searchmodq:make-structured-query( + $params as map:map, + $options as element(search:options), + $q as xs:string+ +) as element() +{ + let $structuredQuery := + sut:make-structured-query-node(map:get($params,"structuredQuery")) + return head(( + sut:make-structured-query($structuredQuery,$q,$options,$params), + + )) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/search-model-update.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/search-model-update.xqy new file mode 100644 index 0000000000..f22759919e --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/search-model-update.xqy @@ -0,0 +1,80 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace searchmodu = "http://marklogic.com/rest-api/models/search-model-update"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +import module namespace sut = "http://marklogic.com/rest-api/lib/search-util" + at "../lib/search-util.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "../lib/endpoint-util.xqy"; + +import module namespace transmod = "http://marklogic.com/rest-api/models/transaction-model" + at "transaction-model.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $searchmodu:trace-id := "restapi.documents.search"; + +declare private variable $is-untraced := (); + +declare function searchmodu:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($searchmodu:trace-id, ("restapi.documents", "restapi")) + ), + + $is-untraced +}; + +(: entry point for DELETE on search :) +declare function searchmodu:search-delete( + $headers as map:map, + $params as map:map, + $env as map:map +) as document-node()? +{ + eput:response-add-host-cookie($headers, $params, $env), + searchmodu:delete($params) +}; + +declare function searchmodu:delete( + $params as map:map +) as empty-sequence() +{ + let $collection := map:get($params,"collection") + let $directory := map:get($params,"directory") + return ( + if ($is-untraced or searchmodu:check-untraced()) then () + else lid:log($searchmodu:trace-id,"delete",map:entry("params",$params)), + + if (exists($collection) and exists($directory)) + then error((),"REST-INVALIDPARAM","supplying both 'collection' and 'directory' parameters is not allowed") + else if ($collection eq "") + then error((),"REST-INVALIDPARAM","an empty 'collection' parameter is not allowed") + else if ($directory eq "") + then error((),"REST-INVALIDPARAM","an empty 'directory' parameter is not allowed") + else if (exists($collection)) + then xdmp:collection-delete($collection) + else if (exists($directory)) + then xdmp:directory-delete($directory) + else if (xdmp:has-privilege("http://marklogic.com/xdmp/privileges/rest-admin", "execute")) + then searchmodu:clear() + else error((),"REST-INVALIDPARAM", + "either the 'collection' or 'directory' parameter and the rest-writer role or the rest-admin role is required" + ) + ) +}; + +declare function searchmodu:clear() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + for $forest in xdmp:database-forests(xdmp:database()) (: not setting replicas flag :) + return xdmp:forest-clear($forest) +}; + diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/transaction-model.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/transaction-model.xqy new file mode 100644 index 0000000000..e41e239f74 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/transaction-model.xqy @@ -0,0 +1,269 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace transmod = "http://marklogic.com/rest-api/models/transaction-model"; + +import module namespace mout = "http://marklogic.com/manage/lib/model-util" + at "/MarkLogic/manage/lib/model-util.xqy"; + +import module namespace dmod="http://marklogic.com/manage/database" + at "/MarkLogic/manage/models/database-model.xqy"; + +import module namespace fmod="http://marklogic.com/manage/forest" + at "/MarkLogic/manage/models/forest-model.xqy"; + +import module namespace hmod="http://marklogic.com/manage/host" + at "/MarkLogic/manage/models/host-model.xqy"; + +import module namespace smod="http://marklogic.com/manage/server" + at "/MarkLogic/manage/models/server-model.xqy"; + +import module namespace tmod="http://marklogic.com/manage/transaction" + at "/MarkLogic/manage/models/transaction-model.xqy"; + +import module namespace json="http://marklogic.com/xdmp/json" + at "/MarkLogic/json/json.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +declare namespace host = "http://marklogic.com/xdmp/status/host"; +declare namespace mt = "http://marklogic.com/xdmp/mimetypes"; +declare namespace prop = "http://marklogic.com/xdmp/property"; +declare namespace sec = "http://marklogic.com/xdmp/security"; + +declare namespace rapi = "http://marklogic.com/rest-api"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $transmod:TRANSACTION_CREATED := "TRANSACTION_CREATED"; +declare variable $transmod:TRANSACTION_RETRIEVED := "TRANSACTION_RETRIEVED"; +declare variable $transmod:TRANSACTION_COMMITTED := "TRANSACTION_COMMITTED"; +declare variable $transmod:TRANSACTION_ROLLEDBACK := "TRANSACTION_ROLLEDBACK"; + +declare variable $transmod:trace-id := "restapi.transactions"; + +declare private variable $is-untraced := (); + +declare function transmod:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, lid:is-disabled($transmod:trace-id, ("restapi"))), + + $is-untraced +}; + +declare private variable $rapi-ns := "http://marklogic.com/rest-api"; + +declare private variable $transmod:transform-list-config := + let $config := json:config("custom") + return ( + map:put($config, "element-namespace", "http://marklogic.com/rest-api"), + map:put($config, "element-prefix", "rapi"), + (: NO NEED AT PRESENT FOR: array-element-names :) + $config + ); + +(: + high-level request functions + :) +declare function transmod:post-open( + $headers as map:map, + $params as map:map, + $context as map:map? +) as empty-sequence() +{ + let $hid := xdmp:host() + let $txid := transmod:create($hid, map:get($params,"name"), map:get($params,"timeLimit")) + let $host-cookie-adder := + if (empty($context)) then () + else map:get($context,"host-cookie-adder") + let $responder := + if (empty($context)) then () + else map:get($context,"responder") + return ( + if (empty($host-cookie-adder)) then () + else $host-cookie-adder($hid), + + if (empty($responder)) then () + else $responder($transmod:TRANSACTION_CREATED,concat("/v1/transactions/",string($txid)),()) + ) +}; + +declare function transmod:get( + $headers as map:map, + $params as map:map, + $context as map:map? +) as item()* +{ + let $txid := xs:unsignedLong(map:get($params,"txid")) + let $responder := + if (empty($context)) then () + else map:get($context,"responder") + return + let $status := transmod:get-status($params,$txid) + let $format := head((dbut:get-request-format($headers,$params)[. ne ""], "xml")) + return ( + if (empty($responder)) then () + else $responder($transmod:TRANSACTION_RETRIEVED, + concat("/transactions/",$txid), + concat("application/",$format) + ), + + if ($format eq "xml") + then $status + else if ($format eq "json") + then json:transform-to-json-string($status, $transmod:transform-list-config) + else error((),"RESTAPI-INVALIDMIMETYPE",( + "mime type for transaction status must be application/json or application/xml", + $format, + concat("/v1/transactions/",string($txid)) + )) + ) +}; + +declare function transmod:post-commit( + $headers as map:map, + $params as map:map, + $context as map:map? +) as empty-sequence() +{ + let $txid := xs:unsignedLong(map:get($params,"txid")) + let $responder := + if (empty($context)) then () + else map:get($context,"responder") + return ( + if (empty($responder)) then () + else $responder($transmod:TRANSACTION_COMMITTED,concat("/transactions/",$txid),()), + transmod:commit($txid) + ) +}; + +declare function transmod:post-rollback( + $headers as map:map, + $params as map:map, + $context as map:map? +) as empty-sequence() +{ + let $txid := xs:unsignedLong(map:get($params,"txid")) + let $responder := + if (empty($context)) then () + else map:get($context,"responder") + return ( + if (empty($responder)) then () + else $responder($transmod:TRANSACTION_ROLLEDBACK,concat("/transactions/",$txid),()), + transmod:rollback($txid) + ) +}; + +(: low-level functions :) +declare function transmod:create( + $hid as xs:unsignedLong, + $name as xs:string?, + $time-limit as xs:string? +) as xs:unsignedLong +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if ($is-untraced or transmod:check-untraced()) then () + else lid:log( + $transmod:trace-id,"create", + map:entry("host",$hid)=>map:with("name",$name)=>map:with("limit",$time-limit) + ), + + let $txid := xdmp:transaction-create( + update + ) + return ( + xdmp:set-transaction-name(($name,"client-txn")[1],$hid,$txid), + + if (empty($time-limit)) then () + else if (not($time-limit castable as xs:unsignedInt)) + then error((),"REST-INVALIDPARAM",( + "invalid time limit. timeLimit: "||$time-limit + )) + else dbut:set-transaction-time-limit(xs:unsignedInt($time-limit),$hid,$txid), + + $txid + ) +}; + +declare function transmod:commit( + $txid as xs:unsignedLong +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if ($is-untraced or transmod:check-untraced()) then () + else lid:log($transmod:trace-id,"commit", map:entry("txid",$txid)), + + (: synchronous equivalent to asynchronous xdmp:transaction-commit($hid,$txid) :) + xdmp:xa-complete1(xdmp:host(),$txid,true()) +}; + +declare function transmod:rollback( + $txid as xs:unsignedLong +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-writer", "execute"), + + if ($is-untraced or transmod:check-untraced()) then () + else lid:log($transmod:trace-id,"rollback", map:entry("txid",$txid)), + + (: synchronous equivalent to asynchronous xdmp:transaction-rollback($hid,$txid) :) + xdmp:xa-complete1(xdmp:host(),$txid,false()) +}; + +declare private function transmod:get-status( + $params as map:map, + $txid as xs:unsignedLong +) as element(rapi:transaction-status)? +{ + let $hid := xdmp:host() + let $status := tmod:get-transaction-status($params,$rapi-ns,$hid,$txid) + (: TODO: schema :) + return ( + if ($is-untraced or transmod:check-untraced()) then () + else lid:log( + $transmod:trace-id,"get-status", + map:entry("host",$hid)=>map:with("txid",$txid)=>map:with("params",$params) + =>map:with("status",$status) + ), + + if (empty($status)) + then error((),"REST-INVALIDPARAM",( + "non-existent transaction id "||$txid + )) + else + { + + {$hid} + {hmod:get-host-name($hid)} + , + $status/host:server-id/data(.) ! + + {.} + {smod:get-server-name(.)} + , + $status/host:database-id/data(.) ! + + {.} + {dmod:get-database-name(.)} + , + distinct-values($status/host:forest-id/data(.)) ! + + {.} + {fmod:get-forest-name(.)} + , + mout:change-element-ns-deep($status / + (* except (host:database-id|host:forest-id|host:host-id|host:server-id)), + $rapi-ns, + "rapi" + ) + } + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/transform-model.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/transform-model.xqy new file mode 100644 index 0000000000..984fee03ab --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/models/transform-model.xqy @@ -0,0 +1,356 @@ +xquery version "1.0-ml"; + +(: Copyright 2012-2019 MarkLogic Corporation. All Rights Reserved. :) + +module namespace tformod = "http://marklogic.com/rest-api/models/transform-model"; + +import module namespace json="http://marklogic.com/xdmp/json" + at "/MarkLogic/json/json.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "../lib/db-util.xqy"; + +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "../lib/extensions-util.xqy"; + +import module namespace lid = "http://marklogic.com/util/log-id" + at "/MarkLogic/appservices/utils/log-id.xqy"; + +declare namespace xsl = "http://www.w3.org/1999/XSL/Transform"; + +declare namespace rapi = "http://marklogic.com/rest-api"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $tformod:TRANSFORM_LISTED := "TRANSFORM_LISTED"; +declare variable $tformod:TRANSFORM_CREATED := "TRANSFORM_CREATED"; +declare variable $tformod:TRANSFORM_UPDATED := "TRANSFORM_UPDATED"; +declare variable $tformod:TRANSFORM_RETRIEVED := "TRANSFORM_RETRIEVED"; +declare variable $tformod:TRANSFORM_DELETED := "TRANSFORM_DELETED"; + +declare variable $tformod:transform-base-ns := "http://marklogic.com/rest-api/transform/"; + +declare variable $tformod:transform-list-config := + let $config := json:config("custom") + return ( + map:put($config, "element-namespace", "http://marklogic.com/rest-api"), + map:put($config, "element-prefix", "rapi"), + map:put($config, "array-element-names", ("transform", "parameter")), + $config + ); + +declare variable $tformod:trace-id := "restapi.extensions.transform"; + +declare private variable $is-untraced := (); + +declare function tformod:check-untraced() as xs:boolean { + if (exists($is-untraced)) then () + else xdmp:set($is-untraced, + lid:is-disabled($tformod:trace-id, ("restapi.extensions", "restapi")) + ), + + $is-untraced +}; + +declare function tformod:get-list( + $headers as map:map, + $params as map:map, + $responder as function(*)? +) as document-node() +{ + tformod:list( + dbut:get-request-format($headers,$params), + $params, + $responder + ) +}; + +declare function tformod:list( + $format as xs:string?, + $params as map:map, + $responder as function(*)? +) as document-node() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + if (empty($responder)) then () + else $responder( + $tformod:TRANSFORM_LISTED, + if (empty($format) or $format = ("","xml")) + then "application/xml" + else if ($format eq "json") + then "application/json" + else error((), + "RESTAPI-INTERNALERROR", + concat("could not determine response type from ",$format) + ) + ), + + let $xml := + document { + { + for $transform-metadata in extut:list-extension-metadata( + "transform", + tformod:get-service-defs(), + (map:get($params,"refresh"), true())[1] + )/rapi:transform-metadata + let $transform-name := $transform-metadata/rapi:name/string(.) + order by $transform-name + return + { + $transform-metadata ! *, + (: TODO: better way of getting version :) + /v1/config/transforms/{$transform-name} + } + } + } + return + if (empty($format) or $format = ("","xml")) + then $xml + else if ($format eq "json") + then document { + json:transform-to-json-string($xml,$tformod:transform-list-config) + } + else error((),"RESTAPI-INVALIDMIMETYPE",( + "mime type for transform list must be application/json or application/xml", + $format, + "/v1/transforms" + )) +}; + +declare function tformod:get-item( + $headers as map:map, + $params as map:map, + $responder as function(*)? +) as document-node()? +{ + tformod:get( + extut:get-extension-name("transform",$params),$params,$responder + ) +}; + +declare function tformod:get( + $transform-name as xs:string, + $params as map:map, + $responder as function(*)? +) as document-node()? +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + let $found := extut:get-extension-source( + "transform",$transform-name,("xslt","javascript","xquery") + ) + return + if (empty($found)) + then error((),"RESTAPI-NOTFOUND",concat("transform does not exist: ",$transform-name)) + else ( + if (empty($responder)) then () + else + let $source-format := head($found) + return $responder($tformod:TRANSFORM_RETRIEVED, + $transform-name, + switch ($source-format) + case "xquery" return "application/xquery" + case "xslt" return "application/xslt+xml" + case "javascript" return "application/javascript" + default return error((), + "RESTAPI-INTERNALERROR", + concat("could not determine response type from ",$source-format, + " for ",$transform-name) + ) + ), + + tail($found) + ) +}; + +declare function tformod:put-item( + $headers as map:map, + $params as map:map, + $document as document-node(), + $responder as function(*)? +) as xs:boolean +{ + tformod:put( + extut:get-extension-name("transform",$params), + map:get($params,"title"), + map:get($params,"version"), + map:get($params,"provider"), + map:get($params,"description"), + extut:establish-format($headers,$params,("xquery","xslt","javascript")), + $params, + $document, + $responder + ) +}; + +declare function tformod:put( + $transform-name as xs:string, + $title as xs:string?, + $version as xs:string?, + $provider as xs:string?, + $description as xs:string?, + $format as xs:string, + $params as map:map, + $document as document-node(), + $responder as function(*)? +) as xs:boolean +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + if (empty($responder)) then () + else $responder( + if (extut:extension-exists("transform",$transform-name)) + then $tformod:TRANSFORM_UPDATED + else $tformod:TRANSFORM_CREATED, + $transform-name, + () + ), + + let $service-defs := tformod:get-service-defs() + let $metadata := ( + if (empty($title)) then () else {$title}, + if (empty($version)) then () else {$version}, + if (empty($provider)) then () else {$provider}, + if (empty($description)) then () else {$description}, + { + for $key in map:keys($params) + return + if (not(starts-with($key,"trans:"))) then () + else + + {substring-after($key,"trans:")} + {map:get($params,$key)} + + } + ) + return extut:install-extension( + "transform",$service-defs,$transform-name,$metadata,$format,$document + ) +}; + +declare function tformod:delete-item( + $headers as map:map, + $params as map:map, + $responder as function(*)? +) as empty-sequence() +{ + tformod:delete( + extut:get-extension-name("transform",$params),$params,$responder + ) +}; + +declare private function tformod:delete( + $transform-name as xs:string, + $params as map:map, + $responder as function(*)? +) as empty-sequence() +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-admin", "execute"), + + if (empty($responder)) then () + else $responder($tformod:TRANSFORM_DELETED,$transform-name,()), + + extut:uninstall-extension("transform",$transform-name,map:get($params,"check")) +}; + +declare function tformod:extract-transform-params( + $endpoint-params as map:map +) as map:map +{ + let $map := map:map() + return ( + for $key in map:keys($endpoint-params) + return + if (not(starts-with($key,"trans:"))) then () + else map:put( + $map,substring-after($key,"trans:"),map:get($endpoint-params,$key) + ), + $map + ) +}; + +declare function tformod:apply-transform-all( + $transform-name as xs:string?, + $params as map:map, + $requests as map:map* +) as map:map* +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + let $f := extut:get-extension-function("transform-all",$transform-name,"transform") + return + if (exists($f)) + then map:get( + extut:invoke-service( + $transform-name, "TRANSFORM-ALL", (), $f, map:entry("requests",$requests), + $params, (), map:contains($params,"txid") + ), + "response" + ) + else if (extut:extension-exists("transform",$transform-name)) + then error((),"RESTAPI-INVALIDREQ", + "could not find transform function for: "||$transform-name + ) + else error((),"RESTAPI-INVALIDREQ", + "transform extension does not exist: "||$transform-name + ) +}; + +declare function tformod:apply-transform( + $transform-name as xs:string?, + $context as map:map, + $params as map:map, + $content as document-node() +) as map:map +{ + xdmp:security-assert("http://marklogic.com/xdmp/privileges/rest-reader", "execute"), + + let $in-txn := map:contains($params,"txid") + let $f := extut:get-extension-function("transform",$transform-name,"transform") + return + if (exists($f)) + then extut:invoke-service( + $transform-name,"TRANSFORM",(),$f,$context,$params,$content,$in-txn + ) + else if (not(extut:extension-exists("transform",$transform-name))) + then error((),"RESTAPI-INVALIDREQ", + "transform extension does not exist: "||$transform-name + ) + else + (: create wrapper as fallback for backward compatibility + can possibly delete this fallback at this point :) + let $found := extut:get-extension-source( + "transform",$transform-name,("xslt","xquery","javascript") + ) + let $format := head($found) + let $f2 := + if ($format ne "xslt") then () + else + let $transform := tail($found) + let $success := extut:execute-transform($transform,$context,$params,$content) + return + if (not($success)) then () + else extut:get-extension-function("transform",$transform-name,"transform") + return + if (exists($f2)) + then extut:invoke-service( + $transform-name,"TRANSFORM",(),$f2,$context,$params,$content,$in-txn + ) + else error((),"RESTAPI-INVALIDREQ", + "could not find transform function for: "||$transform-name + ) +}; + +declare function tformod:get-service-defs( +) as map:map +{ + let $service-defs := map:map() + return ( + map:put($service-defs, "transform", + ("document-node()?", "map:map", "map:map", "document-node()") + ), + $service-defs + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/rewriter.xml b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/rewriter.xml new file mode 100644 index 0000000000..026aaaf023 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/rewriter.xml @@ -0,0 +1,813 @@ + + + + + $0 + + + + + + $1 + /data-hub/5/rest-api/default.xqy + + + + + + + + $0 + + /data-hub/5/endpoints/collector.xqy + + + + + + + $0 + query + + + $0 + + + /MarkLogic/rest-api/endpoints/rules-list.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/rules-list.xqy + + + + $2 + + $0 + + + + + $0 + query + + /MarkLogic/rest-api/endpoints/rules-item-query.xqy + + + + + $0 + query + + + /MarkLogic/rest-api/endpoints/rules-item-query.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/rules-item-query.xqy + + + + $0 + update + + + /MarkLogic/rest-api/endpoints/rules-item-update.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/rules-item-update.xqy + + + + + + $0 + query + + + $0 + + + /MarkLogic/rest-api/endpoints/rules-match.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/rules-match.xqy + + + + + /MarkLogic/rest-api/endpoints/config-indexes.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-indexes.xqy + + + + $2 + + /MarkLogic/rest-api/endpoints/config-indexes.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-indexes.xqy + + + + + /MarkLogic/rest-api/endpoints/config-namespace-list.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-namespace-list.xqy + + + + $2 + + /MarkLogic/rest-api/endpoints/config-namespace-item.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-namespace-item.xqy + + + + + /MarkLogic/rest-api/endpoints/config-properties.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-properties.xqy + + + + $2 + + /MarkLogic/rest-api/endpoints/config-properties.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-properties.xqy + + + + + /MarkLogic/rest-api/endpoints/config-query-list.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-query-list.xqy + + + + $2 + + /MarkLogic/rest-api/endpoints/config-query.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-query.xqy + + + + $2 + $3 + + /MarkLogic/rest-api/endpoints/config-query-child.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-query-child.xqy + + + + + /MarkLogic/rest-api/endpoints/resource-list-query.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/resource-list-query.xqy + + + + $2 + + + $0 + query + + + /MarkLogic/rest-api/endpoints/resource-item-query.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/resource-item-query.xqy + + + + $0 + update + + /MarkLogic/rest-api/endpoints/resource-item-update.xqy + + + + + + /MarkLogic/rest-api/endpoints/transform-list-default.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/transform-list-default.xqy + + + + $2 + + + /MarkLogic/rest-api/endpoints/transform-item-default.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + + /MarkLogic/rest-api/endpoints/transform-item-default.xqy + + + + + $0 + + /MarkLogic/rest-api/endpoints/forest-info.xqy + + + + + $0 + + + + $0 + query + + + $0 + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + /data-hub/5/rest-api/endpoints/document-item-query-get.xqy + + + + $0 + query + + + $0 + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + /data-hub/5/rest-api/endpoints/document-item-query-head.xqy + + + + $0 + query + + + $0 + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + + $0 + update + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + /data-hub/5/rest-api/endpoints/document-item-update-put.xqy + + + + $0 + update + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + /data-hub/5/rest-api/endpoints/document-item-update-delete.xqy + + + + $0 + update + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + /data-hub/5/rest-api/endpoints/document-item-create-post.xqy + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + + $0 + update + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + + + + $0 + + + + $0 + update + + /data-hub/5/rest-api/endpoints/document-item-protection.xqy + + + + + + $2 + + /MarkLogic/rest-api/endpoints/extlib.xqy + + + + + $0 + + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + + $0 + query + + + + $0 + + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + + $0 + update + + + + + $0 + + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + + $0 + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + + + + + $0 + query + + + $0 + + /MarkLogic/rest-api/endpoints/graph-explore.xqy + + + + + $0 + + + + $0 + query + + + $0 + + /MarkLogic/rest-api/endpoints/graphstore-query.xqy + + + + $0 + update + + /MarkLogic/rest-api/endpoints/graphstore-update.xqy + + + + + /MarkLogic/rest-api/endpoints/ping.xqy + + + + + $0 + + + + $0 + update + + + /MarkLogic/rest-api/endpoints/search-list-update.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/search-list-update.xqy + + + $0 + query + + + $0 + + + /MarkLogic/rest-api/endpoints/search-list-query.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/search-list-query.xqy + + + + + $0 + query + + + $0 + + + /MarkLogic/rest-api/endpoints/suggest.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/suggest.xqy + + + + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/qbe-list.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/qbe-list.xqy + + + + + $0 + + $2 + + + $0 + query + + /data-hub/5/rest-api/endpoints/resource-service-query.xqy + + + + $0 + update + + /data-hub/5/rest-api/endpoints/resource-service-update.xqy + + + + + $2 + + $0 + + /MarkLogic/rest-api/endpoints/temporal-collection-item-query.xqy + + + + + $0 + + + + /MarkLogic/rest-api/endpoints/transaction-item-default.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + + /MarkLogic/rest-api/endpoints/transaction-item-default.xqy + + + + $2 + + $0 + + + + /MarkLogic/rest-api/endpoints/transaction-item-default.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + + /MarkLogic/rest-api/endpoints/transaction-item-default.xqy + + + + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/internal-uris.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/internal-uris.xqy + + + + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/values.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/values.xqy + + + + $2 + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/values.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/values.xqy + + + + + + + + + + + $0 + + + $0 + update + + /eval + + + + + + + + $0 + + + $0 + update + + /invoke + + + + + $0 + + + $0 + query + + + $0 + + /MarkLogic/rest-api/endpoints/rows-list.sjs + + + + + $0 + + + + $0 + update + + + + /data-hub/5/rest-api/endpoints/apply-transform.xqy + + + /data-hub/5/rest-api/endpoints/unacceptable-type.xqy + + /data-hub/5/rest-api/endpoints/apply-transform.xqy + + + /data-hub/5/rest-api/endpoints/apply-transform-bad-request.xqy + + + + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/internal-extract-via-template.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/internal-extract-via-template.xqy + + + + diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/upgrade.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/upgrade.xqy new file mode 100644 index 0000000000..9a383f695d --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/rest-api/upgrade.xqy @@ -0,0 +1,425 @@ +xquery version "1.0-ml"; + +(: Copyright 2011-2018 MarkLogic Corporation. All Rights Reserved. :) + +module namespace rapiup = "http://marklogic.com/rest-api/upgrade"; + +import module namespace admin = "http://marklogic.com/xdmp/admin" + at "/MarkLogic/admin.xqy"; + +import module namespace bootl = "http://marklogic.com/rest-api/bootstrap-util" + at "lib/bootstrap-util.xqy"; + +import module namespace dbut = "http://marklogic.com/rest-api/lib/db-util" + at "lib/db-util.xqy"; + +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "lib/extensions-util.xqy"; + +import module namespace eput = "http://marklogic.com/rest-api/lib/endpoint-util" + at "lib/endpoint-util.xqy"; + +import module namespace rsrcmodcom = "http://marklogic.com/rest-api/models/resource-model-common" + at "models/resource-model-common.xqy"; + +import module namespace rsrcmodqry = "http://marklogic.com/rest-api/models/resource-model-query" + at "models/resource-model-query.xqy"; + +import module namespace rsrcmodupd = "http://marklogic.com/rest-api/models/resource-model-update" + at "models/resource-model-update.xqy"; + +import module namespace tformod = "http://marklogic.com/rest-api/models/transform-model" + at "models/transform-model.xqy"; + +import module namespace plugin = "http://marklogic.com/extension/plugin" + at "/MarkLogic/plugin/plugin.xqy"; + +declare namespace rapi = "http://marklogic.com/rest-api"; +declare namespace xsl = "http://www.w3.org/1999/XSL/Transform"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare function rapiup:upgrade-restapi-70( +) as xs:unsignedLong* +{ + xdmp:log("starting REST 7.0 upgrade","notice"), + + try { + rapiup:create-roles(), + + plugin:initialize-scope("marklogic.rest.resource")[false()], + plugin:initialize-scope("marklogic.rest.transform")[false()], + + (: for each REST server :) + for $serverdef in bootl:get-rest-servers()[exists(rapi:modules-database)] + let $server-name := $serverdef/rapi:name/string(.) + let $group-name := $serverdef/rapi:group/string(.) + let $db-name := $serverdef/rapi:database/string(.) + let $db-id := xdmp:database($db-name) + let $modb-name := $serverdef/rapi:modules-database/string(.) + let $modb-id := xdmp:database($modb-name) + let $extension-count := ( + xdmp:log("upgrading extensions for "||$server-name,"notice"), + + dbut:update-config(rapiup:upgrade-restserver-70#0, $db-id, $modb-id) + ) + return + (: list REST servers with reinstalled extensions :) + if ($extension-count gt 0) + then xdmp:server($server-name, xdmp:group($group-name)) + else () + } catch($e) { + xdmp:log("failed to upgrade REST 7.0: "||$e/error:message/string(.), "error"), + xdmp:log($e, "debug") + } +}; + +declare private function rapiup:create-roles( +) +{ + xdmp:eval(' + xquery version "1.0-ml"; + import module namespace sec="http://marklogic.com/xdmp/security" + at "/MarkLogic/security.xqy"; + declare default function namespace "http://www.w3.org/2005/xpath-functions"; + declare option xdmp:mapping "false"; + if (sec:role-exists("rest-extension-user")) then () + else ( + xdmp:log("creating rest-extension-user","notice"), + sec:create-role("rest-extension-user","MarkLogic REST API extension role",(),(),()) + ) + ', + (), + + different-transaction + ) +}; + +declare private function rapiup:upgrade-restserver-70( +) as xs:unsignedLong* +{ +count(( + (: for each 6.2 or 6.3 resource service extension :) + let $resourcedefs := rsrcmodqry:list-sources("xml",())/rapi:resources/rapi:resource + return + if (exists($resourcedefs)) then ( + xdmp:log("upgrading resource service extensions in the modules database","notice"), + + for $resourcedef in $resourcedefs + let $name := $resourcedef/rapi:name/string(.) + let $source := rsrcmodqry:get-source($name,()) + return rapiup:upgrade-resource-extension( + $name, $resourcedef, $source + ) + ) + else ( + xdmp:log("upgrading resource service extensions in the Extensions database","notice"), + + (: for each 6.1 resource service extension :) + let $plugins := plugin:plugins( + "http://marklogic.com/rest-api/capability/resource/meta", + "marklogic.rest.resource" + ) + for $name in $plugins + let $resourcedef := + plugin:asset($name,"marklogic.rest.resource","metadata.xml") + let $source := + plugin:asset($name,"marklogic.rest.resource","resource.xqy") + return rapiup:upgrade-resource-extension( + $name, $resourcedef/rapi:resource-metadata, $source + ) + ), + + let $params := map:map() + let $transformdefs := tformod:list("xml",$params,())/rapi:transforms/rapi:transform + return + if (exists($transformdefs)) then ( + xdmp:log("upgrading transform extensions in the modules database","notice"), + + (: for each 6.2 or 6.3 transform extension :) + for $transformdef in $transformdefs + let $name := $transformdef/rapi:name/string(.) + let $source := tformod:get($name,$params,()) + let $format := head(( + ($transformdef//rapi:source-format)[last()]/string(.), + if (exists($source/(xsl:stylesheet|xsl:transform))) + then "xslt" + else "xquery" + )) + return rapiup:upgrade-transform-extension( + $name, $transformdef, $format, $source + ) + ) + else ( + xdmp:log("upgrading transform extensions in the Extensions database","notice"), + + (: for each 6.1 transform extension :) + let $plugins := plugin:plugins( + "http://marklogic.com/rest-api/capability/transform/meta", + "marklogic.rest.transform" + ) + for $name in $plugins + let $transformdef := + plugin:asset($name,"marklogic.rest.transform","metadata.xml") + let $xstl-source := + plugin:asset($name,"marklogic.rest.transform","transform.xsl") + let $format := head(( + ($transformdef//rapi:source-format)[last()]/string(.), + if (exists($xstl-source)) + then "xslt" + else "xquery" + )) + let $source := + if (exists($xstl-source)) + then $xstl-source + else plugin:asset($name,"marklogic.rest.transform","transform.xqy") + return rapiup:upgrade-transform-extension( + $name, $transformdef/rapi:transform-metadata, $format, $source + ) + ) + )) +}; + +declare private function rapiup:upgrade-resource-extension( + $name as xs:string, + $resourcedef as element(), + $source as document-node() +) as xs:int* +{ + xdmp:log("upgrading "||$name||" resource service extension","notice"), + + (: eliminate recursive nesting from previous upgrade bug :) + let $resource-metadata := ($resourcedef//rapi:resource-metadata)[last()] + let $source-format := head(( + ($resourcedef//rapi:source-format)[last()]/string(.), "xquery" + )) + (: reinstall :) + return extut:install-extension( + "resource", + rsrcmodcom:get-service-defs(), + $name, + { + $resource-metadata/@*, + $resource-metadata/( + rapi:collections|rapi:permissions|prop:properties|rapi:quality|rapi:metadata-values + ) + }, + $source-format, + $source + )[false()], + + 1 +}; + +declare private function rapiup:upgrade-transform-extension( + $name as xs:string, + $transformdef as element(), + $format as xs:string, + $source as document-node() +) as xs:int* +{ + xdmp:log("upgrading "||$name||" "||$format||" transform","notice"), + + (: reinstall :) + extut:install-extension( + "transform", + tformod:get-service-defs(), + $name, + {$transformdef/*}, + $format, + $source + )[false()], + + 1 +}; + +declare function rapiup:upgrade-restapi-80( +) as xs:unsignedLong* +{ + xdmp:log("starting REST 8.0 upgrade","notice"), + + try { + rapiup:security-80(), + + let $config := admin:get-configuration() + let $restservers := + for $server-id in admin:get-appserver-ids($config) + let $server-type := admin:appserver-get-type($config, $server-id) + let $server-name := admin:appserver-get-name($config, $server-id) + let $is-appservices := ($server-name eq "App-Services") + let $serverdef := map:map() + where (($server-type eq "http") and ( + $is-appservices or + matches( + admin:appserver-get-url-rewriter($config,$server-id), + "^../(8000-rewriter|rewriter|rewriter-noxdbc)\.(xqy|xml)$" + ))) + return ( + map:put($serverdef,"server-id",$server-id), + map:put($serverdef,"server-name",$server-name), + map:put($serverdef,"is-appservices",$is-appservices), + $serverdef + ) + let $rest-server-config := fold-left( + rapiup:upgrade-restserver-80#2, $config, $restservers + ) + let $modified-servers := + if (count($rest-server-config) gt 0) + then admin:save-configuration-without-restart($rest-server-config) + else () + return ( + xdmp:log("finished REST 8.0 upgrade","notice"), + $modified-servers + ) + } catch($e) { + xdmp:log("failed to upgrade REST 8.0: "||$e/error:message/string(.), "error"), + xdmp:log($e, "debug") + } +}; + +declare private function rapiup:upgrade-restserver-80( + $config as element(configuration), + $serverdef as map:map +) as element(configuration) +{ + let $server-id := map:get($serverdef,"server-id") + let $server-name := map:get($serverdef,"server-name") + let $group-id := admin:appserver-get-group-id($config,$server-id) + let $group-name := xdmp:group-name($group-id) + let $is-appservices := map:get($serverdef,"is-appservices") + let $port := xs:string(admin:appserver-get-port($config,$server-id)) + (: start same strategy as ../lib/bootstrap-util.xqy :) + let $is-8000 := ($port eq "8000") + let $modules-id := + if ($is-8000) + then xdmp:database("Modules") + else admin:appserver-get-modules-database($config,$server-id) + (: end strategy :) + let $prop-file := eput:make-document-uri("/rest-api/properties",$group-name,$server-name) + let $error-format := + if ($modules-id eq 0) then () + else xdmp:eval( +'xquery version "1.0-ml"; +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; +declare option xdmp:transaction-mode "update"; +declare variable $prop-func as function(*) external; +declare variable $prop-file as xs:string? external; +$prop-func($prop-file), +xdmp:commit()', + ( + xs:QName("prop-func"), rapiup:restserver-error-format-80#1, + xs:QName("prop-file"), $prop-file + ), + + {$modules-id} + + ) + let $rewrite-config := + if (not($is-appservices)) + then $config + else admin:appserver-set-rewrite-resolves-globally($config,$server-id,true()) + let $handler-config := + if (not($is-appservices)) + then $rewrite-config + else admin:appserver-set-error-handler( + $rewrite-config,$server-id,"../8000-error-handler.xqy" + ) + let $format-config := + if (empty($error-format) or not($error-format = ("html","json","xml"))) + then $handler-config + else admin:appserver-set-default-error-format($handler-config,$server-id,$error-format) + let $db-config := + if(not($is-8000)) + then $format-config + else admin:appserver-set-database($format-config,$server-id,xdmp:database("Documents")) + let $modules-config := + if(not($is-8000)) + then $db-config + else admin:appserver-set-modules-database($db-config,$server-id,xdmp:database("Modules")) + let $root-config := + if(not($is-8000)) + then $modules-config + else admin:appserver-set-root($modules-config,$server-id,"/") + + return ( + admin:appserver-set-url-rewriter($root-config,$server-id, + if ($is-8000) + then "../8000-rewriter.xml" + else "../rewriter.xml" + ), + xdmp:log(concat("upgraded ",$server-name," REST server to 8.0"), "notice") + ) +}; + +declare private function rapiup:restserver-error-format-80( + $prop-file as xs:string? +) as xs:string? +{ + if (empty($prop-file) or not(doc-available($prop-file))) then () + else + let $prop-doc := doc($prop-file) + let $prop-map := $prop-doc/map:map/map:map(.) + return + if (empty($prop-map)) then () + else + let $error-format := map:get($prop-map,"error-format") + return + if (empty($error-format)) then () + else ( + map:delete($prop-map,"error-format"), + xdmp:document-insert( + $prop-file, + document {$prop-map}, + xdmp:document-get-permissions($prop-file), + xdmp:document-get-collections($prop-file), + xdmp:document-get-quality($prop-file) + ), + $error-format + ) +}; + +declare private function rapiup:security-80( +) +{ + xdmp:log("modifying REST role privileges","notice"), + + xdmp:eval(' + xquery version "1.0-ml"; + import module namespace sec="http://marklogic.com/xdmp/security" + at "/MarkLogic/security.xqy"; + declare default function namespace "http://www.w3.org/2005/xpath-functions"; + declare option xdmp:mapping "false"; + + if (not(sec:role-exists("rest-writer-internal"))) then () + else sec:privilege-remove-roles( + "http://marklogic.com/xdmp/privileges/any-uri", "execute", "rest-writer-internal" + ) + ', + (), + + different-transaction + ), + + xdmp:eval(' + xquery version "1.0-ml"; + import module namespace sec="http://marklogic.com/xdmp/security" + at "/MarkLogic/security.xqy"; + declare default function namespace "http://www.w3.org/2005/xpath-functions"; + declare option xdmp:mapping "false"; + + if (not(sec:role-exists("rest-admin-internal"))) then () + else sec:privilege-add-roles( + "http://marklogic.com/xdmp/privileges/any-uri", "execute", "rest-admin-internal" + ), + if (not(sec:role-exists("rest-writer-internal"))) then () + else sec:privilege-add-roles( + "http://marklogic.com/xdmp/privileges/unprotected-uri", "execute", "rest-writer-internal" + ) + ', + (), + + different-transaction + ) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/error-handler.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/error-handler.xqy new file mode 100644 index 0000000000..db843088fd --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/error-handler.xqy @@ -0,0 +1,38 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +import module namespace errut = "http://marklogic.com/rest-api/lib/error-util" + at "/MarkLogic/rest-api/lib/error-util.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare variable $error:errors as element(error:error)* external; +declare variable $code := xdmp:get-response-code(); + +xdmp:log($error:errors), + +let $preferred-error-format := errut:preferred-format() +return + ( + errut:log-errors($error:errors,$code), + if ($preferred-error-format eq "xml") + then xdmp:set-response-content-type("application/xml") + else xdmp:set-response-content-type("application/json"), + errut:error-body($error:errors,$code,$preferred-error-format) + ) + diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/get-ids.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/get-ids.xqy new file mode 100644 index 0000000000..10ad34fcae --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/get-ids.xqy @@ -0,0 +1,30 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +import module namespace debug = "http://marklogic.com/data-hub/debug" + at "/data-hub/5/impl/debug-lib.xqy"; + +import module namespace trace = "http://marklogic.com/data-hub/trace" + at "/data-hub/5/impl/trace-lib.xqy"; + +declare option xdmp:mapping "false"; + +debug:dump-env(), + +let $q := xdmp:get-request-field("q") +return + trace:get-traceIds($q) diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/get-trace.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/get-trace.xqy new file mode 100644 index 0000000000..f35e2afae8 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/get-trace.xqy @@ -0,0 +1,30 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +import module namespace debug = "http://marklogic.com/data-hub/debug" + at "/data-hub/5/impl/debug-lib.xqy"; + +import module namespace trace = "http://marklogic.com/data-hub/trace" + at "/data-hub/5/impl/trace-lib.xqy"; + +declare option xdmp:mapping "false"; + +debug:dump-env(), + +let $id := xdmp:get-request-field("id") +return + trace:get-trace($id) diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/get-traces.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/get-traces.xqy new file mode 100644 index 0000000000..2cce32c24a --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/get-traces.xqy @@ -0,0 +1,31 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +import module namespace debug = "http://marklogic.com/data-hub/debug" + at "/data-hub/5/impl/debug-lib.xqy"; + +import module namespace trace = "http://marklogic.com/data-hub/trace" + at "/data-hub/5/impl/trace-lib.xqy"; + +declare option xdmp:mapping "false"; + +debug:dump-env(), + +let $page := (xdmp:get-request-field("p"), 1)[1] ! xs:int(.) +let $page-count := (xdmp:get-request-field("pc"), 10)[1] ! xs:int(.) +return + trace:get-traces($page, $page-count) diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/search.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/search.xqy new file mode 100644 index 0000000000..5571bd0335 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/search.xqy @@ -0,0 +1,33 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +import module namespace debug = "http://marklogic.com/data-hub/debug" + at "/data-hub/5/impl/debug-lib.xqy"; + +import module namespace trace = "http://marklogic.com/data-hub/trace" + at "/data-hub/5/impl/trace-lib.xqy"; + +declare option xdmp:mapping "false"; + +debug:dump-env(), + +let $body := xdmp:get-request-body() +let $q := ($body/q, "")[1] +let $page := ($body/p, 1)[1] ! xs:int(.) +let $page-count := ($body/pc, 10)[1] ! xs:int(.) +return + trace:find-traces($q, $page, $page-count) diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/trace-ui.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/trace-ui.xqy new file mode 100644 index 0000000000..26a1a3368f --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/trace-ui.xqy @@ -0,0 +1,43 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +import module namespace hul = "http://marklogic.com/data-hub/hub-utils-lib" + at "/data-hub/5/impl/hub-utils-lib.xqy"; + +import module namespace debug = "http://marklogic.com/data-hub/debug" + at "/data-hub/5/impl/debug-lib.xqy"; + +declare option xdmp:mapping "false"; + +debug:dump-env() +, +switch (xdmp:get-request-field("extension")) +case "css" return xdmp:set-response-content-type("text/css") +case "js" return xdmp:set-response-content-type("application/javascript") +case "ico" return xdmp:set-response-content-type("image/vnd.microsoft.icon") +case "ttf" return xdmp:set-response-content-type("application/font-sfont") +case "eot" return xdmp:set-response-content-type("application/vnd.ms-fontobject") +case "woff" return xdmp:set-response-content-type("application/font-woff") +case "woff2" return xdmp:set-response-content-type("application/font-woff2") +case "svg" return xdmp:set-response-content-type("image/svg+xml") +default return () +, +xdmp:log(("FIELD", xdmp:get-request-field("uri"))) +, +hul:run-in-modules(function() { + fn:doc("/trace-ui" || xdmp:get-request-field("uri")) +}) diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/tracing-rewriter.xml b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/tracing-rewriter.xml new file mode 100644 index 0000000000..c053e5610c --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/tracing/tracing-rewriter.xml @@ -0,0 +1,860 @@ + + + + + $0 + + + + + /trace-ui/index.html + + + + /trace-ui/index.html + + + + $0 + $1 + /data-hub/5/tracing/trace-ui.xqy + + + + $0 + /data-hub/5/tracing/trace-ui.xqy + + + + + + + + + + $0 + + /data-hub/5/endpoints/collector.xqy + + + + + + + $0 + query + + + $0 + + + /MarkLogic/rest-api/endpoints/rules-list.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/rules-list.xqy + + + + $2 + + $0 + + + + + $0 + query + + /MarkLogic/rest-api/endpoints/rules-item-query.xqy + + + + + $0 + query + + + /MarkLogic/rest-api/endpoints/rules-item-query.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/rules-item-query.xqy + + + + $0 + update + + + /MarkLogic/rest-api/endpoints/rules-item-update.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/rules-item-update.xqy + + + + + + $0 + query + + + $0 + + + /MarkLogic/rest-api/endpoints/rules-match.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/rules-match.xqy + + + + + /MarkLogic/rest-api/endpoints/config-indexes.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-indexes.xqy + + + + $2 + + /MarkLogic/rest-api/endpoints/config-indexes.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-indexes.xqy + + + + + /MarkLogic/rest-api/endpoints/config-namespace-list.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-namespace-list.xqy + + + + $2 + + /MarkLogic/rest-api/endpoints/config-namespace-item.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-namespace-item.xqy + + + + + /MarkLogic/rest-api/endpoints/config-properties.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-properties.xqy + + + + $2 + + /MarkLogic/rest-api/endpoints/config-properties.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-properties.xqy + + + + + /MarkLogic/rest-api/endpoints/config-query-list.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-query-list.xqy + + + + $2 + + /MarkLogic/rest-api/endpoints/config-query.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-query.xqy + + + + $2 + $3 + + /MarkLogic/rest-api/endpoints/config-query-child.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/config-query-child.xqy + + + + + /MarkLogic/rest-api/endpoints/resource-list-query.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/resource-list-query.xqy + + + + $2 + + + $0 + query + + + /MarkLogic/rest-api/endpoints/resource-item-query.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/resource-item-query.xqy + + + + $0 + update + + /MarkLogic/rest-api/endpoints/resource-item-update.xqy + + + + + + /MarkLogic/rest-api/endpoints/transform-list-default.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/transform-list-default.xqy + + + + $2 + + + /MarkLogic/rest-api/endpoints/transform-item-default.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + + /MarkLogic/rest-api/endpoints/transform-item-default.xqy + + + + + $0 + + /MarkLogic/rest-api/endpoints/forest-info.xqy + + + + + $0 + + + + $0 + query + + + $0 + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + /data-hub/5/rest-api/endpoints/document-item-query-get.xqy + + + + $0 + query + + + $0 + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + /data-hub/5/rest-api/endpoints/document-item-query-head.xqy + + + + $0 + query + + + $0 + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + + $0 + update + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + /data-hub/5/rest-api/endpoints/document-item-update-put.xqy + + + + $0 + update + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + /data-hub/5/rest-api/endpoints/document-item-update-delete.xqy + + + + $0 + update + + + /data-hub/5/rest-api/endpoints/document-item-query.xqy + + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + /data-hub/5/rest-api/endpoints/document-item-create-post.xqy + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + + $0 + update + + /data-hub/5/rest-api/endpoints/document-item-update.xqy + + + + + + $0 + + + + $0 + update + + /data-hub/5/rest-api/endpoints/document-item-protection.xqy + + + + + + $2 + + /MarkLogic/rest-api/endpoints/extlib.xqy + + + + + $0 + + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + + $0 + query + + + + $0 + + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + + $0 + update + + + + + $0 + + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + + $0 + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + /MarkLogic/rest-api/endpoints/sparql-query.xqy + + + + + + + $0 + query + + + $0 + + /MarkLogic/rest-api/endpoints/graph-explore.xqy + + + + + $0 + + + + $0 + query + + + $0 + + /MarkLogic/rest-api/endpoints/graphstore-query.xqy + + + + $0 + update + + /MarkLogic/rest-api/endpoints/graphstore-update.xqy + + + + + /MarkLogic/rest-api/endpoints/ping.xqy + + + + + $0 + + + + $0 + update + + + /data-hub/5/rest-api/endpoints/search-list-update.xqy + + + /data-hub/5/rest-api/endpoints/unacceptable-type.xqy + + /data-hub/5/rest-api/endpoints/search-list-update.xqy + + + $0 + query + + + $0 + + + /data-hub/5/rest-api/endpoints/search-list-query.xqy + + + /data-hub/5/rest-api/endpoints/unacceptable-type.xqy + + /data-hub/5/rest-api/endpoints/search-list-query.xqy + + + + + $0 + query + + + $0 + + + /MarkLogic/rest-api/endpoints/suggest.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/suggest.xqy + + + + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/qbe-list.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/qbe-list.xqy + + + + + $0 + + $2 + + + $0 + query + + /data-hub/5/rest-api/endpoints/resource-service-query.xqy + + + + $0 + update + + /data-hub/5/rest-api/endpoints/resource-service-update.xqy + + + + + $2 + + $0 + + /MarkLogic/rest-api/endpoints/temporal-collection-item-query.xqy + + + + + $0 + + + + /MarkLogic/rest-api/endpoints/transaction-item-default.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + + /MarkLogic/rest-api/endpoints/transaction-item-default.xqy + + + + $2 + + $0 + + + + /MarkLogic/rest-api/endpoints/transaction-item-default.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + + /MarkLogic/rest-api/endpoints/transaction-item-default.xqy + + + + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/internal-uris.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/internal-uris.xqy + + + + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/values.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/values.xqy + + + + $2 + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/values.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/values.xqy + + + + + + + + + + + $0 + + + $0 + update + + /eval + + + + + + + + $0 + + + $0 + update + + /invoke + + + + + $0 + + + $0 + query + + + $0 + + /MarkLogic/rest-api/endpoints/rows-list.sjs + + + + + $0 + + + + $0 + update + + + + /data-hub/5/rest-api/endpoints/apply-transform.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/apply-transform.xqy + + + /data-hub/5/rest-api/endpoints/apply-transform-bad-request.xqy + + + + + $0 + query + + + $0 + + + $0 + + + /MarkLogic/rest-api/endpoints/internal-extract-via-template.xqy + + + /MarkLogic/rest-api/endpoints/unacceptable-type.xqy + + /MarkLogic/rest-api/endpoints/internal-extract-via-template.xqy + + + + + + + /data-hub/5/tracing/get-traces.xqy + + + /data-hub/5/tracing/get-ids.xqy + + + /data-hub/5/tracing/search.xqy + + + $1 + /data-hub/5/tracing/get-trace.xqy + + + + diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/get-content.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/get-content.xqy new file mode 100644 index 0000000000..a4aa1757a7 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/get-content.xqy @@ -0,0 +1,45 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +module namespace transform = "http://marklogic.com/rest-api/transform/get-content"; + +import module namespace perf = "http://marklogic.com/data-hub/perflog-lib" + at "/data-hub/5/impl/perflog-lib.xqy"; + +declare namespace envelope = "http://marklogic.com/data-hub/envelope"; + +declare function transform( + $context as map:map, + $params as map:map, + $content as document-node() + ) as document-node() +{ + perf:log('/transforms/get-content:transform', function() { + document { + if ($content/envelope:envelope) then + ( + map:put($context, "output-type", "application/xml"), + $content/envelope:envelope/envelope:content/node() + ) + else + ( + map:put($context, "output-type", "application/json"), + $content/content + ) + } + }) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/job-search.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/job-search.sjs new file mode 100644 index 0000000000..31c707526d --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/job-search.sjs @@ -0,0 +1,36 @@ +/** + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +var perf = require("/data-hub/5/impl/perflog-lib.xqy"); +var debug = require("/data-hub/5/impl/debug-lib.xqy"); + +function transform(context, params, content) { + debug.dumpEnv(); + + return perf.log('/transforms/job-search:transform', function() { + var response = content.toObject(); + + for (var i = 0; i < response.results.length; i++) { + var result = response.results[i]; + var doc = cts.doc(result.uri).root; + result.content = doc; + response.pageLength = response['page-length']; + } + + return response; + }); +} + +exports.transform = transform; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/job-search.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/job-search.xqy new file mode 100644 index 0000000000..764e2fbf14 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/job-search.xqy @@ -0,0 +1,57 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; +module namespace job-search = "http://marklogic.com/rest-api/transform/job-search"; + +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "/MarkLogic/rest-api/lib/extensions-util.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare private variable $extName := "job-search"; +declare private variable $modPath := "/data-hub/5/transforms/job-search.sjs"; +declare private variable $caller := xdmp:function( + xs:QName("applyOnce"), "/MarkLogic/rest-api/lib/extensions-util.sjs" + ); + +declare function job-search:source-format() as xs:string { + "javascript" +}; +declare function job-search:get( + $context as map:map, $params as map:map +) as map:map { + xdmp:apply($caller,$extName,$modPath,"GET",$context,$params) +}; +declare function job-search:delete( + $context as map:map, $params as map:map +) as map:map { + xdmp:apply($caller,$extName,$modPath,"DELETE",$context,$params) +}; +declare function job-search:post( + $context as map:map, $params as map:map, $input as document-node()* +) as map:map { + xdmp:apply($caller,$extName,$modPath,"POST",$context,$params,$input) +}; +declare function job-search:put($context as map:map, $params as map:map, $input as document-node()* +) as map:map { + xdmp:apply($caller,$extName,$modPath,"PUT",$context,$params,$input) +}; +declare function job-search:transform( + $context as map:map, $params as map:map, $input as document-node()? +) as map:map { + xdmp:apply($caller,$extName,$modPath,"transform",$context,$params,$input) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/mlcp-flow-transform.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/mlcp-flow-transform.sjs new file mode 100644 index 0000000000..a46323d849 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/mlcp-flow-transform.sjs @@ -0,0 +1,74 @@ +/** + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +'use strict'; + +const config = require("/com.marklogic.hub/config.sjs"); +const consts = require("/data-hub/5/impl/consts.sjs"); +const flowlib = require("/data-hub/5/impl/flow-lib.sjs"); +const tracelib = require("/data-hub/5/impl/trace-lib.sjs"); + +function transform(content, context) { + let uri = content.uri; + let params = {}; + let optionsString = null; + let parsedTransformParam = null; + let transformString = context.transform_param; + let pattern = '^.*(options=\{.*\}).*$'; + let match = new RegExp(pattern).exec(transformString); + if (match === null){ + parsedTransformParam = transformString; + } + else{ + optionsString = match[1]; + parsedTransformParam = transformString.replace(optionsString, ''); + } + + let splits = parsedTransformParam.split(','); + for (let i in splits) { + let pair = splits[i]; + let parts = pair.split('='); + params[parts[0]] = parts[1]; + } + + let jobId = params["job-id"] || sem.uuidString(); + let entityName = params['entity-name'] ? xdmp.urlDecode(params['entity-name']) : null; + let flowName = params['flow-name'] ? xdmp.urlDecode(params['flow-name']) : null; + let flow = flowlib.getFlow(entityName, flowName, consts.INPUT_FLOW); + + if (!flow) { + fn.error(null, "RESTAPI-SRVEXERR", "The specified flow " + params.flow + " is missing."); + } + let options = {}; + if (optionsString) { + let splits = optionsString.split("="); + options = JSON.parse(splits[1]); + } + flowlib.setDefaultOptions(options, flow); + + let mainFunc = flowlib.getMainFunc(flow.main); + + // this can throw, but we want MLCP to know about problems, so let it + let envelope = flowlib.runFlow(jobId, flow, uri, content.value, options, mainFunc); + + // write the trace for the current identifier + let itemContext = flowlib.contextQueue[uri]; + tracelib.writeTrace(itemContext); + + content.value = envelope; + return content; +} + +exports.transform = transform; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/mlcp-flow-transform.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/mlcp-flow-transform.xqy new file mode 100644 index 0000000000..20cccd4a70 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/mlcp-flow-transform.xqy @@ -0,0 +1,110 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +module namespace mlcpFlow = "http://marklogic.com/data-hub/mlcp-flow-transform"; + +import module namespace config = "http://marklogic.com/data-hub/config" + at "/com.marklogic.hub/config.xqy"; + +import module namespace consts = "http://marklogic.com/data-hub/consts" + at "/data-hub/5/impl/consts.xqy"; + +import module namespace debug = "http://marklogic.com/data-hub/debug" + at "/data-hub/5/impl/debug-lib.xqy"; + +import module namespace flow = "http://marklogic.com/data-hub/flow-lib" + at "/data-hub/5/impl/flow-lib.xqy"; + +import module namespace hul = "http://marklogic.com/data-hub/hub-utils-lib" + at "/data-hub/5/impl/hub-utils-lib.xqy"; + +import module namespace perf = "http://marklogic.com/data-hub/perflog-lib" + at "/data-hub/5/impl/perflog-lib.xqy"; + +import module namespace trace = "http://marklogic.com/data-hub/trace" + at "/data-hub/5/impl/trace-lib.xqy"; + +declare namespace hub = "http://marklogic.com/data-hub"; + +declare option xdmp:mapping "false"; + +declare function mlcpFlow:transform( + $content as map:map, + $context as map:map +) as map:map* +{ + debug:dump-env("mlcpFlow:transform"), + + let $uri := map:get($content, "uri") + return + perf:log('mlcp-flow-transform(' || $uri || ')', function() { + let $transform-string := map:get($context, 'transform_param') + let $options-string := replace($transform-string, '^.*(options=\{.*\}).*$', '$1') + let $parsed-transform-string := + if ($transform-string = $options-string) then + $transform-string + else + fn:replace($transform-string, 'options=\{.*\}', '') + let $params := map:new( + for $pair in $parsed-transform-string ! fn:tokenize(., ",") + let $parts := fn:tokenize($pair, "=") + return + if(fn:not(fn:empty($parts[1]))) then + map:entry($parts[1], $parts[2]) + else + () + ) + + let $job-id := (map:get($params, "job-id"), sem:uuid-string())[1] + let $entity-name := map:get($params, 'entity-name') ! xdmp:url-decode(.) + let $flow-name := map:get($params, 'flow-name') ! xdmp:url-decode(.) + let $flow := flow:get-flow( + $entity-name, + $flow-name, + $consts:INPUT_FLOW + ) + + let $_ := + if ($flow) then () + else + fn:error((), "RESTAPI-SRVEXERR", "The specified flow " || map:get($params, "flow") || " is missing.") + + (: configure the options :) + let $opts := map:new( + let $opt-parts := fn:tokenize($options-string, "=") + + return + map:entry($opt-parts[1], $opt-parts[2]) + ) + let $options as map:map := ( + map:get($opts, "options") ! xdmp:unquote(.)/object-node(), + map:map() + )[1] + let $_ := flow:set-default-options($options, $flow) + + let $mainFunc := flow:get-main($flow/hub:main) + (: this can throw, but we want MLCP to know about problems, so let it :) + let $envelope := flow:run-flow($job-id, $flow, $uri, map:get($content, "value"), $options, $mainFunc) + + (: write the trace for the current identifier :) + let $item-context := map:get($flow:context-queue, $uri) + let $_ := trace:write-trace($item-context) + let $_ := map:put($content, "value", $envelope) + return + $content + }) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/prettify.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/prettify.xqy new file mode 100644 index 0000000000..37669f7bc4 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/prettify.xqy @@ -0,0 +1,47 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +module namespace transform = "http://marklogic.com/rest-api/transform/prettify"; + +import module namespace perf = "http://marklogic.com/data-hub/perflog-lib" + at "/data-hub/5/impl/perflog-lib.xqy"; + +declare function transform( + $context as map:map, + $params as map:map, + $content as document-node() + ) as document-node() +{ + perf:log("/transforms/prettify:transform", function() { + + map:put($context, "output-types", "text/plain"), + if (fn:exists($content/element())) then + document { + xdmp:quote( + $content, + + yes + yes + yes + + ) + } + else + $content + }) +}; + diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/run-flow.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/run-flow.xqy new file mode 100644 index 0000000000..5171aba219 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/run-flow.xqy @@ -0,0 +1,77 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +module namespace runFlow = "http://marklogic.com/rest-api/transform/run-flow"; + +import module namespace consts = "http://marklogic.com/data-hub/consts" + at "/data-hub/5/impl/consts.xqy"; + +import module namespace debug = "http://marklogic.com/data-hub/debug" + at "/data-hub/5/impl/debug-lib.xqy"; + +import module namespace flow = "http://marklogic.com/data-hub/flow-lib" + at "/data-hub/5/impl/flow-lib.xqy"; + +import module namespace trace = "http://marklogic.com/data-hub/trace" + at "/data-hub/5/impl/trace-lib.xqy"; + +import module namespace perf = "http://marklogic.com/data-hub/perflog-lib" + at "/data-hub/5/impl/perflog-lib.xqy"; + +declare namespace hub = "http://marklogic.com/data-hub"; + +declare namespace rapi = "http://marklogic.com/rest-api"; + +declare %rapi:transaction-mode("query") function runFlow:transform( + $context as map:map, + $params as map:map, + $content as document-node() + ) as document-node() +{ + debug:dump-env("run-flow:transform"), + + perf:log('/transforms/run-flow:transform', function() { + let $job-id := (map:get($params, "job-id"), sem:uuid-string())[1] + let $entity-name := map:get($params, 'entity-name') + let $flow-name := map:get($params, 'flow-name') + let $uri := map:get($context, 'uri') + let $flow := flow:get-flow($entity-name, $flow-name, $consts:INPUT_FLOW) + let $_ := + if ($flow) then () + else + fn:error((),"RESTAPI-SRVEXERR", ("404","MISSING_FLOW", "The specified flow " || $entity-name || ":" || $flow-name || " is missing.")) + + (: configure the options :) + let $options as map:map := ( + map:get($params, "options") ! xdmp:unquote(.)/object-node(), + map:map() + )[1] + let $_ := flow:set-default-options($options, $flow) + + let $mainFunc := flow:get-main($flow/hub:main) + (: this can throw, but we want the REST API to know about problems, so let it :) + let $envelope := flow:run-flow( + $job-id, $flow, $uri, $content, $options, $mainFunc + ) + + (: write the trace for the current identifier :) + let $item-context := map:get($flow:context-queue, $uri) + let $_ := trace:write-trace($item-context) + return + document { $envelope } + }) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/run-sjs-flow.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/run-sjs-flow.sjs new file mode 100644 index 0000000000..9e379ad9c1 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/run-sjs-flow.sjs @@ -0,0 +1,48 @@ +/** + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +const consts = require("/data-hub/5/impl/consts.sjs"); +const flowlib = require("/data-hub/5/impl/flow-lib.sjs"); +const tracelib = require("/data-hub/5/impl/trace-lib.sjs"); + +function transform(context, params, content) { + let jobId = params["job-id"] ||sem.uuidString(); + let entityName = params['entity-name']; + let flowName = params['flow-name']; + let uri = context.uri; + let flow = flowlib.getFlow(entityName, flowName, consts.INPUT_FLOW); + if (!flow) { + fn.error(null, "RESTAPI-SRVEXERR", Sequence.from([404, "Not Found", "The specified flow " + entityName + ":" + flowName + " is missing."])); + } + + // configure the options + let options = {}; + if (params.options) { + options = JSON.parse(params.options); + } + flowlib.setDefaultOptions(options, flow); + + // this can throw, but we want the REST API to know about problems, so let it + let mainFunc = flowlib.getMainFunc(flow.main); + let envelope = flowlib.runFlow(jobId, flow, uri, content, options, mainFunc); + + // write the trace for the current identifier + let itemContext = flowlib.contextQueue[uri]; + tracelib.writeTrace(itemContext); + + return envelope; +} + +exports.transform = transform; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/run-sjs-flow.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/run-sjs-flow.xqy new file mode 100644 index 0000000000..cc01cf6b43 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/run-sjs-flow.xqy @@ -0,0 +1,57 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; +module namespace run-sjs-flow = "http://marklogic.com/rest-api/transform/run-sjs-flow"; + +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "/MarkLogic/rest-api/lib/extensions-util.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare private variable $extName := "run-sjs-flow"; +declare private variable $modPath := "/data-hub/5/transforms/run-sjs-flow.sjs"; +declare private variable $caller := xdmp:function( + xs:QName("applyOnce"), "/MarkLogic/rest-api/lib/extensions-util.sjs" + ); + +declare function run-sjs-flow:source-format() as xs:string { + "javascript" +}; +declare function run-sjs-flow:get( + $context as map:map, $params as map:map +) as map:map { + xdmp:apply($caller,$extName,$modPath,"GET",$context,$params) +}; +declare function run-sjs-flow:delete( + $context as map:map, $params as map:map +) as map:map { + xdmp:apply($caller,$extName,$modPath,"DELETE",$context,$params) +}; +declare function run-sjs-flow:post( + $context as map:map, $params as map:map, $input as document-node()* +) as map:map { + xdmp:apply($caller,$extName,$modPath,"POST",$context,$params,$input) +}; +declare function run-sjs-flow:put($context as map:map, $params as map:map, $input as document-node()* +) as map:map { + xdmp:apply($caller,$extName,$modPath,"PUT",$context,$params,$input) +}; +declare function run-sjs-flow:transform( + $context as map:map, $params as map:map, $input as document-node()? +) as map:map { + xdmp:apply($caller,$extName,$modPath,"transform",$context,$params,$input) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/trace-json.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/trace-json.xqy new file mode 100644 index 0000000000..3ff19ad98d --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/trace-json.xqy @@ -0,0 +1,43 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; + +module namespace transform = "http://marklogic.com/rest-api/transform/trace-json"; + +import module namespace perf = "http://marklogic.com/data-hub/perflog-lib" + at "/data-hub/5/impl/perflog-lib.xqy"; + +import module namespace trace = "http://marklogic.com/data-hub/trace" + at "/data-hub/5/impl/trace-lib.xqy"; + +declare function transform( + $context as map:map, + $params as map:map, + $content as document-node() + ) as document-node() +{ + perf:log('/transforms/trace-json:transform', function() { + + map:put($context, "output-types", "application/json"), + document { + if ($content/trace) then + xdmp:to-json(trace:trace-to-json($content/trace)) + else if ($content/node() instance of object-node()) then + xdmp:to-json(trace:trace-to-json($content/node())) + else () + } + }) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/trace-search.sjs b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/trace-search.sjs new file mode 100644 index 0000000000..b721915571 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/trace-search.sjs @@ -0,0 +1,30 @@ +/** + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +var trace = require("/data-hub/5/impl/trace-lib.xqy"); + +function transform(context, params, content) { + var response = content.toObject(); + + for (var i = 0; i < response.results.length; i++) { + var result = response.results[i]; + var doc = cts.doc(result.uri); + result.content = trace.traceToJsonSlim(doc); + response.pageLength = response['page-length']; + } + return response; +} + +exports.transform = transform; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/trace-search.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/trace-search.xqy new file mode 100644 index 0000000000..29a77b90f0 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/transforms/trace-search.xqy @@ -0,0 +1,57 @@ +(: + Copyright 2012-2019 MarkLogic Corporation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +:) +xquery version "1.0-ml"; +module namespace trace-search = "http://marklogic.com/rest-api/transform/trace-search"; + +import module namespace extut = "http://marklogic.com/rest-api/lib/extensions-util" + at "/MarkLogic/rest-api/lib/extensions-util.xqy"; + +declare default function namespace "http://www.w3.org/2005/xpath-functions"; +declare option xdmp:mapping "false"; + +declare private variable $extName := "trace-search"; +declare private variable $modPath := "/data-hub/5/transforms/trace-search.sjs"; +declare private variable $caller := xdmp:function( + xs:QName("applyOnce"), "/MarkLogic/rest-api/lib/extensions-util.sjs" + ); + +declare function trace-search:source-format() as xs:string { + "javascript" +}; +declare function trace-search:get( + $context as map:map, $params as map:map +) as map:map { + xdmp:apply($caller,$extName,$modPath,"GET",$context,$params) +}; +declare function trace-search:delete( + $context as map:map, $params as map:map +) as map:map { + xdmp:apply($caller,$extName,$modPath,"DELETE",$context,$params) +}; +declare function trace-search:post( + $context as map:map, $params as map:map, $input as document-node()* +) as map:map { + xdmp:apply($caller,$extName,$modPath,"POST",$context,$params,$input) +}; +declare function trace-search:put($context as map:map, $params as map:map, $input as document-node()* +) as map:map { + xdmp:apply($caller,$extName,$modPath,"PUT",$context,$params,$input) +}; +declare function trace-search:transform( + $context as map:map, $params as map:map, $input as document-node()? +) as map:map { + xdmp:apply($caller,$extName,$modPath,"transform",$context,$params,$input) +}; diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/triggers/entity-model-delete-trigger.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/triggers/entity-model-delete-trigger.xqy new file mode 100644 index 0000000000..db2634fcd5 --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/triggers/entity-model-delete-trigger.xqy @@ -0,0 +1,27 @@ +xquery version '1.0-ml'; + +import module namespace es = "http://marklogic.com/entity-services" + at "/MarkLogic/entity-services/entity-services.xqy"; +import module namespace tde = "http://marklogic.com/xdmp/tde" + at "/MarkLogic/tde.xqy"; +import module namespace trgr = 'http://marklogic.com/xdmp/triggers' at '/MarkLogic/triggers.xqy'; + +declare variable $ENTITY-MODEL-COLLECTION as xs:string := "http://marklogic.com/entity-services/models"; +declare variable $TDE-COLLECTION as xs:string := "http://marklogic.com/entity-services/models"; + +declare variable $trgr:uri as xs:string external; + +let $entity-def := fn:doc($trgr:uri) +let $tde-uri := $trgr:uri || ".tde.xml" +return ( + xdmp:invoke-function( + function() { + if (fn:doc-available($trgr:uri)) then + xdmp:document-delete($trgr:uri) + else (), + if (fn:doc-available($tde-uri)) then + xdmp:document-delete($tde-uri) + else () + }, map:entry("database", xdmp:schema-database()) + ) +); diff --git a/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/triggers/entity-model-trigger.xqy b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/triggers/entity-model-trigger.xqy new file mode 100644 index 0000000000..cdbc2203aa --- /dev/null +++ b/marklogic-data-hub/src/main/resources/ml-modules/root/data-hub/5/triggers/entity-model-trigger.xqy @@ -0,0 +1,54 @@ +xquery version '1.0-ml'; + +import module namespace es = "http://marklogic.com/entity-services" + at "/MarkLogic/entity-services/entity-services.xqy"; +import module namespace tde = "http://marklogic.com/xdmp/tde" + at "/MarkLogic/tde.xqy"; +import module namespace trgr = 'http://marklogic.com/xdmp/triggers' at '/MarkLogic/triggers.xqy'; + +declare variable $ENTITY-MODEL-COLLECTION as xs:string := "http://marklogic.com/entity-services/models"; + +declare variable $trgr:uri as xs:string external; + +declare function local:make-TDE-flexible($node as node()) { + typeswitch($node) + case document-node() return document {fn:map(local:make-TDE-flexible#1, $node/node())} + case element(tde:template)|element(tde:templates)|element(tde:rows)|element(tde:row)|element(tde:columns)|element(tde:triples)|element(tde:triple) + return element {fn:node-name($node)} { $node/@*, fn:map(local:make-TDE-flexible#1, $node/node()) } + case element(tde:column) + return element {fn:node-name($node)} { + $node/@*, + ($node/node() except $node/(tde:nullable|tde:invalid-values)), + element tde:nullable {fn:true()}, + element tde:invalid-values {"ignore"} + } + case element(tde:subject)|element(tde:predicate)|element(tde:object) + return element {fn:node-name($node)} { + $node/@*, + ($node/node() except $node/tde:invalid-values), + element tde:invalid-values {"ignore"} + } + default return $node +}; + +let $entity-def := fn:doc($trgr:uri) +let $_validate := es:model-validate($entity-def) +let $default-permissions := xdmp:default-permissions() +return ( + xdmp:invoke-function( + function() { + xdmp:document-insert( + $trgr:uri, + $entity-def, + $default-permissions, + $ENTITY-MODEL-COLLECTION + ) + }, map:entry("database", xdmp:schema-database()) + ), + tde:template-insert( + $trgr:uri || ".tde.xml", + local:make-TDE-flexible(es:extraction-template-generate($entity-def)), + $default-permissions, + ("ml-data-hub-tde") + ) +); diff --git a/marklogic-data-hub/src/main/resources/scaffolding/Entity.json b/marklogic-data-hub/src/main/resources/scaffolding/Entity.json index cce25f92cc..329bbe17c3 100644 --- a/marklogic-data-hub/src/main/resources/scaffolding/Entity.json +++ b/marklogic-data-hub/src/main/resources/scaffolding/Entity.json @@ -10,6 +10,7 @@ "description" : "The placeholder entity root.", "required" : [ ], "rangeIndex" : [ ], + "elementRangeIndex" : [ ], "wordLexicon" : [ ], "pii" : [ ], "properties" : { } diff --git a/marklogic-data-hub/src/main/resources/scaffolding/build_gradle b/marklogic-data-hub/src/main/resources/scaffolding/build_gradle index 5f755eab24..194fe789a4 100644 --- a/marklogic-data-hub/src/main/resources/scaffolding/build_gradle +++ b/marklogic-data-hub/src/main/resources/scaffolding/build_gradle @@ -19,7 +19,7 @@ plugins { // This gradle plugin extends the ml-gradle plugin with // commands that make the Data Hub Framework do its magic - id 'com.marklogic.ml-data-hub' version '4.0-SNAPSHOT' + id 'com.marklogic.ml-data-hub' version '5.0-SNAPSHOT' } repositories { @@ -30,7 +30,7 @@ repositories { dependencies { // this allows you to write custom java code that depends // on the Data Hub Framework library - compile 'com.marklogic:marklogic-data-hub:4.0-SNAPSHOT' + compile 'com.marklogic:marklogic-data-hub:5.0-SNAPSHOT' compile 'com.marklogic:marklogic-xcc:9.0.7' } diff --git a/marklogic-data-hub/src/main/resources/scaffolding/flowName.flow.json b/marklogic-data-hub/src/main/resources/scaffolding/flowName.flow.json new file mode 100644 index 0000000000..f265295d9e --- /dev/null +++ b/marklogic-data-hub/src/main/resources/scaffolding/flowName.flow.json @@ -0,0 +1,6 @@ +{ + "name": "flowName", + "description": "flow description", + "identifier": "", + "steps": [] +} diff --git a/marklogic-data-hub/src/main/resources/scaffolding/gradle-local_properties b/marklogic-data-hub/src/main/resources/scaffolding/gradle-local_properties index 16116d1646..849d0b6c0a 100644 --- a/marklogic-data-hub/src/main/resources/scaffolding/gradle-local_properties +++ b/marklogic-data-hub/src/main/resources/scaffolding/gradle-local_properties @@ -1,5 +1,5 @@ # Put your overrides from gradle.properties here # Don't check this in to version control -mlUsername=admin -mlPassword=admin +# mlUsername=admin +# mlPassword=admin diff --git a/marklogic-data-hub/src/test/java/com/marklogic/bootstrap/DataHubInstallTest.java b/marklogic-data-hub/src/test/java/com/marklogic/bootstrap/DataHubInstallTest.java index d62161130c..d6d0137171 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/bootstrap/DataHubInstallTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/bootstrap/DataHubInstallTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,9 +20,6 @@ import com.marklogic.client.ext.modulesloader.impl.PropertiesModuleManager; import com.marklogic.client.io.DOMHandle; import com.marklogic.hub.*; -import com.marklogic.hub.deploy.commands.DeployHubAmpsCommand; -import com.marklogic.hub.deploy.commands.LoadHubModulesCommand; -import com.marklogic.mgmt.ManageClient; import org.apache.commons.io.FileUtils; import org.custommonkey.xmlunit.XMLUnit; import org.junit.jupiter.api.AfterAll; @@ -58,9 +55,6 @@ public class DataHubInstallTest extends HubTestBase { private static DataHub dataHub; - @Autowired - private DeployHubAmpsCommand deployHubAmpsCommand; - private static int afterTelemetryInstallCount = 0; static boolean setupDone = false; @@ -104,7 +98,9 @@ public void setup() //userTriggersDir.toFile().mkdirs(); //creating directories for adding staging schemas/ modules and trigger files - Path hubSchemasDir = project.getHubConfigDir().resolve("schemas"); + Path hubSchemasDir = project.getUserDatabaseDir() + .resolve(HubConfig.DEFAULT_STAGING_SCHEMAS_DB_NAME) + .resolve("schemas"); Path hubModulesDir = project.getHubStagingModulesDir(); //Path hubTriggersDir = project.getHubConfigDir().resolve("triggers"); @@ -174,8 +170,9 @@ public void testProjectScaffolding() throws IOException //checking if triggers are written assertTrue(stagingTriggersClient.newServerEval().xquery("fn:count(fn:doc())").eval().next().getNumber().intValue() == 1); - assertTrue(finalTriggersClient.newServerEval().xquery("fn:count(fn:doc())").eval().next().getNumber().intValue() == 1); - + //we write 3 triggers as part of installation + assertTrue(finalTriggersClient.newServerEval().xquery("fn:count(fn:doc())").eval().next().getNumber().intValue() == 4); + } @Test @@ -211,7 +208,7 @@ public void testInstallUserModules() throws IOException, ParserConfigurationExce HubConfig hubConfig = getHubAdminConfig(); int totalCount = getDocCount(HubConfig.DEFAULT_MODULES_DB_NAME, null); - installUserModules(hubConfig, true); + installUserModules(hubConfig, false); assertEquals( getResource("data-hub-test/plugins/entities/test-entity/harmonize/final/collector.xqy"), @@ -340,19 +337,6 @@ public void testClearUserModules() throws URISyntaxException // removed counts assertions which were so brittle as to be just an impediment to life. dataHub.clearUserModules(); - - } - @Test - public void testAmpLoading() - { - HubConfig config = getHubAdminConfig(); - LoadHubModulesCommand loadHubModulesCommand = new LoadHubModulesCommand(); - loadHubModulesCommand.setHubConfig(config); - ManageClient manageClient = new ManageClient(new com.marklogic.mgmt.ManageConfig(host, 8002, secUser, secPassword)); - CommandContext commandContext = new CommandContext(config.getAppConfig(), manageClient, null); - deployHubAmpsCommand.setHubConfig(config); - deployHubAmpsCommand.execute(commandContext); - } } diff --git a/marklogic-data-hub/src/test/java/com/marklogic/bootstrap/Installer.java b/marklogic-data-hub/src/test/java/com/marklogic/bootstrap/Installer.java index 614445095c..66ab447817 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/bootstrap/Installer.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/bootstrap/Installer.java @@ -17,7 +17,7 @@ public class Installer extends HubTestBase { private static Logger logger = LoggerFactory.getLogger(Installer.class); - public void setupProject() { + public void setupProject() { createProjectDir(); } @@ -41,9 +41,12 @@ public void bootstrapHub() { // this throws exception right now. } catch (Exception e) { logger.warn("Upgrade threw an exception during test bootstrapping"); - + } } + if(getHubAdminConfig().getIsProvisionedEnvironment()) { + installHubModules(); + } } public static void main(String[] args) { diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/HubTestBase.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/HubTestBase.java index 9dbbbecfe5..ae1f5172a9 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/HubTestBase.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/HubTestBase.java @@ -37,12 +37,16 @@ import com.marklogic.client.ext.modulesloader.ssl.SimpleX509TrustManager; import com.marklogic.client.io.*; import com.marklogic.hub.deploy.commands.LoadHubModulesCommand; +import com.marklogic.hub.deploy.commands.LoadUserArtifactsCommand; import com.marklogic.hub.deploy.commands.LoadUserModulesCommand; import com.marklogic.hub.error.DataHubConfigurationException; -import com.marklogic.hub.flow.CodeFormat; -import com.marklogic.hub.flow.DataFormat; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.LegacyDebugging; +import com.marklogic.hub.legacy.LegacyTracing; +import com.marklogic.hub.legacy.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.DataFormat; +import com.marklogic.hub.legacy.flow.FlowType; import com.marklogic.hub.impl.*; +import com.marklogic.hub.legacy.impl.LegacyFlowManagerImpl; import com.marklogic.hub.scaffold.Scaffolding; import com.marklogic.hub.util.ComboListener; import com.marklogic.mgmt.ManageClient; @@ -121,6 +125,9 @@ public class HubTestBase { @Autowired protected LoadUserModulesCommand loadUserModulesCommand; + @Autowired + protected LoadUserArtifactsCommand loadUserArtifactsCommand; + @Autowired protected Scaffolding scaffolding; @@ -128,7 +135,10 @@ public class HubTestBase { protected MappingManager mappingManager; @Autowired - protected FlowManagerImpl fm; + protected ProcessManager processManager; + + @Autowired + protected LegacyFlowManagerImpl fm; // to speedup dev cycle, you can create a hub and set this to true. // for true setup/teardown, must be 'false' @@ -372,19 +382,19 @@ public void setSslRun(boolean sslRun) { } protected void enableDebugging() { - Debugging.create(stagingClient).enable(); + LegacyDebugging.create(stagingClient).enable(); } protected void disableDebugging() { - Debugging.create(stagingClient).disable(); + LegacyDebugging.create(stagingClient).disable(); } protected void enableTracing() { - Tracing.create(stagingClient).enable(); + LegacyTracing.create(stagingClient).enable(); } protected void disableTracing() { - Tracing.create(stagingClient).disable(); + LegacyTracing.create(stagingClient).disable(); } protected HubConfig getHubAdminConfig(String projectDir) { @@ -884,6 +894,8 @@ protected void installUserModules(HubConfig hubConfig, boolean force) { LoadModulesCommand loadModulesCommand = new LoadModulesCommand(); commands.add(loadModulesCommand); + loadUserArtifactsCommand.setForceLoad(force); + commands.add(loadUserArtifactsCommand); SimpleAppDeployer deployer = new SimpleAppDeployer(((HubConfigImpl)hubConfig).getManageClient(), ((HubConfigImpl)hubConfig).getAdminManager()); deployer.setCommands(commands); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/PiiE2E.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/PiiE2E.java index efddb4f292..e919817399 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/PiiE2E.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/PiiE2E.java @@ -21,9 +21,10 @@ import com.marklogic.client.document.ServerTransform; import com.marklogic.client.io.DocumentMetadataHandle; import com.marklogic.client.io.FileHandle; -import com.marklogic.hub.flow.Flow; -import com.marklogic.hub.flow.FlowRunner; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.LegacyFlowManager; +import com.marklogic.hub.legacy.flow.LegacyFlow; +import com.marklogic.hub.legacy.flow.LegacyFlowRunner; +import com.marklogic.hub.legacy.flow.FlowType; import com.marklogic.hub.impl.HubConfigImpl; import com.marklogic.hub.scaffold.Scaffolding; import com.marklogic.hub.util.FileUtil; @@ -68,7 +69,7 @@ public class PiiE2E extends HubTestBase protected EntityManager entityManager; @Autowired - protected FlowManager flowManager; + protected LegacyFlowManager flowManager; @Autowired private Scaffolding scaffolding; @@ -107,7 +108,7 @@ public static void setupAll() throws Exception @BeforeEach public void setup() { - Assumptions.assumeTrue(!(isCertAuth() || isSslRun())); + Assumptions.assumeTrue(!(isCertAuth() || isSslRun() || getHubAdminConfig().getIsProvisionedEnvironment())); clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME); installHubModules(); installUserModules(getHubAdminConfig(), true); @@ -357,8 +358,8 @@ private void runInputFLow() throws URISyntaxException private void runHarmonizeFlow(String flowName, DatabaseClient srcClient, String destDb) { - Flow harmonizeFlow = flowManager.getFlow("SupportCall", flowName, FlowType.HARMONIZE); - FlowRunner flowRunner = flowManager.newFlowRunner().withFlow(harmonizeFlow).withBatchSize(3).withThreadCount(1) + LegacyFlow harmonizeFlow = flowManager.getFlow("SupportCall", flowName, FlowType.HARMONIZE); + LegacyFlowRunner flowRunner = flowManager.newFlowRunner().withFlow(harmonizeFlow).withBatchSize(3).withThreadCount(1) .withSourceClient(srcClient).withDestinationDatabase(destDb) .onItemComplete((String jobId, String itemId) -> { logger.debug("Completed item " + itemId); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/ScaffoldingE2E.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/ScaffoldingE2E.java index e3a05fc7af..60a53efd47 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/ScaffoldingE2E.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/ScaffoldingE2E.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,9 +15,9 @@ */ package com.marklogic.hub; -import com.marklogic.hub.flow.CodeFormat; -import com.marklogic.hub.flow.DataFormat; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.DataFormat; +import com.marklogic.hub.legacy.flow.FlowType; import com.marklogic.hub.scaffold.Scaffolding; import com.marklogic.hub.util.FileUtil; import com.marklogic.bootstrap.Installer; diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DataHubInstallTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DataHubInstallTest.java index d544671e10..20ab67f819 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DataHubInstallTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DataHubInstallTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import com.marklogic.hub.ApplicationConfig; import org.apache.commons.io.FileUtils; import org.custommonkey.xmlunit.XMLUnit; +import org.junit.jupiter.api.*; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; @@ -89,6 +90,7 @@ public void testTelemetryInstallCount() throws IOException { @Test public void testInstallHubModules() throws IOException { + Assumptions.assumeFalse(getHubAdminConfig().getIsProvisionedEnvironment()); assertTrue(getDataHub().isInstalled().isInstalled()); assertTrue(getModulesFile("/com.marklogic.hub/config.xqy").startsWith(getResource("data-hub-test/core-modules/config.xqy"))); @@ -108,6 +110,7 @@ public void getHubModulesVersion() throws IOException { @Test public void testInstallUserModules() throws IOException, ParserConfigurationException, SAXException, URISyntaxException { + Assumptions.assumeFalse(getHubAdminConfig().getIsProvisionedEnvironment()); URL url = DataHubInstallTest.class.getClassLoader().getResource("data-hub-test"); String path = Paths.get(url.toURI()).toFile().getAbsolutePath(); File srcDir = new File(path); @@ -119,7 +122,7 @@ public void testInstallUserModules() throws IOException, ParserConfigurationExce HubConfig hubConfig = getHubAdminConfig(); int totalCount = getDocCount(HubConfig.DEFAULT_MODULES_DB_NAME, null); - installUserModules(hubConfig, true); + installUserModules(hubConfig, false); assertEquals( getResource("data-hub-test/plugins/entities/test-entity/harmonize/final/collector.xqy"), @@ -217,6 +220,12 @@ public void testInstallUserModules() throws IOException, ParserConfigurationExce getResource("data-hub-test/plugins/entities/test-entity/input/REST/transforms/test-input-transform.xqy"), getModulesFile("/marklogic.rest.transform/test-input-transform/assets/transform.xqy")); + /* + ** The following tests would fail as installUserModules() is run with "forceLoad" option set to true as the + * LoadUserModulesCommand runs first and the timestamp file it creates will be deleted by LoadUserArtifactsCommand + * as currently these 2 commands share the timestamp file + */ + String timestampFile = hubConfig.getHubProject().getUserModulesDeployTimestampFile(); PropertiesModuleManager propsManager = new PropertiesModuleManager(timestampFile); propsManager.initialize(); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DataHubTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DataHubTest.java index 02fdc057b1..8fbcd1444b 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DataHubTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DataHubTest.java @@ -28,6 +28,7 @@ import org.easymock.EasyMock; import org.jdom2.Namespace; import org.springframework.beans.factory.annotation.Autowired; +import org.junit.jupiter.api.*; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -239,6 +240,7 @@ public void testPreFlightCheckHubAlreadyInstalled() { @Test public void testPreFlightCheckStagingPortTaken() { + Assumptions.assumeTrue(!getHubAdminConfig().getIsProvisionedEnvironment()); List list = new ArrayList<>(); expect(serverManager.getAsXml()).andReturn(new ResourcesFragment(new Fragment(" /manage/v2/servers 2017-10-01T19:15:38.140598-04:00 0.030447 groups 1 /manage/v2/groups/Default 3341249095562999141 Default 8 3341249095562999141 Default /manage/v2/servers/Admin?group-id=Default http Security 7776582106827683360 Admin 3341249095562999141 Default /manage/v2/servers/App-Services?group-id=Default http Documents Modules 4626187627163603518 App-Services 3341249095562999141 Default /manage/v2/servers/port-stealer?group-id=Default http data-hub-STAGING data-hub-MODULES 10842453788764821876 port-stealer 3341249095562999141 Default /manage/v2/servers/HealthCheck?group-id=Default http App-Services 16530884482127520539 HealthCheck 3341249095562999141 Default /manage/v2/servers/Manage?group-id=Default http App-Services 15392081774558336614 Manage root default /manage/v2 list metrics /manage/v2/servers?view=metrics list package /manage/v2/servers?view=package list schema /manage/v2/servers?view=schema list status /manage/v2/servers?view=status ", list.toArray(new Namespace[] {})))); expect(serverManager.getPropertiesAsXml("Admin")).andReturn(new ResourcesFragment(new Fragment(" Admin Default http true Admin/ digest 8001 false true false
0.0.0.0
512 32 30 5 3600 10800 600 500 100 3600 1000 10000 http://marklogic.com/collation/ true 0 true false false false 0.9-ml contemporaneous fast none UTF-8 default default default default default default default none default omit default default compatible /error-switch.xqy rewriter.xqy false true true false false false false ALL:!LOW:@STRENGTH true Security nobody
", list.toArray(new Namespace[] {})))); @@ -260,6 +262,7 @@ public void testPreFlightCheckStagingPortTaken() { @Test public void testPreFlightCheckStagingPortTakenAndBadVersion() { + Assumptions.assumeTrue(!getHubAdminConfig().getIsProvisionedEnvironment()); List list = new ArrayList<>(); expect(serverManager.getAsXml()).andReturn(new ResourcesFragment(new Fragment(" /manage/v2/servers 2017-10-01T19:15:38.140598-04:00 0.030447 groups 1 /manage/v2/groups/Default 3341249095562999141 Default 8 3341249095562999141 Default /manage/v2/servers/Admin?group-id=Default http Security 7776582106827683360 Admin 3341249095562999141 Default /manage/v2/servers/App-Services?group-id=Default http Documents Modules 4626187627163603518 App-Services 3341249095562999141 Default /manage/v2/servers/port-stealer?group-id=Default http data-hub-STAGING data-hub-MODULES 10842453788764821876 port-stealer 3341249095562999141 Default /manage/v2/servers/HealthCheck?group-id=Default http App-Services 16530884482127520539 HealthCheck 3341249095562999141 Default /manage/v2/servers/Manage?group-id=Default http App-Services 15392081774558336614 Manage root default /manage/v2 list metrics /manage/v2/servers?view=metrics list package /manage/v2/servers?view=package list schema /manage/v2/servers?view=schema list status /manage/v2/servers?view=status ", list.toArray(new Namespace[] {})))); expect(serverManager.getPropertiesAsXml("Admin")).andReturn(new ResourcesFragment(new Fragment(" Admin Default http true Admin/ digest 8001 false true false
0.0.0.0
512 32 30 5 3600 10800 600 500 100 3600 1000 10000 http://marklogic.com/collation/ true 0 true false false false 0.9-ml contemporaneous fast none UTF-8 default default default default default default default none default omit default default compatible /error-switch.xqy rewriter.xqy false true true false false false false ALL:!LOW:@STRENGTH true Security nobody
", list.toArray(new Namespace[] {})))); @@ -281,6 +284,7 @@ public void testPreFlightCheckStagingPortTakenAndBadVersion() { @Test public void testPreFlightCheckFinalPortTaken() { + Assumptions.assumeTrue(!getHubAdminConfig().getIsProvisionedEnvironment()); List list = new ArrayList<>(); expect(serverManager.getAsXml()).andReturn(new ResourcesFragment(new Fragment(" /manage/v2/servers 2017-10-01T19:15:38.140598-04:00 0.030447 groups 1 /manage/v2/groups/Default 3341249095562999141 Default 8 3341249095562999141 Default /manage/v2/servers/Admin?group-id=Default http Security 7776582106827683360 Admin 3341249095562999141 Default /manage/v2/servers/App-Services?group-id=Default http Documents Modules 4626187627163603518 App-Services 3341249095562999141 Default /manage/v2/servers/port-stealer?group-id=Default http data-hub-STAGING data-hub-MODULES 10842453788764821876 port-stealer 3341249095562999141 Default /manage/v2/servers/HealthCheck?group-id=Default http App-Services 16530884482127520539 HealthCheck 3341249095562999141 Default /manage/v2/servers/Manage?group-id=Default http App-Services 15392081774558336614 Manage root default /manage/v2 list metrics /manage/v2/servers?view=metrics list package /manage/v2/servers?view=package list schema /manage/v2/servers?view=schema list status /manage/v2/servers?view=status ", list.toArray(new Namespace[] {})))); expect(serverManager.getPropertiesAsXml("Admin")).andReturn(new ResourcesFragment(new Fragment(" Admin Default http true Admin/ digest 8001 false true false
0.0.0.0
512 32 30 5 3600 10800 600 500 100 3600 1000 10000 http://marklogic.com/collation/ true 0 true false false false 0.9-ml contemporaneous fast none UTF-8 default default default default default default default none default omit default default compatible /error-switch.xqy rewriter.xqy false true true false false false false ALL:!LOW:@STRENGTH true Security nobody
", list.toArray(new Namespace[] {})))); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DebugLibTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DebugLibTest.java index 6c815091c1..c3fdac87e5 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DebugLibTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/DebugLibTest.java @@ -8,9 +8,9 @@ import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubTestBase; import com.marklogic.hub.ApplicationConfig; -import com.marklogic.hub.flow.CodeFormat; -import com.marklogic.hub.flow.DataFormat; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.DataFormat; +import com.marklogic.hub.legacy.flow.FlowType; import com.marklogic.hub.scaffold.Scaffolding; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/HubConfigTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/HubConfigTest.java index d1a088fef7..f81017bad2 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/HubConfigTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/HubConfigTest.java @@ -10,6 +10,7 @@ import com.marklogic.hub.HubTestBase; import com.marklogic.hub.error.DataHubConfigurationException; +import org.junit.jupiter.api.*; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -35,16 +36,26 @@ public void setup() { createProjectDir(); dataHub.initProject(); } - + @AfterEach public void cleanup() { resetProperties(); adminHubConfig.refreshProject(); } - + + @Test + public void testAppConfigDefaultProps() { + AppConfig config = adminHubConfig.getAppConfig(); + assertEquals(HubConfig.DEFAULT_FINAL_NAME, config.getContentDatabaseName()); + assertEquals(HubConfig.DEFAULT_FINAL_TRIGGERS_DB_NAME, config.getTriggersDatabaseName()); + assertEquals(HubConfig.DEFAULT_FINAL_SCHEMAS_DB_NAME, config.getSchemasDatabaseName()); + assertEquals(HubConfig.DEFAULT_MODULES_DB_NAME, config.getModulesDatabaseName()); + } + @Test public void applyFinalConnectionPropsToDefaultRestConnection() { - + Assumptions.assumeFalse(getHubAdminConfig().getIsProvisionedEnvironment()); + AppConfig config = adminHubConfig.getAppConfig(); assertEquals(new Integer(8011), config.getRestPort(), @@ -62,7 +73,7 @@ public void applyFinalConnectionPropsToDefaultRestConnection() { String certPassword = adminHubConfig.getCertPassword(DatabaseKind.FINAL); String extName = adminHubConfig.getExternalName(DatabaseKind.FINAL); Boolean sslMethod = adminHubConfig.getSimpleSsl(DatabaseKind.FINAL); - + Properties props = new Properties(); props.put("mlFinalAuth", "basic"); props.put("mlFinalPort", "8123"); @@ -74,8 +85,8 @@ public void applyFinalConnectionPropsToDefaultRestConnection() { resetProperties(); adminHubConfig.refreshProject(props, true); - config = adminHubConfig.getAppConfig(); - + config = adminHubConfig.getAppConfig(); + assertEquals(SecurityContextType.BASIC, config.getRestSecurityContextType()); assertEquals(new Integer(8123), config.getRestPort()); assertEquals("/path/to/file", config.getRestCertFile()); @@ -83,13 +94,13 @@ public void applyFinalConnectionPropsToDefaultRestConnection() { assertEquals("somename", config.getRestExternalName()); assertNotNull(config.getRestSslContext(), "Should have been set because mlFinalSimpleSsl=true"); assertNotNull(config.getRestSslHostnameVerifier(), "Should have been set because mlFinalSimpleSsl=true"); - assertNotNull(config.getRestTrustManager(), "Should have been set because mlFinalSimpleSsl=true"); - + assertNotNull(config.getRestTrustManager(), "Should have been set because mlFinalSimpleSsl=true"); + props = new Properties(); //reset them props.put("mlFinalAuth", authMethod); props.put("mlFinalPort", port); - + //these values not set by dhf-default, so checking for null if(certFile != null) props.put("mlFinalCertFile", certFile); @@ -104,8 +115,8 @@ public void applyFinalConnectionPropsToDefaultRestConnection() { adminHubConfig.setSslHostnameVerifier(DatabaseKind.FINAL, null); adminHubConfig.setTrustManager(DatabaseKind.FINAL, null); } - - + + } @Test @@ -114,17 +125,17 @@ public void testLoadBalancerProps() { resetProperties(); adminHubConfig.refreshProject(); assertNull(getHubFlowRunnerConfig().getLoadBalancerHost()); - + writeProp("mlIsHostLoadBalancer", "true"); resetProperties(); adminHubConfig.refreshProject(); assertTrue(getHubFlowRunnerConfig().getIsHostLoadBalancer()); - + writeProp("mlLoadBalancerHosts", getHubFlowRunnerConfig().getHost()); resetProperties(); adminHubConfig.refreshProject(); assertEquals(getHubFlowRunnerConfig().getHost(), getHubFlowRunnerConfig().getLoadBalancerHost()); - + try { writeProp("mlLoadBalancerHosts", "host1"); resetProperties(); @@ -133,7 +144,7 @@ public void testLoadBalancerProps() { catch (DataHubConfigurationException e){ assertEquals( "\"mlLoadBalancerHosts\" must be the same as \"mlHost\"", e.getMessage()); } - + deleteProp("mlLoadBalancerHosts"); deleteProp("mlIsHostLoadBalancer"); resetProperties(); @@ -141,6 +152,21 @@ public void testLoadBalancerProps() { assertFalse(getHubFlowRunnerConfig().getIsHostLoadBalancer()); } + @Test + public void testConfigAppName() { + deleteProp("mlAppName"); + resetProperties(); + adminHubConfig.refreshProject(); + // When not set, app name should default to "DHF" + assertEquals("DHF", adminHubConfig.getAppConfig().getName()); + + String appName = "data-hub"; + writeProp("mlAppName", appName); + resetProperties(); + adminHubConfig.refreshProject(); + assertEquals(appName, adminHubConfig.getAppConfig().getName()); + } + @Test public void testHubInfo() { diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/HubProjectTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/HubProjectTest.java index db8e120ed4..5595320512 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/core/HubProjectTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/core/HubProjectTest.java @@ -1,17 +1,12 @@ package com.marklogic.hub.core; +import com.marklogic.hub.ApplicationConfig; import com.marklogic.hub.DatabaseKind; import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubTestBase; -import com.marklogic.hub.ApplicationConfig; - import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Assumptions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -34,7 +29,7 @@ public class HubProjectTest extends HubTestBase { @BeforeEach public void setupDir() { - deleteProjectDir(); + deleteProjectDir(); } @AfterEach @@ -42,6 +37,7 @@ public void cleanup() { resetProperties(); createProjectDir(); adminHubConfig.createProject(PROJECT_PATH); + adminHubConfig.withPropertiesFromEnvironment("local"); adminHubConfig.refreshProject(); } @@ -152,10 +148,22 @@ public void testInit() throws IOException { File gradleLocalProperties = new File(projectPath, "gradle-local.properties"); assertTrue(gradleLocalProperties.exists()); } + + @Test + public void testUserModulesDeployTimestampFilePath() { + String envName = "dev"; + + adminHubConfig.withPropertiesFromEnvironment(envName); + adminHubConfig.refreshProject(); + + String expectedPath = Paths.get(PROJECT_PATH, ".tmp", envName + "-" + adminHubConfig.USER_MODULES_DEPLOY_TIMESTAMPS_PROPERTIES).toString(); + + assertEquals(expectedPath, adminHubConfig.getHubProject().getUserModulesDeployTimestampFile()); + } @Test public void upgrade300To403ToCurrentVersion() throws Exception { - Assumptions.assumeFalse((isCertAuth() || isSslRun())); + Assumptions.assumeFalse((isCertAuth() || isSslRun() || getHubAdminConfig().getIsProvisionedEnvironment())); final String projectPath = "build/tmp/upgrade-projects/dhf403from300"; final File projectDir = Paths.get(projectPath).toFile(); @@ -166,7 +174,7 @@ public void upgrade300To403ToCurrentVersion() throws Exception { adminHubConfig.refreshProject(); dataHub.upgradeHub(); - + // Confirm that the directories have been backed up Assertions.assertTrue(adminHubConfig.getHubProject().getProjectDir() .resolve("src/main/hub-internal-config-4.0.3").toFile().exists()); @@ -175,6 +183,6 @@ public void upgrade300To403ToCurrentVersion() throws Exception { .resolve("src/main/hub-internal-config-4.0.3/databases/final-database.json").toFile().exists()); Assertions.assertTrue(adminHubConfig.getHubProject().getProjectDir() .resolve("src/main/ml-config-4.0.3").toFile().exists()); - + } } diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/HubAppDeployerTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/HubAppDeployerTest.java new file mode 100644 index 0000000000..1ba61cc573 --- /dev/null +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/HubAppDeployerTest.java @@ -0,0 +1,83 @@ +package com.marklogic.hub.deploy; + +import com.marklogic.appdeployer.AppConfig; +import com.marklogic.appdeployer.command.Command; +import com.marklogic.appdeployer.command.CommandContext; +import com.marklogic.hub.deploy.util.HubDeployStatusListener; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import static org.junit.jupiter.api.Assertions.*; + +public class HubAppDeployerTest { + + @Test + public void test() { + List messages = new ArrayList<>(); + + List commands = new ArrayList<>(); + commands.add(new TestCommand(20, messages)); + commands.add(new TestCommand(30, messages)); + commands.add(new TestCommand(10, messages)); + + TestListener testListener = new TestListener(); + + HubAppDeployer appDeployer = new HubAppDeployer(null, null, testListener, null); + appDeployer.setCommands(commands); + appDeployer.deploy(new AppConfig()); + + // Verify commands were executed in correct order + assertEquals("My sort order: 10", messages.get(0)); + assertEquals("My sort order: 20", messages.get(1)); + assertEquals("My sort order: 30", messages.get(2)); + + // Verify correct status messages were passed to our listener + System.out.println(testListener.getMessages()); + assertEquals("0:Installing...", testListener.getMessages().get(0)); + assertEquals("0:[Step 1 of 3] com.marklogic.hub.deploy.TestCommand", testListener.getMessages().get(1)); + assertEquals("33:[Step 2 of 3] com.marklogic.hub.deploy.TestCommand", testListener.getMessages().get(2)); + assertEquals("66:[Step 3 of 3] com.marklogic.hub.deploy.TestCommand", testListener.getMessages().get(3)); + assertEquals("100:Installation Complete", testListener.getMessages().get(4)); + } +} + +class TestCommand implements Command { + + private int sortOrder; + private List messages; + + public TestCommand(int sortOrder, List messages) { + this.sortOrder = sortOrder; + this.messages = messages; + } + + @Override + public void execute(CommandContext context) { + messages.add("My sort order: " + sortOrder); + } + + @Override + public Integer getExecuteSortOrder() { + return sortOrder; + } +} + +class TestListener implements HubDeployStatusListener { + + private List messages = new ArrayList<>(); + + @Override + public void onStatusChange(int percentComplete, String message) { + messages.add(percentComplete + ":" + message); + } + + @Override + public void onError() { + + } + + public List getMessages() { + return messages; + } +} diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/GenerateHubTDETemplateCommandTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/GenerateHubTDETemplateCommandTest.java index 794657ad69..35aca27aa1 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/GenerateHubTDETemplateCommandTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/GenerateHubTDETemplateCommandTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/GeneratePiiCommandTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/GeneratePiiCommandTest.java index 4a8fc507cc..62251ef915 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/GeneratePiiCommandTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/GeneratePiiCommandTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadHubModulesCommandTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadHubModulesCommandTest.java index 0e8662f48d..7f08c40a84 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadHubModulesCommandTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadHubModulesCommandTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadUserModulesCommandTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadUserArtifactsCommandTest.java similarity index 59% rename from marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadUserModulesCommandTest.java rename to marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadUserArtifactsCommandTest.java index 1e8c151e86..eee2513e6e 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadUserModulesCommandTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/deploy/commands/LoadUserArtifactsCommandTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -32,50 +33,63 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = ApplicationConfig.class) -public class LoadUserModulesCommandTest extends HubTestBase { - - public LoadUserModulesCommand loadUserModulesCommand; +public class LoadUserArtifactsCommandTest extends HubTestBase { @BeforeEach public void setup() { - loadUserModulesCommand = new LoadUserModulesCommand(); - loadUserModulesCommand.setHubConfig(getHubAdminConfig()); + loadUserArtifactsCommand.setHubConfig(getHubAdminConfig()); } @Test public void testIsEntityDir() { Path startPath = Paths.get("/tmp/my-project/plugins/entities"); Path dir = Paths.get("/tmp/my-project/plugins/entities/my-entity"); - assertTrue(loadUserModulesCommand.isEntityDir(dir, startPath)); + assertTrue(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); startPath = Paths.get("/tmp/my-project/plugins/entities"); dir = Paths.get("/tmp/my-project/plugins/entities"); - assertFalse(loadUserModulesCommand.isEntityDir(dir, startPath)); + assertFalse(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); startPath = Paths.get("/tmp/my-project/plugins/entities"); dir = Paths.get("/tmp/my-project/plugins/entities/my-entity/input"); - assertFalse(loadUserModulesCommand.isEntityDir(dir, startPath)); + assertFalse(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); startPath = Paths.get("/tmp/my-project/plugins/entities"); dir = Paths.get("/tmp/my-project/plugins/entities/my-entity/input/my-input-flow"); - assertFalse(loadUserModulesCommand.isEntityDir(dir, startPath)); + assertFalse(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); + + startPath = Paths.get("/tmp/my-project/plugins/mappings"); + dir = Paths.get("/tmp/my-project/plugins/mappings/my-mappings/input"); + assertFalse(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); + + startPath = Paths.get("/tmp/my-project/plugins/mappings"); + dir = Paths.get("/tmp/my-project/plugins/mappings/my-mappings"); + assertTrue(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); // test windows paths startPath = Paths.get("c:\\temp\\my-project\\plugins\\entities"); dir = Paths.get("c:\\temp\\my-project\\plugins\\entities\\my-entity"); - assertTrue(loadUserModulesCommand.isEntityDir(dir, startPath)); + assertTrue(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); startPath = Paths.get("c:\\temp\\my-project\\plugins\\entities"); dir = Paths.get("c:\\temp\\my-project\\plugins\\entities"); - assertFalse(loadUserModulesCommand.isEntityDir(dir, startPath)); + assertFalse(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); startPath = Paths.get("c:\\temp\\my-project\\plugins\\entities"); dir = Paths.get("c:\\temp\\my-project\\plugins\\entities\\my-entity\\input"); - assertFalse(loadUserModulesCommand.isEntityDir(dir, startPath)); + assertFalse(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); startPath = Paths.get("c:\\temp\\my-project\\plugins\\entities"); dir = Paths.get("c:\\temp\\my-project\\plugins\\entities\\my-entity\\input\\my-input-flow"); - assertFalse(loadUserModulesCommand.isEntityDir(dir, startPath)); + assertFalse(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); + + startPath = Paths.get("c:\\temp\\my-project\\plugins\\mappings"); + dir = Paths.get("c:\\temp\\my-project\\plugins\\mappings\\my-mappings\\path1\\path2"); + assertFalse(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); + + startPath = Paths.get("c:\\temp\\my-project\\plugins\\mappings"); + dir = Paths.get("c:\\temp\\my-project\\plugins\\mappings\\my-mappings"); + assertTrue(loadUserArtifactsCommand.isArtifactDir(dir, startPath)); } } diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/FlowManagerTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/FlowManagerTest.java index 89434cc6d1..8fbc1e9c20 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/FlowManagerTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/FlowManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,423 +13,126 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.marklogic.hub.flow; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.marklogic.bootstrap.Installer; -import com.marklogic.client.io.DOMHandle; -import com.marklogic.client.io.DocumentMetadataHandle; -import com.marklogic.hub.FlowManager; -import com.marklogic.hub.HubConfig; -import com.marklogic.hub.HubTestBase; -import com.marklogic.hub.collector.Collector; import com.marklogic.hub.ApplicationConfig; -import com.marklogic.hub.main.MainPlugin; -import com.marklogic.hub.scaffold.Scaffolding; +import com.marklogic.hub.HubTestBase; +import com.marklogic.hub.impl.FlowManagerImpl; import org.apache.commons.io.FileUtils; -import org.json.JSONException; -import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.stream.XMLStreamException; import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; import java.util.List; -import static com.marklogic.client.io.DocumentMetadataHandle.Capability.*; -import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; -import static org.junit.jupiter.api.Assertions.assertEquals; - @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = ApplicationConfig.class) -public class FlowManagerTest extends HubTestBase { +class FlowManagerTest extends HubTestBase { @Autowired - private FlowManager fm; - - @Autowired - private Scaffolding scaffolding; - - @BeforeAll - public static void runOnce() { - new Installer().deleteProjectDir(); - } + private FlowManagerImpl fm; + + private String flowString = "{\n" + + " \"name\": \"test-flow\",\n" + + " \"Description\": \"this is an example\",\n" + + " \"Identifier\": \"(some identifier or search)\",\n" + + " \"Steps\": [{\n" + + " \"0\": {\n" + + " \"type\": \"mapping\",\n" + + " \"name\": \"person-mapping1.json\",\n" + + " \"identifier\": \"null\",\n" + + " \"retryLimit\": 0,\n" + + " \"options\": {}\n" + + " }\n" + + " }]\n" + + "}\n"; @BeforeEach - public void setup() throws IOException { + void setUp() throws IOException { basicSetup(); getHubAdminConfig(); - enableDebugging(); - - clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME); - - addStagingDocs(); - installModules(); - } - - private void installModules() { - HashMap modules = new HashMap<>(); - modules.put( - "/entities/test/harmonize/my-test-flow1/collector.xqy", - "flow-manager-test/my-test-flow1/collector.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow1/main.xqy", - "flow-manager-test/my-test-flow1/main.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow1/content.xqy", - "flow-manager-test/my-test-flow1/content.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow1/headers.xqy", - "flow-manager-test/my-test-flow1/headers.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow1/triples.xqy", - "flow-manager-test/my-test-flow1/triples.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow1/writer.xqy", - "flow-manager-test/my-test-flow1/writer.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow1/my-test-flow1.xml", - "flow-manager-test/my-test-flow1/my-test-flow1.xml"); - modules.put( - "/entities/test/harmonize/my-test-flow2/collector.xqy", - "flow-manager-test/my-test-flow1/collector.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow2/main.xqy", - "flow-manager-test/my-test-flow1/main.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow2/content.xqy", - "flow-manager-test/my-test-flow1/content.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow2/headers.xqy", - "flow-manager-test/my-test-flow1/headers.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow2/triples.xqy", - "flow-manager-test/my-test-flow1/triples.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow2/writer.xqy", - "flow-manager-test/my-test-flow1/writer.xqy"); - modules.put( - "/entities/test/harmonize/my-test-flow2/my-test-flow2.xml", - "flow-manager-test/my-test-flow1/my-test-flow2.xml"); - installModules(modules); - } - - private void addStagingDocs() { - clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME); - DocumentMetadataHandle meta = new DocumentMetadataHandle(); - meta.getCollections().add("tester"); - meta.getPermissions().add(getHubAdminConfig().getHubRoleName(), READ, UPDATE, EXECUTE); - installStagingDoc("/employee1.xml", meta, "flow-manager-test/input/employee1.xml"); - installStagingDoc("/employee2.xml", meta, "flow-manager-test/input/employee2.xml"); + FileUtils.copyFileToDirectory(getResourceFile("flow-manager-test/test-flow.flow.json"), adminHubConfig.getFlowsDir().toFile()); } - private void addFinalDocs() { - clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME); - DocumentMetadataHandle meta = new DocumentMetadataHandle(); - meta.getCollections().add("tester"); - meta.getPermissions().add(getHubAdminConfig().getHubRoleName(), READ, UPDATE, EXECUTE); - installFinalDoc("/employee1.xml", meta, "flow-manager-test/input/employee1.xml"); - installFinalDoc("/employee2.xml", meta, "flow-manager-test/input/employee2.xml"); + @AfterAll + static void runAfterAll() { + new Installer().deleteProjectDir(); } @Test - public void testFlowFromXml() { - Document d = getXmlFromResource("flow-manager-test/simple-flow.xml"); - - Flow flow = FlowManager.flowFromXml(d.getDocumentElement()); - assertEquals(flow.getName(), "my-test-flow"); - assertEquals(flow.getCollector().getCodeFormat(), CodeFormat.XQUERY); - assertEquals(flow.getCollector().getModule(), "/entities/test/harmonize/my-test-flow/collector.xqy"); - assertEquals(flow.getMain().getCodeFormat(), CodeFormat.XQUERY); - assertEquals(flow.getMain().getModule(), "/entities/test/harmonize/my-test-flow/main.xqy"); + void getFlow() { + Flow flow = fm.getFlow("test-flow"); + Assertions.assertNotNull(flow); + Assertions.assertEquals("test-flow", flow.getName()); } @Test - public void testFlowToXml() throws IOException, ParserConfigurationException, SAXException { - Flow flow = FlowBuilder.newFlow() - .withEntityName("test") - .withName("my-test-flow") - .withType(FlowType.HARMONIZE) - .withDataFormat(DataFormat.XML) - .withCodeFormat(CodeFormat.XQUERY) - .build(); - String expected = getResource("flow-manager-test/simple-flow.xml"); - String actual = flow.serialize(); - assertXMLEqual(expected, actual); + void getFlowAsJSON() throws IOException { + String actual = fm.getFlowAsJSON("test-flow"); + assertJsonEqual(flowString, actual, true); } @Test - public void testGetLocalFlows() throws IOException { - createProjectDir(PROJECT_PATH); - scaffolding.createEntity("my-entity"); - - assertEquals(0, fm.getLocalFlows().size()); - - CodeFormat[] codeFormats = new CodeFormat[] { CodeFormat.JAVASCRIPT, CodeFormat.XQUERY }; - DataFormat[] dataFormats = new DataFormat[] { DataFormat.JSON, DataFormat.XML }; - FlowType[] flowTypes = new FlowType[] { FlowType.INPUT, FlowType.HARMONIZE }; - for (CodeFormat codeFormat : codeFormats) { - for (DataFormat dataFormat : dataFormats) { - for (FlowType flowType : flowTypes) { - String flowName = flowType.toString() + "-" + codeFormat.toString() + "-" + dataFormat.toString(); - scaffolding.createFlow("my-entity", flowName, flowType, codeFormat, dataFormat, false); - } - } - } - - List flows = fm.getLocalFlows(); - assertEquals(8, flows.size()); - - for (Flow flow : flows) { - assertEquals("my-entity", flow.getEntityName()); - } - - FileUtils.deleteDirectory(Paths.get("./del-me-dir").toFile()); + void getFlows() { + List flows = fm.getFlows(); + Assertions.assertEquals(flows.size() , 1); + Assertions.assertEquals(flows.get(0).getName(), fm.getFlow("test-flow").getName()); } @Test - public void testGetFlowFromProperties() throws IOException { - scaffolding.createEntity("my-entity"); - - allCombos((codeFormat, dataFormat, flowType, useEs) -> { - String flowName = flowType.toString() + "-" + codeFormat.toString() + "-" + dataFormat.toString(); - scaffolding.createFlow("my-entity", flowName, flowType, codeFormat, dataFormat, false); - }); - - - allCombos((codeFormat, dataFormat, flowType, useEs) -> { - String flowName = flowType.toString() + "-" + codeFormat.toString() + "-" + dataFormat.toString(); - Path propertiesFile = Paths.get(PROJECT_PATH, "plugins", "entities", "my-entity", flowType.toString(), flowName, flowName + ".properties"); - Flow flow = fm.getFlowFromProperties(propertiesFile); - assertEquals(flowName, flow.getName()); - assertEquals("my-entity", flow.getEntityName()); - assertEquals(codeFormat, flow.getCodeFormat()); - assertEquals(dataFormat, flow.getDataFormat()); - assertEquals(flowType, flow.getType()); - }); - - deleteProjectDir(); + void getFlowNames() { + List flows = fm.getFlowNames(); + Assertions.assertEquals(flows.size() , 1); + Assertions.assertEquals(flows.get(0) , "test-flow"); } @Test - public void testGetFlows() { - getDataHub().clearUserModules(); - - installHubModules(); - - installModule("/entities/test/harmonize/my-test-flow1/my-test-flow1.xml", "flow-manager-test/my-test-flow1/my-test-flow1.xml"); - installModule("/entities/test/harmonize/my-test-flow2/my-test-flow2.xml", "flow-manager-test/my-test-flow1/my-test-flow2.xml"); - - List flows = fm.getFlows("test"); - assertEquals(2, flows.size()); - - // flow 1 - Flow flow1 = flows.get(0); - assertEquals("my-test-flow1", flow1.getName()); - assertEquals(CodeFormat.XQUERY, flow1.getCodeFormat()); - assertEquals(DataFormat.XML, flow1.getDataFormat()); - assertEquals("test", flow1.getEntityName()); - assertEquals(FlowType.HARMONIZE, flow1.getType()); - - Collector c = flow1.getCollector(); - assertEquals(CodeFormat.XQUERY, c.getCodeFormat()); - assertEquals("/entities/test/harmonize/my-test-flow1/collector.xqy", c.getModule()); - - MainPlugin main = flow1.getMain(); - assertEquals(CodeFormat.XQUERY, main.getCodeFormat()); - assertEquals("/entities/test/harmonize/my-test-flow1/main.xqy", main.getModule()); - - // flow 2 - Flow flow2 = flows.get(1); - assertEquals("my-test-flow2", flow2.getName()); - assertEquals(CodeFormat.XQUERY, flow2.getCodeFormat()); - assertEquals(DataFormat.XML, flow2.getDataFormat()); - assertEquals("test", flow2.getEntityName()); - assertEquals(FlowType.HARMONIZE, flow2.getType()); - - c = flow2.getCollector(); - assertEquals(CodeFormat.XQUERY, c.getCodeFormat()); - assertEquals("/entities/test/harmonize/my-test-flow1/collector.xqy", c.getModule()); - - main = flow2.getMain(); - assertEquals(CodeFormat.XQUERY, main.getCodeFormat()); - assertEquals("/entities/test/harmonize/my-test-flow1/main.xqy", main.getModule()); - } - - @Test - public void getTestFlow() { - installModule("/entities/test/harmonize/my-test-flow1/my-test-flow1.xml", "flow-manager-test/my-test-flow1/my-test-flow1-json.xml"); - - Flow flow1 = fm.getFlow("test", "my-test-flow1"); - assertEquals("my-test-flow1", flow1.getName()); - assertEquals(CodeFormat.JAVASCRIPT, flow1.getCodeFormat()); - assertEquals(DataFormat.JSON, flow1.getDataFormat()); - assertEquals("test", flow1.getEntityName()); - assertEquals(FlowType.HARMONIZE, flow1.getType()); - - Collector c = flow1.getCollector(); - assertEquals(CodeFormat.JAVASCRIPT, c.getCodeFormat()); - assertEquals("/entities/test/harmonize/my-test-flow1/collector.sjs", c.getModule()); - - MainPlugin main = flow1.getMain(); - assertEquals(CodeFormat.JAVASCRIPT, main.getCodeFormat()); - assertEquals("/entities/test/harmonize/my-test-flow1/main.sjs", main.getModule()); + void createFlow() { + Flow flow = fm.createFlow("test-flow"); + Assertions.assertEquals("test-flow", flow.getName()); } @Test - public void testRunFlow() throws SAXException, IOException, ParserConfigurationException, XMLStreamException { - addStagingDocs(); - installModules(); - assertEquals(2, getStagingDocCount()); - assertEquals(0, getFinalDocCount()); - getHubFlowRunnerConfig(); - Flow flow1 = fm.getFlow("test", "my-test-flow1"); - FlowRunner flowRunner = fm.newFlowRunner() - .withFlow(flow1) - .withBatchSize(10) - .withThreadCount(1); - flowRunner.run(); - flowRunner.awaitCompletion(); - getHubAdminConfig(); - assertEquals(2, getStagingDocCount()); - assertEquals(2, getFinalDocCount()); - assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized/harmonized1.xml"), finalDocMgr.read("/employee1.xml").next().getContent(new DOMHandle()).get() ); - assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized/harmonized2.xml"), finalDocMgr.read("/employee2.xml").next().getContent(new DOMHandle()).get()); - DocumentMetadataHandle metadata = finalDocMgr.readMetadata("/employee1.xml", new DocumentMetadataHandle()); - DocumentMetadataHandle.DocumentPermissions permissions = metadata.getPermissions(); - assertEquals( permissions.get("harmonized-reader").toString(), "[READ]", "Default permissions on harmonized documents should contain harmonized-reader/read"); - assertEquals(permissions.get("harmonized-updater").toString(), "[UPDATE]", "Default permissions on harmonized documents should contain harmonized-updater/update"); + void createFlowFromJSON() { + fm.deleteFlow("test-flow"); + Flow flow = fm.createFlowFromJSON(flowString); + Assertions.assertEquals("test-flow", flow.getName()); } @Test - public void testRunFlowWithBackwards() throws SAXException, IOException, ParserConfigurationException, XMLStreamException { - addFinalDocs(); - installModules(); - assertEquals(0, getStagingDocCount()); - assertEquals(2, getFinalDocCount()); - getHubFlowRunnerConfig(); - Flow flow1 = fm.getFlow("test", "my-test-flow1"); - FlowRunner flowRunner = fm.newFlowRunner() - .withFlow(flow1) - .withBatchSize(10) - .withThreadCount(1) - .withSourceClient(getHubFlowRunnerConfig().newReverseFlowClient()) - .withDestinationDatabase(HubConfig.DEFAULT_STAGING_NAME); - flowRunner.run(); - flowRunner.awaitCompletion(); - getHubAdminConfig(); - assertEquals(2, getStagingDocCount()); - assertEquals(2, getFinalDocCount()); - assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized/harmonized1.xml"), stagingDocMgr.read("/employee1.xml").next().getContent(new DOMHandle()).get() ); - assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized/harmonized2.xml"), stagingDocMgr.read("/employee2.xml").next().getContent(new DOMHandle()).get()); - DocumentMetadataHandle metadata = stagingDocMgr.readMetadata("/employee1.xml", new DocumentMetadataHandle()); - DocumentMetadataHandle.DocumentPermissions permissions = metadata.getPermissions(); - assertEquals(permissions.get("harmonized-reader").toString(), "[READ]", "Default permissions on harmonized documents should contain harmonized-reader/read"); - assertEquals(permissions.get("harmonized-updater").toString(), "[UPDATE]", "Default permissions on harmonized documents should contain harmonized-updater/update"); + void createFlowFromJSON1() throws IOException { + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = mapper.readTree(flowString); + Flow flow = fm.createFlowFromJSON(node); + Assertions.assertEquals("test-flow", flow.getName()); } @Test - public void testRunFlowWithHeader() throws SAXException, IOException, ParserConfigurationException, XMLStreamException { - addStagingDocs(); - HashMap modules = new HashMap<>(); - modules.put("/entities/test/harmonize/my-test-flow-with-header/flow.xml", "flow-manager-test/my-test-flow-with-header/flow.xml"); - modules.put("/entities/test/harmonize/my-test-flow-with-header/collector.xqy", "flow-manager-test/my-test-flow-with-header/collector.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-header/content.xqy", "flow-manager-test/my-test-flow-with-header/content.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-header/headers.xqy", "flow-manager-test/my-test-flow-with-header/headers.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-header/triples.xqy", "flow-manager-test/my-test-flow-with-header/triples.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-header/writer.xqy", "flow-manager-test/my-test-flow-with-header/writer.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-header/main.xqy", "flow-manager-test/my-test-flow-with-header/main.xqy"); - installModules(modules); - - assertEquals(2, getStagingDocCount()); - assertEquals(0, getFinalDocCount()); - getHubFlowRunnerConfig(); - Flow flow1 = fm.getFlow("test", "my-test-flow-with-header"); - FlowRunner flowRunner = fm.newFlowRunner() - .withFlow(flow1) - .withBatchSize(10) - .withThreadCount(1); - flowRunner.run(); - flowRunner.awaitCompletion(); - getHubAdminConfig(); - assertEquals(2, getStagingDocCount()); - assertEquals(2, getFinalDocCount()); - assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized-with-header/harmonized1.xml"), finalDocMgr.read("/employee1.xml").next().getContent(new DOMHandle()).get() ); - assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized-with-header/harmonized2.xml"), finalDocMgr.read("/employee2.xml").next().getContent(new DOMHandle()).get()); + void deleteFlow() { + fm.deleteFlow("test-flow"); - runInModules("xdmp:directory-delete(\"/entities/test/harmonize/my-test-flow-with-header/\")"); + Flow flow = fm.getFlow("test-flow"); + Assertions.assertNull(flow); } @Test - public void testRunFlowWithAll() throws SAXException, IOException, ParserConfigurationException, XMLStreamException { - addStagingDocs(); - HashMap modules = new HashMap<>(); - modules.put("/entities/test/harmonize/my-test-flow-with-all/my-test-flow-with-all.xml", "flow-manager-test/my-test-flow-with-all/my-test-flow-with-all.xml"); - modules.put("/entities/test/harmonize/my-test-flow-with-all/collector.xqy", "flow-manager-test/my-test-flow-with-all/collector.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-all/headers.xqy", "flow-manager-test/my-test-flow-with-all/headers.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-all/content.xqy", "flow-manager-test/my-test-flow-with-all/content.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-all/triples.xqy", "flow-manager-test/my-test-flow-with-all/triples.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-all/writer.xqy", "flow-manager-test/my-test-flow-with-all/writer.xqy"); - modules.put("/entities/test/harmonize/my-test-flow-with-all/main.xqy", "flow-manager-test/my-test-flow-with-all/main.xqy"); - installModules(modules); - - assertEquals(2, getStagingDocCount()); - assertEquals(0, getFinalDocCount()); - getHubFlowRunnerConfig(); - Flow flow1 = fm.getFlow("test", "my-test-flow-with-all"); - FlowRunner flowRunner = fm.newFlowRunner() - .withFlow(flow1) - .withBatchSize(10) - .withThreadCount(1); - flowRunner.run(); - flowRunner.awaitCompletion(); - getHubAdminConfig(); - assertEquals(2, getStagingDocCount()); - assertEquals(2, getFinalDocCount()); - assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized-with-all/harmonized1.xml"), finalDocMgr.read("/employee1.xml").next().getContent(new DOMHandle()).get() ); - assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized-with-all/harmonized2.xml"), finalDocMgr.read("/employee2.xml").next().getContent(new DOMHandle()).get()); - - runInModules("xdmp:directory-delete(\"/entities/test/harmonize/my-test-flow-with-all/\")"); - } - - - @Test - public void testHasLegacyflows() throws IOException, InterruptedException, ParserConfigurationException, SAXException, JSONException { - - scaffolding.createEntity("new-entity"); - scaffolding.createFlow("new-entity", "new-flow", FlowType.HARMONIZE, CodeFormat.XQUERY, DataFormat.XML, false); - assertEquals(0, fm.getLegacyFlows().size()); - - Path projectPath = Paths.get(PROJECT_PATH); - allCombos((codeFormat, dataFormat, flowType, useEs) -> { - Path dir = projectPath.resolve("plugins/entities/my-fun-test/" + flowType.toString()); - String flowName = "legacy-" + codeFormat.toString() + "-" + dataFormat.toString() + "-" + flowType.toString() + "-flow"; - try { - FileUtils.copyDirectory(getResourceFile("scaffolding-test/" + flowName), dir.resolve(flowName).toFile()); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); + void saveFlow() throws IOException { + fm.deleteFlow("test-flow"); + ObjectMapper mapper = new ObjectMapper(); + JsonNode node = mapper.readTree(flowString); + Flow flow = fm.createFlowFromJSON(node); + fm.saveFlow(flow); + Assertions.assertEquals("test-flow", fm.getFlow("test-flow").getName()); - List legacyFlows = fm.getLegacyFlows(); - assertEquals(8, legacyFlows.size()); - legacyFlows.sort(String::compareToIgnoreCase); - assertEquals("my-fun-test => legacy-sjs-json-harmonize-flow", legacyFlows.get(0)); - assertEquals("my-fun-test => legacy-sjs-json-input-flow", legacyFlows.get(1)); - assertEquals("my-fun-test => legacy-sjs-xml-harmonize-flow", legacyFlows.get(2)); - assertEquals("my-fun-test => legacy-sjs-xml-input-flow", legacyFlows.get(3)); - assertEquals("my-fun-test => legacy-xqy-json-harmonize-flow", legacyFlows.get(4)); - assertEquals("my-fun-test => legacy-xqy-json-input-flow", legacyFlows.get(5)); - assertEquals("my-fun-test => legacy-xqy-xml-harmonize-flow", legacyFlows.get(6)); - assertEquals("my-fun-test => legacy-xqy-xml-input-flow", legacyFlows.get(7)); } } diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/impl/UpgradeProjectTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/impl/UpgradeProjectTest.java index ee38d50b12..df6ca2edcd 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/impl/UpgradeProjectTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/impl/UpgradeProjectTest.java @@ -3,12 +3,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.marklogic.hub.HubConfig; import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Test; import java.io.File; import java.nio.file.Paths; import java.util.HashMap; +import java.util.Map; import static org.junit.jupiter.api.Assertions.*; @@ -28,8 +30,8 @@ public void upgrade300ToCurrentVersion() throws Exception { HubProjectImpl hubProject = new HubProjectImpl(); hubProject.createProject(projectPath); - // The tokens map doesn't seem to matter for what we're testing here - hubProject.init(new HashMap<>()); + // We require %%mlStagingSchemasDbName%% in the map for test. In real scenarios, its value will always be set. + hubProject.init(createMap()); hubProject.upgradeProject(); File srcDir = new File(projectDir, "src"); @@ -53,8 +55,8 @@ public void upgrade300To403ToCurrentVersion() throws Exception { HubProjectImpl hubProject = new HubProjectImpl(); hubProject.createProject(projectPath); - // The tokens map doesn't seem to matter for what we're testing here - hubProject.init(new HashMap<>()); + // We require %%mlStagingSchemasDbName%% in the map for test. In real scenarios, its value will always be set. + hubProject.init(createMap()); hubProject.upgradeProject(); File srcDir = new File(projectDir, "src"); @@ -69,9 +71,18 @@ public void upgrade300To403ToCurrentVersion() throws Exception { verifyUserServers(configDir); } + private Map createMap() { + Map myMap = new HashMap<>(); + myMap.put("%%mlStagingSchemasDbName%%", HubConfig.DEFAULT_STAGING_SCHEMAS_DB_NAME); + return myMap; + } + private void verifyInternalDatabases(File internalConfigDir) { File databasesDir = new File(internalConfigDir, "databases"); + // old schemas doesn't exist + assertFalse(internalConfigDir.toPath().resolve("schemas").toFile().exists()); + File jobFile = new File(databasesDir, "job-database.json"); assertTrue(jobFile.exists()); ObjectNode jobDatabase = readFile(jobFile); @@ -128,6 +139,8 @@ private void verifyJobDatabaseHasPathRangeIndexes(ObjectNode jobDatabase) { private void verifyUserDatabases(File configDir) { File databasesDir = new File(configDir, "databases"); + // new schemas path exists + assertTrue(databasesDir.toPath().resolve(HubConfig.DEFAULT_STAGING_SCHEMAS_DB_NAME).resolve("schemas").toFile().exists()); File finalFile = new File(databasesDir, "final-database.json"); assertTrue(finalFile.exists()); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/collector/DiskQueueTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/collector/DiskQueueTest.java similarity index 98% rename from marklogic-data-hub/src/test/java/com/marklogic/hub/collector/DiskQueueTest.java rename to marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/collector/DiskQueueTest.java index 1d9ee831a9..dc5f1bda00 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/collector/DiskQueueTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/collector/DiskQueueTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.collector; +package com.marklogic.hub.legacy.collector; import com.marklogic.hub.HubTestBase; import org.junit.jupiter.api.Test; diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/collector/EmptyCollectorTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/collector/EmptyLegacyCollectorTest.java similarity index 90% rename from marklogic-data-hub/src/test/java/com/marklogic/hub/collector/EmptyCollectorTest.java rename to marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/collector/EmptyLegacyCollectorTest.java index c08892b239..5854b1d16c 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/collector/EmptyCollectorTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/collector/EmptyLegacyCollectorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.collector; +package com.marklogic.hub.legacy.collector; import com.fasterxml.jackson.databind.JsonNode; import com.marklogic.client.datamovement.JobTicket; @@ -21,7 +21,7 @@ import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubTestBase; import com.marklogic.hub.ApplicationConfig; -import com.marklogic.hub.flow.*; +import com.marklogic.hub.legacy.flow.*; import org.custommonkey.xmlunit.XMLUnit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -38,7 +38,7 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = ApplicationConfig.class) -public class EmptyCollectorTest extends HubTestBase { +public class EmptyLegacyCollectorTest extends HubTestBase { private static final String ENTITY = "streamentity"; private static Path projectDir = Paths.get(".", "ye-olde-project"); @@ -65,13 +65,13 @@ public void setup() throws IOException { public void runCollector() { assertEquals(0, getStagingDocCount()); assertEquals(0, getFinalDocCount()); - Flow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize", + LegacyFlow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize", FlowType.HARMONIZE); HashMap options = new HashMap<>(); // a sneaky attempt to test passing options. this value makes the collector work. options.put("returnStuff", true); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(harmonizeFlow) .withBatchSize(10) .withThreadCount(1) diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/flow/LegacyFlowManagerTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/flow/LegacyFlowManagerTest.java new file mode 100644 index 0000000000..698ba34e31 --- /dev/null +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/flow/LegacyFlowManagerTest.java @@ -0,0 +1,438 @@ +/* + * Copyright 2012-2016 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.marklogic.hub.legacy.flow; + +import com.marklogic.bootstrap.Installer; +import com.marklogic.client.io.DOMHandle; +import com.marklogic.client.io.DocumentMetadataHandle; +import com.marklogic.hub.legacy.LegacyFlowManager; +import com.marklogic.hub.HubConfig; +import com.marklogic.hub.HubTestBase; +import com.marklogic.hub.legacy.collector.LegacyCollector; +import com.marklogic.hub.ApplicationConfig; +import com.marklogic.hub.main.MainPlugin; +import com.marklogic.hub.scaffold.Scaffolding; +import org.apache.commons.io.FileUtils; +import org.json.JSONException; +import org.junit.jupiter.api.*; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; + +import static com.marklogic.client.io.DocumentMetadataHandle.Capability.*; +import static org.custommonkey.xmlunit.XMLAssert.assertXMLEqual; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = ApplicationConfig.class) +public class LegacyFlowManagerTest extends HubTestBase { + + @Autowired + private LegacyFlowManager fm; + + @Autowired + private Scaffolding scaffolding; + + @BeforeAll + public static void runOnce() { + new Installer().deleteProjectDir(); + } + + @BeforeEach + public void setup() throws IOException { + basicSetup(); + getHubAdminConfig(); + enableDebugging(); + + clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME); + + addStagingDocs(); + installModules(); + } + + @AfterAll + public static void removeProjectDir() { + new Installer().deleteProjectDir(); + } + + private void installModules() { + HashMap modules = new HashMap<>(); + modules.put( + "/entities/test/harmonize/my-test-flow1/collector.xqy", + "flow-manager-test/my-test-flow1/collector.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow1/main.xqy", + "flow-manager-test/my-test-flow1/main.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow1/content.xqy", + "flow-manager-test/my-test-flow1/content.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow1/headers.xqy", + "flow-manager-test/my-test-flow1/headers.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow1/triples.xqy", + "flow-manager-test/my-test-flow1/triples.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow1/writer.xqy", + "flow-manager-test/my-test-flow1/writer.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow1/my-test-flow1.xml", + "flow-manager-test/my-test-flow1/my-test-flow1.xml"); + modules.put( + "/entities/test/harmonize/my-test-flow2/collector.xqy", + "flow-manager-test/my-test-flow1/collector.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow2/main.xqy", + "flow-manager-test/my-test-flow1/main.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow2/content.xqy", + "flow-manager-test/my-test-flow1/content.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow2/headers.xqy", + "flow-manager-test/my-test-flow1/headers.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow2/triples.xqy", + "flow-manager-test/my-test-flow1/triples.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow2/writer.xqy", + "flow-manager-test/my-test-flow1/writer.xqy"); + modules.put( + "/entities/test/harmonize/my-test-flow2/my-test-flow2.xml", + "flow-manager-test/my-test-flow1/my-test-flow2.xml"); + installModules(modules); + } + + private void addStagingDocs() { + clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME); + DocumentMetadataHandle meta = new DocumentMetadataHandle(); + meta.getCollections().add("tester"); + meta.getPermissions().add(getHubAdminConfig().getHubRoleName(), READ, UPDATE, EXECUTE); + installStagingDoc("/employee1.xml", meta, "flow-manager-test/input/employee1.xml"); + installStagingDoc("/employee2.xml", meta, "flow-manager-test/input/employee2.xml"); + } + + private void addFinalDocs() { + clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME); + DocumentMetadataHandle meta = new DocumentMetadataHandle(); + meta.getCollections().add("tester"); + meta.getPermissions().add(getHubAdminConfig().getHubRoleName(), READ, UPDATE, EXECUTE); + installFinalDoc("/employee1.xml", meta, "flow-manager-test/input/employee1.xml"); + installFinalDoc("/employee2.xml", meta, "flow-manager-test/input/employee2.xml"); + } + + @Test + public void testFlowFromXml() { + Document d = getXmlFromResource("flow-manager-test/simple-flow.xml"); + + LegacyFlow flow = LegacyFlowManager.flowFromXml(d.getDocumentElement()); + assertEquals(flow.getName(), "my-test-flow"); + assertEquals(flow.getCollector().getCodeFormat(), CodeFormat.XQUERY); + assertEquals(flow.getCollector().getModule(), "/entities/test/harmonize/my-test-flow/collector.xqy"); + assertEquals(flow.getMain().getCodeFormat(), CodeFormat.XQUERY); + assertEquals(flow.getMain().getModule(), "/entities/test/harmonize/my-test-flow/main.xqy"); + } + + @Test + public void testFlowToXml() throws IOException, ParserConfigurationException, SAXException { + LegacyFlow flow = LegacyFlowBuilder.newFlow() + .withEntityName("test") + .withName("my-test-flow") + .withType(FlowType.HARMONIZE) + .withDataFormat(DataFormat.XML) + .withCodeFormat(CodeFormat.XQUERY) + .build(); + String expected = getResource("flow-manager-test/simple-flow.xml"); + String actual = flow.serialize(); + assertXMLEqual(expected, actual); + } + + @Test + public void testGetLocalFlows() throws IOException { + createProjectDir(PROJECT_PATH); + scaffolding.createEntity("my-entity"); + + assertEquals(0, fm.getLocalFlows().size()); + + CodeFormat[] codeFormats = new CodeFormat[] { CodeFormat.JAVASCRIPT, CodeFormat.XQUERY }; + DataFormat[] dataFormats = new DataFormat[] { DataFormat.JSON, DataFormat.XML }; + FlowType[] flowTypes = new FlowType[] { FlowType.INPUT, FlowType.HARMONIZE }; + for (CodeFormat codeFormat : codeFormats) { + for (DataFormat dataFormat : dataFormats) { + for (FlowType flowType : flowTypes) { + String flowName = flowType.toString() + "-" + codeFormat.toString() + "-" + dataFormat.toString(); + scaffolding.createFlow("my-entity", flowName, flowType, codeFormat, dataFormat, false); + } + } + } + + List flows = fm.getLocalFlows(); + assertEquals(8, flows.size()); + + for (LegacyFlow flow : flows) { + assertEquals("my-entity", flow.getEntityName()); + } + + FileUtils.deleteDirectory(Paths.get("./del-me-dir").toFile()); + } + + @Test + public void testGetFlowFromProperties() throws IOException { + scaffolding.createEntity("my-entity"); + + allCombos((codeFormat, dataFormat, flowType, useEs) -> { + String flowName = flowType.toString() + "-" + codeFormat.toString() + "-" + dataFormat.toString(); + scaffolding.createFlow("my-entity", flowName, flowType, codeFormat, dataFormat, false); + }); + + + allCombos((codeFormat, dataFormat, flowType, useEs) -> { + String flowName = flowType.toString() + "-" + codeFormat.toString() + "-" + dataFormat.toString(); + Path propertiesFile = Paths.get(PROJECT_PATH, "plugins", "entities", "my-entity", flowType.toString(), flowName, flowName + ".properties"); + LegacyFlow flow = fm.getFlowFromProperties(propertiesFile); + assertEquals(flowName, flow.getName()); + assertEquals("my-entity", flow.getEntityName()); + assertEquals(codeFormat, flow.getCodeFormat()); + assertEquals(dataFormat, flow.getDataFormat()); + assertEquals(flowType, flow.getType()); + }); + + deleteProjectDir(); + } + + @Test + public void testGetFlows() { + getDataHub().clearUserModules(); + + installHubModules(); + + installModule("/entities/test/harmonize/my-test-flow1/my-test-flow1.xml", "flow-manager-test/my-test-flow1/my-test-flow1.xml"); + installModule("/entities/test/harmonize/my-test-flow2/my-test-flow2.xml", "flow-manager-test/my-test-flow1/my-test-flow2.xml"); + + List flows = fm.getFlows("test"); + assertEquals(2, flows.size()); + + // flow 1 + LegacyFlow flow1 = flows.get(0); + assertEquals("my-test-flow1", flow1.getName()); + assertEquals(CodeFormat.XQUERY, flow1.getCodeFormat()); + assertEquals(DataFormat.XML, flow1.getDataFormat()); + assertEquals("test", flow1.getEntityName()); + assertEquals(FlowType.HARMONIZE, flow1.getType()); + + LegacyCollector c = flow1.getCollector(); + Assertions.assertEquals(CodeFormat.XQUERY, c.getCodeFormat()); + assertEquals("/entities/test/harmonize/my-test-flow1/collector.xqy", c.getModule()); + + MainPlugin main = flow1.getMain(); + Assertions.assertEquals(CodeFormat.XQUERY, main.getCodeFormat()); + assertEquals("/entities/test/harmonize/my-test-flow1/main.xqy", main.getModule()); + + // flow 2 + LegacyFlow flow2 = flows.get(1); + assertEquals("my-test-flow2", flow2.getName()); + assertEquals(CodeFormat.XQUERY, flow2.getCodeFormat()); + assertEquals(DataFormat.XML, flow2.getDataFormat()); + assertEquals("test", flow2.getEntityName()); + assertEquals(FlowType.HARMONIZE, flow2.getType()); + + c = flow2.getCollector(); + Assertions.assertEquals(CodeFormat.XQUERY, c.getCodeFormat()); + assertEquals("/entities/test/harmonize/my-test-flow1/collector.xqy", c.getModule()); + + main = flow2.getMain(); + Assertions.assertEquals(CodeFormat.XQUERY, main.getCodeFormat()); + assertEquals("/entities/test/harmonize/my-test-flow1/main.xqy", main.getModule()); + } + + @Test + public void getTestFlow() { + installModule("/entities/test/harmonize/my-test-flow1/my-test-flow1.xml", "flow-manager-test/my-test-flow1/my-test-flow1-json.xml"); + + LegacyFlow flow1 = fm.getFlow("test", "my-test-flow1"); + assertEquals("my-test-flow1", flow1.getName()); + assertEquals(CodeFormat.JAVASCRIPT, flow1.getCodeFormat()); + assertEquals(DataFormat.JSON, flow1.getDataFormat()); + assertEquals("test", flow1.getEntityName()); + assertEquals(FlowType.HARMONIZE, flow1.getType()); + + LegacyCollector c = flow1.getCollector(); + Assertions.assertEquals(CodeFormat.JAVASCRIPT, c.getCodeFormat()); + assertEquals("/entities/test/harmonize/my-test-flow1/collector.sjs", c.getModule()); + + MainPlugin main = flow1.getMain(); + Assertions.assertEquals(CodeFormat.JAVASCRIPT, main.getCodeFormat()); + assertEquals("/entities/test/harmonize/my-test-flow1/main.sjs", main.getModule()); + } + + @Test + public void testRunFlow() throws SAXException, IOException, ParserConfigurationException, XMLStreamException { + addStagingDocs(); + installModules(); + assertEquals(2, getStagingDocCount()); + assertEquals(0, getFinalDocCount()); + getHubFlowRunnerConfig(); + LegacyFlow flow1 = fm.getFlow("test", "my-test-flow1"); + LegacyFlowRunner flowRunner = fm.newFlowRunner() + .withFlow(flow1) + .withBatchSize(10) + .withThreadCount(1); + flowRunner.run(); + flowRunner.awaitCompletion(); + getHubAdminConfig(); + assertEquals(2, getStagingDocCount()); + assertEquals(2, getFinalDocCount()); + assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized/harmonized1.xml"), finalDocMgr.read("/employee1.xml").next().getContent(new DOMHandle()).get() ); + assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized/harmonized2.xml"), finalDocMgr.read("/employee2.xml").next().getContent(new DOMHandle()).get()); + DocumentMetadataHandle metadata = finalDocMgr.readMetadata("/employee1.xml", new DocumentMetadataHandle()); + DocumentMetadataHandle.DocumentPermissions permissions = metadata.getPermissions(); + assertEquals( permissions.get("harmonized-reader").toString(), "[READ]", "Default permissions on harmonized documents should contain harmonized-reader/read"); + assertEquals(permissions.get("harmonized-updater").toString(), "[UPDATE]", "Default permissions on harmonized documents should contain harmonized-updater/update"); + } + + @Test + public void testRunFlowWithBackwards() throws SAXException, IOException, ParserConfigurationException, XMLStreamException { + addFinalDocs(); + installModules(); + assertEquals(0, getStagingDocCount()); + assertEquals(2, getFinalDocCount()); + getHubFlowRunnerConfig(); + LegacyFlow flow1 = fm.getFlow("test", "my-test-flow1"); + LegacyFlowRunner flowRunner = fm.newFlowRunner() + .withFlow(flow1) + .withBatchSize(10) + .withThreadCount(1) + .withSourceClient(getHubFlowRunnerConfig().newReverseFlowClient()) + .withDestinationDatabase(HubConfig.DEFAULT_STAGING_NAME); + flowRunner.run(); + flowRunner.awaitCompletion(); + getHubAdminConfig(); + assertEquals(2, getStagingDocCount()); + assertEquals(2, getFinalDocCount()); + assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized/harmonized1.xml"), stagingDocMgr.read("/employee1.xml").next().getContent(new DOMHandle()).get() ); + assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized/harmonized2.xml"), stagingDocMgr.read("/employee2.xml").next().getContent(new DOMHandle()).get()); + DocumentMetadataHandle metadata = stagingDocMgr.readMetadata("/employee1.xml", new DocumentMetadataHandle()); + DocumentMetadataHandle.DocumentPermissions permissions = metadata.getPermissions(); + assertEquals(permissions.get("harmonized-reader").toString(), "[READ]", "Default permissions on harmonized documents should contain harmonized-reader/read"); + assertEquals(permissions.get("harmonized-updater").toString(), "[UPDATE]", "Default permissions on harmonized documents should contain harmonized-updater/update"); + } + + @Test + public void testRunFlowWithHeader() throws SAXException, IOException, ParserConfigurationException, XMLStreamException { + addStagingDocs(); + HashMap modules = new HashMap<>(); + modules.put("/entities/test/harmonize/my-test-flow-with-header/flow.xml", "flow-manager-test/my-test-flow-with-header/flow.xml"); + modules.put("/entities/test/harmonize/my-test-flow-with-header/collector.xqy", "flow-manager-test/my-test-flow-with-header/collector.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-header/content.xqy", "flow-manager-test/my-test-flow-with-header/content.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-header/headers.xqy", "flow-manager-test/my-test-flow-with-header/headers.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-header/triples.xqy", "flow-manager-test/my-test-flow-with-header/triples.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-header/writer.xqy", "flow-manager-test/my-test-flow-with-header/writer.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-header/main.xqy", "flow-manager-test/my-test-flow-with-header/main.xqy"); + installModules(modules); + + assertEquals(2, getStagingDocCount()); + assertEquals(0, getFinalDocCount()); + getHubFlowRunnerConfig(); + LegacyFlow flow1 = fm.getFlow("test", "my-test-flow-with-header"); + LegacyFlowRunner flowRunner = fm.newFlowRunner() + .withFlow(flow1) + .withBatchSize(10) + .withThreadCount(1); + flowRunner.run(); + flowRunner.awaitCompletion(); + getHubAdminConfig(); + assertEquals(2, getStagingDocCount()); + assertEquals(2, getFinalDocCount()); + assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized-with-header/harmonized1.xml"), finalDocMgr.read("/employee1.xml").next().getContent(new DOMHandle()).get() ); + assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized-with-header/harmonized2.xml"), finalDocMgr.read("/employee2.xml").next().getContent(new DOMHandle()).get()); + + runInModules("xdmp:directory-delete(\"/entities/test/harmonize/my-test-flow-with-header/\")"); + } + + @Test + public void testRunFlowWithAll() throws SAXException, IOException, ParserConfigurationException, XMLStreamException { + addStagingDocs(); + HashMap modules = new HashMap<>(); + modules.put("/entities/test/harmonize/my-test-flow-with-all/my-test-flow-with-all.xml", "flow-manager-test/my-test-flow-with-all/my-test-flow-with-all.xml"); + modules.put("/entities/test/harmonize/my-test-flow-with-all/collector.xqy", "flow-manager-test/my-test-flow-with-all/collector.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-all/headers.xqy", "flow-manager-test/my-test-flow-with-all/headers.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-all/content.xqy", "flow-manager-test/my-test-flow-with-all/content.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-all/triples.xqy", "flow-manager-test/my-test-flow-with-all/triples.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-all/writer.xqy", "flow-manager-test/my-test-flow-with-all/writer.xqy"); + modules.put("/entities/test/harmonize/my-test-flow-with-all/main.xqy", "flow-manager-test/my-test-flow-with-all/main.xqy"); + installModules(modules); + + assertEquals(2, getStagingDocCount()); + assertEquals(0, getFinalDocCount()); + getHubFlowRunnerConfig(); + LegacyFlow flow1 = fm.getFlow("test", "my-test-flow-with-all"); + LegacyFlowRunner flowRunner = fm.newFlowRunner() + .withFlow(flow1) + .withBatchSize(10) + .withThreadCount(1); + flowRunner.run(); + flowRunner.awaitCompletion(); + getHubAdminConfig(); + assertEquals(2, getStagingDocCount()); + assertEquals(2, getFinalDocCount()); + assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized-with-all/harmonized1.xml"), finalDocMgr.read("/employee1.xml").next().getContent(new DOMHandle()).get() ); + assertXMLEqual(getXmlFromResource("flow-manager-test/harmonized-with-all/harmonized2.xml"), finalDocMgr.read("/employee2.xml").next().getContent(new DOMHandle()).get()); + + runInModules("xdmp:directory-delete(\"/entities/test/harmonize/my-test-flow-with-all/\")"); + } + + + @Test + public void testHasLegacyflows() throws IOException, InterruptedException, ParserConfigurationException, SAXException, JSONException { + + scaffolding.createEntity("new-entity"); + scaffolding.createFlow("new-entity", "new-flow", FlowType.HARMONIZE, CodeFormat.XQUERY, DataFormat.XML, false); + assertEquals(0, fm.getLegacyFlows().size()); + + Path projectPath = Paths.get(PROJECT_PATH); + allCombos((codeFormat, dataFormat, flowType, useEs) -> { + Path dir = projectPath.resolve("plugins/entities/my-fun-test/" + flowType.toString()); + String flowName = "legacy-" + codeFormat.toString() + "-" + dataFormat.toString() + "-" + flowType.toString() + "-flow"; + try { + FileUtils.copyDirectory(getResourceFile("scaffolding-test/" + flowName), dir.resolve(flowName).toFile()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + + List legacyFlows = fm.getLegacyFlows(); + assertEquals(8, legacyFlows.size()); + legacyFlows.sort(String::compareToIgnoreCase); + assertEquals("my-fun-test => legacy-sjs-json-harmonize-flow", legacyFlows.get(0)); + assertEquals("my-fun-test => legacy-sjs-json-input-flow", legacyFlows.get(1)); + assertEquals("my-fun-test => legacy-sjs-xml-harmonize-flow", legacyFlows.get(2)); + assertEquals("my-fun-test => legacy-sjs-xml-input-flow", legacyFlows.get(3)); + assertEquals("my-fun-test => legacy-xqy-json-harmonize-flow", legacyFlows.get(4)); + assertEquals("my-fun-test => legacy-xqy-json-input-flow", legacyFlows.get(5)); + assertEquals("my-fun-test => legacy-xqy-xml-harmonize-flow", legacyFlows.get(6)); + assertEquals("my-fun-test => legacy-xqy-xml-input-flow", legacyFlows.get(7)); + } +} diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/FlowRunnerTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/flow/LegacyLegacyFlowRunnerTest.java similarity index 94% rename from marklogic-data-hub/src/test/java/com/marklogic/hub/flow/FlowRunnerTest.java rename to marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/flow/LegacyLegacyFlowRunnerTest.java index 0477d4cf67..19bfb330ad 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/flow/FlowRunnerTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/flow/LegacyLegacyFlowRunnerTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.flow; +package com.marklogic.hub.legacy.flow; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; @@ -30,6 +30,7 @@ import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; import org.junit.Assert; +import org.junit.jupiter.api.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -52,7 +53,7 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = ApplicationConfig.class) -public class FlowRunnerTest extends HubTestBase { +public class LegacyLegacyFlowRunnerTest extends HubTestBase { private static final String ENTITY = "e2eentity"; private static Path projectDir = Paths.get(".", "ye-olde-project"); @@ -83,12 +84,12 @@ public void testPassOptions() throws IOException, ParserConfigurationException, installUserModules(getHubAdminConfig(), false); - Flow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize", + LegacyFlow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize", FlowType.HARMONIZE); HashMap options = new HashMap<>(); options.put("name", "Bob Smith"); options.put("age", 55); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(harmonizeFlow) .withBatchSize(10) .withThreadCount(1) @@ -141,9 +142,9 @@ public void testEnvelopeSJS() throws IOException { installUserModules(getHubAdminConfig(), false); - Flow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize-sjs-json", + LegacyFlow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize-sjs-json", FlowType.HARMONIZE); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(harmonizeFlow) .withBatchSize(10) .withThreadCount(1); @@ -176,9 +177,9 @@ public void testEnvelopeXQY() throws IOException { installUserModules(getHubAdminConfig(), false); - Flow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize-xqy-json", + LegacyFlow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize-xqy-json", FlowType.HARMONIZE); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(harmonizeFlow) .withBatchSize(10) .withThreadCount(1); @@ -212,9 +213,9 @@ public void testEnvelopeSJSXML() throws IOException, SAXException { installUserModules(getHubAdminConfig(), false); - Flow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize-sjs-xml", + LegacyFlow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize-sjs-xml", FlowType.HARMONIZE); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(harmonizeFlow) .withBatchSize(10) .withThreadCount(1); @@ -249,6 +250,7 @@ public void testEnvelopeSJSXML() throws IOException, SAXException { @Test public void testCreateandDeployFlowWithHubUser() throws IOException { + Assumptions.assumeFalse(getHubAdminConfig().getIsProvisionedEnvironment()); scaffolding.createFlow(ENTITY, "FlowWithHubUser", FlowType.HARMONIZE, CodeFormat.XQUERY, DataFormat.JSON, false); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/job/JobManagerTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/job/LegacyJobManagerTest.java similarity index 94% rename from marklogic-data-hub/src/test/java/com/marklogic/hub/job/JobManagerTest.java rename to marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/job/LegacyJobManagerTest.java index 995a3e3b15..e4c03ab5ed 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/job/JobManagerTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/job/LegacyJobManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,13 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.job; +package com.marklogic.hub.legacy.job; import com.marklogic.client.eval.EvalResultIterator; import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubTestBase; import com.marklogic.hub.ApplicationConfig; -import com.marklogic.hub.flow.*; +import com.marklogic.hub.legacy.flow.*; import org.custommonkey.xmlunit.XMLUnit; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -46,16 +46,16 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = ApplicationConfig.class) -public class JobManagerTest extends HubTestBase { +public class LegacyJobManagerTest extends HubTestBase { private static final String ENTITY = "e2eentity"; private static final String HARMONIZE_FLOW_XML = "testharmonize-xml"; private static final String HARMONIZE_FLOW_JSON = "testharmonize-json"; private static List jobIds = Collections.synchronizedList(new ArrayList()); private static Path projectDir = Paths.get(".", "ye-olde-project"); private static Path exportPath = projectDir.resolve("testExport.zip"); - private JobManager jobManager; + private LegacyJobManager jobManager; - private FlowItemCompleteListener flowItemCompleteListener = + private LegacyFlowItemCompleteListener flowItemCompleteListener = (jobId, itemId) -> recordJobId(jobId); @BeforeEach @@ -88,12 +88,12 @@ public void setupStuff() throws InterruptedException, IOException { // Run a flow a couple times to generate some job/trace data. jobIds.clear(); - Flow harmonizeFlow = fm.getFlow(ENTITY, HARMONIZE_FLOW_XML, FlowType.HARMONIZE); + LegacyFlow harmonizeFlow = fm.getFlow(ENTITY, HARMONIZE_FLOW_XML, FlowType.HARMONIZE); HashMap options = new HashMap<>(); options.put("name", "Bob Smith"); options.put("age", 55); getHubFlowRunnerConfig(); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(harmonizeFlow) .withBatchSize(10) .withThreadCount(1) @@ -114,7 +114,7 @@ public void setupStuff() throws InterruptedException, IOException { .onItemComplete(flowItemCompleteListener); flowRunner.run(); flowRunner.awaitCompletion(); - jobManager = JobManager.create(getHubFlowRunnerConfig().newJobDbClient()); + jobManager = LegacyJobManager.create(getHubFlowRunnerConfig().newJobDbClient()); } @AfterEach @@ -266,7 +266,7 @@ public void exportNoJobs() throws IOException { @Test public void importJobs() throws URISyntaxException, IOException { - URL url = JobManagerTest.class.getClassLoader().getResource("job-manager-test/jobexport.zip"); + URL url = LegacyJobManagerTest.class.getClassLoader().getResource("job-manager-test/jobexport.zip"); clearDatabases(HubConfig.DEFAULT_JOB_NAME); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/job/TracingTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/job/LegacyTracingTest.java similarity index 85% rename from marklogic-data-hub/src/test/java/com/marklogic/hub/job/TracingTest.java rename to marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/job/LegacyTracingTest.java index 74eb220a2d..9649eb97f9 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/job/TracingTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/legacy/job/LegacyTracingTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.marklogic.hub.job; +package com.marklogic.hub.legacy.job; import com.fasterxml.jackson.databind.JsonNode; import com.marklogic.client.document.DocumentRecord; @@ -24,10 +24,10 @@ import com.marklogic.client.query.StructuredQueryBuilder; import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubTestBase; -import com.marklogic.hub.Tracing; +import com.marklogic.hub.legacy.LegacyTracing; import com.marklogic.hub.ApplicationConfig; -import com.marklogic.hub.flow.Flow; -import com.marklogic.hub.flow.FlowRunner; +import com.marklogic.hub.legacy.flow.LegacyFlow; +import com.marklogic.hub.legacy.flow.LegacyFlowRunner; import org.apache.commons.io.FileUtils; import org.custommonkey.xmlunit.XMLUnit; import org.junit.jupiter.api.AfterEach; @@ -48,7 +48,7 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { ApplicationConfig.class}) -public class TracingTest extends HubTestBase { +public class LegacyTracingTest extends HubTestBase { private static final String BINARY_HEX_ENCODED_XQY = "89504e470d0a1a0a0000000d494844520000000d0000001308060000004b378797000000017352474200aece1ce900000006624b474400ff00ff00ffa0bda793000000097048597300000b1300000b1301009a9c180000000774494d4507da0811012332d018a204000002af4944415428cf9592cb6e1c4500454f555757573fc6f3308e9f40ac286c909122082b36acf317ec59b2e4a7f8098422a17889402436a3d8c61ecfabbba7bbebc502943d573afb239d2bbeffe1c7d7428849aa539565d9814a9298ea340a04ce39a15325807bebbccb8d591963be534aabaf46d98caa2c383898b13fdb23cd6054569455c5fe74c2d9c95159b73b16cb3521c673a9303c7966397aeee9d47bfe5afc815639c664e42623d50a21252a4970ced1b4bb4e4a34c5f192a75f248cceeff8fdfe35432bf13e60ad63182c2104ac7338ef8921a02c35b7bf1e53ff2610ea635e9c5e90950e44865209b9314829d15a93e7062913a9bc77d44d438c91e9788cd18675bdc5c788f39ec7e58af5664bbbeb98dfdc320cb6550021044288586769bb0e1f5204026b2d006591635d40a72926334a299532998cd199444a49a14b9e1c8d1915157b7b15fbfb5366d329fd60b9b9bb67d7f7a954b1e2f0c50d2f5fc1f4e22dbf5cff44b791f8e0e9074bddb48410e8fb9eaeefb1838dcac78ef575c9add30ced8cd3598e5001008440fe479224a4a98288508e8e873fa7ec6e2db3e909cf8ff791da12a2012211e807cb765bf3f0b0a06e765e451fb1b1c14618a2e261e5c8bb9cb6ed596d362c168fbcbb9e7f501dac8b4a2a8949a648afc06ac6e50c530acabca42c4baaaae4ecf888c13996eb2d314425534a0e2f167cfeada338fb9babd51b525191e739459e331e555455894e53acb5f4d646e93de8d23239481145cd7cf1166f81183fdce7df8e81444a887150cbe68eab9f3fe5fe32a0d353befee44bcc28a0544296698a3c474a496e0c7be3316f2e2fbf519f3d3b6f04b2cc32c5a82cf00cdc3f3cd2343bd6db86f56643bbdbd1b41d8be5aadf6eeb97eae4a3c92ba1d2a70879e87c98eefabe68ba906cb60d4a253ed5babb9ebf5f393bdcd59bf595526a2e628cfcdffd03c6146669f7b691ab0000000049454e44ae426082"; private static final String BINARY_HEX_ENCODED_SJS = "89504e470d0a1a0a0000000d494844520000000d0000001308060000004b378797000000017352474200aece1ce900000006624b474400ff00ff00ffa0bda793000000097048597300000b1300000b1301009a9c180000000774494d4507da0811012332d018a204000002af4944415428cf9592cb6e1c4500454f555757573fc6f3308e9f40ac286c909122082b36acf317ec59b2e4a7f8098422a17889402436a3d8c61ecfabbba7bbebc502943d573afb239d2bbeffe1c7d7428849aa539565d9814a9298ea340a04ce39a15325807bebbccb8d591963be534aabaf46d98caa2c383898b13fdb23cd6054569455c5fe74c2d9c95159b73b16cb3521c673a9303c7966397aeee9d47bfe5afc815639c664e42623d50a21252a4970ced1b4bb4e4a34c5f192a75f248cceeff8fdfe35432bf13e60ad63182c2104ac7338ef8921a02c35b7bf1e53ff2610ea635e9c5e90950e44865209b9314829d15a93e7062913a9bc77d44d438c91e9788cd18675bdc5c788f39ec7e58af5664bbbeb98dfdc320cb6550021044288586769bb0e1f5204026b2d006591635d40a72926334a299532998cd199444a49a14b9e1c8d1915157b7b15fbfb5366d329fd60b9b9bb67d7f7a954b1e2f0c50d2f5fc1f4e22dbf5cff44b791f8e0e9074bddb48410e8fb9eaeefb1838dcac78ef575c9add30ced8cd3598e5001008440fe479224a4a98288508e8e873fa7ec6e2db3e909cf8ff791da12a2012211e807cb765bf3f0b0a06e765e451fb1b1c14618a2e261e5c8bb9cb6ed596d362c168fbcbb9e7f501dac8b4a2a8949a648afc06ac6e50c530acabca42c4baaaae4ecf888c13996eb2d314425534a0e2f167cfeada338fb9babd51b525191e739459e331e555455894e53acb5f4d646e93de8d23239481145cd7cf1166f81183fdce7df8e81444a887150cbe68eab9f3fe5fe32a0d353befee44bcc28a0544296698a3c474a496e0c7be3316f2e2fbf519f3d3b6f04b2cc32c5a82cf00cdc3f3cd2343bd6db86f56643bbdbd1b41d8be5aadf6eeb97eae4a3c92ba1d2a70879e87c98eefabe68ba906cb60d4a253ed5babb9ebf5f393bdcd59bf595526a2e628cfcdffd03c6146669f7b691ab0000000049454e44ae426082"; @@ -68,12 +68,12 @@ public void setup() throws IOException, URISyntaxException { ); installUserModules(adminHubConfig, true); //Disable tracing that may have been enabled in previous tests - Tracing.create(flowRunnerClient).disable(); + LegacyTracing.create(flowRunnerClient).disable(); } @AfterEach public void afterEach() { - Tracing.create(flowRunnerClient).disable(); + LegacyTracing.create(flowRunnerClient).disable(); clearDatabases(HubConfig.DEFAULT_JOB_NAME, HubConfig.DEFAULT_FINAL_NAME); } @@ -83,12 +83,12 @@ public void runXMLFlowSansTracing() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeXML"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeXML"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -109,12 +109,12 @@ public void runJSONFlowSansTracing() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeJSON"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeJSON"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -130,15 +130,15 @@ public void runXMLFlowWithTracing() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); enableTracing(); assertTrue(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeXML"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeXML"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -154,15 +154,15 @@ public void runXqyXmlFlowWithBinaryContent() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); enableTracing(); assertTrue(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeXqyXmlWithBinary"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeXqyXmlWithBinary"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -198,15 +198,15 @@ public void runXqyJsonFlowWithBinaryContent() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); enableTracing(); assertTrue(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeXqyJsonWithBinary"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeXqyJsonWithBinary"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -232,15 +232,15 @@ public void runJSONFlowWithTracing() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); enableTracing(); assertTrue(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeJSON"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeJSON"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -257,15 +257,15 @@ public void runSjsJsonFlowWithBinaryContent() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); enableTracing(); assertTrue(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeSjsJsonWithBinary"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeSjsJsonWithBinary"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -290,15 +290,15 @@ public void runSjsXmlFlowWithBinaryContent() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); enableTracing(); assertTrue(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeSjsXmlWithBinary"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeSjsXmlWithBinary"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -325,12 +325,12 @@ public void runXMLErrorFlowWithoutTracing() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeXMLError"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeXMLError"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -350,12 +350,12 @@ public void runXMLWriterErrorFlowWithoutTracing() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeXMLWriterError"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeXMLWriterError"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -375,12 +375,12 @@ public void runJSONErrorFlowWithoutTracing() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeJSONError"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeJSONError"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); @@ -402,12 +402,12 @@ public void runJSONWriterErrorFlowWithoutTracing() { assertEquals(0, getFinalDocCount()); assertEquals(0, getTracingDocCount()); - Tracing t = Tracing.create(flowRunnerClient); + LegacyTracing t = LegacyTracing.create(flowRunnerClient); assertFalse(t.isEnabled()); - Flow flow = fm.getFlow("trace-entity", "tracemeJSONWriterError"); + LegacyFlow flow = fm.getFlow("trace-entity", "tracemeJSONWriterError"); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withBatchSize(10) .withThreadCount(1); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/processes/ProcessManagerTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/processes/ProcessManagerTest.java new file mode 100644 index 0000000000..3ccc12f592 --- /dev/null +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/processes/ProcessManagerTest.java @@ -0,0 +1,132 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.marklogic.hub.processes; + +import com.marklogic.hub.ApplicationConfig; +import com.marklogic.hub.HubTestBase; +import com.marklogic.hub.ProcessManager; +import com.marklogic.hub.util.FileUtil; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = ApplicationConfig.class) +public class ProcessManagerTest extends HubTestBase { + private String mappingProcessName = "myTestMappingProcess"; + private String ingestProcessName = "myTestIngestProcess"; + private String customProcessName = "myTestCustomProcess"; + + + @BeforeEach + public void setup() { + basicSetup(); + adminHubConfig.initHubProject(); + } + + @AfterEach + public void teardown() { + deleteProjectDir(); + } + + @Test + void saveProcess() { + Process process = Process.create(mappingProcessName, Process.ProcessType.MAPPING); + processManager.saveProcess(process); + + String processFileName = mappingProcessName + ProcessManager.PROCESSES_FILE_EXTENSION; + assertTrue(Paths.get((getHubAdminConfig().getProcessDir(Process.ProcessType.MAPPING).toString()), process.getName(), processFileName).toFile().exists()); + } + + @Test + void deleteProcess() { + copyTestMappingProcess(); + + Process process = Process.create(mappingProcessName, Process.ProcessType.MAPPING); + + processManager.deleteProcess(process); + + String processFileName = mappingProcessName + ProcessManager.PROCESSES_FILE_EXTENSION; + assertFalse(Paths.get((getHubAdminConfig().getProcessDir(Process.ProcessType.MAPPING).toString()), process.getName(), processFileName).toFile().exists()); + } + + @Test + void getAllProcesses() { + copyTestCustomProcess(); + copyTestIngestProcess(); + copyTestMappingProcess(); + + List processList = processManager.getProcesses(); + assertTrue(processList.size() > 0); + } + + @Test + void getProcessByNameAndType() { + copyTestMappingProcess(); + copyTestIngestProcess(); + + Process process = processManager.getProcess(mappingProcessName, Process.ProcessType.MAPPING); + assertNotNull(process); + assertEquals(mappingProcessName, process.getName()); + } + + + @Test + void getProcessesByType() { + copyTestCustomProcess(); + copyTestIngestProcess(); + copyTestMappingProcess(); + copyTestMappingProcess2(); + + ArrayList processes = processManager.getProcessesByType(Process.ProcessType.MAPPING); + assertEquals(2, processes.size()); + } + + @Test + void getAllProcessNamesByType() { + copyTestMappingProcess(); + copyTestMappingProcess2(); + + ArrayList processNames = processManager.getProcessNamesByType(Process.ProcessType.MAPPING); + assertEquals(2, processNames.size()); + } + + private void copyTestMappingProcess() { + FileUtil.copy(getResourceStream("scaffolding-test/" + mappingProcessName + ProcessManager.PROCESSES_FILE_EXTENSION), getHubAdminConfig().getProcessDir(Process.ProcessType.MAPPING).resolve(mappingProcessName + "/" + mappingProcessName + ProcessManager.PROCESSES_FILE_EXTENSION).toFile()); + } + + private void copyTestIngestProcess() { + FileUtil.copy(getResourceStream("scaffolding-test/" + ingestProcessName + ProcessManager.PROCESSES_FILE_EXTENSION), getHubAdminConfig().getProcessDir(Process.ProcessType.INGEST).resolve(ingestProcessName + "/" + ingestProcessName + ProcessManager.PROCESSES_FILE_EXTENSION).toFile()); + } + + private void copyTestCustomProcess() { + FileUtil.copy(getResourceStream("scaffolding-test/" + customProcessName + ProcessManager.PROCESSES_FILE_EXTENSION), getHubAdminConfig().getProcessDir(Process.ProcessType.CUSTOM).resolve(customProcessName + "/" + customProcessName + ProcessManager.PROCESSES_FILE_EXTENSION).toFile()); + } + + private void copyTestMappingProcess2() { + FileUtil.copy(getResourceStream("scaffolding-test/" + mappingProcessName + "2" + ProcessManager.PROCESSES_FILE_EXTENSION), getHubAdminConfig().getProcessDir(Process.ProcessType.MAPPING).resolve(mappingProcessName + "2/" + mappingProcessName + "2" + ProcessManager.PROCESSES_FILE_EXTENSION).toFile()); + } +} diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/scaffolding/ScaffoldingTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/scaffolding/ScaffoldingTest.java index a8c9e43fb8..d36155ff82 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/scaffolding/ScaffoldingTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/scaffolding/ScaffoldingTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,9 +20,9 @@ import com.marklogic.hub.HubTestBase; import com.marklogic.hub.ApplicationConfig; import com.marklogic.hub.error.ScaffoldingValidationException; -import com.marklogic.hub.flow.CodeFormat; -import com.marklogic.hub.flow.DataFormat; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.DataFormat; +import com.marklogic.hub.legacy.flow.FlowType; import com.marklogic.hub.scaffold.Scaffolding; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/scaffolding/ScaffoldingValidatorTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/scaffolding/ScaffoldingValidatorTest.java index 562e963a83..f6636130e1 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/scaffolding/ScaffoldingValidatorTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/scaffolding/ScaffoldingValidatorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,8 +19,8 @@ import com.marklogic.hub.HubTestBase; import com.marklogic.hub.ApplicationConfig; import com.marklogic.hub.error.ScaffoldingValidationException; -import com.marklogic.hub.flow.CodeFormat; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.FlowType; import com.marklogic.hub.scaffold.Scaffolding; import com.marklogic.hub.impl.ScaffoldingValidator; import com.marklogic.hub.impl.ScaffoldingImpl; diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub/util/ComboListener.java b/marklogic-data-hub/src/test/java/com/marklogic/hub/util/ComboListener.java index 290e4ab2e1..38d731ad50 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub/util/ComboListener.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub/util/ComboListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,9 +15,9 @@ */ package com.marklogic.hub.util; -import com.marklogic.hub.flow.CodeFormat; -import com.marklogic.hub.flow.DataFormat; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.DataFormat; +import com.marklogic.hub.legacy.flow.FlowType; public interface ComboListener { void onCombo(CodeFormat codeFormat, DataFormat dataFormat, FlowType flowType, boolean useEs); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/EndToEndFlowTests.java b/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/EndToEndFlowTests.java index f296634d10..6a8b4c5e63 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/EndToEndFlowTests.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/EndToEndFlowTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,10 +26,10 @@ import com.marklogic.client.document.ServerTransform; import com.marklogic.client.io.*; import com.marklogic.hub.ApplicationConfig; -import com.marklogic.hub.FlowManager; +import com.marklogic.hub.legacy.LegacyFlowManager; import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubTestBase; -import com.marklogic.hub.flow.*; +import com.marklogic.hub.legacy.flow.*; import com.marklogic.hub.scaffold.Scaffolding; import com.marklogic.hub.util.FileUtil; import com.marklogic.bootstrap.Installer; @@ -112,7 +112,7 @@ public class EndToEndFlowTests extends HubTestBase { private static final int TEST_SIZE = 500; private static final int BATCH_SIZE = 10; @Autowired - private FlowManager flowManager; + private LegacyFlowManager flowManager; private DataMovementManager flowRunnerDataMovementManager; private boolean installDocsFinished = false; @@ -356,6 +356,7 @@ public List generateExtraPluginTests() { tests.add(DynamicTest.dynamicTest(flowName + " MLCP", () -> { Map options = new HashMap<>(); options.put("extraPlugin", true); + options.put("secondOption", "secondValue"); FinalCounts finalCounts = new FinalCounts(1, 0, 1, 1, 0, 0, 1, 0, 0, 0, "FINISHED"); testInputFlowViaMlcp(prefix, useEs ? "-es" : "", flowRunnerClient, codeFormat, dataFormat, useEs, options, finalCounts); })); @@ -898,7 +899,7 @@ private void create2xFlow(String prefix, CodeFormat codeFormat, DataFormat dataF copyFile(srcDir + "triples." + codeFormat.toString(), flowDir.resolve("triples." + codeFormat.toString())); copyFile(srcDir + "main-" + flowType.toString() + "-2x." + codeFormat.toString(), flowDir.resolve("main." + codeFormat.toString())); - Flow flow = FlowBuilder.newFlow() + LegacyFlow flow = LegacyFlowBuilder.newFlow() .withEntityName(ENTITY) .withName(flowName) .withType(flowType) @@ -1042,7 +1043,7 @@ private void testInputFlowViaMlcp(String prefix, String fileSuffix, DatabaseClie assertEquals(0, getTracingDocCount()); assertEquals(0, getJobDocCount()); - Flow flow = flowManager.getFlow(ENTITY, flowName, FlowType.INPUT); + LegacyFlow flow = flowManager.getFlow(ENTITY, flowName, FlowType.INPUT); String inputPath = getResourceFile("e2e-test/input/input" + fileSuffix + "." + dataFormat.toString()).getAbsolutePath(); String basePath = getResourceFile("e2e-test/input").getAbsolutePath(); String OS = System.getProperty("os.name").toLowerCase(); @@ -1341,7 +1342,7 @@ else if (prefix.equals("extra-nodes")) { } } - private Tuple runHarmonizeFlow( + private Tuple runHarmonizeFlow( String flowName, DataFormat dataFormat, Vector completed, Vector failed, Map options, @@ -1350,7 +1351,7 @@ private Tuple runHarmonizeFlow( return runHarmonizeFlow(flowName, dataFormat, completed, failed, options, srcClient, destDb, useEs,waitForCompletion, TEST_SIZE); } - private Tuple runHarmonizeFlow( + private Tuple runHarmonizeFlow( String flowName, DataFormat dataFormat, Vector completed, Vector failed, Map options, @@ -1366,8 +1367,8 @@ private Tuple runHarmonizeFlow( installDocs(dataFormat, ENTITY, srcClient, useEs, testSize); getHubFlowRunnerConfig(); - Flow harmonizeFlow = flowManager.getFlow(ENTITY, flowName, FlowType.HARMONIZE); - FlowRunner flowRunner = flowManager.newFlowRunner() + LegacyFlow harmonizeFlow = flowManager.getFlow(ENTITY, flowName, FlowType.HARMONIZE); + LegacyFlowRunner flowRunner = flowManager.newFlowRunner() .withFlow(harmonizeFlow) .withBatchSize(BATCH_SIZE) .withThreadCount(4) @@ -1414,7 +1415,7 @@ private void testHarmonizeFlow( Vector completed = new Vector<>(); Vector failed = new Vector<>(); - Tuple tuple= null; + Tuple tuple= null; tuple = runHarmonizeFlow(flowName, dataFormat, completed, failed, options, srcClient, destDb, useEs, waitForCompletion, testSize); if (waitForCompletion) { @@ -1503,7 +1504,7 @@ private void testHarmonizeFlowWithFailedMain( Vector completed = new Vector<>(); Vector failed = new Vector<>(); - Tuple tuple = runHarmonizeFlow(flowName, dataFormat, completed, failed, options, srcClient, destDb, useEs, true); + Tuple tuple = runHarmonizeFlow(flowName, dataFormat, completed, failed, options, srcClient, destDb, useEs, true); int stagingCount = getStagingDocCount(); int finalCount = getFinalDocCount(); diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/MappingE2E.java b/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/MappingE2E.java index fe2b7260aa..1abe443550 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/MappingE2E.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/MappingE2E.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,11 +29,11 @@ import com.marklogic.client.io.JacksonHandle; import com.marklogic.client.io.StringHandle; import com.marklogic.hub.ApplicationConfig; -import com.marklogic.hub.FlowManager; +import com.marklogic.hub.legacy.LegacyFlowManager; import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubTestBase; import com.marklogic.hub.MappingManager; -import com.marklogic.hub.flow.*; +import com.marklogic.hub.legacy.flow.*; import com.marklogic.hub.mapping.Mapping; import com.marklogic.hub.scaffold.Scaffolding; import com.marklogic.hub.util.FileUtil; @@ -67,7 +67,7 @@ public class MappingE2E extends HubTestBase { private static final int TEST_SIZE = 20; private static final int BATCH_SIZE = 10; @Autowired - private FlowManager flowManager; + private LegacyFlowManager flowManager; private DataMovementManager stagingDataMovementManager; private boolean installDocsFinished = false; private boolean installDocsFailed = false; @@ -82,6 +82,7 @@ public class MappingE2E extends HubTestBase { @BeforeAll public static void setup() { XMLUnit.setIgnoreWhitespace(true); + new Installer().deleteProjectDir(); new Installer().setupProject(); } @@ -353,7 +354,7 @@ private void installDocs(String flowName, DataFormat dataFormat, String collecti } } - private Tuple runHarmonizeFlow( + private Tuple runHarmonizeFlow( String flowName, DataFormat dataFormat, Vector completed, Vector failed, Map options, @@ -369,9 +370,9 @@ private Tuple runHarmonizeFlow( installDocs(flowName, dataFormat, ENTITY, srcClient); getHubFlowRunnerConfig(); - Flow harmonizeFlow = flowManager.getFlow(ENTITY, flowName, FlowType.HARMONIZE); + LegacyFlow harmonizeFlow = flowManager.getFlow(ENTITY, flowName, FlowType.HARMONIZE); - FlowRunner flowRunner = flowManager.newFlowRunner() + LegacyFlowRunner flowRunner = flowManager.newFlowRunner() .withFlow(harmonizeFlow) .withBatchSize(BATCH_SIZE) .withThreadCount(4) @@ -411,7 +412,7 @@ private void testHarmonizeFlow( Vector completed = new Vector<>(); Vector failed = new Vector<>(); - Tuple tuple = runHarmonizeFlow(flowName, dataFormat, completed, failed, options, srcClient, destDb, waitForCompletion); + Tuple tuple = runHarmonizeFlow(flowName, dataFormat, completed, failed, options, srcClient, destDb, waitForCompletion); if (waitForCompletion) { // takes a little time to run. diff --git a/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/StreamCollectorTest.java b/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/StreamLegacyCollectorTest.java similarity index 93% rename from marklogic-data-hub/src/test/java/com/marklogic/hub_integration/StreamCollectorTest.java rename to marklogic-data-hub/src/test/java/com/marklogic/hub_integration/StreamLegacyCollectorTest.java index b73ec90fe1..8aa5c571f2 100644 --- a/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/StreamCollectorTest.java +++ b/marklogic-data-hub/src/test/java/com/marklogic/hub_integration/StreamLegacyCollectorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,13 +24,14 @@ import com.marklogic.client.io.JacksonHandle; import com.marklogic.client.io.StringHandle; import com.marklogic.hub.ApplicationConfig; -import com.marklogic.hub.FlowManager; +import com.marklogic.hub.legacy.LegacyFlowManager; import com.marklogic.hub.HubConfig; import com.marklogic.hub.HubTestBase; -import com.marklogic.hub.flow.*; +import com.marklogic.hub.legacy.flow.*; import com.marklogic.hub.scaffold.Scaffolding; import com.marklogic.hub.util.FileUtil; import org.custommonkey.xmlunit.XMLUnit; +import org.junit.jupiter.api.*; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -53,7 +54,7 @@ @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = ApplicationConfig.class) -public class StreamCollectorTest extends HubTestBase { +public class StreamLegacyCollectorTest extends HubTestBase { private static final String ENTITY = "streamentity"; private static Path projectDir = Paths.get(PROJECT_PATH); @@ -66,7 +67,7 @@ public class StreamCollectorTest extends HubTestBase { private String installDocError; @Autowired - private FlowManager fm; + private LegacyFlowManager fm; @Autowired private Scaffolding scaffolding; @@ -144,15 +145,16 @@ public void runCollector() { // there is a custom content plugin that throws an error. This code uses the stopOnFailure // option to halt execution. This allows us to test that the collector runs to completion while not // having to wait for the entire harmonize flow to finish. + Assumptions.assumeFalse(getHubAdminConfig().getIsProvisionedEnvironment()); assertEquals(DOC_COUNT, getStagingDocCount()); assertEquals(0, getFinalDocCount()); - Flow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize", + LegacyFlow harmonizeFlow = fm.getFlow(ENTITY, "testharmonize", FlowType.HARMONIZE); HashMap options = new HashMap<>(); // a sneaky attempt to test passing options. this value makes the collector work. options.put("returnStuff", true); - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(harmonizeFlow) .withBatchSize(10) .withThreadCount(1) diff --git a/marklogic-data-hub/src/test/resources/e2e-test/extra-nodes.xml b/marklogic-data-hub/src/test/resources/e2e-test/extra-nodes.xml index e8f1019753..a21c589c06 100644 --- a/marklogic-data-hub/src/test/resources/e2e-test/extra-nodes.xml +++ b/marklogic-data-hub/src/test/resources/e2e-test/extra-nodes.xml @@ -1,39 +1,39 @@ - - - -1 -2 - - - -a -b -c - - -x -y -z - - - - - - - -Football Feed - - - - - - \ No newline at end of file + + + +1 +2 + + + +a +b +c + + +x +y +z + + + + + + + +Football Feed + + + + + + diff --git a/marklogic-data-hub/src/test/resources/e2e-test/input/input-extra-nodes.xml b/marklogic-data-hub/src/test/resources/e2e-test/input/input-extra-nodes.xml index 3b7e78bb97..3abccca2ec 100644 --- a/marklogic-data-hub/src/test/resources/e2e-test/input/input-extra-nodes.xml +++ b/marklogic-data-hub/src/test/resources/e2e-test/input/input-extra-nodes.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file + diff --git a/marklogic-data-hub/src/test/resources/e2e-test/mapping/final-es-extranodes.xml b/marklogic-data-hub/src/test/resources/e2e-test/mapping/final-es-extranodes.xml index b72e76c52a..cfa55692e0 100644 --- a/marklogic-data-hub/src/test/resources/e2e-test/mapping/final-es-extranodes.xml +++ b/marklogic-data-hub/src/test/resources/e2e-test/mapping/final-es-extranodes.xml @@ -34,10 +34,10 @@ - \ No newline at end of file + diff --git a/marklogic-data-hub/src/test/resources/e2e-test/mapping/staging-es-extranodes.xml b/marklogic-data-hub/src/test/resources/e2e-test/mapping/staging-es-extranodes.xml index dea8b68897..67ff85120b 100644 --- a/marklogic-data-hub/src/test/resources/e2e-test/mapping/staging-es-extranodes.xml +++ b/marklogic-data-hub/src/test/resources/e2e-test/mapping/staging-es-extranodes.xml @@ -19,8 +19,8 @@ - + - \ No newline at end of file + diff --git a/marklogic-data-hub/src/test/resources/es-alignment-test/Order.entity.json b/marklogic-data-hub/src/test/resources/es-alignment-test/Order.entity.json new file mode 100644 index 0000000000..2fb2fc424c --- /dev/null +++ b/marklogic-data-hub/src/test/resources/es-alignment-test/Order.entity.json @@ -0,0 +1,50 @@ +{ "info": { + "title": "DHExample", + "description": "Data Hub Example", + "version": "1.0.0", + "baseUri": "http://marklogic.com/data-hub/" + }, + "definitions": { + "Order": { + "properties": { + "id": { "datatype": "int" }, + "purchasedItems": { + "datatype": "array", + "items": { + "$ref": "#/definitions/Item" + } + }, + "customer": { + "$ref": "#/definitions/Customer" + }, + "transactionDateTime": { "datatype": "dateTime" }, + "totalCost": { "datatype": "double" } + }, + "required": ["id", "transactionDateTime", "totalCost"], + "primaryKey": "id", + "pathRangeIndex": ["id", "totalCost"] + }, + "Customer": { + "properties": { + "id": { "datatype": "int" }, + "name": { "datatype": "string" } + }, + "required": ["id", "name"], + "primaryKey": "id", + "pii": ["name"], + "pathRangeIndex": ["id"] + }, + "Item": { + "properties": { + "id": { "datatype": "int" }, + "name": { "datatype": "string" }, + "description": { "datatype": "string" }, + "rating": { "datatype": "float" } + }, + "required": ["id", "name"], + "primaryKey": "id", + "pathRangeIndex": ["id", "rating"], + "wordLexicon": ["description"] + } + } +} \ No newline at end of file diff --git a/marklogic-data-hub/src/test/resources/es-alignment-test/Order.instance.xml b/marklogic-data-hub/src/test/resources/es-alignment-test/Order.instance.xml new file mode 100644 index 0000000000..09a7f79870 --- /dev/null +++ b/marklogic-data-hub/src/test/resources/es-alignment-test/Order.instance.xml @@ -0,0 +1,19 @@ + + 123 + + + 123 + some string + some string + 123 + + + + + 123 + some string + + + 2000-01-23T17:00:26.789186-08:00 + 123 + \ No newline at end of file diff --git a/marklogic-data-hub/src/test/resources/es-alignment-test/Order.search.xml b/marklogic-data-hub/src/test/resources/es-alignment-test/Order.search.xml new file mode 100644 index 0000000000..3900b215cd --- /dev/null +++ b/marklogic-data-hub/src/test/resources/es-alignment-test/Order.search.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + //es:instance/Order/totalCost + + + + + + + + + //es:instance/Item/rating + + + + + + + + + + //es:instance/Order/id + + + //es:instance/Order/totalCost + + + + + //es:instance/Customer/id + + + + + //es:instance/Item/id + + + //es:instance/Item/rating + + + + + + + + unfiltered + + + //es:instance/(Order|Customer|Item) + + + + + + instance + + + + es:instance + + + + + + false + + + \ No newline at end of file diff --git a/marklogic-data-hub/src/test/resources/es-alignment-test/Order.tde.xml b/marklogic-data-hub/src/test/resources/es-alignment-test/Order.tde.xml new file mode 100644 index 0000000000..46afc87d7f --- /dev/null +++ b/marklogic-data-hub/src/test/resources/es-alignment-test/Order.tde.xml @@ -0,0 +1,246 @@ + + + +Extraction Template Generated from Entity Type Document +graph uri: http://marklogic.com/data-hub/DHExample-1.0.0 + + //*:instance[*:info/*:version = "1.0.0"] + + + + + RDF + "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + + + RDF_TYPE + sem:iri(concat($RDF, "type")) + + + + + es + http://marklogic.com/entity-services + + + + + ./Customer + + + subject-iri + sem:iri(concat("http://marklogic.com/data-hub/DHExample-1.0.0/Customer/", fn:encode-for-uri(xs:string(./id)))) + + + + + + $subject-iri + + + $RDF_TYPE + + + sem:iri("http://marklogic.com/data-hub/DHExample-1.0.0/Customer") + + + + + $subject-iri + + + sem:iri("http://www.w3.org/2000/01/rdf-schema#isDefinedBy") + + + fn:base-uri(.) + + + + + + ./Customer + + + DHExample + Customer + sparse + + + id + int + id + + + name + string + name + + + + + + + ./Order + + + subject-iri + sem:iri(concat("http://marklogic.com/data-hub/DHExample-1.0.0/Order/", fn:encode-for-uri(xs:string(./id)))) + + + + + + $subject-iri + + + $RDF_TYPE + + + sem:iri("http://marklogic.com/data-hub/DHExample-1.0.0/Order") + + + + + $subject-iri + + + sem:iri("http://www.w3.org/2000/01/rdf-schema#isDefinedBy") + + + fn:base-uri(.) + + + + + + ./Order + + + DHExample + Order + sparse + + + id + int + id + + + customer + int + customer/Customer + true + + + transactionDateTime + dateTime + transactionDateTime + + + totalCost + double + totalCost + + + + + + + ./purchasedItems + + + DHExample + Order_purchasedItems + sparse + + + + id + int + ../id + + + + purchasedItems_id + int + Item + + + + + + + + + ./Item + + + subject-iri + sem:iri(concat("http://marklogic.com/data-hub/DHExample-1.0.0/Item/", fn:encode-for-uri(xs:string(./id)))) + + + + + + $subject-iri + + + $RDF_TYPE + + + sem:iri("http://marklogic.com/data-hub/DHExample-1.0.0/Item") + + + + + $subject-iri + + + sem:iri("http://www.w3.org/2000/01/rdf-schema#isDefinedBy") + + + fn:base-uri(.) + + + + + + ./Item + + + DHExample + Item + sparse + + + id + int + id + + + name + string + name + + + description + string + description + true + + + rating + float + rating + true + + + + + + + \ No newline at end of file diff --git a/marklogic-data-hub/src/test/resources/flow-manager-test/test-flow.flow.json b/marklogic-data-hub/src/test/resources/flow-manager-test/test-flow.flow.json new file mode 100644 index 0000000000..6c1e40d9ba --- /dev/null +++ b/marklogic-data-hub/src/test/resources/flow-manager-test/test-flow.flow.json @@ -0,0 +1,14 @@ +{ + "name": "test-flow", + "Description": "this is an example", + "Identifier": "(some identifier or search)", + "Steps": [{ + "0": { + "type": "mapping", + "name": "person-mapping1.json", + "identifier": "null", + "retryLimit": 0, + "options": {} + } + }] +} diff --git a/marklogic-data-hub/src/test/resources/scaffolding-test/myTestCustomProcess.processes.json b/marklogic-data-hub/src/test/resources/scaffolding-test/myTestCustomProcess.processes.json new file mode 100644 index 0000000000..714601b157 --- /dev/null +++ b/marklogic-data-hub/src/test/resources/scaffolding-test/myTestCustomProcess.processes.json @@ -0,0 +1,9 @@ +{ + "name": "myTestCustomProcess", + "type": "CUSTOM", + "version": 1, + "options": { + "key": "val", + "key2": "val2" + } +} diff --git a/marklogic-data-hub/src/test/resources/scaffolding-test/myTestIngestProcess.processes.json b/marklogic-data-hub/src/test/resources/scaffolding-test/myTestIngestProcess.processes.json new file mode 100644 index 0000000000..8e4b9d6ef2 --- /dev/null +++ b/marklogic-data-hub/src/test/resources/scaffolding-test/myTestIngestProcess.processes.json @@ -0,0 +1,9 @@ +{ + "name": "myTestIngestProcess", + "type": "INGEST", + "version": 1, + "options": { + "key": "val", + "key2": "val2" + } +} diff --git a/marklogic-data-hub/src/test/resources/scaffolding-test/myTestMappingProcess.processes.json b/marklogic-data-hub/src/test/resources/scaffolding-test/myTestMappingProcess.processes.json new file mode 100644 index 0000000000..7379b2975f --- /dev/null +++ b/marklogic-data-hub/src/test/resources/scaffolding-test/myTestMappingProcess.processes.json @@ -0,0 +1,9 @@ +{ + "name": "myTestMappingProcess", + "type": "MAPPING", + "version": 1, + "options": { + "key": "val", + "key2": "val2" + } +} diff --git a/marklogic-data-hub/src/test/resources/scaffolding-test/myTestMappingProcess2.processes.json b/marklogic-data-hub/src/test/resources/scaffolding-test/myTestMappingProcess2.processes.json new file mode 100644 index 0000000000..f11cce2701 --- /dev/null +++ b/marklogic-data-hub/src/test/resources/scaffolding-test/myTestMappingProcess2.processes.json @@ -0,0 +1,9 @@ +{ + "name": "myTestMappingProcess2", + "type": "MAPPING", + "version": 1, + "options": { + "key": "val", + "key2": "val2" + } +} diff --git a/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/gradle.properties b/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/gradle.properties index 87ad61390f..0b07af5ca8 100644 --- a/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/gradle.properties +++ b/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/gradle.properties @@ -1,5 +1,5 @@ # -# Copyright 2012-2018 MarkLogic Corporation +# Copyright 2012-2019 MarkLogic Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/src/main/hub-internal-config/triggers/ml-dh-entity-create.json b/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/src/main/hub-internal-config/triggers/ml-dh-entity-create.json new file mode 100644 index 0000000000..430363be68 --- /dev/null +++ b/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/src/main/hub-internal-config/triggers/ml-dh-entity-create.json @@ -0,0 +1,31 @@ +{ + "name": "ml-dh-entity-create", + "description": "MarkLogic Data Hub entity model creation trigger", + "event": { + "data-event": { + "collection-scope": { + "uri": "http://marklogic.com/entity-services/models" + }, + "document-content": { + "update-kind": "create" + }, + "when": "post-commit" + } + }, + "module": "data-hub/4/triggers/entity-model-trigger.xqy", + "module-db": "%%mlModulesDbName%%", + "module-root": "/", + "enabled": true, + "recursive": true, + "task-priority": "normal", + "permission": [ + { + "role-name": "%%mlHubAdminRole%%", + "capability": "update" + }, + { + "role-name": "%%mlHubUserRole%%", + "capability": "read" + } + ] +} diff --git a/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/src/main/hub-internal-config/triggers/ml-dh-entity-delete.json b/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/src/main/hub-internal-config/triggers/ml-dh-entity-delete.json new file mode 100644 index 0000000000..9e1275abf1 --- /dev/null +++ b/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/src/main/hub-internal-config/triggers/ml-dh-entity-delete.json @@ -0,0 +1,31 @@ +{ + "name": "ml-dh-entity-delete", + "description": "MarkLogic Data Hub entity model delete trigger", + "event": { + "data-event": { + "collection-scope": { + "uri": "http://marklogic.com/entity-services/models" + }, + "document-content": { + "update-kind": "delete" + }, + "when": "post-commit" + } + }, + "module": "data-hub/4/triggers/entity-model-delete-trigger.xqy", + "module-db": "%%mlModulesDbName%%", + "module-root": "/", + "enabled": true, + "recursive": true, + "task-priority": "normal", + "permission": [ + { + "role-name": "%%mlHubAdminRole%%", + "capability": "update" + }, + { + "role-name": "%%mlHubUserRole%%", + "capability": "read" + } + ] +} diff --git a/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/src/main/hub-internal-config/triggers/ml-dh-entity-modify.json b/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/src/main/hub-internal-config/triggers/ml-dh-entity-modify.json new file mode 100644 index 0000000000..5b35490faf --- /dev/null +++ b/marklogic-data-hub/src/test/resources/upgrade-projects/dhf403from300/src/main/hub-internal-config/triggers/ml-dh-entity-modify.json @@ -0,0 +1,31 @@ +{ + "name": "ml-dh-entity-modify", + "description": "MarkLogic Data Hub entity model update trigger", + "event": { + "data-event": { + "collection-scope": { + "uri": "http://marklogic.com/entity-services/models" + }, + "document-content": { + "update-kind": "modify" + }, + "when": "post-commit" + } + }, + "module": "data-hub/4/triggers/entity-model-trigger.xqy", + "module-db": "%%mlModulesDbName%%", + "module-root": "/", + "enabled": true, + "recursive": true, + "task-priority": "normal", + "permission": [ + { + "role-name": "%%mlHubAdminRole%%", + "capability": "update" + }, + { + "role-name": "%%mlHubUserRole%%", + "capability": "read" + } + ] +} diff --git a/marklogic-data-hub/src/trace-ui/package-lock.json b/marklogic-data-hub/src/trace-ui/package-lock.json index 46511fbfb2..400f511394 100644 --- a/marklogic-data-hub/src/trace-ui/package-lock.json +++ b/marklogic-data-hub/src/trace-ui/package-lock.json @@ -11,41 +11,41 @@ "dev": true, "requires": { "@angular-devkit/core": "0.6.3", - "rxjs": "6.1.0" + "rxjs": "6.3.3" } }, "@angular-devkit/build-angular": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.10.6.tgz", - "integrity": "sha512-Lbx6rjIGB2mMmkTCaolrQ86OfPxO/qfb4l2RvPiSyx06MEZfmFWKGeJzqCYKBRQajziX3Yc3AFzAPecoCkbIGA==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.10.6", - "@angular-devkit/build-optimizer": "0.10.6", - "@angular-devkit/build-webpack": "0.10.6", - "@angular-devkit/core": "7.0.6", - "@ngtools/webpack": "7.0.6", - "ajv": "6.5.3", - "autoprefixer": "9.1.5", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.12.2.tgz", + "integrity": "sha512-4PDykCNDjjFo6Ximhq2efiufoUP6pj8KvhB8UI03mLbn/Os1W0y1lmiPJn+NjeBLwFWH9DqW9Vxk/pYek7MtEA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.12.2", + "@angular-devkit/build-optimizer": "0.12.2", + "@angular-devkit/build-webpack": "0.12.2", + "@angular-devkit/core": "7.2.2", + "@ngtools/webpack": "7.2.2", + "ajv": "6.6.2", + "autoprefixer": "9.4.3", "circular-dependency-plugin": "5.0.2", "clean-css": "4.2.1", - "copy-webpack-plugin": "4.5.4", + "copy-webpack-plugin": "4.6.0", "file-loader": "2.0.0", "glob": "7.1.3", "istanbul": "0.4.5", "istanbul-instrumenter-loader": "3.0.1", "karma-source-map-support": "1.3.0", - "less": "3.8.1", + "less": "3.9.0", "less-loader": "4.1.0", - "license-webpack-plugin": "2.0.2", + "license-webpack-plugin": "2.0.4", "loader-utils": "1.1.0", - "mini-css-extract-plugin": "0.4.3", + "mini-css-extract-plugin": "0.4.4", "minimatch": "3.0.4", - "node-sass": "4.9.3", + "node-sass": "4.10.0", "opn": "5.3.0", "parse5": "4.0.0", "portfinder": "1.0.17", - "postcss": "7.0.5", + "postcss": "7.0.11", "postcss-import": "12.0.0", "postcss-loader": "3.0.0", "raw-loader": "0.5.1", @@ -54,38 +54,38 @@ "semver": "5.5.1", "source-map-loader": "0.2.4", "source-map-support": "0.5.9", - "speed-measure-webpack-plugin": "1.2.3", + "speed-measure-webpack-plugin": "1.2.5", "stats-webpack-plugin": "0.7.0", - "style-loader": "0.23.0", + "style-loader": "0.23.1", "stylus": "0.54.5", "stylus-loader": "3.0.2", - "terser-webpack-plugin": "1.1.0", + "terser-webpack-plugin": "1.2.1", "tree-kill": "1.2.0", - "webpack": "4.19.1", - "webpack-dev-middleware": "3.3.0", - "webpack-dev-server": "3.1.8", + "webpack": "4.28.4", + "webpack-dev-middleware": "3.4.0", + "webpack-dev-server": "3.1.14", "webpack-merge": "4.1.4", - "webpack-sources": "1.2.0", + "webpack-sources": "1.3.0", "webpack-subresource-integrity": "1.1.0-rc.6" }, "dependencies": { "@angular-devkit/architect": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.10.6.tgz", - "integrity": "sha512-IygpkXNn946vVUFFWKWEDxRqRy888vOAUWcmkZzqPEBYkuwWt7WnLfe8Sjw4fH/+HLWEMS8RXbdSTHiiaP9qOg==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.12.2.tgz", + "integrity": "sha512-32Eim3PM/CJKGcCF1FJQ91ohuF2vBGMd4t1DILaoOMXHWmPLI9N4ILzWHfqFLRvb8QFgLn4VNG7CI9K7GcSBlQ==", "dev": true, "requires": { - "@angular-devkit/core": "7.0.6", + "@angular-devkit/core": "7.2.2", "rxjs": "6.3.3" } }, "@angular-devkit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.0.6.tgz", - "integrity": "sha512-RPSXUtLrpYDTqAEL0rCyDKxES76EomsPBvUUZTD6UkE2pihoh9ZIxkzhzlE+HU/xdqm28+smQYFhvvEAXFWwSQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.2.tgz", + "integrity": "sha512-gDF8iXiPN870WuBMl7bCQ5+Qz5SjGL/qMcvP4hli5hkn+kMAhgG38ligUK1bbhPQUJ+Z/nSOEmyv8gLHO09SZg==", "dev": true, "requires": { - "ajv": "6.5.3", + "ajv": "6.6.2", "chokidar": "2.0.4", "fast-json-stable-stringify": "2.0.0", "rxjs": "6.3.3", @@ -93,9 +93,9 @@ } }, "ajv": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", - "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { "fast-deep-equal": "2.0.1", @@ -104,14 +104,21 @@ "uri-js": "4.2.2" } }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -126,22 +133,43 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + }, + "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=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true, + "optional": true + }, "braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -150,30 +178,54 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "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" + } + }, "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "1.0.0" } }, "expand-brackets": { @@ -182,13 +234,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -197,7 +249,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -206,7 +258,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -215,7 +267,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -224,7 +276,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -235,7 +287,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -244,7 +296,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -255,9 +307,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -268,20 +320,27 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "optional": true + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -290,7 +349,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -299,7 +358,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -316,10 +375,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -328,7 +387,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -339,12 +398,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": 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" + "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" } }, "glob-parent": { @@ -353,8 +412,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -363,18 +422,41 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } }, + "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==", + "dev": true, + "optional": true, + "requires": { + "ajv": "6.6.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=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -383,7 +465,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -392,9 +474,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extglob": { @@ -409,7 +491,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -418,7 +500,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -427,7 +509,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -456,36 +538,124 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true, + "optional": true + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "dev": true, + "optional": true, + "requires": { + "mime-db": "1.37.0" + } + }, + "node-sass": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.10.0.tgz", + "integrity": "sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==", + "dev": true, + "optional": true, + "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.3", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.1", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.10.0", + "node-gyp": "3.8.0", + "npmlog": "4.1.2", + "request": "2.88.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.1", + "true-case-path": "1.0.3" } }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "optional": true + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.7", + "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.21", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + } + }, "rxjs": { "version": "6.3.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, + "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==", + "dev": true, + "optional": true + }, "semver": { "version": "5.5.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", @@ -504,8 +674,8 @@ "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { - "buffer-from": "1.0.0", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { "source-map": { @@ -516,26 +686,60 @@ } } }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "optional": true, + "requires": { + "psl": "1.1.29", + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } - } - } - }, - "@angular-devkit/build-optimizer": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.10.6.tgz", - "integrity": "sha512-oedg8F++8zZTmoTt141k3nlyPtrSSsQUZI9TFbSdfR1D5WDflwOlkLyRb5WoC53HSoQnagKxY2qzd7khVah//Q==", + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true, + "optional": true + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.12.2.tgz", + "integrity": "sha512-5SARSE18X5/churU0Qc0gOfDt5EwuwKsJmIA7hHBzi44iotQm5c8ea0q0acua4/U4K+jOsF6A4Faa08Vr2624A==", "dev": true, "requires": { "loader-utils": "1.1.0", "source-map": "0.5.6", - "typescript": "3.1.6", + "typescript": "3.2.2", "webpack-sources": "1.2.0" }, "dependencies": { @@ -546,41 +750,59 @@ "dev": true }, "typescript": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.1.6.tgz", - "integrity": "sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", "dev": true + }, + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "dev": true, + "requires": { + "source-list-map": "2.0.1", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } } } }, "@angular-devkit/build-webpack": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.10.6.tgz", - "integrity": "sha512-tPv23KKw3iAGCTF6noD7zdHbufny4A3d+mlX1VoJDiAa6jqmuFxhY2fALymc11MRY4HVtMF5J1kQy9BLGCDbQg==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.12.2.tgz", + "integrity": "sha512-Uv3f8XJc/5UTj2T7XjxFYDhuybFIIitLGxBpp/hEIc7eXI4MsJKB6CoDJy+2BQch7c/QjKH7W3dmTxzuSJ2j3g==", "dev": true, "requires": { - "@angular-devkit/architect": "0.10.6", - "@angular-devkit/core": "7.0.6", + "@angular-devkit/architect": "0.12.2", + "@angular-devkit/core": "7.2.2", "rxjs": "6.3.3" }, "dependencies": { "@angular-devkit/architect": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.10.6.tgz", - "integrity": "sha512-IygpkXNn946vVUFFWKWEDxRqRy888vOAUWcmkZzqPEBYkuwWt7WnLfe8Sjw4fH/+HLWEMS8RXbdSTHiiaP9qOg==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.12.2.tgz", + "integrity": "sha512-32Eim3PM/CJKGcCF1FJQ91ohuF2vBGMd4t1DILaoOMXHWmPLI9N4ILzWHfqFLRvb8QFgLn4VNG7CI9K7GcSBlQ==", "dev": true, "requires": { - "@angular-devkit/core": "7.0.6", + "@angular-devkit/core": "7.2.2", "rxjs": "6.3.3" } }, "@angular-devkit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.0.6.tgz", - "integrity": "sha512-RPSXUtLrpYDTqAEL0rCyDKxES76EomsPBvUUZTD6UkE2pihoh9ZIxkzhzlE+HU/xdqm28+smQYFhvvEAXFWwSQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.2.tgz", + "integrity": "sha512-gDF8iXiPN870WuBMl7bCQ5+Qz5SjGL/qMcvP4hli5hkn+kMAhgG38ligUK1bbhPQUJ+Z/nSOEmyv8gLHO09SZg==", "dev": true, "requires": { - "ajv": "6.5.3", + "ajv": "6.6.2", "chokidar": "2.0.4", "fast-json-stable-stringify": "2.0.0", "rxjs": "6.3.3", @@ -588,9 +810,9 @@ } }, "ajv": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", - "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { "fast-deep-equal": "2.0.1", @@ -605,8 +827,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -627,16 +849,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -645,7 +867,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -656,19 +878,19 @@ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" } }, "expand-brackets": { @@ -677,13 +899,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -692,7 +914,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -701,7 +923,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -710,7 +932,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -719,7 +941,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -730,7 +952,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -739,7 +961,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -750,9 +972,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -769,14 +991,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -785,7 +1007,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -794,7 +1016,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -811,10 +1033,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -823,7 +1045,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -834,8 +1056,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -844,7 +1066,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -855,7 +1077,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -864,7 +1086,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -873,9 +1095,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extglob": { @@ -890,7 +1112,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -899,7 +1121,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -908,7 +1130,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -937,19 +1159,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "punycode": { @@ -964,7 +1186,7 @@ "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "source-map": { @@ -979,7 +1201,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } } } @@ -992,7 +1214,7 @@ "requires": { "ajv": "6.4.0", "chokidar": "2.0.3", - "rxjs": "6.1.0", + "rxjs": "6.3.3", "source-map": "0.5.7" }, "dependencies": { @@ -1345,13 +1567,13 @@ "dev": true, "requires": { "@angular-devkit/core": "0.6.3", - "rxjs": "6.1.0" + "rxjs": "6.3.3" } }, "@angular-mdl/core": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@angular-mdl/core/-/core-4.0.8.tgz", - "integrity": "sha512-ofAjjo/0gQeast4kUtTjvOhXumNg50z3oh8m/OlPrBlii4/iTazEqHTsQBtac33h2B4ovMm+viwAATDlpLJm+g==" + "integrity": "sha1-Ad7nxvkmY6V7p58kjYXm8jProHM=" }, "@angular-mdl/popover": { "version": "0.10.0", @@ -1384,8 +1606,8 @@ "@schematics/update": "0.6.3", "opn": "5.3.0", "resolve": "1.5.0", - "rxjs": "6.1.0", - "semver": "5.5.0", + "rxjs": "6.3.3", + "semver": "5.6.0", "silent-error": "1.1.0", "symbol-observable": "1.2.0", "yargs-parser": "10.0.0" @@ -1474,12 +1696,12 @@ } }, "@ngtools/webpack": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.0.6.tgz", - "integrity": "sha512-lOHpVqr30QXPuaOxSRasHv6ybDj4a1jVwSOk+W4aGqVlLi0bsngt9HrvgR+FALEoG9P520bytz16wma81Y2Aeg==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.2.2.tgz", + "integrity": "sha512-xjvQ8tlyyReE69q+whAubwX4fayPoy4NHSIDa429qdcUypkvhSScAtou003oVAKG519rznykDrUHAWtvFMVf4Q==", "dev": true, "requires": { - "@angular-devkit/core": "7.0.6", + "@angular-devkit/core": "7.2.2", "enhanced-resolve": "4.1.0", "rxjs": "6.3.3", "tree-kill": "1.2.0", @@ -1487,12 +1709,12 @@ }, "dependencies": { "@angular-devkit/core": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.0.6.tgz", - "integrity": "sha512-RPSXUtLrpYDTqAEL0rCyDKxES76EomsPBvUUZTD6UkE2pihoh9ZIxkzhzlE+HU/xdqm28+smQYFhvvEAXFWwSQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.2.tgz", + "integrity": "sha512-gDF8iXiPN870WuBMl7bCQ5+Qz5SjGL/qMcvP4hli5hkn+kMAhgG38ligUK1bbhPQUJ+Z/nSOEmyv8gLHO09SZg==", "dev": true, "requires": { - "ajv": "6.5.3", + "ajv": "6.6.2", "chokidar": "2.0.4", "fast-json-stable-stringify": "2.0.0", "rxjs": "6.3.3", @@ -1500,9 +1722,9 @@ } }, "ajv": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", - "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { "fast-deep-equal": "2.0.1", @@ -1517,8 +1739,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -1539,16 +1761,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -1557,7 +1779,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1568,19 +1790,19 @@ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" } }, "expand-brackets": { @@ -1589,13 +1811,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -1604,7 +1826,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -1613,7 +1835,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -1622,7 +1844,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1631,7 +1853,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1642,7 +1864,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1651,7 +1873,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1662,9 +1884,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -1681,14 +1903,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -1697,7 +1919,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -1706,7 +1928,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1723,10 +1945,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -1735,7 +1957,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1746,8 +1968,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -1756,7 +1978,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -1767,7 +1989,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1776,7 +1998,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1785,9 +2007,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extglob": { @@ -1802,7 +2024,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -1811,7 +2033,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1820,7 +2042,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1849,19 +2071,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "punycode": { @@ -1876,7 +2098,7 @@ "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "source-map": { @@ -1891,7 +2113,25 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" + } + }, + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "dev": true, + "requires": { + "source-list-map": "2.0.1", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } } } @@ -1916,8 +2156,8 @@ "@angular-devkit/core": "0.6.3", "@angular-devkit/schematics": "0.6.3", "npm-registry-client": "8.5.1", - "rxjs": "6.1.0", - "semver": "5.5.0", + "rxjs": "6.3.3", + "semver": "5.6.0", "semver-intersect": "1.3.1" } }, @@ -1927,24 +2167,24 @@ "integrity": "sha512-sDuo5cONKBd0Rre2kaJ1mdc0NinqoPb96Yy3T3bzEMe72BzbEP+kAZiwBbZj/NzV93oAFdcjodknsA93ICXLoA==" }, "@types/jasmine": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.7.tgz", - "integrity": "sha512-RdbrPcW1aD78UmdLiDa9ZCKrbR5Go8PXh6GCpb4oIOkWVEusubSJJDrP4c5RYOu8m/CBz+ygZpicj6Pgms5a4Q==", + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.15.tgz", + "integrity": "sha512-HH1x/3zn6V0+tTu05OuDhka5Impvh1AAj636X+xhinINKl+7iSHM9ET4wrxMhdoKYmv8zMhlsrsEAs9W/cA3Yw==", "dev": true }, "@types/jasminewd2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", - "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", + "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", "dev": true, "requires": { - "@types/jasmine": "2.8.7" + "@types/jasmine": "2.8.15" } }, "@types/lodash": { - "version": "4.14.108", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.108.tgz", - "integrity": "sha512-WD2vUOKfBBVHxWUV9iMR9RMfpuf8HquxWeAq2yqGVL7Nc4JW2+sQama0pREMqzNI3Tutj0PyxYUJwuoxxvX+xA==", + "version": "4.14.120", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.120.tgz", + "integrity": "sha512-jQ21kQ120mo+IrDs1nFNVm/AsdFxIx2+vZ347DbogHJPd/JzKNMOqU6HCYin1W6v8l5R9XSO2/e9cxmn7HAnVw==", "dev": true }, "@types/node": { @@ -1960,9 +2200,9 @@ "dev": true }, "@types/selenium-webdriver": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.10.tgz", - "integrity": "sha512-ikB0JHv6vCR1KYUQAzTO4gi/lXLElT4Tx+6De2pc/OZwizE9LRNiTa+U8TBFKBD/nntPnr/MPSHSnOTybjhqNA==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.14.tgz", + "integrity": "sha512-4GbNCDs98uHCT/OMv40qQC/OpoPbYn9XdXeTiFwHBBFO6eJhYEPUu2zDKirXSbHlvDV8oZ9l8EQ+HrEx/YS9DQ==", "dev": true }, "@types/semver": { @@ -1971,6 +2211,12 @@ "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", "dev": true }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", @@ -1983,180 +2229,194 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "requires": { + "@types/node": "9.4.7", + "@types/source-list-map": "0.1.2", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "@webassemblyjs/ast": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.6.tgz", - "integrity": "sha512-8nkZS48EVsMUU0v6F1LCIOw4RYWLm2plMtbhFTjNgeXmsTNLuU3xTRtnljt9BFQB+iPbLRobkNrCWftWnNC7wQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.7.6", - "@webassemblyjs/helper-wasm-bytecode": "1.7.6", - "@webassemblyjs/wast-parser": "1.7.6", - "mamacro": "0.0.3" + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.6.tgz", - "integrity": "sha512-VBOZvaOyBSkPZdIt5VBMg3vPWxouuM13dPXGWI1cBh3oFLNcFJ8s9YA7S9l4mPI7+Q950QqOmqj06oa83hNWBA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.6.tgz", - "integrity": "sha512-SCzhcQWHXfrfMSKcj8zHg1/kL9kb3aa5TN4plc/EREOs5Xop0ci5bdVBApbk2yfVi8aL+Ly4Qpp3/TRAUInjrg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.6.tgz", - "integrity": "sha512-1/gW5NaGsEOZ02fjnFiU8/OEEXU1uVbv2um0pQ9YVL3IHSkyk6xOwokzyqqO1qDZQUAllb+V8irtClPWntbVqw==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.6.tgz", - "integrity": "sha512-+suMJOkSn9+vEvDvgyWyrJo5vJsWSDXZmJAjtoUq4zS4eqHyXImpktvHOZwXp1XQjO5H+YQwsBgqTQEc0J/5zg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.7.6" + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/helper-fsm": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.6.tgz", - "integrity": "sha512-HCS6KN3wgxUihGBW7WFzEC/o8Eyvk0d56uazusnxXthDPnkWiMv+kGi9xXswL2cvfYfeK5yiM17z2K5BVlwypw==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.6.tgz", - "integrity": "sha512-e8/6GbY7OjLM+6OsN7f2krC2qYVNaSr0B0oe4lWdmq5sL++8dYDD1TFbD1TdAdWMRTYNr/Qq7ovXWzia2EbSjw==", - "dev": true, - "requires": { - "mamacro": "0.0.3" - } + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.6.tgz", - "integrity": "sha512-PzYFCb7RjjSdAOljyvLWVqd6adAOabJW+8yRT+NWhXuf1nNZWH+igFZCUK9k7Cx7CsBbzIfXjJc7u56zZgFj9Q==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.6.tgz", - "integrity": "sha512-3GS628ppDPSuwcYlQ7cDCGr4W2n9c4hLzvnRKeuz+lGsJSmc/ADVoYpm1ts2vlB1tGHkjtQMni+yu8mHoMlKlA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.6", - "@webassemblyjs/helper-buffer": "1.7.6", - "@webassemblyjs/helper-wasm-bytecode": "1.7.6", - "@webassemblyjs/wasm-gen": "1.7.6" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" } }, "@webassemblyjs/ieee754": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.6.tgz", - "integrity": "sha512-V4cIp0ruyw+hawUHwQLn6o2mFEw4t50tk530oKsYXQhEzKR+xNGDxs/SFFuyTO7X3NzEu4usA3w5jzhl2RYyzQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", "dev": true, "requires": { "@xtuc/ieee754": "1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.6.tgz", - "integrity": "sha512-ojdlG8WpM394lBow4ncTGJoIVZ4aAtNOWHhfAM7m7zprmkVcKK+2kK5YJ9Bmj6/ketTtOn7wGSHCtMt+LzqgYQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", "dev": true, "requires": { "@xtuc/long": "4.2.1" } }, "@webassemblyjs/utf8": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.6.tgz", - "integrity": "sha512-oId+tLxQ+AeDC34ELRYNSqJRaScB0TClUU6KQfpB8rNT6oelYlz8axsPhf6yPTg7PBJ/Z5WcXmUYiHEWgbbHJw==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.6.tgz", - "integrity": "sha512-pTNjLO3o41v/Vz9VFLl+I3YLImpCSpodFW77pNoH4agn5I6GgSxXHXtvWDTvYJFty0jSeXZWLEmbaSIRUDlekg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.6", - "@webassemblyjs/helper-buffer": "1.7.6", - "@webassemblyjs/helper-wasm-bytecode": "1.7.6", - "@webassemblyjs/helper-wasm-section": "1.7.6", - "@webassemblyjs/wasm-gen": "1.7.6", - "@webassemblyjs/wasm-opt": "1.7.6", - "@webassemblyjs/wasm-parser": "1.7.6", - "@webassemblyjs/wast-printer": "1.7.6" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/wasm-gen": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.6.tgz", - "integrity": "sha512-mQvFJVumtmRKEUXMohwn8nSrtjJJl6oXwF3FotC5t6e2hlKMh8sIaW03Sck2MDzw9xPogZD7tdP5kjPlbH9EcQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.6", - "@webassemblyjs/helper-wasm-bytecode": "1.7.6", - "@webassemblyjs/ieee754": "1.7.6", - "@webassemblyjs/leb128": "1.7.6", - "@webassemblyjs/utf8": "1.7.6" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wasm-opt": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.6.tgz", - "integrity": "sha512-go44K90fSIsDwRgtHhX14VtbdDPdK2sZQtZqUcMRvTojdozj5tLI0VVJAzLCfz51NOkFXezPeVTAYFqrZ6rI8Q==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.6", - "@webassemblyjs/helper-buffer": "1.7.6", - "@webassemblyjs/wasm-gen": "1.7.6", - "@webassemblyjs/wasm-parser": "1.7.6" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" } }, "@webassemblyjs/wasm-parser": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.6.tgz", - "integrity": "sha512-t1T6TfwNY85pDA/HWPA8kB9xA4sp9ajlRg5W7EKikqrynTyFo+/qDzIpvdkOkOGjlS6d4n4SX59SPuIayR22Yg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.6", - "@webassemblyjs/helper-api-error": "1.7.6", - "@webassemblyjs/helper-wasm-bytecode": "1.7.6", - "@webassemblyjs/ieee754": "1.7.6", - "@webassemblyjs/leb128": "1.7.6", - "@webassemblyjs/utf8": "1.7.6" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wast-parser": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.6.tgz", - "integrity": "sha512-1MaWTErN0ziOsNUlLdvwS+NS1QWuI/kgJaAGAMHX8+fMJFgOJDmN/xsG4h/A1Gtf/tz5VyXQciaqHZqp2q0vfg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.6", - "@webassemblyjs/floating-point-hex-parser": "1.7.6", - "@webassemblyjs/helper-api-error": "1.7.6", - "@webassemblyjs/helper-code-frame": "1.7.6", - "@webassemblyjs/helper-fsm": "1.7.6", - "@xtuc/long": "4.2.1", - "mamacro": "0.0.3" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.6.tgz", - "integrity": "sha512-vHdHSK1tOetvDcl1IV1OdDeGNe/NDDQ+KzuZHMtqTVP1xO/tZ/IKNpj5BaGk1OYFdsDWQqb31PIwdEyPntOWRQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.6", - "@webassemblyjs/wast-parser": "1.7.6", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", "@xtuc/long": "4.2.1" } }, @@ -2219,17 +2479,10 @@ "acorn": "5.7.3" } }, - "addressparser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", - "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", - "dev": true, - "optional": true - }, "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", "dev": true }, "after": { @@ -2260,9 +2513,9 @@ } }, "ajv-errors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", - "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true }, "ajv-keywords": { @@ -2287,53 +2540,10 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, - "amqplib": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", - "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", - "dev": true, - "optional": true, - "requires": { - "bitsyntax": "0.0.4", - "bluebird": "3.5.1", - "buffer-more-ints": "0.0.2", - "readable-stream": "1.1.14", - "safe-buffer": "5.1.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "optional": true, - "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=", - "dev": true, - "optional": true - } - } - }, "ansi-colors": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.1.tgz", - "integrity": "sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, "ansi-html": { @@ -2367,9 +2577,9 @@ } }, "app-root-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", - "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.1.0.tgz", + "integrity": "sha1-mL9lmTJ+zqGZMJhm6BQDaP0uZGo=", "dev": true }, "append-transform": { @@ -2431,9 +2641,9 @@ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, "array-slice": { @@ -2508,11 +2718,9 @@ } }, "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=", - "dev": true, - "optional": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", @@ -2520,20 +2728,13 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "ast-types": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.3.tgz", - "integrity": "sha512-XA5o5dsNw8MhyW0Q7MWXJWc4oOzZKbdsEJq45h7c8q/d9DwWZ5F2ugUc1PuMLPGsUnphCt/cNDHu8JeBbxf1qA==", - "dev": true, - "optional": true - }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "4.17.11" } }, "async-each": { @@ -2565,52 +2766,29 @@ "dev": true }, "autoprefixer": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.5.tgz", - "integrity": "sha512-kk4Zb6RUc58ld7gdosERHMF3DzIYJc2fp5sX46qEsGXQQy5bXsu8qyLjoxuY1NuQ/cJuCYnx99BfjwnRggrYIw==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.3.tgz", + "integrity": "sha512-/XSnzDepRkAU//xLcXA/lUWxpsBuw0WiriAHOqnxkuCtzLhaz+fL4it4gp20BQ8n5SyLzK/FOc7A0+u/rti2FQ==", "dev": true, "requires": { - "browserslist": "4.3.4", - "caniuse-lite": "1.0.30000910", + "browserslist": "4.4.1", + "caniuse-lite": "1.0.30000929", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "7.0.5", + "postcss": "7.0.11", "postcss-value-parser": "3.3.1" } }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true + "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.6.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "axios": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", - "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", - "dev": true, - "optional": true, - "requires": { - "follow-redirects": "1.0.0" - }, - "dependencies": { - "follow-redirects": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", - "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.9" - } - } - } + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true }, "babel-code-frame": { "version": "6.26.0", @@ -2661,7 +2839,7 @@ "babel-types": "6.26.0", "detect-indent": "4.0.0", "jsesc": "1.3.0", - "lodash": "4.17.10", + "lodash": "4.17.11", "source-map": "0.5.7", "trim-right": "1.0.1" } @@ -2681,7 +2859,7 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.6", + "core-js": "2.6.2", "regenerator-runtime": "0.11.1" } }, @@ -2695,7 +2873,7 @@ "babel-traverse": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "lodash": "4.17.10" + "lodash": "4.17.11" } }, "babel-traverse": { @@ -2712,7 +2890,7 @@ "debug": "2.6.9", "globals": "9.18.0", "invariant": "2.2.4", - "lodash": "4.17.10" + "lodash": "4.17.11" } }, "babel-types": { @@ -2723,7 +2901,7 @@ "requires": { "babel-runtime": "6.26.0", "esutils": "2.0.2", - "lodash": "4.17.10", + "lodash": "4.17.11", "to-fast-properties": "1.0.3" } }, @@ -2865,54 +3043,10 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, - "bitsyntax": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", - "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", - "dev": true, - "optional": true, - "requires": { - "buffer-more-ints": "0.0.2" - } - }, - "bl": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", - "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "optional": true, - "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" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true, - "optional": true - } - } - }, "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, "block-stream": { @@ -2945,9 +3079,9 @@ "dev": true }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "dev": true, "requires": { "bytes": "3.0.0", @@ -2955,19 +3089,11 @@ "debug": "2.6.9", "depd": "1.1.2", "http-errors": "1.6.3", - "iconv-lite": "0.4.19", + "iconv-lite": "0.4.23", "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", + "qs": "6.5.2", + "raw-body": "2.3.3", "type-is": "1.6.16" - }, - "dependencies": { - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", - "dev": true - } } }, "bonjour": { @@ -2976,7 +3102,7 @@ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "requires": { - "array-flatten": "2.1.1", + "array-flatten": "2.1.2", "deep-equal": "1.0.1", "dns-equal": "1.0.0", "dns-txt": "2.0.2", @@ -2984,15 +3110,6 @@ "multicast-dns-service-types": "1.1.0" } }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -3086,7 +3203,7 @@ "create-hmac": "1.1.7", "elliptic": "6.4.1", "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "parse-asn1": "5.1.3" } }, "browserify-zlib": { @@ -3099,20 +3216,20 @@ } }, "browserslist": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.4.tgz", - "integrity": "sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz", + "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000910", - "electron-to-chromium": "1.3.84", - "node-releases": "1.0.4" + "caniuse-lite": "1.0.30000929", + "electron-to-chromium": "1.3.103", + "node-releases": "1.1.3" } }, "browserstack": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.1.tgz", - "integrity": "sha512-O8VMT64P9NOLhuIoD4YngyxBURefaSdR4QdhG8l6HZ9VxtU7jc3m6jLufFwKA5gaf7fetfB2TnRJnMxyob+heg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz", + "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==", "dev": true, "requires": { "https-proxy-agent": "2.2.1" @@ -3129,6 +3246,28 @@ "isarray": "1.0.0" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, "buffer-from": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", @@ -3141,34 +3280,12 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "buffer-more-ints": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", - "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=", - "dev": true - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "buildmail": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", - "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=", - "dev": true, - "optional": true, - "requires": { - "addressparser": "1.0.1", - "libbase64": "0.1.0", - "libmime": "3.0.0", - "libqp": "1.1.0", - "nodemailer-fetch": "1.6.0", - "nodemailer-shared": "1.1.0", - "punycode": "1.4.1" - } - }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -3207,7 +3324,7 @@ "mkdirp": "0.5.1", "move-concurrently": "1.0.1", "promise-inflight": "1.0.1", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "ssri": "5.3.0", "unique-filename": "1.1.1", "y18n": "4.0.0" @@ -3267,9 +3384,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000910", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000910.tgz", - "integrity": "sha512-u/nxtHGAzCGZzIxt3dA/tpSPOcirBZFWKwz1EPz4aaupnBI2XR0Rbr74g0zc6Hzy41OEM4uMoZ38k56TpYAWjQ==", + "version": "1.0.30000929", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz", + "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==", "dev": true }, "caseless": { @@ -3289,14 +3406,25 @@ } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "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.5.0" + }, + "dependencies": { + "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" + } + } } }, "chokidar": { @@ -3348,9 +3476,9 @@ "dev": true }, "circular-json": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.4.tgz", - "integrity": "sha512-vnJA8KS0BfOihugYEUkLRcnmq21FbuivbxgzDLXNs3zIk4KllV4Mx4UuTzBXht9F00C7QfD1YqMXg1zP6EXpig==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", "dev": true }, "class-utils": { @@ -3470,23 +3598,31 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codelyzer": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.3.0.tgz", - "integrity": "sha512-RLMrtLwrBS0dfo2/KTP+2NHofCpzcuh0bEp/A/naqvQonbUL4AW/qWQdbpn8dMNudtpmzEx9eS8KEpGdVPg1BA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz", + "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==", "dev": true, "requires": { - "app-root-path": "2.0.1", - "css-selector-tokenizer": "0.7.0", + "app-root-path": "2.1.0", + "css-selector-tokenizer": "0.7.1", "cssauron": "1.4.0", "semver-dsl": "1.0.1", "source-map": "0.5.7", - "sprintf-js": "1.0.3" + "sprintf-js": "1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } } }, "codemirror": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.37.0.tgz", - "integrity": "sha512-dQaayDJCLU4UJcwg2RM44oFrs0dMNndTp6qxQJF6XI71l1xN3RB4IqiKES0b0rccbARbrD/UBB4t8DNknfaOTw==" + "version": "5.42.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.42.2.tgz", + "integrity": "sha512-Tkv6im39VuhduFMsDA3MlXcC/kKas3Z0PI1/8N88QvFQbtOeiiwnfFJE4juGyC8/a4sb1BSxQlzsil8XLQdxRw==" }, "collection-visit": { "version": "1.0.0", @@ -3525,13 +3661,14 @@ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "4.17.11" } }, "combined-stream": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, "requires": { "delayed-stream": "1.0.0" } @@ -3665,9 +3802,9 @@ } }, "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=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, "console-browserify": { @@ -3733,7 +3870,7 @@ "fs-write-stream-atomic": "1.0.10", "iferr": "0.1.5", "mkdirp": "0.5.1", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "run-queue": "1.0.3" } }, @@ -3744,9 +3881,9 @@ "dev": true }, "copy-webpack-plugin": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz", - "integrity": "sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", "dev": true, "requires": { "cacache": "10.0.4", @@ -3756,7 +3893,7 @@ "loader-utils": "1.1.0", "minimatch": "3.0.4", "p-limit": "1.3.0", - "serialize-javascript": "1.5.0" + "serialize-javascript": "1.6.1" }, "dependencies": { "is-extglob": { @@ -3771,15 +3908,15 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } } } }, "core-js": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", - "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.2.tgz", + "integrity": "sha512-NdBPF/RVwPW6jr0NCILuyN9RiqLo2b1mddWHkUL+VnvcB7dzlnBJ1bXYntjpTGOgkZiiLWj2JxmOr7eGE3qK6g==" }, "core-util-is": { "version": "1.0.2", @@ -3793,7 +3930,7 @@ "dev": true, "requires": { "is-directory": "0.3.1", - "js-yaml": "3.12.0", + "js-yaml": "3.12.1", "parse-json": "4.0.0", "require-from-string": "2.0.2" }, @@ -3805,9 +3942,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "dev": true, "requires": { "argparse": "1.0.9", @@ -3872,16 +4009,6 @@ "which": "1.3.0" } }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -3908,13 +4035,13 @@ "dev": true }, "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=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", "dev": true, "requires": { "cssesc": "0.1.0", - "fastparse": "1.1.1", + "fastparse": "1.1.2", "regexpu-core": "1.0.0" } }, @@ -3968,17 +4095,10 @@ } } }, - "data-uri-to-buffer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", - "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", - "dev": true, - "optional": true - }, "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==" + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" }, "date-format": { "version": "1.2.0", @@ -3995,7 +4115,7 @@ "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", "requires": { "ms": "2.0.0" } @@ -4095,27 +4215,6 @@ } } }, - "degenerator": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", - "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", - "dev": true, - "optional": true, - "requires": { - "ast-types": "0.11.3", - "escodegen": "1.9.1", - "esprima": "3.1.3" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true, - "optional": true - } - } - }, "del": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", @@ -4127,7 +4226,7 @@ "is-path-in-cwd": "1.0.0", "p-map": "1.2.0", "pify": "3.0.0", - "rimraf": "2.6.2" + "rimraf": "2.6.3" }, "dependencies": { "globby": { @@ -4229,12 +4328,11 @@ } }, "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.1.tgz", + "integrity": "sha512-UN6X6XwRjllabfRhBdkVSo63uurJ8nSvMGrwl94EYVz6g+exhTV+yVSYk5VC/xl3MBFBTtC0J20uFKce4Brrng==", "dev": true, "requires": { - "arrify": "1.0.1", "path-type": "3.0.0" } }, @@ -4281,13 +4379,6 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "double-ended-queue": { - "version": "2.1.0-0", - "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", - "dev": true, - "optional": true - }, "duplexify": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", @@ -4316,9 +4407,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz", - "integrity": "sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw==", + "version": "1.3.103", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz", + "integrity": "sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ==", "dev": true }, "elliptic": { @@ -4329,7 +4420,7 @@ "requires": { "bn.js": "4.11.8", "brorand": "1.1.0", - "hash.js": "1.1.5", + "hash.js": "1.1.7", "hmac-drbg": "1.0.1", "inherits": "2.0.3", "minimalistic-assert": "1.0.1", @@ -4358,17 +4449,16 @@ } }, "engine.io": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", - "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", "dev": true, "requires": { "accepts": "1.3.5", "base64id": "1.0.0", "cookie": "0.3.1", "debug": "3.1.0", - "engine.io-parser": "2.1.2", - "uws": "9.14.0", + "engine.io-parser": "2.1.3", "ws": "3.3.3" }, "dependencies": { @@ -4384,15 +4474,15 @@ } }, "engine.io-client": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", - "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", "dev": true, "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", "debug": "3.1.0", - "engine.io-parser": "2.1.2", + "engine.io-parser": "2.1.3", "has-cors": "1.1.0", "indexof": "0.0.1", "parseqs": "0.0.5", @@ -4414,15 +4504,15 @@ } }, "engine.io-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", - "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", "dev": true, "requires": { "after": "0.8.2", "arraybuffer.slice": "0.0.7", "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", + "blob": "0.0.5", "has-binary2": "1.0.3" } }, @@ -4434,7 +4524,7 @@ "requires": { "graceful-fs": "4.1.11", "memory-fs": "0.4.1", - "tapable": "1.1.0" + "tapable": "1.1.1" } }, "ent": { @@ -4461,9 +4551,9 @@ } }, "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", "dev": true }, "es6-promisify": { @@ -4472,15 +4562,7 @@ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", - "dev": true - } + "es6-promise": "4.2.5" } }, "escape-html": { @@ -4494,36 +4576,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, - "escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", - "dev": true, - "optional": true, - "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" - }, - "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } - } - }, "eslint-scope": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", @@ -4574,15 +4626,15 @@ "dev": true }, "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "requires": { "original": "1.0.2" } @@ -4620,7 +4672,7 @@ "requires": { "nice-try": "1.0.5", "path-key": "2.0.1", - "semver": "5.5.0", + "semver": "5.6.0", "shebang-command": "1.2.0", "which": "1.3.0" } @@ -4789,7 +4841,8 @@ "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true }, "extend-shallow": { "version": "3.0.2", @@ -4843,9 +4896,9 @@ "dev": true }, "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", "dev": true }, "faye-websocket": { @@ -4872,13 +4925,6 @@ "schema-utils": "1.0.0" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -4943,6 +4989,12 @@ "locate-path": "2.0.0" } }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, "flush-write-stream": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", @@ -5097,7 +5149,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", "dev": true, - "optional": true, "requires": { "nan": "2.10.0", "node-pre-gyp": "0.10.0" @@ -5106,8 +5157,7 @@ "abbrev": { "version": "1.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ansi-regex": { "version": "2.1.1", @@ -5117,14 +5167,12 @@ "aproba": { "version": "1.2.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "are-we-there-yet": { "version": "1.1.4", "bundled": true, "dev": true, - "optional": true, "requires": { "delegates": "1.0.0", "readable-stream": "2.3.6" @@ -5147,8 +5195,7 @@ "chownr": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "code-point-at": { "version": "1.1.0", @@ -5168,14 +5215,12 @@ "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "debug": { "version": "2.6.9", "bundled": true, "dev": true, - "optional": true, "requires": { "ms": "2.0.0" } @@ -5183,26 +5228,22 @@ "deep-extend": { "version": "0.5.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "delegates": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "detect-libc": { "version": "1.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "fs-minipass": { "version": "1.2.5", "bundled": true, "dev": true, - "optional": true, "requires": { "minipass": "2.2.4" } @@ -5210,14 +5251,12 @@ "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "gauge": { "version": "2.7.4", "bundled": true, "dev": true, - "optional": true, "requires": { "aproba": "1.2.0", "console-control-strings": "1.1.0", @@ -5233,7 +5272,6 @@ "version": "7.1.2", "bundled": true, "dev": true, - "optional": true, "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -5246,14 +5284,12 @@ "has-unicode": { "version": "2.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "iconv-lite": { "version": "0.4.21", "bundled": true, "dev": true, - "optional": true, "requires": { "safer-buffer": "2.1.2" } @@ -5262,7 +5298,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimatch": "3.0.4" } @@ -5271,7 +5306,6 @@ "version": "1.0.6", "bundled": true, "dev": true, - "optional": true, "requires": { "once": "1.4.0", "wrappy": "1.0.2" @@ -5285,8 +5319,7 @@ "ini": { "version": "1.3.5", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", @@ -5299,8 +5332,7 @@ "isarray": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minimatch": { "version": "3.0.4", @@ -5328,7 +5360,6 @@ "version": "1.1.0", "bundled": true, "dev": true, - "optional": true, "requires": { "minipass": "2.2.4" } @@ -5344,14 +5375,12 @@ "ms": { "version": "2.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "needle": { "version": "2.2.0", "bundled": true, "dev": true, - "optional": true, "requires": { "debug": "2.6.9", "iconv-lite": "0.4.21", @@ -5362,7 +5391,6 @@ "version": "0.10.0", "bundled": true, "dev": true, - "optional": true, "requires": { "detect-libc": "1.0.3", "mkdirp": "0.5.1", @@ -5380,7 +5408,6 @@ "version": "4.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "abbrev": "1.1.1", "osenv": "0.1.5" @@ -5389,14 +5416,12 @@ "npm-bundled": { "version": "1.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "npm-packlist": { "version": "1.1.10", "bundled": true, "dev": true, - "optional": true, "requires": { "ignore-walk": "3.0.1", "npm-bundled": "1.0.3" @@ -5406,7 +5431,6 @@ "version": "4.1.2", "bundled": true, "dev": true, - "optional": true, "requires": { "are-we-there-yet": "1.1.4", "console-control-strings": "1.1.0", @@ -5422,8 +5446,7 @@ "object-assign": { "version": "4.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "once": { "version": "1.4.0", @@ -5436,20 +5459,17 @@ "os-homedir": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "os-tmpdir": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "osenv": { "version": "0.1.5", "bundled": true, "dev": true, - "optional": true, "requires": { "os-homedir": "1.0.2", "os-tmpdir": "1.0.2" @@ -5458,20 +5478,17 @@ "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "process-nextick-args": { "version": "2.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "rc": { "version": "1.2.7", "bundled": true, "dev": true, - "optional": true, "requires": { "deep-extend": "0.5.1", "ini": "1.3.5", @@ -5482,8 +5499,7 @@ "minimist": { "version": "1.2.0", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -5491,7 +5507,6 @@ "version": "2.3.6", "bundled": true, "dev": true, - "optional": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", @@ -5506,7 +5521,6 @@ "version": "2.6.2", "bundled": true, "dev": true, - "optional": true, "requires": { "glob": "7.1.2" } @@ -5519,32 +5533,27 @@ "safer-buffer": { "version": "2.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "sax": { "version": "1.2.4", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "semver": { "version": "5.5.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "set-blocking": { "version": "2.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "signal-exit": { "version": "3.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "string-width": { "version": "1.0.2", @@ -5560,7 +5569,6 @@ "version": "1.1.1", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "5.1.1" } @@ -5576,14 +5584,12 @@ "strip-json-comments": { "version": "2.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "tar": { "version": "4.4.1", "bundled": true, "dev": true, - "optional": true, "requires": { "chownr": "1.0.1", "fs-minipass": "1.2.5", @@ -5597,14 +5603,12 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "wide-align": { "version": "1.1.2", "bundled": true, "dev": true, - "optional": true, "requires": { "string-width": "1.0.2" } @@ -5629,47 +5633,7 @@ "graceful-fs": "4.1.11", "inherits": "2.0.3", "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", - "dev": true, - "optional": true, - "requires": { - "readable-stream": "1.1.14", - "xregexp": "2.0.0" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "optional": true, - "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=", - "dev": true, - "optional": true - } + "rimraf": "2.6.3" } }, "gauge": { @@ -5695,23 +5659,6 @@ "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=", - "dev": true, - "optional": true - }, - "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=", - "dev": true, - "optional": true, - "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", @@ -5728,21 +5675,6 @@ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, - "get-uri": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", - "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==", - "dev": true, - "optional": true, - "requires": { - "data-uri-to-buffer": "1.2.0", - "debug": "2.6.9", - "extend": "3.0.1", - "file-uri-to-path": "1.0.0", - "ftp": "0.3.10", - "readable-stream": "2.3.6" - } - }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -5767,7 +5699,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "requires": { "fs.realpath": "1.0.0", "inflight": "1.0.6", @@ -5809,7 +5741,7 @@ "dev": true, "requires": { "array-union": "1.0.2", - "dir-glob": "2.0.0", + "dir-glob": "2.2.1", "glob": "7.1.2", "ignore": "3.3.10", "pify": "3.0.0", @@ -5822,7 +5754,7 @@ "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", "requires": { "glob": "7.1.2", - "lodash": "4.17.10", + "lodash": "4.17.11", "minimatch": "3.0.4" } }, @@ -5840,9 +5772,9 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", "dev": true }, "handlebars": { @@ -5936,6 +5868,7 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, "requires": { "ajv": "5.5.2", "har-schema": "2.0.0" @@ -5945,6 +5878,7 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, "requires": { "co": "4.6.0", "fast-deep-equal": "1.1.0", @@ -6067,9 +6001,9 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "2.0.3", @@ -6082,47 +6016,17 @@ "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=", "dev": true }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hipchat-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz", - "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=", - "dev": true, - "optional": true, - "requires": { - "lodash": "4.17.10", - "request": "2.86.0" - } - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.5", + "hash.js": "1.1.7", "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", @@ -6189,36 +6093,6 @@ "requires-port": "1.0.0" } }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "dev": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", - "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", - "dev": true, - "requires": { - "es6-promisify": "5.0.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, "http-proxy-middleware": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", @@ -6227,7 +6101,7 @@ "requires": { "http-proxy": "1.17.0", "is-glob": "4.0.0", - "lodash": "4.17.10", + "lodash": "4.17.11", "micromatch": "3.1.10" }, "dependencies": { @@ -6523,33 +6397,15 @@ } }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "0.2.0", + "assert-plus": "1.0.0", "jsprim": "1.4.1", "sshpk": "1.14.1" } }, - "httpntlm": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", - "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", - "dev": true, - "requires": { - "httpreq": "0.4.24", - "underscore": "1.7.0" - } - }, - "httpreq": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", - "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", - "dev": true - }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -6563,13 +6419,13 @@ "dev": true, "requires": { "agent-base": "4.2.1", - "debug": "3.2.5" + "debug": "3.2.6" }, "dependencies": { "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "2.1.1" @@ -6584,10 +6440,13 @@ } }, "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==", - "dev": true + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } }, "ieee754": { "version": "1.1.12", @@ -6668,9 +6527,9 @@ } }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { "p-try": "2.0.0" @@ -6682,7 +6541,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.0.0" + "p-limit": "2.1.0" } }, "p-try": { @@ -6727,13 +6586,6 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", - "dev": true, - "optional": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6751,7 +6603,7 @@ "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, "internal-ip": { @@ -6822,7 +6674,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, "is-builtin-module": { @@ -6919,27 +6771,6 @@ "is-extglob": "1.0.0" } }, - "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==", - "dev": true, - "optional": true - }, - "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==", - "dev": true, - "optional": true, - "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" - } - }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", @@ -7019,13 +6850,6 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true, - "optional": true - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", @@ -7060,10 +6884,13 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "1.2.0" + } }, "isexe": { "version": "2.0.0", @@ -7265,7 +7092,7 @@ "babel-types": "6.26.0", "babylon": "6.18.0", "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" + "semver": "5.6.0" } }, "istanbul-lib-report": { @@ -7306,7 +7133,7 @@ "debug": "3.1.0", "istanbul-lib-coverage": "1.2.0", "mkdirp": "0.5.1", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "source-map": "0.5.7" }, "dependencies": { @@ -7348,9 +7175,9 @@ "dev": true }, "jasmine-reporters": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.1.tgz", - "integrity": "sha1-9C1XjplmlhY0MdkRwxZ5cZ+0Ozs=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.3.2.tgz", + "integrity": "sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A==", "dev": true, "requires": { "mkdirp": "0.5.1", @@ -7446,13 +7273,6 @@ "graceful-fs": "4.1.11" } }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true, - "optional": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -7490,6 +7310,12 @@ "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", "dev": true }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", @@ -7513,84 +7339,432 @@ } }, "karma": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.2.tgz", - "integrity": "sha1-TS25QChQpmVR+nhLAWT7CCTtjEs=", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-3.1.4.tgz", + "integrity": "sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw==", "dev": true, "requires": { "bluebird": "3.5.1", - "body-parser": "1.18.2", - "chokidar": "1.7.0", + "body-parser": "1.18.3", + "chokidar": "2.0.4", "colors": "1.1.2", "combine-lists": "1.0.1", "connect": "3.6.6", - "core-js": "2.5.6", + "core-js": "2.6.2", "di": "0.0.1", "dom-serialize": "2.2.1", "expand-braces": "0.1.2", + "flatted": "2.0.0", "glob": "7.1.2", "graceful-fs": "4.1.11", "http-proxy": "1.17.0", - "isbinaryfile": "3.0.2", - "lodash": "4.17.10", - "log4js": "2.6.1", - "mime": "1.6.0", + "isbinaryfile": "3.0.3", + "lodash": "4.17.11", + "log4js": "3.0.6", + "mime": "2.4.0", "minimatch": "3.0.4", "optimist": "0.6.1", "qjobs": "1.2.0", "range-parser": "1.2.0", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "safe-buffer": "5.1.1", - "socket.io": "2.0.4", + "socket.io": "2.1.1", "source-map": "0.6.1", "tmp": "0.0.33", - "useragent": "2.2.1" + "useragent": "2.3.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", "dev": true - } - } - }, - "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", - "dev": true, - "requires": { - "fs-access": "1.0.1", - "which": "1.3.0" - } - }, - "karma-cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", - "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", - "dev": true, - "requires": { - "resolve": "1.5.0" - } - }, - "karma-coverage-istanbul-reporter": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz", - "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=", - "dev": true, - "requires": { - "istanbul-api": "1.3.1", - "minimatch": "3.0.4" - } - }, - "karma-firefox-launcher": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz", - "integrity": "sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA==", - "dev": true - }, - "karma-jasmine": { + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.1.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "mime": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "1.0.1", + "which": "1.3.0" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "1.5.0" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz", + "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=", + "dev": true, + "requires": { + "istanbul-api": "1.3.1", + "minimatch": "3.0.4" + } + }, + "karma-firefox-launcher": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz", + "integrity": "sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA==", + "dev": true + }, + "karma-jasmine": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", @@ -7611,7 +7785,7 @@ "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", "dev": true, "requires": { - "source-map-support": "0.5.9" + "source-map-support": "0.5.10" }, "dependencies": { "source-map": { @@ -7621,9 +7795,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "dev": true, "requires": { "buffer-from": "1.0.0", @@ -7672,9 +7846,9 @@ } }, "less": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz", - "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", "dev": true, "requires": { "clone": "2.1.2", @@ -7718,44 +7892,14 @@ "type-check": "0.3.2" } }, - "libbase64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", - "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", - "dev": true - }, - "libmime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", - "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", - "dev": true, - "requires": { - "iconv-lite": "0.4.15", - "libbase64": "0.1.0", - "libqp": "1.1.0" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", - "dev": true - } - } - }, - "libqp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", - "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", - "dev": true - }, "license-webpack-plugin": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.0.2.tgz", - "integrity": "sha512-GsomZw5VoT20ST8qH2tOjBgbyhn6Pgs9M94g0mbvfBIV1VXufm1iKY+4dbgfTObj1Mp6nSRE3Zf74deOZr0KwA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.0.4.tgz", + "integrity": "sha512-FQgOqrrIcD4C/VQo6ecWgXZULK5rs0kIDJtHcSVO6SBUrD63kEHZwmKOvBTquFQSgMQn/yeH68qooKDfqiBF2Q==", "dev": true, "requires": { - "webpack-sources": "1.2.0" + "@types/webpack-sources": "0.1.5", + "webpack-sources": "1.3.0" } }, "lie": { @@ -7787,9 +7931,9 @@ } }, "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { @@ -7814,9 +7958,9 @@ } }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash.assign": { "version": "4.2.0", @@ -7837,168 +7981,41 @@ "lodash.mergewith": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", - "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==" - }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", - "dev": true - }, - "log4js": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.6.1.tgz", - "integrity": "sha512-BOoWTr8gxJ9XRkQr/f68KUciHR6qnLESgbXuoD7VAhtu/aMq5kD1WD7IFMMaKjCDKLUHsjwT3V2cw34ENiJKig==", - "dev": true, - "requires": { - "amqplib": "0.5.2", - "axios": "0.15.3", - "circular-json": "0.5.4", - "date-format": "1.2.0", - "debug": "3.1.0", - "hipchat-notifier": "1.1.0", - "loggly": "1.1.1", - "mailgun-js": "0.18.0", - "nodemailer": "2.7.2", - "redis": "2.8.0", - "semver": "5.5.0", - "slack-node": "0.2.0", - "streamroller": "0.7.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "loggly": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz", - "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=", - "dev": true, - "optional": true, - "requires": { - "json-stringify-safe": "5.0.1", - "request": "2.75.0", - "timespan": "2.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "optional": true - }, - "caseless": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", - "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", - "dev": true, - "optional": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "optional": true, - "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" - } - }, - "form-data": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", - "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "har-validator": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", - "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true, - "optional": true, - "requires": { - "chalk": "1.1.3", - "commander": "2.12.2", - "is-my-json-valid": "2.17.2", - "pinkie-promise": "2.0.1" - } - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", - "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", - "dev": true, - "optional": true - }, - "request": { - "version": "2.75.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", - "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==" + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "log4js": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", + "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", + "dev": true, + "requires": { + "circular-json": "0.5.9", + "date-format": "1.2.0", + "debug": "3.2.6", + "rfdc": "1.1.2", + "streamroller": "0.7.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, - "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "bl": "1.1.2", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.0.0", - "har-validator": "2.0.6", - "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.17", - "node-uuid": "1.4.8", - "oauth-sign": "0.8.2", - "qs": "6.2.3", - "stringstream": "0.0.6", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.4.3" + "ms": "2.1.1" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "optional": true - }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true, - "optional": true + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, @@ -8041,69 +8058,6 @@ "yallist": "2.1.2" } }, - "mailcomposer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", - "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=", - "dev": true, - "optional": true, - "requires": { - "buildmail": "4.0.1", - "libmime": "3.0.0" - } - }, - "mailgun-js": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.18.0.tgz", - "integrity": "sha512-o0P6jjZlx5CQj12tvVgDTbgjTqVN0+5h6/6P1+3c6xmozVKBwniQ6Qt3MkCSF0+ueVTbobAfWyGpWRZMJu8t1g==", - "dev": true, - "optional": true, - "requires": { - "async": "2.6.0", - "debug": "3.1.0", - "form-data": "2.3.2", - "inflection": "1.12.0", - "is-stream": "1.1.0", - "path-proxy": "1.0.0", - "promisify-call": "2.0.4", - "proxy-agent": "3.0.0", - "tsscmp": "1.0.5" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.17" - } - } - } - }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", @@ -8119,12 +8073,6 @@ "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", "dev": true }, - "mamacro": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", - "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", - "dev": true - }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -8284,8 +8232,9 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", - "dev": true + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true }, "mime-db": { "version": "1.30.0", @@ -8307,14 +8256,14 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz", - "integrity": "sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz", + "integrity": "sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==", "dev": true, "requires": { "loader-utils": "1.1.0", "schema-utils": "1.0.0", - "webpack-sources": "1.2.0" + "webpack-sources": "1.3.0" } }, "minimalistic-assert": { @@ -8332,7 +8281,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { "brace-expansion": "1.1.8" } @@ -8424,7 +8373,7 @@ "copy-concurrently": "1.0.5", "fs-write-stream-atomic": "1.0.10", "mkdirp": "0.5.1", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "run-queue": "1.0.3" } }, @@ -8506,22 +8455,15 @@ "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", "dev": true }, - "netmask": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", - "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", - "dev": true, - "optional": true - }, "ng2-device-detector": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ng2-device-detector/-/ng2-device-detector-1.0.1.tgz", "integrity": "sha512-Xk6peAl8dzBM5OFLK6pTThA0bk4YZ4xgyNRbLUTmc2aeDeH6VYwCx9AA2DGvI4rilGp01GNEzHrA84nY5dpwCQ==" }, "ngx-bootstrap": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/ngx-bootstrap/-/ngx-bootstrap-3.1.2.tgz", - "integrity": "sha512-ULooVAtHBir96PDOz8aDP+slkoY+YX3EWeYV7rwkwMQooc6MaFc+EFBBrAkQf1n0N/rJ4Z9GGccRS5vk/1JFog==" + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/ngx-bootstrap/-/ngx-bootstrap-3.1.4.tgz", + "integrity": "sha512-dHMX6Yv0ahwvjvMFo2wQ2Mbe4vcUTEcao0jmVKenchmaZjDGWsJ2xvRgEDKgAA9bNR0RI5gqQNzICmSf2MC1DA==" }, "nice-try": { "version": "1.0.5", @@ -8548,7 +8490,7 @@ "npmlog": "4.1.2", "osenv": "0.1.5", "request": "2.88.0", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "semver": "5.3.0", "tar": "2.2.1", "which": "1.3.0" @@ -8684,9 +8626,9 @@ } }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", "dev": true, "requires": { "assert": "1.4.1", @@ -8696,7 +8638,7 @@ "constants-browserify": "1.0.0", "crypto-browserify": "3.12.0", "domain-browser": "1.2.0", - "events": "1.1.1", + "events": "3.0.0", "https-browserify": "1.0.0", "os-browserify": "0.3.0", "path-browserify": "0.0.0", @@ -8710,23 +8652,34 @@ "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", "url": "0.11.0", - "util": "0.10.3", + "util": "0.11.1", "vm-browserify": "0.0.4" + }, + "dependencies": { + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } } }, "node-releases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.4.tgz", - "integrity": "sha512-GqRV9GcHw8JCRDaP/JoeNMNzEGzHAknMvIHqMb2VeTOmg1Cf9+ej8bkV12tHfzWHQMCkQ5zUFgwFUkfraynNCw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz", + "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==", "dev": true, "requires": { - "semver": "5.5.0" + "semver": "5.6.0" } }, "node-sass": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.3.tgz", - "integrity": "sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz", + "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==", "requires": { "async-foreach": "0.1.3", "chalk": "1.1.3", @@ -8743,168 +8696,168 @@ "nan": "2.10.0", "node-gyp": "3.8.0", "npmlog": "4.1.2", - "request": "2.87.0", + "request": "2.88.0", "sass-graph": "2.2.4", "stdout-stream": "1.4.1", "true-case-path": "1.0.3" }, "dependencies": { + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "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" + } + }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "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=" + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "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" + "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" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "delayed-stream": "1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "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=" + }, + "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.7.0", + "har-schema": "2.0.0" + } + }, + "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==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "1.37.0" } }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { "aws-sign2": "0.7.0", - "aws4": "1.6.0", + "aws4": "1.8.0", "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", + "combined-stream": "1.0.7", + "extend": "3.0.2", "forever-agent": "0.6.1", "form-data": "2.3.2", - "har-validator": "5.0.3", + "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.17", - "oauth-sign": "0.8.2", + "mime-types": "2.1.21", + "oauth-sign": "0.9.0", "performance-now": "2.1.0", "qs": "6.5.2", - "safe-buffer": "5.1.1", - "tough-cookie": "2.3.3", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "uuid": "3.3.2" } }, + "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==" + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "nodemailer": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", - "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", - "dev": true, - "optional": true, - "requires": { - "libmime": "3.0.0", - "mailcomposer": "4.0.1", - "nodemailer-direct-transport": "3.3.2", - "nodemailer-shared": "1.1.0", - "nodemailer-smtp-pool": "2.8.2", - "nodemailer-smtp-transport": "2.7.2", - "socks": "1.1.9" - }, - "dependencies": { - "socks": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", - "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", - "dev": true, - "optional": true, + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" + "psl": "1.1.29", + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } } - } - } - }, - "nodemailer-direct-transport": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", - "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", - "dev": true, - "optional": true, - "requires": { - "nodemailer-shared": "1.1.0", - "smtp-connection": "2.12.0" - } - }, - "nodemailer-fetch": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", - "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", - "dev": true - }, - "nodemailer-shared": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", - "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", - "dev": true, - "requires": { - "nodemailer-fetch": "1.6.0" - } - }, - "nodemailer-smtp-pool": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", - "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", - "dev": true, - "optional": true, - "requires": { - "nodemailer-shared": "1.1.0", - "nodemailer-wellknown": "0.1.10", - "smtp-connection": "2.12.0" - } - }, - "nodemailer-smtp-transport": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", - "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", - "dev": true, - "optional": true, - "requires": { - "nodemailer-shared": "1.1.0", - "nodemailer-wellknown": "0.1.10", - "smtp-connection": "2.12.0" + }, + "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" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } } }, - "nodemailer-wellknown": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", - "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", - "dev": true - }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -8920,7 +8873,7 @@ "requires": { "hosted-git-info": "2.6.0", "is-builtin-module": "1.0.0", - "semver": "5.5.0", + "semver": "5.6.0", "validate-npm-package-license": "3.0.3" } }, @@ -8947,7 +8900,7 @@ "requires": { "hosted-git-info": "2.6.0", "osenv": "0.1.5", - "semver": "5.5.0", + "semver": "5.6.0", "validate-npm-package-name": "3.0.0" } }, @@ -8966,7 +8919,7 @@ "request": "2.86.0", "retry": "0.10.1", "safe-buffer": "5.1.1", - "semver": "5.5.0", + "semver": "5.6.0", "slide": "1.1.6", "ssri": "5.3.0" } @@ -9011,7 +8964,8 @@ "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true }, "object-assign": { "version": "4.1.1", @@ -9257,68 +9211,6 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, - "pac-proxy-agent": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", - "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", - "dev": true, - "optional": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0", - "get-uri": "2.0.2", - "http-proxy-agent": "2.1.0", - "https-proxy-agent": "2.2.1", - "pac-resolver": "3.0.0", - "raw-body": "2.3.2", - "socks-proxy-agent": "3.0.1" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", - "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", - "dev": true, - "requires": { - "es6-promisify": "5.0.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "dev": true, - "optional": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - } - } - } - }, - "pac-resolver": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", - "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "degenerator": "1.0.4", - "ip": "1.1.5", - "netmask": "1.0.6", - "thunkify": "2.1.2" - } - }, "pako": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", @@ -9337,16 +9229,17 @@ } }, "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", "dev": true, "requires": { "asn1.js": "4.10.1", "browserify-aes": "1.2.0", "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17" + "pbkdf2": "3.0.17", + "safe-buffer": "5.1.1" } }, "parse-glob": { @@ -9462,25 +9355,6 @@ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", "dev": true }, - "path-proxy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz", - "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=", - "dev": true, - "optional": true, - "requires": { - "inflection": "1.3.8" - }, - "dependencies": { - "inflection": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz", - "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=", - "dev": true, - "optional": true - } - } - }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -9568,14 +9442,14 @@ "dev": true }, "postcss": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", - "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.11.tgz", + "integrity": "sha512-9AXb//5UcjeOEof9T+yPw3XTa5SL207ZOIC/lHYP4mbUTEh4M0rDAQekQpVANCZdwQwKhBtFZCk3i3h3h2hdWg==", "dev": true, "requires": { - "chalk": "2.4.1", + "chalk": "2.4.2", "source-map": "0.6.1", - "supports-color": "5.5.0" + "supports-color": "6.1.0" }, "dependencies": { "source-map": { @@ -9592,7 +9466,7 @@ "integrity": "sha512-3KqKRZcaZAvxbY8DVLdd81tG5uKzbUQuiWIvy0o0fzEC42bKacqPYFWbfCQyw6L4LWUaqPz/idvIdbhpgQ32eQ==", "dev": true, "requires": { - "postcss": "7.0.5", + "postcss": "7.0.11", "postcss-value-parser": "3.3.1", "read-cache": "1.0.0", "resolve": "1.5.0" @@ -9615,7 +9489,7 @@ "dev": true, "requires": { "loader-utils": "1.1.0", - "postcss": "7.0.5", + "postcss": "7.0.11", "postcss-load-config": "2.0.0", "schema-utils": "1.0.0" } @@ -9666,27 +9540,16 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, - "promisify-call": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz", - "integrity": "sha1-1IwtRWUszM1SgB3ey9UzptS9X7o=", - "dev": true, - "optional": true, - "requires": { - "with-callback": "1.0.2" - } - }, "protractor": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.1.tgz", - "integrity": "sha512-ORey5ewQMYiXQxcQohsqEiKYOg/r5yJoJbt0tuROmmgajdg/CA3gTOZNIFJncUVMAJIk5YFqBBLUjKVmQO6tfA==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", "dev": true, "requires": { - "@types/node": "6.0.117", "@types/q": "0.0.32", - "@types/selenium-webdriver": "3.0.10", + "@types/selenium-webdriver": "3.0.14", "blocking-proxy": "1.0.1", - "browserstack": "1.5.1", + "browserstack": "1.5.2", "chalk": "1.1.3", "glob": "7.1.2", "jasmine": "2.8.0", @@ -9697,25 +9560,19 @@ "selenium-webdriver": "3.6.0", "source-map-support": "0.4.18", "webdriver-js-extender": "2.1.0", - "webdriver-manager": "12.1.0" + "webdriver-manager": "12.1.1" }, "dependencies": { - "@types/node": { - "version": "6.0.117", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.117.tgz", - "integrity": "sha512-sihk0SnN8PpiS5ihu5xJQ5ddnURNq4P+XPmW+nORlKkHy21CoZO/IVHK/Wq/l3G8fFW06Fkltgnqx229uPlnRg==", - "dev": true - }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", + "fast-deep-equal": "2.0.1", "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "ansi-styles": { @@ -9724,18 +9581,6 @@ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "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=", - "dev": true - }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", @@ -9748,17 +9593,17 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "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" + "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" } }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { "delayed-stream": "1.0.0" @@ -9770,13 +9615,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "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" } }, "extend": { @@ -9785,54 +9630,55 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, "globby": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "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" + "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" } }, "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "5.5.2", + "ajv": "6.7.0", "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=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.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==", + "dev": true }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", "dev": true }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "dev": true, "requires": { - "mime-db": "1.36.0" + "mime-db": "1.37.0" } }, "oauth-sign": { @@ -9847,32 +9693,38 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "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.0", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.20", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "safe-buffer": { @@ -9893,8 +9745,25 @@ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { - "psl": "1.1.29", - "punycode": "1.4.1" + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" } }, "uuid": { @@ -9904,12 +9773,12 @@ "dev": true }, "webdriver-manager": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", - "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.1.tgz", + "integrity": "sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA==", "dev": true, "requires": { - "adm-zip": "0.4.11", + "adm-zip": "0.4.13", "chalk": "1.1.3", "del": "2.2.2", "glob": "7.1.2", @@ -9917,8 +9786,8 @@ "minimist": "1.2.0", "q": "1.4.1", "request": "2.88.0", - "rimraf": "2.6.2", - "semver": "5.5.0", + "rimraf": "2.6.3", + "semver": "5.6.0", "xml2js": "0.4.19" } } @@ -9932,7 +9801,7 @@ "requires": { "fs": "0.0.1-security", "fs-extra": "1.0.0", - "lodash": "4.17.10", + "lodash": "4.17.11", "path": "0.12.7", "xmldoc": "0.5.1" }, @@ -9967,7 +9836,7 @@ "requires": { "async": "2.6.0", "hat": "0.0.3", - "lodash": "4.17.10", + "lodash": "4.17.11", "mkdirp": "0.5.1", "string.prototype.startswith": "0.2.0" } @@ -9982,61 +9851,6 @@ "ipaddr.js": "1.8.0" } }, - "proxy-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.0.tgz", - "integrity": "sha512-g6n6vnk8fRf705ShN+FEXFG/SDJaW++lSs0d9KaJh4uBWW/wi7en4Cpo5VYQW3SZzAE121lhB/KLQrbURoubZw==", - "dev": true, - "optional": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0", - "http-proxy-agent": "2.1.0", - "https-proxy-agent": "2.2.1", - "lru-cache": "4.1.3", - "pac-proxy-agent": "2.0.2", - "proxy-from-env": "1.0.0", - "socks-proxy-agent": "3.0.1" - }, - "dependencies": { - "agent-base": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", - "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", - "dev": true, - "requires": { - "es6-promisify": "5.0.0" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", - "dev": true, - "optional": true, - "requires": { - "agent-base": "4.2.0", - "debug": "3.1.0" - } - } - } - }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", - "dev": true, - "optional": true - }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -10062,7 +9876,7 @@ "bn.js": "4.11.8", "browserify-rsa": "4.0.1", "create-hash": "1.2.0", - "parse-asn1": "5.1.1", + "parse-asn1": "5.1.3", "randombytes": "2.0.6", "safe-buffer": "5.1.2" }, @@ -10186,41 +10000,15 @@ "dev": true }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "dev": true, "requires": { "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "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=", - "dev": true - }, - "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, - "requires": { - "depd": "1.1.1", - "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" - } - }, - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true - } } }, "raw-loader": { @@ -10343,32 +10131,6 @@ "strip-indent": "1.0.1" } }, - "redis": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", - "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", - "dev": true, - "optional": true, - "requires": { - "double-ended-queue": "2.1.0-0", - "redis-commands": "1.3.5", - "redis-parser": "2.6.0" - } - }, - "redis-commands": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", - "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==", - "dev": true, - "optional": true - }, - "redis-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", - "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=", - "dev": true, - "optional": true - }, "reflect-metadata": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", @@ -10384,7 +10146,7 @@ "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, "regex-cache": { @@ -10531,7 +10293,7 @@ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } } } @@ -10592,31 +10354,9 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, - "requires": { - "hoek": "4.2.1" - } - } - } - }, - "requestretry": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.13.0.tgz", - "integrity": "sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg==", - "dev": true, - "optional": true, - "requires": { - "extend": "3.0.1", - "lodash": "4.17.10", - "request": "2.86.0", - "when": "3.7.8" - }, - "dependencies": { - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", - "dev": true, - "optional": true + "requires": { + "hoek": "4.2.1" + } } } }, @@ -10683,6 +10423,12 @@ "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", "dev": true }, + "rfdc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", + "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -10694,11 +10440,26 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "requires": { - "glob": "7.1.2" + "glob": "7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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": { @@ -10721,22 +10482,22 @@ } }, "rxjs": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.1.0.tgz", - "integrity": "sha512-lMZdl6xbHJCSb5lmnb6nOhsoBVCyoDC5LDJQK9WWyq+tsI7KnlDIZ0r0AZAlBpRPLbwQA9kzSBAZwNIZEZ+hcw==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "requires": { "tslib": "1.9.0" } }, "rxjs-compat": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.1.0.tgz", - "integrity": "sha512-x5L1KQy1RqDRpPadN5iDOx71TV9Wqmlmu6OOEn3tFFgaTCB0/N+Lmby/rZHgJ6JEPzzt0nD9Zv+kS53E5JIR5g==" + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs-compat/-/rxjs-compat-6.3.3.tgz", + "integrity": "sha512-caGN7ixiabHpOofginKEquuHk7GgaCrC7UpUQ9ZqGp80tMc68msadOeP/2AKy2R4YJsT1+TX5GZCtxO82qWkyA==" }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" }, "safe-regex": { "version": "1.1.0", @@ -10759,7 +10520,7 @@ "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", "requires": { "glob": "7.1.2", - "lodash": "4.17.10", + "lodash": "4.17.11", "scss-tokenizer": "0.2.3", "yargs": "7.1.0" } @@ -10775,7 +10536,7 @@ "lodash.tail": "4.1.1", "neo-async": "2.6.0", "pify": "3.0.0", - "semver": "5.5.0" + "semver": "5.6.0" } }, "saucelabs": { @@ -10800,7 +10561,7 @@ "dev": true, "requires": { "ajv": "6.4.0", - "ajv-errors": "1.0.0", + "ajv-errors": "1.0.1", "ajv-keywords": "3.2.0" } }, @@ -10841,7 +10602,7 @@ "dev": true, "requires": { "jszip": "3.1.5", - "rimraf": "2.6.2", + "rimraf": "2.6.3", "tmp": "0.0.30", "xml2js": "0.4.19" }, @@ -10867,9 +10628,9 @@ } }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-dsl": { "version": "1.0.1", @@ -10877,7 +10638,7 @@ "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", "dev": true, "requires": { - "semver": "5.5.0" + "semver": "5.6.0" } }, "semver-intersect": { @@ -10886,7 +10647,7 @@ "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", "dev": true, "requires": { - "semver": "5.5.0" + "semver": "5.6.0" } }, "send": { @@ -10919,9 +10680,9 @@ } }, "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", "dev": true }, "serve-index": { @@ -11055,16 +10816,6 @@ "debug": "2.6.9" } }, - "slack-node": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz", - "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=", - "dev": true, - "optional": true, - "requires": { - "requestretry": "1.13.0" - } - }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -11077,22 +10828,6 @@ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, - "smart-buffer": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", - "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", - "dev": true - }, - "smtp-connection": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", - "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", - "dev": true, - "requires": { - "httpntlm": "1.6.1", - "nodemailer-shared": "1.1.0" - } - }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -11201,27 +10936,29 @@ "kind-of": "3.2.2" } }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, "socket.io": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", - "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", "dev": true, "requires": { - "debug": "2.6.9", - "engine.io": "3.1.5", + "debug": "3.1.0", + "engine.io": "3.2.1", + "has-binary2": "1.0.3", "socket.io-adapter": "1.1.1", - "socket.io-client": "2.0.4", - "socket.io-parser": "3.1.3" + "socket.io-client": "2.1.1", + "socket.io-parser": "3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "socket.io-adapter": { @@ -11231,35 +10968,46 @@ "dev": true }, "socket.io-client": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", - "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", "dev": true, "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "2.6.9", - "engine.io-client": "3.1.6", + "debug": "3.1.0", + "engine.io-client": "3.2.1", + "has-binary2": "1.0.3", "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "socket.io-parser": "3.1.3", + "socket.io-parser": "3.2.0", "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } } }, "socket.io-parser": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", - "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", "dev": true, "requires": { "component-emitter": "1.2.1", "debug": "3.1.0", - "has-binary2": "1.0.3", "isarray": "2.0.1" }, "dependencies": { @@ -11302,46 +11050,30 @@ } }, "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", "requires": { - "debug": "2.6.9", - "eventsource": "0.1.6", + "debug": "3.2.6", + "eventsource": "1.0.7", "faye-websocket": "0.11.1", "inherits": "2.0.3", "json3": "3.3.2", "url-parse": "1.4.3" - } - }, - "socks": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", - "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", - "dev": true, - "requires": { - "ip": "1.1.5", - "smart-buffer": "1.1.15" - } - }, - "socks-proxy-agent": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", - "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", - "dev": true, - "requires": { - "agent-base": "4.2.0", - "socks": "1.1.10" }, "dependencies": { - "agent-base": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", - "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", - "dev": true, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "es6-promisify": "5.0.0" + "ms": "2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -11383,7 +11115,7 @@ "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==", + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", "dev": true, "requires": { "source-map": "0.5.7" @@ -11424,41 +11156,84 @@ "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", "dev": true, "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", + "debug": "4.1.1", + "handle-thing": "2.0.0", "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", "select-hose": "2.0.0", - "spdy-transport": "2.1.1" + "spdy-transport": "3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "spdy-transport": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz", - "integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { - "debug": "2.6.9", + "debug": "4.1.1", "detect-node": "2.0.4", "hpack.js": "2.1.6", "obuf": "1.1.2", - "readable-stream": "2.3.6", - "safe-buffer": "5.1.1", + "readable-stream": "3.1.1", "wbuf": "1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "readable-stream": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + } } }, "speed-measure-webpack-plugin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.3.tgz", - "integrity": "sha512-p+taQ69VkRUXYMoZOx2nxV/Tz8tt79ahctoZJyJDHWP7fEYvwFNf5Pd73k5kZ6auu0pTsPNLEUwWpM8mCk85Zw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.5.tgz", + "integrity": "sha512-S/guYjC4Izn5wY2d0+M4zowED/F77Lxh9yjkTZ+XAr244pr9c1MYNcXcRe9lx2hmAj0GPbOrBXgOF2YIp/CZ8A==", "dev": true, "requires": { - "chalk": "2.4.1" + "chalk": "2.4.2" } }, "split-string": { @@ -11534,7 +11309,7 @@ "integrity": "sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ==", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "4.17.11" } }, "statuses": { @@ -11605,19 +11380,25 @@ "dev": true, "requires": { "date-format": "1.2.0", - "debug": "3.1.0", + "debug": "3.2.6", "mkdirp": "0.5.1", "readable-stream": "2.3.6" }, "dependencies": { "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, @@ -11645,13 +11426,6 @@ "safe-buffer": "5.1.1" } }, - "stringstream": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", - "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", - "dev": true, - "optional": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -11689,25 +11463,13 @@ "dev": true }, "style-loader": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.0.tgz", - "integrity": "sha512-uCcN7XWHkqwGVt7skpInW6IGO1tG6ReyFQ1Cseh0VcN6VdcFQi62aG/2F3Y9ueA8x4IVlfaSUxpmQXQD9QrEuQ==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", "dev": true, "requires": { "loader-utils": "1.1.0", - "schema-utils": "0.4.7" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "6.4.0", - "ajv-keywords": "3.2.0" - } - } + "schema-utils": "1.0.0" } }, "stylus": { @@ -11767,9 +11529,9 @@ } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { "has-flag": "3.0.0" @@ -11782,9 +11544,9 @@ "dev": true }, "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", "dev": true }, "tar": { @@ -11798,14 +11560,14 @@ } }, "terser": { - "version": "3.10.12", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.10.12.tgz", - "integrity": "sha512-3ODPC1eVt25EVNb04s/PkHxOmzKBQUF6bwwuR6h2DbEF8/j265Y1UkwNtOk9am/pRxfJ5HPapOlUlO6c16mKQQ==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.1.tgz", + "integrity": "sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==", "dev": true, "requires": { "commander": "2.17.1", "source-map": "0.6.1", - "source-map-support": "0.5.9" + "source-map-support": "0.5.10" }, "dependencies": { "commander": { @@ -11821,9 +11583,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "dev": true, "requires": { "buffer-from": "1.0.0", @@ -11833,41 +11595,47 @@ } }, "terser-webpack-plugin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz", - "integrity": "sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", "dev": true, "requires": { - "cacache": "11.3.1", + "cacache": "11.3.2", "find-cache-dir": "2.0.0", "schema-utils": "1.0.0", - "serialize-javascript": "1.5.0", + "serialize-javascript": "1.6.1", "source-map": "0.6.1", - "terser": "3.10.12", - "webpack-sources": "1.2.0", + "terser": "3.14.1", + "webpack-sources": "1.3.0", "worker-farm": "1.6.0" }, "dependencies": { + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, "cacache": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.1.tgz", - "integrity": "sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "chownr": "1.1.1", - "figgy-pudding": "3.5.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.3", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "6.0.1", - "unique-filename": "1.1.1", - "y18n": "4.0.0" + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, "find-cache-dir": { @@ -11876,9 +11644,9 @@ "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "3.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" } }, "find-up": { @@ -11887,17 +11655,46 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "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" } }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" } }, "mississippi": { @@ -11906,25 +11703,25 @@ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.6.1", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "3.0.0", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { - "p-try": "2.0.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -11933,7 +11730,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.0.0" + "p-limit": "^2.0.0" } }, "p-try": { @@ -11948,7 +11745,7 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "3.0.0" + "find-up": "^3.0.0" } }, "pump": { @@ -11957,8 +11754,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "source-map": { @@ -11973,8 +11770,14 @@ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "figgy-pudding": "3.5.1" + "figgy-pudding": "^3.5.1" } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true } } }, @@ -11994,13 +11797,6 @@ "xtend": "4.0.1" } }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", - "dev": true, - "optional": true - }, "thunky": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", @@ -12016,17 +11812,10 @@ "setimmediate": "1.0.5" } }, - "timespan": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", - "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=", - "dev": true, - "optional": true - }, "tiny-emitter": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", - "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" + "integrity": "sha1-gtJ0aKylrejl/R5tIrV91D69+3w=" }, "tmp": { "version": "0.0.33", @@ -12101,6 +11890,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, "requires": { "punycode": "1.4.1" } @@ -12270,7 +12060,7 @@ "js-yaml": "3.7.0", "minimatch": "3.0.4", "resolve": "1.5.0", - "semver": "5.5.0", + "semver": "5.6.0", "tslib": "1.9.0", "tsutils": "2.22.2" }, @@ -12312,13 +12102,6 @@ } } }, - "tsscmp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", - "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=", - "dev": true, - "optional": true - }, "tsutils": { "version": "2.22.2", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", @@ -12405,30 +12188,6 @@ "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", "dev": true }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "uglify-to-browserify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", @@ -12436,52 +12195,12 @@ "dev": true, "optional": true }, - "uglifyjs-webpack-plugin": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", - "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", - "dev": true, - "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.7", - "serialize-javascript": "1.5.0", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.2.0", - "worker-farm": "1.6.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "6.4.0", - "ajv-keywords": "3.2.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true - }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -12640,12 +12359,6 @@ } } }, - "url-join": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", - "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", - "dev": true - }, "url-parse": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", @@ -12673,21 +12386,13 @@ } }, "useragent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", - "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", "dev": true, "requires": { - "lru-cache": "2.2.4", + "lru-cache": "4.1.3", "tmp": "0.0.33" - }, - "dependencies": { - "lru-cache": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", - "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", - "dev": true - } } }, "util": { @@ -12721,14 +12426,8 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - }, - "uws": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", - "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==", - "dev": true, - "optional": true + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", + "dev": true }, "v8flags": { "version": "3.0.2", @@ -13164,20 +12863,20 @@ "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", "dev": true, "requires": { - "@types/selenium-webdriver": "3.0.10", + "@types/selenium-webdriver": "3.0.14", "selenium-webdriver": "3.6.0" } }, "webpack": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.19.1.tgz", - "integrity": "sha512-j7Q/5QqZRqIFXJvC0E59ipLV5Hf6lAnS3ezC3I4HMUybwEDikQBVad5d+IpPtmaQPQArvgUZLXIN6lWijHBn4g==", + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", + "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.6", - "@webassemblyjs/helper-module-context": "1.7.6", - "@webassemblyjs/wasm-edit": "1.7.6", - "@webassemblyjs/wasm-parser": "1.7.6", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", "acorn": "5.7.3", "acorn-dynamic-import": "3.0.0", "ajv": "6.4.0", @@ -13186,18 +12885,18 @@ "enhanced-resolve": "4.1.0", "eslint-scope": "4.0.0", "json-parse-better-errors": "1.0.2", - "loader-runner": "2.3.1", + "loader-runner": "2.4.0", "loader-utils": "1.1.0", "memory-fs": "0.4.1", "micromatch": "3.1.10", "mkdirp": "0.5.1", "neo-async": "2.6.0", - "node-libs-browser": "2.1.0", + "node-libs-browser": "2.2.0", "schema-utils": "0.4.7", - "tapable": "1.1.0", - "uglifyjs-webpack-plugin": "1.3.0", + "tapable": "1.1.1", + "terser-webpack-plugin": "1.2.1", "watchpack": "1.6.0", - "webpack-sources": "1.2.0" + "webpack-sources": "1.3.0" }, "dependencies": { "arr-diff": { @@ -13218,16 +12917,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -13236,7 +12935,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -13247,13 +12946,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -13262,7 +12961,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -13271,7 +12970,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -13280,7 +12979,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -13289,7 +12988,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -13300,7 +12999,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -13309,7 +13008,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -13320,9 +13019,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -13339,14 +13038,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -13355,7 +13054,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -13364,7 +13063,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -13375,10 +13074,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -13387,7 +13086,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -13398,7 +13097,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -13407,7 +13106,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -13416,9 +13115,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-number": { @@ -13427,7 +13126,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -13436,7 +13135,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -13459,19 +13158,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "schema-utils": { @@ -13480,8 +13179,8 @@ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "ajv": "6.4.0", - "ajv-keywords": "3.2.0" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } } } @@ -13514,38 +13213,36 @@ } }, "webpack-dev-middleware": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.3.0.tgz", - "integrity": "sha512-5C5gXtOo1I6+0AEg4UPglYEtu3Rai6l5IiO6aUu65scHXz29dc3oIWMiRwvcNLXgL0HwRkRxa9N02ZjFt4hY8w==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", + "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", "dev": true, "requires": { - "loud-rejection": "1.6.0", "memory-fs": "0.4.1", - "mime": "2.3.1", + "mime": "2.4.0", "range-parser": "1.2.0", - "url-join": "4.0.0", "webpack-log": "2.0.0" }, "dependencies": { "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true } } }, "webpack-dev-server": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.8.tgz", - "integrity": "sha512-c+tcJtDqnPdxCAzEEZKdIPmg3i5i7cAHe+B+0xFNK0BlCc2HF/unYccbU7xTgfGc5xxhCztCQzFmsqim+KhI+A==", + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz", + "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==", "dev": true, "requires": { "ansi-html": "0.0.7", "bonjour": "3.5.0", "chokidar": "2.0.4", "compression": "1.7.3", - "connect-history-api-fallback": "1.5.0", + "connect-history-api-fallback": "1.6.0", "debug": "3.2.6", "del": "3.0.0", "express": "4.16.4", @@ -13560,13 +13257,15 @@ "portfinder": "1.0.17", "schema-utils": "1.0.0", "selfsigned": "1.10.4", + "semver": "5.6.0", "serve-index": "1.9.1", "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "3.4.7", + "sockjs-client": "1.3.0", + "spdy": "4.0.0", "strip-ansi": "3.0.1", "supports-color": "5.5.0", - "webpack-dev-middleware": "3.2.0", + "url": "0.11.0", + "webpack-dev-middleware": "3.4.0", "webpack-log": "2.0.0", "yargs": "12.0.2" }, @@ -13583,8 +13282,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "arr-diff": { @@ -13605,16 +13304,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -13623,7 +13322,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -13634,19 +13333,19 @@ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" } }, "cliui": { @@ -13655,9 +13354,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { "strip-ansi": { @@ -13666,18 +13365,31 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" }, "dependencies": { "ms": { @@ -13697,19 +13409,43 @@ "xregexp": "4.0.0" } }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "1.0.2" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "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" + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "debug": { @@ -13727,7 +13463,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -13736,7 +13472,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -13745,7 +13481,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -13754,7 +13490,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -13765,7 +13501,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -13774,7 +13510,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -13785,9 +13521,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -13804,14 +13540,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -13820,7 +13556,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -13829,7 +13565,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -13840,10 +13576,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -13852,7 +13588,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -13863,7 +13599,16 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" } }, "glob-parent": { @@ -13872,8 +13617,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -13882,7 +13627,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -13899,7 +13644,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -13908,7 +13653,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -13917,9 +13662,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "is-extglob": { @@ -13940,7 +13685,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -13949,7 +13694,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -13958,7 +13703,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -13981,7 +13726,7 @@ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "2.0.0" + "invert-kv": "^2.0.0" } }, "locate-path": { @@ -13990,8 +13735,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "micromatch": { @@ -14000,45 +13745,39 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, - "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", - "dev": true - }, "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", + "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==", "dev": true, "requires": { - "execa": "0.10.0", - "lcid": "2.0.0", - "mem": "4.0.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { - "p-try": "2.0.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -14047,7 +13786,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.0.0" + "p-limit": "^2.0.0" } }, "p-try": { @@ -14056,14 +13795,44 @@ "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", "dev": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "sockjs-client": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", + "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", + "dev": true, + "requires": { + "debug": "3.2.6", + "eventsource": "1.0.7", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.4.3" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "strip-ansi": { @@ -14072,24 +13841,18 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } }, - "webpack-dev-middleware": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.2.0.tgz", - "integrity": "sha512-YJLMF/96TpKXaEQwaLEo+Z4NDK8aV133ROF6xp9pe3gQoS7sxfpXh4Rv9eC+8vCvWfmDjRQaMSlRPbO+9G6jgA==", + "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": { - "loud-rejection": "1.6.0", - "memory-fs": "0.4.1", - "mime": "2.3.1", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "url-join": "4.0.0", - "webpack-log": "2.0.0" + "has-flag": "3.0.0" } }, "which-module": { @@ -14110,18 +13873,18 @@ "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "2.0.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.2", - "os-locale": "3.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "10.1.0" + "cliui": "^4.0.0", + "decamelize": "^2.0.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": "^10.1.0" } }, "yargs-parser": { @@ -14130,7 +13893,7 @@ "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -14141,7 +13904,7 @@ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "dev": true, "requires": { - "ansi-colors": "3.2.1", + "ansi-colors": "3.2.3", "uuid": "3.3.2" }, "dependencies": { @@ -14159,13 +13922,13 @@ "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", "dev": true, "requires": { - "lodash": "4.17.10" + "lodash": "4.17.11" } }, "webpack-sources": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", - "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "dev": true, "requires": { "source-list-map": "2.0.1", @@ -14224,7 +13987,7 @@ "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", "requires": { "isexe": "2.0.0" } @@ -14249,13 +14012,6 @@ "dev": true, "optional": true }, - "with-callback": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz", - "integrity": "sha1-oJYpuakgAo1yFAT7Q1vc/1yRvCE=", - "dev": true, - "optional": true - }, "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", @@ -14341,13 +14097,6 @@ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "dev": true }, - "xregexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", - "dev": true, - "optional": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -14433,9 +14182,9 @@ "dev": true }, "zone.js": { - "version": "0.8.26", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", - "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==" + "version": "0.8.28", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.28.tgz", + "integrity": "sha512-MjwlvV0wr65IQiT0WSHedo/zUhAqtypMdTUjqroV81RohGj1XANwHuC37dwYxphTRbZBYidk0gNS0dQrU2Q3Pw==" } } } diff --git a/marklogic-data-hub/src/trace-ui/package.json b/marklogic-data-hub/src/trace-ui/package.json index 41a65baf67..ae8f26f905 100644 --- a/marklogic-data-hub/src/trace-ui/package.json +++ b/marklogic-data-hub/src/trace-ui/package.json @@ -30,50 +30,50 @@ "@types/codemirror": "0.0.55", "classlist.js": "^1.1.20150312", "clipboard": "^1.7.1", - "codemirror": "^5.37.0", - "core-js": "^2.5.6", - "date-fns": "^1.29.0", + "codemirror": "^5.42.2", + "core-js": "^2.6.2", + "date-fns": "^1.30.1", "font-awesome": "^4.7.0", - "lodash": "^4.17.10", + "lodash": "^4.17.11", "material-design-icons-iconfont": "^3.0.3", "material-design-lite": "^1.3.0", "mdi": "2.0.46", "ng2-device-detector": "^1.0.1", - "ngx-bootstrap": "^3.0.1", - "node-sass": "^4.9.3", - "rxjs": "^6.1.0", - "rxjs-compat": "^6.1.0", - "semver": "^5.5.0", - "sockjs-client": "^1.1.5", + "ngx-bootstrap": "^3.1.4", + "node-sass": "^4.11.0", + "rxjs": "^6.3.3", + "rxjs-compat": "^6.3.3", + "semver": "^5.6.0", + "sockjs-client": "^1.3.0", "stompjs": "^2.3.3", - "zone.js": "^0.8.26" + "zone.js": "^0.8.28" }, "devDependencies": { - "@angular-devkit/build-angular": "^0.10.6", + "@angular-devkit/build-angular": "^0.12.2", "@angular/cli": "6.0.3", "@angular/compiler-cli": "6.0.2", "@angular/language-service": "6.0.2", - "@types/jasmine": "^2.8.7", - "@types/jasminewd2": "~2.0.2", - "@types/lodash": "^4.14.108", + "@types/jasmine": "^2.8.15", + "@types/jasminewd2": "^2.0.6", + "@types/lodash": "^4.14.120", "@types/node": "~9.4.7", "@types/semver": "^5.5.0", - "codelyzer": "^4.3.0", + "codelyzer": "^4.5.0", "fs-extra": "^4.0.2", "jasmine-core": "~2.8.0", - "jasmine-reporters": "^2.3.1", + "jasmine-reporters": "^2.3.2", "jasmine-spec-reporter": "~4.2.1", - "karma": "^2.0.2", + "karma": "^3.1.4", "karma-chrome-launcher": "~2.2.0", "karma-cli": "~1.0.1", "karma-coverage-istanbul-reporter": "^1.4.3", "karma-firefox-launcher": "^1.0.1", "karma-jasmine": "^1.1.2", "karma-jasmine-html-reporter": "^0.2.2", - "protractor": "^5.4.1", + "protractor": "^5.4.2", "protractor-html-reporter": "^1.3.2", "protractor-jasmine2-html-reporter": "0.0.7", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "tmp": "0.0.33", "ts-node": "~4.1.0", "tslint": "~5.9.1", diff --git a/ml-data-hub-plugin/build.gradle b/ml-data-hub-plugin/build.gradle index ae1c359c95..4b071f6bea 100644 --- a/ml-data-hub-plugin/build.gradle +++ b/ml-data-hub-plugin/build.gradle @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,7 +56,7 @@ dependencies { compile (project(':marklogic-data-hub')) { exclude group: 'ch.qos.logback' } - compile ('com.marklogic:ml-gradle:3.10.2') { + compile ('com.marklogic:ml-gradle:3.11.0') { exclude group: 'ch.qos.logback' } testCompile localGroovy() diff --git a/ml-data-hub-plugin/gradle-dhs.properties b/ml-data-hub-plugin/gradle-dhs.properties new file mode 100644 index 0000000000..8edb73e6bd --- /dev/null +++ b/ml-data-hub-plugin/gradle-dhs.properties @@ -0,0 +1,45 @@ +mlDHFVersion=5.0-SNAPSHOT +mlHost= + +mlIsHostLoadBalancer=true + +mlUsername=flowdev +mlPassword=SomePass#123 +mlManageUsername=flowdev +mlManagePassword=SomePass#123 +mlSecurityUsername=flowdev +mlSecurityPassword=SomePass#123 + +mlHubUserRole=flowOperator +mlHubUserName=flowop +mlHubUserPassword=SomePass#123 + +mlStagingAppserverName=data-hub-STAGING +mlStagingPort=8006 +mlStagingDbName=data-hub-STAGING +mlStagingForestsPerHost=1 + +mlFinalAppserverName=data-hub-ADMIN +mlFinalPort=8004 +mlFinalDbName=data-hub-FINAL +mlFinalForestsPerHost=1 + +mlJobAppserverName=data-hub-JOBS +mlJobPort=8007 +mlJobDbName=data-hub-JOBS +mlJobForestsPerHost=1 + +mlModulesDbName=data-hub-MODULES +mlStagingTriggersDbName=data-hub-staging-TRIGGERS +mlStagingSchemasDbName=data-hub-staging-SCHEMAS + +mlFinalTriggersDbName=data-hub-final-TRIGGERS +mlFinalSchemasDbName=data-hub-final-SCHEMAS + +mlModulePermissions=flowDeveloper,read,flowDeveloper,execute,flowDeveloper,insert,flowOperator,read,flowOperator,execute,flowOperator,insert,rest-reader,read,rest-writer,insert,rest-writer,update,rest-extension-user,execute + +mlHubAdminRole=flowDeveloper +mlHubAdminUserName=flowdev +mlHubAdminUserPassword=SomePass#123 + +mlIsProvisionedEnvironment=true diff --git a/ml-data-hub-plugin/gradle.properties b/ml-data-hub-plugin/gradle.properties index c6c517d5d6..88cd65f42f 100644 --- a/ml-data-hub-plugin/gradle.properties +++ b/ml-data-hub-plugin/gradle.properties @@ -1,5 +1,5 @@ # -# Copyright 2012-2018 MarkLogic Corporation +# Copyright 2012-2019 MarkLogic Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -12,7 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -mlDHFVersion=4.0-SNAPSHOT +mlDHFVersion=5.0-SNAPSHOT mlHost=localhost mlAppName=data-hub diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/DataHubPlugin.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/DataHubPlugin.groovy index c6c155b372..0e6f6584d4 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/DataHubPlugin.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/DataHubPlugin.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,15 +17,16 @@ package com.marklogic.gradle - import com.marklogic.appdeployer.command.Command import com.marklogic.appdeployer.impl.SimpleAppDeployer import com.marklogic.gradle.task.* import com.marklogic.hub.ApplicationConfig import com.marklogic.hub.deploy.commands.GeneratePiiCommand import com.marklogic.hub.deploy.commands.LoadHubModulesCommand +import com.marklogic.hub.deploy.commands.LoadUserArtifactsCommand import com.marklogic.hub.deploy.commands.LoadUserModulesCommand import com.marklogic.hub.impl.* +import com.marklogic.hub.legacy.impl.LegacyFlowManagerImpl import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project @@ -43,8 +44,11 @@ class DataHubPlugin implements Plugin { private HubConfigImpl hubConfig private LoadHubModulesCommand loadHubModulesCommand private LoadUserModulesCommand loadUserModulesCommand + private LoadUserArtifactsCommand loadUserArtifactsCommand private MappingManagerImpl mappingManager + private ProcessManagerImpl processManager private FlowManagerImpl flowManager + private LegacyFlowManagerImpl legacyFlowManager private EntityManagerImpl entityManager private GeneratePiiCommand generatePiiCommand @@ -81,16 +85,15 @@ class DataHubPlugin implements Plugin { description: "Ascertains whether a MarkLogic server can accept installation of the DHF. Requires administrative privileges to the server.") project.task("hubInfo", group: deployGroup, type: HubInfoTask) project.task("hubUpdate", group: deployGroup, type: UpdateHubTask) - // Tasks for deploying/undeploying the amps included in the DHF jar - project.task("hubDeployAmps", group: deployGroup, type: DeployHubAmpsTask, description: "Deploy the hub-specific amps contained in DHF") - project.task("hubUndeployAmps", group: deployGroup, type: UndeployHubAmpsTask, description: "Undeploy the hub-specific amps container in DHF; currently only supported for MarkLogic version 9.0-5") String scaffoldGroup = "MarkLogic Data Hub Scaffolding" project.task("hubInit", group: scaffoldGroup, type: InitProjectTask) project.task("hubCreateMapping", group: scaffoldGroup, type: CreateMappingTask) + project.task("hubCreateProcess", group: scaffoldGroup, type: CreateProcessTask) project.task("hubCreateEntity", group: scaffoldGroup, type: CreateEntityTask) - project.task("hubCreateHarmonizeFlow", group: scaffoldGroup, type: CreateHarmonizeFlowTask) - project.task("hubCreateInputFlow", group: scaffoldGroup, type: CreateInputFlowTask) + project.task("hubCreateFlow", group: scaffoldGroup, type: CreateFlowTask) + project.task("hubCreateHarmonizeFlow", group: scaffoldGroup, type: CreateHarmonizeLegacyFlowTask) + project.task("hubCreateInputFlow", group: scaffoldGroup, type: CreateInputLegacyFlowTask) project.task("hubGeneratePii", group: scaffoldGroup, type: GeneratePiiTask, description: "Generates Security Configuration for all Entity Properties marked 'pii'") project.task("hubGenerateTDETemplates", group: scaffoldGroup, type: GenerateTDETemplateFromEntityTask, @@ -116,7 +119,12 @@ class DataHubPlugin implements Plugin { .mustRunAfter(["mlClearModulesDatabase"]) // This isn't likely to be used, but it's being kept for regression purposes for now - project.task("hubDeployUserModules", group: deployGroup, type: DeployUserModulesTask, description: "Installs user modules from the plugins and src/main/entity-config directories.") + project.task("hubDeployUserModules", group: deployGroup, type: DeployUserModulesTask, + description: "Installs user modules from the plugins and src/main/entity-config directories.") + .finalizedBy(["hubDeployUserArtifacts"]) + + project.task("hubDeployUserArtifacts", group: deployGroup, type: DeployUserArtifactsTask, + description: "Installs user artifacts such as entities and mappings.") // HubWatchTask extends ml-gradle's WatchTask to ensure that modules are loaded from the hub-specific locations. project.tasks.replace("mlWatch", HubWatchTask) @@ -133,7 +141,7 @@ class DataHubPlugin implements Plugin { project.tasks.hubPreInstallCheck.getDependsOn().add("hubDeploySecurity") project.tasks.mlDeploy.getDependsOn().add("hubPreInstallCheck") - String flowGroup = "MarkLogic Data Hub Flow Management" + String flowGroup = "MarkLogic Data Hub LegacyFlow Management" project.task("hubRunFlow", group: flowGroup, type: RunFlowTask) project.task("hubDeleteJobs", group: flowGroup, type: DeleteJobsTask) project.task("hubExportJobs", group: flowGroup, type: ExportJobsTask) @@ -154,8 +162,11 @@ class DataHubPlugin implements Plugin { scaffolding = ctx.getBean(ScaffoldingImpl.class) loadHubModulesCommand = ctx.getBean(LoadHubModulesCommand.class) loadUserModulesCommand = ctx.getBean(LoadUserModulesCommand.class) + loadUserArtifactsCommand = ctx.getBean(LoadUserArtifactsCommand.class) mappingManager = ctx.getBean(MappingManagerImpl.class) + processManager = ctx.getBean(ProcessManagerImpl.class) flowManager = ctx.getBean(FlowManagerImpl.class) + legacyFlowManager = ctx.getBean(LegacyFlowManagerImpl.class) entityManager = ctx.getBean(EntityManagerImpl.class) generatePiiCommand = ctx.getBean(GeneratePiiCommand.class) @@ -189,6 +200,10 @@ class DataHubPlugin implements Plugin { hubConfig.refreshProject(new ProjectPropertySource(project).getProperties(), false) } + // By default, DHF uses gradle-local.properties for your local environment. + def envNameProp = project.hasProperty("environmentName") ? project.property("environmentName") : "local" + hubConfig.withPropertiesFromEnvironment(envNameProp.toString()) + hubConfig.setAppConfig(extensions.getByName("mlAppConfig")) hubConfig.setAdminConfig(extensions.getByName("mlAdminConfig")) hubConfig.setAdminManager(extensions.getByName("mlAdminManager")) @@ -201,8 +216,11 @@ class DataHubPlugin implements Plugin { project.extensions.add("scaffolding", scaffolding) project.extensions.add("loadHubModulesCommand", loadHubModulesCommand) project.extensions.add("loadUserModulesCommand", loadUserModulesCommand) + project.extensions.add("loadUserArtifactsCommand", loadUserArtifactsCommand) project.extensions.add("mappingManager", mappingManager) + project.extensions.add("processManager", processManager) project.extensions.add("flowManager", flowManager) + project.extensions.add("legacyFlowManager", legacyFlowManager) project.extensions.add("entityManager", entityManager) project.extensions.add("generatePiiCommand", generatePiiCommand) diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/EntityNameRequiredException.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/EntityNameRequiredException.groovy index 55451cf7f9..596a991bb4 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/EntityNameRequiredException.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/EntityNameRequiredException.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowAlreadyPresentException.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowAlreadyPresentException.groovy new file mode 100644 index 0000000000..a324c3b164 --- /dev/null +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowAlreadyPresentException.groovy @@ -0,0 +1,9 @@ +package com.marklogic.gradle.exception + +import org.gradle.api.GradleException + +class FlowAlreadyPresentException extends GradleException { + FlowAlreadyPresentException() { + super("Flow not created. Flow with the same name is already present.") + } +} diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowNameRequiredException.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowNameRequiredException.groovy index ff936528aa..e476752102 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowNameRequiredException.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowNameRequiredException.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowNotFoundException.java b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowNotFoundException.java index 81c5a52e49..79feb17664 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowNotFoundException.java +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/FlowNotFoundException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/HubNotInstalledException.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/HubNotInstalledException.groovy index 06f0e61c86..25f832c7b8 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/HubNotInstalledException.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/HubNotInstalledException.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/JobIdsRequiredException.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/JobIdsRequiredException.groovy index a45d092cfe..73f86f8cce 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/JobIdsRequiredException.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/JobIdsRequiredException.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/MappingNameRequiredException.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/MappingNameRequiredException.groovy index 0243311984..732d406914 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/MappingNameRequiredException.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/MappingNameRequiredException.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/ProcessAlreadyPresentException.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/ProcessAlreadyPresentException.groovy new file mode 100644 index 0000000000..b0d1e3f006 --- /dev/null +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/ProcessAlreadyPresentException.groovy @@ -0,0 +1,26 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.marklogic.gradle.exception + +import org.gradle.api.GradleException + +class ProcessAlreadyPresentException extends GradleException { + ProcessAlreadyPresentException() { + super("Process not created. Process having the same name and type is already present.") + } +} diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/ProcessNameRequiredException.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/ProcessNameRequiredException.groovy new file mode 100644 index 0000000000..26d37ae3c8 --- /dev/null +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/exception/ProcessNameRequiredException.groovy @@ -0,0 +1,26 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.marklogic.gradle.exception + +import org.gradle.api.GradleException + +class ProcessNameRequiredException extends GradleException { + ProcessNameRequiredException() { + super("processName property is required. Supply the parameter with -PprocessName=YourProcess") + } +} diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateEntityTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateEntityTask.groovy index 9e52112db6..9f3060d147 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateEntityTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateEntityTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateFlowTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateFlowTask.groovy index d189cda8e6..47ecb2d503 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateFlowTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateFlowTask.groovy @@ -1,79 +1,27 @@ -/* - * Copyright 2012-2018 MarkLogic Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - package com.marklogic.gradle.task -import com.marklogic.gradle.exception.EntityNameRequiredException +import com.marklogic.gradle.exception.FlowAlreadyPresentException import com.marklogic.gradle.exception.FlowNameRequiredException -import com.marklogic.hub.flow.CodeFormat -import com.marklogic.hub.flow.DataFormat -import com.marklogic.hub.flow.FlowType -import com.marklogic.hub.scaffold.Scaffolding -import org.gradle.api.tasks.Input - -abstract class CreateFlowTask extends HubTask { - - @Input - public Boolean useES +import com.marklogic.hub.FlowManager +import com.marklogic.hub.flow.Flow +import org.gradle.api.tasks.TaskAction +class CreateFlowTask extends HubTask { - void createFlow(FlowType flowType) { - def entityName = project.hasProperty("entityName") ? project.property("entityName") : null - if (entityName == null) { - throw new EntityNameRequiredException() - } - def flowName = project.hasProperty("flowName") ? project.property("flowName") : null + @TaskAction + void createFlow() { + def propName = "flowName" + def flowName = project.hasProperty(propName) ? project.property(propName) : null if (flowName == null) { throw new FlowNameRequiredException() } - def pluginFormat = project.hasProperty("pluginFormat") ? - CodeFormat.getCodeFormat(project.property("pluginFormat")) : CodeFormat.JAVASCRIPT - - def dataFormatStr = project.hasProperty("dataFormat") ? - project.property("dataFormat") : "json" - - def dataFormat - switch(dataFormatStr) { - case "json": - dataFormat = DataFormat.JSON - break - case "xml": - dataFormat = DataFormat.XML - break - default: - println "invalid dataFormat: " + dataFormatStr - return - } - - if (useES == null) { - useES = project.hasProperty("useES") ? - Boolean.parseBoolean(project.property("useES")) : true - } - - def mappingName = project.hasProperty("mappingName") ? project.property("mappingName") : null - - def withMapping = "" - if(mappingName != null){ - withMapping = " with mapping: " + mappingName + FlowManager flowManager = getFlowManager() + if (flowManager.getFlow(flowName.toString()) == null) { + Flow flow = flowManager.createFlow(flowName.toString()) + flowManager.saveFlow(flow) + } else { + throw new FlowAlreadyPresentException() } - - Scaffolding scaffolding = getScaffolding() - println "Creating an " + pluginFormat + " " + flowType + " flow named " + flowName + " for entity " + entityName + withMapping - scaffolding.createFlow(entityName, flowName, flowType, pluginFormat, dataFormat, useES, mappingName) } } diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateHarmonizeFlowTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateHarmonizeLegacyFlowTask.groovy similarity index 82% rename from ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateHarmonizeFlowTask.groovy rename to ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateHarmonizeLegacyFlowTask.groovy index 3dab717c69..34c1732cdb 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateHarmonizeFlowTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateHarmonizeLegacyFlowTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ package com.marklogic.gradle.task -import com.marklogic.hub.flow.FlowType +import com.marklogic.hub.legacy.flow.FlowType import org.gradle.api.tasks.TaskAction -class CreateHarmonizeFlowTask extends CreateFlowTask { +class CreateHarmonizeLegacyFlowTask extends CreateLegacyFlowTask { @TaskAction void createHarmonizeFlow() { diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateInputFlowTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateInputLegacyFlowTask.groovy similarity index 82% rename from ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateInputFlowTask.groovy rename to ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateInputLegacyFlowTask.groovy index 3a8f8b7227..5b7d05016f 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateInputFlowTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateInputLegacyFlowTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,10 +17,10 @@ package com.marklogic.gradle.task -import com.marklogic.hub.flow.FlowType +import com.marklogic.hub.legacy.flow.FlowType import org.gradle.api.tasks.TaskAction -class CreateInputFlowTask extends CreateFlowTask { +class CreateInputLegacyFlowTask extends CreateLegacyFlowTask { @TaskAction void createInputFlow() { diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateLegacyFlowTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateLegacyFlowTask.groovy new file mode 100644 index 0000000000..3f47cf8c3d --- /dev/null +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateLegacyFlowTask.groovy @@ -0,0 +1,79 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.marklogic.gradle.task + +import com.marklogic.gradle.exception.EntityNameRequiredException +import com.marklogic.gradle.exception.FlowNameRequiredException +import com.marklogic.hub.legacy.flow.CodeFormat +import com.marklogic.hub.legacy.flow.DataFormat +import com.marklogic.hub.legacy.flow.FlowType +import com.marklogic.hub.scaffold.Scaffolding +import org.gradle.api.tasks.Input + +abstract class CreateLegacyFlowTask extends HubTask { + + @Input + public Boolean useES + + + void createFlow(FlowType flowType) { + def entityName = project.hasProperty("entityName") ? project.property("entityName") : null + if (entityName == null) { + throw new EntityNameRequiredException() + } + def flowName = project.hasProperty("flowName") ? project.property("flowName") : null + if (flowName == null) { + throw new FlowNameRequiredException() + } + + def pluginFormat = project.hasProperty("pluginFormat") ? + CodeFormat.getCodeFormat(project.property("pluginFormat")) : CodeFormat.JAVASCRIPT + + def dataFormatStr = project.hasProperty("dataFormat") ? + project.property("dataFormat") : "json" + + def dataFormat + switch(dataFormatStr) { + case "json": + dataFormat = DataFormat.JSON + break + case "xml": + dataFormat = DataFormat.XML + break + default: + println "invalid dataFormat: " + dataFormatStr + return + } + + if (useES == null) { + useES = project.hasProperty("useES") ? + Boolean.parseBoolean(project.property("useES")) : true + } + + def mappingName = project.hasProperty("mappingName") ? project.property("mappingName") : null + + def withMapping = "" + if(mappingName != null){ + withMapping = " with mapping: " + mappingName + } + + Scaffolding scaffolding = getScaffolding() + println "Creating an " + pluginFormat + " " + flowType + " flow named " + flowName + " for entity " + entityName + withMapping + scaffolding.createFlow(entityName, flowName, flowType, pluginFormat, dataFormat, useES, mappingName) + } +} diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateMappingTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateMappingTask.groovy index 4003652734..d2f571faa6 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateMappingTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateMappingTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateProcessTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateProcessTask.groovy new file mode 100644 index 0000000000..7c1a6ec5be --- /dev/null +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/CreateProcessTask.groovy @@ -0,0 +1,54 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.marklogic.gradle.task + +import com.marklogic.gradle.exception.ProcessAlreadyPresentException +import com.marklogic.gradle.exception.ProcessNameRequiredException +import com.marklogic.hub.ProcessManager +import com.marklogic.hub.processes.Process +import org.gradle.api.tasks.TaskAction + +class CreateProcessTask extends HubTask { + + @TaskAction + void createProcess() { + def propName = "processName" + def propType = "processType" + def processName = project.hasProperty(propName) ? project.property(propName) : null + if (processName == null) { + throw new ProcessNameRequiredException() + } + def processType = project.hasProperty(propType) ? project.property(propType) : Process.ProcessType.CUSTOM + + def projectDir = getHubConfig().getHubProject().getProjectDirString() + println "processName: " + processName + println "processType: " + processType + println "projectDir: " + projectDir.toString() + + ProcessManager processManager = getProcessManager() + Process process = Process.create(processName.toString(), Process.ProcessType.getProcessType(processType.toString())) + + if (processManager.getProcess(process.name, process.type) == null) { + processManager.saveProcess(process) + } + else { + throw new ProcessAlreadyPresentException() + } + + } +} diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeleteHubModuleTimestampsFileTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeleteHubModuleTimestampsFileTask.groovy index 8ece1eb292..9794a7ed0d 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeleteHubModuleTimestampsFileTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeleteHubModuleTimestampsFileTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeleteJobsTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeleteJobsTask.groovy index c7f031bd5d..0fd008021f 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeleteJobsTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeleteJobsTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ package com.marklogic.gradle.task import com.marklogic.gradle.exception.JobIdsRequiredException -import com.marklogic.hub.job.JobDeleteResponse +import com.marklogic.hub.legacy.job.JobDeleteResponse import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployHubModulesTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployHubModulesTask.groovy index c4b13c7d09..4cd1a42abd 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployHubModulesTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployHubModulesTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployHubAmpsTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployUserArtifactsTask.groovy similarity index 69% rename from ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployHubAmpsTask.groovy rename to ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployUserArtifactsTask.groovy index eb2afdd93e..5f901c6014 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployHubAmpsTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployUserArtifactsTask.groovy @@ -17,13 +17,21 @@ package com.marklogic.gradle.task -import com.marklogic.hub.deploy.commands.DeployHubAmpsCommand import org.gradle.api.tasks.TaskAction -class DeployHubAmpsTask extends HubTask { +class DeployUserArtifactsTask extends HubTask { @TaskAction - void deployHubAmps() { - new DeployHubAmpsCommand(getHubConfig()).execute(getCommandContext()) + void deployUserArtifacts() { + if (!isHubInstalled()) { + println("Data Hub is not installed.") + return + } + + def cmd = getLoadUserArtifactsCommand() + cmd.setForceLoad(true); + + cmd.execute(getCommandContext()) + } } diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployUserModulesTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployUserModulesTask.groovy index 61740d7d29..fb4aca33f2 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployUserModulesTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DeployUserModulesTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DisableDebuggingTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DisableDebuggingTask.groovy index 623e86eedb..78f40df061 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DisableDebuggingTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DisableDebuggingTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,6 @@ class DisableDebuggingTask extends HubTask { if (!isHubInstalled()) { throw new HubNotInstalledException() } - getDebugging().disable() + getLegacyDebugging().disable() } } diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DisableTracingTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DisableTracingTask.groovy index 3498c2e123..d8cc419056 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DisableTracingTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/DisableTracingTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,6 @@ class DisableTracingTask extends HubTask { if (!isHubInstalled()) { throw new HubNotInstalledException() } - getTracing().disable() + getLegacyTracing().disable() } } diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/EnableDebuggingTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/EnableDebuggingTask.groovy index fd40277e34..7063c6d328 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/EnableDebuggingTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/EnableDebuggingTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,6 @@ class EnableDebuggingTask extends HubTask { throw new HubNotInstalledException() } - getDebugging().enable() + getLegacyDebugging().enable() } } diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/EnableTracingTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/EnableTracingTask.groovy index 5420b06346..13f3fd8d5d 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/EnableTracingTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/EnableTracingTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,6 @@ class EnableTracingTask extends HubTask { if (!isHubInstalled()) { throw new HubNotInstalledException() } - getTracing().enable() + getLegacyTracing().enable() } } diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/ExportJobsTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/ExportJobsTask.groovy index 9d7e40f839..c5ff625156 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/ExportJobsTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/ExportJobsTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/GeneratePiiTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/GeneratePiiTask.groovy index 44ccf4faf6..6cac466449 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/GeneratePiiTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/GeneratePiiTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/GenerateTDETemplateFromEntityTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/GenerateTDETemplateFromEntityTask.groovy index 1c5d5a347a..75c2032f87 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/GenerateTDETemplateFromEntityTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/GenerateTDETemplateFromEntityTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubInfoTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubInfoTask.groovy index 5ca5aa5be7..41a81b5a87 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubInfoTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubInfoTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubTask.groovy index e48fe671f4..a176ce5f3b 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,8 +24,12 @@ import com.marklogic.client.DatabaseClient import com.marklogic.hub.* import com.marklogic.hub.deploy.commands.GeneratePiiCommand import com.marklogic.hub.deploy.commands.LoadHubModulesCommand +import com.marklogic.hub.deploy.commands.LoadUserArtifactsCommand import com.marklogic.hub.deploy.commands.LoadUserModulesCommand -import com.marklogic.hub.job.JobManager +import com.marklogic.hub.legacy.LegacyDebugging +import com.marklogic.hub.legacy.LegacyFlowManager +import com.marklogic.hub.legacy.LegacyTracing +import com.marklogic.hub.legacy.job.LegacyJobManager import com.marklogic.hub.scaffold.Scaffolding import org.gradle.api.DefaultTask import org.gradle.api.tasks.Internal @@ -62,10 +66,20 @@ abstract class HubTask extends DefaultTask { getProject().property("loadUserModulesCommand") } + @Internal + LoadUserArtifactsCommand getLoadUserArtifactsCommand() { + getProject().property("loadUserArtifactsCommand") + } + @Internal MappingManager getMappingManager() { getProject().property("mappingManager") } + + @Internal + ProcessManager getProcessManager() { + getProject().property("processManager") + } @Internal EntityManager getEntityManager() { @@ -78,13 +92,13 @@ abstract class HubTask extends DefaultTask { } @Internal - Tracing getTracing() { - return Tracing.create(getStagingClient()) + LegacyTracing getLegacyTracing() { + return LegacyTracing.create(getStagingClient()) } @Internal - Debugging getDebugging() { - return Debugging.create(getStagingClient()) + LegacyDebugging getLegacyDebugging() { + return LegacyDebugging.create(getStagingClient()) } @Internal @@ -93,8 +107,13 @@ abstract class HubTask extends DefaultTask { } @Internal - JobManager getJobManager() { - return JobManager.create(getHubConfig().newJobDbClient()); + LegacyFlowManager getLegacyFlowManager() { + getProject().property("legacyFlowManager") + } + + @Internal + LegacyJobManager getJobManager() { + return LegacyJobManager.create(getHubConfig().newJobDbClient()); } @Internal diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubWatchTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubWatchTask.groovy index c4736b3cca..28010cffab 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubWatchTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/HubWatchTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/ImportJobsTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/ImportJobsTask.groovy index e98fcca9a8..c0bbd52e62 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/ImportJobsTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/ImportJobsTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/InitProjectTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/InitProjectTask.groovy index 5c7f3be950..197188fe6c 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/InitProjectTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/InitProjectTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/PreinstallCheckTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/PreinstallCheckTask.groovy index 5a9d67d9a7..28f6ff7885 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/PreinstallCheckTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/PreinstallCheckTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package com.marklogic.gradle.task import com.marklogic.hub.DataHub +import com.marklogic.hub.deploy.util.CMASettings import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskExecutionException @@ -26,6 +27,8 @@ class PreinstallCheckTask extends HubTask { @TaskAction void runPreinstallCheck() { DataHub dh = getDataHub(); + // Set CMA properties properly before + CMASettings.getInstance().setCmaSettings(getCommandContext().getAppConfig()); def preInstallCheck = dh.runPreInstallCheck() if (preInstallCheck.get("safeToInstall")) { print("PreInstall check: [PASSED]") @@ -59,4 +62,4 @@ class PreinstallCheckTask extends HubTask { throw new TaskExecutionException(this, new Throwable(sb.toString())) } } -} \ No newline at end of file +} diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/RunFlowTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/RunFlowTask.groovy index 468e046246..4de1d312cc 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/RunFlowTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/RunFlowTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,8 +24,12 @@ import com.marklogic.gradle.exception.EntityNameRequiredException import com.marklogic.gradle.exception.FlowNameRequiredException import com.marklogic.gradle.exception.FlowNotFoundException import com.marklogic.gradle.exception.HubNotInstalledException -import com.marklogic.hub.FlowManager -import com.marklogic.hub.flow.* +import com.marklogic.hub.legacy.LegacyFlowManager +import com.marklogic.hub.legacy.flow.LegacyFlowItemCompleteListener +import com.marklogic.hub.legacy.flow.LegacyFlowItemFailureListener +import com.marklogic.hub.legacy.flow.LegacyFlowRunner +import com.marklogic.hub.legacy.flow.FlowType +import com.marklogic.hub.legacy.flow.LegacyFlow import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskExecutionException @@ -107,8 +111,8 @@ class RunFlowTask extends HubTask { throw new HubNotInstalledException() } - FlowManager fm = getFlowManager() - Flow flow = fm.getFlow(entityName, flowName, FlowType.HARMONIZE) + LegacyFlowManager fm = getLegacyFlowManager() + LegacyFlow flow = fm.getFlow(entityName, flowName, FlowType.HARMONIZE) if (flow == null) { throw new FlowNotFoundException(entityName, flowName); } @@ -132,20 +136,20 @@ class RunFlowTask extends HubTask { } } - FlowRunner flowRunner = fm.newFlowRunner() + LegacyFlowRunner flowRunner = fm.newFlowRunner() .withFlow(flow) .withOptions(options) .withBatchSize(batchSize) .withThreadCount(threadCount) .withSourceClient(sourceClient) .withDestinationDatabase(destDB) - .onItemComplete(new FlowItemCompleteListener() { + .onItemComplete(new LegacyFlowItemCompleteListener() { @Override void processCompletion(String jobId, String itemId) { //TODO in the future, let's figure out a good use of this space } }) - .onItemFailed(new FlowItemFailureListener() { + .onItemFailed(new LegacyFlowItemFailureListener() { @Override void processFailure(String jobId, String itemId) { //TODO ditto diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/SaveIndexes.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/SaveIndexes.groovy index cabc916e35..f3c2c8c1d1 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/SaveIndexes.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/SaveIndexes.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/UndeployHubAmpsTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/UndeployHubAmpsTask.groovy deleted file mode 100644 index d155eb57d0..0000000000 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/UndeployHubAmpsTask.groovy +++ /dev/null @@ -1,13 +0,0 @@ -package com.marklogic.gradle.task - - -import com.marklogic.hub.deploy.commands.DeployHubAmpsCommand -import org.gradle.api.tasks.TaskAction - -class UndeployHubAmpsTask extends HubTask { - - @TaskAction - void undeployHubAmps() { - new DeployHubAmpsCommand(getHubConfig()).undo(getCommandContext()) - } -} diff --git a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/UpdateHubTask.groovy b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/UpdateHubTask.groovy index 8e6176daee..1ecd89b10f 100644 --- a/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/UpdateHubTask.groovy +++ b/ml-data-hub-plugin/src/main/groovy/com/marklogic/gradle/task/UpdateHubTask.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,14 +17,14 @@ package com.marklogic.gradle.task -import com.marklogic.hub.DataHub + import org.gradle.api.tasks.TaskAction class UpdateHubTask extends HubTask { @TaskAction void updateHub() { - if (getFlowManager().getLegacyFlows().size() > 0) { + if (getLegacyFlowManager().getLegacyFlows().size() > 0) { def updatedFlows = new ArrayList() getDataHub().upgradeHub(updatedFlows) diff --git a/ml-data-hub-plugin/src/main/resources/META-INF/gradle-plugins/com.marklogic.ml-data-hub.properties b/ml-data-hub-plugin/src/main/resources/META-INF/gradle-plugins/com.marklogic.ml-data-hub.properties index e75101d1f7..7c7fe13aed 100644 --- a/ml-data-hub-plugin/src/main/resources/META-INF/gradle-plugins/com.marklogic.ml-data-hub.properties +++ b/ml-data-hub-plugin/src/main/resources/META-INF/gradle-plugins/com.marklogic.ml-data-hub.properties @@ -1,5 +1,5 @@ # -# Copyright 2012-2018 MarkLogic Corporation +# Copyright 2012-2019 MarkLogic Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/BasicAuthTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/BasicAuthTest.groovy index e545afa1f9..225e93aca5 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/BasicAuthTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/BasicAuthTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/CreateHarmonizeFlowTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/CreateHarmonizeFlowTaskTest.groovy index 0fb58caa46..0f24be8863 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/CreateHarmonizeFlowTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/CreateHarmonizeFlowTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/NotInstalledTests.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/NotInstalledTests.groovy index eb4cbc496b..eddd5e039c 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/NotInstalledTests.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/NotInstalledTests.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,7 +27,7 @@ class NotInstalledTests extends BaseTest { def setupSpec() { createGradleFiles() runTask('hubInit') - runTask("mlDeploySecurity") + runTask("hubDeploySecurity") //runTask('mlUndeploy', '-Pconfirm=true') } diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/SslTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/SslTest.groovy index d755a3155b..612e74ac35 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/SslTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/SslTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -151,7 +151,7 @@ class SslTest extends BaseTest { ''' runTask("hubInit") - runTask("mlDeploySecurity") + runTask("hubDeploySecurity") writeSSLFiles(new File(BaseTest.testProjectDir.root, "src/main/ml-config/servers/final-server.json"), new File("src/test/resources/ssl-test/ssl-server.json")) @@ -173,7 +173,7 @@ class SslTest extends BaseTest { def cleanupSpec() { runTask("mlUndeploy", "-Pconfirm=true") - runTask("mlDeploySecurity") + runTask("hubDeploySecurity") runTask("disableSSL", "--stacktrace") //runTask("mlUnDeploySecurity") } diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/TlsTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/TlsTest.groovy index 1f1f976a7d..7d0330b738 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/TlsTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/fullcycle/TlsTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -209,7 +209,7 @@ class TlsTest extends BaseTest { ''' def result = runTask("hubInit") - runTask("mlDeploySecurity") + runTask("hubDeploySecurity") writeSSLFiles(new File(BaseTest.testProjectDir.root, "src/main/ml-config/servers/final-server.json"), new File("src/test/resources/tls-test/ssl-server.json")) writeSSLFiles(new File(BaseTest.testProjectDir.root, "src/main/hub-internal-config/servers/job-server.json"), @@ -226,7 +226,7 @@ class TlsTest extends BaseTest { def cleanupSpec() { runTask("mlUndeploy", "-Pconfirm=true") - runTask("mlDeploySecurity") + runTask("hubDeploySecurity") runTask("disableSSL") //runTask("mlUnDeploySecurity") } diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/BaseTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/BaseTest.groovy index 310775a397..82a2e9452f 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/BaseTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/BaseTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -67,7 +67,9 @@ class BaseTest extends Specification { static final int MOD_COUNT_WITH_TRACE_MODULES = 26 static final int MOD_COUNT = 5 // this value under good security conditions is 2 because hub-admin-user cannot read options files directly. - static final int MOD_COUNT_NO_OPTIONS_NO_TRACES = 109 + // 2 additional modules have been added for triggers + // 5.x modules added + static final int MOD_COUNT_NO_OPTIONS_NO_TRACES = 220 static final TemporaryFolder testProjectDir = new TemporaryFolder() static File buildFile static File propertiesFile diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateEntityTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateEntityTaskTest.groovy index 17883033ce..9758358909 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateEntityTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateEntityTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,11 +12,12 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * */ package com.marklogic.gradle.task +import com.marklogic.hub.HubConfig import org.gradle.testkit.runner.UnexpectedBuildFailure import org.gradle.testkit.runner.UnexpectedBuildSuccess @@ -29,6 +30,7 @@ class CreateEntityTaskTest extends BaseTest { def setupSpec() { createGradleFiles() runTask('hubInit') + clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME, HubConfig.DEFAULT_JOB_NAME); } def "create entity with no name"() { @@ -48,16 +50,26 @@ class CreateEntityTaskTest extends BaseTest { entityName=my-new-entity } """ - + getStagingDocCount("http://marklogic.com/entity-services/models") == 0 + def modCount = getModulesDocCount(); when: - def result = runTask('hubCreateEntity') + def result = runTask('hubCreateEntity', 'hubDeployUserArtifacts') then: notThrown(UnexpectedBuildFailure) result.task(":hubCreateEntity").outcome == SUCCESS + result.task(":hubDeployUserArtifacts").outcome == SUCCESS + + File entityFile = Paths.get(testProjectDir.root.toString(), "plugins", "entities", "my-new-entity", "my-new-entity.entity.json").toFile() + entityFile.isFile() == true + String entityActual = entityFile.getText('UTF-8') + String entityExpected = new File("src/test/resources/my-new-entity.entity.json").getText('UTF-8') + assert(entityActual == entityExpected) File entityDir = Paths.get(testProjectDir.root.toString(), "plugins", "entities", "my-new-entity").toFile() entityDir.isDirectory() == true + getStagingDocCount("http://marklogic.com/entity-services/models") == 1 + getModulesDocCount() == modCount } } diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateFlowTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateFlowTaskTest.groovy new file mode 100644 index 0000000000..246e746830 --- /dev/null +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateFlowTaskTest.groovy @@ -0,0 +1,65 @@ +package com.marklogic.gradle.task + +import com.marklogic.hub.HubConfig +import org.gradle.testkit.runner.UnexpectedBuildFailure +import org.gradle.testkit.runner.UnexpectedBuildSuccess + +import java.nio.file.Paths + +import static org.gradle.testkit.runner.TaskOutcome.FAILED +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +class CreateFlowTaskTest extends BaseTest { + def setupSpec() { + createGradleFiles() + runTask('hubInit') + clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME, HubConfig.DEFAULT_JOB_NAME); + } + + def "create flow with no name"() { + when: + def result = runFailTask('hubCreateFlow') + + then: + notThrown(UnexpectedBuildSuccess) + result.output.contains('flowName property is required') + result.task(":hubCreateFlow").outcome == FAILED + } + + def "create flow with valid name only"() { + given: + propertiesFile << """ + ext { + flowName=myTestFlow + } + """ + + when: + def result = runTask('hubCreateFlow') + + then: + notThrown(UnexpectedBuildFailure) + result.task(":hubCreateFlow").outcome == SUCCESS + + File flowDir = Paths.get(testProjectDir.root.toString(), "flows").toFile() + flowDir.isDirectory() + } + + def "create flow with existing name"() { + given: + propertiesFile << """ + ext { + flowName=myDuplicateFlow + } + """ + + when: + runTask('hubCreateFlow') + def failedResult = runFailTask('hubCreateFlow') + + then: + notThrown(UnexpectedBuildSuccess) + failedResult.output.contains('Flow with the same name is already present') + failedResult.task(":hubCreateFlow").outcome == FAILED + } +} diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateInputFlowTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateInputFlowTaskTest.groovy index 7d656a748a..9edf39a340 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateInputFlowTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateInputFlowTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateMappingTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateMappingTaskTest.groovy index 51f8f009c3..5966fbe846 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateMappingTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateMappingTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package com.marklogic.gradle.task +import com.marklogic.hub.HubConfig import org.gradle.testkit.runner.UnexpectedBuildFailure import org.gradle.testkit.runner.UnexpectedBuildSuccess @@ -29,6 +30,7 @@ class CreateMappingTaskTest extends BaseTest { def setupSpec() { createGradleFiles() runTask('hubInit') + clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME, HubConfig.DEFAULT_JOB_NAME); } def "create mapping with no name"() { @@ -46,18 +48,21 @@ class CreateMappingTaskTest extends BaseTest { propertiesFile << """ ext { mappingName=my-new-mapping + entityName=my-new-entity } """ when: - def result = runTask('hubCreateMapping') + def result = runTask('hubCreateEntity', 'hubCreateMapping', 'hubDeployUserArtifacts' ) then: notThrown(UnexpectedBuildFailure) result.task(":hubCreateMapping").outcome == SUCCESS + result.task(":hubDeployUserArtifacts").outcome == SUCCESS File mappingDir = Paths.get(testProjectDir.root.toString(), "plugins", "mappings", "my-new-mapping").toFile() mappingDir.isDirectory() == true + getStagingDocCount("http://marklogic.com/data-hub/mappings") == 1 } } diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateProcessTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateProcessTaskTest.groovy new file mode 100644 index 0000000000..38e482cf9d --- /dev/null +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/CreateProcessTaskTest.groovy @@ -0,0 +1,86 @@ +/* + * Copyright 2012-2019 MarkLogic Corporation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.marklogic.gradle.task + +import com.marklogic.hub.HubConfig +import org.gradle.testkit.runner.UnexpectedBuildFailure +import org.gradle.testkit.runner.UnexpectedBuildSuccess + +import java.nio.file.Paths + +import static org.gradle.testkit.runner.TaskOutcome.FAILED +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +class CreateProcessTaskTest extends BaseTest { + def setupSpec() { + createGradleFiles() + runTask('hubInit') + clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME, HubConfig.DEFAULT_JOB_NAME); + } + + def "create process with no name"() { + when: + def result = runFailTask('hubCreateProcess') + + then: + notThrown(UnexpectedBuildSuccess) + result.output.contains('processName property is required') + result.task(":hubCreateProcess").outcome == FAILED + } + + def "create process with valid name only"() { + given: + propertiesFile << """ + ext { + processName=my-test-process + } + """ + + when: + def result = runTask('hubCreateProcess') + + then: + notThrown(UnexpectedBuildFailure) + result.task(":hubCreateProcess").outcome == SUCCESS + + // It should default to "CUSTOM" type when none specified + File processDir = Paths.get(testProjectDir.root.toString(), "processes", "custom", "my-test-process").toFile() + println processDir.toString() + processDir.isDirectory() + } + + def "create process with valid name and type"() { + given: + propertiesFile << """ + ext { + processName=my-new-process + processType=mapping + } + """ + + when: + def result = runTask('hubCreateProcess') + + then: + notThrown(UnexpectedBuildFailure) + result.task(":hubCreateProcess").outcome == SUCCESS + + File processDir = Paths.get(testProjectDir.root.toString(), "processes", "mapping", "my-new-process").toFile() + processDir.isDirectory() + } +} diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/ExportJobsTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/ExportJobsTaskTest.groovy index 1e36a6bec9..82fed0f35c 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/ExportJobsTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/ExportJobsTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/GenerateTDETemplateFromEntityTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/GenerateTDETemplateFromEntityTaskTest.groovy new file mode 100644 index 0000000000..aa1033838d --- /dev/null +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/GenerateTDETemplateFromEntityTaskTest.groovy @@ -0,0 +1,65 @@ +package com.marklogic.gradle.task + +import com.marklogic.hub.HubConfig +import org.apache.commons.io.FileUtils +import org.gradle.testkit.runner.UnexpectedBuildFailure + +import java.nio.file.Path +import java.nio.file.Paths + +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS + +class GenerateTDETemplateFromEntityTaskTest extends BaseTest { + def setupSpec() { + createGradleFiles() + runTask('hubInit') + clearDatabases(HubConfig.DEFAULT_STAGING_NAME, HubConfig.DEFAULT_FINAL_NAME, HubConfig.DEFAULT_JOB_NAME); + } + + def "GenerateTDETEmplates"() { + given: + def pluginDir = Paths.get(hubConfig().hubProject.projectDirString).resolve("plugins") + + //DHF style nested entities (references in separate file) + def entitiesDir1 = pluginDir.resolve("entities").resolve("Order") + def entitiesDir2 = pluginDir.resolve("entities").resolve("Item") + def entitiesDir3 = pluginDir.resolve("entities").resolve("Customer") + + entitiesDir1.toFile().mkdirs() + entitiesDir2.toFile().mkdirs() + entitiesDir3.toFile().mkdirs() + + //ES style nested entities(references in the same file) + + def entitiesDir4 = pluginDir.resolve("entities").resolve("Entity1") + entitiesDir4.toFile().mkdirs() + + //DHF style without references + + def entitiesDir5 = pluginDir.resolve("entities").resolve("e2eentity") + entitiesDir5.toFile().mkdirs() + + FileUtils.copyFile(new File("src/test/resources/tde-template/Order.entity.json"), entitiesDir1.resolve('Order.entity.json').toFile()) + FileUtils.copyFile(new File("src/test/resources/tde-template/Item.entity.json"), entitiesDir2.resolve('Item.entity.json').toFile()) + FileUtils.copyFile(new File("src/test/resources/tde-template/Customer.entity.json"), entitiesDir3.resolve('Customer.entity.json').toFile()) + + FileUtils.copyFile(new File("src/test/resources/tde-template/Order1.entity.json"), entitiesDir4.resolve('Order1.entity.json').toFile()) + FileUtils.copyFile(new File("src/test/resources/tde-template/e2eentity.entity.json"), entitiesDir5.resolve('e2eentity.entity.json').toFile()) + + runTask("hubDeployUserArtifacts") + + when: + def result = runTask('hubGenerateTDETemplates', '-PentityNames=Order,Order1,e2eentity,nonexistentEntity') + + then: + notThrown(UnexpectedBuildFailure) + result.task(":hubGenerateTDETemplates").outcome == SUCCESS + + Path tdePath = Paths.get(testProjectDir.root.toString(), "src", "main", "ml-schemas", "tde") + tdePath.resolve("Order-1.0.0.tdex").toFile().exists() == true + tdePath.resolve("Order1-1.0.0.tdex").toFile().exists() == true + tdePath.resolve("e2eentity-0.0.1.tdex").toFile().exists() == true + tdePath.resolve("nonexistentEntity-0.0.1.tdex").toFile().exists() == false + + } +} diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/HubUpdateTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/HubUpdateTaskTest.groovy index 18fd383b9e..ce5817bdfc 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/HubUpdateTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/HubUpdateTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/InitProjectTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/InitProjectTaskTest.groovy index 8f57badcac..c814132f27 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/InitProjectTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/InitProjectTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/InstalledTests.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/InstalledTests.groovy index 14423e8a45..5e22c3eff2 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/InstalledTests.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/InstalledTests.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,8 +23,8 @@ import com.marklogic.hub.HubConfig import org.apache.commons.io.FileUtils import org.gradle.testkit.runner.UnexpectedBuildFailure import org.gradle.testkit.runner.UnexpectedBuildSuccess -import com.marklogic.hub.Tracing; -import com.marklogic.hub.Debugging; +import com.marklogic.hub.legacy.LegacyTracing; +import com.marklogic.hub.legacy.LegacyDebugging; import java.nio.file.Paths @@ -53,7 +53,7 @@ class InstalledTests extends BaseTest { then: notThrown(UnexpectedBuildFailure) result.task(":hubEnableDebugging").outcome == SUCCESS - Debugging d = Debugging.create(hubConfig().newStagingClient()) + LegacyDebugging d = LegacyDebugging.create(hubConfig().newStagingClient()) d.isEnabled() == true } @@ -64,7 +64,7 @@ class InstalledTests extends BaseTest { then: notThrown(UnexpectedBuildFailure) result.task(":hubDisableDebugging").outcome == SUCCESS - Debugging d = Debugging.create(hubConfig().newStagingClient()) + LegacyDebugging d = LegacyDebugging.create(hubConfig().newStagingClient()) d.isEnabled() == false } @@ -75,7 +75,7 @@ class InstalledTests extends BaseTest { then: notThrown(UnexpectedBuildFailure) result.task(":hubEnableTracing").outcome == SUCCESS - Tracing t = Tracing.create(hubConfig().newStagingClient()) + LegacyTracing t = LegacyTracing.create(hubConfig().newStagingClient()) t.isEnabled() == true } @@ -86,7 +86,7 @@ class InstalledTests extends BaseTest { then: notThrown(UnexpectedBuildFailure) result.task(":hubDisableTracing").outcome == SUCCESS - Tracing t = Tracing.create(hubConfig().newStagingClient()) + LegacyTracing t = LegacyTracing.create(hubConfig().newStagingClient()) t.isEnabled() == false } diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/JobDeleteTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/JobDeleteTaskTest.groovy index ec4644e5ad..3b2cf1248b 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/JobDeleteTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/JobDeleteTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/SaveIndexesTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/SaveIndexesTaskTest.groovy index 45218dbfe5..15c01a5584 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/SaveIndexesTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/SaveIndexesTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/UpdateIndexesTaskTest.groovy b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/UpdateIndexesTaskTest.groovy index 0585752731..d1c2a3878f 100644 --- a/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/UpdateIndexesTaskTest.groovy +++ b/ml-data-hub-plugin/src/test/groovy/com/marklogic/gradle/task/UpdateIndexesTaskTest.groovy @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,7 +12,7 @@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * */ package com.marklogic.gradle.task @@ -24,6 +24,7 @@ import org.gradle.testkit.runner.UnexpectedBuildSuccess import com.marklogic.hub.HubConfig import com.marklogic.hub.HubProject import com.marklogic.hub.util.FileUtil +import spock.lang.IgnoreIf import java.nio.file.Files import java.nio.file.Path @@ -38,7 +39,7 @@ class UpdateIndexesTaskTest extends BaseTest { createGradleFiles() println(runTask("hubInit")) } - + def setup() { // Creating an Order Entity propertiesFile << """ @@ -53,43 +54,44 @@ class UpdateIndexesTaskTest extends BaseTest { // Copying Order.entity.json file to plugins/entities/my-unique-order-entity directory String entityStream = new File("src/test/resources/update-indexes/my-unique-order-entity.entity.json").getAbsolutePath() Files.copy(new File(entityStream).toPath(), entityDir.toPath().resolve("my-unique-order-entity.entity.json"), StandardCopyOption.REPLACE_EXISTING) - + // Loading modules to databases runTask('mlLoadModules') - + // Copying Staging and Final database Index info files to src/main/entity-config dir Path dir = hubConfig().getEntityDatabaseDir() if (!dir.toFile().exists()) { dir.toFile().mkdirs() } - + File dstFile = Paths.get(dir.toString(), HubConfig.STAGING_ENTITY_DATABASE_FILE).toFile() String entityConfigStream = new File("src/test/resources/update-indexes/staging-database.json").getAbsolutePath() Files.copy(new File(entityConfigStream).toPath(), dstFile.toPath(), StandardCopyOption.REPLACE_EXISTING) - + dstFile = Paths.get(dir.toString(), HubConfig.FINAL_ENTITY_DATABASE_FILE).toFile(); entityConfigStream = new File("src/test/resources/update-indexes/final-database.json").getAbsolutePath() Files.copy(new File(entityConfigStream).toPath(), dstFile.toPath(), StandardCopyOption.REPLACE_EXISTING) - + dir = hubConfig().getHubConfigDir() dstFile = Paths.get(dir.toString(), "databases", "job-database.json").toFile() entityConfigStream = new File("src/test/resources/update-indexes/job-database.json").getAbsolutePath(); Files.copy(new File(entityConfigStream).toPath(), dstFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } - + + @IgnoreIf({ System.getProperty('mlIsProvisionedEnvironment') }) def "test to deploy indexes to STAGING/FINAL/JOBS Database"() { given: int stagingIndexCount = getStagingRangePathIndexSize() int finalIndexCount = getFinalRangePathIndexSize() int jobIndexCount = getJobsRangePathIndexSize() - + when: def result = runTask('mlUpdateIndexes') then: notThrown(UnexpectedBuildFailure) result.task(":mlUpdateIndexes").outcome == SUCCESS - + assert (getStagingRangePathIndexSize() == stagingIndexCount+1) assert (getFinalRangePathIndexSize() == finalIndexCount+1) assert (getJobsRangePathIndexSize() == jobIndexCount+1) diff --git a/ml-data-hub-plugin/src/test/resources/my-new-entity.entity.json b/ml-data-hub-plugin/src/test/resources/my-new-entity.entity.json new file mode 100644 index 0000000000..6e317e0c5a --- /dev/null +++ b/ml-data-hub-plugin/src/test/resources/my-new-entity.entity.json @@ -0,0 +1,19 @@ +{ + "info" : { + "title" : "my-new-entity", + "version" : "0.0.1", + "baseUri" : "http://example.com/", + "description" : "An my-new-entity entity" + }, + "definitions" : { + "my-new-entity" : { + "description" : "The my-new-entity entity root.", + "required" : [ ], + "rangeIndex" : [ ], + "elementRangeIndex" : [ ], + "wordLexicon" : [ ], + "pii" : [ ], + "properties" : { } + } + } +} diff --git a/ml-data-hub-plugin/src/test/resources/tde-template/Customer.entity.json b/ml-data-hub-plugin/src/test/resources/tde-template/Customer.entity.json new file mode 100644 index 0000000000..02bf9b5dad --- /dev/null +++ b/ml-data-hub-plugin/src/test/resources/tde-template/Customer.entity.json @@ -0,0 +1,23 @@ +{ + "info": { + "title": "Customer", + "description": "DHF Customer", + "version": "1.0.0" + }, + "definitions": { + "Customer": { + "properties": { + "id": { + "datatype": "int" + }, + "name": { + "datatype": "string" + } + }, + "required": ["id", "name"], + "primaryKey": "id", + "pii": ["name"], + "pathRangeIndex": ["id"] + } + } +} diff --git a/ml-data-hub-plugin/src/test/resources/tde-template/Item.entity.json b/ml-data-hub-plugin/src/test/resources/tde-template/Item.entity.json new file mode 100644 index 0000000000..171e9d31c2 --- /dev/null +++ b/ml-data-hub-plugin/src/test/resources/tde-template/Item.entity.json @@ -0,0 +1,29 @@ +{ + "info": { + "title": "Item", + "description": "DHF Item", + "version": "1.0.0" + }, + "definitions": { + "Item": { + "properties": { + "id": { + "datatype": "int" + }, + "name": { + "datatype": "string" + }, + "description": { + "datatype": "string" + }, + "rating": { + "datatype": "float" + } + }, + "required": ["id", "name"], + "primaryKey": "id", + "pathRangeIndex": ["id", "rating"], + "wordLexicon": ["description"] + } + } +} diff --git a/ml-data-hub-plugin/src/test/resources/tde-template/Order.entity.json b/ml-data-hub-plugin/src/test/resources/tde-template/Order.entity.json new file mode 100644 index 0000000000..58bb54880d --- /dev/null +++ b/ml-data-hub-plugin/src/test/resources/tde-template/Order.entity.json @@ -0,0 +1,34 @@ +{ + "info": { + "title": "Order", + "description": "DHF Order", + "version": "1.0.0" + }, + "definitions": { + "Order": { + "properties": { + "id": { + "datatype": "int" + }, + "purchasedItems": { + "datatype": "array", + "items": { + "$ref": "#/definitions/Item" + } + }, + "customer": { + "$ref": "#/definitions/Customer" + }, + "transactionDateTime": { + "datatype": "dateTime" + }, + "totalCost": { + "datatype": "double" + } + }, + "required": ["id", "transactionDateTime", "totalCost"], + "primaryKey": "id", + "pathRangeIndex": ["id", "totalCost"] + } + } +} diff --git a/ml-data-hub-plugin/src/test/resources/tde-template/Order1.entity.json b/ml-data-hub-plugin/src/test/resources/tde-template/Order1.entity.json new file mode 100644 index 0000000000..9a7adfb075 --- /dev/null +++ b/ml-data-hub-plugin/src/test/resources/tde-template/Order1.entity.json @@ -0,0 +1,90 @@ +{ + "info": { + "title": "Order1", + "description": "DHF Order1", + "version": "1.0.0" + }, + "definitions": { + "Order1": { + "properties": { + "id": { + "datatype": "int" + }, + "purchasedItems": { + "datatype": "array", + "items": { + "$ref": "#/definitions/Item1" + } + }, + "customer": { + "$ref": "#/definitions/Customer1" + }, + "transactionDateTime": { + "datatype": "dateTime" + }, + "totalCost": { + "datatype": "double" + } + }, + "required": [ + "id", + "transactionDateTime", + "totalCost" + ], + "primaryKey": "id", + "pathRangeIndex": [ + "id", + "totalCost" + ] + }, + "Customer1": { + "properties": { + "id": { + "datatype": "int" + }, + "name": { + "datatype": "string" + } + }, + "required": [ + "id", + "name" + ], + "primaryKey": "id", + "pii": [ + "name" + ], + "pathRangeIndex": [ + "id" + ] + }, + "Item1": { + "properties": { + "id": { + "datatype": "int" + }, + "name": { + "datatype": "string" + }, + "description": { + "datatype": "string" + }, + "rating": { + "datatype": "float" + } + }, + "required": [ + "id", + "name" + ], + "primaryKey": "id", + "pathRangeIndex": [ + "id", + "rating" + ], + "wordLexicon": [ + "description" + ] + } + } +} diff --git a/ml-data-hub-plugin/src/test/resources/tde-template/e2eentity.entity.json b/ml-data-hub-plugin/src/test/resources/tde-template/e2eentity.entity.json new file mode 100644 index 0000000000..eb752f63b4 --- /dev/null +++ b/ml-data-hub-plugin/src/test/resources/tde-template/e2eentity.entity.json @@ -0,0 +1,28 @@ +{ + "info" : { + "title" : "e2eentity", + "version" : "0.0.1" + }, + "definitions" : { + "e2eentity" : { + "required" : [ ], + "primaryKey": "id", + "rangeIndex" : [ "name" ], + "elementRangeIndex": ["id"], + "wordLexicon" : [ ], + "properties" : { + "id": { + "datatype": "string", + "collation" : "http://marklogic.com/collation/codepoint" + }, + "name" : { + "datatype" : "string", + "collation" : "http://marklogic.com/collation/codepoint" + }, + "salary": { + "datatype": "decimal" + } + } + } + } +} diff --git a/quick-start/.gitignore b/quick-start/.gitignore index d4e8e41094..a0114918d4 100644 --- a/quick-start/.gitignore +++ b/quick-start/.gitignore @@ -45,3 +45,4 @@ build/ src/main/resources/static/ src/main/resources/templates/ package-lock.json +site/ diff --git a/quick-start/.storybook/config.js b/quick-start/.storybook/config.js index ddaea8f06f..5f07e09d60 100644 --- a/quick-start/.storybook/config.js +++ b/quick-start/.storybook/config.js @@ -1,15 +1,6 @@ import {configure} from '@storybook/angular'; import {setOptions} from '@storybook/addon-options'; -import './storybook.css'; - -import '../node_modules/mdi/css/materialdesignicons.css'; -import '../node_modules/material-design-icons-iconfont/dist/material-design-icons.css'; -import '../node_modules/font-awesome/css/font-awesome.css'; -import '../node_modules/codemirror/lib/codemirror.css'; -import '../node_modules/@angular-mdl/popover/popover.css'; -import '../node_modules/@angular-mdl/select/select.css'; - // Option defaults: setOptions({ /** diff --git a/quick-start/.storybook/preview-head.html b/quick-start/.storybook/preview-head.html index e69de29bb2..8a0b6ce78c 100644 --- a/quick-start/.storybook/preview-head.html +++ b/quick-start/.storybook/preview-head.html @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/quick-start/.storybook/storybook.css b/quick-start/.storybook/storybook.css deleted file mode 100644 index 6e30c00ca0..0000000000 --- a/quick-start/.storybook/storybook.css +++ /dev/null @@ -1,6 +0,0 @@ -body { - background-color: rgba(0, 0, 0, 0.05); - background-image: repeating-linear-gradient(0deg, transparent, transparent 7px, rgba(0, 0, 0, 0.2) 1px, transparent 8px), repeating-linear-gradient(90deg, transparent, transparent 7px, rgba(0, 0, 0, 0.2) 1px, transparent 8px); - background-size: 8px 8px; -} - diff --git a/quick-start/.storybook/webpack.config.js b/quick-start/.storybook/webpack.config.js index 87aa4ef9c8..4f42fd49bb 100644 --- a/quick-start/.storybook/webpack.config.js +++ b/quick-start/.storybook/webpack.config.js @@ -1,7 +1,11 @@ const path = require('path'); const autoprefixer = require('autoprefixer'); +const webpack = require('webpack'); module.exports = (baseConfig, env, defaultConfig) => { + baseConfig.plugins.push( new webpack.ProvidePlugin({ + CodeMirror: 'codemirror' + })); baseConfig.module.rules.push( { test: [/\.stories\.ts?$/, /index\.ts$/], @@ -16,30 +20,6 @@ module.exports = (baseConfig, env, defaultConfig) => { include: [path.resolve(__dirname, '../src')], enforce: 'pre', }, - { - test: /\.css$/, - use: [ - require.resolve('style-loader'), - { - loader: require.resolve('css-loader'), - options: { - importLoaders: 1, - }, - }, - { - loader: require.resolve('postcss-loader'), - options: { - ident: 'postcss', // https://webpack.js.org/guides/migrating/#complex-options - plugins: () => [ - require('postcss-flexbugs-fixes'), // eslint-disable-line - autoprefixer({ - flexbox: 'no-2009', - }), - ], - }, - }, - ], - }, { test: /\.(ico|jpg|jpeg|png|gif|eot|otf|svg|webp|ttf|woff|woff2)(\?.*)?$/, loaders: ["file-loader"], diff --git a/quick-start/angular.json b/quick-start/angular.json index ec7408ae29..2bd9faf6d4 100644 --- a/quick-start/angular.json +++ b/quick-start/angular.json @@ -5,7 +5,7 @@ "projects": { "data-hub-quickstart": { "root": "", - "sourceRoot": "src", + "sourceRoot": "src/main/ui", "projectType": "application", "architect": { "build": { @@ -17,8 +17,8 @@ "tsConfig": "src/main/ui/tsconfig.app.json", "polyfills": "src/main/ui/polyfills.ts", "assets": [ - "src/main/ui/assets", - "src/main/ui/favicon.ico" + { "glob": "**/*", "input": "src/main/ui/assets", "output": "/" }, + { "glob": "favicon.ico", "input": "src/main/ui/", "output": "/" } ], "styles": [ "node_modules/mdi/css/materialdesignicons.css", @@ -84,8 +84,8 @@ "src/main/ui/styles.scss" ], "assets": [ - "src/main/ui/assets", - "src/main/ui/favicon.ico" + { "glob": "**/*", "input": "src/main/ui/assets", "output": "/" }, + { "glob": "favicon.ico", "input": "src/main/ui/", "output": "/" } ] } }, diff --git a/quick-start/api/swagger/full.json b/quick-start/api/swagger/full.json new file mode 100644 index 0000000000..f8463d1dcf --- /dev/null +++ b/quick-start/api/swagger/full.json @@ -0,0 +1,1036 @@ +{ + "swagger": "2.0", + "info": { + "description": "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.", + "version": "1.0.0", + "title": "Swagger Petstore", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "email": "apiteam@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "host": "petstore.swagger.io", + "basePath": "/v2", + "tags": [ + { + "name": "pet", + "description": "Everything about your Pets", + "externalDocs": { + "description": "Find out more", + "url": "http://swagger.io" + } + }, + { + "name": "store", + "description": "Access to Petstore orders" + }, + { + "name": "user", + "description": "Operations about user", + "externalDocs": { + "description": "Find out more about our store", + "url": "http://swagger.io" + } + } + ], + "schemes": [ + "https", + "http" + ], + "paths": { + "/pet": { + "post": { + "tags": [ + "pet" + ], + "summary": "Add a new pet to the store", + "description": "", + "operationId": "addPet", + "consumes": [ + "application/json", + "application/xml" + ], + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "put": { + "tags": [ + "pet" + ], + "summary": "Update an existing pet", + "description": "", + "operationId": "updatePet", + "consumes": [ + "application/json", + "application/xml" + ], + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Pet object that needs to be added to the store", + "required": true, + "schema": { + "$ref": "#/definitions/Pet" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + }, + "405": { + "description": "Validation exception" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByStatus": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by status", + "description": "Multiple status values can be provided with comma separated strings", + "operationId": "findPetsByStatus", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "status", + "in": "query", + "description": "Status values that need to be considered for filter", + "required": true, + "type": "array", + "items": { + "type": "string", + "enum": [ + "available", + "pending", + "sold" + ], + "default": "available" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid status value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/findByTags": { + "get": { + "tags": [ + "pet" + ], + "summary": "Finds Pets by tags", + "description": "Muliple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", + "operationId": "findPetsByTags", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "tags", + "in": "query", + "description": "Tags to filter by", + "required": true, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Pet" + } + } + }, + "400": { + "description": "Invalid tag value" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ], + "deprecated": true + } + }, + "/pet/{petId}": { + "get": { + "tags": [ + "pet" + ], + "summary": "Find pet by ID", + "description": "Returns a single pet", + "operationId": "getPetById", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to return", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Pet" + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "api_key": [] + } + ] + }, + "post": { + "tags": [ + "pet" + ], + "summary": "Updates a pet in the store with form data", + "description": "", + "operationId": "updatePetWithForm", + "consumes": [ + "application/x-www-form-urlencoded" + ], + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet that needs to be updated", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "name", + "in": "formData", + "description": "Updated name of the pet", + "required": false, + "type": "string" + }, + { + "name": "status", + "in": "formData", + "description": "Updated status of the pet", + "required": false, + "type": "string" + } + ], + "responses": { + "405": { + "description": "Invalid input" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + }, + "delete": { + "tags": [ + "pet" + ], + "summary": "Deletes a pet", + "description": "", + "operationId": "deletePet", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "api_key", + "in": "header", + "required": false, + "type": "string" + }, + { + "name": "petId", + "in": "path", + "description": "Pet id to delete", + "required": true, + "type": "integer", + "format": "int64" + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Pet not found" + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/pet/{petId}/uploadImage": { + "post": { + "tags": [ + "pet" + ], + "summary": "uploads an image", + "description": "", + "operationId": "uploadFile", + "consumes": [ + "multipart/form-data" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "description": "ID of pet to update", + "required": true, + "type": "integer", + "format": "int64" + }, + { + "name": "additionalMetadata", + "in": "formData", + "description": "Additional data to pass to server", + "required": false, + "type": "string" + }, + { + "name": "file", + "in": "formData", + "description": "file to upload", + "required": false, + "type": "file" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/ApiResponse" + } + } + }, + "security": [ + { + "petstore_auth": [ + "write:pets", + "read:pets" + ] + } + ] + } + }, + "/store/inventory": { + "get": { + "tags": [ + "store" + ], + "summary": "Returns pet inventories by status", + "description": "Returns a map of status codes to quantities", + "operationId": "getInventory", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int32" + } + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + }, + "/store/order": { + "post": { + "tags": [ + "store" + ], + "summary": "Place an order for a pet", + "description": "", + "operationId": "placeOrder", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "order placed for purchasing the pet", + "required": true, + "schema": { + "$ref": "#/definitions/Order" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid Order" + } + } + } + }, + "/store/order/{orderId}": { + "get": { + "tags": [ + "store" + ], + "summary": "Find purchase order by ID", + "description": "For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions", + "operationId": "getOrderById", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of pet that needs to be fetched", + "required": true, + "type": "integer", + "maximum": 10.0, + "minimum": 1.0, + "format": "int64" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/Order" + } + }, + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + }, + "delete": { + "tags": [ + "store" + ], + "summary": "Delete purchase order by ID", + "description": "For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors", + "operationId": "deleteOrder", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "ID of the order that needs to be deleted", + "required": true, + "type": "integer", + "minimum": 1.0, + "format": "int64" + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Order not found" + } + } + } + }, + "/user": { + "post": { + "tags": [ + "user" + ], + "summary": "Create user", + "description": "This can only be done by the logged in user.", + "operationId": "createUser", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Created user object", + "required": true, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithArray": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithArrayInput", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/createWithList": { + "post": { + "tags": [ + "user" + ], + "summary": "Creates list of users with given input array", + "description": "", + "operationId": "createUsersWithListInput", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "List of user object", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/User" + } + } + } + ], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/login": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs user into the system", + "description": "", + "operationId": "loginUser", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "username", + "in": "query", + "description": "The user name for login", + "required": true, + "type": "string" + }, + { + "name": "password", + "in": "query", + "description": "The password for login in clear text", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "string" + }, + "headers": { + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + }, + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + } + } + }, + "400": { + "description": "Invalid username/password supplied" + } + } + } + }, + "/user/logout": { + "get": { + "tags": [ + "user" + ], + "summary": "Logs out current logged in user session", + "description": "", + "operationId": "logoutUser", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [], + "responses": { + "default": { + "description": "successful operation" + } + } + } + }, + "/user/{username}": { + "get": { + "tags": [ + "user" + ], + "summary": "Get user by user name", + "description": "", + "operationId": "getUserByName", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be fetched. Use user1 for testing. ", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/User" + } + }, + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "put": { + "tags": [ + "user" + ], + "summary": "Updated user", + "description": "This can only be done by the logged in user.", + "operationId": "updateUser", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "name that need to be updated", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Updated user object", + "required": true, + "schema": { + "$ref": "#/definitions/User" + } + } + ], + "responses": { + "400": { + "description": "Invalid user supplied" + }, + "404": { + "description": "User not found" + } + } + }, + "delete": { + "tags": [ + "user" + ], + "summary": "Delete user", + "description": "This can only be done by the logged in user.", + "operationId": "deleteUser", + "produces": [ + "application/xml", + "application/json" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "description": "The name that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "400": { + "description": "Invalid username supplied" + }, + "404": { + "description": "User not found" + } + } + } + } + }, + "securityDefinitions": { + "petstore_auth": { + "type": "oauth2", + "authorizationUrl": "https://petstore.swagger.io/oauth/authorize", + "flow": "implicit", + "scopes": { + "write:pets": "modify pets in your account", + "read:pets": "read your pets" + } + }, + "api_key": { + "type": "apiKey", + "name": "api_key", + "in": "header" + } + }, + "definitions": { + "Order": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "petId": { + "type": "integer", + "format": "int64" + }, + "quantity": { + "type": "integer", + "format": "int32" + }, + "shipDate": { + "type": "string", + "format": "date-time" + }, + "status": { + "type": "string", + "description": "Order Status", + "enum": [ + "placed", + "approved", + "delivered" + ] + }, + "complete": { + "type": "boolean", + "default": false + } + }, + "xml": { + "name": "Order" + } + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "username": { + "type": "string" + }, + "firstName": { + "type": "string" + }, + "lastName": { + "type": "string" + }, + "email": { + "type": "string" + }, + "password": { + "type": "string" + }, + "phone": { + "type": "string" + }, + "userStatus": { + "type": "integer", + "format": "int32", + "description": "User Status" + } + }, + "xml": { + "name": "User" + } + }, + "Category": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Category" + } + }, + "Tag": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + } + }, + "xml": { + "name": "Tag" + } + }, + "Pet": { + "type": "object", + "required": [ + "name", + "photoUrls" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "category": { + "$ref": "#/definitions/Category" + }, + "name": { + "type": "string", + "example": "doggie" + }, + "photoUrls": { + "type": "array", + "xml": { + "name": "photoUrl", + "wrapped": true + }, + "items": { + "type": "string" + } + }, + "tags": { + "type": "array", + "xml": { + "name": "tag", + "wrapped": true + }, + "items": { + "$ref": "#/definitions/Tag" + } + }, + "status": { + "type": "string", + "description": "pet status in the store", + "enum": [ + "available", + "pending", + "sold" + ] + } + }, + "xml": { + "name": "Pet" + } + }, + "ApiResponse": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + } + } + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + } +} \ No newline at end of file diff --git a/quick-start/api/swagger/mocks.json b/quick-start/api/swagger/mocks.json new file mode 100644 index 0000000000..62faa0a127 --- /dev/null +++ b/quick-start/api/swagger/mocks.json @@ -0,0 +1,715 @@ +{ + "openapi": "3.0.0", + "info": { + "description": "This is a sample of a QuickStart DataHub Swagger doucment defining endpoints to be mocked", + "version": "1.0.0", + "title": "QuickStart DataHub API", + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + } + }, + "basePath": "/api", + "tags": [ ], + "schemes": [ + "http" + ], + "paths": { + "/flows": { + "get": { + "tags": [ + "flows" + ], + "summary": "Returns all flows", + "description": "Returns all flows", + "operationId": "findFlows", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/flow" + }, + "default": [ + { + "name": "MappingFlow", + "description": "Maps raw values to the canonical model", + "identifier": "cts.collectionQuery('rawContent')", + "steps": [ + { + "type": "mapping", + "name": "person-mapping1.json", + "identifier": null, + "retryLimit": 0, + "options": {} + } + ] + } + ] + } + } + } + }, + "post": { + "tags": [ + "flows" + ], + "summary": "Create flow", + "description": "", + "operationId": "createFlow", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "body", + "in": "body", + "description": "Flow to create", + "required": true, + "schema": { + "$ref": "#/components/schemas/flow", + "default": + { + "name": "MappingFlow", + "description": "Maps raw values to the canonical model", + "identifier": "cts.collectionQuery('rawContent')", + "steps": [ + { + "type": "mapping", + "name": "person-mapping1.json", + "identifier": null, + "retryLimit": 0, + "options": {} + } + ] + } + }, + "examples": { + "ingestion": { + "summary": "An example flow object for step type: Ingestion", + "value": { + "name": "value", + "description": "value", + "identifier": "value", + "steps": [ + { + "type": "value", + "name": "value", + "identifier": "value", + "retryLimit": "value", + "options": { + "param1": "value", + "param2": "value", + "param3": "value", + "param4": "value", + "param5": "value" + } + } + ] + } + }, + "mapping": { + "summary": "An example flow object for step type: Mapping", + "value": { + "name": "value", + "description": "value", + "identifier": "value", + "steps": [ + { + "type": "value", + "name": "value", + "identifier": "value", + "retryLimit": "value", + "options": { + "param1": "value", + "param2": "value", + "param3": "value", + "param4": "value", + "param5": "value" + } + } + ] + } + }, + "mastering": { + "summary": "An example flow object for step type: Mastering", + "value": { + "name": "value", + "description": "value", + "identifier": "value", + "steps": [ + { + "type": "value", + "name": "value", + "identifier": "value", + "retryLimit": "value", + "options": { + "param1": "value", + "param2": "value", + "param3": "value", + "param4": "value", + "param5": "value" + } + } + ] + } + }, + "custom": { + "summary": "An example flow object for step type: Custom", + "value": { + "name": "value", + "description": "value", + "identifier": "value", + "steps": [ + { + "type": "value", + "name": "value", + "identifier": "value", + "retryLimit": "value", + "options": { + "param1": "value", + "param2": "value", + "param3": "value", + "param4": "value", + "param5": "value" + } + } + ] + } + } + } + } + ], + "responses": { + "201": { + "description": "successful operation" + }, + "400": { + "description": "Invalid name supplied" + }, + "404": { + "description": "flow not found" + } + } + } + }, + "/flows/{flowName}": { + "get": { + "tags": [ + "flows" + ], + "summary": "Find flow by name", + "description": "....", + "operationId": "getFlowByName", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "flowName", + "in": "path", + "description": "Name of flow that needs to be fetched", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/components/schemas/flow", + "default": [ + { + "name": "MappingFlow", + "description": "Maps raw values to the canonical model", + "identifier": "cts.collectionQuery('rawContent')", + "steps": [ + { + "type": "mapping", + "name": "person-mapping1.json", + "identifier": null, + "retryLimit": 0, + "options": {} + } + ] + } + ] + } + }, + "400": { + "description": "Invalid name supplied" + }, + "404": { + "description": "flow not found" + } + } + }, + "put": { + "tags": [ + "flows" + ], + "summary": "Update flow with name", + "description": "", + "operationId": "updateFlowByName", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "flowName", + "in": "path", + "description": "Name of flow that needs to be fetched", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "description": "Updated flow", + "required": true, + "schema": { + "$ref": "#/components/schemas/flow", + "default": [ + { + "name": "MappingFlow", + "description": "Maps raw values to the canonical model", + "identifier": "cts.collectionQuery('rawContent')", + "steps": [ + { + "type": "mapping", + "name": "person-mapping1.json", + "identifier": null, + "retryLimit": 0, + "options": {} + } + ] + } + ] + }, + "examples": { + "ingestion": { + "summary": "An example flow object for step type: Ingestion", + "value": { } + }, + "mapping": { + "summary": "An example flow object for step type: Mapping", + "value": { } + }, + "mastering": { + "summary": "An example flow object for step type: Mastering", + "value": { } + }, + "custom": { + "summary": "An example flow object for step type: Custom", + "value": { } + } + } + } + ], + "responses": { + "204": { + "description": "successful operation" + }, + "400": { + "description": "Invalid name supplied" + }, + "404": { + "description": "flow not found" + } + } + }, + "delete": { + "tags": [ + "flows" + ], + "summary": "Delete flow by name", + "description": "", + "operationId": "deleteFlow", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "flowName", + "in": "path", + "description": "ID of the sample that needs to be deleted", + "required": true, + "type": "string" + } + ], + "responses": { + "204": { + "description": "successful operation" + }, + "400": { + "description": "Invalid name supplied" + }, + "404": { + "description": "Flow not found" + } + } + } + }, + "/process": { + "post": { + "tags": [ + "process" + ], + "summary": "Creates a process", + "description": "Create a process", + "operationId": "createProcess", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Create Process Parameters", + "required": true, + "schema": { + "$ref": "#/components/schemas/process" + }, + "examples": { + "ingestion": { + "summary": "An example process object for step type: Ingestion (?)", + "value": { } + }, + "mapping": { + "summary": "An example process object for step type: Mapping (?)", + "value": { } + }, + "mastering": { + "summary": "An example process object for step type: Mastering (?)", + "value": { } + }, + "custom": { + "summary": "An example process object for step type: Custom (?)", + "value": { } + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object", + "items": { + "$ref": "#/components/schemas/process" + }, + "default": [ + { "id": 1, "name": "aaa", "status": "new" }, + { "id": 2, "name": "bbb", "status": "new" }, + { "id": 3, "name": "ccc", "status": "ready" }, + { "id": 4, "name": "ddd", "status": "ready" }, + { "id": 5, "name": "eee", "status": "approved" } + ] + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + }, + "/process/{type}/{name}": { + "get": { + "tags": [ + "process" + ], + "summary": "Get a process", + "description": "Get a process", + "operationId": "getProcess", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "type", + "in": "path", + "description": "type of process to delete", + "required": true, + "type": "string" + }, + { + "name": "name", + "in": "path", + "description": "name of process to return", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object", + "schema": { + "$ref": "#/components/schemas/process" + } + } + } + }, + "security": [ + { + "api_key": [] + } + ] + }, + "put": { + "tags": [ + "process" + ], + "summary": "Update a process", + "description": "Update a process", + "operationId": "updateProcess", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "type", + "in": "path", + "description": "type of process to delete", + "required": true, + "type": "string" + }, + { + "name": "name", + "in": "path", + "description": "name of process to update", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Update Process Parameters", + "required": true, + "schema": { + "$ref": "#/components/schemas/process" + }, + "examples": { + "ingestion": { + "summary": "An example process object for step type: Ingestion (?)", + "value": { } + }, + "mapping": { + "summary": "An example process object for step type: Mapping (?)", + "value": { } + }, + "mastering": { + "summary": "An example process object for step type: Mastering (?)", + "value": { } + }, + "custom": { + "summary": "An example process object for step type: Custom (?)", + "value": { } + } + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object", + "items": { + "$ref": "#/components/schemas/process" + }, + "default": [ + { "id": 1, "name": "aaa", "status": "new" }, + { "id": 2, "name": "bbb", "status": "new" }, + { "id": 3, "name": "ccc", "status": "ready" }, + { "id": 4, "name": "ddd", "status": "ready" }, + { "id": 5, "name": "eee", "status": "approved" } + ] + } + } + }, + "security": [ + { + "api_key": [] + } + ] + }, + "delete": { + "tags": [ + "process" + ], + "summary": "Delete a process", + "description": "Delete a process", + "operationId": "deleteProcess", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "type", + "in": "path", + "description": "type of process to delete", + "required": true, + "type": "string" + }, + { + "name": "name", + "in": "path", + "description": "name of process to delete", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object", + "items": { + "$ref": "#/components/schemas/message" + }, + "default": [ + { + "message": "Process deleted successfully"} + ] + } + } + }, + "security": [ + { + "api_key": [] + } + ] + } + } + }, + "securityDefinitions": {}, + "components": { + "schemas": { + "flow": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of flow" + }, + "description": { + "type": "string", + "description": "Description of flow" + }, + "identifier": { + "type": "string", + "description": "Identification documents passed through flow" + }, + "steps": { + "type": "array", + "description": "Steps in flow", + "items": { + "$ref": "#/components/schemas/step" + } + } + } + }, + "step":{ + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "step type" + }, + "name": { + "type": "string", + "description": "step name" + }, + "identifier": { + "type": "string", + "description": "Identification for documents in step" + }, + "retryLimit": { + "type": "integer", + "minimum": 0, + "format": "int64" + }, + "options": { + "type": "object" + } + } + }, + "message": { + "type": "object", + "properties": { + "message": { + "type": "string" + } + }, + "xml": { + "name": "message" + } + }, + "process": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "language": { + "type": "string" + }, + "description": { + "type": "string" + }, + "version": { + "type": "string" + }, + "options": { + "type": "object" + }, + "customHook": { + "$ref": "#/components/schemas/customHook" + } + }, + "xml": { + "name": "Process" + } + }, + "customHook": { + "type": "object", + "properties": { + "module": { + "type": "string" + }, + "parameters": { + "type": "object" + }, + "user": { + "type": "string" + }, + "runBefore": { + "type": "boolean" + } + }, + "xml": { + "name": "Tag" + } + } + } + }, + "externalDocs": { + "description": "Find out more about MarkLogic Data Hub", + "url": "https://github.com/marklogic/marklogic-data-hub" + } +} diff --git a/quick-start/build.gradle b/quick-start/build.gradle index e8b0adaad4..7a855275db 100644 --- a/quick-start/build.gradle +++ b/quick-start/build.gradle @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/e2e/page-objects/appPage.ts b/quick-start/e2e/page-objects/appPage.ts index e0113590fe..c66a0cf361 100644 --- a/quick-start/e2e/page-objects/appPage.ts +++ b/quick-start/e2e/page-objects/appPage.ts @@ -18,7 +18,7 @@ export class AppPage extends Page { } get odhLogo() { - return element(by.css('a img[src="/main/ui/assets/img/odh.svg"]')); + return element(by.css('a img[src="/img/odh.svg"]')); } get dashboardTab() { diff --git a/quick-start/e2e/page-objects/auth/login.ts b/quick-start/e2e/page-objects/auth/login.ts index ccf8f71ce3..1186bad1ce 100644 --- a/quick-start/e2e/page-objects/auth/login.ts +++ b/quick-start/e2e/page-objects/auth/login.ts @@ -83,7 +83,7 @@ export class LoginPage extends AppPage { } get finishedButton() { - return element(by.css('#finished-button')); + return element(by.buttonText('Finished')); } get dataHubNameLabel() { @@ -148,6 +148,10 @@ export class LoginPage extends AppPage { await element(by.css('#installer-button')).click(); } + async clickFinished() { + await this.finishedButton.click(); + } + //get userName element get userName(){ return element(by.css('input#username')) diff --git a/quick-start/e2e/page-objects/browse/browse.ts b/quick-start/e2e/page-objects/browse/browse.ts index af383d22c6..212df2fdf0 100644 --- a/quick-start/e2e/page-objects/browse/browse.ts +++ b/quick-start/e2e/page-objects/browse/browse.ts @@ -10,7 +10,7 @@ export class BrowsePage extends AppPage { //to get the login box locater locator() { - return by.css('app-search > div'); + return by.css('app-search > app-search-ui > div'); } databaseDropDown() { diff --git a/quick-start/e2e/page-objects/entities/entities.ts b/quick-start/e2e/page-objects/entities/entities.ts index f15fcd175e..2033b68b5b 100644 --- a/quick-start/e2e/page-objects/entities/entities.ts +++ b/quick-start/e2e/page-objects/entities/entities.ts @@ -161,6 +161,10 @@ export class EntityPage extends AppPage { return element(by.className('alert-text')); } + get errorInvalidTitleMessage() { + return element(by.cssContainingText('.alert-text', 'Only Alphanumeric characters are allowed in the Title')); + } + get toast() { return element(by.css('mdl-snackbar-component')); } diff --git a/quick-start/e2e/page-objects/flows/flows.ts b/quick-start/e2e/page-objects/flows/flows.ts index 82134781b6..fa31a55c09 100644 --- a/quick-start/e2e/page-objects/flows/flows.ts +++ b/quick-start/e2e/page-objects/flows/flows.ts @@ -233,6 +233,10 @@ export class FlowPage extends AppPage { return fs.readFileSync(filepath, 'utf8'); } + get duplicateFlowNameAlertText() { + return element(by.className('alert-text')); + } + /* * Run input flow -- this will replace the old runInputFlow that has hardcoded input folder * @entityName: entity name diff --git a/quick-start/e2e/page-objects/traces/traces.ts b/quick-start/e2e/page-objects/traces/traces.ts index 8f994ec9a6..56e47fbfd0 100644 --- a/quick-start/e2e/page-objects/traces/traces.ts +++ b/quick-start/e2e/page-objects/traces/traces.ts @@ -6,7 +6,7 @@ export class TracesPage extends AppPage { //to get the login box locater locator() { - return by.css('app-traces > div'); + return by.css('app-traces > app-traces-ui > div'); } tracesPageTitle() { diff --git a/quick-start/e2e/specs/auth/authenticated.ts b/quick-start/e2e/specs/auth/authenticated.ts index 906e6d9d8e..a05471e78c 100644 --- a/quick-start/e2e/specs/auth/authenticated.ts +++ b/quick-start/e2e/specs/auth/authenticated.ts @@ -59,8 +59,9 @@ export default function(tmpDir) { .toEqual('data-hub-ol-final-SCHEMAS'); await loginPage.clickAdvancedSettings(); await loginPage.clickRestoreDefaults(); + browser.sleep(3000); browser.wait(EC.elementToBeClickable(loginPage.restoreButton)); - await loginPage.clickRestore(); + await loginPage.restoreButton.click(); await loginPage.clickAdvancedSettings(); console.log('verify restored settings'); expect(loginPage.stagingAppserverNameLabel.isDisplayed()).toBe(true); @@ -194,18 +195,19 @@ export default function(tmpDir) { let originalTimeout; originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL; console.log('original jasmine timeout: ' + originalTimeout); - jasmine.DEFAULT_TIMEOUT_INTERVAL = 370000; + jasmine.DEFAULT_TIMEOUT_INTERVAL = 420000; console.log('modified jasmine timeout: ' + jasmine.DEFAULT_TIMEOUT_INTERVAL); browser.wait(EC.presenceOf(loginPage.installProgress), 600000, 'install progress is not present'); expect(loginPage.installProgress.isDisplayed()).toBe(true); - browser.wait(EC.visibilityOf(appPage.flowsTab), 600000, 'dashboard page is not displayed'); + browser.wait(EC.elementToBeClickable(loginPage.finishedButton), 600000, 'finished button is not displayed'); jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; console.log('changed back to original jasmine timeout: ' + jasmine.DEFAULT_TIMEOUT_INTERVAL); }); - it ('should complete the install and go to the dashboard', function() { - console.log('refresh the browser'); - browser.refresh(); + it ('should complete the install and go to the dashboard', async function() { + browser.driver.sleep(5000); + console.log('clicking Finished button'); + await loginPage.clickFinished(); console.log('loading dashboard page'); dashboardPage.isLoaded(); expect(appPage.flowsTab.isDisplayed()).toBe(true); diff --git a/quick-start/e2e/specs/create/create.ts b/quick-start/e2e/specs/create/create.ts index 227a222134..89a808bc2d 100644 --- a/quick-start/e2e/specs/create/create.ts +++ b/quick-start/e2e/specs/create/create.ts @@ -79,6 +79,7 @@ export default function(tmpDir) { }); it ('should go to the entities page', async function() { + browser.get('http://localhost:8080/#/entities'); await appPage.entitiesTab.click(); entityPage.isLoaded(); }); @@ -96,8 +97,8 @@ export default function(tmpDir) { browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.presenceOf(entityPage.toast)); - browser.wait(EC.stalenessOf(entityPage.toast)); + //browser.wait(EC.presenceOf(entityPage.toast)); + //browser.wait(EC.stalenessOf(entityPage.toast)); browser.wait(EC.visibilityOf(entityPage.getEntityBox('Order'))); expect(entityPage.getEntityBox('Order').isDisplayed()).toBe(true); await entityPage.toolsButton.click(); @@ -119,8 +120,8 @@ export default function(tmpDir) { browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.presenceOf(entityPage.toast)); - browser.wait(EC.stalenessOf(entityPage.toast)); + //browser.wait(EC.presenceOf(entityPage.toast)); + //browser.wait(EC.stalenessOf(entityPage.toast)); browser.wait(EC.visibilityOf(entityPage.getEntityBox('Product'))); expect(entityPage.getEntityBox('Product').isDisplayed()).toBe(true); await entityPage.toolsButton.click(); @@ -165,8 +166,8 @@ export default function(tmpDir) { browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.presenceOf(entityPage.toast)); - browser.wait(EC.stalenessOf(entityPage.toast)); + //browser.wait(EC.presenceOf(entityPage.toast)); + //browser.wait(EC.stalenessOf(entityPage.toast)); }); it ('should add properties to Order entity', async function() { @@ -206,8 +207,8 @@ export default function(tmpDir) { browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.presenceOf(entityPage.toast)); - browser.wait(EC.stalenessOf(entityPage.toast)); + //browser.wait(EC.presenceOf(entityPage.toast)); + //browser.wait(EC.stalenessOf(entityPage.toast)); }); it ('should verify properties to Product entity', async function() { @@ -265,59 +266,6 @@ export default function(tmpDir) { browser.wait(EC.invisibilityOf(entityPage.entityEditor)); }); - // commenting out, there is another test on removing properties - /*it ('should remove some properties on Order entity', async function() { - console.log('verify remove properties on Order entity'); - let lastProperty = entityPage.lastProperty; - await entityPage.clickEditEntity('Order'); - browser.wait(EC.visibilityOf(entityPage.entityEditor)); - expect(entityPage.entityEditor.isDisplayed()).toBe(true); - //add some additional properties - console.log('add additional properties'); - await entityPage.addProperty.click(); - await entityPage.getPropertyName(lastProperty).sendKeys('remove-prop1'); - await entityPage.getPropertyType(lastProperty).element(by.cssContainingText('option', 'dateTime')).click(); - await entityPage.getPropertyDescription(lastProperty).sendKeys('remove-prop1 description'); - await entityPage.addProperty.click(); - await entityPage.getPropertyName(lastProperty).sendKeys('remove-prop2'); - await entityPage.getPropertyType(lastProperty).element(by.cssContainingText('option', 'integer')).click(); - await entityPage.getPropertyDescription(lastProperty).sendKeys('remove-prop2 description'); - await entityPage.saveEntity.click(); - browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); - expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); - await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.presenceOf(entityPage.toast)); - browser.wait(EC.stalenessOf(entityPage.toast)); - //remove the additional properties - console.log('remove additional properties'); - await entityPage.clickEditEntity('Order'); - browser.wait(EC.visibilityOf(entityPage.entityEditor)); - expect(entityPage.entityEditor.isDisplayed()).toBe(true); - let removeProp1 = entityPage.getPropertyByPosition(4); - let removeProp2 = entityPage.getPropertyByPosition(5); - await entityPage.getPropertyCheckBox(removeProp1).click(); - await entityPage.getPropertyCheckBox(removeProp2).click(); - await entityPage.deleteProperty.click(); - browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); - await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.elementToBeClickable(entityPage.saveEntity)); - await entityPage.saveEntity.click(); - browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); - expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); - await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.presenceOf(entityPage.toast)); - browser.wait(EC.stalenessOf(entityPage.toast)); - //verify that the properties are removed - console.log('verify properties are removed'); - await entityPage.clickEditEntity('Order'); - browser.wait(EC.visibilityOf(entityPage.entityEditor)); - expect(entityPage.entityEditor.isDisplayed()).toBe(true); - //console.log('verify properties count'); - //entityPage.getPropertiesCount().then(function(props){expect(props).toEqual(3)}); - await entityPage.cancelEntity.click(); - browser.wait(EC.invisibilityOf(entityPage.entityEditor)); - });*/ - it ('should remove a created entity', async function() { browser.get('http://localhost:8080/#/entities'); //create removeEntity entity @@ -334,12 +282,13 @@ export default function(tmpDir) { browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.presenceOf(entityPage.toast)); - browser.wait(EC.stalenessOf(entityPage.toast)); + //browser.wait(EC.presenceOf(entityPage.toast)); + //browser.wait(EC.stalenessOf(entityPage.toast)); browser.wait(EC.visibilityOf(entityPage.getEntityBox('removeEntity'))); await entityPage.toolsButton.click(); //remove removeEntity entity await entityPage.deleteEntityButton('removeEntity').click(); + browser.sleep(3000); browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); await entityPage.confirmDialogYesButton.click(); @@ -424,6 +373,7 @@ export default function(tmpDir) { expect(lastProperty.isDisplayed() && lastProperty.isDisplayed()); await entityPage.getPropertyCheckBox(lastProperty).click(); await entityPage.deleteProperty.click(); + browser.sleep(3000); browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); await entityPage.confirmDialogYesButton.click(); @@ -516,8 +466,8 @@ export default function(tmpDir) { browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.presenceOf(entityPage.toast)); - browser.wait(EC.stalenessOf(entityPage.toast)); + //browser.wait(EC.presenceOf(entityPage.toast)); + //browser.wait(EC.stalenessOf(entityPage.toast)); }); it ('should verify pii property to PII entity', async function() { @@ -590,6 +540,19 @@ export default function(tmpDir) { browser.wait(EC.invisibilityOf(entityPage.entityEditor)); }); + it ('should not be able to use invalid character and space as title', async function() { + browser.get('http://localhost:8080/#/entities'); + await entityPage.clickEditEntity('PIIEntity'); + browser.wait(EC.visibilityOf(entityPage.entityEditor)); + expect(entityPage.entityEditor.isDisplayed()).toBe(true); + await entityPage.entityTitle.sendKeys('$%# myTitle^&%*'); + await entityPage.saveEntity.click(); + // verify the error message on invalid character on title + expect(entityPage.errorInvalidTitleMessage.isDisplayed()).toBe(true); + await entityPage.cancelEntity.click(); + browser.wait(EC.invisibilityOf(entityPage.entityEditor)); + }); + it ('should logout and login', async function() { entityPage.logout(); loginPage.isLoaded(); @@ -659,7 +622,7 @@ export default function(tmpDir) { await settingsPage.redeployConfirmation.click(); browser.wait(EC.visibilityOf(settingsPage.redeployStatus)); expect(settingsPage.redeployStatus.isDisplayed()).toBe(true); - browser.sleep(120000); + browser.sleep(150000); browser.wait(EC.invisibilityOf(settingsPage.redeployStatus)); }); @@ -797,6 +760,32 @@ export default function(tmpDir) { await flowPage.setKeyValueFlowOptionsByPosition(3, 'myDate', '2017-03-07'); }); + it ('should not create duplicate input flow', async function() { + browser.get('http://localhost:8080/#/flows'); + //create duplicate input flow + await flowPage.inputFlowButton('Product').click(); + browser.wait(EC.visibilityOf(flowPage.newFlowDialog)); + expect(flowPage.newFlowDialog.isDisplayed()).toBe(true); + await flowPage.newFlowName.sendKeys('Load Products'); + await flowPage.createFlowButton.click(); + expect(flowPage.duplicateFlowNameAlertText.getText()).toBe('Flow names must be unique. Entity "Product" already contains an Input flow named "Load Products"'); + await flowPage.cancelFlowButton.click(); + browser.wait(EC.stalenessOf(flowPage.newFlowDialog)); + }); + + it ('should not create duplicate harmonize flow', async function() { + browser.get('http://localhost:8080/#/flows'); + //create duplicate input flow + await flowPage.harmonizeFlowButton('Product').click(); + browser.wait(EC.visibilityOf(flowPage.newFlowDialog)); + expect(flowPage.newFlowDialog.isDisplayed()).toBe(true); + await flowPage.newFlowName.sendKeys('Harmonize Products'); + await flowPage.createFlowButton.click(); + expect(flowPage.duplicateFlowNameAlertText.getText()).toBe('Flow names must be unique. Entity "Product" already contains a Harmonize flow named "Harmonize Products"'); + await flowPage.cancelFlowButton.click(); + browser.wait(EC.stalenessOf(flowPage.newFlowDialog)); + }); + it ('should redeploy modules', async function() { browser.get('http://localhost:8080/#/flows'); flowPage.redeployButton.click(); @@ -806,75 +795,5 @@ export default function(tmpDir) { await appPage.flowsTab.click(); flowPage.isLoaded(); }); - - /*it ('should retain flow options when moving around', function() { - //move to other tab and go back to flows tab - console.log('going to the other tab and back'); - appPage.entitiesTab.click(); - entityPage.isLoaded(); - appPage.flowsTab.click(); - flowPage.isLoaded(); - flowPage.clickEntityDisclosure('Product'); - browser.wait(EC.visibilityOf(flowPage.getFlow('Product', 'Harmonize Products', 'HARMONIZE'))); - //verify the options are retained - console.log('verify the flow options'); - flowPage.getFlow('Product', 'Harmonize Products', 'HARMONIZE').click(); - browser.wait(EC.visibilityOf(flowPage.tabs)); - expect(flowPage.getKeyFlowOptionsByPosition(1).getAttribute('value')).toEqual('hello'); - expect(flowPage.getValueFlowOptionsByPosition(1).getAttribute('value')).toEqual('world'); - expect(flowPage.getKeyFlowOptionsByPosition(2).getAttribute('value')).toEqual('myNumber'); - expect(flowPage.getValueFlowOptionsByPosition(2).getAttribute('value')).toEqual('250.456'); - expect(flowPage.getKeyFlowOptionsByPosition(3).getAttribute('value')).toEqual('myDate'); - expect(flowPage.getValueFlowOptionsByPosition(3).getAttribute('value')).toEqual('2017-03-07'); - //move to other harmonize flow and go back to the flow - console.log('going to the other flow and back'); - flowPage.clickEntityDisclosure('TestEntity'); - browser.wait(EC.elementToBeClickable(flowPage.getFlow('TestEntity', 'sjs json HARMONIZE', 'HARMONIZE'))); - expect(flowPage.getFlow('TestEntity', 'sjs json HARMONIZE', 'HARMONIZE').isDisplayed()).toBe(true); - flowPage.getFlow('TestEntity', 'sjs json HARMONIZE', 'HARMONIZE').click(); - browser.wait(EC.elementToBeClickable(flowPage.runHarmonizeButton())); - expect(flowPage.runHarmonizeButton().isDisplayed()).toBe(true); - flowPage.clickEntityDisclosure('Product'); - browser.wait(EC.elementToBeClickable(flowPage.getFlow('Product', 'Harmonize Products', 'HARMONIZE'))); - expect(flowPage.getFlow('Product', 'Harmonize Products', 'HARMONIZE').isDisplayed()).toBe(true); - flowPage.getFlow('Product', 'Harmonize Products', 'HARMONIZE').click(); - browser.wait(EC.elementToBeClickable(flowPage.runHarmonizeButton())); - expect(flowPage.runHarmonizeButton().isDisplayed()).toBe(true); - //verify the options are retained - console.log('verify the flow options'); - browser.wait(EC.visibilityOf(flowPage.runHarmonizeButton())); - expect(flowPage.runHarmonizeButton().isDisplayed()).toBe(true); - expect(flowPage.getKeyFlowOptionsByPosition(1).getAttribute('value')).toEqual('hello'); - expect(flowPage.getValueFlowOptionsByPosition(1).getAttribute('value')).toEqual('world'); - expect(flowPage.getKeyFlowOptionsByPosition(2).getAttribute('value')).toEqual('myNumber'); - expect(flowPage.getValueFlowOptionsByPosition(2).getAttribute('value')).toEqual('250.456'); - expect(flowPage.getKeyFlowOptionsByPosition(3).getAttribute('value')).toEqual('myDate'); - expect(flowPage.getValueFlowOptionsByPosition(3).getAttribute('value')).toEqual('2017-03-07'); - }); - - it ('should remove the flow options', function() { - //add one option - console.log('add one option'); - flowPage.addFlowOptionsButton().click(); - flowPage.setKeyValueFlowOptionsByPosition(4, 'removeMe', 'gone'); - flowPage.removeFlowOptionsByPositionButton(4).click(); - //verify the removed option - console.log('verify the removed option'); - appPage.entitiesTab.click(); - entityPage.isLoaded(); - appPage.flowsTab.click(); - flowPage.isLoaded(); - flowPage.clickEntityDisclosure('Product'); - browser.wait(EC.elementToBeClickable(flowPage.getFlow('Product', 'Harmonize Products', 'HARMONIZE'))); - expect(flowPage.getFlow('Product', 'Harmonize Products', 'HARMONIZE').isDisplayed()).toBe(true); - flowPage.getFlow('Product', 'Harmonize Products', 'HARMONIZE').click(); - browser.wait(EC.elementToBeClickable(flowPage.runHarmonizeButton())); - expect(flowPage.runHarmonizeButton().isDisplayed()).toBe(true); - expect(flowPage.getKeyFlowOptionsByPosition(3).getAttribute('value')).toEqual('myDate'); - expect(flowPage.getValueFlowOptionsByPosition(3).getAttribute('value')).toEqual('2017-03-07'); - //verify the flow options count - console.log('verify the flow options count'); - flowPage.getFlowOptionsCount().then(function(flowOptions){expect(flowOptions).toEqual(3)}); - });*/ }); } diff --git a/quick-start/e2e/specs/mappings/mappings.ts b/quick-start/e2e/specs/mappings/mappings.ts index de7bf56cd4..1d27aadeeb 100644 --- a/quick-start/e2e/specs/mappings/mappings.ts +++ b/quick-start/e2e/specs/mappings/mappings.ts @@ -97,7 +97,7 @@ export default function() { browser.wait(EC.elementToBeClickable(browsePage.resultsUri())); let sourceDocUriWithBigSku = browsePage.resultsSpecificUri('/board_games.csv-0-10?doc=yes&type=foo').getText(); - browser.get('http://localhost:8080/#/mappings'); + browser.get('http://localhost:8080/#/mappings'); // update the map with specific SKU doc uri await appPage.mappingsTab.click(); mappingsPage.isLoaded(); @@ -145,6 +145,12 @@ export default function() { await appPage.flowsTab.click(); flowPage.isLoaded(); }); + + it ('should redeploy modules', async function() { + browser.get('http://localhost:8080/#/flows'); + await flowPage.redeployButton.click(); + browser.sleep(5000); + }); it('should create Harmonize SKU flow on Product', async function() { browser.get('http://localhost:8080/#/flows'); diff --git a/quick-start/e2e/specs/mappings/typeAhead.ts b/quick-start/e2e/specs/mappings/typeAhead.ts index dfcb77fbd5..4540b086ff 100644 --- a/quick-start/e2e/specs/mappings/typeAhead.ts +++ b/quick-start/e2e/specs/mappings/typeAhead.ts @@ -29,6 +29,7 @@ export default function() { browser.wait(EC.elementToBeClickable(flowPage.getFlow('WorldBank', 'Load WorldBank', 'INPUT'))); expect(flowPage.getFlow('WorldBank', 'Load WorldBank', 'INPUT').isDisplayed()). toBe(true, 'Load WorldBank' + ' is not present'); + browser.sleep(5000); }); it ('should redeploy modules', async function() { @@ -104,8 +105,8 @@ export default function() { browser.wait(EC.elementToBeClickable(entityPage.confirmDialogYesButton)); expect(entityPage.confirmDialogYesButton.isDisplayed()).toBe(true); await entityPage.confirmDialogYesButton.click(); - browser.wait(EC.presenceOf(entityPage.toast)); - browser.wait(EC.stalenessOf(entityPage.toast)); + //browser.wait(EC.presenceOf(entityPage.toast)); + //browser.wait(EC.stalenessOf(entityPage.toast)); }); it('should create a mapping for WorldBank entity', async function() { @@ -208,7 +209,7 @@ export default function() { await appPage.flowsTab.click(); flowPage.isLoaded(); }); - + it ('should redeploy modules', async function() { browser.get('http://localhost:8080/#/flows'); await flowPage.redeployButton.click(); diff --git a/quick-start/e2e/specs/run/run.ts b/quick-start/e2e/specs/run/run.ts index 5955c7ab1b..9c2c0c7c7d 100644 --- a/quick-start/e2e/specs/run/run.ts +++ b/quick-start/e2e/specs/run/run.ts @@ -6,6 +6,7 @@ import jobsPage from '../../page-objects/jobs/jobs'; import browsePage from '../../page-objects/browse/browse'; import viewerPage from '../../page-objects/viewer/viewer'; import appPage from '../../page-objects/appPage'; +import { AngularWaitBarrier } from 'blocking-proxy/built/lib/angular_wait_barrier'; const fs = require('fs-extra'); export default function(tmpDir) { @@ -41,6 +42,17 @@ export default function(tmpDir) { browsePage.isLoaded(); browser.wait(EC.visibilityOf(browsePage.resultsPagination())); expect(browsePage.resultsPagination().getText()).toContain('Showing Results 1 to 10 of 456'); + // verify entity only checkbox + await browsePage.entitiesOnlyChkBox().click(); + browser.sleep(5000); + browser.wait(EC.visibilityOf(browsePage.resultsPagination())); + // verify it's returning the entities only result + expect(browsePage.resultsPagination().getText()).toContain('Showing Results 1 to 10 of 450'); + // clear the checkbox, results should include non-entities + await browsePage.entitiesOnlyChkBox().click(); + browser.sleep(5000); + browser.wait(EC.visibilityOf(browsePage.resultsPagination())); + expect(browsePage.resultsPagination().getText()).toContain('Showing Results 1 to 10 of 456'); await browsePage.databaseDropDown().click(); await browsePage.selectDatabase('STAGING').click(); browser.wait(EC.elementToBeClickable(browsePage.resultsUri())); @@ -56,7 +68,8 @@ export default function(tmpDir) { expect(viewerPage.verifyVariableName('sku').isPresent()).toBeTruthy(); expect(viewerPage.verifyStringName('442403950907').isPresent()).toBeTruthy(); expect(viewerPage.verifyVariableName('attachments').isPresent()).toBeTruthy(); - expect(viewerPage.verifyVariableName('null').isPresent()).toBeTruthy(); + //need to modify the verification as it's an atomic value now + //expect(viewerPage.verifyVariableName('null').isPresent()).toBeTruthy(); expect(viewerPage.verifyVariableName('opt1').isPresent()).toBeFalsy(); expect(viewerPage.verifyStringName('world').isPresent()).toBeFalsy(); //verfiy on dashboard page diff --git a/quick-start/e2e/specs/uninstall/uninstall.ts b/quick-start/e2e/specs/uninstall/uninstall.ts index 654d368152..a76531a46b 100644 --- a/quick-start/e2e/specs/uninstall/uninstall.ts +++ b/quick-start/e2e/specs/uninstall/uninstall.ts @@ -25,7 +25,7 @@ export default function(tmpDir) { }); it ('should uninstall the hub', function() { - loginPage.isLoadedWithtimeout(200000); + loginPage.isLoadedWithtimeout(240000); }); it ('should remove the temp folder', function() { diff --git a/quick-start/gradle.properties b/quick-start/gradle.properties index 6c76c733f8..24ee0d2c38 100644 --- a/quick-start/gradle.properties +++ b/quick-start/gradle.properties @@ -1,5 +1,5 @@ # -# Copyright 2012-2018 MarkLogic Corporation +# Copyright 2012-2019 MarkLogic Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # What version of DHF am I intending on targetting? Make sure you use the full SemVer x.x.x -mlDHFVersion=4.0-SNAPSHOT +mlDHFVersion=5.0-SNAPSHOT mlHost=localhost mlAppName=data-hub diff --git a/quick-start/package-lock.json b/quick-start/package-lock.json index e7e46eb3f4..37c2d53105 100644 --- a/quick-start/package-lock.json +++ b/quick-start/package-lock.json @@ -5,205 +5,309 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.8.4.tgz", - "integrity": "sha512-Xg/HgFgE3zu1jwI6quCRaGQK0dWyaK2GOYp2n1a+yQ8E+yngQqFW1EsdQE9L8EV1XtVL8njunZ/oOEL/KI6Oxw==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.12.2.tgz", + "integrity": "sha512-32Eim3PM/CJKGcCF1FJQ91ohuF2vBGMd4t1DILaoOMXHWmPLI9N4ILzWHfqFLRvb8QFgLn4VNG7CI9K7GcSBlQ==", "dev": true, "requires": { - "@angular-devkit/core": "0.8.4", - "rxjs": "6.2.2" + "@angular-devkit/core": "7.2.2", + "rxjs": "6.3.3" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.4.tgz", - "integrity": "sha512-oqMHezbIZMApud9JZDupWaxJeczTA17hLFGJ1qyAaPBRADtjnuguygXLcBLzYYAhzHKstrHwPJ4R1jj3oG28Ow==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.2.tgz", + "integrity": "sha512-gDF8iXiPN870WuBMl7bCQ5+Qz5SjGL/qMcvP4hli5hkn+kMAhgG38ligUK1bbhPQUJ+Z/nSOEmyv8gLHO09SZg==", "dev": true, "requires": { - "ajv": "6.4.0", + "ajv": "6.6.2", "chokidar": "2.0.4", - "rxjs": "6.2.2", - "source-map": "0.5.7" + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" } }, - "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { - "tslib": "1.9.0" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, "@angular-devkit/build-angular": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.8.4.tgz", - "integrity": "sha512-ff4MNIwcmDRcsrNrL9dURR/EAT04nUUfiqAz4LKF9Lyj0dnKkZNn1ff08PO/EVXlgFX97XEfSXv29OhlMSJ40A==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.8.4", - "@angular-devkit/build-optimizer": "0.8.4", - "@angular-devkit/build-webpack": "0.8.4", - "@angular-devkit/core": "0.8.4", - "@ngtools/webpack": "6.2.4", - "ajv": "6.4.0", - "autoprefixer": "8.6.5", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.12.2.tgz", + "integrity": "sha512-4PDykCNDjjFo6Ximhq2efiufoUP6pj8KvhB8UI03mLbn/Os1W0y1lmiPJn+NjeBLwFWH9DqW9Vxk/pYek7MtEA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.12.2", + "@angular-devkit/build-optimizer": "0.12.2", + "@angular-devkit/build-webpack": "0.12.2", + "@angular-devkit/core": "7.2.2", + "@ngtools/webpack": "7.2.2", + "ajv": "6.6.2", + "autoprefixer": "9.4.3", "circular-dependency-plugin": "5.0.2", "clean-css": "4.2.1", - "copy-webpack-plugin": "4.5.2", - "file-loader": "1.1.11", - "glob": "7.1.2", - "html-webpack-plugin": "3.2.0", + "copy-webpack-plugin": "4.6.0", + "file-loader": "2.0.0", + "glob": "7.1.3", "istanbul": "0.4.5", "istanbul-instrumenter-loader": "3.0.1", "karma-source-map-support": "1.3.0", - "less": "3.8.1", + "less": "3.9.0", "less-loader": "4.1.0", - "license-webpack-plugin": "1.5.0", + "license-webpack-plugin": "2.0.4", "loader-utils": "1.1.0", - "mini-css-extract-plugin": "0.4.3", + "mini-css-extract-plugin": "0.4.4", "minimatch": "3.0.4", - "node-sass": "4.9.3", + "node-sass": "4.10.0", "opn": "5.3.0", "parse5": "4.0.0", "portfinder": "1.0.17", - "postcss": "6.0.22", - "postcss-import": "11.1.0", - "postcss-loader": "2.1.6", - "postcss-url": "7.3.2", + "postcss": "7.0.11", + "postcss-import": "12.0.0", + "postcss-loader": "3.0.0", "raw-loader": "0.5.1", - "rxjs": "6.2.2", + "rxjs": "6.3.3", "sass-loader": "7.1.0", "semver": "5.5.1", "source-map-loader": "0.2.4", "source-map-support": "0.5.9", - "stats-webpack-plugin": "0.6.2", - "style-loader": "0.21.0", + "speed-measure-webpack-plugin": "1.2.5", + "stats-webpack-plugin": "0.7.0", + "style-loader": "0.23.1", "stylus": "0.54.5", "stylus-loader": "3.0.2", + "terser-webpack-plugin": "1.2.1", "tree-kill": "1.2.0", - "uglifyjs-webpack-plugin": "1.2.5", - "url-loader": "1.1.1", - "webpack": "4.20.2", + "webpack": "4.28.4", "webpack-dev-middleware": "3.4.0", - "webpack-dev-server": "3.1.9", + "webpack-dev-server": "3.1.14", "webpack-merge": "4.1.4", - "webpack-sources": "1.1.0", + "webpack-sources": "1.3.0", "webpack-subresource-integrity": "1.1.0-rc.6" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.4.tgz", - "integrity": "sha512-oqMHezbIZMApud9JZDupWaxJeczTA17hLFGJ1qyAaPBRADtjnuguygXLcBLzYYAhzHKstrHwPJ4R1jj3oG28Ow==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.2.tgz", + "integrity": "sha512-gDF8iXiPN870WuBMl7bCQ5+Qz5SjGL/qMcvP4hli5hkn+kMAhgG38ligUK1bbhPQUJ+Z/nSOEmyv8gLHO09SZg==", "dev": true, "requires": { - "ajv": "6.4.0", + "ajv": "6.6.2", "chokidar": "2.0.4", - "rxjs": "6.2.2", - "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=", - "dev": true - } + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" } }, - "postcss-loader": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.6.tgz", - "integrity": "sha512-hgiWSc13xVQAq25cVw80CH0l49ZKlAnU1hKPOdRrNj89bokRr/bZF2nT+hebPPF9c9xs8c3gw3Fr2nxtmXYnNg==", + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "postcss": "6.0.22", - "postcss-load-config": "2.0.0", - "schema-utils": "0.4.5" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, + "optional": true, "requires": { - "tslib": "1.9.0" + "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" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "node-sass": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.10.0.tgz", + "integrity": "sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==", + "dev": true, + "optional": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + } + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" + "is-wsl": "^1.1.0" } + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true, + "optional": true + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true } } }, "@angular-devkit/build-optimizer": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.8.4.tgz", - "integrity": "sha512-pqfB2qrFz5ZEJEP1of8P+knwV/GqoP5trLx247E1nwb512P8aLdHqVbMNgUzZmKxfL2GXO6fmLuuT2aEX93Zbg==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.12.2.tgz", + "integrity": "sha512-5SARSE18X5/churU0Qc0gOfDt5EwuwKsJmIA7hHBzi44iotQm5c8ea0q0acua4/U4K+jOsF6A4Faa08Vr2624A==", "dev": true, "requires": { "loader-utils": "1.1.0", - "source-map": "0.5.7", - "typescript": "2.9.2", - "webpack-sources": "1.1.0" + "source-map": "0.5.6", + "typescript": "3.2.2", + "webpack-sources": "1.2.0" }, "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", "dev": true + }, + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } } } }, "@angular-devkit/build-webpack": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.8.4.tgz", - "integrity": "sha512-T1RZusHSpVvorrYVySKDANQSP7vbpyQknpkL+xjiA8DG9Ep/TJbSRuETFFLdyYjPoXvQrXm8d3+twBrZposVdw==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.12.2.tgz", + "integrity": "sha512-Uv3f8XJc/5UTj2T7XjxFYDhuybFIIitLGxBpp/hEIc7eXI4MsJKB6CoDJy+2BQch7c/QjKH7W3dmTxzuSJ2j3g==", "dev": true, "requires": { - "@angular-devkit/architect": "0.8.4", - "@angular-devkit/core": "0.8.4", - "rxjs": "6.2.2" + "@angular-devkit/architect": "0.12.2", + "@angular-devkit/core": "7.2.2", + "rxjs": "6.3.3" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.4.tgz", - "integrity": "sha512-oqMHezbIZMApud9JZDupWaxJeczTA17hLFGJ1qyAaPBRADtjnuguygXLcBLzYYAhzHKstrHwPJ4R1jj3oG28Ow==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.2.tgz", + "integrity": "sha512-gDF8iXiPN870WuBMl7bCQ5+Qz5SjGL/qMcvP4hli5hkn+kMAhgG38ligUK1bbhPQUJ+Z/nSOEmyv8gLHO09SZg==", "dev": true, "requires": { - "ajv": "6.4.0", + "ajv": "6.6.2", "chokidar": "2.0.4", - "rxjs": "6.2.2", - "source-map": "0.5.7" + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" } }, - "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { - "tslib": "1.9.0" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, @@ -213,26 +317,61 @@ "integrity": "sha512-rkIa1OSVWTt4g9leLSK/PsqOj3HZbDKHbZjqlslyfVa3AyCeiumFoOgViOVXlYgPX3HHDbE5uH24nyUWSD8uww==", "dev": true, "requires": { - "ajv": "6.4.0", - "chokidar": "2.0.4", - "rxjs": "6.3.3", - "source-map": "0.5.7" + "ajv": "~6.4.0", + "chokidar": "^2.0.3", + "rxjs": "^6.0.0", + "source-map": "^0.5.6" + }, + "dependencies": { + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + } } }, "@angular-devkit/schematics": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.8.4.tgz", - "integrity": "sha512-Wt2JE/PnwtJiy8yCPEKP//1FnCumXiXX3HU/FosWufDtMga3qc2MWFwrNWlm4GCbpfNbBXj0LuJwfcwi27Hhdg==", + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.8.9.tgz", + "integrity": "sha512-JZiK1aHJUFV6xDtUMBLoH3cLgi7EtR1bXjNqqa11MAjnHMqzm2GBazPvzGkMwVbCxC1sdYgswwGX9GS2tpHawA==", "dev": true, "requires": { - "@angular-devkit/core": "0.8.4", + "@angular-devkit/core": "0.8.9", "rxjs": "6.2.2" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.4.tgz", - "integrity": "sha512-oqMHezbIZMApud9JZDupWaxJeczTA17hLFGJ1qyAaPBRADtjnuguygXLcBLzYYAhzHKstrHwPJ4R1jj3oG28Ow==", + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.9.tgz", + "integrity": "sha512-Umax3YKBPTQy360TeoSNaIIOJOKoXvN/S2WNTV8wDjSWWNiWLTIlckWMb9DVsafAifjUi0mtOLRFuM4YatKgTw==", "dev": true, "requires": { "ajv": "6.4.0", @@ -241,13 +380,46 @@ "source-map": "0.5.7" } }, + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, "rxjs": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" + } + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "^2.1.0" } } } @@ -268,36 +440,50 @@ "integrity": "sha512-2njYmuAnmSmMDb60unpnFTLBdNA4gSiDV4U37ciLkbV93D5+EQCKomA92BKQ2BiE6HKfT0tjDLqpYH0AQCBQsA==" }, "@angular/animations": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-6.1.9.tgz", - "integrity": "sha512-bPl5fNn4ja1S2Bn4xRT93wYqx0KjvZrX1FjpQltkf9dMmAdVpYj7spy+eYgClAMfZMWv7pa70F+FtSDkWbgRsA==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-6.1.10.tgz", + "integrity": "sha512-dd/lq7kw3uwfHPICan8psu2nthuUpp7PvMLuNIm0XxObZ4oNs0ls6uxKEDPnEkRKoGdiJpvmsyzZZN9ACMPEAA==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@angular/cli": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-6.2.4.tgz", - "integrity": "sha512-Jl902wCgiV/tI3QM4W6aadEb2LPIS0t30wfAr+ikz7n2V3j3Ovf9iWM0ds4zZMreZfeoz4rCU/4FaKg1UbJvBA==", + "version": "6.2.9", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-6.2.9.tgz", + "integrity": "sha512-4xuTbmMKGx1bMi0KA3Xmtx/emy10wlSwTXoUijlhd2tcWmlI2wRjAYjR7efSbFo8dVskiq0CyAVFWr1IanYQZw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.8.4", - "@angular-devkit/core": "0.8.4", - "@angular-devkit/schematics": "0.8.4", - "@schematics/angular": "0.8.4", - "@schematics/update": "0.8.4", + "@angular-devkit/architect": "0.8.9", + "@angular-devkit/core": "0.8.9", + "@angular-devkit/schematics": "0.8.9", + "@schematics/angular": "0.8.9", + "@schematics/update": "0.8.9", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", "json-schema-traverse": "0.4.1", - "opn": "5.3.0", + "npm-package-arg": "6.1.0", + "opn": "5.4.0", + "pacote": "9.2.3", "rxjs": "6.2.2", - "semver": "5.5.1", + "semver": "5.6.0", "symbol-observable": "1.2.0", "yargs-parser": "10.1.0" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.8.9.tgz", + "integrity": "sha512-2tiGPkvJyFY/G3a27uC8r6Jj3H5m8SxjMqhjNUQ5AtNumweTBPt3YIYMNAvHUmxG0nA9upDolVXFmoQGK9AhKQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.8.9", + "rxjs": "6.2.2" + } + }, "@angular-devkit/core": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.4.tgz", - "integrity": "sha512-oqMHezbIZMApud9JZDupWaxJeczTA17hLFGJ1qyAaPBRADtjnuguygXLcBLzYYAhzHKstrHwPJ4R1jj3oG28Ow==", + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.9.tgz", + "integrity": "sha512-Umax3YKBPTQy360TeoSNaIIOJOKoXvN/S2WNTV8wDjSWWNiWLTIlckWMb9DVsafAifjUi0mtOLRFuM4YatKgTw==", "dev": true, "requires": { "ajv": "6.4.0", @@ -306,10 +492,36 @@ "source-map": "0.5.7" } }, - "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==", + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" + }, + "dependencies": { + "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=", + "dev": true + } + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "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=", "dev": true }, "rxjs": { @@ -318,37 +530,55 @@ "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" + } + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" } } } }, "@angular/common": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.1.9.tgz", - "integrity": "sha512-i35FiFxHC/vBfyYEdprgbedxWuimCbqGSdSQpBUE4jNka80EifG2IAHIk/vAG98z7LSUyo6n7nf6iFDY3GrYZA==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.1.10.tgz", + "integrity": "sha512-73xxTSYJNKfiJ7C1Ajg+sz5l8y+blb/vNgHYg7O3yem5zLBnfPpidJ1UGg4W4d2Y+jwUVJbZKh8SKJarqAJVUQ==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@angular/compiler": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-6.1.9.tgz", - "integrity": "sha512-TY6axB1c7VvYXf+ebFDq3Ej+edgii3CDxew8HnyTFAWeDF2Gh8io1vTYwtdyDka6U53ASaheM1HpiUjzvYH0jQ==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-6.1.10.tgz", + "integrity": "sha512-FPIb2j3zfoBwb6vo/u0gQeu70h8InGlSisBr3xMACs/35/pwB6kbQR+JQiUr0D7k6QApg7AuMkvq8aFNelg0aw==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@angular/compiler-cli": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-6.1.9.tgz", - "integrity": "sha512-/+Gh/I40KhwcLKiLpzYzZwPm78O2p6zxJxBmJA3gySCtl6iaxXq7wHvc63wa/6ESSvGWW0/WkZAr3m3GECx5Tg==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-6.1.10.tgz", + "integrity": "sha512-GCWdyeNQSnF4RfzO4A0+WHsNEgxKpl5arg4ldLSWMNkj/DrhMD4TnmxhR+IVY+7ieMkUBwpcuWRnjdOdnbmV+w==", "dev": true, "requires": { - "chokidar": "1.7.0", - "minimist": "1.2.0", - "reflect-metadata": "0.1.12", - "tsickle": "0.32.1" + "chokidar": "^1.4.2", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "tsickle": "^0.32.1" }, "dependencies": { "anymatch": { @@ -357,8 +587,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "arr-diff": { @@ -367,7 +597,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -382,9 +612,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "chokidar": { @@ -393,15 +623,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.2.4", - "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" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "expand-brackets": { @@ -410,7 +640,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -419,7 +649,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "glob-parent": { @@ -428,7 +658,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "is-extglob": { @@ -443,7 +673,16 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" } }, "micromatch": { @@ -452,75 +691,75 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "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" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } }, "@angular/core": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.1.9.tgz", - "integrity": "sha512-V4XuBvQtS98guRV0Fq661hG9Ij0+4oWyHvIrnqZckuQ9D1G8NSJyZ/Lfh0kBB1cl+mnGe/J9XN1avW7liswDNQ==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.1.10.tgz", + "integrity": "sha512-61l3rIQTVdT45eOf6/fBJIeVmV10mcrxqS4N/1OWkuDT29YSJTZSxGcv8QjAyyutuhcqWWpO6gVRkN07rWmkPg==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@angular/forms": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-6.1.9.tgz", - "integrity": "sha512-gNwTCA0nzUR4LlXWPdfYBA+chq4X9mvOBo46+M44TevNwEsip6iSZKp7no9O5dquALOZ2HpFRuRkPoH4lXuVYA==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-6.1.10.tgz", + "integrity": "sha512-zAPx2kMV1/FbP5DrY472Sd/ze1m+GS6T5ullZCtP392r62p2RkwzDCXieR51YiRJjZj3M6c3AcRND7PWBdXT7A==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@angular/http": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-6.1.9.tgz", - "integrity": "sha512-Tm6SA7QIKGT4Bb+xlyPG+ZXrwniNwF+/ejsKcBar8xaligW4+R9oo5Ql6t4HpjafkWIPLBEXyxaiVq1nWPyz7g==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-6.1.10.tgz", + "integrity": "sha512-LDsSqyexh8fj23y+G2oSGLWSZVhbxBBo2ehYHnRgH/jlp0pmZVLRaGgUMNSCVtZc1rxLzpEjZjtw+P+qlutAtw==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@angular/language-service": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-6.1.9.tgz", - "integrity": "sha512-xm3lbJYelyq02iLdS4gpymuHc8WadoPRCYMHW5Ond7kD+05JGt8smYEGOAcjSt0NJrpmkPWnTzlFlXxWYLQNdw==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-6.1.10.tgz", + "integrity": "sha512-nN29Ovomg21eL8acwOSUFAYwWFI1TuFwUgUu37ZssfVQrYdaV+BFx3yv3P0nKU90h3Hp+oIkWHd8U34UYrvBCg==", "dev": true }, "@angular/platform-browser": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.1.9.tgz", - "integrity": "sha512-/OpLZxpAQW912DnY4/RX0VLYJJ+TaCWMVP/tg7CBYaPpeJve7GHXfZLSJ1p95RhnSyohTYtdtbHG0NDuG8dgqw==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.1.10.tgz", + "integrity": "sha512-CB7pqMwtgb7KjdHDAJlsXcs0rrU+2xQVaoOaqEfJtUrKhtGMLaZh8Qoic5l92SoGattkOw7SYarAOsWlAsVfvw==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@angular/platform-browser-dynamic": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.1.9.tgz", - "integrity": "sha512-PGng7UCrWc5gCNxKo94VSWq0SRdN4jUeTCnX7tEI//Qu+dQPolJkUHPgD9A5UH1pSOEYl/2z+S2bayu+z+9o2w==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.1.10.tgz", + "integrity": "sha512-DmBSUyFPoyKqkmBXyJ2CrP1oXDioeoBlPA8lmWUDUv2yBuoHIzIkdY/OkTZbdyu/QYa1hK2Jl9OlfoeoenKddg==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@angular/router": { - "version": "6.1.9", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-6.1.9.tgz", - "integrity": "sha512-FQksj8DiiWiY9o/1Ppq335Lr3d5wW3Odzg3yWC3JgFN37GMdCQxX71TX5ls8JeVspTiOeP9Lty99vDgfIcl+9A==", + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-6.1.10.tgz", + "integrity": "sha512-tekI3dkdvd65oMoxjjgRA+16uDgPUBWHhYxids6pgO8vobZNtCo8VaVlcDyLUhdmtS5kONELx0iL5E2M0Y2Bag==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "@babel/code-frame": { @@ -528,62 +767,40 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", "requires": { - "@babel/highlight": "7.0.0" + "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.2.tgz", - "integrity": "sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw==", - "requires": { - "@babel/code-frame": "7.0.0", - "@babel/generator": "7.1.2", - "@babel/helpers": "7.1.2", - "@babel/parser": "7.1.2", - "@babel/template": "7.1.2", - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.2", - "convert-source-map": "1.5.1", - "debug": "3.2.5", - "json5": "0.5.1", - "lodash": "4.17.11", - "resolve": "1.5.0", - "semver": "5.5.1", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", - "requires": { - "ms": "2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", + "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helpers": "^7.2.0", + "@babel/parser": "^7.2.2", + "@babel/template": "^7.2.2", + "@babel/traverse": "^7.2.2", + "@babel/types": "^7.2.2", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.10", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" } }, "@babel/generator": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.2.tgz", - "integrity": "sha512-70A9HWLS/1RHk3Ck8tNHKxOoKQuSKocYgwDN85Pyl/RBduss6AKxUR7RIZ/lzduQMSYfWEM4DDBu6A+XGbkFig==", - "requires": { - "@babel/types": "7.1.2", - "jsesc": "2.5.1", - "lodash": "4.17.11", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz", - "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=" - } + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.0.tgz", + "integrity": "sha512-dZTwMvTgWfhmibq4V9X+LMf6Bgl7zAodRn9PvcPdhlzFMbvUutx74dbEv7Atz3ToeEpevYEJtAwfxq/bDCzHWg==", + "requires": { + "@babel/types": "^7.3.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.10", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" } }, "@babel/helper-annotate-as-pure": { @@ -592,7 +809,7 @@ "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==", "dev": true, "requires": { - "@babel/types": "7.1.2" + "@babel/types": "^7.0.0" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -601,8 +818,8 @@ "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "7.1.0", - "@babel/types": "7.1.2" + "@babel/helper-explode-assignable-expression": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-call-delegate": { @@ -611,9 +828,22 @@ "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "7.0.0", - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.2" + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.0.tgz", + "integrity": "sha512-DUsQNS2CGLZZ7I3W3fvh0YpPDd6BuWJlDl+qmZZpABZHza2ErE3LxtEzLJFHFC1ZwtlAXvHhbFYbtM5o5B0WBw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.2.3" } }, "@babel/helper-define-map": { @@ -622,9 +852,9 @@ "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/types": "7.1.2", - "lodash": "4.17.11" + "@babel/helper-function-name": "^7.1.0", + "@babel/types": "^7.0.0", + "lodash": "^4.17.10" } }, "@babel/helper-explode-assignable-expression": { @@ -633,8 +863,8 @@ "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==", "dev": true, "requires": { - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.2" + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-function-name": { @@ -642,9 +872,9 @@ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", "requires": { - "@babel/helper-get-function-arity": "7.0.0", - "@babel/template": "7.1.2", - "@babel/types": "7.1.2" + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-get-function-arity": { @@ -652,7 +882,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", "requires": { - "@babel/types": "7.1.2" + "@babel/types": "^7.0.0" } }, "@babel/helper-hoist-variables": { @@ -661,7 +891,7 @@ "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", "dev": true, "requires": { - "@babel/types": "7.1.2" + "@babel/types": "^7.0.0" } }, "@babel/helper-member-expression-to-functions": { @@ -670,7 +900,7 @@ "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==", "dev": true, "requires": { - "@babel/types": "7.1.2" + "@babel/types": "^7.0.0" } }, "@babel/helper-module-imports": { @@ -679,21 +909,21 @@ "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==", "dev": true, "requires": { - "@babel/types": "7.1.2" + "@babel/types": "^7.0.0" } }, "@babel/helper-module-transforms": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.1.0.tgz", - "integrity": "sha512-0JZRd2yhawo79Rcm4w0LwSMILFmFXjugG3yqf+P/UsKsRS1mJCmMwwlHDlMg7Avr9LrvSpp4ZSULO9r8jpCzcw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz", + "integrity": "sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA==", "dev": true, "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-simple-access": "7.1.0", - "@babel/helper-split-export-declaration": "7.0.0", - "@babel/template": "7.1.2", - "@babel/types": "7.1.2", - "lodash": "4.17.11" + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/template": "^7.2.2", + "@babel/types": "^7.2.2", + "lodash": "^4.17.10" } }, "@babel/helper-optimise-call-expression": { @@ -702,7 +932,7 @@ "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==", "dev": true, "requires": { - "@babel/types": "7.1.2" + "@babel/types": "^7.0.0" } }, "@babel/helper-plugin-utils": { @@ -717,7 +947,7 @@ "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", "dev": true, "requires": { - "lodash": "4.17.11" + "lodash": "^4.17.10" } }, "@babel/helper-remap-async-to-generator": { @@ -726,23 +956,23 @@ "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-wrap-function": "7.1.0", - "@babel/template": "7.1.2", - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.2" + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-wrap-function": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-replace-supers": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.1.0.tgz", - "integrity": "sha512-BvcDWYZRWVuDeXTYZWxekQNO5D4kO55aArwZOTFXw6rlLQA8ZaDicJR1sO47h+HrnCiDFiww0fSPV0d713KBGQ==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz", + "integrity": "sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "7.0.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.2" + "@babel/helper-member-expression-to-functions": "^7.0.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/traverse": "^7.2.3", + "@babel/types": "^7.0.0" } }, "@babel/helper-simple-access": { @@ -751,8 +981,8 @@ "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==", "dev": true, "requires": { - "@babel/template": "7.1.2", - "@babel/types": "7.1.2" + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" } }, "@babel/helper-split-export-declaration": { @@ -760,29 +990,29 @@ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", "requires": { - "@babel/types": "7.1.2" + "@babel/types": "^7.0.0" } }, "@babel/helper-wrap-function": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.1.0.tgz", - "integrity": "sha512-R6HU3dete+rwsdAfrOzTlE9Mcpk4RjU3aX3gi9grtmugQY0u79X7eogUvfXA5sI81Mfq1cn6AgxihfN33STjJA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", + "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==", "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/template": "7.1.2", - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.2" + "@babel/helper-function-name": "^7.1.0", + "@babel/template": "^7.1.0", + "@babel/traverse": "^7.1.0", + "@babel/types": "^7.2.0" } }, "@babel/helpers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.2.tgz", - "integrity": "sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.1.tgz", + "integrity": "sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA==", "requires": { - "@babel/template": "7.1.2", - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.2" + "@babel/template": "^7.1.2", + "@babel/traverse": "^7.1.5", + "@babel/types": "^7.3.0" } }, "@babel/highlight": { @@ -790,374 +1020,293 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", "requires": { - "chalk": "2.2.2", - "esutils": "2.0.2", - "js-tokens": "4.0.0" - }, - "dependencies": { - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - } + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.2.tgz", - "integrity": "sha512-x5HFsW+E/nQalGMw7hu+fvPqnBeBaIr0lWJ2SG0PPL2j+Pm9lYvCrsZJGIgauPIENx0v10INIyFjmSNUD/gSqQ==" + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.1.tgz", + "integrity": "sha512-ATz6yX/L8LEnC3dtLQnIx4ydcPxhLcoy9Vl6re00zb2w5lG6itY6Vhnr1KFRPq/FHNsgl/gh2mjNN20f9iJTTA==" }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.1.0.tgz", - "integrity": "sha512-Fq803F3Jcxo20MXUSDdmZZXrPe6BWyGcWBPPNB/M7WaUYESKDeKMOGIxEzQOjGSmW/NWb6UaPZrtTB2ekhB/ew==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz", + "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0", - "@babel/plugin-syntax-async-generators": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0", + "@babel/plugin-syntax-async-generators": "^7.2.0" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.1.0.tgz", - "integrity": "sha512-/PCJWN+CKt5v1xcGn4vnuu13QDoV+P7NcICP44BoonAJoPSGwVkgrXihFIQGiEjjPlUDBIw1cM7wYFLARS2/hw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz", + "integrity": "sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg==", "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/helper-member-expression-to-functions": "7.0.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.1.0", - "@babel/plugin-syntax-class-properties": "7.0.0" + "@babel/helper-create-class-features-plugin": "^7.3.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz", - "integrity": "sha512-kfVdUkIAGJIVmHmtS/40i/fg/AGnw/rsZBCaapY5yjeO5RA9m165Xbw9KMOu2nqXP5dTFjEjHdfNdoVcHv133Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz", + "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-json-strings": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.2.0" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz", - "integrity": "sha512-14fhfoPcNu7itSen7Py1iGN0gEm87hX/B+8nZPqkdmANyyYWYMY2pjA3r8WXbWVKMzfnSNS0xY8GVS0IjXi/iw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.1.tgz", + "integrity": "sha512-Nmmv1+3LqxJu/V5jU9vJmxR/KIRWFk2qLHmbB56yRRRFhlaSuOVXscX3gUmhaKgUhzA3otOHVubbIEVYsZ0eZg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-object-rest-spread": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0" } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz", - "integrity": "sha512-JPqAvLG1s13B/AuoBjdBYvn38RqW6n1TzrQO839/sIpqLpbnXKacsAgpZHzLD83Sm8SDXMkkrAvEnJ25+0yIpw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz", - "integrity": "sha512-tM3icA6GhC3ch2SkmSxv7J/hCWKISzwycub6eGsDrFDgukD4dZ/I+x81XgW0YslS6mzNuQ1Cbzh5osjIMgepPQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", + "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0", - "regexpu-core": "4.2.0" - }, - "dependencies": { - "regexpu-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", - "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "7.0.0", - "regjsgen": "0.4.0", - "regjsparser": "0.3.0", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.0.2" - } - }, - "regjsgen": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", - "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", - "dev": true - }, - "regjsparser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", - "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - } + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.2.0" } }, "@babel/plugin-syntax-async-generators": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz", - "integrity": "sha512-im7ged00ddGKAjcZgewXmp1vxSZQQywuQXe2B1A7kajjZmDeY/ekMPmWr9zJgveSaQH0k7BcGrojQhcK06l0zA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz", + "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0.tgz", - "integrity": "sha512-cR12g0Qzn4sgkjrbrzWy2GE7m9vMl/sFkqZ3gIpAQdrvPDnLM8180i+ANDFIXfjHo9aqp0ccJlQ0QNZcFUbf9w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-json-strings": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz", - "integrity": "sha512-UlSfNydC+XLj4bw7ijpldc1uZ/HB84vw+U6BTuqMdIEmz/LDe63w/GHtpQMdXWdqQZFeAI9PjnHe/vDhwirhKA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz", + "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz", - "integrity": "sha512-5A0n4p6bIiVe5OvQPxBnesezsgFJdHhSs3uFSvaPdMqtsovajLZ+G2vZyvNe10EzJBWWo3AcHGKhAFUxqwp2dw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", + "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz", - "integrity": "sha512-Wc+HVvwjcq5qBg1w5RG9o9RVzmCaAg/Vp0erHCKpAYV8La6I94o4GQAmFYNmkzoMO6gzoOSulpKeSSz6mPEoZw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz", + "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz", - "integrity": "sha512-2EZDBl1WIO/q4DIkIp4s86sdp4ZifL51MoIviLY/gG/mLSuOIEg7J8o6mhbxOTvUJkaN50n+8u41FVsr5KLy/w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz", + "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.1.0.tgz", - "integrity": "sha512-rNmcmoQ78IrvNCIt/R9U+cixUHeYAzgusTFgIAv+wQb9HJU4szhpDD6e5GCACmj/JP5KxuCwM96bX3L9v4ZN/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz", + "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-remap-async-to-generator": "7.1.0" + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.1.0" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz", - "integrity": "sha512-AOBiyUp7vYTqz2Jibe1UaAWL0Hl9JUXEgjFvvvcSc9MVDItv46ViXFw2F7SVt1B5k+KWjl44eeXOAk3UDEaJjQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz", + "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz", - "integrity": "sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz", + "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "lodash": "4.17.11" + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.10" } }, "@babel/plugin-transform-classes": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.1.0.tgz", - "integrity": "sha512-rNaqoD+4OCBZjM7VaskladgqnZ1LO6o2UxuWSDzljzW21pN1KXkB7BstAVweZdxQkHAujps5QMNOTWesBciKFg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-define-map": "7.1.0", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-optimise-call-expression": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.1.0", - "@babel/helper-split-export-declaration": "7.0.0", - "globals": "11.8.0" - }, - "dependencies": { - "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==", - "dev": true - } + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz", + "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-define-map": "^7.1.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-optimise-call-expression": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz", - "integrity": "sha512-ubouZdChNAv4AAWAgU7QKbB93NU5sHwInEWfp+/OzJKA02E6Woh9RVoX4sZrbRwtybky/d7baTUqwFx+HgbvMA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz", + "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-destructuring": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.1.2.tgz", - "integrity": "sha512-cvToXvp/OsYxtEn57XJu9BvsGSEYjAh9UeUuXpoi7x6QHB7YdWyQ4lRU/q0Fu1IJNT0o0u4FQ1DMQBzJ8/8vZg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz", + "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz", - "integrity": "sha512-00THs8eJxOJUFVx1w8i1MBF4XH4PsAjKjQ1eqN/uCH3YKwP21GCKfrn6YZFZswbOk9+0cw1zGQPHVc1KBlSxig==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", + "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0", - "regexpu-core": "4.2.0" - }, - "dependencies": { - "regexpu-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", - "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "7.0.0", - "regjsgen": "0.4.0", - "regjsparser": "0.3.0", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.0.2" - } - }, - "regjsgen": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", - "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", - "dev": true - }, - "regjsparser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", - "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - } + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz", - "integrity": "sha512-w2vfPkMqRkdxx+C71ATLJG30PpwtTpW7DDdLqYt2acXU7YjztzeWW2Jk1T6hKqCLYCcEA5UQM/+xTAm+QCSnuQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz", + "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.1.0.tgz", - "integrity": "sha512-uZt9kD1Pp/JubkukOGQml9tqAeI8NkE98oZnHZ2qHRElmeKCodbTZgOEUtujSCSLhHSBWbzNiFSDIMC4/RBTLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz", + "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-for-of": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz", - "integrity": "sha512-TlxKecN20X2tt2UEr2LNE6aqA0oPeMT1Y3cgz8k4Dn1j5ObT8M3nl9aA37LLklx0PBZKETC9ZAf9n/6SujTuXA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", + "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.1.0.tgz", - "integrity": "sha512-VxOa1TMlFMtqPW2IDYZQaHsFrq/dDoIjgN098NowhexhZcz3UGlvPgZXuE1jEvNygyWyxRacqDpCZt+par1FNg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", + "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", "dev": true, "requires": { - "@babel/helper-function-name": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-literals": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz", - "integrity": "sha512-1NTDBWkeNXgpUcyoVFxbr9hS57EpZYXpje92zv0SUzjdu3enaRwF/l3cmyRnXLtIdyJASyiS6PtybK+CgKf7jA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz", + "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.1.0.tgz", - "integrity": "sha512-wt8P+xQ85rrnGNr2x1iV3DW32W8zrB6ctuBkYBbf5/ZzJY99Ob4MFgsZDFgczNU76iy9PWsy4EuxOliDjdKw6A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", + "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.1.0.tgz", - "integrity": "sha512-wtNwtMjn1XGwM0AXPspQgvmE6msSJP15CX2RVfpTSTNPLhKhaOjaIfBaVfj4iUZ/VrFSodcFedwtPg/NxwQlPA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", + "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-simple-access": "7.1.0" + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.1.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz", - "integrity": "sha512-8EDKMAsitLkiF/D4Zhe9CHEE2XLh4bfLbb9/Zf3FgXYQOZyZYyg7EAel/aT2A7bHv62jwHf09q2KU/oEexr83g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz", + "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.1.0.tgz", - "integrity": "sha512-enrRtn5TfRhMmbRwm7F8qOj0qEYByqUvTttPEGimcBH4CJHphjyK1Vg7sdU7JjeEmgSpM890IT/efS2nMHwYig==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz", + "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "7.1.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz", + "integrity": "sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw==", + "dev": true, + "requires": { + "regexp-tree": "^0.1.0" } }, "@babel/plugin-transform-new-target": { @@ -1166,28 +1315,28 @@ "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-object-super": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.1.0.tgz", - "integrity": "sha512-/O02Je1CRTSk2SSJaq0xjwQ8hG4zhZGNjE8psTsSNPXyLRCODv7/PBozqT5AmQMzp7MI3ndvMhGdqp9c96tTEw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz", + "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-replace-supers": "7.1.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.1.0" } }, "@babel/plugin-transform-parameters": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.1.0.tgz", - "integrity": "sha512-vHV7oxkEJ8IHxTfRr3hNGzV446GAb+0hgbA7o/0Jd76s+YzccdWuTU296FOCOl/xweU4t/Ya4g41yWz80RFCRw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz", + "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==", "dev": true, "requires": { - "@babel/helper-call-delegate": "7.1.0", - "@babel/helper-get-function-arity": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-regenerator": { @@ -1196,208 +1345,125 @@ "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==", "dev": true, "requires": { - "regenerator-transform": "0.13.3" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.1.0.tgz", - "integrity": "sha512-WFLMgzu5DLQEah0lKTJzYb14vd6UiES7PTnXcvrPZ1VrwFeJ+mTbvr65fFAsXYMt2bIoOoC0jk76zY1S7HZjUg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "resolve": "1.8.1", - "semver": "5.5.1" - }, - "dependencies": { - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true - } + "regenerator-transform": "^0.13.3" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz", - "integrity": "sha512-g/99LI4vm5iOf5r1Gdxq5Xmu91zvjhEG5+yZDJW268AZELAu4J1EiFLnkSG3yuUsZyOipVOVUKoGPYwfsTymhw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", + "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-spread": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz", - "integrity": "sha512-L702YFy2EvirrR4shTj0g2xQp7aNwZoWNCkNu2mcoU0uyzMl0XRwDSwzB/xp6DSUFiBmEXuyAyEN16LsgVqGGQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz", + "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz", - "integrity": "sha512-LFUToxiyS/WD+XEWpkx/XJBrUXKewSZpzX68s+yEOtIbdnsRjpryDw9U06gYc6klYEij/+KQVRnD3nz3AoKmjw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz", + "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" } }, "@babel/plugin-transform-template-literals": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz", - "integrity": "sha512-vA6rkTCabRZu7Nbl9DfLZE1imj4tzdWcg5vtdQGvj+OH9itNNB6hxuRMHuIY8SGnEt1T9g5foqs9LnrHzsqEFg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", + "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-annotate-as-pure": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz", - "integrity": "sha512-1r1X5DO78WnaAIvs5uC48t41LLckxsYklJrZjNKcevyz83sF2l4RHbw29qrCPr/6ksFsdfRpT/ZgxNWHXRnffg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz", + "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0" + "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz", - "integrity": "sha512-uJBrJhBOEa3D033P95nPHu3nbFwFE9ZgXsfEitzoIXIwqAZWk7uXcg06yFKXz9FSxBH5ucgU/cYdX0IV8ldHKw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", + "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "7.0.0", - "@babel/helper-regex": "7.0.0", - "regexpu-core": "4.2.0" - }, - "dependencies": { - "regexpu-core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.2.0.tgz", - "integrity": "sha512-Z835VSnJJ46CNBttalHD/dB+Sj2ezmY6Xp38npwU87peK6mqOzOpV8eYktdkLTEkzzD+JsTcxd84ozd8I14+rw==", - "dev": true, - "requires": { - "regenerate": "1.4.0", - "regenerate-unicode-properties": "7.0.0", - "regjsgen": "0.4.0", - "regjsparser": "0.3.0", - "unicode-match-property-ecmascript": "1.0.4", - "unicode-match-property-value-ecmascript": "1.0.2" - } - }, - "regjsgen": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.4.0.tgz", - "integrity": "sha512-X51Lte1gCYUdlwhF28+2YMO0U6WeN0GLpgpA7LK7mbdDnkQYiwvEpmpe0F/cv5L14EbxgrdayAG3JETBv0dbXA==", - "dev": true - }, - "regjsparser": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.3.0.tgz", - "integrity": "sha512-zza72oZBBHzt64G7DxdqrOo/30bhHkwMUoT0WqfGu98XLd7N+1tsy5MJ96Bk4MD0y74n629RhmrGW6XlnLLwCA==", - "dev": true, - "requires": { - "jsesc": "0.5.0" - } - } + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0", + "regexpu-core": "^4.1.3" } }, "@babel/preset-env": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.1.0.tgz", - "integrity": "sha512-ZLVSynfAoDHB/34A17/JCZbyrzbQj59QC1Anyueb4Bwjh373nVPq5/HMph0z+tCmcDjXDe+DlKQq9ywQuvWrQg==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "7.0.0", - "@babel/helper-plugin-utils": "7.0.0", - "@babel/plugin-proposal-async-generator-functions": "7.1.0", - "@babel/plugin-proposal-json-strings": "7.0.0", - "@babel/plugin-proposal-object-rest-spread": "7.0.0", - "@babel/plugin-proposal-optional-catch-binding": "7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "7.0.0", - "@babel/plugin-syntax-async-generators": "7.0.0", - "@babel/plugin-syntax-object-rest-spread": "7.0.0", - "@babel/plugin-syntax-optional-catch-binding": "7.0.0", - "@babel/plugin-transform-arrow-functions": "7.0.0", - "@babel/plugin-transform-async-to-generator": "7.1.0", - "@babel/plugin-transform-block-scoped-functions": "7.0.0", - "@babel/plugin-transform-block-scoping": "7.0.0", - "@babel/plugin-transform-classes": "7.1.0", - "@babel/plugin-transform-computed-properties": "7.0.0", - "@babel/plugin-transform-destructuring": "7.1.2", - "@babel/plugin-transform-dotall-regex": "7.0.0", - "@babel/plugin-transform-duplicate-keys": "7.0.0", - "@babel/plugin-transform-exponentiation-operator": "7.1.0", - "@babel/plugin-transform-for-of": "7.0.0", - "@babel/plugin-transform-function-name": "7.1.0", - "@babel/plugin-transform-literals": "7.0.0", - "@babel/plugin-transform-modules-amd": "7.1.0", - "@babel/plugin-transform-modules-commonjs": "7.1.0", - "@babel/plugin-transform-modules-systemjs": "7.0.0", - "@babel/plugin-transform-modules-umd": "7.1.0", - "@babel/plugin-transform-new-target": "7.0.0", - "@babel/plugin-transform-object-super": "7.1.0", - "@babel/plugin-transform-parameters": "7.1.0", - "@babel/plugin-transform-regenerator": "7.0.0", - "@babel/plugin-transform-shorthand-properties": "7.0.0", - "@babel/plugin-transform-spread": "7.0.0", - "@babel/plugin-transform-sticky-regex": "7.0.0", - "@babel/plugin-transform-template-literals": "7.0.0", - "@babel/plugin-transform-typeof-symbol": "7.0.0", - "@babel/plugin-transform-unicode-regex": "7.0.0", - "browserslist": "4.1.2", - "invariant": "2.2.2", - "js-levenshtein": "1.1.4", - "semver": "5.5.1" - }, - "dependencies": { - "browserslist": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.1.2.tgz", - "integrity": "sha512-docXmVcYth9AiW5183dEe2IxnbmpXF4jiM6efGBVRAli/iDSS894Svvjenrv5NPqAJ4dEJULmT4MSvmLG9qoYg==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000888", - "electron-to-chromium": "1.3.73", - "node-releases": "1.0.0-alpha.12" - } - }, - "caniuse-lite": { - "version": "1.0.30000888", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000888.tgz", - "integrity": "sha512-vftg+5p/lPsQGpnhSo/yBuYL36ai/cyjLvU3dOPJY1kkKrekLWIy8SLm+wzjX0hpCUdFTasC4/ZT7uqw4rKOnQ==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.73", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.73.tgz", - "integrity": "sha512-6PIg7v9zRoVGh6EheRF8h6Plti+3Yo/qtHobS4/Htyt53DNHmKKGFqSae1AIk0k1S4gCQvt7I2WgpbuZNcDY+g==", - "dev": true - } + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.1.tgz", + "integrity": "sha512-FHKrD6Dxf30e8xgHQO0zJZpUPfVZg+Xwgz5/RdSWCbza9QLNk4Qbp40ctRoqDxml3O8RMzB1DU55SXeDG6PqHQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.2.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.3.1", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.2.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.2.0", + "@babel/plugin-transform-classes": "^7.2.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.2.0", + "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-duplicate-keys": "^7.2.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.2.0", + "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.2.0", + "@babel/plugin-transform-modules-commonjs": "^7.2.0", + "@babel/plugin-transform-modules-systemjs": "^7.2.0", + "@babel/plugin-transform-modules-umd": "^7.2.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", + "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.2.0", + "@babel/plugin-transform-parameters": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.2.0", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.2.0", + "browserslist": "^4.3.4", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.3.0" } }, "@babel/runtime": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.1.2.tgz", - "integrity": "sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.1.tgz", + "integrity": "sha512-7jGW8ppV0ant637pIqAcFfQDDH1orEPGJb8aXfUozuCU3QqX7rX4DA8iwrbPrR1hcH0FTTHz47yQnk+bl5xHQA==", "dev": true, "requires": { - "regenerator-runtime": "0.12.1" + "regenerator-runtime": "^0.12.0" }, "dependencies": { "regenerator-runtime": { @@ -1409,65 +1475,71 @@ } }, "@babel/template": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.1.2.tgz", - "integrity": "sha512-SY1MmplssORfFiLDcOETrW7fCLl+PavlwMh92rrGcikQaRq4iWPVH0MpwPpY3etVMx6RnDjXtr6VZYr/IbP/Ag==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", + "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", "requires": { - "@babel/code-frame": "7.0.0", - "@babel/parser": "7.1.2", - "@babel/types": "7.1.2" + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.2.2", + "@babel/types": "^7.2.2" } }, "@babel/traverse": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.0.tgz", - "integrity": "sha512-bwgln0FsMoxm3pLOgrrnGaXk18sSM9JNf1/nHC/FksmNGFbYnPWY4GYCfLxyP1KRmfsxqkRpfoa6xr6VuuSxdw==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", + "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", "requires": { - "@babel/code-frame": "7.0.0", - "@babel/generator": "7.1.2", - "@babel/helper-function-name": "7.1.0", - "@babel/helper-split-export-declaration": "7.0.0", - "@babel/parser": "7.1.2", - "@babel/types": "7.1.2", - "debug": "3.2.5", - "globals": "11.8.0", - "lodash": "4.17.11" - }, - "dependencies": { - "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", - "requires": { - "ms": "2.1.1" - } - }, - "globals": { - "version": "11.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz", - "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==" - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.2.2", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.2.3", + "@babel/types": "^7.2.2", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.10" } }, "@babel/types": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.2.tgz", - "integrity": "sha512-pb1I05sZEKiSlMUV9UReaqsCPUpgbHHHu2n1piRm7JkuBkm6QxcaIzKu6FMnMtCbih/cEYTR+RGYYC96Yk9HAg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.0.tgz", + "integrity": "sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw==", + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.10", + "to-fast-properties": "^2.0.0" + } + }, + "@compodoc/ngd-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.0.0.tgz", + "integrity": "sha512-6HpYvXRZBdIYFojWxW5EVNkhYPmblytCve62CNoYBSWfy++vTGH7Ypg2Bhjg2CsqeV8JOVxrPO7JM9M3MgWKEA==", "requires": { - "esutils": "2.0.2", - "lodash": "4.17.11", - "to-fast-properties": "2.0.0" + "ansi-colors": "^1.0.1", + "fancy-log": "^1.3.2", + "typescript": "^2.4.2" + } + }, + "@compodoc/ngd-transformer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.0.0.tgz", + "integrity": "sha512-9J0KkmuuuvDHxH0oREgrgbqdEFqcltQXIBofeYdIyMKzI3A+pN1Ji4zfi7x1ql0Ax7qQKemp8XWP+cCpP0qY+w==", + "requires": { + "@compodoc/ngd-core": "~2.0.0", + "dot": "^1.1.1", + "fs-extra": "^4.0.1", + "viz.js": "^1.8.0" }, "dependencies": { - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } } } }, @@ -1477,9 +1549,9 @@ "integrity": "sha512-yaQQjNAVkKclMX6D8jTU3rhQKjCnXU1KS+Ok0lgZcarGHI2yydU/kKHyF3PZnQhbTpIFBK5W4+HmLCtCie7ESw==", "dev": true, "requires": { - "@emotion/sheet": "0.8.1", - "@emotion/stylis": "0.7.1", - "@emotion/utils": "0.8.2" + "@emotion/sheet": "^0.8.1", + "@emotion/stylis": "^0.7.1", + "@emotion/utils": "^0.8.2" } }, "@emotion/core": { @@ -1488,11 +1560,11 @@ "integrity": "sha512-5qzKP6bTe2Ah7Wvh1sgtzgy6ycdpxwgMAjQ/K/VxvqBxveG9PCpq+Z0GdVg7Houb1AwYjTfNtXstjSk4sqi/7g==", "dev": true, "requires": { - "@emotion/cache": "0.8.8", - "@emotion/css": "0.9.8", - "@emotion/serialize": "0.9.1", - "@emotion/sheet": "0.8.1", - "@emotion/utils": "0.8.2" + "@emotion/cache": "^0.8.8", + "@emotion/css": "^0.9.8", + "@emotion/serialize": "^0.9.1", + "@emotion/sheet": "^0.8.1", + "@emotion/utils": "^0.8.2" } }, "@emotion/css": { @@ -1501,8 +1573,8 @@ "integrity": "sha512-Stov3+9+KWZAte/ED9Hts3r4DVBADd5erDrhrywokM31ctQsRPD3qk8W4d1ca48ry57g/nc0qUHNis/xd1SoFg==", "dev": true, "requires": { - "@emotion/serialize": "0.9.1", - "@emotion/utils": "0.8.2" + "@emotion/serialize": "^0.9.1", + "@emotion/utils": "^0.8.2" } }, "@emotion/hash": { @@ -1517,7 +1589,7 @@ "integrity": "sha512-IMSL7ekYhmFlILXcouA6ket3vV7u9BqStlXzbKOF9HBtpUPMMlHU+bBxrLOa2NvleVwNIxeq/zL8LafLbeUXcA==", "dev": true, "requires": { - "@emotion/memoize": "0.6.6" + "@emotion/memoize": "^0.6.6" } }, "@emotion/memoize": { @@ -1532,8 +1604,8 @@ "integrity": "sha512-y/BRd6cJ9tyxsy4EK8WheD2X1/RfmudMYILpa8sgI3dKCjVWeEZuQM17wXRVEyhrisaRaIp1qT4h0eWUaaqNLg==", "dev": true, "requires": { - "@emotion/cache": "0.8.8", - "@emotion/weak-memoize": "0.1.3" + "@emotion/cache": "^0.8.8", + "@emotion/weak-memoize": "^0.1.3" } }, "@emotion/serialize": { @@ -1542,10 +1614,10 @@ "integrity": "sha512-zTuAFtyPvCctHBEL8KZ5lJuwBanGSutFEncqLn/m9T1a6a93smBStK+bZzcNPgj4QS8Rkw9VTwJGhRIUVO8zsQ==", "dev": true, "requires": { - "@emotion/hash": "0.6.6", - "@emotion/memoize": "0.6.6", - "@emotion/unitless": "0.6.7", - "@emotion/utils": "0.8.2" + "@emotion/hash": "^0.6.6", + "@emotion/memoize": "^0.6.6", + "@emotion/unitless": "^0.6.7", + "@emotion/utils": "^0.8.2" } }, "@emotion/sheet": { @@ -1560,7 +1632,7 @@ "integrity": "sha512-DFNW8jlMjy1aYCj/PKsvBoJVZAQXzjmSCwtKXLs31qZzNPaUEPbTYSIKnMUtIiAOYsu0pUTGXM+l0a+MYNm4lA==", "dev": true, "requires": { - "@emotion/styled-base": "0.10.6" + "@emotion/styled-base": "^0.10.6" } }, "@emotion/styled-base": { @@ -1569,9 +1641,9 @@ "integrity": "sha512-7RfdJm2oEXiy3isFRY63mHRmWWjScFXFoZTFkCJPaL8NhX+H724WwIoQOt3WA1Jd+bb97xkJg31JbYYsSqnEaQ==", "dev": true, "requires": { - "@emotion/is-prop-valid": "0.6.8", - "@emotion/serialize": "0.9.1", - "@emotion/utils": "0.8.2" + "@emotion/is-prop-valid": "^0.6.8", + "@emotion/serialize": "^0.9.1", + "@emotion/utils": "^0.8.2" } }, "@emotion/stylis": { @@ -1598,56 +1670,113 @@ "integrity": "sha512-QsYGKdhhuDFNq7bjm2r44y0mp5xW3uO3csuTPDWZc0OIiMQv+AIY5Cqwd4mJiC5N8estVl7qlvOx1hbtOuUWbw==", "dev": true }, + "@icons/material": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@icons/material/-/material-0.2.4.tgz", + "integrity": "sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw==", + "dev": true + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, "@ngtools/webpack": { - "version": "6.2.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-6.2.4.tgz", - "integrity": "sha512-DQLYU1P733eW6gmHKvIEXUOuqqrdrHrqIh3G2QwHQvhfPP5/TI0A9MKZbftb+jlTk6YeHsTYRfDGObPv8OlvxA==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.2.2.tgz", + "integrity": "sha512-xjvQ8tlyyReE69q+whAubwX4fayPoy4NHSIDa429qdcUypkvhSScAtou003oVAKG519rznykDrUHAWtvFMVf4Q==", "dev": true, "requires": { - "@angular-devkit/core": "0.8.4", - "rxjs": "6.2.2", + "@angular-devkit/core": "7.2.2", + "enhanced-resolve": "4.1.0", + "rxjs": "6.3.3", "tree-kill": "1.2.0", - "webpack-sources": "1.1.0" + "webpack-sources": "1.2.0" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.4.tgz", - "integrity": "sha512-oqMHezbIZMApud9JZDupWaxJeczTA17hLFGJ1qyAaPBRADtjnuguygXLcBLzYYAhzHKstrHwPJ4R1jj3oG28Ow==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.2.tgz", + "integrity": "sha512-gDF8iXiPN870WuBMl7bCQ5+Qz5SjGL/qMcvP4hli5hkn+kMAhgG38ligUK1bbhPQUJ+Z/nSOEmyv8gLHO09SZg==", "dev": true, "requires": { - "ajv": "6.4.0", + "ajv": "6.6.2", "chokidar": "2.0.4", - "rxjs": "6.2.2", - "source-map": "0.5.7" + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" } }, - "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "dev": true, + "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" + } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", "dev": true, "requires": { - "tslib": "1.9.0" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } } } }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, "@schematics/angular": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.8.4.tgz", - "integrity": "sha512-a85I7I7gYsmHRRnoNsCAa8ZlznIqnFjnOabVO6Z41XjUh57kOeWfLl7BQpd1CubvHu7q+juQXjBu1J+F4H/cOw==", + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.8.9.tgz", + "integrity": "sha512-QTCcvBr+HLk8oJuPvonc8myYVU4ko5qsIhTon0gyWQg8McQnjCf8dTpnLM/VSzrmR71wOQ9fqvl+qS+eujrtnA==", "dev": true, "requires": { - "@angular-devkit/core": "0.8.4", - "@angular-devkit/schematics": "0.8.4", - "typescript": "2.9.2" + "@angular-devkit/core": "0.8.9", + "@angular-devkit/schematics": "0.8.9", + "typescript": ">=2.6.2 <2.10" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.4.tgz", - "integrity": "sha512-oqMHezbIZMApud9JZDupWaxJeczTA17hLFGJ1qyAaPBRADtjnuguygXLcBLzYYAhzHKstrHwPJ4R1jj3oG28Ow==", + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.9.tgz", + "integrity": "sha512-Umax3YKBPTQy360TeoSNaIIOJOKoXvN/S2WNTV8wDjSWWNiWLTIlckWMb9DVsafAifjUi0mtOLRFuM4YatKgTw==", "dev": true, "requires": { "ajv": "6.4.0", @@ -1656,41 +1785,68 @@ "source-map": "0.5.7" } }, + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, "rxjs": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, - "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } } } }, "@schematics/update": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.8.4.tgz", - "integrity": "sha512-iJkJZurP0FV1PPRUBmlrxxdp4JgDnzm573y4WAnleHb5IJlDME79WoGC8wNemxeuHQUMvZbZQrzgmdmzqU83GA==", + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.8.9.tgz", + "integrity": "sha512-duefusf5YdKGcNfNlHM/eMpkuvR2o4rqLDX0wo59Pu1KKXoDEUy5lj0mOA+hXbzjHtrtOxpffxKU0+AzovEMPA==", "dev": true, "requires": { - "@angular-devkit/core": "0.8.4", - "@angular-devkit/schematics": "0.8.4", + "@angular-devkit/core": "0.8.9", + "@angular-devkit/schematics": "0.8.9", "npm-registry-client": "8.6.0", "rxjs": "6.2.2", - "semver": "5.5.1", + "semver": "5.6.0", "semver-intersect": "1.4.0" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.4.tgz", - "integrity": "sha512-oqMHezbIZMApud9JZDupWaxJeczTA17hLFGJ1qyAaPBRADtjnuguygXLcBLzYYAhzHKstrHwPJ4R1jj3oG28Ow==", + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.9.tgz", + "integrity": "sha512-Umax3YKBPTQy360TeoSNaIIOJOKoXvN/S2WNTV8wDjSWWNiWLTIlckWMb9DVsafAifjUi0mtOLRFuM4YatKgTw==", "dev": true, "requires": { "ajv": "6.4.0", @@ -1699,1441 +1855,360 @@ "source-map": "0.5.7" } }, + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0", + "uri-js": "^3.0.2" + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, "rxjs": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" + } + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "^2.1.0" } } } }, "@storybook/addon-actions": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-4.0.0-alpha.23.tgz", - "integrity": "sha512-d1X6YvoilfR5xKx1/A48boQ4aZPkcMj4XrRxlNrMedlWygcOUz5siDb/HVNhza2rYLVnFgzNGLy3Y4hCpu/Ggw==", - "dev": true, - "requires": { - "@emotion/core": "0.13.1", - "@emotion/provider": "0.11.2", - "@emotion/styled": "0.10.6", - "@storybook/addons": "4.0.0-alpha.23", - "@storybook/components": "4.0.0-alpha.23", - "@storybook/core-events": "4.0.0-alpha.23", - "deep-equal": "1.0.1", - "global": "4.3.2", - "lodash.isequal": "4.5.0", - "make-error": "1.3.5", - "prop-types": "15.6.2", - "react-inspector": "2.3.0", - "uuid": "3.3.2" - }, - "dependencies": { - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-4.1.7.tgz", + "integrity": "sha512-xhZCkehXZl3FM/2Dw1YOla0KcXyDgPVJbv6fRt0ebbmzaVbeB+cdknZ10SImPbKUWLCdBEKKIAR/CNF29hAH5A==", + "dev": true, + "requires": { + "@emotion/core": "^0.13.1", + "@emotion/provider": "^0.11.2", + "@emotion/styled": "^0.10.6", + "@storybook/addons": "4.1.7", + "@storybook/components": "4.1.7", + "@storybook/core-events": "4.1.7", + "core-js": "^2.5.7", + "deep-equal": "^1.0.1", + "global": "^4.3.2", + "lodash": "^4.17.11", + "make-error": "^1.3.5", + "prop-types": "^15.6.2", + "react-inspector": "^2.3.0", + "uuid": "^3.3.2" } }, "@storybook/addon-backgrounds": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-4.0.0-alpha.23.tgz", - "integrity": "sha512-TMCUqirAEiXugH6fhHtoCnU20fAxoC32OsSS5meO2WYeE7eSHbMRQMA2CAqjG/XcczTCyRCfT9paPj9iHn4gWA==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-4.1.7.tgz", + "integrity": "sha512-aH9WMIpQzxMU6IFYdOXrqRZqbNDmOdCYLwJj/nYjN3XI4a3Q6r6M6cqBfblaSzCU7JNr4ejEgjQdoOUSu99MOw==", "dev": true, "requires": { - "@emotion/styled": "0.10.6", - "@storybook/addons": "4.0.0-alpha.23", - "@storybook/core-events": "4.0.0-alpha.23", - "global": "4.3.2", - "prop-types": "15.6.2", - "util-deprecate": "1.0.2" + "@emotion/styled": "^0.10.6", + "@storybook/addons": "4.1.7", + "@storybook/core-events": "4.1.7", + "core-js": "^2.5.7", + "eventemitter3": "^3.1.0", + "global": "^4.3.2", + "prop-types": "^15.6.2", + "util-deprecate": "^1.0.2" } }, "@storybook/addon-centered": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/addon-centered/-/addon-centered-4.0.0-alpha.23.tgz", - "integrity": "sha512-2U2IPopBZdks5ZOOidzYZIQF6dAWAdE3rZsNN+fr7Atzr4qlPTyj+KfVTWYb1Ip2J4CO8Zl27ngEQbT3Wq+FyA==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-centered/-/addon-centered-4.1.7.tgz", + "integrity": "sha512-0ULiXtMNx+BYDT1EOriFZze3maoH40Ail4vKeOKknJYUj3sFwz9x3nZSFUkhQdWMxjw5ymB44O7Je4yIuLW1/A==", "dev": true, "requires": { - "global": "4.3.2" + "core-js": "^2.5.7", + "global": "^4.3.2" } }, "@storybook/addon-knobs": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/addon-knobs/-/addon-knobs-4.0.0-alpha.23.tgz", - "integrity": "sha512-hXRsB3YonSFQIPdpJ8H0j2O5TW3xF8ES5FxZ807lOvcoB+XKahFqbKphv+sgmriNK4E9PiDisPcJGBxz6CBduw==", - "dev": true, - "requires": { - "@emotion/styled": "0.10.6", - "@storybook/addons": "4.0.0-alpha.23", - "@storybook/components": "4.0.0-alpha.23", - "@storybook/core-events": "4.0.0-alpha.23", - "copy-to-clipboard": "3.0.8", - "escape-html": "1.0.3", - "fast-deep-equal": "2.0.1", - "global": "4.3.2", - "prop-types": "15.6.2", - "qs": "6.5.2", - "react-color": "2.14.1", - "react-datetime": "2.15.0", - "react-lifecycles-compat": "3.0.4", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "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=", - "dev": true - } + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-knobs/-/addon-knobs-4.1.7.tgz", + "integrity": "sha512-h2YSyZvz+KQIggAKttdTZvRpsCVQUJtyY9mzVHEFDKTccAlC9WjZPD9UDSHYQZKm+0gHtFkxOidFTcjt/5r+8A==", + "dev": true, + "requires": { + "@emotion/styled": "^0.10.6", + "@storybook/addons": "4.1.7", + "@storybook/components": "4.1.7", + "@storybook/core-events": "4.1.7", + "copy-to-clipboard": "^3.0.8", + "core-js": "^2.5.7", + "escape-html": "^1.0.3", + "fast-deep-equal": "^2.0.1", + "global": "^4.3.2", + "prop-types": "^15.6.2", + "qs": "^6.5.2", + "react-color": "^2.14.1", + "react-lifecycles-compat": "^3.0.4", + "util-deprecate": "^1.0.2" } }, "@storybook/addon-links": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-4.0.0-alpha.23.tgz", - "integrity": "sha512-4pxjfenKzT4eZ1wjfOe4bV3DOz27tHfoHW88Tv6a21MzZ+OIlLxFsGSdalk6dwjT84rOan+cgrHKlkXLM2qPSw==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-4.1.7.tgz", + "integrity": "sha512-yslRE0toy8JAvz69niZMx7LhXb3afFPkE5vHCxyB1o+EkPj4hUflWdByVff8hb6/Z8NSA6/iv7F0YvILudpQuw==", "dev": true, "requires": { - "@storybook/addons": "4.0.0-alpha.23", - "@storybook/components": "4.0.0-alpha.23", - "@storybook/core-events": "4.0.0-alpha.23", - "global": "4.3.2", - "prop-types": "15.6.2" + "@storybook/addons": "4.1.7", + "@storybook/components": "4.1.7", + "@storybook/core-events": "4.1.7", + "core-js": "^2.5.7", + "global": "^4.3.2", + "prop-types": "^15.6.2" } }, "@storybook/addon-notes": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/addon-notes/-/addon-notes-4.0.0-alpha.23.tgz", - "integrity": "sha512-g5yZiDXhYqtaoIXTVIWrlOdjvUJfxlq9IUD/4i2pCff0G9vAthyPM2gHDAbaFV59V89GYa4wELw5Q1mEj2NoTQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-notes/-/addon-notes-4.1.7.tgz", + "integrity": "sha512-mMUth5rMxsgRC5gQzlcTEaks46c9WRfJDbO2j/mdt+xnNN9QBrfaUUpEgnUwkKYXmO6FhD/LLAwVv2BtaULCxA==", "dev": true, "requires": { - "@emotion/styled": "0.10.6", - "@storybook/addons": "4.0.0-alpha.23", - "marked": "0.5.1", - "prop-types": "15.6.2" + "@emotion/styled": "^0.10.6", + "@storybook/addons": "4.1.7", + "core-js": "^2.5.7", + "marked": "^0.5.2", + "prop-types": "^15.6.2" + }, + "dependencies": { + "marked": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.2.tgz", + "integrity": "sha512-fdZvBa7/vSQIZCi4uuwo2N3q+7jJURpMVCcbaX0S1Mg65WZ5ilXvC67MviJAsdjqqgD+CEq4RKo5AYGgINkVAA==", + "dev": true + } } }, "@storybook/addon-options": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/addon-options/-/addon-options-4.0.0-alpha.23.tgz", - "integrity": "sha512-QDUE+yuKr6iSoKOGG8WJWZ7jJW1sJmTtpuGGpFXGcJjDV/q2CS4qvVigWYf3+cuvQisUusxG9+cX/gcIDFgA/A==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-options/-/addon-options-4.1.7.tgz", + "integrity": "sha512-U1dM8jUqAj/NG+zCAfqlCT/VbXGsGOeXogeHIr1sfBaBxYB3MTbIqmxjGoiGldMoZEjOkeTUGiQtRFg7w96DlQ==", "dev": true, "requires": { - "@storybook/addons": "4.0.0-alpha.23", - "util-deprecate": "1.0.2" + "@storybook/addons": "4.1.7", + "core-js": "^2.5.7", + "util-deprecate": "^1.0.2" } }, "@storybook/addon-storysource": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-4.0.0-alpha.23.tgz", - "integrity": "sha512-+VRMy8WKO9QF5uDN9/5aCc0MD9F2XoVdIA5sZhffZKJ7JdD3zbyJX+5RJqhZm44NU4BDQqc7/Er3ZBmGjCN6cA==", - "dev": true, - "requires": { - "@babel/runtime": "7.1.2", - "@storybook/addons": "4.0.0-alpha.23", - "@storybook/components": "4.0.0-alpha.23", - "estraverse": "4.2.0", - "loader-utils": "1.1.0", - "prettier": "1.14.3", - "prop-types": "15.6.2", - "react-syntax-highlighter": "8.0.1" + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-storysource/-/addon-storysource-4.1.7.tgz", + "integrity": "sha512-Y3lca7x37ENCREN35AtOUJz9mYiXygmxQbGSTUxprgs+68rU8ditT9YhZorIUtVIIrsZ295t3YaKZBanaCnLUA==", + "dev": true, + "requires": { + "@storybook/addons": "4.1.7", + "@storybook/components": "4.1.7", + "core-js": "^2.5.7", + "estraverse": "^4.2.0", + "loader-utils": "^1.1.0", + "prettier": "^1.14.3", + "prop-types": "^15.6.2", + "react-syntax-highlighter": "^10.0.0", + "regenerator-runtime": "^0.12.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + } } }, "@storybook/addons": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-4.0.0-alpha.23.tgz", - "integrity": "sha512-gYEQ31bg8/vEb/Pijzogzd4Z2pJoE0PD+rS7ywGWVjDCIb8PUJ8TL++bN3G6BDGwZVYGh7BKwDUS4l031NBaCg==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-4.1.7.tgz", + "integrity": "sha512-psKz/uMlImHkuUqdYaEq84Kyh3VIcSo00yHsnpWeq0xv3v6ONQKrFZ0bdmuZT30XQC0sYvXaP+YOKRq/hdgWaQ==", "dev": true, "requires": { - "@storybook/channels": "4.0.0-alpha.23", - "@storybook/components": "4.0.0-alpha.23", - "global": "4.3.2", - "util-deprecate": "1.0.2" + "@storybook/channels": "4.1.7", + "@storybook/components": "4.1.7", + "global": "^4.3.2", + "util-deprecate": "^1.0.2" } }, "@storybook/angular": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-4.0.0-alpha.23.tgz", - "integrity": "sha512-SdJI7YVxirjvLgQV9yDXlk1jPe3hrrz5x/7rJpNAjN2EbYrT1oO5dPtQ0MvrGTSIuoVNgiALXM1ICFAPHBVwfw==", - "dev": true, - "requires": { - "@babel/runtime": "7.1.2", - "@storybook/core": "4.0.0-alpha.23", - "@storybook/node-logger": "4.0.0-alpha.23", - "angular2-template-loader": "0.6.2", - "core-js": "2.5.7", - "fork-ts-checker-webpack-plugin": "0.4.9", - "global": "4.3.2", - "react": "16.5.2", - "react-dom": "16.5.2", - "sass-loader": "7.1.0", - "ts-loader": "4.5.0", - "webpack": "4.20.2", - "zone.js": "0.8.26" + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-4.1.7.tgz", + "integrity": "sha512-I0r0ZPiGm+xCMN+fjSfySlS4IIfcg26Wm1Bkg9zS7qRQCnPslEoyi5rFYpXYSp0URJYqB4I7Ip3QcH6aQQwxaA==", + "dev": true, + "requires": { + "@storybook/core": "4.1.7", + "@storybook/node-logger": "4.1.7", + "angular2-template-loader": "^0.6.2", + "core-js": "^2.5.7", + "fork-ts-checker-webpack-plugin": "^0.4.14", + "global": "^4.3.2", + "react": "^16.6.0", + "react-dom": "^16.6.0", + "regenerator-runtime": "^0.12.1", + "sass-loader": "^7.1.0", + "ts-loader": "^5.2.2", + "tsconfig-paths-webpack-plugin": "^3.2.0", + "webpack": "^4.23.1" }, "dependencies": { - "@webassemblyjs/ast": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.8.tgz", - "integrity": "sha512-dOrtdtEyB8sInpl75yLPNksY4sRl0j/+t6aHyB/YA+ab9hV3Fo7FmG12FHzP+2MvWVAJtDb+6eXR5EZbZJ+uVg==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz", - "integrity": "sha512-kn2zNKGsbql5i56VAgRYkpG+VazqHhQQZQycT2uXAazrAEDs23gy+Odkh5VblybjnwX2/BITkDtNmSO76hdIvQ==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz", - "integrity": "sha512-WXiIMnuvuwlhWvVOm8xEXU9DnHaa3AgAU0ZPfvY8vO1cSsmYb2WbGbHnMLgs43vXnA7XAob9b56zuZaMkxpCBg==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz", - "integrity": "sha512-TLQxyD9qGOIdX5LPQOPo0Ernd88U5rHkFb8WAjeMIeA0sPjCHeVPaGqUGGIXjUcblUkjuDAc07bruCcNHUrHDA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.7.8" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz", - "integrity": "sha512-TjK0CnD8hAPkV5mbSp5aWl6SO1+H3WFcjWtixWoy8EMA99YnNzYhpc/WSYWhf7yrhpzkq5tZB0tvLK3Svr3IXA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz", - "integrity": "sha512-AdCCE3BMW6V34WYaKUmPgVHa88t2Z14P4/0LjLwuGkI0X6pf7nzp0CehzVVk51cKm2ymVXjl9dCG+gR1yhITIQ==", + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz", - "integrity": "sha512-BkBhYQuzyl4hgTGOKo87Vdw6f9nj8HhI7WYpI0MCC5qFa5ahrAPOGgyETVdnRbv+Rjukl9MxxfDmVcVC435lDg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8" - } - }, - "@webassemblyjs/leb128": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.8.tgz", - "integrity": "sha512-GCYeGPgUFWJiZuP4NICbcyUQNxNLJIf476Ei+K+jVuuebtLpfvwkvYT6iTUE7oZYehhkor4Zz2g7SJ/iZaPudQ==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz", - "integrity": "sha512-6D3Hm2gFixrfyx9XjSON4ml1FZTugqpkIz5Awvrou8fnpyprVzcm4X8pyGRtA2Piixjl3DqmX/HB1xdWyE097A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/helper-wasm-section": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-opt": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "@webassemblyjs/wast-printer": "1.7.8" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz", - "integrity": "sha512-a7O/wE6eBeVKKUYgpMK7NOHmMADD85rSXLe3CqrWRDwWff5y3cSVbzpN6Qv3z6C4hdkpq9qyij1Ga1kemOZGvQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz", - "integrity": "sha512-3lbQ0PT81NHCdi1sR/7+SNpZadM4qYcTSr62nFFAA7e5lFwJr14M1Gi+A/Y3PgcDWOHYjsaNGPpPU0H03N6Blg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz", - "integrity": "sha512-rZ/zlhp9DHR/05zh1MbAjT2t624sjrPP/OkJCjXqzm7ynH+nIdNcn9Ixc+qzPMFXhIrk0rBoQ3to6sEIvHh9jQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz", - "integrity": "sha512-Q/zrvtUvzWuSiJMcSp90fi6gp2nraiHXjTV2VgAluVdVapM4gy1MQn7akja2p6eSBDQpKJPJ6P4TxRkghRS5dg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/floating-point-hex-parser": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-code-frame": "1.7.8", - "@webassemblyjs/helper-fsm": "1.7.8", - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz", - "integrity": "sha512-GllIthRtwTxRDAURRNXscu7Napzmdf1jt1gpiZiK/QN4fH0lSGs3OTmvdfsMNP7tqI4B3ZtfaaWRlNIQug6Xyg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8", - "@xtuc/long": "4.2.1" - } - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "1.9.0" - } - }, - "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==", - "dev": true - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.1.0" - } - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "sass-loader": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", - "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", - "dev": true, - "requires": { - "clone-deep": "2.0.2", - "loader-utils": "1.1.0", - "lodash.tail": "4.1.1", - "neo-async": "2.5.1", - "pify": "3.0.0", - "semver": "5.5.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", - "dev": true - }, - "webpack": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.20.2.tgz", - "integrity": "sha512-75WFUMblcWYcocjSLlXCb71QuGyH7egdBZu50FtBGl2Nso8CK3Ej+J7bTZz2FPFq5l6fzCisD9modB7t30ikuA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/wasm-edit": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "acorn": "5.7.3", - "acorn-dynamic-import": "3.0.0", - "ajv": "6.4.0", - "ajv-keywords": "3.2.0", - "chrome-trace-event": "1.0.0", - "enhanced-resolve": "4.1.0", - "eslint-scope": "4.0.0", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.5.1", - "node-libs-browser": "2.1.0", - "schema-utils": "0.4.5", - "tapable": "1.1.0", - "uglifyjs-webpack-plugin": "1.2.5", - "watchpack": "1.6.0", - "webpack-sources": "1.3.0" - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" - } - } - } - }, - "@storybook/channel-postmessage": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-4.0.0-alpha.23.tgz", - "integrity": "sha512-ieUhtQ9Kh7VNzW4l2ka8A+EyIPfCocpqnzy9lLcAYO8v3mIN6F/UrPDb3e/yxU7JSDFAnCZNLJpIcXDKehLifw==", - "dev": true, - "requires": { - "@storybook/channels": "4.0.0-alpha.23", - "global": "4.3.2", - "json-stringify-safe": "5.0.1" - } - }, - "@storybook/channels": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-4.0.0-alpha.23.tgz", - "integrity": "sha512-2INU0L6SEQgQCbZkiieORkVE/0W0gXVv/9CdGEGFPi/KrE0rxYL1Qi6Qr6fT2T8lfy9HFXalcgPHI7VaeWaN9g==", - "dev": true - }, - "@storybook/client-logger": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-4.0.0-alpha.23.tgz", - "integrity": "sha512-jTTHU0m0oiYyZqvKVQ9N6S4yO32le2xvWYOxICwYLEtOw5bDtcfLu1gifoKRECEZGc3xINjFlFnBDmihrDHbLg==", - "dev": true - }, - "@storybook/components": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-4.0.0-alpha.23.tgz", - "integrity": "sha512-z1gWhMujEd6XizV/yXLsqHzWYEPtrHnPsaASJU6BXVLHnueiIKuZuJolDBKSAbK4vRgoiMsEHnxrKxHEliNtgQ==", - "dev": true, - "requires": { - "@emotion/core": "0.13.1", - "@emotion/provider": "0.11.2", - "@emotion/styled": "0.10.6", - "global": "4.3.2", - "lodash.pick": "4.4.0", - "lodash.throttle": "4.1.1", - "prop-types": "15.6.2", - "react-inspector": "2.3.0", - "react-split-pane": "0.1.84", - "react-textarea-autosize": "7.0.4", - "render-fragment": "0.1.1" - } - }, - "@storybook/core": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-4.0.0-alpha.23.tgz", - "integrity": "sha512-3yHHcDQD3VDfxEJ+CfZzNWj29frHRfF2hbSFQQQYtT9rUubu9JRRqEOLY543ZiMnWICdut5tBVVp3y+clE3ojA==", - "dev": true, - "requires": { - "@babel/plugin-proposal-class-properties": "7.1.0", - "@babel/plugin-transform-regenerator": "7.0.0", - "@babel/plugin-transform-runtime": "7.1.0", - "@babel/preset-env": "7.1.0", - "@babel/runtime": "7.1.2", - "@emotion/core": "0.13.1", - "@emotion/provider": "0.11.2", - "@emotion/styled": "0.10.6", - "@storybook/addons": "4.0.0-alpha.23", - "@storybook/channel-postmessage": "4.0.0-alpha.23", - "@storybook/client-logger": "4.0.0-alpha.23", - "@storybook/core-events": "4.0.0-alpha.23", - "@storybook/node-logger": "4.0.0-alpha.23", - "@storybook/ui": "4.0.0-alpha.23", - "airbnb-js-shims": "2.1.1", - "autoprefixer": "9.1.5", - "babel-plugin-macros": "2.4.2", - "babel-preset-minify": "0.5.0", - "case-sensitive-paths-webpack-plugin": "2.1.2", - "chalk": "2.4.1", - "commander": "2.18.0", - "core-js": "2.5.7", - "css-loader": "1.0.0", - "detect-port": "1.2.3", - "dotenv-webpack": "1.5.7", - "ejs": "2.6.1", - "express": "4.16.3", - "file-loader": "2.0.0", - "find-cache-dir": "2.0.0", - "generate-page-webpack-plugin": "1.1.1", - "global": "4.3.2", - "inquirer": "6.2.0", - "interpret": "1.1.0", - "json5": "2.1.0", - "opn": "5.3.0", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "prop-types": "15.6.2", - "qs": "6.5.2", - "raw-loader": "0.5.1", - "react-dev-utils": "6.0.0-next.2150693d", - "redux": "4.0.0", - "resolve": "1.8.1", - "semver": "5.5.1", - "serve-favicon": "2.5.0", - "shelljs": "0.8.2", - "style-loader": "0.23.0", - "svg-url-loader": "2.3.2", - "universal-dotenv": "1.9.1", - "url-loader": "1.1.1", - "webpack": "4.20.2", - "webpack-dev-middleware": "3.4.0", - "webpack-hot-middleware": "2.24.2" - }, - "dependencies": { - "@webassemblyjs/ast": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.8.tgz", - "integrity": "sha512-dOrtdtEyB8sInpl75yLPNksY4sRl0j/+t6aHyB/YA+ab9hV3Fo7FmG12FHzP+2MvWVAJtDb+6eXR5EZbZJ+uVg==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz", - "integrity": "sha512-kn2zNKGsbql5i56VAgRYkpG+VazqHhQQZQycT2uXAazrAEDs23gy+Odkh5VblybjnwX2/BITkDtNmSO76hdIvQ==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz", - "integrity": "sha512-WXiIMnuvuwlhWvVOm8xEXU9DnHaa3AgAU0ZPfvY8vO1cSsmYb2WbGbHnMLgs43vXnA7XAob9b56zuZaMkxpCBg==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz", - "integrity": "sha512-TLQxyD9qGOIdX5LPQOPo0Ernd88U5rHkFb8WAjeMIeA0sPjCHeVPaGqUGGIXjUcblUkjuDAc07bruCcNHUrHDA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.7.8" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz", - "integrity": "sha512-TjK0CnD8hAPkV5mbSp5aWl6SO1+H3WFcjWtixWoy8EMA99YnNzYhpc/WSYWhf7yrhpzkq5tZB0tvLK3Svr3IXA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz", - "integrity": "sha512-AdCCE3BMW6V34WYaKUmPgVHa88t2Z14P4/0LjLwuGkI0X6pf7nzp0CehzVVk51cKm2ymVXjl9dCG+gR1yhITIQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz", - "integrity": "sha512-BkBhYQuzyl4hgTGOKo87Vdw6f9nj8HhI7WYpI0MCC5qFa5ahrAPOGgyETVdnRbv+Rjukl9MxxfDmVcVC435lDg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8" - } - }, - "@webassemblyjs/leb128": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.8.tgz", - "integrity": "sha512-GCYeGPgUFWJiZuP4NICbcyUQNxNLJIf476Ei+K+jVuuebtLpfvwkvYT6iTUE7oZYehhkor4Zz2g7SJ/iZaPudQ==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz", - "integrity": "sha512-6D3Hm2gFixrfyx9XjSON4ml1FZTugqpkIz5Awvrou8fnpyprVzcm4X8pyGRtA2Piixjl3DqmX/HB1xdWyE097A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/helper-wasm-section": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-opt": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "@webassemblyjs/wast-printer": "1.7.8" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz", - "integrity": "sha512-a7O/wE6eBeVKKUYgpMK7NOHmMADD85rSXLe3CqrWRDwWff5y3cSVbzpN6Qv3z6C4hdkpq9qyij1Ga1kemOZGvQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz", - "integrity": "sha512-3lbQ0PT81NHCdi1sR/7+SNpZadM4qYcTSr62nFFAA7e5lFwJr14M1Gi+A/Y3PgcDWOHYjsaNGPpPU0H03N6Blg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz", - "integrity": "sha512-rZ/zlhp9DHR/05zh1MbAjT2t624sjrPP/OkJCjXqzm7ynH+nIdNcn9Ixc+qzPMFXhIrk0rBoQ3to6sEIvHh9jQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz", - "integrity": "sha512-Q/zrvtUvzWuSiJMcSp90fi6gp2nraiHXjTV2VgAluVdVapM4gy1MQn7akja2p6eSBDQpKJPJ6P4TxRkghRS5dg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/floating-point-hex-parser": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-code-frame": "1.7.8", - "@webassemblyjs/helper-fsm": "1.7.8", - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz", - "integrity": "sha512-GllIthRtwTxRDAURRNXscu7Napzmdf1jt1gpiZiK/QN4fH0lSGs3OTmvdfsMNP7tqI4B3ZtfaaWRlNIQug6Xyg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8", - "@xtuc/long": "4.2.1" - } - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "autoprefixer": { - "version": "9.1.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.1.5.tgz", - "integrity": "sha512-kk4Zb6RUc58ld7gdosERHMF3DzIYJc2fp5sX46qEsGXQQy5bXsu8qyLjoxuY1NuQ/cJuCYnx99BfjwnRggrYIw==", - "dev": true, - "requires": { - "browserslist": "4.1.2", - "caniuse-lite": "1.0.30000888", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "7.0.5", - "postcss-value-parser": "3.3.0" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "browserslist": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.1.2.tgz", - "integrity": "sha512-docXmVcYth9AiW5183dEe2IxnbmpXF4jiM6efGBVRAli/iDSS894Svvjenrv5NPqAJ4dEJULmT4MSvmLG9qoYg==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000888", - "electron-to-chromium": "1.3.73", - "node-releases": "1.0.0-alpha.12" - } - }, - "caniuse-lite": { - "version": "1.0.30000888", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000888.tgz", - "integrity": "sha512-vftg+5p/lPsQGpnhSo/yBuYL36ai/cyjLvU3dOPJY1kkKrekLWIy8SLm+wzjX0hpCUdFTasC4/ZT7uqw4rKOnQ==", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "1.9.0" - } - }, - "commander": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.18.0.tgz", - "integrity": "sha512-6CYPa+JP2ftfRU2qkDK+UTVeQYosOg/2GbcjIcKPHfinyOLPVGXu/ovN86RP49Re5ndJK1N0kuiidFFuepc4ZQ==", - "dev": true - }, - "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==", - "dev": true - }, - "cosmiconfig": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.12.0", - "parse-json": "4.0.0", - "require-from-string": "2.0.2" - } - }, - "electron-to-chromium": { - "version": "1.3.73", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.73.tgz", - "integrity": "sha512-6PIg7v9zRoVGh6EheRF8h6Plti+3Yo/qtHobS4/Htyt53DNHmKKGFqSae1AIk0k1S4gCQvt7I2WgpbuZNcDY+g==", - "dev": true - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.1.0" - } - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", - "dev": true, - "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "file-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", - "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", - "dev": true, - "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "3.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.1" - } - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", - "dev": true, - "requires": { - "minimist": "1.2.0" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - }, - "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", - "dev": true - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "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==", - "dev": true, - "requires": { - "p-limit": "2.0.0" - } - }, - "p-try": { + } + } + }, + "@storybook/channel-postmessage": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-4.1.7.tgz", + "integrity": "sha512-whcpmMJVIFKxvy6m/ZpuyTCB4exlQjkskePNtr0VPN1mfbfo0/QkmKy2uBi2Kt7BD7GsVfd7l8273LwohRzU8w==", + "dev": true, + "requires": { + "@storybook/channels": "4.1.7", + "global": "^4.3.2", + "json-stringify-safe": "^5.0.1" + } + }, + "@storybook/channels": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-4.1.7.tgz", + "integrity": "sha512-UVLrCcQ8f52PQYdWh97XcWBdqiXKBznePbd4L36//C6cIJkfwQ5nK9UDzzrCP/tlCnolVxnqRlorns4YeJcrSg==", + "dev": true + }, + "@storybook/client-logger": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-4.1.7.tgz", + "integrity": "sha512-8ANFBywYmja3wMbjNfPSIYGm50iWXeH0hxSmL+CD+Sk3+px0ZhqGEaqFVNPTd0blnuVZTPNNBepEDv8etnhPXg==", + "dev": true + }, + "@storybook/components": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-4.1.7.tgz", + "integrity": "sha512-PgEREFw58tlyzzGbA7q1WlXgOLk6Dd+qkHZYJ+4JlTAl6kPdjirfRshg0uyvTVy5jGbtDa5mhN7Fo1TtuYiyDw==", + "dev": true, + "requires": { + "@emotion/core": "^0.13.1", + "@emotion/provider": "^0.11.2", + "@emotion/styled": "^0.10.6", + "global": "^4.3.2", + "lodash": "^4.17.11", + "prop-types": "^15.6.2", + "react-inspector": "^2.3.0", + "react-split-pane": "^0.1.84", + "react-textarea-autosize": "^7.0.4", + "render-fragment": "^0.1.1" + } + }, + "@storybook/core": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-4.1.7.tgz", + "integrity": "sha512-CTCn1Q6EEIy+u08BK7hL9J0ElNaRtDTow61YCk31HgtGIBF7zNjMOFEZE+LF3rtEX4T5gCBDi9FxrKnYH1RnZA==", + "dev": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.2.0", + "@babel/preset-env": "^7.2.0", + "@emotion/core": "^0.13.1", + "@emotion/provider": "^0.11.2", + "@emotion/styled": "^0.10.6", + "@storybook/addons": "4.1.7", + "@storybook/channel-postmessage": "4.1.7", + "@storybook/client-logger": "4.1.7", + "@storybook/core-events": "4.1.7", + "@storybook/node-logger": "4.1.7", + "@storybook/ui": "4.1.7", + "airbnb-js-shims": "^1 || ^2", + "autoprefixer": "^9.3.1", + "babel-plugin-macros": "^2.4.2", + "babel-preset-minify": "^0.5.0 || 0.6.0-alpha.5", + "boxen": "^2.0.0", + "case-sensitive-paths-webpack-plugin": "^2.1.2", + "chalk": "^2.4.1", + "child-process-promise": "^2.2.1", + "cli-table3": "0.5.1", + "commander": "^2.19.0", + "common-tags": "^1.8.0", + "core-js": "^2.5.7", + "css-loader": "^1.0.1", + "detect-port": "^1.2.3", + "dotenv-webpack": "^1.5.7", + "ejs": "^2.6.1", + "eventemitter3": "^3.1.0", + "express": "^4.16.3", + "file-loader": "^2.0.0", + "file-system-cache": "^1.0.5", + "find-cache-dir": "^2.0.0", + "fs-extra": "^7.0.1", + "global": "^4.3.2", + "html-webpack-plugin": "^4.0.0-beta.2", + "inquirer": "^6.2.0", + "interpret": "^1.1.0", + "ip": "^1.1.5", + "json5": "^2.1.0", + "lazy-universal-dotenv": "^2.0.0", + "node-fetch": "^2.2.0", + "opn": "^5.4.0", + "postcss-flexbugs-fixes": "^4.1.0", + "postcss-loader": "^3.0.0", + "pretty-hrtime": "^1.0.3", + "prop-types": "^15.6.2", + "qs": "^6.5.2", + "raw-loader": "^0.5.1", + "react-dev-utils": "^6.1.0", + "redux": "^4.0.1", + "regenerator-runtime": "^0.12.1", + "resolve": "^1.8.1", + "resolve-from": "^4.0.0", + "semver": "^5.6.0", + "serve-favicon": "^2.5.0", + "shelljs": "^0.8.2", + "spawn-promise": "^0.1.8", + "style-loader": "^0.23.1", + "svg-url-loader": "^2.3.2", + "terser-webpack-plugin": "^1.1.0", + "url-loader": "^1.1.2", + "webpack": "^4.23.1", + "webpack-dev-middleware": "^3.4.0", + "webpack-hot-middleware": "^2.24.3" + }, + "dependencies": { + "find-cache-dir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.2" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" } }, "pkg-dir": { @@ -3142,216 +2217,38 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "3.0.0" - } - }, - "postcss": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", - "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "postcss-load-config": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.0.0.tgz", - "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", - "dev": true, - "requires": { - "cosmiconfig": "4.0.0", - "import-cwd": "2.1.0" - } - }, - "postcss-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", - "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "postcss": "7.0.5", - "postcss-load-config": "2.0.0", - "schema-utils": "1.0.0" - } - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.4.0", - "ajv-errors": "1.0.0", - "ajv-keywords": "3.2.0" - } - }, - "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "style-loader": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.0.tgz", - "integrity": "sha512-uCcN7XWHkqwGVt7skpInW6IGO1tG6ReyFQ1Cseh0VcN6VdcFQi62aG/2F3Y9ueA8x4IVlfaSUxpmQXQD9QrEuQ==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.4.7" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "6.4.0", - "ajv-keywords": "3.2.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" + "find-up": "^3.0.0" } }, - "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", "dev": true }, - "url-loader": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.1.tgz", - "integrity": "sha512-vugEeXjyYFBCUOpX+ZuaunbK3QXMKaQ3zUnRfIpRBlGkY7QizCnzyyn2ASfcxsvyU3ef+CJppVywnl3Kgf13Gg==", - "dev": true, - "requires": { - "loader-utils": "1.1.0", - "mime": "2.3.1", - "schema-utils": "1.0.0" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "webpack": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.20.2.tgz", - "integrity": "sha512-75WFUMblcWYcocjSLlXCb71QuGyH7egdBZu50FtBGl2Nso8CK3Ej+J7bTZz2FPFq5l6fzCisD9modB7t30ikuA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/wasm-edit": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "acorn": "5.7.3", - "acorn-dynamic-import": "3.0.0", - "ajv": "6.4.0", - "ajv-keywords": "3.2.0", - "chrome-trace-event": "1.0.0", - "enhanced-resolve": "4.1.0", - "eslint-scope": "4.0.0", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.5.1", - "node-libs-browser": "2.1.0", - "schema-utils": "0.4.7", - "tapable": "1.1.0", - "uglifyjs-webpack-plugin": "1.2.5", - "watchpack": "1.6.0", - "webpack-sources": "1.3.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "6.4.0", - "ajv-keywords": "3.2.0" - } - } - } - }, - "webpack-dev-middleware": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz", - "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", - "dev": true, - "requires": { - "memory-fs": "0.4.1", - "mime": "2.3.1", - "range-parser": "1.2.0", - "webpack-log": "2.0.0" - } - }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "3.1.0", - "uuid": "3.3.2" - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } } } }, "@storybook/core-events": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-4.0.0-alpha.23.tgz", - "integrity": "sha512-mCraQOY7CyVH+0d2eFPpVlYmUyXYiJJI//Sc7eYMwCTU9K/5OnXRcmXmkU3eXPyjwtYTbdle9FnPBAdOfTrX7g==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-4.1.7.tgz", + "integrity": "sha512-IpggH1Br51UAlLaAhNr6qY0IVT5mN1akfeVi1DpCj2ji7zqdfeDO3zmX6aWSjYVefg6OvNol71WKh+wjcYNvXg==", "dev": true }, "@storybook/mantra-core": { @@ -3360,42 +2257,53 @@ "integrity": "sha512-GD4OYJ8GsayVhIg306sfgcKDk9j8YfuSKIAWvdB/g7IDlw0pDgueONALVEEE2XWJtCwcsUyDtCYzXFgCBWLEjA==", "dev": true, "requires": { - "@storybook/react-komposer": "2.0.4", - "@storybook/react-simple-di": "1.3.0", - "babel-runtime": "6.26.0" + "@storybook/react-komposer": "^2.0.1", + "@storybook/react-simple-di": "^1.2.1", + "babel-runtime": "6.x.x" } }, "@storybook/node-logger": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-4.0.0-alpha.23.tgz", - "integrity": "sha512-JDgWzzt8LyHMZkYMeL7wWnpYdsBYXnfMTyhZmBVI/CU0kfe1bNMbFr0QPieu2GGPyZ/8bEKcmuMV57hqo9Cl3w==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-4.1.7.tgz", + "integrity": "sha512-wITFeu91xpj6uWW05h3/V4KMucYvPrdUZT25v6nrcUD39Z1m8EB53NXrO1J5g4srUEfrw8msnpwDbZ9kW/sZxw==", "dev": true, "requires": { - "@babel/runtime": "7.1.2", - "npmlog": "4.1.2" + "chalk": "^2.4.1", + "core-js": "^2.5.7", + "npmlog": "^4.1.2", + "pretty-hrtime": "^1.0.3", + "regenerator-runtime": "^0.12.1" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz", + "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", + "dev": true + } } }, "@storybook/podda": { "version": "1.2.3", - "resolved": "http://registry.npmjs.org/@storybook/podda/-/podda-1.2.3.tgz", + "resolved": "https://registry.npmjs.org/@storybook/podda/-/podda-1.2.3.tgz", "integrity": "sha512-g7dsdsn50AhlGZ8iIDKdF8bi7Am++iFOq+QN+hNKz3FvgLuf8Dz+mpC/BFl90eE9bEYxXqXKeMf87399Ec5Qhw==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "immutable": "3.8.2" + "babel-runtime": "^6.11.6", + "immutable": "^3.8.1" } }, "@storybook/react-komposer": { - "version": "2.0.4", - "resolved": "http://registry.npmjs.org/@storybook/react-komposer/-/react-komposer-2.0.4.tgz", - "integrity": "sha1-wsDUp12bSpwMa0bxSrBQ9FitS7A=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@storybook/react-komposer/-/react-komposer-2.0.5.tgz", + "integrity": "sha512-zX5UITgAh37tmD0MWnUFR29S5YM8URMHc/9iwczX/P1f3tM4nPn8VAzxG/UWQecg1xZVphmqkZoux+SDrtTZOQ==", "dev": true, "requires": { - "@storybook/react-stubber": "1.0.1", - "babel-runtime": "6.26.0", - "hoist-non-react-statics": "1.2.0", - "lodash.pick": "4.4.0", - "shallowequal": "0.2.2" + "@storybook/react-stubber": "^1.0.0", + "babel-runtime": "^6.11.6", + "hoist-non-react-statics": "^1.2.0", + "lodash": "^4.17.11", + "shallowequal": "^1.1.0" } }, "@storybook/react-simple-di": { @@ -3404,10 +2312,10 @@ "integrity": "sha512-RH6gPQaYMs/VzQX2dgbZU8DQMKFXVOv1ruohHjjNPys4q+YdqMFMDe5jOP1AUE3j9g01x0eW7bVjRawSpl++Ew==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "create-react-class": "15.6.3", - "hoist-non-react-statics": "1.2.0", - "prop-types": "15.6.2" + "babel-runtime": "6.x.x", + "create-react-class": "^15.6.2", + "hoist-non-react-statics": "1.x.x", + "prop-types": "^15.6.0" } }, "@storybook/react-stubber": { @@ -3416,78 +2324,82 @@ "integrity": "sha512-k+CHH+vA8bQfCmzBTtJsPkITFgD+C/w19KuByZ9WeEvNUFtnDaCqfP+Vp3/OR+3IAfAXYYOWolqPLxNPcEqEjw==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.5.0" } }, "@storybook/ui": { - "version": "4.0.0-alpha.23", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-4.0.0-alpha.23.tgz", - "integrity": "sha512-f/bWytrQ+ZV4TXRDT8yq7gIlWnaa7ZVAvqBFrOoN+XCC3Phq/XD+xm6l7u8NSyTi/DztgedpP8Hkz9cFgSemwg==", - "dev": true, - "requires": { - "@emotion/core": "0.13.1", - "@emotion/provider": "0.11.2", - "@emotion/styled": "0.10.6", - "@storybook/components": "4.0.0-alpha.23", - "@storybook/core-events": "4.0.0-alpha.23", - "@storybook/mantra-core": "1.7.2", - "@storybook/podda": "1.2.3", - "@storybook/react-komposer": "2.0.4", - "deep-equal": "1.0.1", - "events": "3.0.0", - "fuse.js": "3.2.1", - "global": "4.3.2", - "keycode": "2.2.0", - "lodash.debounce": "4.0.8", - "lodash.pick": "4.4.0", - "lodash.sortby": "4.7.0", - "lodash.throttle": "4.1.1", - "prop-types": "15.6.2", - "qs": "6.5.2", - "react-fuzzy": "0.5.2", - "react-lifecycles-compat": "3.0.4", - "react-modal": "3.6.1", - "react-treebeard": "3.1.0" - }, - "dependencies": { - "events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", - "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", - "dev": true - } - } + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-4.1.7.tgz", + "integrity": "sha512-v4US/NqdlvHMZ35Ftw86+EIDdNQ1vIk0auyJggb9OG0jvz0qIv/QGIUTqHnm2TTaMIPoBA1HLfqEEgARwzDb8Q==", + "dev": true, + "requires": { + "@emotion/core": "^0.13.1", + "@emotion/provider": "^0.11.2", + "@emotion/styled": "^0.10.6", + "@storybook/components": "4.1.7", + "@storybook/core-events": "4.1.7", + "@storybook/mantra-core": "^1.7.2", + "@storybook/podda": "^1.2.3", + "@storybook/react-komposer": "^2.0.5", + "deep-equal": "^1.0.1", + "eventemitter3": "^3.1.0", + "fuse.js": "^3.3.0", + "global": "^4.3.2", + "keycode": "^2.2.0", + "lodash": "^4.17.11", + "prop-types": "^15.6.2", + "qs": "^6.5.2", + "react": "^16.7.0", + "react-dom": "^16.7.0", + "react-fuzzy": "^0.5.2", + "react-lifecycles-compat": "^3.0.4", + "react-modal": "^3.6.1", + "react-treebeard": "^3.1.0" + } + }, + "@types/clipboard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/clipboard/-/clipboard-2.0.1.tgz", + "integrity": "sha512-gJJX9Jjdt3bIAePQRRjYWG20dIhAgEqonguyHxXuqALxsoDsDLimihqrSg8fXgVTJ4KZCzkfglKtwsh/8dLfbA==", + "dev": true }, "@types/codemirror": { - "version": "0.0.61", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.61.tgz", - "integrity": "sha512-LGqLfMyT2RKvo3JHQn7MTZ2uoMKuTFhRZ0MYR0YD3H/sZ81jOjBw8fzJ/6FXHSALXgGuoiZN7FH1Bx6PARdkBQ==" + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.70.tgz", + "integrity": "sha512-NHpD8C5J9P+6M/Swm+jIkOs8EywFMeSYzX9c1917QBNfvj2fuS0djROLoLNzSYEMHUWWaEVPLYJ8zDR2M6qaaQ==", + "dev": true }, "@types/jasmine": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.8.tgz", - "integrity": "sha512-OJSUxLaxXsjjhob2DBzqzgrkLmukM3+JMpRp0r0E4HTdT1nwDCWhaswjYxazPij6uOdzHCJfNbDjmQ1/rnNbCg==", + "version": "2.8.15", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.15.tgz", + "integrity": "sha512-HH1x/3zn6V0+tTu05OuDhka5Impvh1AAj636X+xhinINKl+7iSHM9ET4wrxMhdoKYmv8zMhlsrsEAs9W/cA3Yw==", "dev": true }, "@types/jasminewd2": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.4.tgz", - "integrity": "sha512-G83fHoholqR7pmsY7ojHJqMAl4zD6ylKNaKCx7zH+GisCBQpnI5a7aUTFWVzv2wppIuWd+mJxyRqTASPfqcQ2w==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.6.tgz", + "integrity": "sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw==", "dev": true, "requires": { - "@types/jasmine": "2.8.8" + "@types/jasmine": "*" } }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, "@types/lodash": { - "version": "4.14.116", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.116.tgz", - "integrity": "sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg==", + "version": "4.14.120", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.120.tgz", + "integrity": "sha512-jQ21kQ120mo+IrDs1nFNVm/AsdFxIx2+vZ347DbogHJPd/JzKNMOqU6HCYin1W6v8l5R9XSO2/e9cxmn7HAnVw==", "dev": true }, "@types/node": { - "version": "10.11.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.11.3.tgz", - "integrity": "sha512-3AvcEJAh9EMatxs+OxAlvAEs7OTy6AG94mcH1iqyVDwVVndekLxzwkWQ/Z4SDbY6GO2oyUXyWW8tQ4rENSSQVQ==", + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", "dev": true }, "@types/q": { @@ -3497,9 +2409,9 @@ "dev": true }, "@types/selenium-webdriver": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.10.tgz", - "integrity": "sha512-ikB0JHv6vCR1KYUQAzTO4gi/lXLElT4Tx+6De2pc/OZwizE9LRNiTa+U8TBFKBD/nntPnr/MPSHSnOTybjhqNA==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.14.tgz", + "integrity": "sha512-4GbNCDs98uHCT/OMv40qQC/OpoPbYn9XdXeTiFwHBBFO6eJhYEPUu2zDKirXSbHlvDV8oZ9l8EQ+HrEx/YS9DQ==", "dev": true }, "@types/semver": { @@ -3508,6 +2420,12 @@ "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==", "dev": true }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, "@types/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", @@ -3520,175 +2438,194 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "@webassemblyjs/ast": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.8.tgz", - "integrity": "sha512-dOrtdtEyB8sInpl75yLPNksY4sRl0j/+t6aHyB/YA+ab9hV3Fo7FmG12FHzP+2MvWVAJtDb+6eXR5EZbZJ+uVg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8" + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz", - "integrity": "sha512-kn2zNKGsbql5i56VAgRYkpG+VazqHhQQZQycT2uXAazrAEDs23gy+Odkh5VblybjnwX2/BITkDtNmSO76hdIvQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz", - "integrity": "sha512-xUwxDXsd1dUKArJEP5wWM5zxgCSwZApSOJyP1XO7M8rNUChUDblcLQ4FpzTpWG2YeylMwMl1MlP5Ztryiz1x4g==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz", - "integrity": "sha512-WXiIMnuvuwlhWvVOm8xEXU9DnHaa3AgAU0ZPfvY8vO1cSsmYb2WbGbHnMLgs43vXnA7XAob9b56zuZaMkxpCBg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz", - "integrity": "sha512-TLQxyD9qGOIdX5LPQOPo0Ernd88U5rHkFb8WAjeMIeA0sPjCHeVPaGqUGGIXjUcblUkjuDAc07bruCcNHUrHDA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.7.8" + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/helper-fsm": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz", - "integrity": "sha512-TjK0CnD8hAPkV5mbSp5aWl6SO1+H3WFcjWtixWoy8EMA99YnNzYhpc/WSYWhf7yrhpzkq5tZB0tvLK3Svr3IXA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz", - "integrity": "sha512-uCutAKR7Nm0VsFixcvnB4HhAyHouNbj0Dx1p7eRjFjXGGZ+N7ftTaG1ZbWCasAEbtwGj54LP8+lkBZdTCPmLGg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", "dev": true }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz", - "integrity": "sha512-AdCCE3BMW6V34WYaKUmPgVHa88t2Z14P4/0LjLwuGkI0X6pf7nzp0CehzVVk51cKm2ymVXjl9dCG+gR1yhITIQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz", - "integrity": "sha512-BkBhYQuzyl4hgTGOKo87Vdw6f9nj8HhI7WYpI0MCC5qFa5ahrAPOGgyETVdnRbv+Rjukl9MxxfDmVcVC435lDg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" } }, "@webassemblyjs/ieee754": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz", - "integrity": "sha512-tOarWChdG1a3y1yqCX0JMDKzrat5tQe4pV6K/TX19BcXsBLYxFQOL1DEDa5KG9syeyvCrvZ+i1+Mv1ExngvktQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", "dev": true, "requires": { - "@xtuc/ieee754": "1.2.0" + "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.8.tgz", - "integrity": "sha512-GCYeGPgUFWJiZuP4NICbcyUQNxNLJIf476Ei+K+jVuuebtLpfvwkvYT6iTUE7oZYehhkor4Zz2g7SJ/iZaPudQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", "dev": true, "requires": { "@xtuc/long": "4.2.1" } }, "@webassemblyjs/utf8": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.8.tgz", - "integrity": "sha512-9X+f0VV+xNXW2ujfIRSXBJENGE6Qh7bNVKqu3yDjTFB3ar3nsThsGBBKdTG58aXOm2iUH6v28VIf88ymPXODHA==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz", - "integrity": "sha512-6D3Hm2gFixrfyx9XjSON4ml1FZTugqpkIz5Awvrou8fnpyprVzcm4X8pyGRtA2Piixjl3DqmX/HB1xdWyE097A==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/helper-wasm-section": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-opt": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "@webassemblyjs/wast-printer": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" } }, "@webassemblyjs/wasm-gen": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz", - "integrity": "sha512-a7O/wE6eBeVKKUYgpMK7NOHmMADD85rSXLe3CqrWRDwWff5y3cSVbzpN6Qv3z6C4hdkpq9qyij1Ga1kemOZGvQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wasm-opt": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz", - "integrity": "sha512-3lbQ0PT81NHCdi1sR/7+SNpZadM4qYcTSr62nFFAA7e5lFwJr14M1Gi+A/Y3PgcDWOHYjsaNGPpPU0H03N6Blg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-buffer": "1.7.8", - "@webassemblyjs/wasm-gen": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" } }, "@webassemblyjs/wasm-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz", - "integrity": "sha512-rZ/zlhp9DHR/05zh1MbAjT2t624sjrPP/OkJCjXqzm7ynH+nIdNcn9Ixc+qzPMFXhIrk0rBoQ3to6sEIvHh9jQ==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-wasm-bytecode": "1.7.8", - "@webassemblyjs/ieee754": "1.7.8", - "@webassemblyjs/leb128": "1.7.8", - "@webassemblyjs/utf8": "1.7.8" + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" } }, "@webassemblyjs/wast-parser": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz", - "integrity": "sha512-Q/zrvtUvzWuSiJMcSp90fi6gp2nraiHXjTV2VgAluVdVapM4gy1MQn7akja2p6eSBDQpKJPJ6P4TxRkghRS5dg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/floating-point-hex-parser": "1.7.8", - "@webassemblyjs/helper-api-error": "1.7.8", - "@webassemblyjs/helper-code-frame": "1.7.8", - "@webassemblyjs/helper-fsm": "1.7.8", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", "@xtuc/long": "4.2.1" } }, "@webassemblyjs/wast-printer": { - "version": "1.7.8", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz", - "integrity": "sha512-GllIthRtwTxRDAURRNXscu7Napzmdf1jt1gpiZiK/QN4fH0lSGs3OTmvdfsMNP7tqI4B3ZtfaaWRlNIQug6Xyg==", + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/wast-parser": "1.7.8", + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", "@xtuc/long": "4.2.1" } }, @@ -3704,6 +2641,22 @@ "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", "dev": true }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -3714,33 +2667,15 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", - "dev": true, "requires": { - "mime-types": "2.1.18", + "mime-types": "~2.1.18", "negotiator": "0.6.1" - }, - "dependencies": { - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "mime-db": "1.33.0" - } - } } }, "acorn": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", - "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, "acorn-dynamic-import": { @@ -3749,7 +2684,7 @@ "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", "dev": true, "requires": { - "acorn": "5.5.3" + "acorn": "^5.0.0" } }, "address": { @@ -3759,9 +2694,9 @@ "dev": true }, "adm-zip": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", - "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", + "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==", "dev": true }, "after": { @@ -3776,7 +2711,16 @@ "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { - "es6-promisify": "5.0.0" + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" } }, "airbnb-js-shims": { @@ -3785,39 +2729,38 @@ "integrity": "sha512-h8UtyB/TCdOwWoEPQJGHgsWwSnTqPrRZbhyZYjAwY9/AbjdjfkKy9L/T3fIFS6MKX8YrpWFRm6xqFSgU+2DRGw==", "dev": true, "requires": { - "array-includes": "3.0.3", - "array.prototype.flat": "1.2.1", - "array.prototype.flatmap": "1.2.1", - "es5-shim": "4.5.12", - "es6-shim": "0.35.3", - "function.prototype.name": "1.1.0", - "object.entries": "1.0.4", - "object.fromentries": "1.0.0", - "object.getownpropertydescriptors": "2.0.3", - "object.values": "1.0.4", - "promise.prototype.finally": "3.1.0", - "string.prototype.matchall": "3.0.0", - "string.prototype.padend": "3.0.0", - "string.prototype.padstart": "3.0.0", - "symbol.prototype.description": "1.0.0" + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", + "array.prototype.flatmap": "^1.2.1", + "es5-shim": "^4.5.10", + "es6-shim": "^0.35.3", + "function.prototype.name": "^1.1.0", + "object.entries": "^1.0.4", + "object.fromentries": "^1.0.0", + "object.getownpropertydescriptors": "^2.0.3", + "object.values": "^1.0.4", + "promise.prototype.finally": "^3.1.0", + "string.prototype.matchall": "^3.0.0", + "string.prototype.padend": "^3.0.0", + "string.prototype.padstart": "^3.0.0", + "symbol.prototype.description": "^1.0.0" } }, "ajv": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", - "dev": true, + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "requires": { - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1", - "uri-js": "3.0.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-errors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz", - "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true }, "ajv-keywords": { @@ -3838,28 +2781,79 @@ "integrity": "sha1-wNROkP/w+sleiyPwQ6zaf9HFHXw=", "dev": true, "requires": { - "loader-utils": "0.2.17" + "loader-utils": "^0.2.15" }, "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, "loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.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=", + "dev": true + } + } + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + }, + "string-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" } } } }, "ansi-colors": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.1.0.tgz", - "integrity": "sha512-hTv1qPdi+sVEk3jYsdjox5nQI0C9HTbjKShbCdYLKb1LOfNbb7wsF4d7OEKIZoxIHx02tSp3m94jcPW2EfMjmA==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "requires": { + "ansi-wrap": "^0.1.0" + } }, "ansi-escapes": { "version": "3.1.0", @@ -3867,6 +2861,14 @@ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", "dev": true }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -3876,27 +2878,43 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "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.1" + "color-convert": "^1.9.0" } }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + }, "anymatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, + "apache-crypt": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.1.tgz", + "integrity": "sha1-1vxyqm0n2ZyVqU/RiNcx7v/6Zjw=", + "requires": { + "unix-crypt-td-js": "^1.0.0" + } + }, + "apache-md5": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.2.tgz", + "integrity": "sha1-7klza2ObTxCLbp5ibG2pkwa0FpI=" + }, "app-root-dir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz", @@ -3915,7 +2933,7 @@ "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { - "default-require-extensions": "2.0.0" + "default-require-extensions": "^2.0.0" } }, "aproba": { @@ -3925,41 +2943,74 @@ "dev": true }, "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "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==", "dev": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", - "dev": true, + "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" + "sprintf-js": "~1.0.2" } }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" }, "array-filter": { "version": "0.0.1", @@ -3974,10 +3025,9 @@ "dev": true }, "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "array-includes": { "version": "3.0.3", @@ -3985,8 +3035,8 @@ "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "array-map": { @@ -4013,20 +3063,18 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "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=", - "dev": true + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "array.prototype.flat": { "version": "1.2.1", @@ -4034,9 +3082,9 @@ "integrity": "sha512-rVqIs330nLJvfC7JqYvEWwqVr5QjYF1ib02i3YJtR/fICO6527Tjpc/e4Mvmxh3GIePPreRXMdaGyC99YphWEw==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1" } }, "array.prototype.flatmap": { @@ -4045,9 +3093,9 @@ "integrity": "sha512-i18e2APdsiezkcqDyZor78Pbfjfds3S94dG6dgIV2ZASJaUf1N0dz2tGdrmwrmlZuNUgxH+wz6Z0zYVH2c5xzQ==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.10.0", + "function-bind": "^1.1.1" } }, "arraybuffer.slice": { @@ -4069,10 +3117,12 @@ "dev": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "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" + } }, "asn1.js": { "version": "4.10.1", @@ -4080,9 +3130,9 @@ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -4092,34 +3142,47 @@ "dev": true, "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=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } } }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", - "dev": true, + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "requires": { - "lodash": "4.17.11" + "lodash": "^4.17.10" } }, "async-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" }, "async-foreach": { "version": "0.1.3", @@ -4136,76 +3199,36 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "autoprefixer": { - "version": "8.6.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.5.tgz", - "integrity": "sha512-PLWJN3Xo/rycNkx+mp8iBDMTm3FeWe4VmYaZDSqL5QQB9sLsQkG5k8n+LNDFnhh9kdq2K+egL/icpctOmDHwig==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.3.tgz", + "integrity": "sha512-/XSnzDepRkAU//xLcXA/lUWxpsBuw0WiriAHOqnxkuCtzLhaz+fL4it4gp20BQ8n5SyLzK/FOc7A0+u/rti2FQ==", "dev": true, "requires": { - "browserslist": "3.2.8", - "caniuse-lite": "1.0.30000888", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.23", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30000888", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000888.tgz", - "integrity": "sha512-vftg+5p/lPsQGpnhSo/yBuYL36ai/cyjLvU3dOPJY1kkKrekLWIy8SLm+wzjX0hpCUdFTasC4/ZT7uqw4rKOnQ==", - "dev": true - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "postcss": { - "version": "6.0.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", - "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", - "dev": true, - "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==", - "dev": true - } + "browserslist": "^4.3.6", + "caniuse-lite": "^1.0.30000921", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.6", + "postcss-value-parser": "^3.3.1" } }, "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=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "babel-code-frame": { "version": "6.26.0", @@ -4213,9 +3236,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "ansi-styles": { @@ -4230,13 +3253,19 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "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" + "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" } }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", @@ -4246,19 +3275,19 @@ } }, "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true, - "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.11", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "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.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" }, "dependencies": { "jsesc": { @@ -4283,7 +3312,7 @@ }, "babel-helper-is-nodes-equiv": { "version": "0.0.1", - "resolved": "http://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", + "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", "dev": true }, @@ -4312,15 +3341,37 @@ "dev": true }, "babel-loader": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.4.tgz", - "integrity": "sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", + "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", "dev": true, "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1", - "util.promisify": "1.0.0" + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } } }, "babel-messages": { @@ -4329,63 +3380,29 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-macros": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.4.2.tgz", - "integrity": "sha512-NBVpEWN4OQ/bHnu1fyDaAaTPAjnhXCEPqr1RwqxrU7b6tZ2hypp+zX4hlNfmVGfClD5c3Sl6Hfj5TJNF5VG5aA==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.4.5.tgz", + "integrity": "sha512-+/9yteNQw3yuZ3krQUfjAeoT/f4EAdn3ELwhFfDj0rTMIaoHfIdrcLePOfIaL0qmFLpIcgPIL2Lzm58h+CGWaw==", "dev": true, "requires": { - "cosmiconfig": "5.0.6", - "resolve": "1.8.1" + "cosmiconfig": "^5.0.5", + "resolve": "^1.8.1" }, "dependencies": { "cosmiconfig": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", - "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.12.0", - "parse-json": "4.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "1.0.9", - "esprima": "4.0.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.2" - } - }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz", + "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==", "dev": true, "requires": { - "path-parse": "1.0.5" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" } } } @@ -4402,7 +3419,7 @@ "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", "dev": true, "requires": { - "babel-helper-evaluate-path": "0.5.0" + "babel-helper-evaluate-path": "^0.5.0" } }, "babel-plugin-minify-dead-code-elimination": { @@ -4411,10 +3428,10 @@ "integrity": "sha512-XQteBGXlgEoAKc/BhO6oafUdT4LBa7ARi55mxoyhLHNuA+RlzRmeMAfc31pb/UqU01wBzRc36YqHQzopnkd/6Q==", "dev": true, "requires": { - "babel-helper-evaluate-path": "0.5.0", - "babel-helper-mark-eval-scopes": "0.4.3", - "babel-helper-remove-or-void": "0.4.3", - "lodash.some": "4.6.0" + "babel-helper-evaluate-path": "^0.5.0", + "babel-helper-mark-eval-scopes": "^0.4.3", + "babel-helper-remove-or-void": "^0.4.3", + "lodash.some": "^4.6.0" } }, "babel-plugin-minify-flip-comparisons": { @@ -4423,7 +3440,7 @@ "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=", "dev": true, "requires": { - "babel-helper-is-void-0": "0.4.3" + "babel-helper-is-void-0": "^0.4.3" } }, "babel-plugin-minify-guarded-expressions": { @@ -4432,7 +3449,7 @@ "integrity": "sha1-zHCbRFP9IbHzAod0RMifiEJ845c=", "dev": true, "requires": { - "babel-helper-flip-expressions": "0.4.3" + "babel-helper-flip-expressions": "^0.4.3" } }, "babel-plugin-minify-infinity": { @@ -4447,7 +3464,7 @@ "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==", "dev": true, "requires": { - "babel-helper-mark-eval-scopes": "0.4.3" + "babel-helper-mark-eval-scopes": "^0.4.3" } }, "babel-plugin-minify-numeric-literals": { @@ -4468,9 +3485,9 @@ "integrity": "sha512-TM01J/YcKZ8XIQd1Z3nF2AdWHoDsarjtZ5fWPDksYZNsoOjQ2UO2EWm824Ym6sp127m44gPlLFiO5KFxU8pA5Q==", "dev": true, "requires": { - "babel-helper-flip-expressions": "0.4.3", - "babel-helper-is-nodes-equiv": "0.0.1", - "babel-helper-to-multiple-sequence-expressions": "0.5.0" + "babel-helper-flip-expressions": "^0.4.3", + "babel-helper-is-nodes-equiv": "^0.0.1", + "babel-helper-to-multiple-sequence-expressions": "^0.5.0" } }, "babel-plugin-minify-type-constructors": { @@ -4479,7 +3496,7 @@ "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=", "dev": true, "requires": { - "babel-helper-is-void-0": "0.4.3" + "babel-helper-is-void-0": "^0.4.3" } }, "babel-plugin-transform-inline-consecutive-adds": { @@ -4512,7 +3529,7 @@ "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "babel-plugin-transform-regexp-constructors": { @@ -4539,7 +3556,7 @@ "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", "dev": true, "requires": { - "babel-helper-evaluate-path": "0.5.0" + "babel-helper-evaluate-path": "^0.5.0" } }, "babel-plugin-transform-simplify-comparison-operators": { @@ -4560,29 +3577,29 @@ "integrity": "sha512-xj1s9Mon+RFubH569vrGCayA9Fm2GMsCgDRm1Jb8SgctOB7KFcrVc2o8K3YHUyMz+SWP8aea75BoS8YfsXXuiA==", "dev": true, "requires": { - "babel-plugin-minify-builtins": "0.5.0", - "babel-plugin-minify-constant-folding": "0.5.0", - "babel-plugin-minify-dead-code-elimination": "0.5.0", - "babel-plugin-minify-flip-comparisons": "0.4.3", - "babel-plugin-minify-guarded-expressions": "0.4.3", - "babel-plugin-minify-infinity": "0.4.3", - "babel-plugin-minify-mangle-names": "0.5.0", - "babel-plugin-minify-numeric-literals": "0.4.3", - "babel-plugin-minify-replace": "0.5.0", - "babel-plugin-minify-simplify": "0.5.0", - "babel-plugin-minify-type-constructors": "0.4.3", - "babel-plugin-transform-inline-consecutive-adds": "0.4.3", - "babel-plugin-transform-member-expression-literals": "6.9.4", - "babel-plugin-transform-merge-sibling-variables": "6.9.4", - "babel-plugin-transform-minify-booleans": "6.9.4", - "babel-plugin-transform-property-literals": "6.9.4", - "babel-plugin-transform-regexp-constructors": "0.4.3", - "babel-plugin-transform-remove-console": "6.9.4", - "babel-plugin-transform-remove-debugger": "6.9.4", - "babel-plugin-transform-remove-undefined": "0.5.0", - "babel-plugin-transform-simplify-comparison-operators": "6.9.4", - "babel-plugin-transform-undefined-to-void": "6.9.4", - "lodash.isplainobject": "4.0.6" + "babel-plugin-minify-builtins": "^0.5.0", + "babel-plugin-minify-constant-folding": "^0.5.0", + "babel-plugin-minify-dead-code-elimination": "^0.5.0", + "babel-plugin-minify-flip-comparisons": "^0.4.3", + "babel-plugin-minify-guarded-expressions": "^0.4.3", + "babel-plugin-minify-infinity": "^0.4.3", + "babel-plugin-minify-mangle-names": "^0.5.0", + "babel-plugin-minify-numeric-literals": "^0.4.3", + "babel-plugin-minify-replace": "^0.5.0", + "babel-plugin-minify-simplify": "^0.5.0", + "babel-plugin-minify-type-constructors": "^0.4.3", + "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", + "babel-plugin-transform-member-expression-literals": "^6.9.4", + "babel-plugin-transform-merge-sibling-variables": "^6.9.4", + "babel-plugin-transform-minify-booleans": "^6.9.4", + "babel-plugin-transform-property-literals": "^6.9.4", + "babel-plugin-transform-regexp-constructors": "^0.4.3", + "babel-plugin-transform-remove-console": "^6.9.4", + "babel-plugin-transform-remove-debugger": "^6.9.4", + "babel-plugin-transform-remove-undefined": "^0.5.0", + "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", + "babel-plugin-transform-undefined-to-void": "^6.9.4", + "lodash.isplainobject": "^4.0.6" } }, "babel-runtime": { @@ -4591,8 +3608,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.7", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -4601,11 +3618,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.11" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -4614,15 +3631,38 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "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.2", - "lodash": "4.17.11" + "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.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "babel-types": { @@ -4631,16 +3671,24 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.11", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "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=", + "dev": true + } } }, "babylon": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, "backo2": { @@ -4652,67 +3700,55 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -4723,9 +3759,9 @@ "dev": true }, "base64-js": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", - "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, "base64id": { @@ -4734,22 +3770,37 @@ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, + "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.5" + "tweetnacl": "^0.14.3" } }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=" + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -4766,15 +3817,14 @@ "dev": true }, "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", - "dev": true + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==" }, "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, "block-stream": { @@ -4783,7 +3833,7 @@ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "blocking-proxy": { @@ -4792,13 +3842,13 @@ "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.0" } }, "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", "dev": true }, "bn.js": { @@ -4808,64 +3858,113 @@ "dev": true }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", - "dev": true, + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" }, "dependencies": { - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boxen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-2.1.0.tgz", + "integrity": "sha512-luq3RQOt2U5sUX+fiu+qnT+wWnHDcATLpEe63jvge6GUZO99AKbVRfp97d2jgLvq1iQa0ORzaAm4lGVG52ZSlw==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.0.0", + "chalk": "^2.4.1", + "cli-boxes": "^1.0.0", + "string-width": "^3.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", "dev": true + }, + "string-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.0.0.tgz", + "integrity": "sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "strip-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + } } } }, - "bonjour": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", - "dev": true, - "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.3", - "multicast-dns-service-types": "1.1.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "bowser": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", - "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==", - "dev": true - }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, + "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", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -4873,27 +3972,25 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -4905,39 +4002,40 @@ "dev": true }, "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -4946,8 +4044,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -4956,13 +4054,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -4971,34 +4069,27 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "browserslist": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", - "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz", + "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000888", - "electron-to-chromium": "1.3.47" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30000888", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000888.tgz", - "integrity": "sha512-vftg+5p/lPsQGpnhSo/yBuYL36ai/cyjLvU3dOPJY1kkKrekLWIy8SLm+wzjX0hpCUdFTasC4/ZT7uqw4rKOnQ==", - "dev": true - } + "caniuse-lite": "^1.0.30000929", + "electron-to-chromium": "^1.3.103", + "node-releases": "^1.1.3" } }, "browserstack": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.1.tgz", - "integrity": "sha512-O8VMT64P9NOLhuIoD4YngyxBURefaSdR4QdhG8l6HZ9VxtU7jc3m6jLufFwKA5gaf7fetfB2TnRJnMxyob+heg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz", + "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==", "dev": true, "requires": { - "https-proxy-agent": "2.2.1" + "https-proxy-agent": "^2.2.1" } }, "buffer": { @@ -5007,9 +4098,17 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.2.3", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } } }, "buffer-alloc": { @@ -5018,8 +4117,8 @@ "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, "requires": { - "buffer-alloc-unsafe": "1.1.0", - "buffer-fill": "1.0.0" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, "buffer-alloc-unsafe": { @@ -5055,8 +4154,7 @@ "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 + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { "version": "3.0.0", @@ -5070,11 +4168,37 @@ "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", "dev": true }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.x" + }, + "dependencies": { + "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=" + } + } + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" }, "cacache": { "version": "10.0.4", @@ -5082,36 +4206,58 @@ "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.2", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.3.0", - "unique-filename": "1.1.0", - "y18n": "4.0.0" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" } }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" } }, "callsite": { @@ -5120,21 +4266,26 @@ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", "dev": true }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "dev": true, "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" }, "camelcase-keys": { "version": "2.1.0", @@ -5142,8 +4293,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" }, "dependencies": { "camelcase": { @@ -5155,9 +4306,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000842", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000842.tgz", - "integrity": "sha512-juspQHLwQRgptEM03HN66SpM/ggZUB+m49NAgJIaIS11aXVNeRB57sEY1X6tEzeK2THGvYWKZZu1wIbh+W7YTA==", + "version": "1.0.30000929", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz", + "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==", "dev": true }, "case-sensitive-paths-webpack-plugin": { @@ -5169,32 +4320,16 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", - "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "requires": { - "has-flag": "2.0.0" - } - } + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "character-entities": { @@ -5221,31 +4356,76 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + } + }, + "child-process-promise": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/child-process-promise/-/child-process-promise-2.2.1.tgz", + "integrity": "sha1-RzChHvYQ+tRQuPIjx50x172tgHQ=", + "dev": true, + "requires": { + "cross-spawn": "^4.0.2", + "node-version": "^1.0.0", + "promise-polyfill": "^6.0.1" + }, + "dependencies": { + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + } + } + }, "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" } }, "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true }, "chrome-trace-event": { @@ -5254,7 +4434,7 @@ "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "cipher-base": { @@ -5263,8 +4443,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "circular-dependency-plugin": { @@ -5274,30 +4454,28 @@ "dev": true }, "circular-json": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.7.tgz", - "integrity": "sha512-/pXoV1JA847qRKPrHbBK6YIBGFF8GOP4wzSgUOA7q0ew0vAv0iJswP+2/nZQ9uzA3Azi7eTrg9L2yzXc/7ZMIA==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", + "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", "dev": true }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -5319,7 +4497,7 @@ "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { - "source-map": "0.6.1" + "source-map": "~0.6.0" }, "dependencies": { "source-map": { @@ -5330,13 +4508,38 @@ } } }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" + } + }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.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=", + "dev": true + } } }, "cli-width": { @@ -5346,31 +4549,44 @@ "dev": true }, "clipboard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz", - "integrity": "sha512-7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", "requires": { - "good-listener": "1.2.2", - "select": "1.1.2", - "tiny-emitter": "2.0.2" + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" } }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, + "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": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "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" + } + } } }, "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, "clone-deep": { "version": "2.0.2", @@ -5378,20 +4594,17 @@ "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", "dev": true, "requires": { - "for-own": "1.0.0", - "is-plain-object": "2.0.4", - "kind-of": "6.0.2", - "shallow-clone": "1.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" } }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -5401,50 +4614,48 @@ "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=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codelyzer": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.4.4.tgz", - "integrity": "sha512-JgFMudx0n50IuE/ydAfnkksCwQkWSVWgYvhDPHZgDUbmsiYC22VuEXKu5l8Hhx9UJsLgjWDLjTAFGj2WaW5DUA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.5.0.tgz", + "integrity": "sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==", "dev": true, "requires": { - "app-root-path": "2.1.0", - "css-selector-tokenizer": "0.7.0", - "cssauron": "1.4.0", - "semver-dsl": "1.0.1", - "source-map": "0.5.7", - "sprintf-js": "1.1.1" + "app-root-path": "^2.1.0", + "css-selector-tokenizer": "^0.7.0", + "cssauron": "^1.4.0", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.1" }, "dependencies": { "sprintf-js": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true } } }, "codemirror": { - "version": "5.40.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.40.2.tgz", - "integrity": "sha512-yoWuvEiD3v5vTwdoMc/wu/Ld6dh9K/yEiEBTKOPGM+/pN0gTAqFNtrLHv1IJ1UJvzFpNRvMi92XCi3+8/iIaEw==" + "version": "5.43.0", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.43.0.tgz", + "integrity": "sha512-mljwQWUaWIf85I7QwTBryF2ASaIvmYAL4s5UCanCJFfKeXOKhrqdHWdHiZWAMNT+hjLTCnVx2S/SYTORIgxsgA==" }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "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" } @@ -5454,11 +4665,15 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" }, "combine-lists": { "version": "1.0.1", @@ -5466,16 +4681,15 @@ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, "requires": { - "lodash": "4.17.11" + "lodash": "^4.5.0" } }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "comma-separated-tokens": { @@ -5488,9 +4702,14 @@ } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", "dev": true }, "commondir": { @@ -5505,6 +4724,54 @@ "integrity": "sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg==", "dev": true }, + "compodoc": { + "version": "0.0.41", + "resolved": "https://registry.npmjs.org/compodoc/-/compodoc-0.0.41.tgz", + "integrity": "sha1-p2vCyh/YKny+CoLXJQyj6Qu8I3k=", + "requires": { + "@compodoc/ngd-core": "^2.0.0-alpha.1", + "@compodoc/ngd-transformer": "^2.0.0-alpha.3", + "cheerio": "^0.22.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "fs-extra": "^2.0.0", + "glob": "^7.1.1", + "gulp-util": "^3.0.8", + "handlebars": "^4.0.6", + "highlight.js": "^9.8.0", + "html-entities": "^1.2.0", + "live-server": "^1.2.0", + "lodash": "^4.17.3", + "lunr": "^0.7.2", + "marked": "^0.3.6", + "shelljs": "^0.7.6", + "typescript": "2.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "typescript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.2.0.tgz", + "integrity": "sha1-Ym8vxwCH0kgPIeuxLBiIKIyGFOM=" + } + } + }, "component-bind": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", @@ -5514,8 +4781,7 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "component-inherit": { "version": "0.0.3", @@ -5529,90 +4795,151 @@ "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", "dev": true, "requires": { - "mime-db": "1.36.0" + "mime-db": ">= 1.36.0 < 2" + } + }, + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "dev": true, + "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.2", + "vary": "~1.1.2" }, "dependencies": { - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "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==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, - "compression": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", - "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", - "dev": true, - "requires": { - "accepts": "1.3.5", - "bytes": "3.0.0", - "compressible": "2.0.15", - "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.2", - "vary": "1.1.2" + "concurrently": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.0.tgz", + "integrity": "sha512-pwzXCE7qtOB346LyO9eFWpkFJVO3JQZ/qU/feGeaAHiX1M3Rw3zgXKc5cZ8vSH5DGygkjzLFDzA/pwoQDkRNGg==", + "requires": { + "chalk": "^2.4.1", + "date-fns": "^1.23.0", + "lodash": "^4.17.10", + "read-pkg": "^4.0.1", + "rxjs": "^6.3.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^4.5.0", + "tree-kill": "^1.1.0", + "yargs": "^12.0.1" }, "dependencies": { - "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==", - "dev": true + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "^2.0.0" + } } } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-gslSSJx03QKa59cIKqeJO9HQ/WZMotvYJCuaUULrLpjj8oG40kV2Z+gz82pVxlTkOADi4PJxQPPfhl1ELYrrXw==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, "connect": { "version": "3.6.6", "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, "requires": { "debug": "2.6.9", "finalhandler": "1.1.0", - "parseurl": "1.3.2", + "parseurl": "~1.3.2", "utils-merge": "1.0.1" }, "dependencies": { - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "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.3.1", - "unpipe": "1.0.0" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "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=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, "console-browserify": { @@ -5621,7 +4948,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "console-control-strings": { @@ -5639,31 +4966,39 @@ "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", - "dev": true + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=", - "dev": true + "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=" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "requires": { + "safe-buffer": "~5.1.1" + } }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-concurrently": { "version": "1.0.5", @@ -5671,19 +5006,18 @@ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "copy-to-clipboard": { "version": "3.0.8", @@ -5691,35 +5025,67 @@ "integrity": "sha512-c3GdeY8qxCHGezVb1EFQfHYK/8NZRemgcTIzPq7PuxjHAf/raKibn2QdhHPb/y6q74PMgH6yizaDZlRmw6QyKw==", "dev": true, "requires": { - "toggle-selection": "1.0.6" + "toggle-selection": "^1.0.3" } }, "copy-webpack-plugin": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz", - "integrity": "sha512-zmC33E8FFSq3AbflTvqvPvBo621H36Afsxlui91d+QyZxPIuXghfnTsa1CuqiAaCPgJoSUWfTFbKJnadZpKEbQ==", - "dev": true, - "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "globby": "7.1.1", - "is-glob": "4.0.0", - "loader-utils": "1.1.0", - "minimatch": "3.0.4", - "p-limit": "1.2.0", - "serialize-javascript": "1.5.0" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + }, + "dependencies": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "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==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.3.tgz", + "integrity": "sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ==" }, "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=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^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=" + } + } }, "cosmiconfig": { "version": "4.0.0", @@ -5727,58 +5093,47 @@ "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", "dev": true, "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.12.0", - "parse-json": "4.0.0", - "require-from-string": "2.0.2" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.2" - } - } + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0", + "require-from-string": "^2.0.1" } }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.10" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "create-react-class": { @@ -5787,19 +5142,29 @@ "integrity": "sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg==", "dev": true, "requires": { - "fbjs": "0.8.17", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "fbjs": "^0.8.9", + "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=", + "dev": true + } } }, "cross-spawn": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", - "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", - "dev": true, + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "requires": { - "lru-cache": "4.1.2", - "which": "1.3.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-browserify": { @@ -5808,69 +5173,48 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.6", - "randomfill": "1.0.4" - } - }, - "css-in-js-utils": { - "version": "2.0.1", - "resolved": "http://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz", - "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==", - "dev": true, - "requires": { - "hyphenate-style-name": "1.0.2", - "isobject": "3.0.1" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "css-loader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.0.tgz", - "integrity": "sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "postcss": "6.0.23", - "postcss-modules-extract-imports": "1.2.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "2.0.0" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz", + "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash": "^4.17.11", + "postcss": "^6.0.23", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" }, "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, "postcss": { "version": "6.0.23", "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "source-map": { @@ -5891,30 +5235,62 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", + "boolbase": "~1.0.0", + "css-what": "2.1", "domutils": "1.5.1", - "nth-check": "1.0.1" + "nth-check": "~1.0.1" } }, "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=", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", "dev": true, "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } } }, "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=", - "dev": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==" }, "cssauron": { "version": "1.4.0", @@ -5922,7 +5298,7 @@ "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", "dev": true, "requires": { - "through": "2.3.8" + "through": "X.X.X" } }, "cssesc": { @@ -5931,19 +5307,13 @@ "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", "dev": true }, - "cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true - }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "custom-event": { @@ -5962,23 +5332,14 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "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=", - "dev": true - } + "assert-plus": "^1.0.0" } }, "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha1-EuYJzcuTUScxHQTTMzTilgoqVOY=" + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==" }, "date-format": { "version": "1.2.0", @@ -5992,25 +5353,28 @@ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=" + }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "deep-equal": { "version": "1.0.1", @@ -6024,14 +5388,43 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "dev": true + }, "default-gateway": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-2.7.2.tgz", "integrity": "sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ==", "dev": true, "requires": { - "execa": "0.10.0", - "ip-regex": "2.1.0" + "execa": "^0.10.0", + "ip-regex": "^2.1.0" + }, + "dependencies": { + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } } }, "default-require-extensions": { @@ -6040,7 +5433,7 @@ "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", "dev": true, "requires": { - "strip-bom": "3.0.0" + "strip-bom": "^3.0.0" }, "dependencies": { "strip-bom": { @@ -6052,59 +5445,48 @@ } }, "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "object-keys": "^1.0.12" } }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -6114,12 +5496,12 @@ "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", "dev": true, "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" + "globby": "^6.1.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "p-map": "^1.1.1", + "pify": "^3.0.0", + "rimraf": "^2.2.8" }, "dependencies": { "globby": { @@ -6128,11 +5510,11 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "pify": { @@ -6142,19 +5524,24 @@ "dev": true } } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true } } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegate": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha1-tmtxwxWFIuirV0T3INjKDCr1kWY=" + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" }, "delegates": { "version": "1.0.0", @@ -6163,10 +5550,9 @@ "dev": true }, "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { "version": "1.0.0", @@ -6174,15 +5560,14 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { "version": "4.0.0", @@ -6190,7 +5575,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "detect-node": { @@ -6200,13 +5585,30 @@ "dev": true }, "detect-port": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.2.3.tgz", - "integrity": "sha512-IDbrX6PxqnYy8jV4wSHBaJlErYKTJvW8OQb9F7xivl1iQLqiUYHGa+nZ61Do6+N5uuOn/pReXKNqI9rUn04vug==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", "dev": true, "requires": { - "address": "1.0.3", - "debug": "2.6.9" + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "di": { @@ -6215,6 +5617,33 @@ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", "dev": true }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "requires": { + "readable-stream": "1.1.x", + "streamsearch": "0.1.2" + }, + "dependencies": { + "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=" + } + } + }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -6222,24 +5651,23 @@ "dev": true }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" + "path-type": "^3.0.0" } }, "dns-equal": { @@ -6254,8 +5682,8 @@ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.1" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, "dns-txt": { @@ -6264,7 +5692,7 @@ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { - "buffer-indexof": "1.1.1" + "buffer-indexof": "^1.0.0" } }, "dom-converter": { @@ -6273,14 +5701,17 @@ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { - "utila": "0.4.0" + "utila": "~0.4" } }, "dom-helpers": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.3.1.tgz", - "integrity": "sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg==", - "dev": true + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.1.2" + } }, "dom-serialize": { "version": "2.2.1", @@ -6288,27 +5719,25 @@ "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "custom-event": "1.0.1", - "ent": "2.2.0", - "extend": "3.0.1", - "void-elements": "2.0.1" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "~1.1.1", + "entities": "~1.1.1" }, "dependencies": { "domelementtype": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" } } }, @@ -6325,36 +5754,47 @@ "dev": true }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" }, "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", - "dev": true, + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "requires": { - "domelementtype": "1.3.0" + "domelementtype": "1" } }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, + "dot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.2.tgz", + "integrity": "sha1-xzdwGfxOVQeYkosrmv62ar+h8vk=" + }, "dotenv": { - "version": "5.0.1", - "resolved": "http://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", - "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==", "dev": true }, + "dotenv-defaults": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dotenv-defaults/-/dotenv-defaults-1.0.2.tgz", + "integrity": "sha512-iXFvHtXl/hZPiFj++1hBg4lbKwGM+t/GlvELDnRtOFdjXyWP7mubkVr+eZGWG62kdsbulXAef6v/j6kiWc/xGA==", + "dev": true, + "requires": { + "dotenv": "^6.2.0" + } + }, "dotenv-expand": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz", @@ -6362,47 +5802,102 @@ "dev": true }, "dotenv-webpack": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.5.7.tgz", - "integrity": "sha1-xEOVqyHR/SjXmpCUKnsUsd69FF8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/dotenv-webpack/-/dotenv-webpack-1.7.0.tgz", + "integrity": "sha512-wwNtOBW/6gLQSkb8p43y0Wts970A3xtNiG/mpwj9MLUhtPCQG6i+/DSXXoNN7fbPCU/vQ7JjwGmgOeGZSSZnsw==", "dev": true, "requires": { - "dotenv": "5.0.1" + "dotenv-defaults": "^1.0.2" } }, "duplexer": { "version": "0.1.1", - "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "requires": { + "readable-stream": "~1.1.9" + }, + "dependencies": { + "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=" + } + } }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { "version": "2.6.1", @@ -6411,26 +5906,32 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.47", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.47.tgz", - "integrity": "sha1-dk6IfKkQTQGgrI6r7n38DizhQQQ=", + "version": "1.3.104", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.104.tgz", + "integrity": "sha512-ReDDCq4UFLVroskdyt4JEwKq+3SatPeUjFlhakdkUoaQMRXOh+XIS4aolnb4D31P9Po9C3CXyZk3fAnNT5XK3Q==", "dev": true }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -6440,8 +5941,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.12", @@ -6449,30 +5949,29 @@ "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dev": true, "requires": { - "iconv-lite": "0.4.19" + "iconv-lite": "~0.4.13" } }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "engine.io": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", - "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", "dev": true, "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.4", "base64id": "1.0.0", "cookie": "0.3.1", - "debug": "3.1.0", - "engine.io-parser": "2.1.2", - "ws": "3.3.3" + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" }, "dependencies": { "debug": { @@ -6483,6 +5982,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -6494,14 +5999,14 @@ "requires": { "component-emitter": "1.2.1", "component-inherit": "0.0.3", - "debug": "3.1.0", - "engine.io-parser": "2.1.2", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", "has-cors": "1.1.0", "indexof": "0.0.1", "parseqs": "0.0.5", "parseuri": "0.0.5", - "ws": "3.3.3", - "xmlhttprequest-ssl": "1.5.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { @@ -6513,31 +6018,37 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "engine.io-parser": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", - "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", "dev": true, "requires": { "after": "0.8.2", - "arraybuffer.slice": "0.0.7", + "arraybuffer.slice": "~0.0.7", "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary2": "1.0.3" + "blob": "0.0.5", + "has-binary2": "~1.0.2" } }, "enhanced-resolve": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", - "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.0.0" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, "ent": { @@ -6547,9 +6058,14 @@ "dev": true }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", "dev": true }, "errno": { @@ -6558,40 +6074,40 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, + "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" + "is-arrayish": "^0.2.1" } }, "es-abstract": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", - "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "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==", "dev": true, "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es5-shim": { @@ -6601,9 +6117,9 @@ "dev": true }, "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", "dev": true }, "es6-promisify": { @@ -6612,28 +6128,19 @@ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "es6-promise": "4.2.4" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", - "dev": true - } + "es6-promise": "^4.0.3" } }, "es6-shim": { - "version": "0.35.3", - "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.3.tgz", - "integrity": "sha1-m/tzY/7//4emzbbNk+QF7DxLbyY=", + "version": "0.35.4", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.4.tgz", + "integrity": "sha512-oJidbXjN/VWXZJs41E9JEqWzcFbjt43JupimIoVX82Thzt5qy1CiYezdhRmWkj3KOuwJ106IG/ZZrcFC6fgIUQ==", "dev": true }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -6646,17 +6153,17 @@ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" }, "dependencies": { - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true }, "source-map": { @@ -6666,7 +6173,7 @@ "dev": true, "optional": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -6677,15 +6184,22 @@ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } } }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esrecurse": { "version": "4.2.1", @@ -6693,13 +6207,21 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", "dev": true }, "esutils": { @@ -6710,28 +6232,39 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "requires": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } }, "eventemitter3": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", - "dev": true + "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=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", "dev": true }, "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "requires": { - "original": "1.0.2" + "original": "^1.0.0" } }, "evp_bytestokey": { @@ -6740,38 +6273,22 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", - "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", - "dev": true, + "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.5", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.5.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - } + "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" } }, "exenv": { @@ -6792,9 +6309,9 @@ "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", "dev": true, "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" }, "dependencies": { "array-unique": { @@ -6809,7 +6326,7 @@ "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", "dev": true, "requires": { - "expand-range": "0.1.1" + "expand-range": "^0.1.0" } }, "expand-range": { @@ -6818,8 +6335,8 @@ "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", "dev": true, "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" } }, "is-number": { @@ -6840,34 +6357,44 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.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" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -6877,7 +6404,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.4" + "fill-range": "^2.1.0" }, "dependencies": { "fill-range": { @@ -6886,11 +6413,11 @@ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "3.1.0", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "is-number": { @@ -6899,9 +6426,15 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", @@ -6910,6 +6443,15 @@ "requires": { "isarray": "1.0.0" } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, @@ -6919,121 +6461,100 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "express": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", - "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", - "dev": true, + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.5", "array-flatten": "1.1.1", - "body-parser": "1.18.2", + "body-parser": "1.18.3", "content-disposition": "0.5.2", - "content-type": "1.0.4", + "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", + "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", + "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", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", "send": "0.16.2", "serve-static": "1.13.2", "setprototypeof": "1.1.0", - "statuses": "1.4.0", - "type-is": "1.6.16", + "statuses": "~1.4.0", + "type-is": "~1.6.16", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "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==", - "dev": true + "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-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==", - "dev": true, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "requires": { - "mime-db": "1.33.0" + "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" } }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true - }, - "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "2.1.18" - } + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -7044,9 +6565,9 @@ "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", "dev": true, "requires": { - "chardet": "0.7.0", - "iconv-lite": "0.4.24", - "tmp": "0.0.33" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, "dependencies": { "iconv-lite": { @@ -7055,7 +6576,7 @@ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } } } @@ -7064,90 +6585,100 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } }, "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=", - "dev": true + "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=" + }, + "fast-glob": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } }, "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=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", @@ -7156,9 +6687,9 @@ "dev": true }, "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", "dev": true }, "fault": { @@ -7167,7 +6698,7 @@ "integrity": "sha512-o2eo/X2syzzERAtN5LcGbiVQ0WwZSlN3qLtadwAz3X8Bu+XWD16dja/KMsjZLiQr+BLGPDnHGkc4yUJf1Xpkpw==", "dev": true, "requires": { - "format": "0.2.2" + "format": "^0.2.2" } }, "faye-websocket": { @@ -7175,7 +6706,7 @@ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } }, "fbjs": { @@ -7184,13 +6715,13 @@ "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", "dev": true, "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" + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" }, "dependencies": { "core-js": { @@ -7198,26 +6729,73 @@ "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true } } }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz", + "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" } }, - "file-loader": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", - "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "file-system-cache": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-1.0.5.tgz", + "integrity": "sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08=", "dev": true, "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.4.5" + "bluebird": "^3.3.5", + "fs-extra": "^0.30.0", + "ramda": "^0.21.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + } } }, "filename-regex": { @@ -7232,8 +6810,8 @@ "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "dev": true, "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" + "glob": "^7.0.3", + "minimatch": "^3.0.3" } }, "filesize": { @@ -7246,45 +6824,49 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "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" + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" }, "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -7294,9 +6876,9 @@ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, "find-parent-dir": { @@ -7306,41 +6888,81 @@ "dev": true }, "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, + "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": "2.0.0" + "locate-path": "^3.0.0" } }, + "flatted": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz", + "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==", + "dev": true + }, "flush-write-stream": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "follow-redirects": { - "version": "1.5.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.8.tgz", - "integrity": "sha512-sy1mXPmv7kLAMKW/8XofG7o9T+6gAjzdZK4AJF6ryqQYUa/hnzgiypoeUecZ53x7XiqKNEpNqLtS97MshW2nxg==", - "dev": true, + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", + "integrity": "sha512-t2JCjbzxQpWvbhts3l6SH1DKzSrx8a+SsaVf4h6bG4kOXUuPYS/kg2Lr4gQSb7eemaHqJkOThF1BGyjlUkO1GQ==", "requires": { - "debug": "3.1.0" + "debug": "=3.1.0" }, "dependencies": { "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -7352,8 +6974,7 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "1.0.0", @@ -7361,392 +6982,38 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "fork-ts-checker-webpack-plugin": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.4.9.tgz", - "integrity": "sha512-uoUSu2qo8GpoonMrKtPlpIqPfRTO0vVLA1Gh2bPaDSyZ2zoUukrXCc38pJtYYNVLpvlv+g0PNr/9SheFyVAR4w==", + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.4.15.tgz", + "integrity": "sha512-qNYuygh2GxXehBvQZ5rI5YlQFn+7ZV6kmkyD9Sgs33dWl73NZdUOB5aCp8v0EXJn176AhPrZP8YCMT3h01fs+g==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "chalk": "2.4.1", - "chokidar": "2.0.4", - "lodash.endswith": "4.2.1", - "lodash.isfunction": "3.0.9", - "lodash.isstring": "4.0.1", - "lodash.startswith": "4.2.1", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "tapable": "1.0.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } + "babel-code-frame": "^6.22.0", + "chalk": "^2.4.1", + "chokidar": "^2.0.4", + "lodash": "^4.17.11", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "resolve": "^1.5.0", + "tapable": "^1.0.0" } }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, + "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.17" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - } + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, "format": { @@ -7755,26 +7022,33 @@ "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", "dev": true }, + "format-util": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/format-util/-/format-util-1.0.3.tgz", + "integrity": "sha1-Ay3KShFiYqEsQ/TD7IVmQWxbLZU=" + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", - "dev": true + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" }, "from2": { "version": "2.3.0", @@ -7782,8 +7056,40 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "fs": { @@ -7798,18 +7104,27 @@ "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { - "null-check": "1.0.0" + "null-check": "^1.0.0" } }, "fs-extra": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", - "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "minipass": "^2.2.1" } }, "fs-write-stream-atomic": { @@ -7818,295 +7133,293 @@ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.3" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "optional": true, "requires": { - "nan": "2.10.0", - "node-pre-gyp": "0.10.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, "optional": true }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, "optional": true }, "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, + "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==", "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "optional": true }, "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=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "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=", - "dev": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "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=", - "dev": true, "optional": true }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "optional": true, "requires": { "ms": "2.0.0" } }, "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", - "dev": true, + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "optional": true }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, "optional": true }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, "optional": true }, "fs-minipass": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, "optional": true }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, "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.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "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" + "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" } }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, "optional": true }, "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "dev": true, + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, "optional": true }, "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=", - "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, "optional": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", - "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", - "dev": true, + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -8115,168 +7428,144 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, "optional": true }, "needle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", - "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", - "dev": true, + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz", - "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", - "dev": true, + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", - "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", - "dev": true, + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", "optional": true }, "npm-packlist": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", - "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", + "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~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=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, "optional": true }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, "optional": true }, "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=", - "dev": true, "optional": true }, "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "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=", - "dev": true, "optional": true }, "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==", - "dev": true, "optional": true }, "rc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", - "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", - "dev": true, + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "optional": true, "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, "optional": true } } @@ -8285,150 +7574,133 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "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.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "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" } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "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==", - "dev": true, "optional": true }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, "optional": true }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true, + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "optional": true }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, "optional": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, "optional": true }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^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==", - "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.1" + "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=", - "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, "optional": true }, "tar": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", - "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", - "dev": true, + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "optional": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, "optional": true }, "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" } } }, @@ -8438,10 +7710,10 @@ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "function-bind": { @@ -8456,15 +7728,15 @@ "integrity": "sha512-Bs0VRrTz4ghD8pTmbJQD1mZ8A/mN0ur/jGz+A6FBxPDUPkm1tNfF6bhTYPA7i7aF4lZJVr+OXTNNrnnIl58Wfg==", "dev": true, "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "is-callable": "1.1.3" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "is-callable": "^1.1.3" } }, "fuse.js": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.2.1.tgz", - "integrity": "sha1-YyDLlM5W7JdVyJred1vNuwNY1CU=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-3.3.0.tgz", + "integrity": "sha512-ESBRkGLWMuVkapqYCcNO1uqMg5qbCKkgb+VS6wsy17Rix0/cMS9kSOZoYkjH8Ko//pgJ/EEGu0GTjk2mjX2LGQ==", "dev": true }, "gauge": { @@ -8473,14 +7745,42 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": 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.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "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=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } } }, "gaze": { @@ -8489,20 +7789,19 @@ "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", "dev": true, "requires": { - "globule": "1.2.1" + "globule": "^1.0.0" } }, - "generate-page-webpack-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/generate-page-webpack-plugin/-/generate-page-webpack-plugin-1.1.1.tgz", - "integrity": "sha512-b782eo6JiJ06jYn4mcOtR/wkACN6eGRwAElM5djb/JCgbGbSzrPsnPTlX2Aa91sXe5pNszAQP6MRE1fVSGIz4g==", + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", "dev": true }, "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=", - "dev": true + "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-stdin": { "version": "4.0.1", @@ -8511,46 +7810,37 @@ "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "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" + } }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "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=", - "dev": true - } + "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "dev": true, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "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" + "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" } }, "glob-base": { @@ -8559,8 +7849,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "glob-parent": { @@ -8569,7 +7859,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "is-extglob": { @@ -8584,7 +7874,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -8593,31 +7883,35 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, "global": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", "dev": true, "requires": { - "min-document": "2.19.0", - "process": "0.5.2" + "min-document": "^2.19.0", + "process": "~0.5.1" }, "dependencies": { "process": { @@ -8634,9 +7928,9 @@ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { @@ -8645,18 +7939,17 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.0" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", - "dev": true + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", + "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==" }, "globby": { "version": "7.1.1", @@ -8664,12 +7957,12 @@ "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "dev": true, "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.10", - "pify": "3.0.0", - "slash": "1.0.0" + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" } }, "globule": { @@ -8678,9 +7971,17 @@ "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", "dev": true, "requires": { - "glob": "7.1.2", - "lodash": "4.17.11", - "minimatch": "3.0.4" + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "requires": { + "sparkles": "^1.0.0" } }, "good-listener": { @@ -8688,97 +7989,134 @@ "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", "requires": { - "delegate": "3.2.0" + "delegate": "^3.1.2" } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "requires": { + "array-differ": "^1.0.0", + "array-uniq": "^1.0.2", + "beeper": "^1.0.0", + "chalk": "^1.0.0", + "dateformat": "^2.0.0", + "fancy-log": "^1.1.0", + "gulplog": "^1.0.0", + "has-gulplog": "^0.1.0", + "lodash._reescape": "^3.0.0", + "lodash._reevaluate": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.template": "^3.0.0", + "minimist": "^1.1.0", + "multipipe": "^0.1.2", + "object-assign": "^3.0.0", + "replace-ext": "0.0.1", + "through2": "^2.0.0", + "vinyl": "^0.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "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" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "requires": { + "glogg": "^1.0.0" + } }, "gzip-size": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-4.1.0.tgz", - "integrity": "sha1-iuCWJX6r59acRb4rZ8RIEk/7UXw=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", "dev": true, "requires": { - "duplexer": "0.1.1", - "pify": "3.0.0" + "duplexer": "^0.1.1", + "pify": "^3.0.0" } }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", + "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", "dev": true }, "handlebars": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", - "dev": true, "requires": { - "async": "2.6.0", - "optimist": "0.6.1", - "source-map": "0.6.1", - "uglify-js": "3.4.9" + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "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=", - "dev": true, + "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": "5.5.2", - "har-schema": "2.0.0" - }, - "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - } + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "1.1.1" + "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=", - "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-binary2": { @@ -8807,8 +8145,15 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "requires": { + "sparkles": "^1.0.0" + } }, "has-symbols": { "version": "1.0.0", @@ -8826,89 +8171,67 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } }, "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "hast-util-parse-selector": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.0.tgz", - "integrity": "sha512-trw0pqZN7+sH9k7hPWCJNZUbWW2KroSIM/XpIy3G5ZMtx9LSabCyoSp4skJZ4q/eZ5UOBPtvWh4W9c+RE3HRoQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.1.tgz", + "integrity": "sha512-Xyh0v+nHmQvrOqop2Jqd8gOdyQtE8sIP9IQf7mlVDqp924W4w/8Liuguk2L2qei9hARnQSG2m+wAOCxM7npJVw==", "dev": true }, "hastscript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-4.0.0.tgz", - "integrity": "sha512-zrN3fborQZT6+DJZOCKpeafzYIjs3y4ymzHGExBmUFSqwjqrRbH8DYDDbPsNLkVW0YDvoKdQ1c6wMLcZuoZDmg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.0.0.tgz", + "integrity": "sha512-xJtuJ8D42Xtq5yJrnDg/KAIxl2cXBXKoiIJwmWX9XMf8113qHTGl/Bf7jEsxmENJ4w6q4Tfl8s/Y6mEZo8x8qw==", "dev": true, "requires": { - "comma-separated-tokens": "1.0.5", - "hast-util-parse-selector": "2.2.0", - "property-information": "4.2.0", - "space-separated-tokens": "1.1.2" + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.2.0", + "property-information": "^5.0.1", + "space-separated-tokens": "^1.0.0" } }, "hat": { @@ -8918,16 +8241,15 @@ "dev": true }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "highlight.js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", - "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=", - "dev": true + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.13.1.tgz", + "integrity": "sha512-Sc28JNQNDzaH6PORtRLMvif9RSn1mYuOoX3omVjnb0+HbpPygU2ALBI0R/wsiqCb4/fcp07Gdo8g+fhtFrQl6A==" }, "hmac-drbg": { "version": "1.0.1", @@ -8935,9 +8257,9 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoist-non-react-statics": { @@ -8952,14 +8274,13 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" }, "hpack.js": { "version": "2.1.6", @@ -8967,109 +8288,116 @@ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, "requires": { - "inherits": "2.0.3", - "obuf": "1.1.2", - "readable-stream": "2.3.3", - "wbuf": "1.7.3" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "html-entities": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", - "dev": true + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" }, "html-minifier": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.20.tgz", - "integrity": "sha512-ZmgNLaTp54+HFKkONyLFEfs5dd/ZOtlquKaTnqIWFmx3Av5zG6ZPcV2d0o9XM2fXOTxxIf6eDcwzFFotke/5zA==", - "dev": true, - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.2.1", - "commander": "2.17.1", - "he": "1.1.1", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.4.9" + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } } }, "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz", + "integrity": "sha512-y5l4lGxOW3pz3xBTFdfB9rnnrWRPVxlAhX6nrBYIcW+2k2zC3mSp/3DxlWVCMBfnO6UAnoF8OcFn0IMy6kaKAQ==", "dev": true, "requires": { - "html-minifier": "3.5.20", - "loader-utils": "0.2.17", - "lodash": "4.17.11", - "pretty-error": "2.1.1", - "tapable": "1.0.0", - "toposort": "1.0.7", + "html-minifier": "^3.5.20", + "loader-utils": "^1.1.0", + "lodash": "^4.17.11", + "pretty-error": "^2.1.1", + "tapable": "^1.1.0", "util.promisify": "1.0.0" - }, - "dependencies": { - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - } } }, "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "dev": true, + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", + "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", "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=", - "dev": true, - "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=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "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=", - "dev": true - } + "domelementtype": "^1.3.0", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6" + } + }, + "http-auth": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-3.1.3.tgz", + "integrity": "sha1-lFz63WZSHq+PfISRPTd9exXyTjE=", + "requires": { + "apache-crypt": "^1.1.2", + "apache-md5": "^1.0.6", + "bcryptjs": "^2.3.0", + "uuid": "^3.0.0" } }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", @@ -9077,62 +8405,84 @@ "dev": true }, "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", - "dev": true, + "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.1", + "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.3.1" + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "dependencies": { - "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", - "dev": true + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" } } }, "http-parser-js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", - "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", + "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" }, "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.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { - "eventemitter3": "3.1.0", - "follow-redirects": "1.5.8", - "requires-port": "1.0.0" + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "http-proxy-middleware": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", - "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", - "dev": true, + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "requires": { - "http-proxy": "1.17.0", - "is-glob": "4.0.0", - "lodash": "4.17.11", - "micromatch": "3.1.10" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" } }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -9147,38 +8497,37 @@ "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "dev": true, "requires": { - "agent-base": "4.2.1", - "debug": "3.2.4" + "agent-base": "^4.1.0", + "debug": "^3.1.0" }, "dependencies": { "debug": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.4.tgz", - "integrity": "sha512-fCEG5fOr7m/fhgOD3KurdAov706JbXZJYXAsAOEJ7GgasGr0GO4N+1NsIcrjlIUcyvJ9oZlnelTzN3Ix8z1ecw==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true } } }, - "hyphenate-style-name": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz", - "integrity": "sha1-MRYKNpMK2vH8BMYHT360FGXU7Es=", - "dev": true + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "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": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=", - "dev": true + "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 < 3" + } }, "icss-replace-symbols": { "version": "1.1.0", @@ -9192,13 +8541,32 @@ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "dev": true, "requires": { - "postcss": "6.0.22" + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "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==", + "dev": true + } } }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", "dev": true }, "iferr": { @@ -9213,6 +8581,15 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -9226,6 +8603,12 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "dev": true }, + "immer": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/immer/-/immer-1.7.2.tgz", + "integrity": "sha512-4Urocwu9+XLDJw4Tc6ZCg7APVjjLInCFvO4TwGsAYV5zT6YYSor14dsZR0+0tHlDIN92cFUOq+i7fC00G5vTxA==", + "dev": true + }, "immutable": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", @@ -9238,7 +8621,17 @@ "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", "dev": true, "requires": { - "import-from": "2.1.0" + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, "import-from": { @@ -9247,7 +8640,7 @@ "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "import-local": { @@ -9256,60 +8649,17 @@ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { - "pkg-dir": "3.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" }, "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "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==", - "dev": true, - "requires": { - "p-limit": "2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "3.0.0" + "find-up": "^3.0.0" } } } @@ -9332,7 +8682,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexof": { @@ -9345,10 +8695,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -9362,66 +8711,40 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "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=", - "dev": true, - "requires": { - "bowser": "1.9.4", - "css-in-js-utils": "2.0.1" - } - }, "inquirer": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", - "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", - "dev": true, - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.2.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "3.0.3", - "figures": "2.0.0", - "lodash": "4.17.11", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "6.3.3", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", "dev": true }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "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=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^4.0.0" } } } @@ -9432,30 +8755,28 @@ "integrity": "sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q==", "dev": true, "requires": { - "default-gateway": "2.7.2", - "ipaddr.js": "1.6.0" + "default-gateway": "^2.6.0", + "ipaddr.js": "^1.5.2" } }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==" }, "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "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=", - "dev": true + "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": { "version": "1.1.5", @@ -9470,18 +8791,26 @@ "dev": true }, "ipaddr.js": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", - "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", - "dev": true + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" + }, + "dependencies": { + "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.5" + } + } } }, "is-alphabetical": { @@ -9496,53 +8825,58 @@ "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", "dev": true, "requires": { - "is-alphabetical": "1.0.2", - "is-decimal": "1.0.2" + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "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=", - "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true + "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=", - "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" + }, + "dependencies": { + "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.5" + } + } } }, "is-date-object": { @@ -9561,18 +8895,16 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, @@ -9600,20 +8932,18 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "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=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.0.2", @@ -9621,25 +8951,20 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "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=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } + "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-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-hexadecimal": { @@ -9652,25 +8977,17 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-odd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", - "dev": true, "requires": { - "is-number": "4.0.0" + "kind-of": "^3.0.2" }, "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==", - "dev": true + "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.5" + } } } }, @@ -9681,12 +8998,12 @@ "dev": true }, "is-path-in-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", - "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "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==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -9695,16 +9012,15 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-posix-bracket": { @@ -9731,26 +9047,28 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-root": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", - "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", + "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==", "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", @@ -9766,20 +9084,17 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, "isbinaryfile": { "version": "3.0.3", @@ -9787,20 +9102,18 @@ "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", "dev": true, "requires": { - "buffer-alloc": "1.2.0" + "buffer-alloc": "^1.2.0" } }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isomorphic-fetch": { "version": "2.2.1", @@ -9808,15 +9121,26 @@ "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", "dev": true, "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "3.0.0" + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } } }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "istanbul": { "version": "0.4.5", @@ -9824,20 +9148,20 @@ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "escodegen": "1.8.1", - "esprima": "2.7.3", - "glob": "5.0.15", - "handlebars": "4.0.12", - "js-yaml": "3.12.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "1.1.7", - "supports-color": "3.2.3", - "which": "1.3.0", - "wordwrap": "1.0.0" + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" }, "dependencies": { "async": { @@ -9846,17 +9170,23 @@ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-flag": { @@ -9877,7 +9207,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } }, "wordwrap": { @@ -9894,29 +9224,20 @@ "integrity": "sha512-8W5oeAGWXhtTJjAyVfvavOLVyZCTNCKsyF6GON/INKlBdO7uJ/bv3qnPj5M6ERKzmMCJS1kntnjjGuJ86fn3rQ==", "dev": true, "requires": { - "async": "2.6.1", - "compare-versions": "3.4.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "2.0.1", - "istanbul-lib-hook": "2.0.1", - "istanbul-lib-instrument": "3.0.0", - "istanbul-lib-report": "2.0.2", - "istanbul-lib-source-maps": "2.0.1", - "istanbul-reports": "2.0.1", - "js-yaml": "3.12.0", - "make-dir": "1.3.0", - "once": "1.4.0" + "async": "^2.6.1", + "compare-versions": "^3.2.1", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.1", + "istanbul-lib-hook": "^2.0.1", + "istanbul-lib-instrument": "^3.0.0", + "istanbul-lib-report": "^2.0.2", + "istanbul-lib-source-maps": "^2.0.1", + "istanbul-reports": "^2.0.1", + "js-yaml": "^3.12.0", + "make-dir": "^1.3.0", + "once": "^1.4.0" }, "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", - "dev": true, - "requires": { - "lodash": "4.17.11" - } - }, "istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -9929,13 +9250,13 @@ "integrity": "sha512-eQY9vN9elYjdgN9Iv6NS/00bptm02EBBk70lRMaVjeA6QYocQgenVrSgC28TJurdnZa80AGO3ASdFN+w/njGiQ==", "dev": true, "requires": { - "@babel/generator": "7.1.2", - "@babel/parser": "7.1.2", - "@babel/template": "7.1.2", - "@babel/traverse": "7.1.0", - "@babel/types": "7.1.2", - "istanbul-lib-coverage": "2.0.1", - "semver": "5.5.1" + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "istanbul-lib-coverage": "^2.0.1", + "semver": "^5.5.0" } } } @@ -9946,10 +9267,10 @@ "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", "dev": true, "requires": { - "convert-source-map": "1.5.1", - "istanbul-lib-instrument": "1.10.2", - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "convert-source-map": "^1.5.0", + "istanbul-lib-instrument": "^1.7.3", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0" }, "dependencies": { "ajv": { @@ -9958,19 +9279,31 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, + "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=", + "dev": true + }, + "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=", + "dev": true + }, "schema-utils": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "ajv": "5.5.2" + "ajv": "^5.0.0" } } } @@ -9987,7 +9320,7 @@ "integrity": "sha512-ufiZoiJ8CxY577JJWEeFuxXZoMqiKpq/RqZtOAYuQLvlkbJWscq9n3gc4xrCGH9n4pW0qnTxOz1oyMmVtk8E1w==", "dev": true, "requires": { - "append-transform": "1.0.0" + "append-transform": "^1.0.0" } }, "istanbul-lib-instrument": { @@ -9996,13 +9329,13 @@ "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", "dev": true, "requires": { - "babel-generator": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.1", - "semver": "5.5.1" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" } }, "istanbul-lib-report": { @@ -10011,9 +9344,9 @@ "integrity": "sha512-rJ8uR3peeIrwAxoDEbK4dJ7cqqtxBisZKCuwkMtMv0xYzaAnsAi3AHrHPAAtNXzG/bcCgZZ3OJVqm1DTi9ap2Q==", "dev": true, "requires": { - "istanbul-lib-coverage": "2.0.1", - "make-dir": "1.3.0", - "supports-color": "5.4.0" + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "supports-color": "^5.4.0" }, "dependencies": { "istanbul-lib-coverage": { @@ -10030,20 +9363,20 @@ "integrity": "sha512-30l40ySg+gvBLcxTrLzR4Z2XTRj3HgRCA/p2rnbs/3OiTaoj054gAbuP5DcLOtwqmy4XW8qXBHzrmP2/bQ9i3A==", "dev": true, "requires": { - "debug": "3.2.5", - "istanbul-lib-coverage": "2.0.1", - "make-dir": "1.3.0", - "rimraf": "2.6.2", - "source-map": "0.6.1" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^2.0.1", + "make-dir": "^1.3.0", + "rimraf": "^2.6.2", + "source-map": "^0.6.1" }, "dependencies": { "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } }, "istanbul-lib-coverage": { @@ -10052,12 +9385,6 @@ "integrity": "sha512-nPvSZsVlbG9aLhZYaC3Oi1gT/tpyo3Yt5fNyf6NmcKIayz4VV/txxJFFKAK/gU4dcNn8ehsanBbVHVl0+amOLA==", "dev": true }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10072,7 +9399,7 @@ "integrity": "sha512-CT0QgMBJqs6NJLF678ZHcquUAZIoBIUNzdJrRJfpkI9OnzG6MkUfHxbJC3ln981dMswC7/B1mfX3LNkhgJxsuw==", "dev": true, "requires": { - "handlebars": "4.0.12" + "handlebars": "^4.0.11" } }, "jasmine": { @@ -10081,17 +9408,9 @@ "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", "dev": true, "requires": { - "exit": "0.1.2", - "glob": "7.1.2", - "jasmine-core": "2.8.0" - }, - "dependencies": { - "jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", - "dev": true - } + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" } }, "jasmine-core": { @@ -10106,7 +9425,7 @@ "integrity": "sha1-k8zC3MQQKMXd1GBlWAdIOfLe6qg=", "dev": true, "requires": { - "diff": "3.5.0" + "diff": "^3.2.0" } }, "jasmine-reporters": { @@ -10115,8 +9434,8 @@ "integrity": "sha512-u/7AT9SkuZsUfFBLLzbErohTGNsEUCKaQbsVYnLFW1gEuL2DzmBL4n8v90uZsqIqlWvWUgian8J6yOt5Fyk/+A==", "dev": true, "requires": { - "mkdirp": "0.5.1", - "xmldom": "0.1.27" + "mkdirp": "^0.5.1", + "xmldom": "^0.1.22" } }, "jasmine-spec-reporter": { @@ -10126,6 +9445,14 @@ "dev": true, "requires": { "colors": "1.1.2" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + } } }, "jasminewd2": { @@ -10135,77 +9462,70 @@ "dev": true }, "js-base64": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz", - "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", + "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==", "dev": true }, "js-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.4.tgz", - "integrity": "sha512-PxfGzSs0ztShKrUYPIn5r0MtyAhYcCwmndozzpz8YObbPnD1jFxzlBGbRnX2mIu6Z13xN6+PTu05TQFnZFlzow==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", + "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "requires": { - "argparse": "1.0.9", - "esprima": "4.0.1" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } + "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=", - "dev": true, - "optional": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-ref-parser": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-6.0.3.tgz", + "integrity": "sha512-Ds/0541IPed88JSiMb3CBeUsxfL5Eosc0r97z0QMSXiBJTYKZLhOAGZd8zFVfpkKaRb4zDAnumyFYxnHLmbQmw==", + "requires": { + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.12.1", + "ono": "^4.0.11" + } }, "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=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { "version": "3.3.2", @@ -10213,17 +9533,19 @@ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" }, "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "requires": { + "minimist": "^1.2.0" + } }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -10232,24 +9554,31 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsonschema": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", + "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==" + }, + "jsonschema-draft4": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jsonschema-draft4/-/jsonschema-draft4-1.0.0.tgz", + "integrity": "sha1-8K8gBQVPDwrefqIRhhS2ncUS2GU=" + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "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=", - "dev": true - } } }, "jszip": { @@ -10258,11 +9587,11 @@ "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", "dev": true, "requires": { - "core-js": "2.3.0", - "es6-promise": "3.0.2", - "lie": "3.1.1", - "pako": "1.0.6", - "readable-stream": "2.0.6" + "core-js": "~2.3.0", + "es6-promise": "~3.0.2", + "lie": "~3.1.0", + "pako": "~1.0.2", + "readable-stream": "~2.0.6" }, "dependencies": { "core-js": { @@ -10271,18 +9600,36 @@ "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", "dev": true }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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=", + "dev": true + }, "readable-stream": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", "dev": true, "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" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" } }, "string_decoder": { @@ -10294,44 +9641,45 @@ } }, "karma": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-3.0.0.tgz", - "integrity": "sha512-ZTjyuDXVXhXsvJ1E4CnZzbCjSxD6sEdzEsFYogLuZM0yqvg/mgz+O+R1jb0J7uAQeuzdY8kJgx6hSNXLwFuHIQ==", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "body-parser": "1.18.2", - "chokidar": "2.0.4", - "colors": "1.1.2", - "combine-lists": "1.0.1", - "connect": "3.6.6", - "core-js": "2.5.7", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "http-proxy": "1.17.0", - "isbinaryfile": "3.0.3", - "lodash": "4.17.11", - "log4js": "3.0.5", - "mime": "2.3.1", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.2.0", - "range-parser": "1.2.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-3.1.4.tgz", + "integrity": "sha512-31Vo8Qr5glN+dZEVIpnPCxEGleqE0EY6CtC2X9TagRV3rRQ3SNrvfhddICkJgUK3AgqpeKSZau03QumTGhGoSw==", + "dev": true, + "requires": { + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^2.0.3", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "flatted": "^2.0.0", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^4.17.5", + "log4js": "^3.0.0", + "mime": "^2.3.1", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", "socket.io": "2.1.1", - "source-map": "0.6.1", + "source-map": "^0.6.1", "tmp": "0.0.33", - "useragent": "2.2.1" + "useragent": "2.3.0" }, "dependencies": { "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true }, "source-map": { @@ -10345,11 +9693,11 @@ "karma-chrome-launcher": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", "dev": true, "requires": { - "fs-access": "1.0.1", - "which": "1.3.0" + "fs-access": "^1.0.0", + "which": "^1.2.1" } }, "karma-cli": { @@ -10358,7 +9706,7 @@ "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", "dev": true, "requires": { - "resolve": "1.5.0" + "resolve": "^1.1.6" } }, "karma-coverage-istanbul-reporter": { @@ -10367,14 +9715,14 @@ "integrity": "sha512-xJS7QSQIVU6VK9HuJ/ieE5yynxKhjCCkd96NLY/BX/HXsx0CskU9JJiMQbd4cHALiddMwI4OWh1IIzeWrsavJw==", "dev": true, "requires": { - "istanbul-api": "2.0.6", - "minimatch": "3.0.4" + "istanbul-api": "^2.0.5", + "minimatch": "^3.0.4" } }, "karma-firefox-launcher": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz", - "integrity": "sha1-LEcDBFLwRTHrfRPU/HZpYwu5Mzk=", + "integrity": "sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA==", "dev": true }, "karma-jasmine": { @@ -10389,7 +9737,7 @@ "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", "dev": true, "requires": { - "karma-jasmine": "1.1.2" + "karma-jasmine": "^1.0.2" } }, "karma-source-map-support": { @@ -10398,25 +9746,7 @@ "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", "dev": true, "requires": { - "source-map-support": "0.5.9" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" - } - } + "source-map-support": "^0.5.5" } }, "keycode": { @@ -10432,13 +9762,9 @@ "dev": true }, "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, "klaw": { "version": "1.3.1", @@ -10446,35 +9772,62 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11" + } + }, + "lazy-universal-dotenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-2.0.0.tgz", + "integrity": "sha512-1Wi0zgZMfRLaRAK21g3odYuU+HE1d85Loe2tb44YhcNwIzhmD49mTPR9aKckpB9Q9Q9mA+hUMLI2xlkcCAe3yw==", "dev": true, "requires": { - "invert-kv": "1.0.0" + "@babel/runtime": "^7.0.0", + "app-root-dir": "^1.0.2", + "core-js": "^2.5.7", + "dotenv": "^6.0.0", + "dotenv-expand": "^4.2.0" + } + }, + "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" } }, "less": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/less/-/less-3.8.1.tgz", - "integrity": "sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q==", - "dev": true, - "requires": { - "clone": "2.1.2", - "errno": "0.1.7", - "graceful-fs": "4.1.11", - "image-size": "0.5.5", - "mime": "1.6.0", - "mkdirp": "0.5.1", - "promise": "7.3.1", - "request": "2.88.0", - "source-map": "0.6.1" + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" }, "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10490,9 +9843,17 @@ "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", "dev": true, "requires": { - "clone": "2.1.2", - "loader-utils": "1.1.0", - "pify": "3.0.0" + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + } } }, "levn": { @@ -10501,17 +9862,18 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "license-webpack-plugin": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz", - "integrity": "sha512-Of/H79rZqm2aeg4RnP9SMSh19qkKemoLT5VaJV58uH5AxeYWEcBgGFs753JEJ/Hm6BPvQVfIlrrjoBwYj8p7Tw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.0.4.tgz", + "integrity": "sha512-FQgOqrrIcD4C/VQo6ecWgXZULK5rs0kIDJtHcSVO6SBUrD63kEHZwmKOvBTquFQSgMQn/yeH68qooKDfqiBF2Q==", "dev": true, "requires": { - "ejs": "2.6.1" + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" } }, "lie": { @@ -10520,7 +9882,39 @@ "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "dev": true, "requires": { - "immediate": "3.0.6" + "immediate": "~3.0.5" + } + }, + "live-server": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.1.tgz", + "integrity": "sha512-Yn2XCVjErTkqnM3FfTmM7/kWy3zP7+cEtC7x6u+wUzlQ+1UW3zEYbbyJrc0jNDwiMDZI0m4a0i3dxlGHVyXczw==", + "requires": { + "chokidar": "^2.0.4", + "colors": "^1.3.3", + "connect": "^3.6.6", + "cors": "^2.8.5", + "event-stream": "3.3.4", + "faye-websocket": "0.11.x", + "http-auth": "3.1.x", + "morgan": "^1.9.1", + "object-assign": "^4.1.1", + "opn": "^5.4.0", + "proxy-middleware": "^0.15.0", + "send": "^0.16.2", + "serve-index": "^1.9.1" + }, + "dependencies": { + "colors": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz", + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + } } }, "load-json-file": { @@ -10529,13 +9923,22 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "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" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -10545,9 +9948,9 @@ } }, "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { @@ -10556,19 +9959,26 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + } } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -10576,11 +9986,50 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "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", @@ -10588,11 +10037,15 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "dev": true + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" }, "lodash.clonedeep": { "version": "4.5.0", @@ -10603,38 +10056,55 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, - "lodash.endswith": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.endswith/-/lodash.endswith-4.2.1.tgz", - "integrity": "sha1-/tWawXOO0+I27dcGTsRWRIs3vAk=", - "dev": true + "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.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "requires": { + "lodash._root": "^3.0.0" + } + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "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.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", - "dev": true + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, "lodash.isplainobject": { "version": "4.0.6", @@ -10642,23 +10112,26 @@ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", "dev": true }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=", - "dev": true - }, "lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==" + }, "lodash.mergewith": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", @@ -10668,26 +10141,27 @@ "lodash.pick": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", - "dev": true + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" }, - "lodash.some": { + "lodash.reduce": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", - "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=", - "dev": true + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true + "lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" }, - "lodash.startswith": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.startswith/-/lodash.startswith-4.2.1.tgz", - "integrity": "sha1-xZjErc4YiiflMUVzHNxsDnF3YAw=", - "dev": true + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" }, "lodash.tail": { "version": "4.1.1", @@ -10695,39 +10169,52 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", "dev": true }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", - "dev": true + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash._basetostring": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.restparam": "^3.0.0", + "lodash.templatesettings": "^3.0.0" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.escape": "^3.0.0" + } }, "log4js": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.5.tgz", - "integrity": "sha512-IX5c3G/7fuTtdr0JjOT2OIR12aTESVhsH6cEsijloYwKgcPRlO6DgOU72v0UFhWcoV1HN6+M3dwT89qVPLXm0w==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", + "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", "dev": true, "requires": { - "circular-json": "0.5.7", - "date-format": "1.2.0", - "debug": "3.2.5", - "rfdc": "1.1.2", + "circular-json": "^0.5.5", + "date-format": "^1.2.0", + "debug": "^3.1.0", + "rfdc": "^1.1.2", "streamroller": "0.7.0" }, "dependencies": { "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true } } }, @@ -10738,12 +10225,12 @@ "dev": true }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "loud-rejection": { @@ -10752,8 +10239,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lower-case": { @@ -10768,27 +10255,40 @@ "integrity": "sha512-Ek18ElVCf/wF/jEm1b92gTnigh94CtBNWiZ2ad+vTgW7cTmQxUY3I98BjHK68gZAJEWmybGBZgx9qv3QxLQB/Q==", "dev": true, "requires": { - "fault": "1.0.2", - "highlight.js": "9.12.0" + "fault": "^1.0.2", + "highlight.js": "~9.12.0" + }, + "dependencies": { + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=", + "dev": true + } } }, "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, + "lunr": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-0.7.2.tgz", + "integrity": "sha1-eaMOky4hbLoWNUHuN6NgfBLNcoE=" + }, "make-dir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "make-error": { @@ -10797,20 +10297,105 @@ "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", "dev": true }, + "make-fetch-happen": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", + "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + } + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, "map-age-cleaner": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz", - "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==", - "dev": true, + "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" + "p-defer": "^1.0.0" } }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, "map-obj": { "version": "1.0.1", @@ -10818,20 +10403,23 @@ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "marked": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.5.1.tgz", - "integrity": "sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw==", - "dev": true + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==" }, "material-colors": { "version": "1.2.6", @@ -10850,31 +10438,20 @@ "integrity": "sha1-0ATOP+6Zoe63Sni4oyUTSl8RcdM=" }, "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - } + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "mdi": { @@ -10885,18 +10462,16 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, "requires": { - "map-age-cleaner": "0.1.2", - "mimic-fn": "1.2.0", - "p-is-promise": "1.1.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" } }, "memory-fs": { @@ -10905,8 +10480,40 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.3" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "meow": { @@ -10915,57 +10522,60 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "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" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.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=", + "dev": true + } } }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", "dev": true }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "miller-rabin": { @@ -10974,36 +10584,32 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" }, "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", - "dev": true + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" }, "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "dev": true, + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.37.0" } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, "min-document": { "version": "2.19.0", @@ -11011,37 +10617,24 @@ "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", "dev": true, "requires": { - "dom-walk": "0.1.1" + "dom-walk": "^0.1.0" } }, "mini-css-extract-plugin": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz", - "integrity": "sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz", + "integrity": "sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "schema-utils": "1.0.0", - "webpack-sources": "1.1.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.4.0", - "ajv-errors": "1.0.0", - "ajv-keywords": "3.2.0" - } - } + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" } }, "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { @@ -11053,17 +10646,42 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } }, "mississippi": { "version": "2.0.0", @@ -11071,35 +10689,45 @@ "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "dev": true, "requires": { - "concat-stream": "1.6.1", - "duplexify": "3.6.0", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.2", - "through2": "2.0.3" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -11110,8 +10738,8 @@ "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", "dev": true, "requires": { - "for-in": "0.1.8", - "is-extendable": "0.1.1" + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" }, "dependencies": { "for-in": { @@ -11126,7 +10754,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" }, @@ -11134,15 +10761,41 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" } } }, "moment": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", - "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } }, "move-concurrently": { "version": "1.0.1", @@ -11150,18 +10803,63 @@ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "multer": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/multer/-/multer-0.1.8.tgz", + "integrity": "sha1-VRuKYBUJNwG8rMlkkWsa4GV483s=", + "requires": { + "busboy": "~0.2.9", + "mkdirp": "~0.3.5", + "qs": "~1.2.2", + "type-is": "~1.5.2" + }, + "dependencies": { + "mime-db": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", + "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=" + }, + "mime-types": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", + "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", + "requires": { + "mime-db": "~1.12.0" + } + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + }, + "qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha1-GbV/8k3CqZzh+L32r82ln472H4g=" + }, + "type-is": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz", + "integrity": "sha1-uTaKWTzG730GReeLL0xky+zQXpA=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.0.9" + } + } + } }, "multicast-dns": { "version": "6.2.3", @@ -11169,8 +10867,8 @@ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { - "dns-packet": "1.3.1", - "thunky": "1.0.2" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, "multicast-dns-service-types": { @@ -11179,6 +10877,14 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "requires": { + "duplexer2": "0.0.2" + } + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -11186,60 +10892,37 @@ "dev": true }, "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" }, "nanomatch": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, "negotiator": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "neo-async": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", - "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", "dev": true }, "ng2-device-detector": { @@ -11248,15 +10931,14 @@ "integrity": "sha512-Xk6peAl8dzBM5OFLK6pTThA0bk4YZ4xgyNRbLUTmc2aeDeH6VYwCx9AA2DGvI4rilGp01GNEzHrA84nY5dpwCQ==" }, "ngx-bootstrap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ngx-bootstrap/-/ngx-bootstrap-3.0.1.tgz", - "integrity": "sha512-ni91yYtn8ldgf/pxrlwl9lkVcLURGzopSpJnEbbgG1v1EZWTobI8y7J3mx4Kxptkn0EeiQwnLel67G7XJSox4A==" + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/ngx-bootstrap/-/ngx-bootstrap-3.1.4.tgz", + "integrity": "sha512-dHMX6Yv0ahwvjvMFo2wQ2Mbe4vcUTEcao0jmVKenchmaZjDGWsJ2xvRgEDKgAA9bNR0RI5gqQNzICmSf2MC1DA==" }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "no-case": { "version": "2.3.2", @@ -11264,17 +10946,24 @@ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { - "lower-case": "1.1.4" + "lower-case": "^1.1.1" } }, "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", + "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==", + "dev": true + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", "dev": true, "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" } }, "node-forge": { @@ -11289,18 +10978,18 @@ "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", "dev": true, "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.88.0", - "rimraf": "2.6.2", - "semver": "5.3.0", - "tar": "2.2.1", - "which": "1.3.0" + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" }, "dependencies": { "semver": { @@ -11312,70 +11001,110 @@ } }, "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.8.0", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.10", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.11.0", "vm-browserify": "0.0.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "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==", + "dev": true, + "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" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + } } }, "node-releases": { - "version": "1.0.0-alpha.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.0.0-alpha.12.tgz", - "integrity": "sha512-VPB4rTPqpVyWKBHbSa4YPFme3+8WHsOSpvbp0Mfj0bWsC8TEjt4HQrLl1hsBDELlp1nB4lflSgSuGTYiuyaP7Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz", + "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==", "dev": true, "requires": { - "semver": "5.5.1" + "semver": "^5.3.0" } }, "node-sass": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.3.tgz", - "integrity": "sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww==", - "dev": true, - "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", - "lodash.mergewith": "4.6.1", - "meow": "3.7.0", - "mkdirp": "0.5.1", - "nan": "2.11.1", - "node-gyp": "3.8.0", - "npmlog": "4.1.2", - "request": "2.87.0", - "sass-graph": "2.2.4", - "stdout-stream": "1.4.1", - "true-case-path": "1.0.3" + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz", + "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" }, "dependencies": { "ansi-styles": { @@ -11390,39 +11119,21 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "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" + "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" } }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.7", - "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.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.1", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, "supports-color": { @@ -11439,37 +11150,41 @@ "integrity": "sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==", "dev": true, "requires": { - "find-parent-dir": "0.3.0" + "find-parent-dir": "^0.3.0" } }, + "node-version": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", + "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==", + "dev": true + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.0.9" + "abbrev": "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==", - "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.1", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "normalize-range": { @@ -11478,16 +11193,43 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, + "npm-bundled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", + "dev": true + }, "npm-package-arg": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", "dev": true, "requires": { - "hosted-git-info": "2.6.0", - "osenv": "0.1.5", - "semver": "5.5.1", - "validate-npm-package-name": "3.0.0" + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", + "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" } }, "npm-registry-client": { @@ -11496,27 +11238,40 @@ "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", "dev": true, "requires": { - "concat-stream": "1.6.1", - "graceful-fs": "4.1.11", - "normalize-package-data": "2.4.0", - "npm-package-arg": "6.1.0", - "npmlog": "4.1.2", - "once": "1.4.0", - "request": "2.88.0", - "retry": "0.10.1", - "safe-buffer": "5.1.1", - "semver": "5.5.1", - "slide": "1.1.6", - "ssri": "5.3.0" + "concat-stream": "^1.5.2", + "graceful-fs": "^4.1.6", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "npmlog": "2 || ^3.1.0 || ^4.0.0", + "once": "^1.3.3", + "request": "^2.74.0", + "retry": "^0.10.0", + "safe-buffer": "^5.1.1", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3", + "ssri": "^5.2.4" + } + }, + "npm-registry-fetch": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz", + "integrity": "sha512-hrw8UMD+Nob3Kl3h8Z/YjmKamb1gf7D1ZZch2otrIXM3uFLB5vjEY6DhMlq80z/zZet6eETLbOXcuQudCB3Zpw==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "npm-package-arg": "^6.1.0" } }, "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=", - "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npmlog": { @@ -11525,19 +11280,18 @@ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "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=", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "null-check": { @@ -11555,20 +11309,17 @@ "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=", - "dev": true + "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=", - "dev": true + "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=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=" }, "object-component": { "version": "0.0.3", @@ -11580,49 +11331,54 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" + } + }, + "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.5" } } } }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", "dev": true }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1", - "has": "1.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "object.fromentries": { @@ -11631,10 +11387,10 @@ "integrity": "sha512-F7XUm84lg0uNXNzrRAC5q8KJe0yYaxgLU9hTSqWYM6Rfnh0YjP24EG3xq7ncj2Wu1AdfueNHKCOlamIonG4UHQ==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1", - "has": "1.0.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.11.0", + "function-bind": "^1.1.1", + "has": "^1.0.1" } }, "object.getownpropertydescriptors": { @@ -11643,8 +11399,8 @@ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, "object.omit": { @@ -11653,8 +11409,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" }, "dependencies": { "for-own": { @@ -11663,7 +11419,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } } } @@ -11672,21 +11428,20 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1", - "has": "1.0.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "obuf": { @@ -11699,7 +11454,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, "requires": { "ee-first": "1.1.1" } @@ -11707,16 +11461,14 @@ "on-headers": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", - "dev": true + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -11725,33 +11477,48 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" + } + }, + "ono": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/ono/-/ono-4.0.11.tgz", + "integrity": "sha512-jQ31cORBFE6td25deYeD80wxKBMj+zBmHTrVxnc6CKhx8gho6ipmWM5zj/oeoqioZ99yqBls9Z/9Nss7J26G2g==", + "requires": { + "format-util": "^1.0.3" + } + }, + "openapi-schema-validation": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/openapi-schema-validation/-/openapi-schema-validation-0.4.2.tgz", + "integrity": "sha512-K8LqLpkUf2S04p2Nphq9L+3bGFh/kJypxIG2NVGKX0ffzT4NQI9HirhiY6Iurfej9lCu7y4Ndm4tv+lm86Ck7w==", + "requires": { + "jsonschema": "1.2.4", + "jsonschema-draft4": "^1.0.0", + "swagger-schema-official": "2.0.0-bab6bed" } }, "opn": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", - "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", - "dev": true, + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", + "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", "requires": { - "is-wsl": "1.1.0" + "is-wsl": "^1.1.0" } }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.2" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "minimist": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" } } }, @@ -11761,12 +11528,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "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" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" }, "dependencies": { "wordwrap": { @@ -11782,7 +11549,7 @@ "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "requires": { - "url-parse": "1.4.3" + "url-parse": "^1.4.3" } }, "os-browserify": { @@ -11798,19 +11565,19 @@ "dev": true }, "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, + "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": { - "lcid": "1.0.0" + "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=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", @@ -11818,44 +11585,39 @@ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "p-is-promise": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", - "dev": true + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=" }, "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "requires": { - "p-try": "1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, + "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": "1.2.0" + "p-limit": "^2.0.0" } }, "p-map": { @@ -11865,15 +11627,132 @@ "dev": true }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, + "pacote": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.2.3.tgz", + "integrity": "sha512-Y3+yY3nBRAxMlZWvr62XLJxOwCmG9UmkGZkFurWHoCjqF0cZL72cTOCRJTvWw8T4OhJS2RTg13x4oYYriauvEw==", + "dev": true, + "requires": { + "bluebird": "^3.5.2", + "cacache": "^11.2.0", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.6", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + } + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", "dev": true }, "parallel-transform": { @@ -11882,9 +11761,41 @@ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "param-case": { @@ -11893,20 +11804,21 @@ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", + "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-entities": { @@ -11915,12 +11827,12 @@ "integrity": "sha512-XXtDdOPLSB0sHecbEapQi6/58U/ODj/KWfIXmmMCJF/eRn8laX6LZbOyioMoETOOJoWRW8/qTSl5VQkUIfKM5g==", "dev": true, "requires": { - "character-entities": "1.2.2", - "character-entities-legacy": "1.1.2", - "character-reference-invalid": "1.1.2", - "is-alphanumerical": "1.0.2", - "is-decimal": "1.0.2", - "is-hexadecimal": "1.0.2" + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, "parse-glob": { @@ -11929,10 +11841,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "is-extglob": { @@ -11947,20 +11859,25 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, + "parse-node-version": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.0.tgz", + "integrity": "sha512-02GTVHD1u0nWc20n2G7WX/PgdhNFG04j5fi1OkaJzPWLTcf6vh6229Lta1wTmXG/7Dg42tCssgkccVt7qvd8Kg==" + }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", @@ -11979,7 +11896,7 @@ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseuri": { @@ -11988,20 +11905,18 @@ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" }, "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" }, "path": { "version": "0.12.7", @@ -12009,8 +11924,19 @@ "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", "dev": true, "requires": { - "process": "0.11.10", - "util": "0.10.3" + "process": "^0.11.1", + "util": "^0.10.3" + }, + "dependencies": { + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } } }, "path-browserify": { @@ -12022,20 +11948,17 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -12046,19 +11969,17 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "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=", - "dev": true + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, "path-type": { "version": "3.0.0", @@ -12066,33 +11987,39 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" + } + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "requires": { + "through": "~2.3" } }, "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "pinkie": { "version": "2.0.4", @@ -12106,7 +12033,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -12115,7 +12042,52 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "pkg-up": { @@ -12124,7 +12096,52 @@ "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "portfinder": { @@ -12133,9 +12150,9 @@ "integrity": "sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==", "dev": true, "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" }, "dependencies": { "async": { @@ -12143,42 +12160,54 @@ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", - "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.11.tgz", + "integrity": "sha512-9AXb//5UcjeOEof9T+yPw3XTa5SL207ZOIC/lHYP4mbUTEh4M0rDAQekQpVANCZdwQwKhBtFZCk3i3h3h2hdWg==", "dev": true, "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.4.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "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==", "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -12188,58 +12217,19 @@ "integrity": "sha512-jr1LHxQvStNNAHlgco6PzY308zvLklh7SJVYuWUwyUQncofaAlD2l+P/gxKHOdqWKe7xJSkVLFF/2Tp+JqMSZA==", "dev": true, "requires": { - "postcss": "7.0.5" - }, - "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, - "postcss": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", - "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "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" - } - } + "postcss": "^7.0.0" } }, "postcss-import": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", - "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.0.tgz", + "integrity": "sha512-3KqKRZcaZAvxbY8DVLdd81tG5uKzbUQuiWIvy0o0fzEC42bKacqPYFWbfCQyw6L4LWUaqPz/idvIdbhpgQ32eQ==", "dev": true, "requires": { - "postcss": "6.0.22", - "postcss-value-parser": "3.3.0", - "read-cache": "1.0.0", - "resolve": "1.5.0" + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" } }, "postcss-load-config": { @@ -12248,8 +12238,8 @@ "integrity": "sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==", "dev": true, "requires": { - "cosmiconfig": "4.0.0", - "import-cwd": "2.1.0" + "cosmiconfig": "^4.0.0", + "import-cwd": "^2.0.0" } }, "postcss-loader": { @@ -12258,43 +12248,30 @@ "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "postcss": "7.0.5", - "postcss-load-config": "2.0.0", - "schema-utils": "1.0.0" + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-modules-extract-imports": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz", + "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", + "dev": true, + "requires": { + "postcss": "^6.0.1" }, "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" - } - }, "postcss": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.5.tgz", - "integrity": "sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==", - "dev": true, - "requires": { - "chalk": "2.4.1", - "source-map": "0.6.1", - "supports-color": "5.5.0" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "ajv": "6.4.0", - "ajv-errors": "1.0.0", - "ajv-keywords": "3.2.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "source-map": { @@ -12302,35 +12279,36 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "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" - } } } }, - "postcss-modules-extract-imports": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", - "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", - "dev": true, - "requires": { - "postcss": "6.0.22" - } - }, "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=", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.22" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "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==", + "dev": true + } } }, "postcss-modules-scope": { @@ -12339,8 +12317,27 @@ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.22" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "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==", + "dev": true + } } }, "postcss-modules-values": { @@ -12349,27 +12346,33 @@ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "dev": true, "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.22" - } - }, - "postcss-url": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz", - "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", - "dev": true, - "requires": { - "mime": "1.6.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "postcss": "6.0.22", - "xxhashjs": "0.2.2" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" + }, + "dependencies": { + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "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==", + "dev": true + } } }, "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=", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, "prelude-ls": { @@ -12385,9 +12388,9 @@ "dev": true }, "prettier": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz", - "integrity": "sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.1.tgz", + "integrity": "sha512-XXUITwIkGb3CPJ2hforHah/zTINRyie5006Jd2HKy2qz7snEJXl0KLfsJZW/wst9g6R2rFvqba3VpNYdu1hDcA==", "dev": true }, "pretty-error": { @@ -12396,31 +12399,23 @@ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "dev": true, "requires": { - "renderkid": "2.0.2", - "utila": "0.4.0" + "renderkid": "^2.0.1", + "utila": "~0.4" } }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, "prismjs": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.15.0.tgz", "integrity": "sha512-Lf2JrFYx8FanHrjoV5oL8YHCclLQgbJcVZR+gikGGMqz6ub5QVWDTM6YIwm3BuPxM/LOV+rKns3LssXNLIf+DA==", "dev": true, "requires": { - "clipboard": "2.0.1" - }, - "dependencies": { - "clipboard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz", - "integrity": "sha512-7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==", - "dev": true, - "optional": true, - "requires": { - "good-listener": "1.2.2", - "select": "1.1.2", - "tiny-emitter": "2.0.2" - } - } + "clipboard": "^2.0.0" } }, "private": { @@ -12436,10 +12431,9 @@ "dev": true }, "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=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, "promise": { "version": "7.3.1", @@ -12447,7 +12441,7 @@ "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", "dev": true, "requires": { - "asap": "2.0.6" + "asap": "~2.0.3" } }, "promise-inflight": { @@ -12456,15 +12450,31 @@ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, + "promise-polyfill": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", + "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, "promise.prototype.finally": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/promise.prototype.finally/-/promise.prototype.finally-3.1.0.tgz", "integrity": "sha512-7p/K2f6dI+dM8yjRQEGrTQs5hTQixUAdOGpMEA3+pVxpX5oHKRSKAXyLw9Q9HUWDTdwtoo39dSHGQtN90HcEwQ==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.9.0", + "function-bind": "^1.1.1" } }, "prop-types": { @@ -12473,105 +12483,76 @@ "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", "dev": true, "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1" + "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=", + "dev": true + } } }, "property-information": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz", - "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.0.1.tgz", + "integrity": "sha512-nAtBDVeSwFM3Ot/YxT7s4NqZmqXI7lLzf46BThvotEtYf2uk2yH0ACYuWQkJ7gxKs49PPtKVY0UlDGkyN9aJlw==", "dev": true, "requires": { - "xtend": "4.0.1" + "xtend": "^4.0.1" + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" } }, "protractor": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.1.tgz", - "integrity": "sha512-ORey5ewQMYiXQxcQohsqEiKYOg/r5yJoJbt0tuROmmgajdg/CA3gTOZNIFJncUVMAJIk5YFqBBLUjKVmQO6tfA==", - "dev": true, - "requires": { - "@types/node": "6.0.117", - "@types/q": "0.0.32", - "@types/selenium-webdriver": "3.0.10", - "blocking-proxy": "1.0.1", - "browserstack": "1.5.1", - "chalk": "1.1.3", - "glob": "7.1.2", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.2.tgz", + "integrity": "sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA==", + "dev": true, + "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.2.0", - "optimist": "0.6.1", + "jasminewd2": "^2.1.0", + "optimist": "~0.6.0", "q": "1.4.1", - "saucelabs": "1.5.0", + "saucelabs": "^1.5.0", "selenium-webdriver": "3.6.0", - "source-map-support": "0.4.18", + "source-map-support": "~0.4.0", "webdriver-js-extender": "2.1.0", - "webdriver-manager": "12.1.0" + "webdriver-manager": "^12.0.6" }, "dependencies": { - "@types/node": { - "version": "6.0.117", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.117.tgz", - "integrity": "sha512-sihk0SnN8PpiS5ihu5xJQ5ddnURNq4P+XPmW+nORlKkHy21CoZO/IVHK/Wq/l3G8fFW06Fkltgnqx229uPlnRg==", - "dev": true - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", "dev": true }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "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=", - "dev": true - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "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" - } - }, - "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" + "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" } }, "del": { @@ -12580,86 +12561,33 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.20" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "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" - } - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "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=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "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" } }, - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "mime-db": "1.36.0" + "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" } }, - "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=", "dev": true }, "pify": { @@ -12668,79 +12596,38 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "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==", "dev": true, "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.0", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.20", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.4.3", - "tunnel-agent": "0.6.0", - "uuid": "3.3.2" + "source-map": "^0.5.6" } }, - "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==", - "dev": true - }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", "dev": true }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "1.1.29", - "punycode": "1.4.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, "webdriver-manager": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.0.tgz", - "integrity": "sha512-oEc5fmkpz6Yh6udhwir5m0eN5mgRPq9P/NU5YWuT3Up5slt6Zz+znhLU7q4+8rwCZz/Qq3Fgpr/4oao7NPCm2A==", - "dev": true, - "requires": { - "adm-zip": "0.4.11", - "chalk": "1.1.3", - "del": "2.2.2", - "glob": "7.1.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "q": "1.4.1", - "request": "2.88.0", - "rimraf": "2.6.2", - "semver": "5.5.1", - "xml2js": "0.4.19" + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.1.tgz", + "integrity": "sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA==", + "dev": true, + "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" } } } @@ -12752,10 +12639,10 @@ "dev": true, "requires": { "fs": "0.0.1-security", - "fs-extra": "1.0.0", - "lodash": "4.17.11", - "path": "0.12.7", - "xmldoc": "0.5.1" + "fs-extra": "^1.0.0", + "lodash": "^4.17.2", + "path": "^0.12.7", + "xmldoc": "^0.5.1" }, "dependencies": { "fs-extra": { @@ -12764,9 +12651,9 @@ "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" } }, "jsonfile": { @@ -12775,7 +12662,7 @@ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } } } @@ -12786,23 +12673,52 @@ "integrity": "sha1-RS2pyFPpw5hctSamqZM/XJerXYw=", "dev": true, "requires": { - "async": "2.6.0", - "hat": "0.0.3", - "lodash": "4.17.11", - "mkdirp": "0.5.1", - "string.prototype.startswith": "0.2.0" + "async": "^2.1.4", + "hat": "^0.0.3", + "lodash": "^4.17.0", + "mkdirp": "^0.5.0", + "string.prototype.startswith": "^0.2.0" + } + }, + "protractor-screenshoter-plugin": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/protractor-screenshoter-plugin/-/protractor-screenshoter-plugin-0.10.3.tgz", + "integrity": "sha512-OF9kGe1rMxBQY4uXzXQUFT14EB83rz8DlDcxmH5HcOHPBpUhGh+Nwo7+K87w1LoLcTuGdG7Bz+/hGwoGguDfsA==", + "dev": true, + "requires": { + "circular-json": "^0.5.1", + "fs-extra": "^7.0.0", + "klaw-sync": "^6.0.0", + "lodash": "^4.17.11", + "mkdirp": "^0.5.1", + "moment": "^2.20.1", + "q": "^1.5.1", + "screenshoter-report-analyzer": "^0.6", + "uuid": "^3.1.0" + }, + "dependencies": { + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + } } }, "proxy-addr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", - "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", - "dev": true, + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.6.0" + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" } }, + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=" + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -12816,32 +12732,31 @@ "dev": true }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, + "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.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -12850,16 +12765,27 @@ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "3.6.0", - "inherits": "2.0.3", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true + "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", @@ -12876,8 +12802,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystring": { "version": "0.2.0", @@ -12892,19 +12817,25 @@ "dev": true }, "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==" + }, + "ramda": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", + "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=", + "dev": true }, "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", "dev": true, "requires": { - "is-number": "4.0.0", - "kind-of": "6.0.2", - "math-random": "1.0.1" + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" }, "dependencies": { "is-number": { @@ -12912,12 +12843,6 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -12927,7 +12852,7 @@ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -12936,25 +12861,23 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true + "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=", - "dev": true, + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "requires": { "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "unpipe": "1.0.0" } }, @@ -12965,71 +12888,64 @@ "dev": true }, "react": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/react/-/react-16.5.2.tgz", - "integrity": "sha512-FDCSVd3DjVTmbEAjUNX6FgfAmQ+ypJfHUsqUJOYNCBUp1h8lqmtC+0mXJ+JjsWx4KAVTkk1vKd1hLQPvEviSuw==", - "dev": true, - "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.2", - "schedule": "0.5.0" - } - }, - "react-color": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.14.1.tgz", - "integrity": "sha512-ssv2ArSZdhTbIs29hyfw8JW+s3G4BCx/ILkwCajWZzrcx/2ZQfRpsaLVt38LAPbxe50LLszlmGtRerA14JzzRw==", - "dev": true, - "requires": { - "lodash": "4.17.11", - "material-colors": "1.2.6", - "prop-types": "15.6.2", - "reactcss": "1.2.3", - "tinycolor2": "1.4.1" - } - }, - "react-datetime": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/react-datetime/-/react-datetime-2.15.0.tgz", - "integrity": "sha512-RP5OqXVfrhdoFALJzMU8tKxRFaIZzJZqZEpf5oK7pvwG80a/bET/TdJ7jT7W9lyAf1nKNo6zyYkvHW3ZJ/ypvg==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.7.0.tgz", + "integrity": "sha512-StCz3QY8lxTb5cl2HJxjwLFOXPIFQp+p+hxQfc8WE0QiLfCtIlKj8/+5tjjKm8uSTlAW+fCPaavGFS06V9Ar3A==", "dev": true, "requires": { - "create-react-class": "15.6.3", - "object-assign": "3.0.0", - "prop-types": "15.6.2", - "react-onclickoutside": "6.7.1" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.12.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=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true } } }, + "react-color": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/react-color/-/react-color-2.17.0.tgz", + "integrity": "sha512-kJfE5tSaFe6GzalXOHksVjqwCPAsTl+nzS9/BWfP7j3EXbQ4IiLAF9sZGNzk3uq7HfofGYgjmcUgh0JP7xAQ0w==", + "dev": true, + "requires": { + "@icons/material": "^0.2.4", + "lodash": ">4.17.4", + "material-colors": "^1.2.1", + "prop-types": "^15.5.10", + "reactcss": "^1.2.0", + "tinycolor2": "^1.4.1" + } + }, "react-dev-utils": { - "version": "6.0.0-next.2150693d", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-6.0.0-next.2150693d.tgz", - "integrity": "sha512-mErObh6vUCdVeTus1An4r8OAfiKWNA3RNrt7o1M4Gn6BEgfpXxxBGhs38Tg7AW7cDh1/CdsDBavVKDNFe0lkJQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-6.1.1.tgz", + "integrity": "sha512-ThbJ86coVd6wV/QiTo8klDTvdAJ1WsFCGQN07+UkN+QN9CtCSsl/+YuDJToKGeG8X4j9HMGXNKbk2QhPAZr43w==", "dev": true, "requires": { "@babel/code-frame": "7.0.0", "address": "1.0.3", - "browserslist": "3.2.6", + "browserslist": "4.1.1", "chalk": "2.4.1", "cross-spawn": "6.0.5", "detect-port-alt": "1.1.6", "escape-string-regexp": "1.0.5", "filesize": "3.6.1", + "find-up": "3.0.0", "global-modules": "1.0.0", - "gzip-size": "4.1.0", - "inquirer": "5.1.0", - "is-root": "1.0.0", - "opn": "5.3.0", + "globby": "8.0.1", + "gzip-size": "5.0.0", + "immer": "1.7.2", + "inquirer": "6.2.0", + "is-root": "2.0.0", + "loader-utils": "1.1.0", + "opn": "5.4.0", "pkg-up": "2.0.0", - "react-error-overlay": "5.0.0-next.2150693d", + "react-error-overlay": "^5.1.0", "recursive-readdir": "2.2.2", "shell-quote": "1.6.1", "sockjs-client": "1.1.5", @@ -13044,13 +12960,14 @@ "dev": true }, "browserslist": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.6.tgz", - "integrity": "sha512-XCsMSg9V4S1VRdcp265dJ+8kBRjfuFXcavbisY7G6T9QI0H1Z24PP53vvs0WDYWqm38Mco1ILDtafcS8ZR4xiw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.1.1.tgz", + "integrity": "sha512-VBorw+tgpOtZ1BYhrVSVTzTt/3+vSE3eFUh0N2GCFK1HffceOaf32YS/bs6WiFhjDAblAFrx85jMy3BG9fBK2Q==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000842", - "electron-to-chromium": "1.3.47" + "caniuse-lite": "^1.0.30000884", + "electron-to-chromium": "^1.3.62", + "node-releases": "^1.0.0-alpha.11" } }, "chalk": { @@ -13059,28 +12976,18 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.5.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "ms": "2.0.0" } }, "detect-port-alt": { @@ -13089,79 +12996,73 @@ "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", "dev": true, "requires": { - "address": "1.0.3", - "debug": "2.6.9" + "address": "^1.0.1", + "debug": "^2.6.0" } }, - "external-editor": { - "version": "2.2.0", - "resolved": "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "original": ">=0.0.5" } }, - "inquirer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.1.0.tgz", - "integrity": "sha512-kn7N70US1MSZHZHSGJLiZ7iCwwncc7b0gc68YtlX29OjI3Mp0tSVV+snVXpZ1G+ONS3Ac9zd1m6hve2ibLDYfA==", + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", "dev": true, "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.4.1", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.11", + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "inquirer": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz", + "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rxjs": "5.5.12", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" } }, - "is-fullwidth-code-point": { + "ms": { "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=", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "rxjs": { - "version": "5.5.12", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", - "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, "sockjs-client": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", "dev": true, "requires": { - "debug": "2.6.9", + "debug": "^2.6.6", "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.4.3" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "faye-websocket": "~0.11.0", + "inherits": "^2.0.1", + "json3": "^3.3.2", + "url-parse": "^1.1.8" } }, "strip-ansi": { @@ -13170,33 +13071,35 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } - }, - "symbol-observable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", - "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", - "dev": true } } }, "react-dom": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.5.2.tgz", - "integrity": "sha512-RC8LDw8feuZOHVgzEf7f+cxBr/DnKdqp56VU0lAs1f4UfKc4cU8wU4fTq/mgnvynLQo8OtlPC19NUFh/zjZPuA==", + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.7.0.tgz", + "integrity": "sha512-D0Ufv1ExCAmF38P2Uh1lwpminZFRXEINJe53zRAbm4KPwSyd6DY/uDoS0Blj9jvPpn1+wivKpZYc8aAAN/nAkg==", "dev": true, "requires": { - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.2", - "schedule": "0.5.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.12.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=", + "dev": true + } } }, "react-error-overlay": { - "version": "5.0.0-next.2150693d", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.0.0-next.2150693d.tgz", - "integrity": "sha512-vHHbn/o3QDN/p+8hmc9mf3XDINREwLKTuECg9kRJHWYqwzOAuUupnH6SYFrt4RNJZrMu/Ov+R/AK+YqQvfeiYA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.2.tgz", + "integrity": "sha512-7kEBKwU9R8fKnZJBRa5RSIfay4KJwnYvKB6gODGicUmDSAhQJ7Tdnll5S0RLtYrzRfMVXlqYw61rzrSpP4ThLQ==", "dev": true }, "react-fuzzy": { @@ -13205,20 +13108,21 @@ "integrity": "sha512-qIZZxaCheb/HhcBi5fABbiCFg85+K5r1TCps1D4uaL0LAMMD/1zm/x1/kNR130Tx7nnY9V7mbFyY0DquPYeLAw==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "classnames": "2.2.6", - "fuse.js": "3.2.1", - "prop-types": "15.6.2" + "babel-runtime": "^6.23.0", + "classnames": "^2.2.5", + "fuse.js": "^3.0.1", + "prop-types": "^15.5.9" } }, "react-inspector": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-2.3.0.tgz", - "integrity": "sha512-aIcbWb0fKFhEMB+RadoOYawlr1JoMMfrQ1oRgPUG/f/e4zERVJ6nYcIaQmrQmdHCZ63BOqe2cEkoeY0kyLBzNg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-2.3.1.tgz", + "integrity": "sha512-tUUK7t3KWgZEIUktOYko5Ic/oYwvjEvQUFAGC1UeMeDaQ5za2yZFtItJa2RTwBJB//NxPr000WQK6sEbqC6y0Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "is-dom": "1.0.9" + "babel-runtime": "^6.26.0", + "is-dom": "^1.0.9", + "prop-types": "^15.6.1" } }, "react-lifecycles-compat": { @@ -13228,33 +13132,28 @@ "dev": true }, "react-modal": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.6.1.tgz", - "integrity": "sha512-vAhnawahH1fz8A5x/X/1X20KHMe6Q0mkfU5BKPgKSVPYhMhsxtRbNHSitsoJ7/oP27xZo3naZZlwYuuzuSO1xw==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.8.1.tgz", + "integrity": "sha512-aLKeZM9pgXpIKVwopRHMuvqKWiBajkqisDA8UzocdCF6S4fyKVfLWmZR5G1Q0ODBxxxxf2XIwiCP8G/11GJAuw==", "dev": true, "requires": { - "exenv": "1.2.2", - "prop-types": "15.6.2", - "react-lifecycles-compat": "3.0.4", - "warning": "3.0.0" + "exenv": "^1.2.0", + "prop-types": "^15.5.10", + "react-lifecycles-compat": "^3.0.0", + "warning": "^3.0.0" } }, - "react-onclickoutside": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.7.1.tgz", - "integrity": "sha512-p84kBqGaMoa7VYT0vZ/aOYRfJB+gw34yjpda1Z5KeLflg70HipZOT+MXQenEhdkPAABuE2Astq4zEPdMqUQxcg==", - "dev": true - }, "react-split-pane": { - "version": "0.1.84", - "resolved": "https://registry.npmjs.org/react-split-pane/-/react-split-pane-0.1.84.tgz", - "integrity": "sha512-rso1dRAXX/WETyqF5C0fomIYzpF71Nothfr1R7pFkrJCPVJ20ok2e6wqF+JvUTyE/meiBvsbNPT1loZjyU+53w==", + "version": "0.1.85", + "resolved": "https://registry.npmjs.org/react-split-pane/-/react-split-pane-0.1.85.tgz", + "integrity": "sha512-3GhaYs6+eVNrewgN4eQKJoNMQ4pcegNMTMhR5bO/NFO91K6/98qdD1sCuWPpsefCjzxNTjkvVYWQC0bMaC45mA==", "dev": true, "requires": { - "inline-style-prefixer": "3.0.8", - "prop-types": "15.6.2", - "react-lifecycles-compat": "3.0.4", - "react-style-proptype": "3.2.2" + "prop-types": "^15.5.10", + "react": "^16.6.3", + "react-dom": "^16.6.3", + "react-lifecycles-compat": "^3.0.4", + "react-style-proptype": "^3.0.0" } }, "react-style-proptype": { @@ -13263,52 +13162,50 @@ "integrity": "sha512-ywYLSjNkxKHiZOqNlso9PZByNEY+FTyh3C+7uuziK0xFXu9xzdyfHwg4S9iyiRRoPCR4k2LqaBBsWVmSBwCWYQ==", "dev": true, "requires": { - "prop-types": "15.6.2" + "prop-types": "^15.5.4" } }, "react-syntax-highlighter": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-8.0.1.tgz", - "integrity": "sha512-en/fS7a1eFvEVnAFZ60agglGgH9jRsNrgWpijeFCn4KE39PH7/RWt2wF2HaV47C+FlZW757agCtCgmpxT6MSzg==", + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-10.1.2.tgz", + "integrity": "sha512-p/xy9rb13Cr+SaErdOvJWTYH8moDrlszv4LPDd314pk5PmT6OTWQYFy66tBZFWhM2xk6bh4BttTU9SYje5c75g==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "highlight.js": "9.12.0", - "lowlight": "1.9.2", - "prismjs": "1.15.0", - "refractor": "2.6.0" + "@babel/runtime": "^7.1.2", + "highlight.js": "~9.12.0", + "lowlight": "~1.9.1", + "prismjs": "^1.8.4", + "refractor": "^2.4.1" + }, + "dependencies": { + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=", + "dev": true + } } }, "react-textarea-autosize": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-7.0.4.tgz", - "integrity": "sha512-1cC8pFSrIVH92aE+UKxGQ2Gqq43qdIcMscJKScEFeBNemn6gHa+NwKqdXkHxxg5H6uuvW+cPpJPTes6zh90M+A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-7.1.0.tgz", + "integrity": "sha512-c2FlR/fP0qbxmlrW96SdrbgP/v0XZMTupqB90zybvmDVDutytUgPl7beU35klwcTeMepUIQEpQUn3P3bdshGPg==", "dev": true, "requires": { - "prop-types": "15.6.2" + "@babel/runtime": "^7.1.2", + "prop-types": "^15.6.0" } }, "react-transition-group": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.0.tgz", - "integrity": "sha512-qYB3JBF+9Y4sE4/Mg/9O6WFpdoYjeeYqx0AFb64PTazVy8RPMiE3A47CG9QmM4WJ/mzDiZYslV+Uly6O1Erlgw==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.5.3.tgz", + "integrity": "sha512-2DGFck6h99kLNr8pOFk+z4Soq3iISydwOFeeEVPjTN6+Y01CmvbWmnN02VuTWyFdnRtIDPe+wy2q6Ui8snBPZg==", "dev": true, "requires": { - "dom-helpers": "3.3.1", - "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==", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - } + "dom-helpers": "^3.3.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" } }, "react-treebeard": { @@ -13317,21 +13214,13 @@ "integrity": "sha512-u4OEzwZk1Xcxp2s55Ny/Ofp8fHRwlabKOAeGbzQ7XUE9YXFbPj8ajl0FInbXEP4Ys9+E1vHCtgqJ6VBsgbCPVg==", "dev": true, "requires": { - "@babel/runtime": "7.1.2", - "@emotion/core": "0.13.1", - "@emotion/styled": "0.10.6", - "deep-equal": "1.0.1", - "prop-types": "15.6.2", - "shallowequal": "1.1.0", - "velocity-react": "1.4.1" - }, - "dependencies": { - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true - } + "@babel/runtime": "^7.0.0", + "@emotion/core": "^0.13.1", + "@emotion/styled": "^0.10.6", + "deep-equal": "^1.0.1", + "prop-types": "^15.6.2", + "shallowequal": "^1.1.0", + "velocity-react": "^1.4.1" } }, "reactcss": { @@ -13340,7 +13229,7 @@ "integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==", "dev": true, "requires": { - "lodash": "4.17.11" + "lodash": "^4.0.1" } }, "read-cache": { @@ -13349,7 +13238,7 @@ "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.3.0" }, "dependencies": { "pify": { @@ -13361,33 +13250,13 @@ } }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-4.0.1.tgz", + "integrity": "sha1-ljYlN48+HE1IyFhytabsfV0JMjc=", "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "normalize-package-data": "^2.3.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0" } }, "read-pkg-up": { @@ -13396,8 +13265,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, "dependencies": { "find-up": { @@ -13406,8 +13275,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "path-exists": { @@ -13416,45 +13285,94 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } } } }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", - "dev": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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.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" + } + }, + "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" + } + } } }, "rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, "requires": { - "resolve": "1.5.0" + "resolve": "^1.1.6" } }, "recursive-readdir": { @@ -13472,35 +13390,35 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "redux": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.0.tgz", - "integrity": "sha512-NnnHF0h0WVE/hXyrB6OlX67LYRuaf/rJcbWvnHHEPCF/Xa/AZpwhs/20WyqzQae5x4SD2F9nPObgBh2rxAgLiA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", + "integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==", "dev": true, "requires": { - "loose-envify": "1.3.1", - "symbol-observable": "1.2.0" + "loose-envify": "^1.4.0", + "symbol-observable": "^1.2.0" } }, "reflect-metadata": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", - "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "dev": true }, "refractor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.6.0.tgz", - "integrity": "sha512-ZkziLxSnkGmcFd9gVtMPqWyuA9nLzQCJqIjma03UvS2kw3gU+JQhCz8bWpbXtQX0e5XurZb/1wglrxpkYTJalQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.6.2.tgz", + "integrity": "sha512-AMNEGkhaXfhoa0/0mW0bHdfizDJnuHDK29/D5oQaKICf6DALQ+kDEHW/36oDHCdfva4XrZ+cdMhRvPsTI4OIjA==", "dev": true, "requires": { - "hastscript": "4.0.0", - "parse-entities": "1.2.0", - "prismjs": "1.15.0" + "hastscript": "^5.0.0", + "parse-entities": "^1.1.2", + "prismjs": "~1.15.0" } }, "regenerate": { @@ -13515,13 +13433,13 @@ "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==", "dev": true, "requires": { - "regenerate": "1.4.0" + "regenerate": "^1.4.0" } }, "regenerator-runtime": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, "regenerator-transform": { @@ -13530,7 +13448,7 @@ "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==", "dev": true, "requires": { - "private": "0.1.8" + "private": "^0.1.6" } }, "regex-cache": { @@ -13539,17 +13457,180 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp-tree": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.0.tgz", + "integrity": "sha512-rHQv+tzu+0l3KS/ERabas1yK49ahNVxuH40WcPg53CzP5p8TgmmyBgHELLyJcvjhTD0e5ahSY6C76LbEVtr7cg==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "cli-table3": "^0.5.0", + "colors": "^1.1.2", + "yargs": "^10.0.3" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "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=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz", + "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.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", + "yargs-parser": "^8.1.0" + } + }, + "yargs-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz", + "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } } }, "regexp.prototype.flags": { @@ -13558,33 +13639,44 @@ "integrity": "sha512-ztaw4M1VqgMwl9HlPpOuiYgItcHlunW0He2fE6eNfT6E/CF2FtYi9ofOYe4mKntstYk0Fyh/rDRBdS3AnxjlrA==", "dev": true, "requires": { - "define-properties": "1.1.2" + "define-properties": "^1.1.2" } }, "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz", + "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==", "dev": true, "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^7.0.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.0.2" } }, "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", "dev": true }, "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", "dev": true, "requires": { - "jsesc": "0.5.0" + "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=", + "dev": true + } } }, "relateurl": { @@ -13596,8 +13688,7 @@ "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=", - "dev": true + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "render-fragment": { "version": "0.1.1", @@ -13611,24 +13702,72 @@ "integrity": "sha512-FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==", "dev": true, "requires": { - "css-select": "1.2.0", - "dom-converter": "0.2.0", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.4.0" + "css-select": "^1.1.0", + "dom-converter": "~0.2", + "htmlparser2": "~3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.1", + "domutils": "1.1", + "readable-stream": "1.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "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=", + "dev": true + } } }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", @@ -13636,130 +13775,45 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.8.0", - "caseless": "0.12.0", - "combined-stream": "1.0.7", - "extend": "3.0.2", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.1.0", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.20", - "oauth-sign": "0.9.0", - "performance-now": "2.1.0", - "qs": "6.5.2", - "safe-buffer": "5.1.2", - "tough-cookie": "2.4.3", - "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=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" - } - }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true - }, - "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", - "dev": true, - "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" - } - }, - "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", - "dev": true - }, - "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", - "dev": true, - "requires": { - "mime-db": "1.36.0" - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "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==", - "dev": true - }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, - "requires": { - "psl": "1.1.29", - "punycode": "1.4.1" - } - }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - } + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-from-string": { "version": "2.0.2", @@ -13770,8 +13824,7 @@ "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=", - "dev": true + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" }, "requires-port": { "version": "1.0.0", @@ -13779,11 +13832,11 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.6" } }, "resolve-cwd": { @@ -13792,7 +13845,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "resolve-dir": { @@ -13801,8 +13854,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-from": { @@ -13814,8 +13867,7 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "restore-cursor": { "version": "2.0.0", @@ -13823,15 +13875,14 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, "retry": { "version": "0.10.1", @@ -13846,22 +13897,22 @@ "dev": true }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.1.3" } }, "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-async": { @@ -13870,7 +13921,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "run-queue": { @@ -13879,7 +13930,7 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "1.2.0" + "aproba": "^1.1.1" } }, "rxjs": { @@ -13887,7 +13938,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.9.0" } }, "rxjs-compat": { @@ -13896,25 +13947,22 @@ "integrity": "sha512-caGN7ixiabHpOofginKEquuHk7GgaCrC7UpUQ9ZqGp80tMc68msadOeP/2AKy2R4YJsT1+TX5GZCtxO82qWkyA==" }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", - "dev": true + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass-graph": { "version": "2.2.4", @@ -13922,10 +13970,115 @@ "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", "dev": true, "requires": { - "glob": "7.1.2", - "lodash": "4.17.11", - "scss-tokenizer": "0.2.3", - "yargs": "7.1.0" + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "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=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "^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=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.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=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "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" + } + }, + "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=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } } }, "sass-loader": { @@ -13934,12 +14087,12 @@ "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", "dev": true, "requires": { - "clone-deep": "2.0.2", - "loader-utils": "1.1.0", - "lodash.tail": "4.1.1", - "neo-async": "2.5.1", - "pify": "3.0.0", - "semver": "5.5.1" + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" } }, "saucelabs": { @@ -13948,42 +14101,58 @@ "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", "dev": true, "requires": { - "https-proxy-agent": "2.2.1" + "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==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", "dev": true }, - "schedule": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/schedule/-/schedule-0.5.0.tgz", - "integrity": "sha512-HUcJicG5Ou8xfR//c2rPT0lPIRR09vVvN81T9fqfVgBmhERUbDEQoYKjpBxbueJnCPpSu2ujXzOnRQt6x9o/jw==", + "scheduler": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.12.0.tgz", + "integrity": "sha512-t7MBR28Akcp4Jm+QoR63XgAi9YgCUmgvDHqf5otgAj4QvdoBE4ImCX0ffehefePPG+aitiYHp0g/mW6s4Tp+dw==", "dev": true, "requires": { - "object-assign": "4.1.1" + "loose-envify": "^1.1.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=", + "dev": true + } } }, "schema-utils": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", - "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "ajv": "6.4.0", - "ajv-keywords": "3.2.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, + "screenshoter-report-analyzer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/screenshoter-report-analyzer/-/screenshoter-report-analyzer-0.6.0.tgz", + "integrity": "sha1-Cm+I1fXRrBa2z3Ji7/ujH+5I7RI=", + "dev": true + }, "scss-tokenizer": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", "dev": true, "requires": { - "js-base64": "2.4.9", - "source-map": "0.4.4" + "js-base64": "^2.1.8", + "source-map": "^0.4.2" }, "dependencies": { "source-map": { @@ -13992,7 +14161,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -14014,10 +14183,10 @@ "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", "dev": true, "requires": { - "jszip": "3.1.5", - "rimraf": "2.6.2", + "jszip": "^3.1.3", + "rimraf": "^2.5.4", "tmp": "0.0.30", - "xml2js": "0.4.19" + "xml2js": "^0.4.17" }, "dependencies": { "tmp": { @@ -14026,24 +14195,24 @@ "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.1" } } } }, "selfsigned": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", - "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.4.tgz", + "integrity": "sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw==", "dev": true, "requires": { "node-forge": "0.7.5" } }, "semver": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", - "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-dsl": { "version": "1.0.1", @@ -14051,7 +14220,7 @@ "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", "dev": true, "requires": { - "semver": "5.5.1" + "semver": "^5.3.0" } }, "semver-intersect": { @@ -14060,54 +14229,53 @@ "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", "dev": true, "requires": { - "semver": "5.5.1" + "semver": "^5.0.0" } }, "send": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", - "dev": true, "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", + "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.2", + "http-errors": "~1.6.2", "mime": "1.4.1", "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.4.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" }, "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "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==", - "dev": true + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "statuses": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", - "dev": true + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" } } }, "serialize-javascript": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", - "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", "dev": true }, "serve-favicon": { @@ -14116,17 +14284,17 @@ "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", "dev": true, "requires": { - "etag": "1.8.1", + "etag": "~1.8.1", "fresh": "0.5.2", "ms": "2.1.1", - "parseurl": "1.3.2", + "parseurl": "~1.3.2", "safe-buffer": "5.1.1" }, "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true } } @@ -14135,60 +14303,64 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, "requires": { - "accepts": "1.3.5", + "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.2", - "mime-types": "2.1.17", - "parseurl": "1.3.2" + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", - "dev": true, "requires": { - "encodeurl": "1.0.2", - "escape-html": "1.0.3", - "parseurl": "1.3.2", + "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=", - "dev": true - }, - "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=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -14202,17 +14374,16 @@ "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "sha.js": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", - "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shallow-clone": { @@ -14221,9 +14392,9 @@ "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", "dev": true, "requires": { - "is-extendable": "0.1.1", - "kind-of": "5.1.0", - "mixin-object": "2.0.1" + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" }, "dependencies": { "kind-of": { @@ -14235,28 +14406,23 @@ } }, "shallowequal": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-0.2.2.tgz", - "integrity": "sha1-HjL9W8q2rWiKSBLLDMBO/HXHAU4=", - "dev": true, - "requires": { - "lodash.keys": "3.1.2" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { - "shebang-regex": "1.0.0" + "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=", - "dev": true + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shell-quote": { "version": "1.6.1", @@ -14264,28 +14430,26 @@ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "dev": true, "requires": { - "array-filter": "0.0.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, "shelljs": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.2.tgz", - "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", - "dev": true, + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "slash": { "version": "1.0.0", @@ -14299,39 +14463,55 @@ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, + "smart-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz", + "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.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" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -14339,56 +14519,45 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -14396,9 +14565,18 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" + }, + "dependencies": { + "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.5" + } + } } }, "socket.io": { @@ -14407,12 +14585,12 @@ "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", "dev": true, "requires": { - "debug": "3.1.0", - "engine.io": "3.2.0", - "has-binary2": "1.0.3", - "socket.io-adapter": "1.1.1", + "debug": "~3.1.0", + "engine.io": "~3.2.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", "socket.io-client": "2.1.1", - "socket.io-parser": "3.2.0" + "socket.io-parser": "~3.2.0" }, "dependencies": { "debug": { @@ -14423,6 +14601,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -14442,15 +14626,15 @@ "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "3.1.0", - "engine.io-client": "3.2.1", - "has-binary2": "1.0.3", + "debug": "~3.1.0", + "engine.io-client": "~3.2.0", + "has-binary2": "~1.0.2", "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "socket.io-parser": "3.2.0", + "socket.io-parser": "~3.2.0", "to-array": "0.1.4" }, "dependencies": { @@ -14462,6 +14646,12 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -14472,7 +14662,7 @@ "dev": true, "requires": { "component-emitter": "1.2.1", - "debug": "3.1.0", + "debug": "~3.1.0", "isarray": "2.0.1" }, "dependencies": { @@ -14490,6 +14680,12 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -14499,8 +14695,8 @@ "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", "dev": true, "requires": { - "faye-websocket": "0.10.0", - "uuid": "3.1.0" + "faye-websocket": "^0.10.0", + "uuid": "^3.0.1" }, "dependencies": { "faye-websocket": { @@ -14509,7 +14705,7 @@ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } } } @@ -14519,41 +14715,48 @@ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.3.0.tgz", "integrity": "sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg==", "requires": { - "debug": "3.2.5", - "eventsource": "1.0.7", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.4.3" + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" }, "dependencies": { "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", - "requires": { - "ms": "2.1.1" - } - }, - "eventsource": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", - "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "requires": { - "original": "1.0.2" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, + "socks": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.2.tgz", + "integrity": "sha512-g6wjBnnMOZpE0ym6e0uHSddz9p3a+WsBaaYQaBaSCJYvrC4IXykQR9MNGjLQf38e9iIIhp3b1/Zk8YZI3KGJ0Q==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", + "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "dev": true, + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" + } + }, "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "source-map": { @@ -14567,37 +14770,44 @@ "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", "dev": true, "requires": { - "async": "2.6.0", - "loader-utils": "1.1.0" + "async": "^2.5.0", + "loader-utils": "^1.1.0" } }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, "requires": { - "atob": "2.1.1", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "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==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { - "source-map": "0.5.7" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "space-separated-tokens": { "version": "1.1.2", @@ -14608,104 +14818,124 @@ "trim": "0.0.1" } }, - "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==", + "sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==" + }, + "spawn-command": { + "version": "0.0.2-1", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", + "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=" + }, + "spawn-promise": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/spawn-promise/-/spawn-promise-0.1.8.tgz", + "integrity": "sha512-pTkEOFxvYLq9SaI1d8bwepj0yD9Yyz65+4e979YZLv/L3oYPxZpDTabcm6e+KIZniGK9mQ+LGrwB5s1v2z67nQ==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "co": "^4.6.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "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==", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" }, "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==", - "dev": true, "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "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==", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==" }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.0.tgz", + "integrity": "sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==", "dev": true, "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", - "select-hose": "2.0.0", - "spdy-transport": "2.1.0" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" } }, "spdy-transport": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", - "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { - "debug": "2.6.9", - "detect-node": "2.0.4", - "hpack.js": "2.1.6", - "obuf": "1.1.2", - "readable-stream": "2.3.3", - "safe-buffer": "5.1.1", - "wbuf": "1.7.3" + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "speed-measure-webpack-plugin": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.5.tgz", + "integrity": "sha512-S/guYjC4Izn5wY2d0+M4zowED/F77Lxh9yjkTZ+XAr244pr9c1MYNcXcRe9lx2hmAj0GPbOrBXgOF2YIp/CZ8A==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "requires": { + "through": "2" } }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", - "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", - "dev": true, + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", + "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "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=", - "dev": true - } + "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" } }, "ssri": { @@ -14714,44 +14944,41 @@ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.1" } }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } }, "stats-webpack-plugin": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.6.2.tgz", - "integrity": "sha1-LFlJtTHgf4eojm6k3PrFOqjHWis=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz", + "integrity": "sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ==", "dev": true, "requires": { - "lodash": "4.17.11" + "lodash": "^4.17.4" } }, "statuses": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" }, "stdout-stream": { "version": "1.4.1", @@ -14759,7 +14986,39 @@ "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", "dev": true, "requires": { - "readable-stream": "2.3.3" + "readable-stream": "^2.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "stompjs": { @@ -14767,71 +15026,112 @@ "resolved": "https://registry.npmjs.org/stompjs/-/stompjs-2.3.3.tgz", "integrity": "sha1-NBeKx7uO4pTMXVVK2LUPf1RZ/Y4=", "requires": { - "websocket": "1.0.28" + "websocket": "^1.0.28" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" }, "dependencies": { - "websocket": { - "version": "1.0.28", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.28.tgz", - "integrity": "sha512-00y/20/80P7H4bCYkzuuvvfDvh+dgtXi5kzDf3UcZwN6boTYaKvsrtZ5lIYm1Gsg48siMErd9M4zjSYfYFHTrA==", - "optional": true, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, "requires": { - "debug": "2.6.9", - "nan": "2.11.1", - "typedarray-to-buffer": "3.1.5", - "yaeti": "0.0.6" - }, - "dependencies": { - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "optional": true, - "requires": { - "is-typedarray": "1.0.0" - } - }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", - "optional": true - } + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" } } } }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "duplexer": "~0.1.1" } }, "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", - "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "stream-shift": { @@ -14846,77 +15146,104 @@ "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", "dev": true, "requires": { - "date-format": "1.2.0", - "debug": "3.2.5", - "mkdirp": "0.5.1", - "readable-stream": "2.3.3" + "date-format": "^1.2.0", + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "readable-stream": "^2.3.0" }, "dependencies": { "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true + }, + "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==", + "dev": true, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } } } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" }, - "string.prototype.matchall": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-3.0.0.tgz", - "integrity": "sha512-/g0YW/cEfXASRHAaLR7VZbTUlxgP14fmCsfSRFG2gvlG2S1q9rBpjYnEy/EIIzY+bjzs2nTfAHJYXmQ+zTnXSQ==", - "dev": true, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.12.0", - "function-bind": "1.1.1", - "has-symbols": "1.0.0", - "regexp.prototype.flags": "1.2.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { - "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", - "dev": true, + "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": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "ansi-regex": "^3.0.0" } } } }, + "string.prototype.matchall": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-3.0.1.tgz", + "integrity": "sha512-NSiU0ILQr9PQ1SZmM1X327U5LsM+KfDTassJfqN1al1+0iNpKzmQ4BfXOJwRnTEqv8nKJ67mFpqRoPaGWwvy5A==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "regexp.prototype.flags": "^1.2.0" + } + }, "string.prototype.padend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" } }, "string.prototype.padstart": { @@ -14925,9 +15252,9 @@ "integrity": "sha1-W8+tOfRkm7LQMSkuGbzwtRDUskI=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.11.0", - "function-bind": "1.1.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" } }, "string.prototype.startswith": { @@ -14937,21 +15264,19 @@ "dev": true }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", "requires": { - "safe-buffer": "5.1.1" + "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=", - "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -14960,14 +15285,13 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "1.0.1", @@ -14975,7 +15299,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -14985,13 +15309,13 @@ "dev": true }, "style-loader": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", - "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz", + "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.4.5" + "loader-utils": "^1.1.0", + "schema-utils": "^1.0.0" } }, "stylus": { @@ -15000,12 +15324,12 @@ "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", "dev": true, "requires": { - "css-parse": "1.7.0", - "debug": "2.6.9", - "glob": "7.0.6", - "mkdirp": "0.5.1", - "sax": "0.5.8", - "source-map": "0.1.43" + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" }, "dependencies": { "glob": { @@ -15014,27 +15338,21 @@ "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", "dev": 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" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "sax": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", - "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", - "dev": true - }, "source-map": { "version": "0.1.43", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -15045,18 +15363,17 @@ "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "lodash.clonedeep": "4.5.0", - "when": "3.6.4" + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" } }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "svg-url-loader": { @@ -15067,6 +15384,84 @@ "requires": { "file-loader": "1.1.11", "loader-utils": "1.1.0" + }, + "dependencies": { + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "swagger-express-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/swagger-express-middleware/-/swagger-express-middleware-2.0.1.tgz", + "integrity": "sha512-NNbrW4nKZKxSmvch/SAgT3bbR+EClKFRS7kJ2dOWpHzAeyyPu9iG+1CUTImHVG1nh5v+f9XBkA7+PFeUo1Z1iw==", + "requires": { + "body-parser": "^1.18.3", + "cookie-parser": "^1.3.5", + "debug": "^4.1.1", + "lodash": "^4.17.11", + "mkdirp": "^0.5.1", + "multer": "^0.1.8", + "ono": "^4.0.11", + "swagger-methods": "^1.0.8", + "swagger-parser": "^6.0.3", + "tmp": "0.0.33", + "tv4": "^1.2.5", + "type-is": "^1.6.8" + } + }, + "swagger-methods": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/swagger-methods/-/swagger-methods-1.0.8.tgz", + "integrity": "sha512-G6baCwuHA+C5jf4FNOrosE4XlmGsdjbOjdBK4yuiDDj/ro9uR4Srj3OR84oQMT8F3qKp00tYNv0YN730oTHPZA==" + }, + "swagger-parser": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-6.0.3.tgz", + "integrity": "sha512-rd1w4giVtgdWELAmxWXjVbb2+xnbkc4BjzsQHBLU8YDMBhmNbnQBHQc92BpspxBwkj0zhSpF7Htor9691NJfwA==", + "requires": { + "call-me-maybe": "^1.0.1", + "json-schema-ref-parser": "^6.0.3", + "ono": "^4.0.11", + "openapi-schema-validation": "^0.4.2", + "swagger-methods": "^1.0.8", + "swagger-schema-official": "2.0.0-bab6bed", + "z-schema": "^3.24.2" + } + }, + "swagger-schema-official": { + "version": "2.0.0-bab6bed", + "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", + "integrity": "sha1-cAcEaNbSl3ylI3suUZyn0Gouo/0=" + }, + "swagger-ui-dist": { + "version": "3.20.5", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.20.5.tgz", + "integrity": "sha512-DNmJQ1qVkW8xk3wI2VfupOS7IYTHNjYaYX+L4s8B8ksdtoHOx3RsRqJUMIQByojHgb3PwEt+zGdIUwxJ4N5pwg==" + }, + "swagger-ui-express": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.0.2.tgz", + "integrity": "sha512-XZtXI2+SKT3fgvJSGg4P7Dtmkzr50uoSb09IxbUWmjL538TIGRMZtfdEkjZEEq44xgGNAxMryzBEUdUnkXr8dA==", + "requires": { + "swagger-ui-dist": "^3.18.1" } }, "symbol-observable": { @@ -15081,13 +15476,13 @@ "integrity": "sha512-I9mrbZ5M96s7QeJDv95toF1svkUjeBybe8ydhY7foPaBmr0SPJMFupArmMkDrOKTTj0sJVr+nvQNxWLziQ7nDQ==", "dev": true, "requires": { - "has-symbols": "1.0.0" + "has-symbols": "^1.0.0" } }, "tapable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", - "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", "dev": true }, "tar": { @@ -15096,9 +15491,185 @@ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, + "terser": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.1.tgz", + "integrity": "sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.6" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } } }, "text-table": { @@ -15110,38 +15681,70 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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.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" + } + }, + "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" + } + } } }, "thunky": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", - "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.3.tgz", + "integrity": "sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow==", "dev": true }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=" + }, "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==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tiny-emitter": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz", - "integrity": "sha1-gtJ0aKylrejl/R5tIrV91D69+3w=" + "integrity": "sha512-2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==" }, "tinycolor2": { "version": "1.4.1", @@ -15152,10 +15755,9 @@ "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", - "dev": true, + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-array": { @@ -15171,51 +15773,46 @@ "dev": true }, "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=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" + }, + "dependencies": { + "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.5" + } + } } }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - } + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "toggle-selection": { @@ -15224,26 +15821,26 @@ "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=", "dev": true }, - "toposort": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", - "dev": true - }, "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==", - "dev": true, + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "punycode": "1.4.1" + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } } }, "tree-kill": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", - "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", - "dev": true + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz", + "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==" }, "trim": { "version": "0.0.1", @@ -15268,301 +15865,20 @@ "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.1.2" } }, "ts-loader": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.5.0.tgz", - "integrity": "sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.3.tgz", + "integrity": "sha512-KwF1SplmOJepnoZ4eRIloH/zXL195F51skt7reEsS6jvDqzgc/YSbz9b8E07GxIUwLXdcD4ssrJu6v8CwaTafA==", "dev": true, "requires": { - "chalk": "2.4.1", - "enhanced-resolve": "4.0.0", - "loader-utils": "1.1.0", - "micromatch": "3.1.10", - "semver": "5.5.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" } }, "ts-node": { @@ -15571,45 +15887,16 @@ "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", "dev": true, "requires": { - "arrify": "1.0.1", - "chalk": "2.4.1", - "diff": "3.5.0", - "make-error": "1.3.5", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.5.9", - "tsconfig": "7.0.0", - "v8flags": "3.1.1", - "yn": "2.0.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "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==", - "dev": true - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" - } - } + "arrify": "^1.0.0", + "chalk": "^2.3.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.0", + "tsconfig": "^7.0.0", + "v8flags": "^3.0.0", + "yn": "^2.0.0" } }, "tsconfig": { @@ -15618,12 +15905,42 @@ "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", "dev": true, "requires": { - "@types/strip-bom": "3.0.0", + "@types/strip-bom": "^3.0.0", "@types/strip-json-comments": "0.0.30", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "tsconfig-paths": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.7.0.tgz", + "integrity": "sha512-7iE+Q/2E1lgvxD+c0Ot+GFFmgmfIjt/zCayyruXkXQ84BLT85gHXy0WSoQSiuFX9+d+keE/jiON7notV74ZY+A==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "deepmerge": "^2.0.1", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" }, "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -15632,17 +15949,28 @@ } } }, + "tsconfig-paths-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-S/gOOPOkV8rIL4LurZ1vUdYCVgo15iX9ZMJ6wx6w2OgcpT/G4wMyHB6WM+xheSqGMrWKuxFul+aXpCju3wmj/g==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "tsconfig-paths": "^3.4.0" + } + }, "tsickle": { "version": "0.32.1", "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.32.1.tgz", "integrity": "sha512-JW9j+W0SaMSZGejIFZBk0AiPfnhljK3oLx5SaqxrJhjlvzFyPml5zqG1/PuScUj6yTe1muEqwk5CnDK0cOZmKw==", "dev": true, "requires": { - "jasmine-diff": "0.1.3", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map": "0.6.1", - "source-map-support": "0.5.9" + "jasmine-diff": "^0.1.3", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map": "^0.6.0", + "source-map-support": "^0.5.0" }, "dependencies": { "source-map": { @@ -15650,55 +15978,32 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" - } } } }, "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tslint": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.11.0.tgz", - "integrity": "sha1-mPMMAurjzecAYgHkwzywi0hYHu0=", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", + "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "builtin-modules": "1.1.1", - "chalk": "2.4.1", - "commander": "2.17.1", - "diff": "3.5.0", - "glob": "7.1.2", - "js-yaml": "3.12.0", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "semver": "5.5.1", - "tslib": "1.9.0", - "tsutils": "2.29.0" - }, - "dependencies": { - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.4.0" - } - } + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" } }, "tsutils": { @@ -15707,7 +16012,7 @@ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { - "tslib": "1.9.0" + "tslib": "^1.8.1" } }, "tty-browserify": { @@ -15720,17 +16025,19 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, + "tv4": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz", + "integrity": "sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=" + }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-check": { "version": "0.3.2", @@ -15738,17 +16045,16 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "dev": true, + "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.17" + "mime-types": "~2.1.18" } }, "typedarray": { @@ -15757,73 +16063,44 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "optional": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "2.9.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", - "dev": true + "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==" }, "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==", + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", + "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==", "dev": true }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, "requires": { - "commander": "2.17.1", - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz", - "integrity": "sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==", - "dev": true, - "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.5", - "serialize-javascript": "1.5.0", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.1.0", - "worker-farm": "1.6.0" + "commander": "~2.17.1", + "source-map": "~0.6.1" }, "dependencies": { "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==" }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "uglify-es": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", - "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", - "dev": true, - "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" - } + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -15845,8 +16122,8 @@ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { - "unicode-canonical-property-names-ecmascript": "1.0.4", - "unicode-property-aliases-ecmascript": "1.0.4" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, "unicode-match-property-value-ecmascript": { @@ -15865,120 +16142,90 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } - }, - "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", - "dev": true, - "requires": { - "unique-slug": "2.0.0" - } - }, - "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "unique-slug": "^2.0.0" } }, - "universal-dotenv": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/universal-dotenv/-/universal-dotenv-1.9.1.tgz", - "integrity": "sha512-38GhLyN0rAz7040sltVEDSkO/yTcShKJFBIX5/4Hi/c//wUS9UgvnP1GDTLVs9CR+XARLsihPBciSS9y+USyKA==", + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", "dev": true, "requires": { - "@babel/runtime": "7.1.2", - "app-root-dir": "1.0.2", - "core-js": "2.5.7", - "dotenv": "6.0.0", - "dotenv-expand": "4.2.0" - }, - "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==", - "dev": true - }, - "dotenv": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.0.0.tgz", - "integrity": "sha512-FlWbnhgjtwD+uNLUGHbMykMOYQaTivdHEmYwAKFjn6GKe/CqY0fNae93ZHTd20snh9ZLr8mTzIL9m0APQ1pjQg==", - "dev": true - } + "imurmurhash": "^0.1.4" } }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unix-crypt-td-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.0.0.tgz", + "integrity": "sha1-HAgkFQSBvHoB1J6Y8exmjYJBLzs=" }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -15988,16 +16235,19 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" } } }, "upath": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", - "dev": true + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" }, "upper-case": { "version": "1.1.3", @@ -16006,27 +16256,17 @@ "dev": true }, "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", - "dev": true, + "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" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "dev": true - } + "punycode": "^2.1.0" } }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "url": { "version": "0.11.0", @@ -16047,101 +16287,61 @@ } }, "url-loader": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.1.tgz", - "integrity": "sha512-vugEeXjyYFBCUOpX+ZuaunbK3QXMKaQ3zUnRfIpRBlGkY7QizCnzyyn2ASfcxsvyU3ef+CJppVywnl3Kgf13Gg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "mime": "2.3.1", - "schema-utils": "1.0.0" + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" }, "dependencies": { "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.4.0", - "ajv-errors": "1.0.0", - "ajv-keywords": "3.2.0" - } } } }, "url-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", - "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", "requires": { - "querystringify": "2.0.0", - "requires-port": "1.0.0" + "querystringify": "^2.0.0", + "requires-port": "^1.0.0" } }, "use": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", - "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, "useragent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", - "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", "dev": true, "requires": { - "lru-cache": "2.2.4", - "tmp": "0.0.33" - }, - "dependencies": { - "lru-cache": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", - "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", - "dev": true - } + "lru-cache": "4.1.x", + "tmp": "0.0.x" } }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } + "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=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.0.0", @@ -16149,8 +16349,8 @@ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, "requires": { - "define-properties": "1.1.2", - "object.getownpropertydescriptors": "2.0.3" + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" } }, "utila": { @@ -16162,32 +16362,29 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "v8flags": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", - "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", + "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "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==", - "dev": true, + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "validate-npm-package-name": { @@ -16196,14 +16393,18 @@ "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", "dev": true, "requires": { - "builtins": "1.0.3" + "builtins": "^1.0.3" } }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "velocity-animate": { "version": "1.5.2", @@ -16217,31 +16418,37 @@ "integrity": "sha512-ZyXBm+9C/6kNUNyc+aeNKEhtTu/Mn+OfpsNBGuTxU8S2DUcis/KQL0rTN6jWL+7ygdOrun18qhheNZTA7YERmg==", "dev": true, "requires": { - "lodash": "4.17.11", - "prop-types": "15.6.2", - "react-transition-group": "2.5.0", - "velocity-animate": "1.5.2" + "lodash": "^4.17.5", + "prop-types": "^15.5.8", + "react-transition-group": "^2.0.0", + "velocity-animate": "^1.4.0" } }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { - "assert-plus": "1.0.0", + "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=", - "dev": true - } + "extsprintf": "^1.2.0" + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "requires": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" } }, + "viz.js": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/viz.js/-/viz.js-1.8.2.tgz", + "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==" + }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -16255,347 +16462,26 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", - "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", - "dev": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "2.0.3", - "graceful-fs": "4.1.11", - "neo-async": "2.5.1" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "chokidar": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", - "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", - "dev": true, - "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.1.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "6.0.2" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } + "dev": true + }, + "warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "wbuf": { @@ -16604,7 +16490,7 @@ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, "requires": { - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "^1.0.0" } }, "webdriver-js-extender": { @@ -16613,79 +16499,50 @@ "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", "dev": true, "requires": { - "@types/selenium-webdriver": "3.0.10", - "selenium-webdriver": "3.6.0" + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" } }, "webpack": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.20.2.tgz", - "integrity": "sha512-75WFUMblcWYcocjSLlXCb71QuGyH7egdBZu50FtBGl2Nso8CK3Ej+J7bTZz2FPFq5l6fzCisD9modB7t30ikuA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.8", - "@webassemblyjs/helper-module-context": "1.7.8", - "@webassemblyjs/wasm-edit": "1.7.8", - "@webassemblyjs/wasm-parser": "1.7.8", - "acorn": "5.7.3", - "acorn-dynamic-import": "3.0.0", - "ajv": "6.4.0", - "ajv-keywords": "3.2.0", - "chrome-trace-event": "1.0.0", - "enhanced-resolve": "4.1.0", - "eslint-scope": "4.0.0", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.5.1", - "node-libs-browser": "2.1.0", - "schema-utils": "0.4.5", - "tapable": "1.1.0", - "uglifyjs-webpack-plugin": "1.2.5", - "watchpack": "1.6.0", - "webpack-sources": "1.3.0" + "version": "4.28.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.4.tgz", + "integrity": "sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" }, "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "tapable": "1.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "tapable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz", - "integrity": "sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==", - "dev": true - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } } } @@ -16696,8 +16553,8 @@ "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", "dev": true, "requires": { - "source-list-map": "0.1.8", - "source-map": "0.4.4" + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" }, "dependencies": { "source-list-map": { @@ -16712,7 +16569,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -16723,91 +16580,71 @@ "integrity": "sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA==", "dev": true, "requires": { - "memory-fs": "0.4.1", - "mime": "2.3.1", - "range-parser": "1.2.0", - "webpack-log": "2.0.0" + "memory-fs": "~0.4.1", + "mime": "^2.3.1", + "range-parser": "^1.0.3", + "webpack-log": "^2.0.0" }, "dependencies": { "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", + "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==", "dev": true } } }, "webpack-dev-server": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.9.tgz", - "integrity": "sha512-fqPkuNalLuc/hRC2QMkVYJkgNmRvxZQo7ykA2e1XRg/tMJm3qY7ZaD6d89/Fqjxtj9bOrn5wZzLD2n84lJdvWg==", + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz", + "integrity": "sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==", "dev": true, "requires": { "ansi-html": "0.0.7", - "bonjour": "3.5.0", - "chokidar": "2.0.4", - "compression": "1.7.3", - "connect-history-api-fallback": "1.5.0", - "debug": "3.2.5", - "del": "3.0.0", - "express": "4.16.3", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.18.0", - "import-local": "2.0.0", - "internal-ip": "3.0.1", - "ip": "1.1.5", - "killable": "1.0.1", - "loglevel": "1.6.1", - "opn": "5.3.0", - "portfinder": "1.0.17", - "schema-utils": "1.0.0", - "selfsigned": "1.10.3", - "serve-index": "1.9.1", + "bonjour": "^3.5.0", + "chokidar": "^2.0.0", + "compression": "^1.5.2", + "connect-history-api-fallback": "^1.3.0", + "debug": "^3.1.0", + "del": "^3.0.0", + "express": "^4.16.2", + "html-entities": "^1.2.0", + "http-proxy-middleware": "~0.18.0", + "import-local": "^2.0.0", + "internal-ip": "^3.0.1", + "ip": "^1.1.5", + "killable": "^1.0.0", + "loglevel": "^1.4.1", + "opn": "^5.1.0", + "portfinder": "^1.0.9", + "schema-utils": "^1.0.0", + "selfsigned": "^1.9.1", + "semver": "^5.6.0", + "serve-index": "^1.7.2", "sockjs": "0.3.19", - "sockjs-client": "1.1.5", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "5.4.0", + "sockjs-client": "1.3.0", + "spdy": "^4.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^5.1.0", + "url": "^0.11.0", "webpack-dev-middleware": "3.4.0", - "webpack-log": "2.0.0", + "webpack-log": "^2.0.0", "yargs": "12.0.2" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "cliui": { + "camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, "debug": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.5.tgz", - "integrity": "sha512-D61LaDQPQkxJ5AUM2mbSJRbPkNs/TmdmOeLAi1hgDkpDfIfetSrjmWhccwtuResSwMbACjx/xXQofvM9CE/aeg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } }, "decamelize": { @@ -16819,188 +16656,59 @@ "xregexp": "4.0.0" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "3.0.0" - } - }, - "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==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "os-locale": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz", - "integrity": "sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==", - "dev": true, - "requires": { - "execa": "0.10.0", - "lcid": "2.0.0", - "mem": "4.0.0" - } - }, - "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", - "dev": true, - "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==", - "dev": true, - "requires": { - "p-limit": "2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "6.4.0", - "ajv-errors": "1.0.0", - "ajv-keywords": "3.2.0" - } - }, - "sockjs-client": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", - "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", - "dev": true, - "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.3" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "http-proxy": "^1.16.2", + "is-glob": "^4.0.0", + "lodash": "^4.17.5", + "micromatch": "^3.1.9" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "yargs": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz", "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "2.0.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.2", - "os-locale": "3.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "10.1.0" + "cliui": "^4.0.0", + "decamelize": "^2.0.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": "^10.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" } } } }, "webpack-hot-middleware": { - "version": "2.24.2", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.24.2.tgz", - "integrity": "sha512-VsBGNMC5JDnab5hbReMjmIYtnvDMT+odLSP49EbLZHwuAoJJDNOi0YLhTe40vvP7u7Be+Ww1mYHjwwelqdnaKA==", + "version": "2.24.3", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.24.3.tgz", + "integrity": "sha512-pPlmcdoR2Fn6UhYjAhp1g/IJy1Yc9hD+T6O9mjRcWV2pFbBjIFoJXhP0CoD0xPOhWJuWXuZXGBga9ybbOdzXpg==", "dev": true, "requires": { "ansi-html": "0.0.7", - "html-entities": "1.2.1", - "querystring": "0.2.0", - "strip-ansi": "3.0.1" + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" } }, "webpack-log": { @@ -17009,14 +16717,14 @@ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", "dev": true, "requires": { - "ansi-colors": "3.1.0", - "uuid": "3.3.2" + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" }, "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true } } @@ -17027,17 +16735,17 @@ "integrity": "sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ==", "dev": true, "requires": { - "lodash": "4.17.11" + "lodash": "^4.17.5" } }, "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -17054,7 +16762,36 @@ "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", "dev": true, "requires": { - "webpack-core": "0.6.9" + "webpack-core": "^0.6.8" + } + }, + "websocket": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.28.tgz", + "integrity": "sha512-00y/20/80P7H4bCYkzuuvvfDvh+dgtXi5kzDf3UcZwN6boTYaKvsrtZ5lIYm1Gsg48siMErd9M4zjSYfYFHTrA==", + "optional": true, + "requires": { + "debug": "^2.2.0", + "nan": "^2.11.0", + "typedarray-to-buffer": "^3.1.5", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "optional": true + } } }, "websocket-driver": { @@ -17062,14 +16799,14 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "requires": { - "http-parser-js": "0.4.9", - "websocket-extensions": "0.1.3" + "http-parser-js": ">=0.4.0", + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=" + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==" }, "whatwg-fetch": { "version": "3.0.0", @@ -17084,34 +16821,40 @@ "dev": true }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", - "dev": true, + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "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=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^2.1.1" } }, "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" }, "worker-farm": { "version": "1.6.0", @@ -17119,24 +16862,42 @@ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "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=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { "version": "3.3.3", @@ -17144,9 +16905,9 @@ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dev": true, "requires": { - "async-limiter": "1.0.0", - "safe-buffer": "5.1.1", - "ultron": "1.1.1" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, "xml2js": { @@ -17155,8 +16916,16 @@ "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "dev": true, "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.7" + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + } } }, "xmlbuilder": { @@ -17171,7 +16940,7 @@ "integrity": "sha1-kuQ36QDb/wRFDvrpDTyl8WVl9zg=", "dev": true, "requires": { - "sax": "1.1.6" + "sax": "~1.1.1" }, "dependencies": { "sax": { @@ -17203,23 +16972,18 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "xxhashjs": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", - "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", - "dev": true, - "requires": { - "cuint": "0.2.2" - } + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" }, "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==", - "dev": true + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=", + "optional": true }, "yallist": { "version": "2.1.2", @@ -17228,56 +16992,31 @@ "dev": true }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dev": true, - "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" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "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=", - "dev": true, - "requires": { - "camelcase": "3.0.0" - } - } + "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": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", - "dev": true, + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "requires": { - "camelcase": "4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, "yeast": { @@ -17292,10 +17031,22 @@ "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", "dev": true }, + "z-schema": { + "version": "3.24.3", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-3.24.3.tgz", + "integrity": "sha512-Hj1JIXsXZNCe9HLi3oWKHbYE8YuAFiutmwWX1JUbRgGUzuHAF3EL21mJPO+FEPckZwzG87jroXMrXLAfw03FnQ==", + "requires": { + "commander": "^2.7.1", + "core-js": "^2.5.7", + "lodash.get": "^4.0.0", + "lodash.isequal": "^4.0.0", + "validator": "^10.0.0" + } + }, "zone.js": { - "version": "0.8.26", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", - "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==" + "version": "0.8.29", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", + "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==" } } } diff --git a/quick-start/package.json b/quick-start/package.json index f8e510a232..be6cb277bd 100644 --- a/quick-start/package.json +++ b/quick-start/package.json @@ -5,8 +5,11 @@ "homepage": "https://github.com/marklogic/marklogic-data-hub", "scripts": { "rimraf": "rimraf", - "ng": "ng", - "start": "ng serve --proxy-config proxy.config.json --host 0.0.0.0 --disable-host-check", + "kill-express": "lsof -t -i tcp:8081 -sTCP:LISTEN | xargs kill -9", + "kill-ng": "lsof -t -i tcp:4200 -sTCP:LISTEN | xargs kill -9", + "mock:apis": "node server", + "start:ui": "ng serve --proxy-config proxy.config.json --host 0.0.0.0 --disable-host-check", + "start": "concurrently --kill-others-on-fail \"npm run kill-ng\" \"npm run kill-express\" \"npm run start:ui\" \"npm run mock:apis\"", "clean.dist": "npm run rimraf -- dist", "build.prod": "npm run clean.dist && ng build --prod", "test": "ng test", @@ -14,7 +17,8 @@ "e2e": "./node_modules/.bin/ng e2e", "webdriver-update": "webdriver-manager update", "storybook": "start-storybook -p 6006 -s ./src/main/ui/assets", - "storybook:build": "build-storybook -o site/docs/mlui-storybook -s ./src/main/ui/assets" + "storybook:build": "build-storybook -o site/docs/mlui-storybook -s ./src/main/ui/assets", + "docs:build": "./node_modules/.bin/compodoc -p ./tsconfig.json -n DHF-QuickStart --theme readthedocs -d site/docs/mlui-angular-docs/ --hideGenerator --disableGraph" }, "private": true, "dependencies": { @@ -30,56 +34,64 @@ "@angular/platform-browser": "^6.1.9", "@angular/platform-browser-dynamic": "^6.1.9", "@angular/router": "^6.1.9", - "@babel/core": "^7.1.2", - "@types/codemirror": "0.0.61", + "@babel/core": "^7.2.2", "classlist.js": "^1.1.20150312", "clipboard": "^2.0.1", - "codemirror": "^5.40.2", - "core-js": "^2.5.7", + "codemirror": "^5.42.2", + "compodoc": "0.0.41", + "concurrently": "^4.1.0", + "core-js": "^2.6.2", "date-fns": "^1.29.0", + "express": "^4.16.4", "font-awesome": "^4.7.0", + "http-proxy-middleware": "^0.19.1", "lodash": "^4.17.11", "material-design-icons-iconfont": "^3.0.3", "material-design-lite": "^1.3.0", "mdi": "^2.2.43", "moment": "^2.22.1", "ng2-device-detector": "^1.0.1", - "ngx-bootstrap": "^3.0.1", + "ngx-bootstrap": "^3.1.4", + "request": "^2.88.0", "rxjs": "^6.3.3", "rxjs-compat": "^6.3.3", "semver": "^5.5.1", "sockjs-client": "^1.3.0", "stompjs": "^2.3.3", - "zone.js": "^0.8.26" + "swagger-express-middleware": "^2.0.0", + "swagger-ui-express": "^4.0.2", + "zone.js": "^0.8.28" }, "devDependencies": { - "@angular-devkit/build-angular": "^0.8.4", + "@angular-devkit/build-angular": "^0.12.2", "@angular-devkit/core": "^0.6.8", - "@angular/cli": "^6.2.4", + "@angular/cli": "^6.2.9", "@angular/compiler-cli": "^6.1.9", "@angular/language-service": "^6.1.9", - "@storybook/addon-actions": "^4.0.0-alpha.21", - "@storybook/addon-backgrounds": "^4.0.0-alpha.21", - "@storybook/addon-centered": "^4.0.0-alpha.21", - "@storybook/addon-knobs": "^4.0.0-alpha.21", - "@storybook/addon-links": "^4.0.0-alpha.21", - "@storybook/addon-notes": "^4.0.0-alpha.21", - "@storybook/addon-options": "^4.0.0-alpha.21", - "@storybook/addon-storysource": "^4.0.0-alpha.21", - "@storybook/addons": "^4.0.0-alpha.21", - "@storybook/angular": "^4.0.0-alpha.21", - "@types/jasmine": "^2.8.8", + "@storybook/addon-actions": "^4.1.7", + "@storybook/addon-backgrounds": "^4.1.7", + "@storybook/addon-centered": "^4.1.7", + "@storybook/addon-knobs": "^4.1.7", + "@storybook/addon-links": "^4.1.7", + "@storybook/addon-notes": "^4.1.7", + "@storybook/addon-options": "^4.1.7", + "@storybook/addon-storysource": "^4.1.7", + "@storybook/addons": "^4.1.7", + "@storybook/angular": "^4.1.7", + "@types/clipboard": "^2.0.1", + "@types/codemirror": "0.0.70", + "@types/jasmine": "^2.8.15", "@types/jasminewd2": "^2.0.4", - "@types/lodash": "^4.14.116", - "@types/node": "^10.11.3", + "@types/lodash": "^4.14.120", + "@types/node": "^10.12.18", "@types/semver": "^5.5.0", - "babel-loader": "^8.0.4", + "babel-loader": "^8.0.5", "codelyzer": "^4.4.4", "fs-extra": "^7.0.0", "jasmine-core": "~2.8.0", "jasmine-reporters": "^2.3.2", "jasmine-spec-reporter": "~4.2.1", - "karma": "^3.0.0", + "karma": "^3.1.4", "karma-chrome-launcher": "~2.2.0", "karma-cli": "~1.0.1", "karma-coverage-istanbul-reporter": "^2.0.4", @@ -89,15 +101,15 @@ "node-sass": "^4.9.3", "node-sass-tilde-importer": "^1.0.2", "postcss-loader": "^3.0.0", - "protractor": "^5.4.0", + "protractor": "^5.4.2", "protractor-html-reporter": "^1.3.2", "protractor-jasmine2-html-reporter": "0.0.7", "protractor-screenshoter-plugin": "^0.10.3", - "rimraf": "^2.6.2", + "rimraf": "^2.6.3", "sass-loader": "^7.1.0", "tmp": "0.0.33", "ts-node": "~4.1.0", - "tslint": "^5.11.0", + "tslint": "^5.12.1", "typescript": "^2.7.2" } } diff --git a/quick-start/proxy.config.json b/quick-start/proxy.config.json index 7291ab6846..04a96d75f8 100644 --- a/quick-start/proxy.config.json +++ b/quick-start/proxy.config.json @@ -1,14 +1,14 @@ { "/api/*": { - "target": "http://localhost:8080", + "target": "http://localhost:8081", "secure": false }, "/topic/*": { - "target": "http://localhost:8080", + "target": "http://localhost:8081", "secure": false }, "/websocket/*": { - "target": "http://localhost:8080", + "target": "http://localhost:8081", "secure": false, "ws": true } diff --git a/quick-start/server.js b/quick-start/server.js new file mode 100644 index 0000000000..cb24769718 --- /dev/null +++ b/quick-start/server.js @@ -0,0 +1,84 @@ +'use strict'; +/************************************************************************************************** + * This sample demonstrates a few more advanced features of Swagger-Express-Middleware, + * such as setting a few options, initializing the mock data store, and adding custom middleware logic. + **************************************************************************************************/ + +const util = require('util'); +const path = require('path'); +const proxy = require('http-proxy-middleware') +const express = require('express'); +const request = require('request'); +const swagger = require('swagger-express-middleware'); +const Middleware = swagger.Middleware; +const MemoryDataStore = swagger.MemoryDataStore; +const Resource = swagger.Resource; +const Collection = swagger.Collection; +const swaggerUi = require('swagger-ui-express'); +const swaggerMockDocPath = path.join(__dirname, '/api/swagger/mocks.json'); +const swaggerMockDocument = require(swaggerMockDocPath); +// const swaggerFullDocPath = path.join(__dirname, '/api/swagger/full.json') +// const swaggerFullDocument = require(swaggerFullDocPath); + +let app = express(); +let middleware = new Middleware(app); + +// Initialize Swagger Express Middleware with our Swagger file +middleware.init(swaggerMockDocPath, (err) => { + + // Create a custom data store with some initial mock data + // Not currently functioning as expected + // let myDB = new MemoryDataStore(); + // let data = [ + // {collection: '/api/samples', name: '/1', data: {id: 1, name: 'aaa', status: 'old'}}, + // {collection: '/api/samples', name: '/2', data: {id: 2, name: 'bbb', status: 'something'}}, + // {collection: '/api/samples', name: '/3', data: {id: 3, name: 'ccc', status: 'geewiz'}}, + // {collection: '/api/samples', name: '/4', data: {id: 4, name: 'ddd', status: 'ohhhh'}}, + // {collection: '/api/samples', name: '/5', data: {id: 5, name: 'eee', status: 'wowowow'}} + // ]; + // myDB.save(Resource.parse(data)); + + // Enable Express' case-sensitive and strict options + app.enable('case sensitive routing'); + app.enable('strict routing'); + + app.use(middleware.metadata()); + + // http://localhost:4200/api/swagger/doc/ - see Swagger document + app.use(middleware.files( + { + apiPath: '/api/swagger/doc/', + rawFilesPath: false + } + )); + + // http://localhost:4200/api/swagger-ui/ - see Swagger UI + app.use('/api/swagger-ui/', swaggerUi.serve, swaggerUi.setup(swaggerMockDocument)); + + // can only serve one Swagger UI, so below code won't work: https://github.com/swagger-api/swagger-ui/issues/1672 + // http://localhost:4200/api/swagger/ui/full/ - see Swagger UI + // app.use('/api/swagger/ui/full/', swaggerUi.serve, swaggerUi.setup(swaggerFullDocument)); + + app.use( + middleware.CORS(), + // middleware.validateRequest() // TODO: requires very thorough Swagger documentation to be in place + ); + + // // The mock middleware will use our custom data store, + // // which we already pre-populated with mock data + // app.use(middleware.mock(myDB)); + + // standard mock use - swagger definitions only + app.use(middleware.mock()); + + app.use(proxy({ + target: 'http://localhost:8080', + ws: true, // proxy websockets + })) + + app.listen(8081, () => { + console.log('Sample Mock API server is now running at http://localhost:8081'); + console.log('Swagger JSON Doc: http://localhost:4200/api/swagger/doc/'); + console.log('Swagger UI: http://localhost:4200/api/swagger-ui/'); + }); +}); \ No newline at end of file diff --git a/quick-start/src/main/java/com/marklogic/quickstart/ApplicationRunListener.java b/quick-start/src/main/java/com/marklogic/quickstart/ApplicationRunListener.java index d6bde5bd23..73f64662a7 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/ApplicationRunListener.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/ApplicationRunListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/AuthConfig.java b/quick-start/src/main/java/com/marklogic/quickstart/AuthConfig.java index 01a40b8665..c6170221f7 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/AuthConfig.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/AuthConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -155,7 +155,8 @@ protected String[] getAlwaysPermittedPatterns() { "/404", "/assets/**", "/shutdown", - "/main/ui/assets/img/**" + "/img/**", + "/favicon.ico" }; } } diff --git a/quick-start/src/main/java/com/marklogic/quickstart/DataHubApiConfiguration.java b/quick-start/src/main/java/com/marklogic/quickstart/DataHubApiConfiguration.java index 7e59d88107..19b8e12ca7 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/DataHubApiConfiguration.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/DataHubApiConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/PortInUseFailureAnalyzer.java b/quick-start/src/main/java/com/marklogic/quickstart/PortInUseFailureAnalyzer.java index 4216b2946e..b4ea61ac32 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/PortInUseFailureAnalyzer.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/PortInUseFailureAnalyzer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/WebSocketConfig.java b/quick-start/src/main/java/com/marklogic/quickstart/WebSocketConfig.java index bf42f9fcc0..1dc30cbe98 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/WebSocketConfig.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/WebSocketConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/auth/ConnectionAuthenticationFilter.java b/quick-start/src/main/java/com/marklogic/quickstart/auth/ConnectionAuthenticationFilter.java index b3b4852401..ce3bc4b6f4 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/auth/ConnectionAuthenticationFilter.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/auth/ConnectionAuthenticationFilter.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/auth/ConnectionAuthenticationToken.java b/quick-start/src/main/java/com/marklogic/quickstart/auth/ConnectionAuthenticationToken.java index ff00d5d365..245b5302da 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/auth/ConnectionAuthenticationToken.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/auth/ConnectionAuthenticationToken.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/auth/LoginInfo.java b/quick-start/src/main/java/com/marklogic/quickstart/auth/LoginInfo.java index 13847c0177..e6d5bc5887 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/auth/LoginInfo.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/auth/LoginInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/auth/MarkLogicAuthenticationManager.java b/quick-start/src/main/java/com/marklogic/quickstart/auth/MarkLogicAuthenticationManager.java index b4bedec12c..a9a7e6cbe5 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/auth/MarkLogicAuthenticationManager.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/auth/MarkLogicAuthenticationManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/auth/RestAuthenticationEntryPoint.java b/quick-start/src/main/java/com/marklogic/quickstart/auth/RestAuthenticationEntryPoint.java index a532c3a15f..3f728c0bc9 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/auth/RestAuthenticationEntryPoint.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/auth/RestAuthenticationEntryPoint.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/exception/BadRequestException.java b/quick-start/src/main/java/com/marklogic/quickstart/exception/BadRequestException.java index 2ace53cbc1..9f8c9ffec0 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/exception/BadRequestException.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/exception/BadRequestException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/exception/DataHubException.java b/quick-start/src/main/java/com/marklogic/quickstart/exception/DataHubException.java index e1fb0d8df8..2a90b85ad8 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/exception/DataHubException.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/exception/DataHubException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/exception/NotFoundException.java b/quick-start/src/main/java/com/marklogic/quickstart/exception/NotFoundException.java index 23e13d443d..643b8e6876 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/exception/NotFoundException.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/exception/NotFoundException.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/listeners/DeployUserModulesListener.java b/quick-start/src/main/java/com/marklogic/quickstart/listeners/DeployUserModulesListener.java index c1e86e27c0..b2c374419d 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/listeners/DeployUserModulesListener.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/listeners/DeployUserModulesListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/listeners/ValidateListener.java b/quick-start/src/main/java/com/marklogic/quickstart/listeners/ValidateListener.java index 6d15f84109..020697bbe6 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/listeners/ValidateListener.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/listeners/ValidateListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/FlowModel.java b/quick-start/src/main/java/com/marklogic/quickstart/model/FlowModel.java index 187cb8ff46..b2de562a75 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/FlowModel.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/FlowModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,9 @@ */ package com.marklogic.quickstart.model; -import com.marklogic.hub.flow.CodeFormat; -import com.marklogic.hub.flow.DataFormat; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.flow.CodeFormat; +import com.marklogic.hub.legacy.flow.DataFormat; +import com.marklogic.hub.legacy.flow.FlowType; import java.util.ArrayList; import java.util.List; diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/JobExport.java b/quick-start/src/main/java/com/marklogic/quickstart/model/JobExport.java index a9a757aab3..d50443c403 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/JobExport.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/JobExport.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/JobQuery.java b/quick-start/src/main/java/com/marklogic/quickstart/model/JobQuery.java index 286750a236..1650d0e9b5 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/JobQuery.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/JobQuery.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/JobStatusMessage.java b/quick-start/src/main/java/com/marklogic/quickstart/model/JobStatusMessage.java index a0d4445505..ec36122e96 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/JobStatusMessage.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/JobStatusMessage.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/MappingModel.java b/quick-start/src/main/java/com/marklogic/quickstart/model/MappingModel.java index 20ba6a3be2..f048f55d9a 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/MappingModel.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/MappingModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/PluginModel.java b/quick-start/src/main/java/com/marklogic/quickstart/model/PluginModel.java index 1efc97ce32..00370a307c 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/PluginModel.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/PluginModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/Project.java b/quick-start/src/main/java/com/marklogic/quickstart/model/Project.java index b984ff47de..c25555db46 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/Project.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/Project.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/ProjectInfo.java b/quick-start/src/main/java/com/marklogic/quickstart/model/ProjectInfo.java index 891130b1fa..4b9bc20210 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/ProjectInfo.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/ProjectInfo.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/SearchPathModel.java b/quick-start/src/main/java/com/marklogic/quickstart/model/SearchPathModel.java index d6e3aa9595..2b41759c50 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/SearchPathModel.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/SearchPathModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/SearchQuery.java b/quick-start/src/main/java/com/marklogic/quickstart/model/SearchQuery.java index c6aad78d99..83d753ff16 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/SearchQuery.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/SearchQuery.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/StatusMessage.java b/quick-start/src/main/java/com/marklogic/quickstart/model/StatusMessage.java index eb36faa27f..95a77a6563 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/StatusMessage.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/StatusMessage.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/TraceQuery.java b/quick-start/src/main/java/com/marklogic/quickstart/model/TraceQuery.java index a4df5a1b0d..eddbedceab 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/TraceQuery.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/TraceQuery.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/DefinitionType.java b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/DefinitionType.java index 7fafc0746e..00ac7439fe 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/DefinitionType.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/DefinitionType.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -109,10 +109,9 @@ public void setProperties(List properties) { this.properties = properties; } - public static DefinitionType fromJson(String name, JsonNode defs) { + public static DefinitionType fromJson(String name, JsonNode node) { DefinitionType definitionType = new DefinitionType(); definitionType.setName(name); - JsonNode node = defs.get(name); definitionType.setDescription(getValue(node, "description")); definitionType.setPrimaryKey(getValue(node, "primaryKey")); diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/DefinitionsType.java b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/DefinitionsType.java index a83e27512a..c49e73fcaf 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/DefinitionsType.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/DefinitionsType.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,10 @@ */ package com.marklogic.quickstart.model.entity_services; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.JsonNodeFactory; +import com.fasterxml.jackson.databind.node.ObjectNode; + import java.util.HashMap; import java.util.Map; @@ -30,4 +34,28 @@ public Map getDefinitions() { return this.definitions; } + public void addDefinition(String name, DefinitionType definitionType) { + getDefinitions().put(name, definitionType); + } + + public void removeDefinition(String name) { + getDefinitions().remove(name); + } + + public static DefinitionsType fromJson(JsonNode json) { + DefinitionsType definitionsType = new DefinitionsType(); + json.fields().forEachRemaining((Map.Entry field) -> { + definitionsType.addDefinition(field.getKey(), DefinitionType.fromJson(field.getKey(), field.getValue())); + }); + return definitionsType; + } + + public JsonNode toJson() { + ObjectNode node = JsonNodeFactory.instance.objectNode(); + this.getDefinitions().forEach((definitionName, definitionType) -> { + node.set(definitionName, definitionType.toJson()); + }); + + return node; + } } diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/EntityModel.java b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/EntityModel.java index f2c5a3dbef..8a3fa9e11f 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/EntityModel.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/EntityModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package com.marklogic.quickstart.model.entity_services; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonUnwrapped; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -29,7 +30,7 @@ public class EntityModel extends JsonPojo { protected String filename; protected HubUIData hubUi; protected InfoType info; - protected DefinitionType definition; + protected DefinitionsType definitions; public List inputFlows; public List harmonizeFlows; @@ -87,8 +88,9 @@ public void setInfo(InfoType value) { * {@link DefinitionsType } * */ - public DefinitionType getDefinition() { - return definition; + @JsonUnwrapped + public DefinitionsType getDefinitions() { + return definitions; } /** @@ -99,8 +101,8 @@ public DefinitionType getDefinition() { * {@link DefinitionsType } * */ - public void setDefinition(DefinitionType value) { - this.definition = value; + public void setDefinitions(DefinitionsType value) { + this.definitions = value; } public List getInputFlows() { @@ -125,7 +127,8 @@ public static EntityModel fromJson(String filename, JsonNode node) { entityModel.setInfo(InfoType.fromJson(node.get("info"))); String title = entityModel.getInfo().getTitle(); - entityModel.setDefinition(DefinitionType.fromJson(title, node.get("definitions"))); + + entityModel.setDefinitions(DefinitionsType.fromJson(node.get("definitions"))); return entityModel; } @@ -133,9 +136,7 @@ public JsonNode toJson() { ObjectNode node = JsonNodeFactory.instance.objectNode(); writeObjectIf(node, "info", info); - ObjectNode definitions = JsonNodeFactory.instance.objectNode(); - definitions.set(info.getTitle(), definition.toJson()); - node.set("definitions",definitions); + node.set("definitions",definitions.toJson()); return node; } diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/HubUIData.java b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/HubUIData.java index d33c7ce90a..603b57e363 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/HubUIData.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/HubUIData.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/InfoType.java b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/InfoType.java index 2db64484e9..a5d18657e4 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/InfoType.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/InfoType.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/ItemType.java b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/ItemType.java index 1df387ba00..e5a580f8f1 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/ItemType.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/ItemType.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/JsonPojo.java b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/JsonPojo.java index 9d3fc211e4..197256fd36 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/JsonPojo.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/JsonPojo.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/PropertyType.java b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/PropertyType.java index 237a84ead5..d55c5ffe54 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/PropertyType.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/model/entity_services/PropertyType.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/CancellableTask.java b/quick-start/src/main/java/com/marklogic/quickstart/service/CancellableTask.java index 0ca127c23d..0b21376987 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/CancellableTask.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/CancellableTask.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/DataHubService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/DataHubService.java index b256f91299..15f6119a42 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/DataHubService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/DataHubService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import com.marklogic.appdeployer.impl.SimpleAppDeployer; import com.marklogic.hub.DataHub; import com.marklogic.hub.HubConfig; +import com.marklogic.hub.deploy.commands.LoadUserArtifactsCommand; import com.marklogic.hub.deploy.commands.LoadUserModulesCommand; import com.marklogic.hub.deploy.util.HubDeployStatusListener; import com.marklogic.hub.error.CantUpgradeException; @@ -56,6 +57,9 @@ public class DataHubService { @Autowired private LoadUserModulesCommand loadUserModulesCommand; + @Autowired + private LoadUserArtifactsCommand loadUserArtifactsCommand; + public boolean install(HubConfig config, HubDeployStatusListener listener) throws DataHubException { logger.info("Installing Data Hub"); try { @@ -63,7 +67,7 @@ public boolean install(HubConfig config, HubDeployStatusListener listener) throw return true; } catch(Throwable e) { e.printStackTrace(); - listener.onStatusChange(100, getStackTrace(e)); + listener.onStatusChange(-1, getStackTrace(e)); } return false; } @@ -177,7 +181,12 @@ private void installUserModules(HubConfig hubConfig, boolean forceLoad, DeployUs List commands = new ArrayList<>(); loadUserModulesCommand.setHubConfig(hubConfig); loadUserModulesCommand.setForceLoad(forceLoad); + + loadUserArtifactsCommand.setHubConfig(hubConfig); + loadUserArtifactsCommand.setForceLoad(forceLoad); + commands.add(loadUserModulesCommand); + commands.add(loadUserArtifactsCommand); SimpleAppDeployer deployer = new SimpleAppDeployer(((HubConfigImpl)hubConfig).getManageClient(), ((HubConfigImpl)hubConfig).getAdminManager()); deployer.setCommands(commands); diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/EntityManagerService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/EntityManagerService.java index 4fe48b6a41..4ff86f4bca 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/EntityManagerService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/EntityManagerService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,23 +22,23 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.marklogic.hub.EntityManager; import com.marklogic.hub.HubConfig; +import com.marklogic.hub.entity.HubEntity; import com.marklogic.hub.error.DataHubProjectException; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.flow.FlowType; import com.marklogic.hub.impl.HubConfigImpl; import com.marklogic.hub.scaffold.Scaffolding; +import com.marklogic.hub.util.FileUtil; import com.marklogic.hub.validate.EntitiesValidator; import com.marklogic.quickstart.model.FlowModel; import com.marklogic.quickstart.model.PluginModel; import com.marklogic.quickstart.model.entity_services.EntityModel; import com.marklogic.quickstart.model.entity_services.HubUIData; import com.marklogic.quickstart.model.entity_services.InfoType; -import com.marklogic.hub.util.FileUtil; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -96,27 +96,21 @@ public List getLegacyEntities() throws IOException { public List getEntities() throws IOException { Map hubUiData = getUiData(); List entities = new ArrayList<>(); - Path entitiesPath = hubConfig.getHubEntitiesDir(); - List entityNames = FileUtil.listDirectFolders(entitiesPath.toFile()); - ObjectMapper objectMapper = new ObjectMapper(); - for (String entityName : entityNames) { - File[] entityDefs = entitiesPath.resolve(entityName).toFile().listFiles((dir, name) -> name.endsWith(ENTITY_FILE_EXTENSION)); - for (File entityDef : entityDefs) { - FileInputStream fileInputStream = new FileInputStream(entityDef); - JsonNode node = objectMapper.readTree(fileInputStream); - fileInputStream.close(); - EntityModel entityModel = EntityModel.fromJson(entityDef.getAbsolutePath(), node); - if (entityModel != null) { - HubUIData data = hubUiData.get(entityModel.getInfo().getTitle()); - if (data == null) { - data = new HubUIData(); - } - entityModel.setHubUi(data); - entityModel.inputFlows = flowManagerService.getFlows(entityName, FlowType.INPUT); - entityModel.harmonizeFlows = flowManagerService.getFlows(entityName, FlowType.HARMONIZE); - - entities.add(entityModel); + + List entityList = em.getEntities(); + + for (HubEntity entity : entityList) { + EntityModel entityModel = EntityModel.fromJson(entity.getFilename(), entity.toJson()); + if (entityModel != null) { + HubUIData data = hubUiData.get(entityModel.getInfo().getTitle()); + if (data == null) { + data = new HubUIData(); } + entityModel.setHubUi(data); + entityModel.inputFlows = flowManagerService.getFlows(entity.getInfo().getTitle(), FlowType.INPUT); + entityModel.harmonizeFlows = flowManagerService.getFlows(entity.getInfo().getTitle(), FlowType.HARMONIZE); + + entities.add(entityModel); } } @@ -143,52 +137,23 @@ public EntityModel createEntity(EntityModel newEntity) throws IOException { public EntityModel saveEntity(EntityModel entity) throws IOException { JsonNode node = entity.toJson(); - ObjectMapper objectMapper = new ObjectMapper(); String fullpath = entity.getFilename(); - String title = entity.getInfo().getTitle(); + + HubEntity hubEntity = HubEntity.fromJson(fullpath, node); + if (fullpath == null) { - Path dir = hubConfig.getHubEntitiesDir().resolve(title); - if (!dir.toFile().exists()) { - dir.toFile().mkdirs(); - } - fullpath = Paths.get(dir.toString(), title + ENTITY_FILE_EXTENSION).toString(); + em.saveEntity(hubEntity, false); } else { - String filename = new File(fullpath).getName(); - String entityFromFilename = filename.substring(0, filename.indexOf(ENTITY_FILE_EXTENSION)); - if (!entityFromFilename.equals(entity.getName())) { - // The entity name was changed since the files were created. Update - // the path. - - // Update the name of the entity definition file - File origFile = new File(fullpath); - File newFile = new File(origFile.getParent() + File.separator + title + ENTITY_FILE_EXTENSION); - if (!origFile.renameTo(newFile)) { - throw new IOException("Unable to rename " + origFile.getAbsolutePath() + " to " + - newFile.getAbsolutePath()); - }; - - // Update the directory name - File origDirectory = new File(origFile.getParent()); - File newDirectory = new File(origDirectory.getParent() + File.separator + title); - if (!origDirectory.renameTo(newDirectory)) { - throw new IOException("Unable to rename " + origDirectory.getAbsolutePath() + " to " + - newDirectory.getAbsolutePath()); - } + HubEntity renamedEntity = em.saveEntity(hubEntity, true); + entity.setFilename(renamedEntity.getFilename()); - fullpath = newDirectory.getAbsolutePath() + File.separator + title + ENTITY_FILE_EXTENSION; - entity.setFilename(fullpath); - - // Redeploy the flows - dataHubService.reinstallUserModules(hubConfig, null, null); - } + // Redeploy the flows + dataHubService.reinstallUserModules(hubConfig, null, null); } - String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(node); - FileUtils.writeStringToFile(new File(fullpath), json); - return entity; } @@ -196,7 +161,7 @@ public void deleteEntity(String entity) throws IOException { Path dir = hubConfig.getHubEntitiesDir().resolve(entity); if (dir.toFile().exists()) { watcherService.unwatch(dir.getParent().toString()); - FileUtils.deleteDirectory(dir.toFile()); + em.deleteEntity(entity); } } diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/EnvironmentConfig.java b/quick-start/src/main/java/com/marklogic/quickstart/service/EnvironmentConfig.java index 4144280bdf..3f9d4c189c 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/EnvironmentConfig.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/EnvironmentConfig.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/FileSystemEventListener.java b/quick-start/src/main/java/com/marklogic/quickstart/service/FileSystemEventListener.java index 642863b45f..2a54360230 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/FileSystemEventListener.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/FileSystemEventListener.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/FileSystemWatcherService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/FileSystemWatcherService.java index b8abbe6e1b..367a60b9dd 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/FileSystemWatcherService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/FileSystemWatcherService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/FlowManagerService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/FlowManagerService.java index 7505972420..30a54446f3 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/FlowManagerService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/FlowManagerService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,12 +19,11 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.marklogic.client.datamovement.JobTicket; -import com.marklogic.hub.FlowManager; -import com.marklogic.hub.HubConfig; -import com.marklogic.hub.flow.Flow; -import com.marklogic.hub.flow.FlowRunner; -import com.marklogic.hub.flow.FlowStatusListener; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.LegacyFlowManager; +import com.marklogic.hub.legacy.flow.LegacyFlow; +import com.marklogic.hub.legacy.flow.LegacyFlowRunner; +import com.marklogic.hub.legacy.flow.LegacyFlowStatusListener; +import com.marklogic.hub.legacy.flow.FlowType; import com.marklogic.hub.impl.HubConfigImpl; import com.marklogic.hub.util.MlcpRunner; import com.marklogic.quickstart.model.FlowModel; @@ -50,7 +49,7 @@ public class FlowManagerService { private static final String PROJECT_TMP_FOLDER = ".tmp"; @Autowired - private FlowManager flowManager; + private LegacyFlowManager flowManager; @Autowired private HubConfigImpl hubConfig; @@ -98,13 +97,13 @@ public List getFlows(String entityName, FlowType flowType) { }).collect(Collectors.toList()); } - public Flow getServerFlow(String entityName, String flowName, FlowType flowType) { + public LegacyFlow getServerFlow(String entityName, String flowName, FlowType flowType) { return flowManager.getFlow(entityName, flowName, flowType); } - public JobTicket runFlow(Flow flow, int batchSize, int threadCount, Map options, FlowStatusListener statusListener) { + public JobTicket runFlow(LegacyFlow flow, int batchSize, int threadCount, Map options, LegacyFlowStatusListener statusListener) { - FlowRunner flowRunner = flowManager.newFlowRunner() + LegacyFlowRunner flowRunner = flowManager.newFlowRunner() .withFlow(flow) .withOptions(options) .withBatchSize(batchSize) @@ -174,13 +173,13 @@ public Map getFlowMlcpOptionsFromFile(String entityName, String return result; } - public void runMlcp(Flow flow, JsonNode json, FlowStatusListener statusListener) { + public void runMlcp(LegacyFlow flow, JsonNode json, LegacyFlowStatusListener statusListener) { String mlcpPath = json.get("mlcpPath").textValue(); MlcpRunner runner = new MlcpRunner(mlcpPath, "com.marklogic.contentpump.ContentPump", hubConfig, flow, hubConfig.newStagingClient(), json.get("mlcpOptions"), statusListener); runner.start(); } - public FlowManager getFlowManager() { + public LegacyFlowManager getFlowManager() { return flowManager; } } diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/HubStatsService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/HubStatsService.java index d7616b78ec..a5344e317d 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/HubStatsService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/HubStatsService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/JobService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/JobService.java index ca95eea3a6..0167cd82ba 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/JobService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/JobService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,10 +24,9 @@ import com.marklogic.client.query.RawCombinedQueryDefinition; import com.marklogic.client.query.StructuredQueryBuilder; import com.marklogic.client.query.StructuredQueryDefinition; -import com.marklogic.hub.HubConfig; -import com.marklogic.hub.job.JobDeleteResponse; -import com.marklogic.hub.job.JobExportResponse; -import com.marklogic.hub.job.JobManager; +import com.marklogic.hub.legacy.job.JobDeleteResponse; +import com.marklogic.hub.legacy.job.JobExportResponse; +import com.marklogic.hub.legacy.job.LegacyJobManager; import com.marklogic.quickstart.model.JobQuery; import java.io.File; @@ -42,12 +41,12 @@ public class JobService extends SearchableService { private QueryManager queryMgr; - private JobManager jobMgr; + private LegacyJobManager jobMgr; public JobService(DatabaseClient jobClient) { this.queryMgr = jobClient.newQueryManager(); - this.jobMgr = JobManager.create(jobClient); + this.jobMgr = LegacyJobManager.create(jobClient); } public StringHandle getJobs(JobQuery jobQuery) { diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/MappingManagerService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/MappingManagerService.java index 0fe2c457cb..1225046aed 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/MappingManagerService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/MappingManagerService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/ProjectManagerService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/ProjectManagerService.java index ffdb4c5f5a..64a89f50e8 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/ProjectManagerService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/ProjectManagerService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/SearchService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/SearchService.java index 3943e7b2e2..5df8da4864 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/SearchService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/SearchService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/SearchableService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/SearchableService.java index b4e832c8df..1fc3e85363 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/SearchableService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/SearchableService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/service/TraceService.java b/quick-start/src/main/java/com/marklogic/quickstart/service/TraceService.java index 2f3e495259..f0ff7804fe 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/service/TraceService.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/service/TraceService.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/util/MlcpMain.java b/quick-start/src/main/java/com/marklogic/quickstart/util/MlcpMain.java index 72e58b940a..1d8ff9a944 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/util/MlcpMain.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/util/MlcpMain.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/AppController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/AppController.java index 8fbfe4115a..d5bc2840bb 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/AppController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/AppController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/CurrentProjectController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/CurrentProjectController.java index 7177bbc0d7..1a5772fc0e 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/CurrentProjectController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/CurrentProjectController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ import com.marklogic.hub.DatabaseKind; import com.marklogic.hub.HubConfig; import com.marklogic.hub.InstallInfo; -import com.marklogic.hub.Tracing; +import com.marklogic.hub.legacy.LegacyTracing; import com.marklogic.hub.deploy.util.HubDeployStatusListener; import com.marklogic.hub.error.CantUpgradeException; import com.marklogic.hub.impl.HubConfigImpl; @@ -105,8 +105,8 @@ public void onError() {} envConfig.setInitialized(installed); if (installed) { if (envConfig.getEnvironment().equals("local")) { - Tracing tracing = Tracing.create(envConfig.getStagingClient()); - tracing.enable(); + LegacyTracing legacyTracing = LegacyTracing.create(envConfig.getStagingClient()); + legacyTracing.enable(); } installUserModules(hubConfig, true); startProjectWatcher(); diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/EntitiesController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/EntitiesController.java index bc64709733..814a3e6869 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/EntitiesController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/EntitiesController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,8 @@ package com.marklogic.quickstart.web; import com.fasterxml.jackson.databind.JsonNode; -import com.marklogic.hub.flow.Flow; -import com.marklogic.hub.flow.FlowType; +import com.marklogic.hub.legacy.flow.LegacyFlow; +import com.marklogic.hub.legacy.flow.FlowType; import com.marklogic.hub.impl.HubConfigImpl; import com.marklogic.quickstart.model.FlowModel; import com.marklogic.quickstart.model.JobStatusMessage; @@ -156,7 +156,7 @@ public ResponseEntity runHarmonizeFlow( ResponseEntity resp; - Flow flow = flowManagerService.getServerFlow(entityName, flowName, FlowType.HARMONIZE); + LegacyFlow flow = flowManagerService.getServerFlow(entityName, flowName, FlowType.HARMONIZE); if (flow == null) { resp = new ResponseEntity<>(HttpStatus.CONFLICT); } @@ -228,7 +228,7 @@ public ResponseEntity runInputFlow( ResponseEntity resp; - Flow flow = flowManagerService.getServerFlow(entityName, flowName, FlowType.INPUT); + LegacyFlow flow = flowManagerService.getServerFlow(entityName, flowName, FlowType.INPUT); if (flow == null) { resp = new ResponseEntity<>(HttpStatus.NOT_FOUND); } diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/JobsController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/JobsController.java index 9f9279636e..42203e7288 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/JobsController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/JobsController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,7 @@ package com.marklogic.quickstart.web; import com.marklogic.hub.impl.HubConfigImpl; -import com.marklogic.hub.job.JobDeleteResponse; +import com.marklogic.hub.legacy.job.JobDeleteResponse; import com.marklogic.quickstart.exception.DataHubException; import com.marklogic.quickstart.model.JobExport; import com.marklogic.quickstart.model.JobQuery; diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/MappingController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/MappingController.java index 5220b3b322..6a3eae6d9a 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/MappingController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/MappingController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/ProjectsController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/ProjectsController.java index 9a85892c1d..599acad251 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/ProjectsController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/ProjectsController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/SearchController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/SearchController.java index 0872649793..bc9b74387b 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/SearchController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/SearchController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/SettingsController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/SettingsController.java index e7c1341f5c..af28f0ed48 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/SettingsController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/SettingsController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +18,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.marklogic.hub.Debugging; -import com.marklogic.hub.Tracing; +import com.marklogic.hub.legacy.LegacyDebugging; +import com.marklogic.hub.legacy.LegacyTracing; import com.marklogic.hub.impl.HubConfigImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,60 +32,60 @@ @RequestMapping("/api/settings") public class SettingsController { - private Tracing tracing = null; - private Debugging debugging = null; + private LegacyTracing legacyTracing = null; + private LegacyDebugging legacyDebugging = null; @Autowired private HubConfigImpl hubConfig; - private Tracing getTracing() { - if (tracing == null) { - tracing = Tracing.create(hubConfig.newJobDbClient()); + private LegacyTracing getLegacyTracing() { + if (legacyTracing == null) { + legacyTracing = LegacyTracing.create(hubConfig.newJobDbClient()); } - return tracing; + return legacyTracing; } - private Debugging getDebugging() { - if (debugging == null) { - debugging = Debugging.create(hubConfig.newStagingClient()); + private LegacyDebugging getLegacyDebugging() { + if (legacyDebugging == null) { + legacyDebugging = LegacyDebugging.create(hubConfig.newStagingClient()); } - return debugging; + return legacyDebugging; } @RequestMapping(value="/trace/enable", method = RequestMethod.POST) public void enableTracing() { - Tracing t = getTracing(); + LegacyTracing t = getLegacyTracing(); t.enable(); } @RequestMapping(value="/trace/disable", method = RequestMethod.POST) public void disableTracing() { - Tracing t = getTracing(); + LegacyTracing t = getLegacyTracing(); t.disable(); } @RequestMapping(value="/trace/is-enabled", method = RequestMethod.GET) public JsonNode isTracingEnabled() throws IOException { - Tracing t = getTracing(); + LegacyTracing t = getLegacyTracing(); ObjectMapper om = new ObjectMapper(); return om.readTree("{\"enabled\":" + t.isEnabled() + "}"); } @RequestMapping(value="/debug/enable", method = RequestMethod.POST) public void enableDebuging() { - Debugging t = getDebugging(); + LegacyDebugging t = getLegacyDebugging(); t.enable(); } @RequestMapping(value="/debug/disable", method = RequestMethod.POST) public void disableDebugging() { - Debugging t = getDebugging(); + LegacyDebugging t = getLegacyDebugging(); t.disable(); } @RequestMapping(value="/debug/is-enabled", method = RequestMethod.GET) public JsonNode isDebuggingEnabled() throws IOException { - Debugging t = getDebugging(); + LegacyDebugging t = getLegacyDebugging(); ObjectMapper om = new ObjectMapper(); return om.readTree("{\"enabled\":" + t.isEnabled() + "}"); } diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/TracesController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/TracesController.java index af2354282d..2185c360a0 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/TracesController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/TracesController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/java/com/marklogic/quickstart/web/UtilController.java b/quick-start/src/main/java/com/marklogic/quickstart/web/UtilController.java index 202af7e131..680ea40463 100644 --- a/quick-start/src/main/java/com/marklogic/quickstart/web/UtilController.java +++ b/quick-start/src/main/java/com/marklogic/quickstart/web/UtilController.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2018 MarkLogic Corporation + * Copyright 2012-2019 MarkLogic Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/resources/application-dev.properties b/quick-start/src/main/resources/application-dev.properties index 18be77943f..eeb9898bb2 100644 --- a/quick-start/src/main/resources/application-dev.properties +++ b/quick-start/src/main/resources/application-dev.properties @@ -1,5 +1,5 @@ # -# Copyright 2012-2018 MarkLogic Corporation +# Copyright 2012-2019 MarkLogic Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/resources/application.properties b/quick-start/src/main/resources/application.properties index 28154f8ac5..8f3f6bf2c9 100644 --- a/quick-start/src/main/resources/application.properties +++ b/quick-start/src/main/resources/application.properties @@ -1,5 +1,5 @@ # -# Copyright 2012-2018 MarkLogic Corporation +# Copyright 2012-2019 MarkLogic Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/quick-start/src/main/resources/logback-spring.xml b/quick-start/src/main/resources/logback-spring.xml index 3998266053..ea1c62dfcf 100644 --- a/quick-start/src/main/resources/logback-spring.xml +++ b/quick-start/src/main/resources/logback-spring.xml @@ -1,5 +1,5 @@
-
- Running {{getRunningJobCount()}} jobs - - {{getPercentComplete()}}% +
+ Running {{runningJobs}} jobs + + {{percentageComplete}}%
@@ -25,7 +25,7 @@ - Logout + Logout
diff --git a/quick-start/src/main/ui/app/header/header.component.scss b/quick-start/src/main/ui/app/shared/components/header/header-ui.component.scss similarity index 94% rename from quick-start/src/main/ui/app/header/header.component.scss rename to quick-start/src/main/ui/app/shared/components/header/header-ui.component.scss index f00131a024..8fee3a3293 100644 --- a/quick-start/src/main/ui/app/header/header.component.scss +++ b/quick-start/src/main/ui/app/shared/components/header/header-ui.component.scss @@ -1,4 +1,4 @@ -@import '../shared/components/theme/styles/variables'; +@import '../theme/styles/variables'; $highlight-color: unquote("rgb(#{$palette-datahub-A100})"); $bg-color: unquote("rgb(#{$palette-datahub-500})"); diff --git a/quick-start/src/main/ui/app/shared/components/header/header-ui.component.ts b/quick-start/src/main/ui/app/shared/components/header/header-ui.component.ts new file mode 100644 index 0000000000..03172fb1b2 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/header/header-ui.component.ts @@ -0,0 +1,32 @@ +import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-header-ui', + templateUrl: './header-ui.component.html', + styleUrls: ['./header-ui.component.scss'], +}) +export class HeaderUiComponent { + + @Input() activeCheck: Function; + @Input() runningJobs: number; + @Input() percentageComplete: number; + + @Output() logout = new EventEmitter(); + + constructor( + private router: Router + ) {} + + logoutClicked() { + this.logout.emit(); + } + + isActive(url: string): boolean { + if (url === '/') { + return this.router.url === url; + } + return this.router.url.startsWith(url); + } + +} diff --git a/quick-start/src/main/ui/app/shared/components/index.ts b/quick-start/src/main/ui/app/shared/components/index.ts index 84b7103d03..cc7a1c7adb 100644 --- a/quick-start/src/main/ui/app/shared/components/index.ts +++ b/quick-start/src/main/ui/app/shared/components/index.ts @@ -1,3 +1,4 @@ +export * from './app-ui.component'; export * from './folder-browser/folder-browser-ui.component'; export * from './select-list/select-list.component'; export * from './ml-error/ml-error.component'; @@ -5,4 +6,24 @@ export * from './theme'; export * from './inline-edit/inline-edit.component'; export * from './pagination'; export * from './select/select.component'; -export * from './mappings/new-map-ui.component'; +export * from './mappings'; +export * from './login'; +export * from './search'; +export * from './choose-collation/choose-collation.component'; +export * from './entity-box/entity-box.component'; +export * from './resizable/resizable.component'; +export * from './settings/settings-ui.component'; +export * from './select-key-values/select-key-values.component'; +export * from './jobs/jobs-ui.component'; +export * from './jobs/job-output-ui.component'; +export * from './jobs/job-export-ui.component'; +export * from './has-bugs-dialog/has-bugs-dialog.component'; +export * from './grid/grid.component'; +export * from './harmonize-flow-options/harmonize-flow-options-ui.component'; +export * from './header/header-ui.component'; +export * from './tooltip/tooltip-container-ui.component'; +export * from './trace-viewer/trace-viewer-ui.component'; +export * from './entity-editor/entity-editor.component'; +export * from './new-flow/new-flow-ui.component'; +export * from './externaldef-dialog/externaldef-dialog.component'; +export * from './dashboard/dashboard-ui.component'; diff --git a/quick-start/src/main/ui/app/shared/components/jobs/index.ts b/quick-start/src/main/ui/app/shared/components/jobs/index.ts new file mode 100644 index 0000000000..0e2bfe5196 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/jobs/index.ts @@ -0,0 +1,3 @@ +export * from './jobs-ui.component'; +export * from './job-output-ui.component'; +export * from './job-export-ui.component'; diff --git a/quick-start/src/main/ui/app/jobs/job-export.component.html b/quick-start/src/main/ui/app/shared/components/jobs/job-export-ui.component.html similarity index 75% rename from quick-start/src/main/ui/app/jobs/job-export.component.html rename to quick-start/src/main/ui/app/shared/components/jobs/job-export-ui.component.html index cc47f83498..18d09eac66 100644 --- a/quick-start/src/main/ui/app/jobs/job-export.component.html +++ b/quick-start/src/main/ui/app/shared/components/jobs/job-export-ui.component.html @@ -5,6 +5,6 @@

Export Jobs and Traces

- +
diff --git a/quick-start/src/main/ui/app/shared/components/jobs/job-export-ui.component.ts b/quick-start/src/main/ui/app/shared/components/jobs/job-export-ui.component.ts new file mode 100644 index 0000000000..abbd263939 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/jobs/job-export-ui.component.ts @@ -0,0 +1,49 @@ +import {Component, EventEmitter, HostListener, Input, Output, Inject} from "@angular/core"; +import {MdlDialogReference, MdlDialogService} from '@angular-mdl/core'; + +@Component({ + selector: 'app-job-export-ui', + templateUrl: './job-export-ui.component.html' +}) +export class JobExportUiComponent { + @Input() jobIds: string[]; + @Output() exportClicked = new EventEmitter(); + + question: string; + + constructor( + public dialog: MdlDialogReference, + private dialogService: MdlDialogService, + @Inject('jobIds') jobIds: string[] + ) { + + this.jobIds = jobIds; + this.question = "Export and download "; + if (jobIds.length === 0) { + this.question += "all jobs and their traces?"; + } else if (this.jobIds.length === 1) { + this.question += "1 job and its traces?"; + } else { + this.question += this.jobIds.length + " jobs and their traces?"; + } + } + + @HostListener('keydown.esc') + public onEsc(): void { + this.dialog.hide(); + } + + public export(): void { + this.dialog.hide(); + this.exportClicked.emit(); + } + + public cancel(): void { + this.dialog.hide(); + } + + public alert(msg: string): void { + this.dialogService.alert(msg); + } + +} diff --git a/quick-start/src/main/ui/app/jobs/job-output.component.html b/quick-start/src/main/ui/app/shared/components/jobs/job-output-ui.component.html similarity index 85% rename from quick-start/src/main/ui/app/jobs/job-output.component.html rename to quick-start/src/main/ui/app/shared/components/jobs/job-output-ui.component.html index 6921795e83..c27ed0a88e 100644 --- a/quick-start/src/main/ui/app/jobs/job-output.component.html +++ b/quick-start/src/main/ui/app/shared/components/jobs/job-output-ui.component.html @@ -2,7 +2,7 @@
Job Output for {{job.jobId}}
- +
diff --git a/quick-start/src/main/ui/app/jobs/job-output.component.scss b/quick-start/src/main/ui/app/shared/components/jobs/job-output-ui.component.scss similarity index 100% rename from quick-start/src/main/ui/app/jobs/job-output.component.scss rename to quick-start/src/main/ui/app/shared/components/jobs/job-output-ui.component.scss diff --git a/quick-start/src/main/ui/app/shared/components/jobs/job-output-ui.component.ts b/quick-start/src/main/ui/app/shared/components/jobs/job-output-ui.component.ts new file mode 100644 index 0000000000..f598c1a44f --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/jobs/job-output-ui.component.ts @@ -0,0 +1,12 @@ +import {Component, EventEmitter, Input, Output} from "@angular/core"; + +@Component({ + selector: 'app-job-output-ui', + templateUrl: './job-output-ui.component.html', + styleUrls: ['./job-output-ui.component.scss'], +}) +export class JobOutputUiComponent { + @Input() job: any; + @Input() jobOutput: Array; + @Output() cancelClicked = new EventEmitter(); +} diff --git a/quick-start/src/main/ui/app/jobs/jobs.component.html b/quick-start/src/main/ui/app/shared/components/jobs/jobs-ui.component.html similarity index 73% rename from quick-start/src/main/ui/app/jobs/jobs.component.html rename to quick-start/src/main/ui/app/shared/components/jobs/jobs-ui.component.html index ee7a28272a..421f22da3f 100644 --- a/quick-start/src/main/ui/app/jobs/jobs.component.html +++ b/quick-start/src/main/ui/app/shared/components/jobs/jobs-ui.component.html @@ -2,8 +2,13 @@

Jobs

@@ -11,14 +16,14 @@

Jobs

+ (pageChanged)="pageChanged.emit($event)">
No Jobs
+ (activeFacetsChange)="activeFacetsChange.emit($event)">
Jobs - Export Jobs and Traces - Delete Jobs and Traces + Export Jobs and Traces + Delete Jobs and Traces - + - + diff --git a/quick-start/src/main/ui/app/jobs/jobs.component.scss b/quick-start/src/main/ui/app/shared/components/jobs/jobs-ui.component.scss similarity index 96% rename from quick-start/src/main/ui/app/jobs/jobs.component.scss rename to quick-start/src/main/ui/app/shared/components/jobs/jobs-ui.component.scss index 1b615d5563..698fec2dd5 100644 --- a/quick-start/src/main/ui/app/jobs/jobs.component.scss +++ b/quick-start/src/main/ui/app/shared/components/jobs/jobs-ui.component.scss @@ -1,4 +1,4 @@ -@import '../shared/components/theme/styles/variables'; +@import '../theme/styles/variables'; $bg-color: unquote("rgb(#{$palette-datahub-500})"); diff --git a/quick-start/src/main/ui/app/shared/components/jobs/jobs-ui.component.ts b/quick-start/src/main/ui/app/shared/components/jobs/jobs-ui.component.ts new file mode 100644 index 0000000000..417ced6f90 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/jobs/jobs-ui.component.ts @@ -0,0 +1,26 @@ +import {Component, EventEmitter, Input, Output} from "@angular/core"; + +@Component({ + selector: 'app-jobs-ui', + templateUrl: './jobs-ui.component.html', + styleUrls: ['./jobs-ui.component.scss'], +}) +export class JobsUiComponent { + @Input() loadingJobs: boolean; + @Input() searchText: string; + @Input() searchResponse: any; + @Input() activeFacets: any; + @Input() jobs: Array; + @Input() selectedJobs: string[]; + + @Output() searchClicked = new EventEmitter(); + @Output() showConsoleClicked = new EventEmitter(); + @Output() exportJobsClicked = new EventEmitter(); + @Output() deleteJobsClicked = new EventEmitter(); + @Output() pageChanged = new EventEmitter(); + @Output() activeFacetsChange = new EventEmitter(); + @Output() searchTextChanged = new EventEmitter(); + @Output() showTracesClicked = new EventEmitter(); + @Output() toggleSelectJobClicked = new EventEmitter(); + +} diff --git a/quick-start/src/main/ui/app/shared/components/login/index.ts b/quick-start/src/main/ui/app/shared/components/login/index.ts new file mode 100644 index 0000000000..5f0a986d99 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/login/index.ts @@ -0,0 +1 @@ +export * from './login-ui.component'; diff --git a/quick-start/src/main/ui/app/login/login.component.html b/quick-start/src/main/ui/app/shared/components/login/login-ui.component.html similarity index 93% rename from quick-start/src/main/ui/app/login/login.component.html rename to quick-start/src/main/ui/app/shared/components/login/login-ui.component.html index f4a1be2773..f92638ee88 100644 --- a/quick-start/src/main/ui/app/login/login.component.html +++ b/quick-start/src/main/ui/app/shared/components/login/login-ui.component.html @@ -1,11 +1,11 @@
@@ -60,10 +56,10 @@

Browse for a Project Folder

This project needs to be initialized

The project located at {{currentProject.path}} needs to be initialized.

-
+
- +
@@ -124,7 +120,7 @@

Other

+ (click)="this.onRestoreInitDefaults.emit()">Restore Defaults
@@ -142,7 +138,7 @@

Project Initialized

- +
@@ -162,7 +158,7 @@

Choose Your Project Environment

@@ -178,7 +174,7 @@

Choose Your Project Environment

@@ -237,7 +233,7 @@

Automatic Hub Update Failed!

{{hubUpdateError}}.

Go read the documentation page that describes the changes necessary and try them manually.

- How to update a Hub Project + How to update a Hub Project
@@ -291,7 +287,7 @@

Installation Needed

MarkLogic server.

- +
@@ -352,10 +348,10 @@

Install Status

{{job.flowType}} {{job.flowType}} {{job.jobId}} {{job.entityName}} {{job.flowName}} {{job.status}} {{job.startTime | datePipe}}{{getDuration(job)}} seconds{{job.duration}} seconds + (click)="showConsoleClicked.emit(job)"> Jobs container="body"> - + (click)="showTracesClicked.emit(job.jobId)"> + + (click)="toggleSelectJobClicked.emit(job.jobId)">
- +
- +
@@ -378,7 +374,7 @@

DHF Project Version Mismatch!

- +
diff --git a/quick-start/src/main/ui/app/login/login.component.scss b/quick-start/src/main/ui/app/shared/components/login/login-ui.component.scss similarity index 99% rename from quick-start/src/main/ui/app/login/login.component.scss rename to quick-start/src/main/ui/app/shared/components/login/login-ui.component.scss index 6babd59375..ef6edc4fdc 100644 --- a/quick-start/src/main/ui/app/login/login.component.scss +++ b/quick-start/src/main/ui/app/shared/components/login/login-ui.component.scss @@ -1,4 +1,4 @@ -@import '../shared/components/theme/styles/variables'; +@import '../theme/styles/variables'; $ml-blue: unquote("rgb(#{$palette-datahub-500})"); diff --git a/quick-start/src/main/ui/app/shared/components/login/login-ui.component.ts b/quick-start/src/main/ui/app/shared/components/login/login-ui.component.ts new file mode 100644 index 0000000000..1775b1b4c4 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/login/login-ui.component.ts @@ -0,0 +1,113 @@ +import {Component, EventEmitter, Input, Output, Renderer2} from "@angular/core"; +import * as _ from "lodash"; +import {LoginInfo} from "../../../login/login-info.model"; +import {HubSettings} from "../../../environment/hub-settings.model"; + +@Component({ + selector: 'app-login-ui', + templateUrl: './login-ui.component.html', + styleUrls: ['./login-ui.component.scss'] +}) +export class LoginUIComponent { + @Input() installationStatus: string; + @Input() currentEnvironment: any; + @Input() uninstalling: boolean; + @Input() installing: boolean; + @Input() percentComplete: number; + @Input() showInitAdvanced: boolean; + @Input() showFolderBrowser: boolean = true; + @Input() projects: Array; + @Input() currentProject: any; + @Input() lastProject: any; + @Input() loggingIn: boolean; + @Input() loginError: string; + @Input() loginInfo: LoginInfo; + @Input() hubUpdating: boolean; + @Input() hubUpdateFailed: boolean; + @Input() runningPreinstallCheck: boolean; + @Input() preinstallCheck: any; + @Input() initSettings: HubSettings; + + @Output() onPostInitNext: EventEmitter = new EventEmitter(); + @Output() onChooseProject: EventEmitter = new EventEmitter(); + @Output() onInstall: EventEmitter = new EventEmitter(); + @Output() onUninstall: EventEmitter = new EventEmitter(); + @Output() onInstallNext: EventEmitter = new EventEmitter(); + @Output() onFinished: EventEmitter = new EventEmitter(); + @Output() onLogin: EventEmitter = new EventEmitter(); + @Output() onHubNameChanged: EventEmitter = new EventEmitter(); + @Output() onGotEnvironment: EventEmitter = new EventEmitter(); + @Output() onHubUpdateUrl: EventEmitter = new EventEmitter(); + @Output() onUpdateProject: EventEmitter = new EventEmitter(); + @Output() onProjectSelected: EventEmitter = new EventEmitter(); + @Output() onRemoveProject: EventEmitter = new EventEmitter(); + @Output() onInitProject: EventEmitter = new EventEmitter(); + @Output() onRestoreInitDefaults: EventEmitter = new EventEmitter(); + @Output() onShowFolderBrowser: EventEmitter = new EventEmitter(); + + currentEnvironmentString: string; + + constructor(private renderer: Renderer2) { + } + + tabs: any = { + ProjectDir: true, + InitIfNeeded: false, + PostInit: false, + Environment: false, + Login: false, + InstalledCheck: false, + PreInstallCheck: false, + Installer: false, + RequiresUpdate: false + }; + + currentTab: string = 'ProjectDir'; + visitedTabs: Array = []; + + private disableTabs() { + _.each(this.tabs, (tab, key) => { + this.tabs[key] = false; + }); + } + + back() { + if (this.visitedTabs.length > 0) { + this.disableTabs(); + this.currentTab = this.visitedTabs.pop(); + this.tabs[this.currentTab] = true; + } + } + + gotoTab(tabName: string): void { + this.disableTabs(); + this.tabs[tabName] = true; + + const skipUs = ['InstalledCheck', 'InitIfNeeded', 'PostInit', 'PreInstallCheck']; + if (skipUs.indexOf(this.currentTab) < 0) { + this.visitedTabs.push(this.currentTab); + } + this.currentTab = tabName; + } + + environmentNext() { + this.gotoTab('Login'); + setTimeout(() => { + this.renderer.selectRootElement('input#username').focus(); + }, 500); + } + + clickShowFolderBrowser() { + this.showFolderBrowser = !this.showFolderBrowser; + this.onShowFolderBrowser.emit(this.showFolderBrowser); + } + + getInstalledIcon(isTrue: boolean) { + return isTrue ? 'fa-check' : 'fa-close'; + } + + setCurrentEvironmentString(str: string) { + this.currentEnvironmentString = str; + this.onGotEnvironment.emit(str); + } +} diff --git a/quick-start/src/main/ui/app/shared/components/mappings/index.ts b/quick-start/src/main/ui/app/shared/components/mappings/index.ts new file mode 100644 index 0000000000..ef8420d759 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/mappings/index.ts @@ -0,0 +1,3 @@ +export * from "./map-ui.component"; +export * from './mappings-ui.component'; +export * from './new-map-ui.component'; diff --git a/quick-start/src/main/ui/app/listfilter/listfilter.pipe.ts b/quick-start/src/main/ui/app/shared/components/mappings/listfilter.pipe.ts similarity index 76% rename from quick-start/src/main/ui/app/listfilter/listfilter.pipe.ts rename to quick-start/src/main/ui/app/shared/components/mappings/listfilter.pipe.ts index 0bee30c82f..a87bdba809 100644 --- a/quick-start/src/main/ui/app/listfilter/listfilter.pipe.ts +++ b/quick-start/src/main/ui/app/shared/components/mappings/listfilter.pipe.ts @@ -1,16 +1,16 @@ import { Pipe, PipeTransform } from '@angular/core'; import * as _ from 'lodash'; - + @Pipe({ name: 'listFilter', }) -export class ListFilterPipe implements PipeTransform { +export class ListFilterPipe implements PipeTransform { transform(input: any[] = [], options: Array, value: string): any { let filteredInput = input; if (value && value.length) { value = String(value).toLowerCase(); // normalzied to lowercase - filteredInput = _.filter(input, function(i) { + filteredInput = _.filter(input, function(i) { let found = false; _.forEach(options, (field) => { let fieldVal = String(i[field]).toLowerCase(); @@ -19,12 +19,10 @@ export class ListFilterPipe implements PipeTransform { return false; // forEach break loop } }) - return found; + return found; }); - - filteredInput = _.sortBy(filteredInput, options); } - + return filteredInput; } } diff --git a/quick-start/src/main/ui/app/mappings/map.component.html b/quick-start/src/main/ui/app/shared/components/mappings/map-ui.component.html similarity index 86% rename from quick-start/src/main/ui/app/mappings/map.component.html rename to quick-start/src/main/ui/app/shared/components/mappings/map-ui.component.html index 4537c0dec6..eb63d82cf4 100644 --- a/quick-start/src/main/ui/app/mappings/map.component.html +++ b/quick-start/src/main/ui/app/shared/components/mappings/map-ui.component.html @@ -6,7 +6,7 @@

- {{mapName}} + {{mapping.name}}

No description @@ -14,17 +14,15 @@

- +

- Save Mapping - Save Mapping - Reset - Reset + Save Mapping + Reset
@@ -39,13 +37,13 @@

URI: - {{ getLastChars(sampleDocURI, 45, '...') }} + {{ getLastChars(mapping.sourceURI, 45, '...') }}

URI: - +

@@ -85,7 +83,7 @@

@@ -53,7 +53,3 @@ - - - - diff --git a/quick-start/src/main/ui/app/mappings/mappings.component.scss b/quick-start/src/main/ui/app/shared/components/mappings/mappings-ui.component.scss similarity index 99% rename from quick-start/src/main/ui/app/mappings/mappings.component.scss rename to quick-start/src/main/ui/app/shared/components/mappings/mappings-ui.component.scss index 8c5a0f8837..b5fd9ce489 100644 --- a/quick-start/src/main/ui/app/mappings/mappings.component.scss +++ b/quick-start/src/main/ui/app/shared/components/mappings/mappings-ui.component.scss @@ -1,4 +1,4 @@ -@import '../shared/components/theme/styles/variables'; +@import '../theme/styles/variables'; $table-title-color: unquote("rgb(#{$palette-datahub-50})"); $hover-color: unquote("rgb(#{$palette-datahub-A100})"); diff --git a/quick-start/src/main/ui/app/shared/components/mappings/mappings-ui.component.ts b/quick-start/src/main/ui/app/shared/components/mappings/mappings-ui.component.ts new file mode 100644 index 0000000000..b85fe28df6 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/mappings/mappings-ui.component.ts @@ -0,0 +1,70 @@ +import { Router, ActivatedRoute, Params } from '@angular/router'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { Entity } from '../../../entities'; +import { MdlDialogService } from '@angular-mdl/core'; + +import * as _ from 'lodash'; +import {Mapping} from "../../../mappings/mapping.model"; +import {Subscriber} from "rxjs/Subscriber"; + + +@Component({ + selector: 'app-mappings-ui', + templateUrl: './mappings-ui.component.html', + styleUrls: ['./mappings-ui.component.scss'] +}) +export class MappingsUiComponent { + + @Input() entities: Array = new Array(); + @Input() entityMappingsMap: Map> = new Map>(); + + @Output() showNewMapping = new EventEmitter(); + @Output() editMapping = new EventEmitter(); + @Output() deleteMapping = new EventEmitter(); + + public subscribers: Map> = new Map(); + + private activeEntity: Entity; + private activeMapping: Mapping; + public flowName: string; + + private entitiesLoaded: boolean = false; + + public mappings: Array = []; + + private entityMap: Map = new Map(); + + constructor( + private dialogService: MdlDialogService + ) {} + + isActiveMap(entity: Entity, mapping: Mapping): boolean { + return this.activeEntity && this.activeEntity.name === entity.name && + this.activeMapping && this.activeMapping.name === mapping.name; + } + + onShowNewMapping(entity: Entity, mappings: Array) { + this.showNewMapping.emit({entity: entity, mappings: mappings}); + } + + onEditMapping(entity: Entity, mapping: Mapping){ + this.activeEntity = entity; + this.activeMapping = mapping; + this.editMapping.emit({entity: entity, mapping: mapping}); + } + + onDeleteMapping(event: MouseEvent, mapping: Mapping): void { + if (event.stopPropagation) { + event.stopPropagation(); + } + if (event.preventDefault) { + event.preventDefault(); + } + event.cancelBubble = true; + this.dialogService.confirm(`Really delete ${mapping.name} mapping?`, 'Cancel', 'Delete').subscribe(() => { + this.deleteMapping.emit({event: event, mapping: mapping}); + }, + () => {}); + } + +} diff --git a/quick-start/src/main/ui/app/shared/components/ml-error/ml-error.component.scss b/quick-start/src/main/ui/app/shared/components/ml-error/ml-error.component.scss index cd7d20f79f..8b2d8eba15 100644 --- a/quick-start/src/main/ui/app/shared/components/ml-error/ml-error.component.scss +++ b/quick-start/src/main/ui/app/shared/components/ml-error/ml-error.component.scss @@ -7,6 +7,8 @@ .format-string { border: 1px solid rgba(0,0,0,0.10); padding: 10px; + max-height: 300px; + overflow: scroll; } .header { diff --git a/quick-start/src/main/ui/app/mlcp-ui/index.ts b/quick-start/src/main/ui/app/shared/components/mlcp/index.ts similarity index 100% rename from quick-start/src/main/ui/app/mlcp-ui/index.ts rename to quick-start/src/main/ui/app/shared/components/mlcp/index.ts diff --git a/quick-start/src/main/ui/app/mlcp-ui/mlcp-ui.component.html b/quick-start/src/main/ui/app/shared/components/mlcp/mlcp-ui.component.html similarity index 77% rename from quick-start/src/main/ui/app/mlcp-ui/mlcp-ui.component.html rename to quick-start/src/main/ui/app/shared/components/mlcp/mlcp-ui.component.html index f81bee78fb..6d9d7c7d3b 100644 --- a/quick-start/src/main/ui/app/mlcp-ui/mlcp-ui.component.html +++ b/quick-start/src/main/ui/app/shared/components/mlcp/mlcp-ui.component.html @@ -7,8 +7,8 @@

@@ -26,9 +26,10 @@

- {{setting.label}} + (change)="handleValueChanged(setting, $event)"> + {{setting.label}} + [label]="setting.label" + name="{{setting.field}}" *ngIf="isText(setting.type)" + [ngModel]="setting.value" + (input)="handleValueChanged(setting, $event.target.value)" + [disabled]="setting.readOnly"> + @@ -69,7 +72,7 @@

@@ -83,10 +86,8 @@

-
- Save Options -
- Run Import + Save Options + Run Import
diff --git a/quick-start/src/main/ui/app/mlcp-ui/mlcp-ui.component.scss b/quick-start/src/main/ui/app/shared/components/mlcp/mlcp-ui.component.scss similarity index 97% rename from quick-start/src/main/ui/app/mlcp-ui/mlcp-ui.component.scss rename to quick-start/src/main/ui/app/shared/components/mlcp/mlcp-ui.component.scss index 8217919fa8..66a0c1009d 100644 --- a/quick-start/src/main/ui/app/mlcp-ui/mlcp-ui.component.scss +++ b/quick-start/src/main/ui/app/shared/components/mlcp/mlcp-ui.component.scss @@ -1,4 +1,4 @@ -@import '../shared/components/theme/styles/variables'; +@import '../theme/styles/variables'; $error: unquote("rgb(#{$palette-datahub-red})"); diff --git a/quick-start/src/main/ui/app/shared/components/mlcp/mlcp-ui.component.ts b/quick-start/src/main/ui/app/shared/components/mlcp/mlcp-ui.component.ts new file mode 100644 index 0000000000..a244096cdf --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/mlcp/mlcp-ui.component.ts @@ -0,0 +1,81 @@ +import {Component, EventEmitter, Input, Output} from '@angular/core'; +import { Flow } from '../../../entities/flow.model'; + +@Component({ + selector: 'app-mlcp-ui', + templateUrl: './mlcp-ui.component.html', + styleUrls: ['./mlcp-ui.component.scss'], +}) +export class MlcpUiComponent { + @Input() startPath: string; + @Input() flow: Flow; + @Input() mlcpOptions: any; + @Input() hasErrors: boolean; + @Input() groups: Array; + @Input() mlcpCommand: string; + + @Output() folderClicked = new EventEmitter(); + @Output() fileClicked = new EventEmitter(); + @Output() saveOptionsClicked = new EventEmitter(); + @Output() valueChanged = new EventEmitter(); + @Output() runImportClicked = new EventEmitter(); + @Output() clipboardSuccess = new EventEmitter(); + + + sections: any = { + inputFiles: { + collapsed: false + }, + 'General Options': { + collapsed: true + }, + 'Delimited Text Options': { + collapsed: true + }, + 'Delimited Json Options': { + collapsed: true + }, + 'Aggregate XML Options': { + collapsed: true + }, + 'Transform Options': { + collapsed: true + } + }; + + getSectionClass(group: string): string { + const section = this.sections[group]; + return section.collapsed ? 'collapsed' : ''; + } + + toggleSection(group: string): void { + const section = this.sections[group]; + section.collapsed = !section.collapsed; + } + + isText(type: string): boolean { + if (type === 'string' || type === 'comma-list' || type === 'number' || type === 'character') { + return true; + } + + return false; + } + + isGroupVisible(category: string): boolean { + const inputFileType = this.groups[0].settings[1].value; + if (category === 'Delimited Text Options' && inputFileType !== 'delimited_text') { + return false; + } else if (category === 'Delimited Json Options' && inputFileType !== 'delimited_json') { + return false; + } else if (category === 'Aggregate XML Options' && inputFileType !== 'aggregates') { + return false; + } + return true; + } + + handleValueChanged(setting, event) { + setting.value = event; + this.valueChanged.emit(); + } + +} diff --git a/quick-start/src/main/ui/app/new-entity/new-entity.component.html b/quick-start/src/main/ui/app/shared/components/new-entity/new-entity.component.html similarity index 99% rename from quick-start/src/main/ui/app/new-entity/new-entity.component.html rename to quick-start/src/main/ui/app/shared/components/new-entity/new-entity.component.html index 152cdea6b1..fe6a5e651c 100644 --- a/quick-start/src/main/ui/app/new-entity/new-entity.component.html +++ b/quick-start/src/main/ui/app/shared/components/new-entity/new-entity.component.html @@ -19,4 +19,4 @@ - + \ No newline at end of file diff --git a/quick-start/src/main/ui/app/new-entity/new-entity.component.scss b/quick-start/src/main/ui/app/shared/components/new-entity/new-entity.component.scss similarity index 100% rename from quick-start/src/main/ui/app/new-entity/new-entity.component.scss rename to quick-start/src/main/ui/app/shared/components/new-entity/new-entity.component.scss diff --git a/quick-start/src/main/ui/app/new-entity/new-entity.component.ts b/quick-start/src/main/ui/app/shared/components/new-entity/new-entity.component.ts similarity index 100% rename from quick-start/src/main/ui/app/new-entity/new-entity.component.ts rename to quick-start/src/main/ui/app/shared/components/new-entity/new-entity.component.ts diff --git a/quick-start/src/main/ui/app/new-flow/new-flow.component.html b/quick-start/src/main/ui/app/shared/components/new-flow/new-flow-ui.component.html similarity index 84% rename from quick-start/src/main/ui/app/new-flow/new-flow.component.html rename to quick-start/src/main/ui/app/shared/components/new-flow/new-flow-ui.component.html index 67a7187ca1..df55cf2837 100644 --- a/quick-start/src/main/ui/app/new-flow/new-flow.component.html +++ b/quick-start/src/main/ui/app/shared/components/new-flow/new-flow-ui.component.html @@ -10,9 +10,9 @@
diff --git a/quick-start/src/main/ui/app/new-flow/new-flow.component.scss b/quick-start/src/main/ui/app/shared/components/new-flow/new-flow-ui.component.scss similarity index 100% rename from quick-start/src/main/ui/app/new-flow/new-flow.component.scss rename to quick-start/src/main/ui/app/shared/components/new-flow/new-flow-ui.component.scss diff --git a/quick-start/src/main/ui/app/shared/components/new-flow/new-flow-ui.component.ts b/quick-start/src/main/ui/app/shared/components/new-flow/new-flow-ui.component.ts new file mode 100644 index 0000000000..ab7f7ea602 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/new-flow/new-flow-ui.component.ts @@ -0,0 +1,72 @@ +import {Component, EventEmitter, Input, Output, Inject, HostListener} from "@angular/core"; +import {MdlDialogReference} from '@angular-mdl/core'; +import * as _ from 'lodash'; + +@Component({ + selector: 'app-new-flow-ui', + templateUrl: './new-flow-ui.component.html', + styleUrls: ['./new-flow-ui.component.scss'], +}) +export class NewFlowUiComponent { + @Input() markLogicVersion: number; + @Input() flowType: string; + @Input() scaffoldOptions: any; + @Input() mappingOptions: any; + @Input() codeFormats: any; + @Input() dataFormats: any; + @Input() startingScaffoldOption: any; + @Input() startingMappingOption: any; + @Input() entity: any; + @Input() flow: any; + @Input() flows: any; + + @Output() flowChanged = new EventEmitter(); + @Output() createClicked = new EventEmitter(); + @Output() cancelClicked = new EventEmitter(); + + public isNameValid: boolean = true; + public errorMsg: string = ''; + + constructor( + public dialog: MdlDialogReference + ) { } + + @HostListener('keydown.esc') + public onEsc(): void { + this.cancel(); + } + + hide() { + this.dialog.hide(); + } + + create() { + this.dialog.hide(); + this.createClicked.emit(); + } + + cancel() { + this.hide(); + this.cancelClicked.emit(); + } + + updateflow(prop: string, val: any) { + this.flow[prop] = val; + this.emitUpdatedFlow(); + } + + emitUpdatedFlow() { + this.flowChanged.emit(this.flow); + } + + checkName() { + let nameValid = true; + let entityName = this.entity && this.entity.info && this.entity.info.title; + let flowPrefix = (this.flowType.toUpperCase() === 'INPUT') ? 'an' : 'a'; + _.forEach(this.flows, (f) => { + nameValid = (this.flow.flowName === f.flowName) ? false: nameValid; + }); + this.errorMsg = (!nameValid) ? `Flow names must be unique. Entity "${entityName}" already contains ${flowPrefix} ${this.flowType} flow named "${this.flow.flowName}"` : ''; + this.isNameValid = nameValid; + } +} diff --git a/quick-start/src/main/ui/app/shared/components/search/index.ts b/quick-start/src/main/ui/app/shared/components/search/index.ts new file mode 100644 index 0000000000..3a6754fdc7 --- /dev/null +++ b/quick-start/src/main/ui/app/shared/components/search/index.ts @@ -0,0 +1,2 @@ +export * from './search-viewer-ui.component'; +export * from './search-ui.component'; diff --git a/quick-start/src/main/ui/app/search/search.component.html b/quick-start/src/main/ui/app/shared/components/search/search-ui.component.html similarity index 67% rename from quick-start/src/main/ui/app/search/search.component.html rename to quick-start/src/main/ui/app/shared/components/search/search-ui.component.html index 0373fe0266..4150b0e004 100644 --- a/quick-start/src/main/ui/app/search/search.component.html +++ b/quick-start/src/main/ui/app/shared/components/search/search-ui.component.html @@ -1,40 +1,50 @@
- + {{database}} - + Entities Only
- +
No Data
+ (activeFacetsChange)="onActiveFacetsChange.emit($event)">