diff --git a/.gitignore b/.gitignore index 21038090..5b2e63f8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,12 @@ # Log file *.log +# Ignored folders +cypress/videos/ +cypress/screenshots/ +cypress/reports/ +node_modules + # BlueJ files *.ctxt diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9e..00000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - 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. diff --git a/README.md b/README.md index c953054b..95baa43d 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,39 @@ -## apim-test-integration -Automation scripts of the APIM business scenario implementation and the related artifacts are maintained in this repo. - -## List Of Scenarios - -| *#* | *Scenario* | -| --- | --- | -| 1 | API Development | -| | * Managing Public, Partner vs Private APIs | -| | * Ownership, permission and collaborative API development | -| | * Developer Optimized APIs Development" | -| 2 | API security | -| | * Protecting Businesses by Anomaly Detection | -| 3 | App Development with APIs | -| 4 | API Lifecycle Management | -| 5 | API Versioning | -| 6 | API Governance | -| 7 | API Rate Limiting | -| | * API Monetization | -| 8 | Manage the Value Chain for APIs | -| | * Business Insights by API analytics | -| 9 | Developer Enablement and Community Building -| 10 | Support for API Types | -| 11 | Geographical Distributed wide API Management | -| 12 | API SLA | -| 13 | Micro API Gateway | -| 14 | Hybrid Cloud Pattern Support | +# API Manager 4.1.0 UI Tests + +## Running tests against a pack + +This branch contains the UI tests for API Manager 4.1.0. See the following steps to run the tests against the required pack. + +## Prerequisites + +Install NodeJS 14.x or later LTS version from [https://nodejs.org/en/download/](https://nodejs.org/en/download/). + +> **_Note :-_** +> +> You may use [Node Version Manager (nvm)](https://github.com/nvm-sh/nvm) tool to manage NodeJS on your development environment. You can use the following steps to switch to node 14. +> ``` +> nvm install 14 +> nvm use 14 +> ``` + +## Running the tests + +1. Start the pack. +2. Navigate to the root `apim-test-integration/` directory. +3. Run the following commands from the `apim-test-integration/` directory. + 1. `npm ci` to reinstall the dependencies. + 2. `npm run test` to run the tests against the running pack. +4. A report will be generated with the test results. + +> **_Note :-_** +> Currently the **application sharing feature** and the **product profiles** are not added to the tests. Therefore, they need to be tested manually. + +## Troubleshooting + +If there are any test failures, you can run the dev server and run the failed test cases in order to identify where the failure occurs. + +Use the below command to run the test server, + +``` +npm run test:dev +``` diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/.gitignore b/apps/AppDevelopmentAPI_v1.0.0_java/.gitignore deleted file mode 100644 index a530464a..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -*.class - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear - -# exclude jar for gradle wrapper -!gradle/wrapper/*.jar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -# build files -**/target -target -.gradle -build diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/.swagger-codegen-ignore b/apps/AppDevelopmentAPI_v1.0.0_java/.swagger-codegen-ignore deleted file mode 100644 index c5fa491b..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/.swagger-codegen-ignore +++ /dev/null @@ -1,23 +0,0 @@ -# Swagger Codegen Ignore -# Generated by swagger-codegen https://github.com/swagger-api/swagger-codegen - -# Use this file to prevent files from being overwritten by the generator. -# The patterns follow closely to .gitignore or .dockerignore. - -# As an example, the C# client generator defines ApiClient.cs. -# You can make changes and tell Swagger Codgen to ignore just this file by uncommenting the following line: -#ApiClient.cs - -# You can match any string of characters against a directory, file or extension with a single asterisk (*): -#foo/*/qux -# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux - -# You can recursively match patterns against a directory, file or extension with a double asterisk (**): -#foo/**/qux -# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux - -# You can also negate patterns with an exclamation (!). -# For example, you can ignore all files in a docs folder with the file extension .md: -#docs/*.md -# Then explicitly reverse the ignore rule for a single file: -#!docs/README.md diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/.travis.yml b/apps/AppDevelopmentAPI_v1.0.0_java/.travis.yml deleted file mode 100644 index 33e79472..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/.travis.yml +++ /dev/null @@ -1,29 +0,0 @@ -# -# Generated by: https://github.com/swagger-api/swagger-codegen.git -# -# 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. -# -language: java -jdk: - - oraclejdk8 - - oraclejdk7 -before_install: - # ensure gradlew has proper permission - - chmod a+x ./gradlew -script: - # test using maven - - mvn test - # uncomment below to test using gradle - # - gradle test - # uncomment below to test using sbt - # - sbt test diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/LICENSE b/apps/AppDevelopmentAPI_v1.0.0_java/LICENSE deleted file mode 100644 index 8dada3ed..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - 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. diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/README.md b/apps/AppDevelopmentAPI_v1.0.0_java/README.md deleted file mode 100644 index 27879784..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# org.wso2.client.AppDevelopmentAPI - -## Requirements - -Building the API client library requires [Maven](https://maven.apache.org/) to be installed. - -## Installation - -To install the API client library to your local Maven repository, simply execute: - -```shell -mvn install -``` - -To deploy it to a remote Maven repository instead, configure the settings of the repository and execute: - -```shell -mvn deploy -``` - -Refer to the [official documentation](https://maven.apache.org/plugins/maven-deploy-plugin/usage.html) for more information. - -### Maven users - -Add this dependency to your project's POM: - -```xml - - org.wso2 - org.wso2.client.AppDevelopmentAPI - 1.0.0 - compile - -``` - -### Gradle users - -Add this dependency to your project's build file: - -```groovy -compile "org.wso2:org.wso2.client.AppDevelopmentAPI:1.0.0" -``` - -### Others - -At first generate the JAR by executing: - - mvn package - -Then manually install the following JARs: - -* target/org.wso2.client.AppDevelopmentAPI-1.0.0.jar -* target/lib/*.jar - -## Getting Started -**Please note the getMockGet() method is modified to return the repsonce which is found in DefaultApi.java** - -Please follow the [installation](#installation) instruction and execute the following Java code: - -```java - -import org.wso2.client.api.*; -import org.wso2.client.api.auth.*; -import org.wso2.client.api.model.*; -import org.wso2.client.api.AppDevelopmentAPI.DefaultApi; - -import java.io.File; -import java.util.*; - -public class DefaultApiExample { - - public static void main(String[] args) { - - DefaultApi apiInstance = new DefaultApi(); - try { - apiInstance.getMockGet(); - } catch (ApiException e) { - System.err.println("Exception when calling DefaultApi#getMockGet"); - e.printStackTrace(); - } - } -} - -``` - -## Documentation for API Endpoints - -All URIs are relative to *https://localhost* - -Class | Method | HTTP request | Description ------------- | ------------- | ------------- | ------------- -*DefaultApi* | [**getMockGet**](docs/DefaultApi.md#getMockGet) | **GET** /getMock | - - -## Documentation for Models - - - -## Documentation for Authorization - -All endpoints do not require authorization. -Authentication schemes defined for the API: - -## Recommendation - -It's recommended to create an instance of `ApiClient` per thread in a multithreaded environment to avoid any potential issue. - -## Author - - - diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/build.gradle b/apps/AppDevelopmentAPI_v1.0.0_java/build.gradle deleted file mode 100644 index 743d95c9..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/build.gradle +++ /dev/null @@ -1,103 +0,0 @@ -apply plugin: 'idea' -apply plugin: 'eclipse' - -group = 'org.wso2' -version = '1.0.0' - -buildscript { - repositories { - jcenter() - } - dependencies { - classpath 'com.android.tools.build:gradle:1.5.+' - classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' - } -} - -repositories { - jcenter() -} - - -if(hasProperty('target') && target == 'android') { - - apply plugin: 'com.android.library' - apply plugin: 'com.github.dcendents.android-maven' - - android { - compileSdkVersion 23 - buildToolsVersion '23.0.2' - defaultConfig { - minSdkVersion 14 - targetSdkVersion 23 - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - - // Rename the aar correctly - libraryVariants.all { variant -> - variant.outputs.each { output -> - def outputFile = output.outputFile - if (outputFile != null && outputFile.name.endsWith('.aar')) { - def fileName = "${project.name}-${variant.baseName}-${version}.aar" - output.outputFile = new File(outputFile.parent, fileName) - } - } - } - - dependencies { - provided 'javax.annotation:jsr250-api:1.0' - } - } - - afterEvaluate { - android.libraryVariants.all { variant -> - def task = project.tasks.create "jar${variant.name.capitalize()}", Jar - task.description = "Create jar artifact for ${variant.name}" - task.dependsOn variant.javaCompile - task.from variant.javaCompile.destinationDir - task.destinationDir = project.file("${project.buildDir}/outputs/jar") - task.archiveName = "${project.name}-${variant.baseName}-${version}.jar" - artifacts.add('archives', task); - } - } - - task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' - } - - artifacts { - archives sourcesJar - } - -} else { - - apply plugin: 'java' - apply plugin: 'maven' - - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 - - install { - repositories.mavenInstaller { - pom.artifactId = 'org.wso2.client.AppDevelopmentAPI' - } - } - - task execute(type:JavaExec) { - main = System.getProperty('mainClass') - classpath = sourceSets.main.runtimeClasspath - } -} - -dependencies { - compile 'io.swagger:swagger-annotations:1.5.8' - compile 'com.squareup.okhttp:okhttp:2.7.5' - compile 'com.squareup.okhttp:logging-interceptor:2.7.5' - compile 'com.google.code.gson:gson:2.6.2' - compile 'joda-time:joda-time:2.9.3' - testCompile 'junit:junit:4.12' -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/build.sbt b/apps/AppDevelopmentAPI_v1.0.0_java/build.sbt deleted file mode 100644 index 0836b6f7..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/build.sbt +++ /dev/null @@ -1,20 +0,0 @@ -lazy val root = (project in file(".")). - settings( - organization := "org.wso2", - name := "org.wso2.client.AppDevelopmentAPI", - version := "1.0.0", - scalaVersion := "2.11.4", - scalacOptions ++= Seq("-feature"), - javacOptions in compile ++= Seq("-Xlint:deprecation"), - publishArtifact in (Compile, packageDoc) := false, - resolvers += Resolver.mavenLocal, - libraryDependencies ++= Seq( - "io.swagger" % "swagger-annotations" % "1.5.8", - "com.squareup.okhttp" % "okhttp" % "2.7.5", - "com.squareup.okhttp" % "logging-interceptor" % "2.7.5", - "com.google.code.gson" % "gson" % "2.6.2", - "joda-time" % "joda-time" % "2.9.3" % "compile", - "junit" % "junit" % "4.12" % "test", - "com.novocode" % "junit-interface" % "0.10" % "test" - ) - ) diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/docs/DefaultApi.md b/apps/AppDevelopmentAPI_v1.0.0_java/docs/DefaultApi.md deleted file mode 100644 index a06a73c7..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/docs/DefaultApi.md +++ /dev/null @@ -1,47 +0,0 @@ -# DefaultApi - -All URIs are relative to *https://localhost* - -Method | HTTP request | Description -------------- | ------------- | ------------- -[**getMockGet**](DefaultApi.md#getMockGet) | **GET** /getMock | - - - -# **getMockGet** -> getMockGet() - - - -### Example -```java -// Import classes: -//import org.wso2.client.api.ApiException; -//import org.wso2.client.api.AppDevelopmentAPI.DefaultApi; - - -DefaultApi apiInstance = new DefaultApi(); -try { - apiInstance.getMockGet(); -} catch (ApiException e) { - System.err.println("Exception when calling DefaultApi#getMockGet"); - e.printStackTrace(); -} -``` - -### Parameters -This endpoint does not need any parameter. - -### Return type - -null (empty response body) - -### Authorization - -No authorization required - -### HTTP request headers - - - **Content-Type**: Not defined - - **Accept**: Not defined - diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/git_push.sh b/apps/AppDevelopmentAPI_v1.0.0_java/git_push.sh deleted file mode 100644 index ed374619..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/git_push.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/sh -# ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ -# -# Usage example: /bin/sh ./git_push.sh wing328 swagger-petstore-perl "minor update" - -git_user_id=$1 -git_repo_id=$2 -release_note=$3 - -if [ "$git_user_id" = "" ]; then - git_user_id="GIT_USER_ID" - echo "[INFO] No command line input provided. Set \$git_user_id to $git_user_id" -fi - -if [ "$git_repo_id" = "" ]; then - git_repo_id="GIT_REPO_ID" - echo "[INFO] No command line input provided. Set \$git_repo_id to $git_repo_id" -fi - -if [ "$release_note" = "" ]; then - release_note="Minor update" - echo "[INFO] No command line input provided. Set \$release_note to $release_note" -fi - -# Initialize the local directory as a Git repository -git init - -# Adds the files in the local repository and stages them for commit. -git add . - -# Commits the tracked changes and prepares them to be pushed to a remote repository. -git commit -m "$release_note" - -# Sets the new remote -git_remote=`git remote` -if [ "$git_remote" = "" ]; then # git remote not defined - - if [ "$GIT_TOKEN" = "" ]; then - echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git crediential in your environment." - git remote add origin https://github.com/${git_user_id}/${git_repo_id}.git - else - git remote add origin https://${git_user_id}:${GIT_TOKEN}@github.com/${git_user_id}/${git_repo_id}.git - fi - -fi - -git pull origin master - -# Pushes (Forces) the changes in the local repository up to the remote repository -echo "Git pushing to https://github.com/${git_user_id}/${git_repo_id}.git" -git push origin master 2>&1 | grep -v 'To https' - diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/gradle.properties b/apps/AppDevelopmentAPI_v1.0.0_java/gradle.properties deleted file mode 100644 index 05644f07..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -# Uncomment to build for Android -#target = android \ No newline at end of file diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/gradle/wrapper/gradle-wrapper.jar b/apps/AppDevelopmentAPI_v1.0.0_java/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 2c6137b8..00000000 Binary files a/apps/AppDevelopmentAPI_v1.0.0_java/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/gradle/wrapper/gradle-wrapper.properties b/apps/AppDevelopmentAPI_v1.0.0_java/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index b7a36473..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Tue May 17 23:08:05 CST 2016 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.6-bin.zip diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/gradlew b/apps/AppDevelopmentAPI_v1.0.0_java/gradlew deleted file mode 100644 index 9d82f789..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/gradlew +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# 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 -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# 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 - -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" ] ; 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 - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/gradlew.bat b/apps/AppDevelopmentAPI_v1.0.0_java/gradlew.bat deleted file mode 100644 index 72d362da..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@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 - -@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= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@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 -if "%@eval[2+2]" == "4" goto 4NT_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=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -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/apps/AppDevelopmentAPI_v1.0.0_java/pom.xml b/apps/AppDevelopmentAPI_v1.0.0_java/pom.xml deleted file mode 100644 index 2cc155df..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/pom.xml +++ /dev/null @@ -1,148 +0,0 @@ - - 4.0.0 - org.wso2 - org.wso2.client.AppDevelopmentAPI - jar - org.wso2.client.AppDevelopmentAPI - 1.0.0 - - scm:git:git@github.com:swagger-api/swagger-mustache.git - scm:git:git@github.com:swagger-api/swagger-codegen.git - https://github.com/swagger-api/swagger-codegen - - - 2.2.0 - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.12 - - - - loggerPath - conf/log4j.properties - - - -Xms512m -Xmx1500m - methods - pertest - - - - maven-dependency-plugin - - - package - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.2 - - - - jar - test-jar - - - - - - - - - org.codehaus.mojo - build-helper-maven-plugin - 1.10 - - - add_sources - generate-sources - - add-source - - - - src/main/java - - - - - add_test_sources - generate-test-sources - - add-test-source - - - - src/test/java - - - - - - - - - - io.swagger - swagger-annotations - ${swagger-core-version} - - - com.squareup.okhttp - okhttp - ${okhttp-version} - - - com.squareup.okhttp - logging-interceptor - ${okhttp-version} - - - com.google.code.gson - gson - ${gson-version} - - - joda-time - joda-time - ${jodatime-version} - - - - - junit - junit - ${junit-version} - test - - - - 1.7 - ${java.version} - ${java.version} - 1.5.9 - 2.7.5 - 2.6.2 - 2.9.3 - 1.0.0 - 4.12 - UTF-8 - - diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/settings.gradle b/apps/AppDevelopmentAPI_v1.0.0_java/settings.gradle deleted file mode 100644 index 4fe7bb17..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = "org.wso2.client.AppDevelopmentAPI" \ No newline at end of file diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/AndroidManifest.xml b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/AndroidManifest.xml deleted file mode 100644 index 2489162f..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiCallback.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiCallback.java deleted file mode 100644 index 8d986216..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiCallback.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -import java.io.IOException; - -import java.util.Map; -import java.util.List; - -/** - * Callback for asynchronous API call. - * - * @param The return type - */ -public interface ApiCallback { - /** - * This is called when the API call fails. - * - * @param e The exception causing the failure - * @param statusCode Status code of the response if available, otherwise it would be 0 - * @param responseHeaders Headers of the response if available, otherwise it would be null - */ - void onFailure(ApiException e, int statusCode, Map> responseHeaders); - - /** - * This is called when the API call succeeded. - * - * @param result The result deserialized from response - * @param statusCode Status code of the response - * @param responseHeaders Headers of the response - */ - void onSuccess(T result, int statusCode, Map> responseHeaders); - - /** - * This is called when the API upload processing. - * - * @param bytesWritten bytes Written - * @param contentLength content length of request body - * @param done write end - */ - void onUploadProgress(long bytesWritten, long contentLength, boolean done); - - /** - * This is called when the API downlond processing. - * - * @param bytesRead bytes Read - * @param contentLength content lenngth of the response - * @param done Read end - */ - void onDownloadProgress(long bytesRead, long contentLength, boolean done); -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiClient.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiClient.java deleted file mode 100644 index 3a7af789..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiClient.java +++ /dev/null @@ -1,1324 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -import com.squareup.okhttp.Call; -import com.squareup.okhttp.Callback; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.Request; -import com.squareup.okhttp.Response; -import com.squareup.okhttp.RequestBody; -import com.squareup.okhttp.FormEncodingBuilder; -import com.squareup.okhttp.MultipartBuilder; -import com.squareup.okhttp.MediaType; -import com.squareup.okhttp.Headers; -import com.squareup.okhttp.internal.http.HttpMethod; -import com.squareup.okhttp.logging.HttpLoggingInterceptor; -import com.squareup.okhttp.logging.HttpLoggingInterceptor.Level; - -import java.lang.reflect.Type; - -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.Map.Entry; -import java.util.HashMap; -import java.util.List; -import java.util.ArrayList; -import java.util.Date; -import java.util.TimeZone; -import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import java.net.URLEncoder; -import java.net.URLConnection; - -import java.io.File; -import java.io.InputStream; -import java.io.IOException; -import java.io.UnsupportedEncodingException; - -import java.security.GeneralSecurityException; -import java.security.KeyStore; -import java.security.SecureRandom; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.text.ParseException; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.KeyManager; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.X509TrustManager; - -import okio.BufferedSink; -import okio.Okio; - -import org.wso2.client.api.auth.Authentication; -import org.wso2.client.api.auth.HttpBasicAuth; -import org.wso2.client.api.auth.ApiKeyAuth; -import org.wso2.client.api.auth.OAuth; - -public class ApiClient { - public static final double JAVA_VERSION; - public static final boolean IS_ANDROID; - public static final int ANDROID_SDK_VERSION; - - static { - JAVA_VERSION = Double.parseDouble(System.getProperty("java.specification.version")); - boolean isAndroid; - try { - Class.forName("android.app.Activity"); - isAndroid = true; - } catch (ClassNotFoundException e) { - isAndroid = false; - } - IS_ANDROID = isAndroid; - int sdkVersion = 0; - if (IS_ANDROID) { - try { - sdkVersion = Class.forName("android.os.Build$VERSION").getField("SDK_INT").getInt(null); - } catch (Exception e) { - try { - sdkVersion = Integer.parseInt((String) Class.forName("android.os.Build$VERSION").getField("SDK").get(null)); - } catch (Exception e2) { } - } - } - ANDROID_SDK_VERSION = sdkVersion; - } - - /** - * The datetime format to be used when lenientDatetimeFormat is enabled. - */ - public static final String LENIENT_DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; - - private String basePath = "https://localhost"; - private boolean lenientOnJson = false; - private boolean debugging = false; - private Map defaultHeaderMap = new HashMap(); - private String tempFolderPath = null; - - private Map authentications; - - private DateFormat dateFormat; - private DateFormat datetimeFormat; - private boolean lenientDatetimeFormat; - private int dateLength; - - private InputStream sslCaCert; - private boolean verifyingSsl; - - private OkHttpClient httpClient; - private JSON json; - - private HttpLoggingInterceptor loggingInterceptor; - - /* - * Constructor for ApiClient - */ - public ApiClient() { - httpClient = new OkHttpClient(); - - verifyingSsl = true; - - json = new JSON(this); - - /* - * Use RFC3339 format for date and datetime. - * See http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html#anchor14 - */ - this.dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - // Always use UTC as the default time zone when dealing with date (without time). - this.dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - initDatetimeFormat(); - - // Be lenient on datetime formats when parsing datetime from string. - // See parseDatetime. - this.lenientDatetimeFormat = true; - - // Set default User-Agent. - setUserAgent("Swagger-Codegen/1.0.0/java"); - - // Setup authentications (key: authentication name, value: authentication). - authentications = new HashMap(); - // Prevent the authentications from being modified. - authentications = Collections.unmodifiableMap(authentications); - } - - /** - * Get base path - * - * @return Baes path - */ - public String getBasePath() { - return basePath; - } - - /** - * Set base path - * - * @param basePath Base path of the URL (e.g https://localhost - * @return An instance of OkHttpClient - */ - public ApiClient setBasePath(String basePath) { - this.basePath = basePath; - return this; - } - - /** - * Get HTTP client - * - * @return An instance of OkHttpClient - */ - public OkHttpClient getHttpClient() { - return httpClient; - } - - /** - * Set HTTP client - * - * @param httpClient An instance of OkHttpClient - * @return Api Client - */ - public ApiClient setHttpClient(OkHttpClient httpClient) { - this.httpClient = httpClient; - return this; - } - - /** - * Get JSON - * - * @return JSON object - */ - public JSON getJSON() { - return json; - } - - /** - * Set JSON - * - * @param json JSON object - * @return Api client - */ - public ApiClient setJSON(JSON json) { - this.json = json; - return this; - } - - /** - * True if isVerifyingSsl flag is on - * - * @return True if isVerifySsl flag is on - */ - public boolean isVerifyingSsl() { - return verifyingSsl; - } - - /** - * Configure whether to verify certificate and hostname when making https requests. - * Default to true. - * NOTE: Do NOT set to false in production code, otherwise you would face multiple types of cryptographic attacks. - * - * @param verifyingSsl True to verify TLS/SSL connection - * @return ApiClient - */ - public ApiClient setVerifyingSsl(boolean verifyingSsl) { - this.verifyingSsl = verifyingSsl; - applySslSettings(); - return this; - } - - /** - * Get SSL CA cert. - * - * @return Input stream to the SSL CA cert - */ - public InputStream getSslCaCert() { - return sslCaCert; - } - - /** - * Configure the CA certificate to be trusted when making https requests. - * Use null to reset to default. - * - * @param sslCaCert input stream for SSL CA cert - * @return ApiClient - */ - public ApiClient setSslCaCert(InputStream sslCaCert) { - this.sslCaCert = sslCaCert; - applySslSettings(); - return this; - } - - public DateFormat getDateFormat() { - return dateFormat; - } - - public ApiClient setDateFormat(DateFormat dateFormat) { - this.dateFormat = dateFormat; - this.dateLength = this.dateFormat.format(new Date()).length(); - return this; - } - - public DateFormat getDatetimeFormat() { - return datetimeFormat; - } - - public ApiClient setDatetimeFormat(DateFormat datetimeFormat) { - this.datetimeFormat = datetimeFormat; - return this; - } - - /** - * Whether to allow various ISO 8601 datetime formats when parsing a datetime string. - * @see #parseDatetime(String) - * @return True if lenientDatetimeFormat flag is set to true - */ - public boolean isLenientDatetimeFormat() { - return lenientDatetimeFormat; - } - - public ApiClient setLenientDatetimeFormat(boolean lenientDatetimeFormat) { - this.lenientDatetimeFormat = lenientDatetimeFormat; - return this; - } - - /** - * Parse the given date string into Date object. - * The default dateFormat supports these ISO 8601 date formats: - * 2015-08-16 - * 2015-8-16 - * @param str String to be parsed - * @return Date - */ - public Date parseDate(String str) { - if (str == null) - return null; - try { - return dateFormat.parse(str); - } catch (ParseException e) { - throw new RuntimeException(e); - } - } - - /** - * Parse the given datetime string into Date object. - * When lenientDatetimeFormat is enabled, the following ISO 8601 datetime formats are supported: - * 2015-08-16T08:20:05Z - * 2015-8-16T8:20:05Z - * 2015-08-16T08:20:05+00:00 - * 2015-08-16T08:20:05+0000 - * 2015-08-16T08:20:05.376Z - * 2015-08-16T08:20:05.376+00:00 - * 2015-08-16T08:20:05.376+00 - * Note: The 3-digit milli-seconds is optional. Time zone is required and can be in one of - * these formats: - * Z (same with +0000) - * +08:00 (same with +0800) - * -02 (same with -0200) - * -0200 - * @see ISO 8601 - * @param str Date time string to be parsed - * @return Date representation of the string - */ - public Date parseDatetime(String str) { - if (str == null) - return null; - - DateFormat format; - if (lenientDatetimeFormat) { - /* - * When lenientDatetimeFormat is enabled, normalize the date string - * into LENIENT_DATETIME_FORMAT to support various formats - * defined by ISO 8601. - */ - // normalize time zone - // trailing "Z": 2015-08-16T08:20:05Z => 2015-08-16T08:20:05+0000 - str = str.replaceAll("[zZ]\\z", "+0000"); - // remove colon in time zone: 2015-08-16T08:20:05+00:00 => 2015-08-16T08:20:05+0000 - str = str.replaceAll("([+-]\\d{2}):(\\d{2})\\z", "$1$2"); - // expand time zone: 2015-08-16T08:20:05+00 => 2015-08-16T08:20:05+0000 - str = str.replaceAll("([+-]\\d{2})\\z", "$100"); - // add milliseconds when missing - // 2015-08-16T08:20:05+0000 => 2015-08-16T08:20:05.000+0000 - str = str.replaceAll("(:\\d{1,2})([+-]\\d{4})\\z", "$1.000$2"); - format = new SimpleDateFormat(LENIENT_DATETIME_FORMAT); - } else { - format = this.datetimeFormat; - } - - try { - return format.parse(str); - } catch (ParseException e) { - throw new RuntimeException(e); - } - } - - /* - * Parse date or date time in string format into Date object. - * - * @param str Date time string to be parsed - * @return Date representation of the string - */ - public Date parseDateOrDatetime(String str) { - if (str == null) - return null; - else if (str.length() <= dateLength) - return parseDate(str); - else - return parseDatetime(str); - } - - /** - * Format the given Date object into string (Date format). - * - * @param date Date object - * @return Formatted date in string representation - */ - public String formatDate(Date date) { - return dateFormat.format(date); - } - - /** - * Format the given Date object into string (Datetime format). - * - * @param date Date object - * @return Formatted datetime in string representation - */ - public String formatDatetime(Date date) { - return datetimeFormat.format(date); - } - - /** - * Get authentications (key: authentication name, value: authentication). - * - * @return Map of authentication objects - */ - public Map getAuthentications() { - return authentications; - } - - /** - * Get authentication for the given name. - * - * @param authName The authentication name - * @return The authentication, null if not found - */ - public Authentication getAuthentication(String authName) { - return authentications.get(authName); - } - - /** - * Helper method to set username for the first HTTP basic authentication. - * - * @param username Username - */ - public void setUsername(String username) { - for (Authentication auth : authentications.values()) { - if (auth instanceof HttpBasicAuth) { - ((HttpBasicAuth) auth).setUsername(username); - return; - } - } - throw new RuntimeException("No HTTP basic authentication configured!"); - } - - /** - * Helper method to set password for the first HTTP basic authentication. - * - * @param password Password - */ - public void setPassword(String password) { - for (Authentication auth : authentications.values()) { - if (auth instanceof HttpBasicAuth) { - ((HttpBasicAuth) auth).setPassword(password); - return; - } - } - throw new RuntimeException("No HTTP basic authentication configured!"); - } - - /** - * Helper method to set API key value for the first API key authentication. - * - * @param apiKey API key - */ - public void setApiKey(String apiKey) { - for (Authentication auth : authentications.values()) { - if (auth instanceof ApiKeyAuth) { - ((ApiKeyAuth) auth).setApiKey(apiKey); - return; - } - } - throw new RuntimeException("No API key authentication configured!"); - } - - /** - * Helper method to set API key prefix for the first API key authentication. - * - * @param apiKeyPrefix API key prefix - */ - public void setApiKeyPrefix(String apiKeyPrefix) { - for (Authentication auth : authentications.values()) { - if (auth instanceof ApiKeyAuth) { - ((ApiKeyAuth) auth).setApiKeyPrefix(apiKeyPrefix); - return; - } - } - throw new RuntimeException("No API key authentication configured!"); - } - - /** - * Helper method to set access token for the first OAuth2 authentication. - * - * @param accessToken Access token - */ - public void setAccessToken(String accessToken) { - for (Authentication auth : authentications.values()) { - if (auth instanceof OAuth) { - ((OAuth) auth).setAccessToken(accessToken); - return; - } - } - throw new RuntimeException("No OAuth2 authentication configured!"); - } - - /** - * Set the User-Agent header's value (by adding to the default header map). - * - * @param userAgent HTTP request's user agent - * @return ApiClient - */ - public ApiClient setUserAgent(String userAgent) { - addDefaultHeader("User-Agent", userAgent); - return this; - } - - /** - * Add a default header. - * - * @param key The header's key - * @param value The header's value - * @return ApiClient - */ - public ApiClient addDefaultHeader(String key, String value) { - defaultHeaderMap.put(key, value); - return this; - } - - /** - * @see setLenient - * - * @return True if lenientOnJson is enabled, false otherwise. - */ - public boolean isLenientOnJson() { - return lenientOnJson; - } - - /** - * Set LenientOnJson - * - * @param lenient True to enable lenientOnJson - * @return ApiClient - */ - public ApiClient setLenientOnJson(boolean lenient) { - this.lenientOnJson = lenient; - return this; - } - - /** - * Check that whether debugging is enabled for this API client. - * - * @return True if debugging is enabled, false otherwise. - */ - public boolean isDebugging() { - return debugging; - } - - /** - * Enable/disable debugging for this API client. - * - * @param debugging To enable (true) or disable (false) debugging - * @return ApiClient - */ - public ApiClient setDebugging(boolean debugging) { - if (debugging != this.debugging) { - if (debugging) { - loggingInterceptor = new HttpLoggingInterceptor(); - loggingInterceptor.setLevel(Level.BODY); - httpClient.interceptors().add(loggingInterceptor); - } else { - httpClient.interceptors().remove(loggingInterceptor); - loggingInterceptor = null; - } - } - this.debugging = debugging; - return this; - } - - /** - * The path of temporary folder used to store downloaded files from endpoints - * with file response. The default value is null, i.e. using - * the system's default tempopary folder. - * - * @see createTempFile - * @return Temporary folder path - */ - public String getTempFolderPath() { - return tempFolderPath; - } - - /** - * Set the tempoaray folder path (for downloading files) - * - * @param tempFolderPath Temporary folder path - * @return ApiClient - */ - public ApiClient setTempFolderPath(String tempFolderPath) { - this.tempFolderPath = tempFolderPath; - return this; - } - - /** - * Get connection timeout (in milliseconds). - * - * @return Timeout in milliseconds - */ - public int getConnectTimeout() { - return httpClient.getConnectTimeout(); - } - - /** - * Sets the connect timeout (in milliseconds). - * A value of 0 means no timeout, otherwise values must be between 1 and - * - * @param connectionTimeout connection timeout in milliseconds - * @return Api client - */ - public ApiClient setConnectTimeout(int connectionTimeout) { - httpClient.setConnectTimeout(connectionTimeout, TimeUnit.MILLISECONDS); - return this; - } - - /** - * Format the given parameter object into string. - * - * @param param Parameter - * @return String representation of the parameter - */ - public String parameterToString(Object param) { - if (param == null) { - return ""; - } else if (param instanceof Date) { - return formatDatetime((Date) param); - } else if (param instanceof Collection) { - StringBuilder b = new StringBuilder(); - for (Object o : (Collection)param) { - if (b.length() > 0) { - b.append(","); - } - b.append(String.valueOf(o)); - } - return b.toString(); - } else { - return String.valueOf(param); - } - } - - /** - * Format to {@code Pair} objects. - * - * @param collectionFormat collection format (e.g. csv, tsv) - * @param name Name - * @param value Value - * @return A list of Pair objects - */ - public List parameterToPairs(String collectionFormat, String name, Object value){ - List params = new ArrayList(); - - // preconditions - if (name == null || name.isEmpty() || value == null) return params; - - Collection valueCollection = null; - if (value instanceof Collection) { - valueCollection = (Collection) value; - } else { - params.add(new Pair(name, parameterToString(value))); - return params; - } - - if (valueCollection.isEmpty()){ - return params; - } - - // get the collection format - collectionFormat = (collectionFormat == null || collectionFormat.isEmpty() ? "csv" : collectionFormat); // default: csv - - // create the params based on the collection format - if (collectionFormat.equals("multi")) { - for (Object item : valueCollection) { - params.add(new Pair(name, parameterToString(item))); - } - - return params; - } - - String delimiter = ","; - - if (collectionFormat.equals("csv")) { - delimiter = ","; - } else if (collectionFormat.equals("ssv")) { - delimiter = " "; - } else if (collectionFormat.equals("tsv")) { - delimiter = "\t"; - } else if (collectionFormat.equals("pipes")) { - delimiter = "|"; - } - - StringBuilder sb = new StringBuilder() ; - for (Object item : valueCollection) { - sb.append(delimiter); - sb.append(parameterToString(item)); - } - - params.add(new Pair(name, sb.substring(1))); - - return params; - } - - /** - * Sanitize filename by removing path. - * e.g. ../../sun.gif becomes sun.gif - * - * @param filename The filename to be sanitized - * @return The sanitized filename - */ - public String sanitizeFilename(String filename) { - return filename.replaceAll(".*[/\\\\]", ""); - } - - /** - * Check if the given MIME is a JSON MIME. - * JSON MIME examples: - * application/json - * application/json; charset=UTF8 - * APPLICATION/JSON - * - * @param mime MIME (Multipurpose Internet Mail Extensions) - * @return True if the given MIME is JSON, false otherwise. - */ - public boolean isJsonMime(String mime) { - return mime != null && mime.matches("(?i)application\\/json(;.*)?"); - } - - /** - * Select the Accept header's value from the given accepts array: - * if JSON exists in the given array, use it; - * otherwise use all of them (joining into a string) - * - * @param accepts The accepts array to select from - * @return The Accept header to use. If the given array is empty, - * null will be returned (not to set the Accept header explicitly). - */ - public String selectHeaderAccept(String[] accepts) { - if (accepts.length == 0) { - return null; - } - for (String accept : accepts) { - if (isJsonMime(accept)) { - return accept; - } - } - return StringUtil.join(accepts, ","); - } - - /** - * Select the Content-Type header's value from the given array: - * if JSON exists in the given array, use it; - * otherwise use the first one of the array. - * - * @param contentTypes The Content-Type array to select from - * @return The Content-Type header to use. If the given array is empty, - * JSON will be used. - */ - public String selectHeaderContentType(String[] contentTypes) { - if (contentTypes.length == 0) { - return "application/json"; - } - for (String contentType : contentTypes) { - if (isJsonMime(contentType)) { - return contentType; - } - } - return contentTypes[0]; - } - - /** - * Escape the given string to be used as URL query value. - * - * @param str String to be escaped - * @return Escaped string - */ - public String escapeString(String str) { - try { - return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20"); - } catch (UnsupportedEncodingException e) { - return str; - } - } - - /** - * Deserialize response body to Java object, according to the return type and - * the Content-Type response header. - * - * @param Type - * @param response HTTP response - * @param returnType The type of the Java object - * @return The deserialized Java object - * @throws ApiException If fail to deserialize response body, i.e. cannot read response body - * or the Content-Type of the response is not supported. - */ - @SuppressWarnings("unchecked") - public T deserialize(Response response, Type returnType) throws ApiException { - if (response == null || returnType == null) { - return null; - } - - if ("byte[]".equals(returnType.toString())) { - // Handle binary response (byte array). - try { - return (T) response.body().bytes(); - } catch (IOException e) { - throw new ApiException(e); - } - } else if (returnType.equals(File.class)) { - // Handle file downloading. - return (T) downloadFileFromResponse(response); - } - - String respBody; - try { - if (response.body() != null) - respBody = response.body().string(); - else - respBody = null; - } catch (IOException e) { - throw new ApiException(e); - } - - if (respBody == null || "".equals(respBody)) { - return null; - } - - String contentType = response.headers().get("Content-Type"); - if (contentType == null) { - // ensuring a default content type - contentType = "application/json"; - } - if (isJsonMime(contentType)) { - return json.deserialize(respBody, returnType); - } else if (returnType.equals(String.class)) { - // Expecting string, return the raw response body. - return (T) respBody; - } else { - throw new ApiException( - "Content type \"" + contentType + "\" is not supported for type: " + returnType, - response.code(), - response.headers().toMultimap(), - respBody); - } - } - - /** - * Serialize the given Java object into request body according to the object's - * class and the request Content-Type. - * - * @param obj The Java object - * @param contentType The request Content-Type - * @return The serialized request body - * @throws ApiException If fail to serialize the given object - */ - public RequestBody serialize(Object obj, String contentType) throws ApiException { - if (obj instanceof byte[]) { - // Binary (byte array) body parameter support. - return RequestBody.create(MediaType.parse(contentType), (byte[]) obj); - } else if (obj instanceof File) { - // File body parameter support. - return RequestBody.create(MediaType.parse(contentType), (File) obj); - } else if (isJsonMime(contentType)) { - String content; - if (obj != null) { - content = json.serialize(obj); - } else { - content = null; - } - return RequestBody.create(MediaType.parse(contentType), content); - } else { - throw new ApiException("Content type \"" + contentType + "\" is not supported"); - } - } - - /** - * Download file from the given response. - * - * @param response An instance of the Response object - * @throws ApiException If fail to read file content from response and write to disk - * @return Downloaded file - */ - public File downloadFileFromResponse(Response response) throws ApiException { - try { - File file = prepareDownloadFile(response); - BufferedSink sink = Okio.buffer(Okio.sink(file)); - sink.writeAll(response.body().source()); - sink.close(); - return file; - } catch (IOException e) { - throw new ApiException(e); - } - } - - /** - * Prepare file for download - * - * @param response An instance of the Response object - * @throws IOException If fail to prepare file for download - * @return Prepared file for the download - */ - public File prepareDownloadFile(Response response) throws IOException { - String filename = null; - String contentDisposition = response.header("Content-Disposition"); - if (contentDisposition != null && !"".equals(contentDisposition)) { - // Get filename from the Content-Disposition header. - Pattern pattern = Pattern.compile("filename=['\"]?([^'\"\\s]+)['\"]?"); - Matcher matcher = pattern.matcher(contentDisposition); - if (matcher.find()) { - filename = sanitizeFilename(matcher.group(1)); - } - } - - String prefix = null; - String suffix = null; - if (filename == null) { - prefix = "download-"; - suffix = ""; - } else { - int pos = filename.lastIndexOf("."); - if (pos == -1) { - prefix = filename + "-"; - } else { - prefix = filename.substring(0, pos) + "-"; - suffix = filename.substring(pos); - } - // File.createTempFile requires the prefix to be at least three characters long - if (prefix.length() < 3) - prefix = "download-"; - } - - if (tempFolderPath == null) - return File.createTempFile(prefix, suffix); - else - return File.createTempFile(prefix, suffix, new File(tempFolderPath)); - } - - /** - * {@link #execute(Call, Type)} - * - * @param Type - * @param call An instance of the Call object - * @throws ApiException If fail to execute the call - * @return ApiResponse<T> - */ - public ApiResponse execute(Call call) throws ApiException { - return execute(call, null); - } - - /** - * Execute HTTP call and deserialize the HTTP response body into the given return type. - * - * @param returnType The return type used to deserialize HTTP response body - * @param The return type corresponding to (same with) returnType - * @param call Call - * @return ApiResponse object containing response status, headers and - * data, which is a Java object deserialized from response body and would be null - * when returnType is null. - * @throws ApiException If fail to execute the call - */ - public ApiResponse execute(Call call, Type returnType) throws ApiException { - try { - Response response = call.execute(); - T data = handleResponse(response, returnType); - return new ApiResponse(response.code(), response.headers().toMultimap(), data); - } catch (IOException e) { - throw new ApiException(e); - } - } - - /** - * {@link #executeAsync(Call, Type, ApiCallback)} - * - * @param Type - * @param call An instance of the Call object - * @param callback ApiCallback<T> - */ - public void executeAsync(Call call, ApiCallback callback) { - executeAsync(call, null, callback); - } - - /** - * Execute HTTP call asynchronously. - * - * @see #execute(Call, Type) - * @param Type - * @param call The callback to be executed when the API call finishes - * @param returnType Return type - * @param callback ApiCallback - */ - @SuppressWarnings("unchecked") - public void executeAsync(Call call, final Type returnType, final ApiCallback callback) { - call.enqueue(new Callback() { - @Override - public void onFailure(Request request, IOException e) { - callback.onFailure(new ApiException(e), 0, null); - } - - @Override - public void onResponse(Response response) throws IOException { - T result; - try { - result = (T) handleResponse(response, returnType); - } catch (ApiException e) { - callback.onFailure(e, response.code(), response.headers().toMultimap()); - return; - } - callback.onSuccess(result, response.code(), response.headers().toMultimap()); - } - }); - } - - /** - * Handle the given response, return the deserialized object when the response is successful. - * - * @param Type - * @param response Response - * @param returnType Return type - * @throws ApiException If the response has a unsuccessful status code or - * fail to deserialize the response body - * @return Type - */ - public T handleResponse(Response response, Type returnType) throws ApiException { - if (response.isSuccessful()) { - if (returnType == null || response.code() == 204) { - // returning null if the returnType is not defined, - // or the status code is 204 (No Content) - return null; - } else { - return deserialize(response, returnType); - } - } else { - String respBody = null; - if (response.body() != null) { - try { - respBody = response.body().string(); - } catch (IOException e) { - throw new ApiException(response.message(), e, response.code(), response.headers().toMultimap()); - } - } - throw new ApiException(response.message(), response.code(), response.headers().toMultimap(), respBody); - } - } - - /** - * Build HTTP call with the given options. - * - * @param path The sub-path of the HTTP URL - * @param method The request method, one of "GET", "HEAD", "OPTIONS", "POST", "PUT", "PATCH" and "DELETE" - * @param queryParams The query parameters - * @param body The request body object - * @param headerParams The header parameters - * @param formParams The form parameters - * @param authNames The authentications to apply - * @param progressRequestListener Progress request listener - * @return The HTTP call - * @throws ApiException If fail to serialize the request body object - */ - public Call buildCall(String path, String method, List queryParams, Object body, Map headerParams, Map formParams, String[] authNames, ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { - updateParamsForAuth(authNames, queryParams, headerParams); - - final String url = buildUrl(path, queryParams); - final Request.Builder reqBuilder = new Request.Builder().url(url); - processHeaderParams(headerParams, reqBuilder); - - String contentType = (String) headerParams.get("Content-Type"); - // ensuring a default content type - if (contentType == null) { - contentType = "application/json"; - } - - RequestBody reqBody; - if (!HttpMethod.permitsRequestBody(method)) { - reqBody = null; - } else if ("application/x-www-form-urlencoded".equals(contentType)) { - reqBody = buildRequestBodyFormEncoding(formParams); - } else if ("multipart/form-data".equals(contentType)) { - reqBody = buildRequestBodyMultipart(formParams); - } else if (body == null) { - if ("DELETE".equals(method)) { - // allow calling DELETE without sending a request body - reqBody = null; - } else { - // use an empty request body (for POST, PUT and PATCH) - reqBody = RequestBody.create(MediaType.parse(contentType), ""); - } - } else { - reqBody = serialize(body, contentType); - } - - Request request = null; - - if(progressRequestListener != null && reqBody != null) { - ProgressRequestBody progressRequestBody = new ProgressRequestBody(reqBody, progressRequestListener); - request = reqBuilder.method(method, progressRequestBody).build(); - } else { - request = reqBuilder.method(method, reqBody).build(); - } - - return httpClient.newCall(request); - } - - /** - * Build full URL by concatenating base path, the given sub path and query parameters. - * - * @param path The sub path - * @param queryParams The query parameters - * @return The full URL - */ - public String buildUrl(String path, List queryParams) { - final StringBuilder url = new StringBuilder(); - url.append(basePath).append(path); - - if (queryParams != null && !queryParams.isEmpty()) { - // support (constant) query string in `path`, e.g. "/posts?draft=1" - String prefix = path.contains("?") ? "&" : "?"; - for (Pair param : queryParams) { - if (param.getValue() != null) { - if (prefix != null) { - url.append(prefix); - prefix = null; - } else { - url.append("&"); - } - String value = parameterToString(param.getValue()); - url.append(escapeString(param.getName())).append("=").append(escapeString(value)); - } - } - } - - return url.toString(); - } - - /** - * Set header parameters to the request builder, including default headers. - * - * @param headerParams Header parameters in the ofrm of Map - * @param reqBuilder Reqeust.Builder - */ - public void processHeaderParams(Map headerParams, Request.Builder reqBuilder) { - for (Entry param : headerParams.entrySet()) { - reqBuilder.header(param.getKey(), parameterToString(param.getValue())); - } - for (Entry header : defaultHeaderMap.entrySet()) { - if (!headerParams.containsKey(header.getKey())) { - reqBuilder.header(header.getKey(), parameterToString(header.getValue())); - } - } - } - - /** - * Update query and header parameters based on authentication settings. - * - * @param authNames The authentications to apply - * @param queryParams List of query parameters - * @param headerParams Map of header parameters - */ - public void updateParamsForAuth(String[] authNames, List queryParams, Map headerParams) { - for (String authName : authNames) { - Authentication auth = authentications.get(authName); - if (auth == null) throw new RuntimeException("Authentication undefined: " + authName); - auth.applyToParams(queryParams, headerParams); - } - } - - /** - * Build a form-encoding request body with the given form parameters. - * - * @param formParams Form parameters in the form of Map - * @return RequestBody - */ - public RequestBody buildRequestBodyFormEncoding(Map formParams) { - FormEncodingBuilder formBuilder = new FormEncodingBuilder(); - for (Entry param : formParams.entrySet()) { - formBuilder.add(param.getKey(), parameterToString(param.getValue())); - } - return formBuilder.build(); - } - - /** - * Build a multipart (file uploading) request body with the given form parameters, - * which could contain text fields and file fields. - * - * @param formParams Form parameters in the form of Map - * @return RequestBody - */ - public RequestBody buildRequestBodyMultipart(Map formParams) { - MultipartBuilder mpBuilder = new MultipartBuilder().type(MultipartBuilder.FORM); - for (Entry param : formParams.entrySet()) { - if (param.getValue() instanceof File) { - File file = (File) param.getValue(); - Headers partHeaders = Headers.of("Content-Disposition", "form-data; name=\"" + param.getKey() + "\"; filename=\"" + file.getName() + "\""); - MediaType mediaType = MediaType.parse(guessContentTypeFromFile(file)); - mpBuilder.addPart(partHeaders, RequestBody.create(mediaType, file)); - } else { - Headers partHeaders = Headers.of("Content-Disposition", "form-data; name=\"" + param.getKey() + "\""); - mpBuilder.addPart(partHeaders, RequestBody.create(null, parameterToString(param.getValue()))); - } - } - return mpBuilder.build(); - } - - /** - * Guess Content-Type header from the given file (defaults to "application/octet-stream"). - * - * @param file The given file - * @return The guessed Content-Type - */ - public String guessContentTypeFromFile(File file) { - String contentType = URLConnection.guessContentTypeFromName(file.getName()); - if (contentType == null) { - return "application/octet-stream"; - } else { - return contentType; - } - } - - /** - * Initialize datetime format according to the current environment, e.g. Java 1.7 and Android. - */ - private void initDatetimeFormat() { - String formatWithTimeZone = null; - if (IS_ANDROID) { - if (ANDROID_SDK_VERSION >= 18) { - // The time zone format "ZZZZZ" is available since Android 4.3 (SDK version 18) - formatWithTimeZone = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"; - } - } else if (JAVA_VERSION >= 1.7) { - // The time zone format "XXX" is available since Java 1.7 - formatWithTimeZone = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; - } - if (formatWithTimeZone != null) { - this.datetimeFormat = new SimpleDateFormat(formatWithTimeZone); - // NOTE: Use the system's default time zone (mainly for datetime formatting). - } else { - // Use a common format that works across all systems. - this.datetimeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); - // Always use the UTC time zone as we are using a constant trailing "Z" here. - this.datetimeFormat.setTimeZone(TimeZone.getTimeZone("UTC")); - } - } - - /** - * Apply SSL related settings to httpClient according to the current values of - * verifyingSsl and sslCaCert. - */ - private void applySslSettings() { - try { - KeyManager[] keyManagers = null; - TrustManager[] trustManagers = null; - HostnameVerifier hostnameVerifier = null; - if (!verifyingSsl) { - TrustManager trustAll = new X509TrustManager() { - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {} - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {} - @Override - public X509Certificate[] getAcceptedIssuers() { return null; } - }; - SSLContext sslContext = SSLContext.getInstance("TLS"); - trustManagers = new TrustManager[]{ trustAll }; - hostnameVerifier = new HostnameVerifier() { - @Override - public boolean verify(String hostname, SSLSession session) { return true; } - }; - } else if (sslCaCert != null) { - char[] password = null; // Any password will work. - CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); - Collection certificates = certificateFactory.generateCertificates(sslCaCert); - if (certificates.isEmpty()) { - throw new IllegalArgumentException("expected non-empty set of trusted certificates"); - } - KeyStore caKeyStore = newEmptyKeyStore(password); - int index = 0; - for (Certificate certificate : certificates) { - String certificateAlias = "ca" + Integer.toString(index++); - caKeyStore.setCertificateEntry(certificateAlias, certificate); - } - TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); - trustManagerFactory.init(caKeyStore); - trustManagers = trustManagerFactory.getTrustManagers(); - } - - if (keyManagers != null || trustManagers != null) { - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(keyManagers, trustManagers, new SecureRandom()); - httpClient.setSslSocketFactory(sslContext.getSocketFactory()); - } else { - httpClient.setSslSocketFactory(null); - } - httpClient.setHostnameVerifier(hostnameVerifier); - } catch (GeneralSecurityException e) { - throw new RuntimeException(e); - } - } - - private KeyStore newEmptyKeyStore(char[] password) throws GeneralSecurityException { - try { - KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); - keyStore.load(null, password); - return keyStore; - } catch (IOException e) { - throw new AssertionError(e); - } - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiException.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiException.java deleted file mode 100644 index eb0640e7..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiException.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -import java.util.Map; -import java.util.List; - -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2018-01-29T10:16:56.409+05:30") -public class ApiException extends Exception { - private int code = 0; - private Map> responseHeaders = null; - private String responseBody = null; - - public ApiException() {} - - public ApiException(Throwable throwable) { - super(throwable); - } - - public ApiException(String message) { - super(message); - } - - public ApiException(String message, Throwable throwable, int code, Map> responseHeaders, String responseBody) { - super(message, throwable); - this.code = code; - this.responseHeaders = responseHeaders; - this.responseBody = responseBody; - } - - public ApiException(String message, int code, Map> responseHeaders, String responseBody) { - this(message, (Throwable) null, code, responseHeaders, responseBody); - } - - public ApiException(String message, Throwable throwable, int code, Map> responseHeaders) { - this(message, throwable, code, responseHeaders, null); - } - - public ApiException(int code, Map> responseHeaders, String responseBody) { - this((String) null, (Throwable) null, code, responseHeaders, responseBody); - } - - public ApiException(int code, String message) { - super(message); - this.code = code; - } - - public ApiException(int code, String message, Map> responseHeaders, String responseBody) { - this(code, message); - this.responseHeaders = responseHeaders; - this.responseBody = responseBody; - } - - /** - * Get the HTTP status code. - * - * @return HTTP status code - */ - public int getCode() { - return code; - } - - /** - * Get the HTTP response headers. - * - * @return A map of list of string - */ - public Map> getResponseHeaders() { - return responseHeaders; - } - - /** - * Get the HTTP response body. - * - * @return Response body in the form of string - */ - public String getResponseBody() { - return responseBody; - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiResponse.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiResponse.java deleted file mode 100644 index 5fbcb3d5..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ApiResponse.java +++ /dev/null @@ -1,71 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -import java.util.List; -import java.util.Map; - -/** - * API response returned by API call. - * - * @param T The type of data that is deserialized from response body - */ -public class ApiResponse { - final private int statusCode; - final private Map> headers; - final private T data; - - /** - * @param statusCode The status code of HTTP response - * @param headers The headers of HTTP response - */ - public ApiResponse(int statusCode, Map> headers) { - this(statusCode, headers, null); - } - - /** - * @param statusCode The status code of HTTP response - * @param headers The headers of HTTP response - * @param data The object deserialized from response bod - */ - public ApiResponse(int statusCode, Map> headers, T data) { - this.statusCode = statusCode; - this.headers = headers; - this.data = data; - } - - public int getStatusCode() { - return statusCode; - } - - public Map> getHeaders() { - return headers; - } - - public T getData() { - return data; - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/AppDevelopmentAPI/DefaultApi.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/AppDevelopmentAPI/DefaultApi.java deleted file mode 100644 index d98a259a..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/AppDevelopmentAPI/DefaultApi.java +++ /dev/null @@ -1,163 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api.AppDevelopmentAPI; - -import org.wso2.client.api.ApiCallback; -import org.wso2.client.api.ApiClient; -import org.wso2.client.api.ApiException; -import org.wso2.client.api.ApiResponse; -import org.wso2.client.api.Configuration; -import org.wso2.client.api.Pair; -import org.wso2.client.api.ProgressRequestBody; -import org.wso2.client.api.ProgressResponseBody; - -import com.google.gson.reflect.TypeToken; - -import java.io.IOException; - - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class DefaultApi { - private ApiClient apiClient; - - public DefaultApi() { - this(Configuration.getDefaultApiClient()); - } - - public DefaultApi(ApiClient apiClient) { - this.apiClient = apiClient; - } - - public ApiClient getApiClient() { - return apiClient; - } - - public void setApiClient(ApiClient apiClient) { - this.apiClient = apiClient; - } - - /* Build call for getMockGet */ - private com.squareup.okhttp.Call getMockGetCall(final ProgressResponseBody.ProgressListener progressListener, final ProgressRequestBody.ProgressRequestListener progressRequestListener) throws ApiException { - Object localVarPostBody = null; - - - // create path and map variables - String localVarPath = "/getMock".replaceAll("\\{format\\}","json"); - - List localVarQueryParams = new ArrayList(); - - Map localVarHeaderParams = new HashMap(); - - Map localVarFormParams = new HashMap(); - - final String[] localVarAccepts = { - - }; - final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); - if (localVarAccept != null) localVarHeaderParams.put("Accept", localVarAccept); - - final String[] localVarContentTypes = { - - }; - final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); - - if(progressListener != null) { - apiClient.getHttpClient().networkInterceptors().add(new com.squareup.okhttp.Interceptor() { - @Override - public com.squareup.okhttp.Response intercept(com.squareup.okhttp.Interceptor.Chain chain) throws IOException { - com.squareup.okhttp.Response originalResponse = chain.proceed(chain.request()); - return originalResponse.newBuilder() - .body(new ProgressResponseBody(originalResponse.body(), progressListener)) - .build(); - } - }); - } - - String[] localVarAuthNames = new String[] { }; - return apiClient.buildCall(localVarPath, "GET", localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarAuthNames, progressRequestListener); - } - - /** - * - * - * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body - */ - public String getMockGet() throws ApiException { - String resp = this.getMockGetWithHttpInfo().toString(); - return resp; - - } - - /** - * - * - * @return ApiResponse<Void> - * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body - */ - public ApiResponse getMockGetWithHttpInfo() throws ApiException { - com.squareup.okhttp.Call call = getMockGetCall(null, null); - return apiClient.execute(call); - } - - /** - * (asynchronously) - * - * @param callback The callback to be executed when the API call finishes - * @return The request call - * @throws ApiException If fail to process the API call, e.g. serializing the request body object - */ - public com.squareup.okhttp.Call getMockGetAsync(final ApiCallback callback) throws ApiException { - - ProgressResponseBody.ProgressListener progressListener = null; - ProgressRequestBody.ProgressRequestListener progressRequestListener = null; - - if (callback != null) { - progressListener = new ProgressResponseBody.ProgressListener() { - @Override - public void update(long bytesRead, long contentLength, boolean done) { - callback.onDownloadProgress(bytesRead, contentLength, done); - } - }; - - progressRequestListener = new ProgressRequestBody.ProgressRequestListener() { - @Override - public void onRequestProgress(long bytesWritten, long contentLength, boolean done) { - callback.onUploadProgress(bytesWritten, contentLength, done); - } - }; - } - - com.squareup.okhttp.Call call = getMockGetCall(progressListener, progressRequestListener); - apiClient.executeAsync(call, callback); - return call; - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/Configuration.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/Configuration.java deleted file mode 100644 index 714a5fc7..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/Configuration.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2018-01-29T10:16:56.409+05:30") -public class Configuration { - private static ApiClient defaultApiClient = new ApiClient(); - - /** - * Get the default API client, which would be used when creating API - * instances without providing an API client. - * - * @return Default API client - */ - public static ApiClient getDefaultApiClient() { - return defaultApiClient; - } - - /** - * Set the default API client, which would be used when creating API - * instances without providing an API client. - * - * @param apiClient API client - */ - public static void setDefaultApiClient(ApiClient apiClient) { - defaultApiClient = apiClient; - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/JSON.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/JSON.java deleted file mode 100644 index ae350754..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/JSON.java +++ /dev/null @@ -1,237 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonNull; -import com.google.gson.JsonParseException; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; -import com.google.gson.TypeAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -import java.io.IOException; -import java.io.StringReader; -import java.lang.reflect.Type; -import java.util.Date; - -import org.joda.time.DateTime; -import org.joda.time.LocalDate; -import org.joda.time.format.DateTimeFormatter; -import org.joda.time.format.ISODateTimeFormat; - -public class JSON { - private ApiClient apiClient; - private Gson gson; - - /** - * JSON constructor. - * - * @param apiClient An instance of ApiClient - */ - public JSON(ApiClient apiClient) { - this.apiClient = apiClient; - gson = new GsonBuilder() - .registerTypeAdapter(Date.class, new DateAdapter(apiClient)) - .registerTypeAdapter(DateTime.class, new DateTimeTypeAdapter()) - .registerTypeAdapter(LocalDate.class, new LocalDateTypeAdapter()) - .create(); - } - - /** - * Get Gson. - * - * @return Gson - */ - public Gson getGson() { - return gson; - } - - /** - * Set Gson. - * - * @param gson Gson - */ - public void setGson(Gson gson) { - this.gson = gson; - } - - /** - * Serialize the given Java object into JSON string. - * - * @param obj Object - * @return String representation of the JSON - */ - public String serialize(Object obj) { - return gson.toJson(obj); - } - - /** - * Deserialize the given JSON string to Java object. - * - * @param Type - * @param body The JSON string - * @param returnType The type to deserialize inot - * @return The deserialized Java object - */ - @SuppressWarnings("unchecked") - public T deserialize(String body, Type returnType) { - try { - if (apiClient.isLenientOnJson()) { - JsonReader jsonReader = new JsonReader(new StringReader(body)); - // see https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/stream/JsonReader.html#setLenient(boolean) - jsonReader.setLenient(true); - return gson.fromJson(jsonReader, returnType); - } else { - return gson.fromJson(body, returnType); - } - } catch (JsonParseException e) { - // Fallback processing when failed to parse JSON form response body: - // return the response body string directly for the String return type; - // parse response body into date or datetime for the Date return type. - if (returnType.equals(String.class)) - return (T) body; - else if (returnType.equals(Date.class)) - return (T) apiClient.parseDateOrDatetime(body); - else throw(e); - } - } -} - -class DateAdapter implements JsonSerializer, JsonDeserializer { - private final ApiClient apiClient; - - /** - * Constructor for DateAdapter - * - * @param apiClient Api client - */ - public DateAdapter(ApiClient apiClient) { - super(); - this.apiClient = apiClient; - } - - /** - * Serialize - * - * @param src Date - * @param typeOfSrc Type - * @param context Json Serialization Context - * @return Json Element - */ - @Override - public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { - if (src == null) { - return JsonNull.INSTANCE; - } else { - return new JsonPrimitive(apiClient.formatDatetime(src)); - } - } - - /** - * Deserialize - * - * @param json Json element - * @param date Type - * @param typeOfSrc Type - * @param context Json Serialization Context - * @return Date - * @throw JsonParseException if fail to parse - */ - @Override - public Date deserialize(JsonElement json, Type date, JsonDeserializationContext context) throws JsonParseException { - String str = json.getAsJsonPrimitive().getAsString(); - try { - return apiClient.parseDateOrDatetime(str); - } catch (RuntimeException e) { - throw new JsonParseException(e); - } - } -} - -/** - * Gson TypeAdapter for Joda DateTime type - */ -class DateTimeTypeAdapter extends TypeAdapter { - - private final DateTimeFormatter formatter = ISODateTimeFormat.dateTime(); - - @Override - public void write(JsonWriter out, DateTime date) throws IOException { - if (date == null) { - out.nullValue(); - } else { - out.value(formatter.print(date)); - } - } - - @Override - public DateTime read(JsonReader in) throws IOException { - switch (in.peek()) { - case NULL: - in.nextNull(); - return null; - default: - String date = in.nextString(); - return formatter.parseDateTime(date); - } - } -} - -/** - * Gson TypeAdapter for Joda LocalDate type - */ -class LocalDateTypeAdapter extends TypeAdapter { - - private final DateTimeFormatter formatter = ISODateTimeFormat.date(); - - @Override - public void write(JsonWriter out, LocalDate date) throws IOException { - if (date == null) { - out.nullValue(); - } else { - out.value(formatter.print(date)); - } - } - - @Override - public LocalDate read(JsonReader in) throws IOException { - switch (in.peek()) { - case NULL: - in.nextNull(); - return null; - default: - String date = in.nextString(); - return formatter.parseLocalDate(date); - } - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/Pair.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/Pair.java deleted file mode 100644 index 76a389c4..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/Pair.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2018-01-29T10:16:56.409+05:30") -public class Pair { - private String name = ""; - private String value = ""; - - public Pair (String name, String value) { - setName(name); - setValue(value); - } - - private void setName(String name) { - if (!isValidString(name)) return; - - this.name = name; - } - - private void setValue(String value) { - if (!isValidString(value)) return; - - this.value = value; - } - - public String getName() { - return this.name; - } - - public String getValue() { - return this.value; - } - - private boolean isValidString(String arg) { - if (arg == null) return false; - if (arg.trim().isEmpty()) return false; - - return true; - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ProgressRequestBody.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ProgressRequestBody.java deleted file mode 100644 index 433c49dd..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ProgressRequestBody.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -import com.squareup.okhttp.MediaType; -import com.squareup.okhttp.RequestBody; - -import java.io.IOException; - -import okio.Buffer; -import okio.BufferedSink; -import okio.ForwardingSink; -import okio.Okio; -import okio.Sink; - -public class ProgressRequestBody extends RequestBody { - - public interface ProgressRequestListener { - void onRequestProgress(long bytesWritten, long contentLength, boolean done); - } - - private final RequestBody requestBody; - - private final ProgressRequestListener progressListener; - - private BufferedSink bufferedSink; - - public ProgressRequestBody(RequestBody requestBody, ProgressRequestListener progressListener) { - this.requestBody = requestBody; - this.progressListener = progressListener; - } - - @Override - public MediaType contentType() { - return requestBody.contentType(); - } - - @Override - public long contentLength() throws IOException { - return requestBody.contentLength(); - } - - @Override - public void writeTo(BufferedSink sink) throws IOException { - if (bufferedSink == null) { - bufferedSink = Okio.buffer(sink(sink)); - } - - requestBody.writeTo(bufferedSink); - bufferedSink.flush(); - - } - - private Sink sink(Sink sink) { - return new ForwardingSink(sink) { - - long bytesWritten = 0L; - long contentLength = 0L; - - @Override - public void write(Buffer source, long byteCount) throws IOException { - super.write(source, byteCount); - if (contentLength == 0) { - contentLength = contentLength(); - } - - bytesWritten += byteCount; - progressListener.onRequestProgress(bytesWritten, contentLength, bytesWritten == contentLength); - } - }; - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ProgressResponseBody.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ProgressResponseBody.java deleted file mode 100644 index ca0fba52..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/ProgressResponseBody.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -import com.squareup.okhttp.MediaType; -import com.squareup.okhttp.ResponseBody; - -import java.io.IOException; - -import okio.Buffer; -import okio.BufferedSource; -import okio.ForwardingSource; -import okio.Okio; -import okio.Source; - -public class ProgressResponseBody extends ResponseBody { - - public interface ProgressListener { - void update(long bytesRead, long contentLength, boolean done); - } - - private final ResponseBody responseBody; - private final ProgressListener progressListener; - private BufferedSource bufferedSource; - - public ProgressResponseBody(ResponseBody responseBody, ProgressListener progressListener) { - this.responseBody = responseBody; - this.progressListener = progressListener; - } - - @Override - public MediaType contentType() { - return responseBody.contentType(); - } - - @Override - public long contentLength() throws IOException { - return responseBody.contentLength(); - } - - @Override - public BufferedSource source() throws IOException { - if (bufferedSource == null) { - bufferedSource = Okio.buffer(source(responseBody.source())); - } - return bufferedSource; - } - - private Source source(Source source) { - return new ForwardingSource(source) { - long totalBytesRead = 0L; - - @Override - public long read(Buffer sink, long byteCount) throws IOException { - long bytesRead = super.read(sink, byteCount); - // read() returns the number of bytes read, or -1 if this source is exhausted. - totalBytesRead += bytesRead != -1 ? bytesRead : 0; - progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1); - return bytesRead; - } - }; - } -} - - diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/StringUtil.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/StringUtil.java deleted file mode 100644 index 4736faca..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/StringUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api; - -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2018-01-29T10:16:56.409+05:30") -public class StringUtil { - /** - * Check if the given array contains the given value (with case-insensitive comparison). - * - * @param array The array - * @param value The value to search - * @return true if the array contains the value - */ - public static boolean containsIgnoreCase(String[] array, String value) { - for (String str : array) { - if (value == null && str == null) return true; - if (value != null && value.equalsIgnoreCase(str)) return true; - } - return false; - } - - /** - * Join an array of strings with the given separator. - *

- * Note: This might be replaced by utility method from commons-lang or guava someday - * if one of those libraries is added as dependency. - *

- * - * @param array The array of strings - * @param separator The separator - * @return the resulting string - */ - public static String join(String[] array, String separator) { - int len = array.length; - if (len == 0) return ""; - - StringBuilder out = new StringBuilder(); - out.append(array[0]); - for (int i = 1; i < len; i++) { - out.append(separator).append(array[i]); - } - return out.toString(); - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/ApiKeyAuth.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/ApiKeyAuth.java deleted file mode 100644 index bf99e9c8..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/ApiKeyAuth.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api.auth; - -import org.wso2.client.api.Pair; - -import java.util.Map; -import java.util.List; - -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2018-01-29T10:16:56.409+05:30") -public class ApiKeyAuth implements Authentication { - private final String location; - private final String paramName; - - private String apiKey; - private String apiKeyPrefix; - - public ApiKeyAuth(String location, String paramName) { - this.location = location; - this.paramName = paramName; - } - - public String getLocation() { - return location; - } - - public String getParamName() { - return paramName; - } - - public String getApiKey() { - return apiKey; - } - - public void setApiKey(String apiKey) { - this.apiKey = apiKey; - } - - public String getApiKeyPrefix() { - return apiKeyPrefix; - } - - public void setApiKeyPrefix(String apiKeyPrefix) { - this.apiKeyPrefix = apiKeyPrefix; - } - - @Override - public void applyToParams(List queryParams, Map headerParams) { - if (apiKey == null) { - return; - } - String value; - if (apiKeyPrefix != null) { - value = apiKeyPrefix + " " + apiKey; - } else { - value = apiKey; - } - if ("query".equals(location)) { - queryParams.add(new Pair(paramName, value)); - } else if ("header".equals(location)) { - headerParams.put(paramName, value); - } - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/Authentication.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/Authentication.java deleted file mode 100644 index fd79b96f..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/Authentication.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api.auth; - -import org.wso2.client.api.Pair; - -import java.util.Map; -import java.util.List; - -public interface Authentication { - /** - * Apply authentication settings to header and query params. - * - * @param queryParams List of query parameters - * @param headerParams Map of header parameters - */ - void applyToParams(List queryParams, Map headerParams); -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/HttpBasicAuth.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/HttpBasicAuth.java deleted file mode 100644 index 3d01426a..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/HttpBasicAuth.java +++ /dev/null @@ -1,66 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api.auth; - -import org.wso2.client.api.Pair; - -import com.squareup.okhttp.Credentials; - -import java.util.Map; -import java.util.List; - -import java.io.UnsupportedEncodingException; - -public class HttpBasicAuth implements Authentication { - private String username; - private String password; - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - @Override - public void applyToParams(List queryParams, Map headerParams) { - if (username == null && password == null) { - return; - } - headerParams.put("Authorization", Credentials.basic( - username == null ? "" : username, - password == null ? "" : password)); - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/OAuth.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/OAuth.java deleted file mode 100644 index 2f8549e2..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/OAuth.java +++ /dev/null @@ -1,51 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api.auth; - -import org.wso2.client.api.Pair; - -import java.util.Map; -import java.util.List; - -@javax.annotation.Generated(value = "class io.swagger.codegen.languages.JavaClientCodegen", date = "2018-01-29T10:16:56.409+05:30") -public class OAuth implements Authentication { - private String accessToken; - - public String getAccessToken() { - return accessToken; - } - - public void setAccessToken(String accessToken) { - this.accessToken = accessToken; - } - - @Override - public void applyToParams(List queryParams, Map headerParams) { - if (accessToken != null) { - headerParams.put("Authorization", "Bearer " + accessToken); - } - } -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/OAuthFlow.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/OAuthFlow.java deleted file mode 100644 index a393af82..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/main/java/org/wso2/client/api/auth/OAuthFlow.java +++ /dev/null @@ -1,30 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api.auth; - -public enum OAuthFlow { - accessCode, implicit, password, application -} diff --git a/apps/AppDevelopmentAPI_v1.0.0_java/src/test/java/org/wso2/client/api/AppDevelopmentAPI/DefaultApiTest.java b/apps/AppDevelopmentAPI_v1.0.0_java/src/test/java/org/wso2/client/api/AppDevelopmentAPI/DefaultApiTest.java deleted file mode 100644 index 748c1073..00000000 --- a/apps/AppDevelopmentAPI_v1.0.0_java/src/test/java/org/wso2/client/api/AppDevelopmentAPI/DefaultApiTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * AppDevelopmentAPI - * - * - * OpenAPI spec version: v1.0.0 - * - * - * NOTE: This class is auto generated by the swagger code generator program. - * https://github.com/swagger-api/swagger-codegen.git - * Do not edit the class manually. - * - * 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 org.wso2.client.api.AppDevelopmentAPI; - -import org.wso2.client.api.ApiException; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * API tests for DefaultApi - */ -public class DefaultApiTest { - - private final DefaultApi api = new DefaultApi(); - - - /** - * - * - * - * - * @throws ApiException - * if the Api call fails - */ - @Test - public void getMockGetTest() throws ApiException { - // api.getMockGet(); - - // TODO: test validations - } - -} diff --git a/apps/Backend-For-Scenario1/README.md b/apps/Backend-For-Scenario1/README.md deleted file mode 100644 index 84ef1e7f..00000000 --- a/apps/Backend-For-Scenario1/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Backend for Scenario 1 - -Source is taken from [sample-back-end](https://github.com/wso2/product-apim/tree/2.x/sample-scenarios/backend) \ No newline at end of file diff --git a/apps/Backend-For-Scenario1/pom.xml b/apps/Backend-For-Scenario1/pom.xml deleted file mode 100644 index 401940ea..00000000 --- a/apps/Backend-For-Scenario1/pom.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - org.wso2 - wso2 - 1 - - org.wso2.scenario1 - 1.0.0 - 4.0.0 - war - Back end Service - - - sample-data-backend - - - maven-compiler-plugin - - 1.7 - 1.7 - - - - - - - - wso2-nexus - WSO2 internal Repository - http://maven.wso2.org/nexus/content/groups/wso2-public/ - - true - daily - ignore - - - - - - - wso2.releases - WSO2 Releases Repository - http://maven.wso2.org/nexus/content/repositories/releases/ - - true - daily - ignore - - - - - wso2.snapshots - WSO2 Snapshot Repository - http://maven.wso2.org/nexus/content/repositories/snapshots/ - - true - daily - - - false - - - - - wso2-nexus - WSO2 internal Repository - http://maven.wso2.org/nexus/content/groups/wso2-public/ - - true - daily - ignore - - - - - org.wso2.scenario1.samples.backend - - - org.springframework - spring-context - 3.2.0.RELEASE - - - org.springframework - spring-web - 3.2.0.RELEASE - - - org.springframework - spring-webmvc - 3.2.0.RELEASE - - - org.apache.cxf - cxf-rt-frontend-jaxrs - 3.1.7 - - - org.apache.cxf - cxf-rt-transports-http - 3.1.7 - - - commons-httpclient - commons-httpclient - 3.1 - - - javax.ws.rs - javax.ws.rs-api - 2.1 - - - org.codehaus.jackson - jackson-jaxrs - 1.9.12 - - - commons-codec.wso2 - commons-codec - 1.4.0.wso2v1 - - - com.googlecode.json-simple - json-simple - 1.1.1 - - - diff --git a/apps/Backend-For-Scenario1/src/main/java/server/obj/Employee.java b/apps/Backend-For-Scenario1/src/main/java/server/obj/Employee.java deleted file mode 100644 index 60b7b36b..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/obj/Employee.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.obj; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Employee") -public class Employee { - private int id; - private String name; - - public long getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/obj/Mobile.java b/apps/Backend-For-Scenario1/src/main/java/server/obj/Mobile.java deleted file mode 100644 index 1387f055..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/obj/Mobile.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.obj; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Mobile") -public class Mobile { - - - private int id; - private String brand; - private String model; - private double price; - - public long getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getBrand() { - return brand; - } - - public void setBrand(String brand) { - this.brand = brand; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public double getPrice() { - return price; - } - - public void setPrice(double price) { - this.price = price; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/obj/Pouch.java b/apps/Backend-For-Scenario1/src/main/java/server/obj/Pouch.java deleted file mode 100644 index 4f2a5ead..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/obj/Pouch.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.obj; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Pouch") -public class Pouch { - - private int id; - private String brand; - private String model; - private double price; - - public long getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getBrand() { - return brand; - } - - public void setBrand(String brand) { - this.brand = brand; - } - - public String getModel() { - return model; - } - - public void setModel(String model) { - this.model = model; - } - - public double getPrice() { - return price; - } - - public void setPrice(double price) { - this.price = price; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/obj/Promo.java b/apps/Backend-For-Scenario1/src/main/java/server/obj/Promo.java deleted file mode 100644 index 9282332d..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/obj/Promo.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.obj; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Promo") -public class Promo { - - private int id; - private String name; - - public long getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/obj/Salary.java b/apps/Backend-For-Scenario1/src/main/java/server/obj/Salary.java deleted file mode 100644 index 36e5db4a..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/obj/Salary.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.obj; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Salary") -public class Salary { - - private long id; - private long fixed; - private long allowance; - private String empId; - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public long getFixed() { - return fixed; - } - - public void setFexed(long fixed) { - this.fixed = fixed; - } - - public long getAllowance() { - return allowance; - } - - public void setAllowance(long allowance) { - this.allowance = allowance; - } - - public String getEmpId() { - return empId; - } - - public void setEmpId(String empId) { - this.empId = empId; - } - -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/obj/Stock.java b/apps/Backend-For-Scenario1/src/main/java/server/obj/Stock.java deleted file mode 100644 index ea8e29e0..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/obj/Stock.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.obj; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Stock") -public class Stock { - private int id; - private String name; - - public long getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/obj/Task.java b/apps/Backend-For-Scenario1/src/main/java/server/obj/Task.java deleted file mode 100644 index 42711601..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/obj/Task.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.obj; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement(name = "Task") -public class Task { - - private int id; - private String name; - private String duration; - - public long getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDuration() { - return duration; - } - - public void setDuration(String duration) { - this.duration = duration; - } - -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/service/EmployeeService.java b/apps/Backend-For-Scenario1/src/main/java/server/service/EmployeeService.java deleted file mode 100644 index 08a548d9..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/service/EmployeeService.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.service; - -import server.obj.Employee; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; - -@Path("/employeeservice/") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public class EmployeeService { - - Map employeeMap = new HashMap(); - - public EmployeeService() { - init(); - } - - public void init() { - - Employee employeeOne = new Employee(); - employeeOne.setId(1); - employeeOne.setName("Alvin Reyes"); - - Employee employeeTwo = new Employee(); - employeeTwo.setId(2); - employeeTwo.setName("Rachelle Ann"); - - employeeMap.put("1", employeeOne); - employeeMap.put("2", employeeTwo); - - } - - @GET - @Path("/employee/{id}/") - public Employee getEmployee(@PathParam("id") String id, - @Context HttpHeaders headers) { - Employee employee = employeeMap.get(id); - return employee; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/service/MobilePriceService.java b/apps/Backend-For-Scenario1/src/main/java/server/service/MobilePriceService.java deleted file mode 100644 index 20e7bffa..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/service/MobilePriceService.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.service; - -import server.obj.Mobile; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; - -@Path("/mobilepriceservice/") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public class MobilePriceService { - - Map mobileMap = new HashMap<>(); - - public MobilePriceService() { - init(); - } - - public void init() { - - Mobile mobileOne = new Mobile(); - mobileOne.setId(1); - mobileOne.setBrand("iPhone"); - mobileOne.setModel("6"); - mobileOne.setPrice(900); - - Mobile mobileTwo = new Mobile(); - mobileTwo.setId(2); - mobileTwo.setBrand("iPhone"); - mobileTwo.setModel("6s"); - mobileTwo.setPrice(1000); - - Mobile mobileThree = new Mobile(); - mobileThree.setId(2); - mobileThree.setBrand("iPhone"); - mobileThree.setModel("6s plus"); - mobileThree.setPrice(1500); - - mobileMap.put("1", mobileOne); - mobileMap.put("2", mobileTwo); - mobileMap.put("3", mobileThree); - - } - - @GET - @Path("/mobile/{id}/") - public Mobile getMobile(@PathParam("id") String id, @Context HttpHeaders headers) { - Mobile mobile = mobileMap.get(id); - return mobile; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/service/PouchPriceService.java b/apps/Backend-For-Scenario1/src/main/java/server/service/PouchPriceService.java deleted file mode 100644 index 55f4f4e1..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/service/PouchPriceService.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.service; - -import server.obj.Pouch; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; - -@Path("/pouchpriceservice/") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public class PouchPriceService { - - Map pouchMap = new HashMap<>(); - - public PouchPriceService() { - init(); - } - - public void init() { - - Pouch pouchOne = new Pouch(); - pouchOne.setId(1); - pouchOne.setBrand("iPhone"); - pouchOne.setModel("6"); - pouchOne.setPrice(90); - - Pouch pouchTwo = new Pouch(); - pouchTwo.setId(2); - pouchTwo.setBrand("iPhone"); - pouchTwo.setModel("6s"); - pouchTwo.setPrice(100); - - Pouch pouchThree = new Pouch(); - pouchThree.setId(2); - pouchThree.setBrand("iPhone"); - pouchThree.setModel("6s plus"); - pouchThree.setPrice(100); - - pouchMap.put("1", pouchOne); - pouchMap.put("2", pouchTwo); - pouchMap.put("3", pouchThree); - - } - - @GET - @Path("/pouch/{id}/") - public Pouch getPouch(@PathParam("id") String id, @Context HttpHeaders headers) { - Pouch pouch = pouchMap.get(id); - return pouch; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/service/PromoService.java b/apps/Backend-For-Scenario1/src/main/java/server/service/PromoService.java deleted file mode 100644 index 7bbb8661..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/service/PromoService.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.service; - -import server.obj.Promo; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; - -@Path("/promoservice/") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public class PromoService { - - Map promoMap = new HashMap<>(); - - public PromoService() { - init(); - } - - public void init() { - - Promo promoOne = new Promo(); - promoOne.setId(1); - promoOne.setName("10 % discount from 24th Nov to 30th Nov."); - - Promo promoTwo = new Promo(); - promoTwo.setId(2); - promoTwo.setName("But a Nokia phone and get a pouch free."); - - promoMap.put("1", promoOne); - promoMap.put("2", promoTwo); - - } - - @GET - @Path("/promo/{id}/") - public Promo getPromo(@PathParam("id") String id, @Context HttpHeaders headers) { - Promo promo = promoMap.get(id); - return promo; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/service/SalaryService.java b/apps/Backend-For-Scenario1/src/main/java/server/service/SalaryService.java deleted file mode 100644 index c30ad50d..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/service/SalaryService.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.service; - -import server.obj.Salary; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; - -@Path("/salaryservice/") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public class SalaryService { - - Map salaryMap = new HashMap<>(); - - public SalaryService() { - init(); - } - - public void init() { - - Salary employeeSalaryOne = new Salary(); - employeeSalaryOne.setId(1); - employeeSalaryOne.setFexed(8000); - employeeSalaryOne.setAllowance(3000); - employeeSalaryOne.setEmpId("1"); - - Salary employeeSalaryTwo = new Salary(); - employeeSalaryTwo.setId(2); - employeeSalaryTwo.setFexed(10000); - employeeSalaryTwo.setAllowance(5000); - employeeSalaryTwo.setEmpId("2"); - - salaryMap.put("1", employeeSalaryTwo); - salaryMap.put("2", employeeSalaryTwo); - - } - - @GET - @Path("/salary/{id}/") - public Salary getEmployeeSalary(@PathParam("id") String id, - @Context HttpHeaders headers) { - Salary salary = salaryMap.get(id); - return salary; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/service/StockService.java b/apps/Backend-For-Scenario1/src/main/java/server/service/StockService.java deleted file mode 100644 index ca500826..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/service/StockService.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.service; - -import server.obj.Mobile; -import server.obj.Stock; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@Path("/stockservice/") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public class StockService { - - Map mobileListOne = new HashMap<>(); - Map mobileListTwo = new HashMap<>(); - - public StockService() { - init(); - } - - public void init() { - - Mobile mobileOne = new Mobile(); - mobileOne.setId(1); - mobileOne.setBrand("iPhone"); - mobileOne.setModel("6"); - mobileOne.setPrice(900); - - Mobile mobileTwo = new Mobile(); - mobileTwo.setId(2); - mobileTwo.setBrand("iPhone"); - mobileTwo.setModel("6s"); - mobileTwo.setPrice(1000); - - Mobile mobileThree = new Mobile(); - mobileThree.setId(2); - mobileThree.setBrand("iPhone"); - mobileThree.setModel("6s plus"); - mobileThree.setPrice(1500); - - this.mobileListOne.put("1", mobileOne); - this.mobileListOne.put("2", mobileTwo); - - Stock phoneThree = new Stock(); - phoneThree.setId(1); - phoneThree.setName("iPhone 6s"); - - Stock phoneFour = new Stock(); - phoneFour.setId(2); - phoneFour.setName("iPhone 6s"); - - Stock phoneFive = new Stock(); - phoneFive.setId(2); - phoneFive.setName("iPhone 6s"); - this.mobileListTwo.put("1", mobileThree); - } - - @GET - @Path("/stock/{id}/") - public int getAvailableStockCount(@PathParam("id") String id, - @Context HttpHeaders headers) { - int count = 0; - if (Objects.equals(id, "1")) { - count = mobileListOne.size(); - } else if (Objects.equals(id, "2")) { - count = mobileListTwo.size(); - } - return count; - } -} diff --git a/apps/Backend-For-Scenario1/src/main/java/server/service/TaskService.java b/apps/Backend-For-Scenario1/src/main/java/server/service/TaskService.java deleted file mode 100644 index ccd6b466..00000000 --- a/apps/Backend-For-Scenario1/src/main/java/server/service/TaskService.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 server.service; - -import server.obj.Task; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import java.util.HashMap; -import java.util.Map; - -@Path("/taskservice/") -@Consumes(MediaType.APPLICATION_JSON) -@Produces(MediaType.APPLICATION_JSON) -public class TaskService { - - Map taskMap = new HashMap<>(); - - public TaskService() { - init(); - } - - public void init() { - - Task taskOne = new Task(); - taskOne.setId(1); - taskOne.setName("Clean office floor area"); - taskOne.setDuration("One day"); - - Task taskTwo = new Task(); - taskTwo.setId(2); - taskOne.setName("Fill the printer cartridges"); - taskOne.setDuration("Ten minutes"); - - taskMap.put("1", taskOne); - taskMap.put("2", taskTwo); - - } - - @GET - @Path("/task/{id}/") - public Task getEmployee(@PathParam("id") String id, @Context HttpHeaders headers) { - return taskMap.get(id); - } -} diff --git a/apps/Backend-For-Scenario1/src/main/webapp/WEB-INF/rest-servlet.xml b/apps/Backend-For-Scenario1/src/main/webapp/WEB-INF/rest-servlet.xml deleted file mode 100644 index e6a8480f..00000000 --- a/apps/Backend-For-Scenario1/src/main/webapp/WEB-INF/rest-servlet.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/Backend-For-Scenario1/src/main/webapp/WEB-INF/web.xml b/apps/Backend-For-Scenario1/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index d2b17f1a..00000000 --- a/apps/Backend-For-Scenario1/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - SAmple Data Application - - - org.springframework.web.context.ContextLoaderListener - - - - contextConfigLocation - WEB-INF/rest-servlet.xml - - - - CXFServlet - org.apache.cxf.transport.servlet.CXFServlet - - - - CXFServlet - /* - - - diff --git a/apps/Phone-Service/dependency-reduced-pom.xml b/apps/Phone-Service/dependency-reduced-pom.xml deleted file mode 100644 index 9a5e285f..00000000 --- a/apps/Phone-Service/dependency-reduced-pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - msf4j-service - org.wso2.msf4j - 2.5.2 - ../pom.xml/pom.xml - - 4.0.0 - org.phone - Phone-Service - WSO2 MSF4J Microservice - 0.1-SNAPSHOT - - org.phone.service.Application - - - diff --git a/apps/Phone-Service/pom.xml b/apps/Phone-Service/pom.xml deleted file mode 100644 index 32d0e002..00000000 --- a/apps/Phone-Service/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - org.wso2.msf4j - msf4j-service - 2.5.2 - - 4.0.0 - - org.phone - Phone-Service - 0.1-SNAPSHOT - WSO2 MSF4J Microservice - - - - - - - org.wso2 - org.wso2.client.AppDevelopmentAPI - 1.0.0 - compile - - - - - org.phone.service.Application - - - \ No newline at end of file diff --git a/apps/Phone-Service/src/main/java/org/phone/service/Application.java b/apps/Phone-Service/src/main/java/org/phone/service/Application.java deleted file mode 100644 index bca67a73..00000000 --- a/apps/Phone-Service/src/main/java/org/phone/service/Application.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 org.phone.service; - -import org.wso2.msf4j.MicroservicesRunner; - -/** - * Application entry point. - * - * @since 0.1-SNAPSHOT - */ -public class Application { - public static void main(String[] args) { - new MicroservicesRunner(8081) - .deploy(new PhoneOrder()) - .start(); - } -} diff --git a/apps/Phone-Service/src/main/java/org/phone/service/PhoneOrder.java b/apps/Phone-Service/src/main/java/org/phone/service/PhoneOrder.java deleted file mode 100644 index 9dcb8450..00000000 --- a/apps/Phone-Service/src/main/java/org/phone/service/PhoneOrder.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 org.phone.service; - - -import org.wso2.client.api.ApiClient; -import org.wso2.client.api.ApiException; -import org.wso2.client.api.AppDevelopmentAPI.DefaultApi; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import java.util.logging.Logger; - -/** - * This is the Microservice resource class. - * See https://github.com/wso2/msf4j#getting-started - * for the usage of annotations. - * - * @since 0.1-SNAPSHOT - */ -@Path("/phones") -public class PhoneOrder { - private final static Logger LOGGER = Logger.getLogger(PhoneOrder.class.getName()); - @GET - @Path("/getPhone") - public String get(@QueryParam("serverHost") String serverHost, @QueryParam("accessToken") String accessToken,@QueryParam("serverPort") String serverPort) { - - DefaultApi defaultApi = new DefaultApi(); - ApiClient apiClient = defaultApi.getApiClient(); - apiClient.addDefaultHeader("Accept", "application/json"); - apiClient.addDefaultHeader("Authorization", "Bearer " + accessToken); - apiClient.setBasePath("http://"+serverHost+":"+serverPort+"/getmock/v1.0.0"); - defaultApi.setApiClient(apiClient); - - try { - - String phoneModel = defaultApi.getMockGet(); - if(phoneModel.contains("org.wso2.client.api.ApiResponse")){ - return "The phone you searched is in stock"+phoneModel; - } - - } catch (ApiException e) { - e.printStackTrace(); - LOGGER.info("Encountered an error while invoking the api: "+e); - } - return "Error occured please check the MSF4J Stacktrace"; - - } - - @GET - @Produces("application/json") - @Path("/getMock") - public String get() { - return "{\"Phone available is\" : \"Samsung\"}"; - } - -} diff --git a/apps/events-service/README.md b/apps/events-service/README.md deleted file mode 100644 index d323fc69..00000000 --- a/apps/events-service/README.md +++ /dev/null @@ -1,6 +0,0 @@ -#events-service - -##Description -This is a ms4fj service and this provides two operations to collect and retrieve events which are published from apim-manager when an api Life-Cycle change is happened - -This is used in scenario04. diff --git a/apps/events-service/dependency-reduced-pom.xml b/apps/events-service/dependency-reduced-pom.xml deleted file mode 100644 index c4c2b22a..00000000 --- a/apps/events-service/dependency-reduced-pom.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - msf4j-service - org.wso2.msf4j - 2.5.2 - ../pom.xml/pom.xml - - 4.0.0 - org.apim.lctest - events-service - API LifeCycle Event Service - 0.1-SNAPSHOT - - org.apim.lctest.Application - - - diff --git a/apps/events-service/pom.xml b/apps/events-service/pom.xml deleted file mode 100644 index 40e4a395..00000000 --- a/apps/events-service/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - org.wso2.msf4j - msf4j-service - 2.5.2 - - 4.0.0 - - org.apim.lctest - events-service - 0.1-SNAPSHOT - API LifeCycle Event Service - - - - - - - com.fasterxml.jackson.core - jackson-annotations - 2.9.2 - - - - - org.apim.lctest.Application - - - \ No newline at end of file diff --git a/apps/events-service/src/main/java/org/apim/lctest/Application.java b/apps/events-service/src/main/java/org/apim/lctest/Application.java deleted file mode 100644 index ea9c48f2..00000000 --- a/apps/events-service/src/main/java/org/apim/lctest/Application.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 org.apim.lctest; - -import org.wso2.msf4j.MicroservicesRunner; - -/** - * Application entry point. - * - * @since 0.1-SNAPSHOT - */ -public class Application { - public static void main(String[] args) { - new MicroservicesRunner(8080) - .deploy(new LCService()) - .start(); - } -} diff --git a/apps/events-service/src/main/java/org/apim/lctest/LCService.java b/apps/events-service/src/main/java/org/apim/lctest/LCService.java deleted file mode 100644 index ccf162cb..00000000 --- a/apps/events-service/src/main/java/org/apim/lctest/LCService.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2016, WSO2 Inc. (http://wso2.com) All Rights Reserved. - * - * 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 org.apim.lctest; - -import org.apim.lctest.util.model.Event; - -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Response; - -/** - * This is the Microservice resource class. - * See https://github.com/wso2/msf4j#getting-started - * for the usage of annotations. - * - * @since 0.1-SNAPSHOT - */ -@Path("/eventservice") -public class LCService { - - private String apiName=null; - private String apiVerion=null; - private String fromState = null; - private String toState = null; - - @GET - @Produces("application/json") - @Path("/") - public Response get() { - System.out.println("GET invoked"); - String response = "{\"apiName\":\""+apiName+"\",\"apiVersion\":\""+apiVerion+"\",\"fromState\":\""+ - fromState+"\",\"toState\":\""+toState+"\"}"; - return Response.status(Response.Status.OK).entity(response).build(); - } - - @POST - @Consumes("text/xml") - @Path("/") - public Response post(Event event) { - System.out.println("POST invoked"); - String response = event.getMessage(); - - String[] splitText = response.split("resource at ")[1].split("/"); - apiName = splitText[7]; - apiVerion = splitText[8]; - String[] splitStates = response.split("resource at ")[0].split("'"); - fromState = splitStates[1]; - toState = splitStates[3]; - - return Response.status(Response.Status.OK).entity(apiName+", "+apiVerion+", "+fromState+", "+toState).build(); - } - - @PUT - @Path("/") - public void put() { - System.out.println("PUT invoked"); - } - - @DELETE - @Path("/") - public void delete() { - System.out.println("DELETE invoked"); - } -} diff --git a/apps/events-service/src/main/java/org/apim/lctest/util/model/Event.java b/apps/events-service/src/main/java/org/apim/lctest/util/model/Event.java deleted file mode 100644 index 41148964..00000000 --- a/apps/events-service/src/main/java/org/apim/lctest/util/model/Event.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * - * [APILifeCycle] The LifeCycle State Changed from 'Prototyped' to 'Published' for resource at /_system/governance/apimgt/applicationdata/provider/admin/TestAPI3/1.0/api.2018-01-13T00:43:22.363+0530/_system/governanceadmin-1234/_system/governance/apimgt/applicationdata/provider/admin/TestAPI3/1.0/apiLifeCycleStateChangedunknownAPILifeCyclePrototypedPublished192.168.8.101WSO2 API Manager2.1.0Mac OS X10.13.1x86_64cjayawardenaLKenAsia/ColomboOracle Corporation1.8.0_152Java HotSpot(TM) 64-Bit Server VM25.152-b16 - */ - -package org.apim.lctest.util.model; - -import com.fasterxml.jackson.annotation.JsonRootName; - -import java.io.Serializable; -import java.util.UUID; -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlAttribute; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - - -@XmlAccessorType(XmlAccessType.FIELD) -@XmlRootElement(namespace = "http://wso2.org/ns/2011/01/eventing/registry/event", name="Event") -public class Event implements Serializable { - - private String id = UUID.randomUUID().toString(); - private long dateAdded = System.currentTimeMillis(); - - @XmlElement(required = true,namespace = "http://wso2.org/ns/2011/01/eventing/registry/event") - private String Message; - - public Event(){} - - public Event(String Message){ - this.Message = Message; - } - - public String getMessage() { - return Message; - } - - public void setMessage(String Message) { - Message = Message; - } - -} diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 00000000..b2735037 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,13 @@ +const resolvePlugin = [ + ["module-resolver", { + "alias": { + "@support": "./cypress/support", + "@fixtures": "./cypress/fixtures" + } + }] + ] +module.exports = { + presets: ['@babel/preset-env'], + plugins: ['@babel/transform-runtime', ...resolvePlugin] + } + \ No newline at end of file diff --git a/cleanup.sh b/cleanup.sh deleted file mode 100644 index 638a68c5..00000000 --- a/cleanup.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -#TODO: compete the script when TestGrid implements support for this - -set -e - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -keyName=qaKey -sgId=sg-19b31c52 -instanceId=i-0223b0cef006319d4 - -echo "Destroying additionally created infrastructure..." - -# Destroy the EC2 instance -instanceState=$(aws ec2 terminate-instances --instance-ids $instanceId --query 'TerminatingInstances[0].CurrentState.Name' | cut -d '"' -f2) -counter=1 -while [ $instanceState != "terminated" -a $counter -lt 10 ]; do - sleep 15 - instanceState=$(aws ec2 terminate-instances --instance-ids $instanceId --query 'TerminatingInstances[0].CurrentState.Name' | cut -d '"' -f2) - counter=$((counter+1)) -done -sleep 30 - -# Delete the securty group, generated key pairs -aws ec2 delete-security-group --group-id $sgId -aws ec2 delete-key-pair --key-name $keyName -rm -f $scriptPath/key.pem diff --git a/config-sets/config01/README.txt b/config-sets/config01/README.txt deleted file mode 100644 index d28e1248..00000000 --- a/config-sets/config01/README.txt +++ /dev/null @@ -1,30 +0,0 @@ -Name : config01 -Description -Config changes required for adding custom lifecycle state -Prerequisite -1. Updaed LifeCycle section in registry to add new section[A] for custom LC state. -2. Also update the above by adding line to PUBLISHED state in the same section. - -[A] - - - - - - - - - - - - - - - - - - - -3. Copy locale_default.jason file. - a. copy locale_default.json file to /repository/deployment/server/jaggeryapps/publisher/site/conf/locales/jaggery/ directory. - b. Restart the server diff --git a/config-sets/config01/config.sh b/config-sets/config01/config.sh deleted file mode 100644 index d826ff51..00000000 --- a/config-sets/config01/config.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/bash -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -productHome=$productHome -filePath=repository/deployment/server/jaggeryapps/publisher/site/conf/locales/jaggery/ - -prgdir=$(dirname "$0") -configDir=$(cd "$prgdir"; pwd) - -#copy config files -cp $configDir/files/locale_default.json $productHome/$filePath -cd $productHome/bin - -#verify file copy status and exit on failure -statusval=$? -if [ $statusval -eq 0 ]; then - echo "file copying success!" - #stop the server - echo "shutting down the server now..." - sh wso2server.sh stop -else - echo "file copy command failed..." - exit 1 -fi -#wait till server stops -y=0; -retry_count1=20; -while true -do -echo $(date)" Waiting until server stops" -#mystatus=$(curl -s -w '%{http_code}' https://localhost:9443/carbon -k ) -if curl -s -w '%{http_code}' https://localhost:9443/carbon -k | grep "000" -then - echo "Carbon server stopped...!" - break -else - echo "Carbon server is still running..." - if [ $y = $retry_count1 ]; then - echo "Couldn't stop the server" - exit 1 - fi -fi -x=$((x+1)) -sleep 1 -done -#wait few seconds to finish with server-stop -sleep 3 -#start back the server -echo "server starting..." -sh wso2server.sh start -#wait till server starts -x=0; -retry_count=20; -while true -do -echo $(date)" waiting until server starts..." -#STATUS=$(curl -s http://scriptuser:scriptuser@localhost:8080/manager/text/list | grep ${appName}) -if curl -s -w '%{http_code}' https://localhost:9443/carbon -k | grep "302" -then - echo "found server running..." - echo "configurations Done...!" - exit 0 -else - echo "carbon server not running..." - if [ $x = $retry_count ]; then - echo "Couldn't start the server" - exit 1 - fi -fi -x=$((x+1)) -sleep 2 -done diff --git a/config-sets/config01/files/locale_default.json b/config-sets/config01/files/locale_default.json deleted file mode 100644 index 47b039aa..00000000 --- a/config-sets/config01/files/locale_default.json +++ /dev/null @@ -1,611 +0,0 @@ -{ - "Public : The API is accessible to everyone and can be advertised in multiple stores - a central store and/or non-WSO2 stores.
Restricted by roles : The API is visible only to specific user roles in the tenant store that you specify.": "Public : The API is accessible to everyone and can be advertised in multiple stores - a central store and/or non-WSO2 stores.
Restricted by roles : The API is visible only to specific user roles in the tenant store that you specify.", - "Same as API visibility: Visible to the same user roles who can see the API.
Visible to my Domain : Visible to all registered users in the API's tenant domain.
Private: Visible only to the API creator's role.": "Same as API visibility: Visible to the same user roles who can see the API.
Visible to my Domain : Visible to all registered users in the API's tenant domain.
Private: Visible only to the API creator's role.", - "A REST API endpoint based on a URI template": "A REST API endpoint based on a URI template", - "A list of error codes. If these error codes are received from the endpoint, the endpoint will be suspended.": "A list of error codes. If these error codes are received from the endpoint, the endpoint will be suspended.", - "A list of error codes. If these error codes are received from the endpoint, the request will be subjected to a timeout.": "A list of error codes. If these error codes are received from the endpoint, the request will be subjected to a timeout.", - "reject": "Rejected", - "A session management method.":"A session management method.", - "API": "API", - "API Created By": "API Created By", - "API Definition": "API Definition", - "API Definition for Swagger will not be overridden with the changes you do to the API.": "API Definition for Swagger will not be overridden with the changes you do to the API.", - "API Last Access Times": "API Last Access Times", - "API Last Access Times (Across All Versions)": "API Last Access Times (Across All Versions)", - "API Latency": "API Latency", - "API Latency BreakDown": "API Latency BreakDown", - "API List": "API List", - "API Name": "API Name", - "API Publisher": "API Publisher", - "API Publisher - Error": "API Publisher - Error", - "API Request Count with Throttling Tiers": "API Request Count with Throttling Tiers", - "API Resources": "API Resources", - "API Response Times": "API Response Times", - "API Response Times (Across All Versions)": "API Response Times (Across All Versions)", - "API Subscription Over Time": "API Subscription Over Time", - "API Subscriptions": "API Subscriptions", - "API Subscriptions by Versions": "API Subscriptions by Versions", - "API Throttled Out Requests": "API Throttled Out Requests", - "API Throttled Requests": "API Throttled Requests", - "API Thumbnail": "API Thumbnail", - "API Usage": "API Usage", - "API Usage Across Geo Locations": "API Usage Across Geo Locations", - "API Usage Across Usage Agent": "API Usage Across Usage Agent", - "API Usage Comparison": "API Usage Comparison", - "API Usage Comparison (Across All Versions)": "API Usage Comparison (Across All Versions)", - "API Usage by Destination": "API Usage by Destination", - "API Usage by Resource Path": "API Usage by Resource Path", - "API Usage by Versions": "API Usage by Versions", - "API Walkthrough": "API Walkthrough", - "API does not exist": "API does not exist", - "API specific mediation policies": "API specific mediation policies", - "APIs": "APIs", - "APIs By Provider -": "APIs By Provider -", - "AbnormalRefreshAlert_Desc": "This alert type gets triggered if there is a change in the pattern of renewing access tokens of an application by a user. These alerts could be treated as an indication of a stolen access token.", - "AbnormalTierUsage": "Abnormal API Usage", - "AbnormalTierUsage_Desc": "This alert gets triggered if there is a drastic reduction in API usage for a given API for a given user. These types of alerts should be treated as an indication of a failure of the application using the altered API.", - "Access Control Allow": "Access Control Allow", - "Access Control Allow ": "Access Control Allow ", - "Access Control Allow Origins": "Access Control Allow Origins", - "Actions": "Actions", - "Active Subscriptions": "Active Subscriptions", - "Add": "Add", - "Add Document": "Add Document", - "Add New API": "Add New API", - "Add New Certificate": "Add New Certificate", - "Add New Document": "Add New Document", - "Add Parameter": "Add Parameter", - "Add Resource": "Add Resource", - "Add Scopes": "Add Scopes", - "Address Endpoint": "Address Endpoint", - "Address endpoint does not support URI templates.": "Address endpoint does not support URI templates.", - "Advanced Endpoint Configuration": "Advanced Endpoint Configuration", - "Advanced Options": "Advanced Options", - "Advanced Throttling Policies": "Advanced Throttling Policies", - "Algorithm": "Algorithm", - "Alias": "Alias", - "Alias exists in trust store": "Alias exists in trust store", - "Alias should not be empty": "Alias should not be empty", - "All": "All", - "All APIs": "All APIs", - "All Allow Origins": "All Allow Origins", - "Allow": "Allow", - "Analytics": "Analytics", - "Any": "Any", - "App Registrations": "App Registrations", - "App Throttled Out Requests": "App Throttled Out Requests", - "App Throttled Requests": "App Throttled Requests", - "Application": "Application", - "Application & Application User": "Application & Application User", - "Application Throttled Out Requests": "Application Throttled Out Requests", - "Application User": "Application User", - "Application_User": "Application_User", - "Applications": "Applications", - "Applications Created Over Time": "Applications Created Over Time", - "Apply Changes": "Apply Changes", - "Apply per Resource": "Apply per Resource", - "Apply to API": "Apply to API", - "Auth Type": "Auth Type", - "Available to all the tenants": "Available to all the tenants", - "Available to current tenant only": "Available to current tenant only", - "Available to specific tenants": "Available to specific tenants", - "Basic Auth": "Basic Auth", - "Browse": "Browse", - "Browse API": "Browse API", - "Business Information": "Business Information", - "Business Owner": "Business Owner", - "Business Owner Email": "Business Owner Email", - "By API Name [Default] or": "By API Name [Default] or", - "By API Provider [Syntax - provider:xxxx ] or": "By API Provider [Syntax - provider:xxxx ] or", - "By API Version [Syntax - version:xxxx ] or": "By API Version [Syntax - version:xxxx ] or", - "By Context [Syntax - context:xxxx ] or ": "By Context [Syntax - context:xxxx ] or ", - "By Description [Syntax - description:xxxx ] or": "By Description [Syntax - description:xxxx ] or", - "By Documentation Content [Syntax - doc:xxxx ] ": "By Documentation Content [Syntax - doc:xxxx ] ", - "By Status [Syntax - status:xxxx ] or ": "By Status [Syntax - status:xxxx ] or ", - "By Subcontext [Syntax - subcontext:xxxx ] ": "By Subcontext [Syntax - subcontext:xxxx ] ", - "CORS configuration": "CORS configuration", - "Cache Timeout (seconds)": "Cache Timeout (seconds)", - "Cancel": "Cancel", - "Cancel all the unsaved changes and close this tab": "Cancel all the unsaved changes and close this tab", - "Certificate": "Certificate", - "Certificate deleted successfully": "Certificate deleted successfully", - "Certificate exists for Alias : Endpoint combination": "Certificate exists for Alias : Endpoint combination", - "Certificate for the endpoint": "Certificate for the endpoint", - "Certificate is added successfully. This will be affect to all the users": "Certificate is added successfully. This will be affect to all the users", - "Certificate is deleted Successfully. This will be affect to all the users.": "Certificate is deleted Successfully. This will be affect to all the users.", - "Change": "Change", - "Change Icon": "Change Icon", - "Check to select a message mediation policy to be executed in the message flow": "Check to select a message mediation policy to be executed in the message flow", - "Class Name for Algorithm": "Class Name for Algorithm", - "Clear": "Clear", - "Click one of the buttons below to get started.": "Click one of the buttons below to get started.", - "Click the button below to get started.": "Click the button below to get started.", - "Click to set custom date range": "Click to set custom date range", - "Close": "Close", - "Comma separated list (e.g.,: tenant1,tenant2,tenant3)": "Comma separated list (e.g.,: tenant1,tenant2,tenant3)", - "Comma-separated list (e.g.: role1,role2,role3)": "Comma-separated list (e.g.: role1,role2,role3)", - "Compare": "Compare", - "Compare to": "Compare to", - "Configurations": "Configurations", - "Congratulations... What's Next?": "Congratulations... What's Next?", - "Connect cancel": "Connect cancel", - "Connect timeout": "Connect timeout", - "Connection Timeout": "Connection Timeout", - "Connection closed": "Connection closed", - "Connection failed": "Connection failed", - "Connection timed out": "Connection timed out", - "Consumes": "Consumes", - "Context": "Context", - "Could not add certificate for Endpoint": "Could not add certificate for Endpoint", - "Could not add certificate for alias": "Could not add certificate for alias", - "Could not add certificate for alias and endpoint": "Could not add certificate for alias and endpoint", - "Create New Version": "Create New Version", - "Created APIs Over Time": "Created APIs Over Time", - "Credentials": "Credentials", - "Current State": "Current State", - "Currently set to version": "Currently set to version", - "Currently set to version : ": "Currently set to version : ", - "DELETE": "DELETE", - "Data Type": "Data Type", - "Date Last Updated": "Date Last Updated", - "Date of User Registration": "Date of User Registration", - "Day": "Day", - "Default API Thumbnail": "Default API Thumbnail", - "Default API Version": "Default API Version", - "Default Version": "Default Version", - "Define Scope": "Define Scope", - "Defines a URI template based REST service endpoint": "Defines a URI template based REST service endpoint", - "Defines groups of endpoints for replicated services.The incoming requests are directed to these endpoints in a round robin manner. These endpoints automatically handle the fail-over cases as well": "Defines groups of endpoints for replicated services.The incoming requests are directed to these endpoints in a round robin manner. These endpoints automatically handle the fail-over cases as well", - "Defines the WSDL, Service and Port": "Defines the WSDL, Service and Port", - "Defines the direct URL of the service": "Defines the direct URL of the service", - "Defines the endpoints that the service will try to connect to in case of a failure. This will take place in a round robin manner": "Defines the endpoints that the service will try to connect to in case of a failure. This will take place in a round robin manner", - "Delete": "Delete", - "Delete Certificate for Alias": "Delete Certificate for Alias", - "Delete Certificate for Endpoint": "Delete Certificate for Endpoint", - "Deny": "Deny", - "Deploy Sample API": "Deploy Sample API", - "Deprecate Old Versions": "Deprecate Old Versions", - "Description": "Description", - "Design": "Design", - "Design API": "Design API", - "Design a New REST API": "Design a New REST API", - "Design a New Websocket API": "Design a New Websocket API", - "Design and prototype a new REST API.": "Design and prototype a new REST API.", - "Design and prototype a new Websocket API.": "Design and prototype a new Websocket API.", - "Destination-Based Usage Tracking": "Destination-Based Usage Tracking", - "Developer Signups": "Developer Signups", - "Developer Signups Over Time": "Developer Signups Over Time", - "Digest Auth": "Digest Auth", - "Dimensions (max): 100 x 100 pixels": "Dimensions (max): 100 x 100 pixels", - "Disabled": "Disabled", - "Discard Changes": "Discard Changes", - "Discard message": "Discard message", - "Display in External Stores": "Display in External Stores", - "Display name to be shown in the API Store.": "Display name to be shown in the API Store.", - "Do you really want to delete the certificate for Endpoint": "Do you really want to delete the certificate for Endpoint", - "Do you really want to delete the certificate for alias": "Do you really want to delete the certificate for alias", - "Docs": "Docs", - "Documentation that is hosted in the system and can be edited directly from the UI": "Documentation that is hosted in the system and can be edited directly from the UI", - "Done": "Done", - "Download": "Download", - "Duration (ms)": "Duration (ms)", - "E.g.,:http://appserver/services/echo?wsdl": "E.g.,:http://appserver/services/echo?wsdl", - "E.g.,:http://example.com/service.wadl": "E.g.,:http://example.com/service.wadl", - "E.g.: role1,role2,role3": "E.g., role1,role2,role3", - "Edit": "Edit", - "Edit API": "Edit API", - "Edit Content": "Edit Content", - "Edit Source": "Edit Source", - "Eg: Read My Data": "E.g., Read My Data", - "Eg: This scope will group all the administration APIs": "E.g., This scope will group all the administration APIs", - "Eg: api_name_read": "E.g., api_name_read", - "Email": "Email", - "Enable API based CORS Configuration": "Enable API based CORS Configuration", - "Enable Message Mediation": "Enable Message Mediation", - "Enable this feature to see a graph (in the Statistics menu ) of the number of requests that leave the API Gateway to destination endpoints (e.g., Load-balanced endpoints).": "Enable this feature to see a graph (in the Statistics menu ) of the number of requests that leave the API Gateway to destination endpoints (e.g., Load-balanced endpoints).", - "Enabled": "Enabled", - "Enabling an API-level policy will apply the selected policy across all resources of the API. The resources level tier selection will be disabled and will not be taken into consideration within a handler if the API-level policy is available": "Enabling an API Level policy will apply the selected policy across all resources of the API. The resources level tier selection will be disabled and will not be taken into consideration within a handler if the API Level Policy is available", - "Enabling the resource level throttling tier will apply the configured limits per resource": "Enabling the resource level throttling tier will apply the configured limits per resource", - "Endpoint": "Endpoint", - "Endpoint Auth Type": "Endpoint Auth Type", - "Endpoint Security Scheme": "Endpoint Security Scheme", - "Endpoint Suspend State": "Endpoint Suspend State", - "Endpoint Timeout State": "Endpoint Timeout State", - "Endpoint Type:": "Endpoint Type:", - "Endpoints": "Endpoints", - "Enter an Alias for the certificate": "Enter an Alias for the certificate", - "Enter the endpoint for the certificate": "Enter the endpoint for the certificate", - "Environment Name": "Environment Name", - "Error Codes": "Error Codes", - "Error occurred while updating the API": "Error occurred while updating the API", - "Execute fault sequence": "Execute fault sequence", - "Existing API definition will be overwritten by the imported definition.": "Existing API definition will be overwritten by the imported definition.", - "Download Source": "Download Source", - "External API Stores": "External API Stores", - "Failed to Publish Environments": "Failed to Publish Environments", - "Failed to UnPublish Environments": "Failed to UnPublish Environments", - "Failed to add Certificate due to an Internal Server Error.": "Failed to add Certificate due to an Internal Server Error.", - "Failed to add Certificate in to Publisher Trust Store. Certificate exists for the Alias": "Failed to add Certificate in to Publisher Trust Store. Certificate exists for the Alias", - "Failed to add Certificate. Certificate Expired": "Failed to add Certificate. Certificate Expired", - "Failed to add Certificate. Certificate for Endpoint exists.": "Failed to add Certificate. Certificate for Endpoint exists.", - "Failed to delete Certificate due to an Internal Server Error.": "Failed to delete Certificate due to an Internal Server Error.", - "Failed to delete the certificate. Certificate could not found for the given alias. Hence the entry is removed from the data base.": "Failed to delete the certificate. Certificate could not found for the given alias. Hence the entry is removed from the data base.", - "Failover": "Failover", - "Failover Endpoint": "Failover Endpoint", - "Failover Group": "Failover Group", - "Fault Flow": "Fault Flow", - "Faulty Invocations": "Faulty Invocations", - "Field contains special characters": "Field contains special characters", - "File": "File", - "Filter APIs": "Filter APIs", - "FrequentTierHittingAlert_Desc": "This alert type gets triggered if at least one of the two cases below satisfied; if a particular application gets throttled out for hitting the subscribed tier limit of that application more than 10 times (by default) within a day (by default) or if a particular user of an application gets throttled out for hitting the subscribed tier limit of a particular API more than 10 times (by default) within a day (by default)", - "Gateway Environments": "Gateway Environments", - "Gateway Failures": "Gateway Failures", - "Gateway URLs": "Gateway URLs", - "Gateways Unchecked": "Since a Gateway environment is not selected, changes will not be done to the Gateways. Do you want to proceed?", - "General Details": "General Details", - "Global mediation policies": "Global mediation policies", - "Go Back": "Go Back", - "Go to API Store": "Go to API Store", - "Go to Overview": "Go to Overview", - "HTTP": "HTTP", - "HTTP Endpoint": "HTTP Endpoint", - "HTTP Verb": "HTTP Verb", - "HTTP is less secure than HTTPS and makes your API vulnerable to security threats.": "HTTP is less secure than HTTPS and makes your API vulnerable to security threats.", - "HTTP protocol violation": "HTTP protocol violation", - "HTTPS": "HTTPS", - "Headers": "Headers", - "Home": "Home", - "Hour": "Hour", - "How To": "How To", - "I Have a SOAP Endpoint": "I Have a SOAP Endpoint", - "I Have an Existing API": "I Have an Existing API", - "If gateway URLs need to be changed, de-select 'Use Defaults' and enter the URLs. If you do not enter a URL, default URLs will be added from the configurations.": "If gateway URLs need to be changed de-select 'Use Defaults' and enter the URLs. If you do not enter a URL default URLs will be added from configurations.", - "Implement": "Implement", - "Implementation Method": "Implementation Method", - "Import": "Import", - "Import API Definition": "Import API Definition", - "In Flow": "In Flow", - "Info!": "Info!", - "Inline": "Inline", - "Intial Duration (Millis)": "Initial Duration (ms)", - "Keep Editing API": "Keep Editing API", - "Last Modified": "Last Modified", - "Leave As-Is": "Leave As-Is", - "Let's get started!": "Let's get started!", - "Lifecycle": "Lifecycle", - "Lifecycle History": "Lifecycle History", - "Limits the total number of calls the API Manager is allowed to make to the backend.": "Limits the total number of calls the API Manager is allowed to make to the backend.", - "Link to documentation is managed by an external configuration management system": "Link to documentation is managed by an external configuration management system", - "Load Balance Endpoint": "Load Balance Endpoint", - "Load Balanced Endpoint": "Load Balanced Endpoint", - "Login": "Login", - "Logout": "Logout", - "Make this the Default version": "Make this the Default version", - "Make this the Default version:": "Make this the Default version:", - "Making an API version the default will allow the subscribers to invoke it without the version attribute in the URI.": "Making an API version the default will allow the subscribers to invoke it without the version attribute in the URI.", - "Manage": "Manage", - "Manage API": "Manage API", - "Manage Alert Types": "Manage Alert Types", - "Manage Certificates": "Manage Certificates", - "Manage Subscriptions": "Manage Subscriptions", - "Manage alert types": "Manage alert types", - "Managed API": "Managed API", - "Marks one API version in a group as the default so that it can be invoked without specifying the version number in the URL. For example, if you mark http://host:port/youtube/2.0 as the default API, requests made to http://host:port/youtube/ are automatically routed to version 2.0. If you mark an unpublished API as the default the previous default, published API will still be used as the default until the new default API is published": "Marks one API version in a group as the default so that it can be invoked without specifying the version number in the URL. For example, if you mark http://host:port/youtube/2.0 as the default API, requests made to http://host:port/youtube/ are automatically routed to version 2.0. If you mark an unpublished API as the default, the previous default published API will still be used as the default until the new default API is published", - "Marks one API version in a group as the default so that it can be invoked without specifying the version number in the URL. For example, if you mark http://host:port/youtube/2.0 as the default API, requests made to http://host:port/youtube/ are automatically routed to version 2.0. If you mark an unpublished API as the default, the previous default published API will still be used as the default until the new default API is published": "Marks one API version in a group as the default so that it can be invoked without specifying the version number in the URL. For example, if you mark http://host:port/youtube/2.0 as the default API, requests made to http://host:port/youtube/ are automatically routed to version 2.0. If you mark an unpublished API as the default, the previous default published API will still be used as the default until the new default API is published", - "Marks one API version in a group as the default so that it can be invoked without specifying the version number in the URL. For example, if you mark http://host:port/youtube/2.0 as the default API, requests made to http://host:port/youtube/ get automatically routed to version 2.0. If you mark an unpublished API as the default while the previously default API was a published one, the users who invoke the default API will still be routed to the previous default version rather than the new one. This is because the new version is not published yet.": "Marks one API version in a group as the default so that it can be invoked without specifying the version number in the URL. For example, if you mark http://host:port/youtube/2.0 as the default API, requests made to http://host:port/youtube/ get automatically routed to version 2.0. If you mark an unpublished API as the default while the previously default API was a published one, the users who invoke the default API will still be routed to the previous default version rather than the new one. This is because the new version is not published yet.", - "Max TPS": "Max TPS", - "Maximum 20000 characters.": "Maximum 20000 characters.", - "Maximum Backend Throughput": "Maximum Backend Throughput", - "Mediation": "Mediation", - "Mediation Policy Upload": "Mediation Policy Upload", - "Message Content": "Message Content", - "Message Mediation Policies": "Message Mediation Policies", - "Message format for the endpoint.": "Message format for the endpoint.", - "Method to optimize the attachments.": "Method to optimize the attachments.", - "Methods": "Methods", - "Modified On": "Modified On", - "Month": "Month", - "My APIs": "My APIs", - "Name": "Name", - "Never timeout": "Never timeout", - "New API...": "New API...", - "New Version": "New Version", - "Next: Implement": "Next: Implement", - "Next: Manage": "Next: Manage", - "No": "No", - "No APIs created yet.": "No APIs created yet.", - "No APIs provided by the user": "No APIs provided by the user", - "No Content": "No Content", - "No Data Available.": "No Data Available.", - "No Lifecycle history can be found for this API.": "No Lifecycle history can be found for this API.", - "No active subscribers": "No active subscribers", - "No default version defined for the current API": "No default version defined for the current API", - "No document content has been added yet.": "No document content has been added yet.", - "No documentation associated with the API": "No documentation associated with the API", - "No matching APIs found.": "No matching APIs found.", - "Non Secured": "Non Secured", - "None": "None", - "Not Configured": "Not Configured", - "Note : Date Range only applies to the hit count.": "Note : Date Range only applies to the hit count.", - "Note: The total time represents the complete time taken to process the request, including the time spent in between the other recorded layers. It is not the aggregate sum of the rest of the recorded matrices.": "Note : The total time represents the complete time taken to process the request, including the time spent in between the other recorded layers. It is not the aggregate sum of the rest of the recorded matrices.", - "Number of API calls": "Number of API calls", - "OK": "OK", - "OPTIONS": "OPTIONS", - "Open": "Open", - "Optimize": "Optimize", - "Origins": "Origins", - "Other": "Other", - "Other (specify)": "Other (specify)", - "Out Flow": "Out Flow", - "Overall API Subscriptions (Across All Versions)": "Overall API Subscriptions (Across All Versions)", - "Overall API Usage (Across All Versions)": "Overall API Usage (Across All Versions)", - "Overview": "Overview", - "POST": "POST", - "Parameter Name": "Parameter Name", - "Parameter Type": "Parameter Type", - "Parameters": "Parameters", - "Password": "Password", - "Please select at least one subscription tier.": "Please select at least one subscription tier.", - "Please select at least one transport.": "Please select at least one transport.", - "Please specify a production or sandbox endpoint.": "Please specify a production or sandbox endpoint.", - "Please use a valid WSDL endpoint": "Please use a valid WSDL endpoint", - "Policy": "Policy", - "Produces": "Produces", - "Production & Sandbox": "Production & Sandbox", - "Production Fail-over Endpoint(s)": "Production Fail-over Endpoint(s)", - "Production Only": "Production Only", - "Production TPS": "Production TPS", - "Production URL": "Production URL", - "Prototype Endpoint:": "Prototype Endpoint:", - "Provide the production and sandbox endpoints of the API to be managed.": "Provide the production and sandbox endpoints of the API to be managed.", - "Public": "Public", - "Public Forum": "Public Forum", - "Receiver IO error receiving": "Receiver IO error receiving", - "Receiver IO error sending": "Receiver IO error sending", - "Refer ": "Refer ", - "Refer our documentation to configure API Manager Analytics correctly": "Refer our documentation to configure API Manager Analytics correctly", - "Refer our documentation to configure WSO2 DAS correctly": "Refer our documentation to configure WSO2 DAS correctly", - "Registered by": "Registered by", - "Remove": "Remove", - "Remove Scope": "Remove Scope", - "RequestPatternChanged_Desc": "This alert type gets triggered if there is a change in the resource access pattern of a user of a particular application. These alerts could be treated as an indication of a suspicious activity made by a user over your application.", - "Required": "Required", - "Requires Re-Subscription": "Requires Re-Subscription", - "Reset": "Reset", - "Resource": "Resource", - "Resource Level Tiers": "Resource Level Tiers", - "Resources": "Resources", - "Response Caching": "Response Caching", - "Response Content Type": "Response Content Type", - "Response processing failure": "Response processing failure", - "Restricted by roles": "Restricted by roles", - "Restricted by roles, only visible to ": "Restricted by roles, only visible to ", - "Retries Before Suspension": "Retries Before Suspension", - "Roles": "Roles", - "Samples & SDK": "Samples & SDK", - "Sandbox Fail-over Endpoint(s)": "Sandbox Fail-over Endpoint(s)", - "Sandbox TPS": "Sandbox TPS", - "Sandbox URL": "Sandbox URL", - "Save": "Save", - "Save & Publish": "Save & Publish", - "Save Changes": "Save Changes", - "Save and Close": "Save and Close", - "Save changes": "Save changes", - "Save the changes to the document and stay in this tab": "Save the changes to the document and stay in this tab", - "Save the document and close this tab": "Save the document and close this tab", - "Saving API. Please wait..": "Saving API. Please wait..", - "Scope": "Scope", - "Scope Key": "Scope Key", - "Scope Name": "Scope Name", - "Scopes": "Scopes", - "Search": "Search", - "Search Options": "Search Options", - "Secured": "Secured", - "Select API": "Select API", - "Select Policy per Resource": "Select Policy per Resource", - "Select Version": "Select Version", - "Select image": "Select image", - "Select the OPTIONS method to send OPTIONS calls to the backend. If OPTIONS method is not selected, OPTIONS calls will be returned from the Gateway with allowed methods.": "Select the OPTIONS method to send OPTIONS calls to the backend. If OPTIONS method is not selected, OPTIONS calls will be returned from the Gateway with allowed methods.", - "Select the authentication scheme you require.": "Select the authentication scheme you require.", - "Send abort": "Send abort", - "Sender IO error receiving": "Sender IO error receiving", - "Sender IO error sending": "Sender IO error sending", - "Show More Options": "Show More Options", - "Sign In": "Sign In", - "Sign in to your account": "Sign in to your account", - "Since there aren't resources for Websocket API's, advanced throttling policies apply to the API-level": "Since there aren't resources for Websocket API's , Advanced throttling policies apply to API Level", - "Size (max): 1MB": "Size (max): 1MB", - "Some of the gateway environments are not selected.": "Changes will not be applied to the Gateways that you have not selected.", - "Source": "Source", - "Specify": "Specify", - "Start Creating": "Start Creating", - "Statistics": "Statistics", - "Still Subscribed?": "Still Subscribed?", - "Subscribed to": "Subscribed to", - "Subscriber": "Subscriber", - "Subscriber Path": "Subscriber Path", - "Subscription Tiers": "Subscription Tiers", - "Subscription is pending approval": "Subscription is pending approval", - "Subscriptions": "Subscriptions", - "Subscriptions Created Over Time": "Subscriptions Created Over Time", - "Success!": "Success!", - "Successfully updated external stores": "Successfully updated external stores", - "Successfully updated the API status.": "Successfully updated the API status.", - "Successfully updated tier permissions.": "Successfully updated tier permissions.", - "Summary": "Summary", - "Support Forum": "Support Forum", - "Swagger File": "Swagger File", - "Swagger URL": "Swagger URL", - "TTP protocol violation<": "TTP protocol violation<", - "Tags": "Tags", - "Technical Owner": "Technical Owner", - "Technical Owner Email": "Technical Owner Email", - "Test": "Test", - "Test URI": "Test URI", - "The Endpoint for the certificate does not match with configured endpoint": "The Endpoint for the certificate does not match with configured endpoint", - "The Production Endpoint is the actual backend endpoint URL of the API.": "The Production Endpoint is the actual backend endpoint URL of the API.", - "The Sandbox Endpoint is a mock endpoint that resembles the functionality of the actual backend API.": "The Sandbox Endpoint is a mock endpoint that resembles the functionality of the actual backend API.", - "The action to be made at a timeout situation. You can select from: 1) Never Timeout 2) Discard Message 3) Execute Fault Sequence": "The action to be made at a timeout situation. You can select from: 1) Never Timeout 2) Discard Message 3) Execute Fault Sequence", - "The algorithm on which the load balancing is based on.":"The algorithm on which the load balancing is based on.", - "The content the WSDL is saved as a resource in the /system/governance/apimgt/applicationdata/wsdls registry location. API artifacts have a dependency to this resource. Its original service address is reset to the API Gateway's address to prevent direct calls to the service endpoint. The registry permalink of the WSDL resource is shown in the API Store and users can download and create a service out of it.": "The content the WSDL is saved as a resource in the /system/governance/apimgt/applicationdata/wsdls registry location. API artifacts have a dependency to this resource. Its original service address is reset to the API Gateway's address to prevent direct calls to the service endpoint. The registry permalink of the WSDL resource is shown in the API Store and users can download and create a service out of it.", - "The delay between retries, in milliseconds.": "The delay between retries, in milliseconds.", - "The direct URL of the service": "The direct URL of the service", - "The duration for which the endpoint is suspended for the first time after the receiving the suspended error codes.": "The duration for which the endpoint is suspended for the first time after the receiving the suspended error codes.", - "The duration to suspend can vary from the first time suspension to the subsequent time. The factor value decides the suspense duration variance between subsequent suspensions.": "The duration to suspend can vary from the first time suspension to the subsequent time. The factor value decides the suspense duration variance between subsequent suspensions.", - "The duration, in milliseconds, before a request is considered as a timeout.": "The duration, in milliseconds, before a request is considered as a timeout.", - "The dynamic endpoint will send the message to the address specified in the 'To' header.": "The dynamic endpoint will send the message to the address specified in the 'To' header.", - "The endpoints that the service tries to connect to in case of a failure. This happens in a round robin manner.": "The endpoints that the service tries to connect to in case of a failure. This happens in a round robin manner.", - "The endpoints where the incoming requests are directed to in a round robin manner. They automatically handle fail-over as well.": "The endpoints where the incoming requests are directed to in a round robin manner. They automatically handle fail-over as well.", - "The following APIs have been created. APIs that are marked as PUBLISHED can be subscribed to through the API Store. ": "The following APIs have been created. APIs that are marked as PUBLISHED can be subscribed to through the API Store. ", - "The image file exceeds the maximum limit of 1MB.": "The image file exceeds the maximum limit of 1MB.", - "The maximum duration that the endpoint is suspended after receiving the suspended error codes .": "The maximum duration that the endpoint is suspended after receiving the suspended error codes .", - "The new algorithm on which the load balancing is based on.":"The new algorithm on which the load balancing is based on.", - "The number of milliseconds before the session times out.":"The number of milliseconds before the session times out.", - "The number of retries in case of a timeout, caused by the above listed error codes.": "The number of retries in case of a timeout, caused by the above listed error codes.", - "The tiers selected here determine which tiers are available to a subscriber when subscribing to this API. Each tier indicates the number of requests the subscriber is granted within a unit time.": "The tiers selected here determine which tiers are available to a subscriber when subscribing to this API. Each tier indicates the number of requests the subscriber is granted within a unit time.", - "There is no documentation created for this API. You can add new documentation to this API by clicking the \"Add New Document\" button.": "There is no documentation created for this API. You can add new documentation to this API by clicking the \"Add New Document\" button.", - "This API is not PUBLISHED. Please remove from external stores.": "This API is not PUBLISHED. Please remove from external stores.", - "This option determines whether to cache the response messages of the API. Caching improves performance because the backend server does not have to process the same data multiple times. To offset the risk of stale data in the cache, set an appropriate timeout period when prompted.": "This option determines whether to cache the response messages of the API. Caching improves performance because the backend server does not have to process the same data multiple times. To offset the risk of stale data in the cache, set an appropriate timeout period when prompted.", - "This option specifies the tenants who can subscribe to an API in a multi-tenanted setup. Available to current Tenant Only: only users in the current organization/tenant domain can subscribe to the API Available to All the Tenants: users of all organizations/tenant domains can subscribe to the API Available to Specific Tenants: users of the organizations/tenant domains you specify as well as the current tenant domain can subscribe to the API": "This option specifies the tenants who can subscribe to an API in a multi-tenanted setup. Available to current Tenant Only: only users in the current organization/tenant domain can subscribe to the API Available to All the Tenants: users of all organizations/tenant domains can subscribe to the API Available to Specific Tenants: users of the organizations/tenant domains you specify as well as the current tenant domain can subscribe to the API", - "Throttling Settings": "Throttling Settings", - "Throttling Tier": "Throttling Tier", - "Thumbnail Image": "Thumbnail Image", - "Tier Availability": "Tier Availability", - "To connect to secured endpoints, you need to pass the credentials of the backend service.": "To connect to secured endpoints, you need to pass the credentials of the backend service.", - "Toggle navigation": "Toggle navigation", - "Transports": "Transports", - "Type": "Type", - "Type a Tag and Enter": "Type a Tag and Enter", - "Type a role and Enter": "Type a role and Enter", - "Type an Email and press Enter": "Type an Email and press Enter", - "URI context path of the API (case sensitive).
The supported formats are..
1. /foo
2. /foo/bar
3. /foo/{version}/bar (case sensitive) - allows the version to be within the context": "URI context path of the API (case sensitive).
The supported formats are..
1. /foo
2. /foo/bar
3. /foo/{version}/bar (case sensitive) - allows the version to be within the context", - "URL": "URL", - "URL Pattern": "URL Pattern", - "URL Pattern ": "URL Pattern ", - "Unlimited": "Unlimited", - "Unsubscribe": "Unsubscribe", - "UnusualIPAccessAlert_Desc": "This alert type gets triggered if there is either a change in the request source IP for a particular API of an application or if the request is from an IP used before a time period of 30 days (default). These alerts could be treated as an indication of a suspicious activity made by a user over an API of an application. ", - "Update": "Update", - "Update Permissions": "Update Permissions", - "Upload": "Upload", - "Upload API definition as": "Upload API definition as", - "Upload Certificate": "Upload Certificate", - "Upload Endpoint Certificates": "Upload Endpoint Certificates", - "Upload Fault Flow": "Upload Fault Flow", - "Upload Mediation Policy - ": "Upload Mediation Policy - ", - "Upload a documentation file": "Upload a documentation file", - "Upload the certificate file": "Upload the certificate file", - "Usage Summary": "Usage Summary", - "Usage by Current Subscribers": "Usage by Current Subscribers", - "Usage by Current Subscribers (Across All Versions)": "Usage by Current Subscribers (Across All Versions)", - "Usage by Destination": "Usage by Destination", - "Usage by Resource Path": "Usage by Resource Path", - "Use Default Context": "Use Default Context", - "Use Defaults": "Use Defaults", - "Use an existing API's endpoint or the API Swagger definition to create an API.": "Use an existing API's endpoint or the API Swagger definition to create an API.", - "Use an existing SOAP endpoint to create a managed API. Import the WSDL of the SOAP service.": "Use an existing SOAP endpoint to create a managed API. Import the WSDL of the SOAP service.", - "Use keywords and common search terms as tags to group APIs that have similar characteristics. After publishing the API, consumers can click these tags to jump to a group of similar APIs.": "Use keywords and common search terms as tags to group APIs that have similar characteristics. After publishing the API, consumers can click these tags to jump to a group of similar APIs.", - "Use the inbuilt JavaScript engine to prototype the API or provide an endpoint to a prototype API. The inbuilt JavaScript engine does not have support to prototype SOAP APIs": "Use the inbuilt JavaScript engine to prototype the API or provide an endpoint to a prototype API. The inbuilt JavaScript engine does not have support to prototype SOAP APIs", - "User": "User", - "Username": "Username", - "Users": "Users", - "Version": "Version", - "Versions": "Versions", - "View": "View", - "View Content": "View Content", - "View in Store": "View in Store", - "Visibility": "Visibility", - "Visible to Roles": "Visible to Roles", - "Visible to Tenants": "Visible to Tenants", - "Visible to my Domain": "Visible to my Domain", - "WADL": "WADL", - "WSDL": "WSDL", - "WSDL Endpoint": "WSDL Endpoint", - "WSO2 API Manager uses HTTP Head to check the validity of the endpoint.": "WSO2 API Manager uses HTTP Head to check the validity of the endpoint.", - "WSO2 API Publisher Home": "WSO2 API Publisher Home", - "WSO2 copyright": "WSO2 copyright", - "WSO2 documentation on APIM Analytics": "WSO2 documentation on APIM Analytics", - "WSO2 wiki documentation on APIM Statistics": "WSO2 wiki documentation on APIM Statistics", - "Warning": "Warning", - "Warning!": "Warning!", - "Week": "Week", - "Yes": "Yes", - "You are editing an API with active subscribers. Tier Availability changes will not be reflected on active subscriptions.": "You are editing an API with active subscribers. Tier Availability changes will not be reflected on active subscriptions.", - "You are now redirected to Identity. If the redirection fails, please click the POST button.": "You are now redirected to Identity. If the redirection fails, please click the POST button.", - "You are now redirected to Stratos Identity. If the redirection fails, please click the POST button.": "You are now redirected to Stratos Identity. If the redirection fails, please click the POST button.", - "You are now redirected to Stratos Identity. If the redirection fails, please click the post button.": "You are now redirected to Stratos Identity. If the redirection fails, please click the post button.", - "You do not have any uploaded Certificates for above endpoints": "You do not have any uploaded Certificates for above endpoints", - "You do not have any uploaded custom certificates": "You do not have any uploaded custom certificates", - "You have selected \"Dynamic Endpoint\" which will send the message to the address specified in the \"To\" header. Please upload a mediation sequence file to Message Mediation Policies, which sets the \"To\" header.": "You have selected \"Dynamic Endpoint\" which will send the message to the address specified in the \"To\" header. Please upload a mediation sequence file to Message Mediation Policies, which sets the \"To\" header.", - "You have successfully published your API": "You have successfully published your API", - "You have successfully saved the API.": "You have successfully saved the API.", - "You must first enter Production/ Sandbox endpoints to add a certificate or the Endpoints you have entered are not valid.": "You must first enter Production/ Sandbox endpoints to add a certificate or the Endpoints you have entered are not valid.", - "You must upload a Certificate file": "You must upload a Certificate file", - "_Desc": "_Desc", - "abnormalBackendTime": "Abnormal Backend Time", - "abnormalBackendTime_Desc": "This alert type gets triggered if there is a sudden increase of the backend time corresponding to a particular API resource. These alerts could be treated as an indication of a slow backend. In technical terms, if the backend time of a particular API resource (eg: GET /calc/1.0/numbers) of a tenant lies outside the Xth percentile value, we will send an alert out. Default percentile value is 95%. Here, we safely assume that the corresponding backend time of an API resource follows a normal distribution. Percentile value gets calculated daily by default. ", - "abnormalRequestsPerMin_Desc": "This alert type gets triggered if there is a sudden spike or a drop in the request count within a period of one minute by default for a particular API resource. These alerts could be treated as an indication of a possible high traffic, or suspicious activity, or possible malfunction of the client application, etc.", - "abnormalResponseTime": "Abnormal Response Time", - "abnormalResponseTime_Desc": "This alert type gets triggered if there is a sudden increase in the response time of a particular API resource. These alerts could be treated as an indication of a slow WSO2 API Manager runtime or a slow backend. ", - "apiPublisherHomePage": "apiPublisherHomePage", - "block": "Block", - "blocked": "BLOCKED", - "changed the API status from": "changed the API status from", - "controlled": "Restricted by tenants", - "created": "CREATED", - "created the API.": "created the API.", - "demote to created": "Demote to Created", - "demote to prototyped": "Demote to Prototyped", - "deploy as a prototype": "Deploy as a Prototype", - "deprecate": "Deprecate", - "deprecated": "DEPRECATED", - "do gateway action": "do gateway action", - "documentation": "documentation", - "eg : pdf, xml, txt, wsdl, ms-word, ms-powerpoint, ms-excel": "eg : pdf, xml, txt, wsdl, ms-word, ms-powerpoint, ms-excel", - "for more information about each throttling setting.": "for more information about each throttling setting.", - "goBack": "goBack", - "healthAvailabilityPerMin": "Health Availability", - "healthAvailabilityPerMin_Desc": "This alert type gets triggered if at least one of the three cases below are satisfied; Response time of an API > Response time upper percentile of that particular API or Request Count of an API per minute > Request count per minute lower percentile or Response status code >= 500 (By Default) AND Response status code < 600 (By Default)", - "infoMsgThumb": "infoMsgThumb", - "less": "less", - "more": "more", - "permissions": "permissions", - "private": "Visible to my Domain", - "public": "Public", - "publish": "Publish", - "published": "PUBLISHED", - "re-publish": "Re-Publish", - "restricted": "Restricted by roles", - "retire": "Retire", - "retired": "RETIRED", - "roles": "Visible to Roles", - "subscriptions": "subscriptions", - "tenants": "Visible to Tenants", - "tierPermissions": "tierPermissions", - "tiers": "tiers", - "user": "user", - "Access Control" : "Access Control", - "Visibility on Store": "Visibility on Store", - "all": "All", - "All : The API is viewable, modifiable by all the publishers and creators.
Restricted by roles : The API can be viewable and modifiable by only specific publishers and creators with the roles that you specify" : "All : The API is viewable, modifiable by all the publishers and creators.
Restricted by roles : The API can be viewable and modifiable by only specific publishers and creators with the roles that you specify", - "Restricted by roles, only viewable and modifiable by " : "Restricted by roles, only viewable and modifiable by ", - "Additional Properties" : "Additional Properties", - "Property Name" : "Property Name", - "Property Value" : "Property Value", - "Meta Information" : "Meta Information", - "By Custom Meta Information [Syntax - {property name}:{property value}]" : "By Custom Meta Information [Syntax - {property name}:{property value}]", - "Property name cannot be empty." : "Property name cannot be empty.", - "Property value cannot be empty.": "Property value cannot be empty.", - "Property name should not have space. Please select a different property name." : "Property name should not have space. Please select a different property name.", - "Property name matches with one of the reserved keywords. Please select a different property name" : "Property name matches with one of the reserved keywords. Please select a different property name.", - "already exist for this API. Property names are unique. Please select a different property name." : "already exist for this API. Property names are unique. Please select a different property name.", - "Property" : "Property", - "Do you want to remove" : "Do you want to remove", - "from properties list." : "from properties list.", - "confirm" : "confirm", - "Remove Property" : "Remove Property", - "Property name should match following criteria.
1. Property name should not contain space in it. 2.Property name should not contain any of the reserved keywords.
Reserved Keywords : [name, description, provider, version, context, doc,tags, lcstate, status, subcontext]" : "Property name should match following criteria.
1. Property name should not contain space in it.
2. Property name should not match with any of the reserved keywords.
Reserved Keywords : [name, description, provider, version, context, doc,tags, lcstate, status, subcontext]", - "Property name can have maximum of 80 characters. Please select a different property name." : "Property name can have maximum of 80 characters. Please select a different property name.", - "Property value can have maximum of 900 characters." : "Property value can have maximum of 900 characters." -} diff --git a/config-sets/config02/README.txt b/config-sets/config02/README.txt deleted file mode 100644 index fb0f53d1..00000000 --- a/config-sets/config02/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name : config02 -Description -Config changes required for updating registry resources via REST API and updating output event adepter - email with valid configs. - -Prerequisites -1. cp apps/resoruce.war to /repository/deployment/server/webapps directory - -2. replace /repository/conf/output-event-adapters.xml with files/output-event-adapters.xml where following configurations are done under 'email' adepterConfig type. - property key="mail.smtp.from">dewmi123455@gmail.com - property key="mail.smtp.user">dewmi123455 - property key="mail.smtp.password">password - property key="mail.smtp.host">smtp.gmail.com - property key="mail.smtp.port">587 - -3. Restart the WSO2 server. - -Note: Due to a known issue from apim2.1.0-update6 onwards, user has to manually copy relevant jars of spring framwwork 3.07 verion to resource web app. These steps are not included in the config.sh since this bug will be fixed in futer releases. - diff --git a/config-sets/config02/config.sh b/config-sets/config02/config.sh deleted file mode 100644 index db415482..00000000 --- a/config-sets/config02/config.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/bin/bash -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -productHome=$productHome -filePath=repository/conf/ -appPath=repository/deployment/server/webapps/ - -prgdir=$(dirname "$0") -configDir=$(cd "$prgdir"; pwd) - -#copy config files -\cp -f $configDir/files/output-event-adapters.xml $productHome/$filePath -\cp -f $configDir/files/resource.war $productHome/$appPath -cd $productHome/bin - -#verify file copy status and exit on failure -statusval=$? -if [ $statusval -eq 0 ]; then -echo "file copying success!" - #stop the server - echo "shutting down the server now..." - sh wso2server.sh stop -else - echo "file copy command failed..." - exit 1 -fi -#wait till server stops -y=0; -retry_count1=20; -while true -do -echo $(date)" Waiting until server stops" -#mystatus=$(curl -s -w '%{http_code}' https://localhost:9443/carbon -k ) -if curl -s -w '%{http_code}' https://localhost:9443/carbon -k | grep "000" -then - echo "Carbon server stopped...!" - break -else - echo "Carbon server is still running..." - if [ $y = $retry_count1 ]; then - echo "Couldn't stop the server" - exit 1 - fi -fi -x=$((x+1)) -sleep 1 -done -#wait few seconds to finish with server-stop -sleep 3 -#start back the server -echo "server starting..." -sh wso2server.sh start -#wait till server starts -x=0; -retry_count=20; -while true -do -echo $(date)" waiting until server starts..." -#STATUS=$(curl -s http://scriptuser:scriptuser@localhost:8080/manager/text/list | grep ${appName}) -if curl -s -w '%{http_code}' https://localhost:9443/carbon -k | grep "302" -then - echo "found server running..." - echo "configurations Done...!" - exit 0 -else - echo "carbon server not running..." - if [ $x = $retry_count ]; then - echo "Couldn't start the server" - exit 1 - fi -fi -x=$((x+1)) -sleep 2 -done diff --git a/config-sets/config02/files/output-event-adapters.xml b/config-sets/config02/files/output-event-adapters.xml deleted file mode 100644 index 7d9afe73..00000000 --- a/config-sets/config02/files/output-event-adapters.xml +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - tcp://localhost:7612 - ssl://localhost:7712 - tcp://localhost:9612 - ssl://localhost:9712 - - - - VARCHAR(255) - DOUBLE - INT - BIGINT - FLOAT - BOOL - CREATE TABLE $TABLE_NAME ($COLUMN_TYPES) - INSERT INTO $TABLE_NAME ($COLUMNS) VALUES ($VALUES) - SELECT * FROM $TABLE_NAME limit 1 - UPDATE $TABLE_NAME SET $COLUMN_VALUES WHERE $CONDITION - , - ? - = - AND - SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$TABLE_NAME' - SELECT $COLUMNS FROM $TABLE_NAME - varchar2(255) - CLOB - BINARY_DOUBLE - SELECT * FROM $TABLE_NAME WHERE ROWNUM = 1 - SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLS WHERE TABLE_NAME = '$TABLE_NAME' - varchar2(255) - SELECT TOP 1 * FROM $TABLE_NAME - SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '$TABLE_NAME' - varchar2(255) - REAL - SHOW COLUMNS FROM $TABLE_NAME - - - - - 8 - 100 - 20000 - 10000 - - 50 - 1000 - - - - - 8 - 100 - 20000 - 10000 - - - - - 8 - 100 - 20000 - 10000 - 60 - - - - - 8 - 100 - 20000 - 10000 - - - - - dewmi123455@gmail.com - dewmi123455 - password - smtp.gmail.com - 587 - true - true - - 8 - 100 - 20000 - 10000 - - - - 30 - - 8 - 100 - 20000 - 10000 - - - - - 8 - 100 - 20000 - 10000 - - - - - 8 - 100 - 20000 - 10000 - - - - - 8 - 100 - 20000 - 10000 - - 10000 - true - true - 50 - - - diff --git a/config-sets/config02/files/resource.war b/config-sets/config02/files/resource.war deleted file mode 100644 index ff9832b4..00000000 Binary files a/config-sets/config02/files/resource.war and /dev/null differ diff --git a/cypress.json b/cypress.json new file mode 100644 index 00000000..68e829c7 --- /dev/null +++ b/cypress.json @@ -0,0 +1,27 @@ +{ + "chromeWebSecurity": false, + "pageLoadTimeout": 100000, + "defaultCommandTimeout": 100000, + "largeTimeout": 100000, + "baseUrl": "https://localhost:9443", + "screenshotsFolder": "cypress/screenshots", + "screenshotOnRunFailure":true, + "experimentalInteractiveRunEvents": true, + "reporter": "cypress-multi-reporters", + "reporterOptions": { + "inlineAssets": true, + "reporterEnabled": "cypress-mochawesome-reporter, mocha-junit-reporter", + "mochaJunitReporterReporterOptions": { + "mochaFile": "cypress/reports/junit/results-[hash].xml" + }, + "cypressMochawesomeReporterReporterOptions": { + "charts": true, + "reportPageTitle": "custom-title" + } + }, + "video": false, + "scrollBehavior" : "nearest", + "e2e": { + "excludeSpecPattern": "**/*.skip.js" + } + } \ No newline at end of file diff --git a/cypress/fixtures/api_artifacts/advanceConfigFlase.json b/cypress/fixtures/api_artifacts/advanceConfigFlase.json new file mode 100644 index 00000000..5193d335 --- /dev/null +++ b/cypress/fixtures/api_artifacts/advanceConfigFlase.json @@ -0,0 +1,387 @@ +{ + "Meta": { + "Migration": { + "3.0.0": false + } + }, + "NotificationsEnabled": "false", + "EnableMonetization": false, + "ExtensionHandlerPosition": "bottom", + "DefaultRoles": { + "PublisherRole": { + "RoleName": "Internal/publisher", + "CreateOnTenantLoad": true + }, + "DevOpsRole": { + "RoleName": "Internal/devops", + "CreateOnTenantLoad": true + }, + "IntegrationDeveloperRole": { + "RoleName": "Internal/integration_dev", + "CreateOnTenantLoad": true + }, + "SubscriberRole": { + "CreateOnTenantLoad": true + }, + "ObserverRole": { + "RoleName": "Internal/observer", + "CreateOnTenantLoad": true + }, + "CreatorRole": { + "RoleName": "Internal/creator", + "CreateOnTenantLoad": true + } + }, + "RoleMappings": {}, + "EnableRecommendation": false, + "IsUnlimitedTierPaid": false, + "Notifications": [ + { + "Type": "new_api_version", + "Notifiers": [ + { + "Title": "Version $2 of $1 Released", + "Class": "org.wso2.carbon.apimgt.impl.notification.NewAPIVersionEmailNotifier", + "ClaimsRetrieverImplClass": "org.wso2.carbon.apimgt.impl.token.DefaultClaimsRetriever", + "Template": "

We’re happy to announce the arrival of the next major version $2 of $1 API which is now available in Our API Store.

Click here to Visit WSO2 API Store" + } + ] + } + ], + "RESTAPIScopes": { + "Scope": [ + { + "Roles": "admin", + "Name": "apim:api_workflow_view" + }, + { + "Roles": "admin", + "Name": "apim:tenant_theme_manage" + }, + { + "Roles": "admin", + "Name": "apim:api_workflow_approve" + }, + { + "Roles": "admin", + "Name": "apim:scope_manage" + }, + { + "Roles": "admin", + "Name": "apim:admin_application_view" + }, + { + "Roles": "admin", + "Name": "apim:bl_view" + }, + { + "Roles": "admin", + "Name": "apim:admin_settings" + }, + { + "Roles": "admin", + "Name": "apim:environment_manage" + }, + { + "Roles": "admin", + "Name": "apim:admin_alert_manage" + }, + { + "Roles": "admin", + "Name": "apim:admin_operations" + }, + { + "Roles": "admin", + "Name": "apim:app_owner_change" + }, + { + "Roles": "admin", + "Name": "apim:bl_manage" + }, + { + "Roles": "admin", + "Name": "apim:role_manage" + }, + { + "Roles": "admin", + "Name": "apim:environment_read" + }, + { + "Roles": "admin,Internal/publisher", + "Name": "apim:monetization_usage_publish" + }, + { + "Roles": "admin", + "Name": "apim:tenantInfo" + }, + { + "Roles": "admin", + "Name": "apim:bot_data" + }, + { + "Roles": "admin", + "Name": "apim:api_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher,Internal/observer", + "Name": "apim:common_operation_policy_view" + }, + { + "Roles": "admin,Internal/publisher", + "Name": "apim:subscription_manage" + }, + { + "Roles": "Internal/integration_dev", + "Name": "apim:api_list_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:common_operation_policy_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:threat_protection_policy_create" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:mediation_policy_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:ep_certificates_update" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:ep_certificates_view" + }, + { + "Roles": "admin,Internal/publisher", + "Name": "apim:api_publish" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:client_certificates_update" + }, + { + "Roles": "Internal/integration_dev", + "Name": "apim:api_definition_view" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:api_generate_key" + }, + { + "Roles": "admin,Internal/publisher,Internal/creator,Internal/analytics,Internal/observer", + "Name": "apim:api_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:mediation_policy_create" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:pub_alert_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:document_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:ep_certificates_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:comment_view" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:comment_write" + }, + { + "Roles": "admin", + "Name": "apim:tier_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:comment_manage" + }, + { + "Roles": "admin,Internal/publisher,Internal/creator", + "Name": "apim:tier_view" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:document_create" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:threat_protection_policy_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:subscription_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:api_create" + }, + { + "Roles": "admin", + "Name": "apim:shared_scope_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:client_certificates_add" + }, + { + "Roles": "admin,Internal/devops", + "Name": "apim:api_product_import_export" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:api_delete" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:client_certificates_view" + }, + { + "Roles": "admin,Internal/devops", + "Name": "apim:api_import_export" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher,Internal/observer", + "Name": "apim:publisher_settings" + }, + { + "Roles": "admin,Internal/publisher", + "Name": "apim:subscription_block" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:mediation_policy_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:client_certificates_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:ep_certificates_add" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:api_mediation_policy_manage" + }, + { + "Roles": "admin", + "Name": "apim:admin" + }, + { + "Roles": "admin,Internal/subscriber,Internal/devops", + "Name": "apim:app_manage" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim:store_settings" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim:sub_alert_manage" + }, + { + "Roles": "admin,Internal/devops", + "Name": "apim:app_import_export" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim:api_key" + }, + { + "Roles": "admin,Internal/subscriber,Internal/devops", + "Name": "apim:sub_manage" + }, + { + "Roles": "admin,Internal/subscriber,Internal/devops", + "Name": "apim:subscribe" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "service_catalog:service_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "service_catalog:service_write" + }, + { + "Roles": "admin", + "Name": "apim:label_manage" + }, + { + "Roles": "admin", + "Name": "apim:label_read" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim:app_update" + }, + { + "Roles": "admin", + "Name": "apim_analytics:admin" + }, + { + "Roles": "admin", + "Name": "apim_analytics:monitoring_dashboard:own" + }, + { + "Roles": "admin", + "Name": "apim_analytics:monitoring_dashboard:edit" + }, + { + "Roles": "admin,Internal/analytics", + "Name": "apim_analytics:monitoring_dashboard:view" + }, + { + "Roles": "admin", + "Name": "apim_analytics:business_analytics:own" + }, + { + "Roles": "admin", + "Name": "apim_analytics:business_analytics:edit" + }, + { + "Roles": "admin,Internal/analytics", + "Name": "apim_analytics:business_analytics:view" + }, + { + "Roles": "admin", + "Name": "apim_analytics:api_analytics:own" + }, + { + "Roles": "admin", + "Name": "apim_analytics:api_analytics:edit" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim_analytics:api_analytics:view" + }, + { + "Roles": "admin", + "Name": "apim_analytics:application_analytics:own" + }, + { + "Roles": "admin", + "Name": "apim_analytics:application_analytics:edit" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim_analytics:application_analytics:view" + }, + { + "Roles": "admin,Internal/publisher,Internal/creator,Internal/analytics", + "Name": "apim:throttling_policy_manage" + } + ] + } +} diff --git a/cypress/fixtures/api_artifacts/advanceConfigTrue.json b/cypress/fixtures/api_artifacts/advanceConfigTrue.json new file mode 100644 index 00000000..4ad0149c --- /dev/null +++ b/cypress/fixtures/api_artifacts/advanceConfigTrue.json @@ -0,0 +1,387 @@ +{ + "Meta": { + "Migration": { + "3.0.0": true + } + }, + "NotificationsEnabled": "false", + "EnableMonetization": false, + "ExtensionHandlerPosition": "bottom", + "DefaultRoles": { + "PublisherRole": { + "RoleName": "Internal/publisher", + "CreateOnTenantLoad": true + }, + "DevOpsRole": { + "RoleName": "Internal/devops", + "CreateOnTenantLoad": true + }, + "IntegrationDeveloperRole": { + "RoleName": "Internal/integration_dev", + "CreateOnTenantLoad": true + }, + "SubscriberRole": { + "CreateOnTenantLoad": true + }, + "ObserverRole": { + "RoleName": "Internal/observer", + "CreateOnTenantLoad": true + }, + "CreatorRole": { + "RoleName": "Internal/creator", + "CreateOnTenantLoad": true + } + }, + "RoleMappings": {}, + "EnableRecommendation": false, + "IsUnlimitedTierPaid": false, + "Notifications": [ + { + "Type": "new_api_version", + "Notifiers": [ + { + "Title": "Version $2 of $1 Released", + "Class": "org.wso2.carbon.apimgt.impl.notification.NewAPIVersionEmailNotifier", + "ClaimsRetrieverImplClass": "org.wso2.carbon.apimgt.impl.token.DefaultClaimsRetriever", + "Template": "

We’re happy to announce the arrival of the next major version $2 of $1 API which is now available in Our API Store.

Click here to Visit WSO2 API Store" + } + ] + } + ], + "RESTAPIScopes": { + "Scope": [ + { + "Roles": "admin", + "Name": "apim:api_workflow_view" + }, + { + "Roles": "admin", + "Name": "apim:tenant_theme_manage" + }, + { + "Roles": "admin", + "Name": "apim:api_workflow_approve" + }, + { + "Roles": "admin", + "Name": "apim:scope_manage" + }, + { + "Roles": "admin", + "Name": "apim:admin_application_view" + }, + { + "Roles": "admin", + "Name": "apim:bl_view" + }, + { + "Roles": "admin", + "Name": "apim:admin_settings" + }, + { + "Roles": "admin", + "Name": "apim:environment_manage" + }, + { + "Roles": "admin", + "Name": "apim:admin_alert_manage" + }, + { + "Roles": "admin", + "Name": "apim:admin_operations" + }, + { + "Roles": "admin", + "Name": "apim:app_owner_change" + }, + { + "Roles": "admin", + "Name": "apim:bl_manage" + }, + { + "Roles": "admin", + "Name": "apim:role_manage" + }, + { + "Roles": "admin", + "Name": "apim:environment_read" + }, + { + "Roles": "admin,Internal/publisher", + "Name": "apim:monetization_usage_publish" + }, + { + "Roles": "admin", + "Name": "apim:tenantInfo" + }, + { + "Roles": "admin", + "Name": "apim:bot_data" + }, + { + "Roles": "admin", + "Name": "apim:api_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher,Internal/observer", + "Name": "apim:common_operation_policy_view" + }, + { + "Roles": "admin,Internal/publisher", + "Name": "apim:subscription_manage" + }, + { + "Roles": "Internal/integration_dev", + "Name": "apim:api_list_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:common_operation_policy_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:threat_protection_policy_create" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:mediation_policy_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:ep_certificates_update" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:ep_certificates_view" + }, + { + "Roles": "admin,Internal/publisher", + "Name": "apim:api_publish" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:client_certificates_update" + }, + { + "Roles": "Internal/integration_dev", + "Name": "apim:api_definition_view" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:api_generate_key" + }, + { + "Roles": "admin,Internal/publisher,Internal/creator,Internal/analytics,Internal/observer", + "Name": "apim:api_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:mediation_policy_create" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:pub_alert_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:document_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:ep_certificates_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:comment_view" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:comment_write" + }, + { + "Roles": "admin", + "Name": "apim:tier_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:comment_manage" + }, + { + "Roles": "admin,Internal/publisher,Internal/creator", + "Name": "apim:tier_view" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:document_create" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:threat_protection_policy_manage" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim:subscription_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:api_create" + }, + { + "Roles": "admin", + "Name": "apim:shared_scope_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:client_certificates_add" + }, + { + "Roles": "admin,Internal/devops", + "Name": "apim:api_product_import_export" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:api_delete" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:client_certificates_view" + }, + { + "Roles": "admin,Internal/devops", + "Name": "apim:api_import_export" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher,Internal/observer", + "Name": "apim:publisher_settings" + }, + { + "Roles": "admin,Internal/publisher", + "Name": "apim:subscription_block" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:mediation_policy_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:client_certificates_manage" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:ep_certificates_add" + }, + { + "Roles": "admin,Internal/creator", + "Name": "apim:api_mediation_policy_manage" + }, + { + "Roles": "admin", + "Name": "apim:admin" + }, + { + "Roles": "admin,Internal/subscriber,Internal/devops", + "Name": "apim:app_manage" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim:store_settings" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim:sub_alert_manage" + }, + { + "Roles": "admin,Internal/devops", + "Name": "apim:app_import_export" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim:api_key" + }, + { + "Roles": "admin,Internal/subscriber,Internal/devops", + "Name": "apim:sub_manage" + }, + { + "Roles": "admin,Internal/subscriber,Internal/devops", + "Name": "apim:subscribe" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "service_catalog:service_view" + }, + { + "Roles": "admin,Internal/creator", + "Name": "service_catalog:service_write" + }, + { + "Roles": "admin", + "Name": "apim:label_manage" + }, + { + "Roles": "admin", + "Name": "apim:label_read" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim:app_update" + }, + { + "Roles": "admin", + "Name": "apim_analytics:admin" + }, + { + "Roles": "admin", + "Name": "apim_analytics:monitoring_dashboard:own" + }, + { + "Roles": "admin", + "Name": "apim_analytics:monitoring_dashboard:edit" + }, + { + "Roles": "admin,Internal/analytics", + "Name": "apim_analytics:monitoring_dashboard:view" + }, + { + "Roles": "admin", + "Name": "apim_analytics:business_analytics:own" + }, + { + "Roles": "admin", + "Name": "apim_analytics:business_analytics:edit" + }, + { + "Roles": "admin,Internal/analytics", + "Name": "apim_analytics:business_analytics:view" + }, + { + "Roles": "admin", + "Name": "apim_analytics:api_analytics:own" + }, + { + "Roles": "admin", + "Name": "apim_analytics:api_analytics:edit" + }, + { + "Roles": "admin,Internal/creator,Internal/publisher", + "Name": "apim_analytics:api_analytics:view" + }, + { + "Roles": "admin", + "Name": "apim_analytics:application_analytics:own" + }, + { + "Roles": "admin", + "Name": "apim_analytics:application_analytics:edit" + }, + { + "Roles": "admin,Internal/subscriber", + "Name": "apim_analytics:application_analytics:view" + }, + { + "Roles": "admin,Internal/publisher,Internal/creator,Internal/analytics", + "Name": "apim:throttling_policy_manage" + } + ] + } +} diff --git a/cypress/fixtures/api_artifacts/api-pic.jpg b/cypress/fixtures/api_artifacts/api-pic.jpg new file mode 100644 index 00000000..ec829afd Binary files /dev/null and b/cypress/fixtures/api_artifacts/api-pic.jpg differ diff --git a/cypress/fixtures/api_artifacts/json_to_xml_in_message_custom.xml b/cypress/fixtures/api_artifacts/json_to_xml_in_message_custom.xml new file mode 100644 index 00000000..2ff93139 --- /dev/null +++ b/cypress/fixtures/api_artifacts/json_to_xml_in_message_custom.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/cypress/fixtures/api_artifacts/mock_cert.crt b/cypress/fixtures/api_artifacts/mock_cert.crt new file mode 100644 index 00000000..d49f4d6c --- /dev/null +++ b/cypress/fixtures/api_artifacts/mock_cert.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDdzCCAuACCQCf6dZsKr9m0TANBgkqhkiG9w0BAQUFADCB/zELMAkGA1UEBhMC +U0wxEDAOBgNVBAgMB1dlc3Rlcm4xEDAOBgNVBAcMB0NvbG9tYm8xDTALBgNVBAoM +BFdTTzIxFDASBgNVBAsMC0VuZ2luZWVyaW5nMQ4wDAYDVQQDDAVEaXZ5YTEdMBsG +CSqGSIb3DQEJARYOZGl2eWFAd3NvMi5jb20xHDAaBgQqAwQBDBJ0ZXN0QWNjb3Vu +dFNlcnZpY2UxHzAdBgQqAwQCDBV0ZXN0UGF5bWVudEluaXRpYXRpb24xGTAXBgQq +AwQDDA90ZXN0SW5mb3JtYXRpb24xHjAcBgQqAwQEDBR0ZXN0Q2FyZEJhc2VkUGF5 +bWVudDAeFw0xODA4MjgwODA3MjhaFw0xOTA4MjgwODA3MjhaMIH/MQswCQYDVQQG +EwJTTDEQMA4GA1UECAwHV2VzdGVybjEQMA4GA1UEBwwHQ29sb21ibzENMAsGA1UE +CgwEV1NPMjEUMBIGA1UECwwLRW5naW5lZXJpbmcxDjAMBgNVBAMMBURpdnlhMR0w +GwYJKoZIhvcNAQkBFg5kaXZ5YUB3c28yLmNvbTEcMBoGBCoDBAEMEnRlc3RBY2Nv +dW50U2VydmljZTEfMB0GBCoDBAIMFXRlc3RQYXltZW50SW5pdGlhdGlvbjEZMBcG +BCoDBAMMD3Rlc3RJbmZvcm1hdGlvbjEeMBwGBCoDBAQMFHRlc3RDYXJkQmFzZWRQ +YXltZW50MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNpYc68eMSD0kG1ISh +PwENGnTD9x3nMm7RbwiT1iWrkc2zRpTqAjtcRpw2i8tRyurNtRPcLkdNGzyG1T+9 +L6HTjXpIkTriU6eaXHu5lsdq4NS+xbwW+q6T9YAawYpSNnOzLPxgkHp1QG7H9md3 ++B17OpkPTPU0GY2eVASa26MFUwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAGBpuhu/ +kmYpP+IGaJ/RQbU9xaovNNaer6KtYxAiupmRUS55GeIKunyFc/GKLy/p8hQXb+w5 +ZY40SYZSHB577XATHRoiEvCAi81Lg3wcNSN6FpA6GRQuEMVspvjn1I7JlWi58AG2 +iJsmFQibr/8We2ovIL3mILz8osd36hHCbWpC +-----END CERTIFICATE----- \ No newline at end of file diff --git a/cypress/fixtures/api_artifacts/modified_schema_graphql.graphql b/cypress/fixtures/api_artifacts/modified_schema_graphql.graphql new file mode 100644 index 00000000..8f490d15 --- /dev/null +++ b/cypress/fixtures/api_artifacts/modified_schema_graphql.graphql @@ -0,0 +1,200 @@ +#modified schema file +schema { + query: Query + mutation: Mutation + subscription: Subscription +} + +# The query type, represents all of the entry points into our object graph +type Query { + hero(episode: Episode): Character + reviews(episode: Episode!): [Review] + search(text: String): [SearchResult] + character(id: ID!): Character + droid(id: ID!): Droid + human(id: ID!): Human + allHumans(first: Int): [Human] + allDroids(first: Int): [Droid] + allCharacters(first: Int): [Character] + starship(id: ID!): Starship +} + +# The mutation type, represents all updates we can make to our data +type Mutation { + createReview(episode: Episode, review: ReviewInput!): Review +} + +# The subscription type, represents all subscriptions we can make to our data +type Subscription { + reviewAdded(episode: Episode): Review +} + +# The episodes in the Star Wars trilogy +enum Episode { + # Star Wars Episode IV: A New Hope, released in 1977. + NEWHOPE + + # Star Wars Episode V: The Empire Strikes Back, released in 1980. + EMPIRE + + # Star Wars Episode VI: Return of the Jedi, released in 1983. + JEDI + + # Star Wars Episode III: Revenge of the Sith, released in 2005 + SITH +} + +# A character from the Star Wars universe +interface Character { + # The ID of the character + id: ID! + + # The name of the character + name: String! + + # The friends of the character, or an empty list if they have none + friends: [Character] + + # The friends of the character exposed as a connection with edges + friendsConnection(first: Int, after: ID): FriendsConnection! + + # The movies this character appears in + appearsIn: [Episode]! +} + +# Units of height +enum LengthUnit { + # The standard unit around the world + METER + + # Primarily used in the United States + FOOT +} + +# A humanoid creature from the Star Wars universe +type Human implements Character { + # The ID of the human + id: ID! + + # What this human calls themselves + name: String! + + # The home planet of the human, or null if unknown + homePlanet: String + + # Height in the preferred unit, default is meters + height(unit: LengthUnit = METER): Float + + # Mass in kilograms, or null if unknown + mass: Float + + # This human's friends, or an empty list if they have none + friends: [Character] + + # The friends of the human exposed as a connection with edges + friendsConnection(first: Int, after: ID): FriendsConnection! + + # The movies this human appears in + appearsIn: [Episode]! + + # A list of starships this person has piloted, or an empty list if none + starships: [Starship] +} + +# An autonomous mechanical character in the Star Wars universe +type Droid implements Character { + # The ID of the droid + id: ID! + + # What others call this droid + name: String! + + # This droid's friends, or an empty list if they have none + friends: [Character] + + # The friends of the droid exposed as a connection with edges + friendsConnection(first: Int, after: ID): FriendsConnection! + + # The movies this droid appears in + appearsIn: [Episode]! + + # This droid's primary function + primaryFunction: String +} + +# A connection object for a character's friends +type FriendsConnection { + # The total number of friends + totalCount: Int + + # The edges for each of the character's friends. + edges: [FriendsEdge] + + # A list of the friends, as a convenience when edges are not needed. + friends: [Character] + + # Information for paginating this connection + pageInfo: PageInfo! +} + +# An edge object for a character's friends +type FriendsEdge { + # A cursor used for pagination + cursor: ID! + + # The character represented by this friendship edge + node: Character +} + +# Information for paginating this connection +type PageInfo { + startCursor: ID + endCursor: ID + hasNextPage: Boolean! +} + +# Represents a review for a movie +type Review { + # The movie + episode: Episode + + # The number of stars this review gave, 1-5 + stars: Int! + + # Comment about the movie + commentary: String +} + +# The input object sent when someone is creating a new review +input ReviewInput { + # 0-5 stars + stars: Int! + + # Comment about the movie, optional + commentary: String + + # Favorite color, optional + favorite_color: ColorInput +} + +# The input object sent when passing in a color +input ColorInput { + red: Int! + green: Int! + blue: Int! +} + +type Starship { + # The ID of the starship + id: ID! + + # The name of the starship + name: String! + + # Length of the starship, along the longest axis + length(unit: LengthUnit = METER): Float + + coordinates: [[Float!]!] +} + +union SearchResult = Human | Droid | Starship diff --git a/cypress/fixtures/api_artifacts/petstore-v3.json b/cypress/fixtures/api_artifacts/petstore-v3.json new file mode 100644 index 00000000..36a66dd5 --- /dev/null +++ b/cypress/fixtures/api_artifacts/petstore-v3.json @@ -0,0 +1 @@ +{"openapi":"3.0.2","info":{"title":"Swagger Petstore - OpenAPI 3.0","description":"This is a sample Pet Store Server based on the OpenAPI 3.0 specification. You can find out more about\nSwagger at [http://swagger.io](http://swagger.io). In the third iteration of the pet store, we've switched to the design first approach!\nYou can now help us improve the API whether it's by making changes to the definition itself or to the code.\nThat way, with time, we can improve the API in general, and expose some of the new features in OAS3.\n\nSome useful links:\n- [The Pet Store repository](https://github.com/swagger-api/swagger-petstore)\n- [The source API definition for the Pet Store](https://github.com/swagger-api/swagger-petstore/blob/master/src/main/resources/openapi.yaml)","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"},"version":"1.0.6"},"externalDocs":{"description":"Find out more about Swagger","url":"http://swagger.io"},"servers":[{"url":"/api/v3"}],"tags":[{"name":"pet","description":"Everything about your Pets","externalDocs":{"description":"Find out more","url":"http://swagger.io"}},{"name":"store","description":"Operations about user"},{"name":"user","description":"Access to Petstore orders","externalDocs":{"description":"Find out more about our store","url":"http://swagger.io"}}],"paths":{"/pet":{"put":{"tags":["pet"],"summary":"Update an existing pet","description":"Update an existing pet by Id","operationId":"updatePet","requestBody":{"description":"Update an existent pet in the store","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Pet"}}},"required":true},"responses":{"200":{"description":"Successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}}}},"400":{"description":"Invalid ID supplied"},"404":{"description":"Pet not found"},"405":{"description":"Validation exception"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]},"post":{"tags":["pet"],"summary":"Add a new pet to the store","description":"Add a new pet to the store","operationId":"addPet","requestBody":{"description":"Create a new pet in the store","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Pet"}}},"required":true},"responses":{"200":{"description":"Successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}}}},"405":{"description":"Invalid input"}},"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","parameters":[{"name":"status","in":"query","description":"Status values that need to be considered for filter","required":false,"explode":true,"schema":{"type":"string","default":"available","enum":["available","pending","sold"]}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pet"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pet"}}}}},"400":{"description":"Invalid status value"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet/findByTags":{"get":{"tags":["pet"],"summary":"Finds Pets by tags","description":"Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.","operationId":"findPetsByTags","parameters":[{"name":"tags","in":"query","description":"Tags to filter by","required":false,"explode":true,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pet"}}},"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Pet"}}}}},"400":{"description":"Invalid tag value"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet/{petId}":{"get":{"tags":["pet"],"summary":"Find pet by ID","description":"Returns a single pet","operationId":"getPetById","parameters":[{"name":"petId","in":"path","description":"ID of pet to return","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}}}},"400":{"description":"Invalid ID supplied"},"404":{"description":"Pet not found"}},"security":[{"api_key":[]},{"petstore_auth":["write:pets","read:pets"]}]},"post":{"tags":["pet"],"summary":"Updates a pet in the store with form data","description":"","operationId":"updatePetWithForm","parameters":[{"name":"petId","in":"path","description":"ID of pet that needs to be updated","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"name","in":"query","description":"Name of pet that needs to be updated","schema":{"type":"string"}},{"name":"status","in":"query","description":"Status of pet that needs to be updated","schema":{"type":"string"}}],"responses":{"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]},"delete":{"tags":["pet"],"summary":"Deletes a pet","description":"","operationId":"deletePet","parameters":[{"name":"api_key","in":"header","description":"","required":false,"schema":{"type":"string"}},{"name":"petId","in":"path","description":"Pet id to delete","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"400":{"description":"Invalid pet value"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet/{petId}/uploadImage":{"post":{"tags":["pet"],"summary":"uploads an image","description":"","operationId":"uploadFile","parameters":[{"name":"petId","in":"path","description":"ID of pet to update","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"additionalMetadata","in":"query","description":"Additional Metadata","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/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","responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}}}}}},"security":[{"api_key":[]}]}},"/store/order":{"post":{"tags":["store"],"summary":"Place an order for a pet","description":"Place a new order in the store","operationId":"placeOrder","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}},"application/xml":{"schema":{"$ref":"#/components/schemas/Order"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Order"}}}},"responses":{"200":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"405":{"description":"Invalid input"}}}},"/store/order/{orderId}":{"get":{"tags":["store"],"summary":"Find purchase order by ID","description":"For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions","operationId":"getOrderById","parameters":[{"name":"orderId","in":"path","description":"ID of order that needs to be fetched","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/Order"}},"application/json":{"schema":{"$ref":"#/components/schemas/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 value < 1000. Anything above 1000 or nonintegers will generate API errors","operationId":"deleteOrder","parameters":[{"name":"orderId","in":"path","description":"ID of the order that needs to be deleted","required":true,"schema":{"type":"integer","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","requestBody":{"description":"Created user object","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}},"application/xml":{"schema":{"$ref":"#/components/schemas/User"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/User"}}}},"responses":{"default":{"description":"successful operation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}},"application/xml":{"schema":{"$ref":"#/components/schemas/User"}}}}}}},"/user/createWithList":{"post":{"tags":["user"],"summary":"Creates list of users with given input array","description":"Creates list of users with given input array","operationId":"createUsersWithListInput","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}},"responses":{"200":{"description":"Successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/User"}},"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"default":{"description":"successful operation"}}}},"/user/login":{"get":{"tags":["user"],"summary":"Logs user into the system","description":"","operationId":"loginUser","parameters":[{"name":"username","in":"query","description":"The user name for login","required":false,"schema":{"type":"string"}},{"name":"password","in":"query","description":"The password for login in clear text","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"successful operation","headers":{"X-Rate-Limit":{"description":"calls per hour allowed by the user","schema":{"type":"integer","format":"int32"}},"X-Expires-After":{"description":"date in UTC when token expires","schema":{"type":"string","format":"date-time"}}},"content":{"application/xml":{"schema":{"type":"string"}},"application/json":{"schema":{"type":"string"}}}},"400":{"description":"Invalid username/password supplied"}}}},"/user/logout":{"get":{"tags":["user"],"summary":"Logs out current logged in user session","description":"","operationId":"logoutUser","parameters":[],"responses":{"default":{"description":"successful operation"}}}},"/user/{username}":{"get":{"tags":["user"],"summary":"Get user by user name","description":"","operationId":"getUserByName","parameters":[{"name":"username","in":"path","description":"The name that needs to be fetched. Use user1 for testing. ","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"successful operation","content":{"application/xml":{"schema":{"$ref":"#/components/schemas/User"}},"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"400":{"description":"Invalid username supplied"},"404":{"description":"User not found"}}},"put":{"tags":["user"],"summary":"Update user","description":"This can only be done by the logged in user.","operationId":"updateUser","parameters":[{"name":"username","in":"path","description":"name that need to be deleted","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Update an existent user in the store","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}},"application/xml":{"schema":{"$ref":"#/components/schemas/User"}},"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/User"}}}},"responses":{"default":{"description":"successful operation"}}},"delete":{"tags":["user"],"summary":"Delete user","description":"This can only be done by the logged in user.","operationId":"deleteUser","parameters":[{"name":"username","in":"path","description":"The name that needs to be deleted","required":true,"schema":{"type":"string"}}],"responses":{"400":{"description":"Invalid username supplied"},"404":{"description":"User not found"}}}}},"components":{"schemas":{"Order":{"type":"object","properties":{"id":{"type":"integer","format":"int64","example":10},"petId":{"type":"integer","format":"int64","example":198772},"quantity":{"type":"integer","format":"int32","example":7},"shipDate":{"type":"string","format":"date-time"},"status":{"type":"string","description":"Order Status","example":"approved","enum":["placed","approved","delivered"]},"complete":{"type":"boolean"}},"xml":{"name":"order"}},"Customer":{"type":"object","properties":{"id":{"type":"integer","format":"int64","example":100000},"username":{"type":"string","example":"fehguy"},"address":{"type":"array","xml":{"name":"addresses","wrapped":true},"items":{"$ref":"#/components/schemas/Address"}}},"xml":{"name":"customer"}},"Address":{"type":"object","properties":{"street":{"type":"string","example":"437 Lytton"},"city":{"type":"string","example":"Palo Alto"},"state":{"type":"string","example":"CA"},"zip":{"type":"string","example":"94301"}},"xml":{"name":"address"}},"Category":{"type":"object","properties":{"id":{"type":"integer","format":"int64","example":1},"name":{"type":"string","example":"Dogs"}},"xml":{"name":"category"}},"User":{"type":"object","properties":{"id":{"type":"integer","format":"int64","example":10},"username":{"type":"string","example":"theUser"},"firstName":{"type":"string","example":"John"},"lastName":{"type":"string","example":"James"},"email":{"type":"string","example":"john@email.com"},"password":{"type":"string","example":"12345"},"phone":{"type":"string","example":"12345"},"userStatus":{"type":"integer","description":"User Status","format":"int32","example":1}},"xml":{"name":"user"}},"Tag":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"tag"}},"Pet":{"required":["name","photoUrls"],"type":"object","properties":{"id":{"type":"integer","format":"int64","example":10},"name":{"type":"string","example":"doggie"},"category":{"$ref":"#/components/schemas/Category"},"photoUrls":{"type":"array","xml":{"wrapped":true},"items":{"type":"string","xml":{"name":"photoUrl"}}},"tags":{"type":"array","xml":{"wrapped":true},"items":{"$ref":"#/components/schemas/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"}},"xml":{"name":"##default"}}},"requestBodies":{"Pet":{"description":"Pet object that needs to be added to the store","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pet"}},"application/xml":{"schema":{"$ref":"#/components/schemas/Pet"}}}},"UserArray":{"description":"List of user object","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/User"}}}}}},"securitySchemes":{"petstore_auth":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://petstore3.swagger.io/oauth/authorize","scopes":{"write:pets":"modify pets in your account","read:pets":"read your pets"}}}},"api_key":{"type":"apiKey","name":"api_key","in":"header"}}}} \ No newline at end of file diff --git a/cypress/fixtures/api_artifacts/petstore_open_api_3.json b/cypress/fixtures/api_artifacts/petstore_open_api_3.json new file mode 100644 index 00000000..bf773c7a --- /dev/null +++ b/cypress/fixtures/api_artifacts/petstore_open_api_3.json @@ -0,0 +1,177 @@ +{ + "openapi": "3.0.0", + "info": { + "version": "1.0.0", + "title": "Swagger Petstore", + "license": { + "name": "MIT" + } + }, + "servers": [ + { + "url": "http://petstore.swagger.io/v1" + } + ], + "paths": { + "/pets": { + "get": { + "summary": "List all pets", + "operationId": "listPets", + "tags": [ + "pets" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "description": "How many items to return at one time (max 100)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "A paged array of pets", + "headers": { + "x-next": { + "description": "A link to the next page of responses", + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pets" + } + } + } + }, + "default": { + "description": "unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + }, + "post": { + "summary": "Create a pet", + "operationId": "createPets", + "tags": [ + "pets" + ], + "responses": { + "201": { + "description": "Null response" + }, + "default": { + "description": "unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + }, + "/pets/{petId}": { + "get": { + "summary": "Info for a specific pet", + "operationId": "showPetById", + "tags": [ + "pets" + ], + "parameters": [ + { + "name": "petId", + "in": "path", + "required": true, + "description": "The id of the pet to retrieve", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Expected response to a valid request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Pet" + } + } + } + }, + "default": { + "description": "unexpected error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Pet": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer", + "format": "int64" + }, + "name": { + "type": "string" + }, + "tag": { + "type": "string" + } + } + }, + "Pets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Pet" + } + }, + "Error": { + "type": "object", + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + } + } + } + } + } +} diff --git a/cypress/fixtures/api_artifacts/pizzashack.json b/cypress/fixtures/api_artifacts/pizzashack.json new file mode 100644 index 00000000..eec18146 --- /dev/null +++ b/cypress/fixtures/api_artifacts/pizzashack.json @@ -0,0 +1,506 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "PizzaShackAPI123", + "description": "This is a RESTFul API for Pizza Shack online pizza delivery store.\n", + "contact": { + "name": "John Doe", + "url": "http://www.pizzashack.com", + "email": "architecture@pizzashack.com" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0.0" + }, + "servers": [ + { + "url": "/" + } + ], + "security": [ + { + "default": [] + } + ], + "paths": { + "/order": { + "post": { + "description": "Create a new Order", + "requestBody": { + "$ref": "#/components/requestBodies/Order" + }, + "responses": { + "201": { + "description": "Created. Successful response with the newly created object as entity inthe body.Location header contains URL of newly created entity.", + "headers": { + "Location": { + "description": "The URL of the newly created resource.", + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "Content-Type": { + "description": "The content type of the body.", + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "description": "Bad Request. Invalid request or validation error.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "415": { + "description": "Unsupported Media Type. The entity of the request was in a not supported format.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "security": [ + { + "default": [] + } + ], + "x-auth-type": "Application & Application User", + "x-throttling-tier": "Unlimited", + "x-wso2-application-security": { + "security-types": [ + "oauth2" + ], + "optional": false + } + } + }, + "/menu": { + "get": { + "description": "Return a list of available menu items", + "responses": { + "200": { + "description": "OK. List of APIs is returned.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/MenuItem" + } + } + } + } + }, + "406": { + "description": "Not Acceptable. The requested media type is not supported", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "security": [ + { + "default": [] + } + ], + "x-auth-type": "Application & Application User", + "x-throttling-tier": "Unlimited", + "x-wso2-application-security": { + "security-types": [ + "oauth2" + ], + "optional": false + } + } + }, + "/order/{orderId}": { + "get": { + "description": "Get details of an Order", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "Order Id", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "string" + } + } + ], + "responses": { + "200": { + "description": "OK Requested Order will be returned", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "404": { + "description": "Not Found. Requested API does not exist.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "406": { + "description": "Not Acceptable. The requested media type is not supported", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "security": [ + { + "default": [] + } + ], + "x-auth-type": "Application & Application User", + "x-throttling-tier": "Unlimited", + "x-wso2-application-security": { + "security-types": [ + "oauth2" + ], + "optional": false + } + }, + "put": { + "description": "Update an existing Order", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "Order Id", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "string" + } + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/Order" + }, + "responses": { + "200": { + "description": "OK. Successful response with updated Order", + "headers": { + "Location": { + "description": "The URL of the newly created resource.", + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + }, + "Content-Type": { + "description": "The content type of the body.", + "style": "simple", + "explode": false, + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + } + }, + "400": { + "description": "Bad Request. Invalid request or validation error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + }, + "404": { + "description": "Not Found. The resource to be updated does not exist.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "security": [ + { + "default": [] + } + ], + "x-auth-type": "Application & Application User", + "x-throttling-tier": "Unlimited", + "x-wso2-application-security": { + "security-types": [ + "oauth2" + ], + "optional": false + } + }, + "delete": { + "description": "Delete an existing Order", + "parameters": [ + { + "name": "orderId", + "in": "path", + "description": "Order Id", + "required": true, + "style": "simple", + "explode": false, + "schema": { + "type": "string", + "format": "string" + } + } + ], + "responses": { + "200": { + "description": "OK. Resource successfully deleted." + }, + "404": { + "description": "Not Found. Resource to be deleted does not exist.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Error" + } + } + } + } + }, + "security": [ + { + "default": [] + } + ], + "x-auth-type": "Application & Application User", + "x-throttling-tier": "Unlimited", + "x-wso2-application-security": { + "security-types": [ + "oauth2" + ], + "optional": false + } + } + } + }, + "components": { + "schemas": { + "ErrorListItem": { + "title": "Description of individual errors that may have occurred during a request.", + "required": [ + "code", + "message" + ], + "properties": { + "message": { + "type": "string", + "description": "Description about individual errors occurred" + }, + "code": { + "type": "integer", + "format": "int64" + } + } + }, + "MenuItem": { + "title": "Pizza menu Item", + "required": [ + "name" + ], + "properties": { + "price": { + "type": "string" + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "image": { + "type": "string" + } + } + }, + "Order": { + "title": "Pizza Order", + "required": [ + "orderId" + ], + "properties": { + "customerName": { + "type": "string" + }, + "delivered": { + "type": "boolean" + }, + "address": { + "type": "string" + }, + "pizzaType": { + "type": "string" + }, + "creditCardNumber": { + "type": "string" + }, + "quantity": { + "type": "number" + }, + "orderId": { + "type": "string" + } + } + }, + "Error": { + "title": "Error object returned with 4XX HTTP status", + "required": [ + "code", + "message" + ], + "properties": { + "message": { + "type": "string", + "description": "Error message." + }, + "error": { + "type": "array", + "description": "If there are more than one error list them out. Ex. list out validation errors by each field.", + "items": { + "$ref": "#/components/schemas/ErrorListItem" + } + }, + "description": { + "type": "string", + "description": "A detail description about the error message." + }, + "code": { + "type": "integer", + "format": "int64" + }, + "moreInfo": { + "type": "string", + "description": "Preferably an url with more details about the error." + } + } + } + }, + "requestBodies": { + "Order": { + "description": "Order object that needs to be added", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Order" + } + } + }, + "required": true + } + }, + "securitySchemes": { + "default": { + "type": "oauth2", + "flows": { + "implicit": { + "authorizationUrl": "https://test.com", + "scopes": {} + } + } + } + } + }, + "x-wso2-auth-header": "Authorization", + "x-wso2-cors": { + "corsConfigurationEnabled": false, + "accessControlAllowOrigins": [ + "*" + ], + "accessControlAllowCredentials": false, + "accessControlAllowHeaders": [ + "authorization", + "Access-Control-Allow-Origin", + "Content-Type", + "SOAPAction", + "apikey", + "Internal-Key" + ], + "accessControlAllowMethods": [ + "GET", + "PUT", + "POST", + "DELETE", + "PATCH", + "OPTIONS" + ] + }, + "x-wso2-production-endpoints": { + "urls": [ + "https://localhost:9443/am/sample/pizzashack/v1/api/" + ], + "type": "http" + }, + "x-wso2-sandbox-endpoints": { + "urls": [ + "https://localhost:9443/am/sample/pizzashack/v1/api/" + ], + "type": "http" + }, + "x-wso2-basePath": "/pizzashack/1.0.0", + "x-wso2-transports": [ + "http", + "https" + ], + "x-wso2-response-cache": { + "enabled": false, + "cacheTimeoutInSeconds": 300 + } +} \ No newline at end of file diff --git a/cypress/fixtures/api_artifacts/sample.crt b/cypress/fixtures/api_artifacts/sample.crt new file mode 100644 index 00000000..cf1df6dc Binary files /dev/null and b/cypress/fixtures/api_artifacts/sample.crt differ diff --git a/cypress/fixtures/api_artifacts/sample.crt.pem b/cypress/fixtures/api_artifacts/sample.crt.pem new file mode 100644 index 00000000..f22b13be --- /dev/null +++ b/cypress/fixtures/api_artifacts/sample.crt.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIEdW6yYjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJM +SzEQMA4GA1UECBMHV2VzdGVybjEQMA4GA1UEBxMHQ29sb21ibzENMAsGA1UEChME +d3NvMjENMAsGA1UECxMEd3NvMjESMBAGA1UEAxMJbG9jYWxob3N0MCAXDTE5MDUy +MTEwMDIzMFoYDzIxMTkwNDI3MTAwMjMwWjBjMQswCQYDVQQGEwJMSzEQMA4GA1UE +CBMHV2VzdGVybjEQMA4GA1UEBxMHQ29sb21ibzENMAsGA1UEChMEd3NvMjENMAsG +A1UECxMEd3NvMjESMBAGA1UEAxMJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAsji2de+zHK/8fyRLeb6VUeTIxF4Ae4Dsa7grtTz2dSRb +dd2NEog5AhmDFauALi80T9oL5cOV2cA4RHsdSCyRmpGZcORoApi02SXL3p5a3EXG +H4au+vROYGNCWtZSiT1hciL34LCPKSFN/rqYbKUVL0oVH/9wRX7Uyi82myyiwGFT +tS5tIwwP/kgQG4wc6JKoehfObnfEflw6A9WVCBzEoXYlxJH+lIE98hTi5vJ8XSUI +stZkZsGcPxq5MsGJZb2FNCDt/+ud27G4NEINVZg/oS/za4Q54Z0SIX0BpR0Ik9jc +qL7chHfG+Vusf08eWDMRLch+lLAMqZr0GJT6ApdIrQIDAQABoyEwHzAdBgNVHQ4E +FgQUaVGvHApC1tNkxZ7nwayZWdxW17swDQYJKoZIhvcNAQELBQADggEBAAmJtGM+ +wqdKviqQCejNNg05DgjxNYV7pUc9l7Xe98bQzZdlh5NUYHqfTV9PknolpgvN1uei +9qy2Lu/MNjgdbxHceZbKE8YXRKjBA03xFTkpl1LyTz9dUZzFqRwrT+waIQTLNzH1 +cGWGV8vvLnmgbCHlY+O5YBw10pdMg2pEnkVt9p3hBLTxZ3j+1gqhUUXwCu8ScltC +pRaVs+0daDigE8LmSU6M5iJkqYjbrHJ4J8BFpnXBnQGjMWaHiy3hzopwwlfSBo1Q +XnH8coBasFtYDnVQCoNtDSwMqrct8e8XuRS3krA5HDP1cM9i9goftAmQ5J/efsvt +hTn2nnJrYeO4sbg= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/cypress/fixtures/api_artifacts/sampleAddHeader.j2 b/cypress/fixtures/api_artifacts/sampleAddHeader.j2 new file mode 100644 index 00000000..f5fe3c8f --- /dev/null +++ b/cypress/fixtures/api_artifacts/sampleAddHeader.j2 @@ -0,0 +1 @@ + diff --git a/cypress/fixtures/api_artifacts/schema_graphql.graphql b/cypress/fixtures/api_artifacts/schema_graphql.graphql new file mode 100644 index 00000000..8b0b318b --- /dev/null +++ b/cypress/fixtures/api_artifacts/schema_graphql.graphql @@ -0,0 +1,199 @@ +schema { + query: Query + mutation: Mutation + subscription: Subscription +} + +# The query type, represents all of the entry points into our object graph +type Query { + hero(episode: Episode): Character + reviews(episode: Episode!): [Review] + search(text: String): [SearchResult] + character(id: ID!): Character + droid(id: ID!): Droid + human(id: ID!): Human + allHumans(first: Int): [Human] + allDroids(first: Int): [Droid] + allCharacters(first: Int): [Character] + starship(id: ID!): Starship +} + +# The mutation type, represents all updates we can make to our data +type Mutation { + createReview(episode: Episode, review: ReviewInput!): Review +} + +# The subscription type, represents all subscriptions we can make to our data +type Subscription { + reviewAdded(episode: Episode): Review +} + +# The episodes in the Star Wars trilogy +enum Episode { + # Star Wars Episode IV: A New Hope, released in 1977. + NEWHOPE + + # Star Wars Episode V: The Empire Strikes Back, released in 1980. + EMPIRE + + # Star Wars Episode VI: Return of the Jedi, released in 1983. + JEDI + + # Star Wars Episode III: Revenge of the Sith, released in 2005 + SITH +} + +# A character from the Star Wars universe +interface Character { + # The ID of the character + id: ID! + + # The name of the character + name: String! + + # The friends of the character, or an empty list if they have none + friends: [Character] + + # The friends of the character exposed as a connection with edges + friendsConnection(first: Int, after: ID): FriendsConnection! + + # The movies this character appears in + appearsIn: [Episode]! +} + +# Units of height +enum LengthUnit { + # The standard unit around the world + METER + + # Primarily used in the United States + FOOT +} + +# A humanoid creature from the Star Wars universe +type Human implements Character { + # The ID of the human + id: ID! + + # What this human calls themselves + name: String! + + # The home planet of the human, or null if unknown + homePlanet: String + + # Height in the preferred unit, default is meters + height(unit: LengthUnit = METER): Float + + # Mass in kilograms, or null if unknown + mass: Float + + # This human's friends, or an empty list if they have none + friends: [Character] + + # The friends of the human exposed as a connection with edges + friendsConnection(first: Int, after: ID): FriendsConnection! + + # The movies this human appears in + appearsIn: [Episode]! + + # A list of starships this person has piloted, or an empty list if none + starships: [Starship] +} + +# An autonomous mechanical character in the Star Wars universe +type Droid implements Character { + # The ID of the droid + id: ID! + + # What others call this droid + name: String! + + # This droid's friends, or an empty list if they have none + friends: [Character] + + # The friends of the droid exposed as a connection with edges + friendsConnection(first: Int, after: ID): FriendsConnection! + + # The movies this droid appears in + appearsIn: [Episode]! + + # This droid's primary function + primaryFunction: String +} + +# A connection object for a character's friends +type FriendsConnection { + # The total number of friends + totalCount: Int + + # The edges for each of the character's friends. + edges: [FriendsEdge] + + # A list of the friends, as a convenience when edges are not needed. + friends: [Character] + + # Information for paginating this connection + pageInfo: PageInfo! +} + +# An edge object for a character's friends +type FriendsEdge { + # A cursor used for pagination + cursor: ID! + + # The character represented by this friendship edge + node: Character +} + +# Information for paginating this connection +type PageInfo { + startCursor: ID + endCursor: ID + hasNextPage: Boolean! +} + +# Represents a review for a movie +type Review { + # The movie + episode: Episode + + # The number of stars this review gave, 1-5 + stars: Int! + + # Comment about the movie + commentary: String +} + +# The input object sent when someone is creating a new review +input ReviewInput { + # 0-5 stars + stars: Int! + + # Comment about the movie, optional + commentary: String + + # Favorite color, optional + favorite_color: ColorInput +} + +# The input object sent when passing in a color +input ColorInput { + red: Int! + green: Int! + blue: Int! +} + +type Starship { + # The ID of the starship + id: ID! + + # The name of the starship + name: String! + + # Length of the starship, along the longest axis + length(unit: LengthUnit = METER): Float + + coordinates: [[Float!]!] +} + +union SearchResult = Human | Droid | Starship \ No newline at end of file diff --git a/cypress/fixtures/api_artifacts/swagger_2.0.json b/cypress/fixtures/api_artifacts/swagger_2.0.json new file mode 100644 index 00000000..d9db27ad --- /dev/null +++ b/cypress/fixtures/api_artifacts/swagger_2.0.json @@ -0,0 +1 @@ +{"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.5","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":[{"url":"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/{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"]}]}},"/pet":{"post":{"tags":["pet"],"summary":"Add a new pet to the store","description":"","operationId":"addPet","consumes":["application/json","application/xml"],"produces":["application/json","application/xml"],"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/json","application/xml"],"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/json","application/xml"],"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":"Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.","operationId":"findPetsByTags","produces":["application/json","application/xml"],"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/json","application/xml"],"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/json","application/xml"],"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/json","application/xml"],"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"]}]}},"/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","consumes":["application/json"],"produces":["application/json","application/xml"],"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/json","application/xml"],"parameters":[{"name":"orderId","in":"path","description":"ID of pet that needs to be fetched","required":true,"type":"integer","maximum":10,"minimum":1,"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/json","application/xml"],"parameters":[{"name":"orderId","in":"path","description":"ID of the order that needs to be deleted","required":true,"type":"integer","minimum":1,"format":"int64"}],"responses":{"400":{"description":"Invalid ID supplied"},"404":{"description":"Order not found"}}}},"/user/createWithList":{"post":{"tags":["user"],"summary":"Creates list of users with given input array","description":"","operationId":"createUsersWithListInput","consumes":["application/json"],"produces":["application/json","application/xml"],"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/{username}":{"get":{"tags":["user"],"summary":"Get user by user name","description":"","operationId":"getUserByName","produces":["application/json","application/xml"],"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","consumes":["application/json"],"produces":["application/json","application/xml"],"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/json","application/xml"],"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"}}}},"/user/login":{"get":{"tags":["user"],"summary":"Logs user into the system","description":"","operationId":"loginUser","produces":["application/json","application/xml"],"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","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"400":{"description":"Invalid username/password supplied"}}}},"/user/logout":{"get":{"tags":["user"],"summary":"Logs out current logged in user session","description":"","operationId":"logoutUser","produces":["application/json","application/xml"],"parameters":[],"responses":{"default":{"description":"successful operation"}}}},"/user/createWithArray":{"post":{"tags":["user"],"summary":"Creates list of users with given input array","description":"","operationId":"createUsersWithArrayInput","consumes":["application/json"],"produces":["application/json","application/xml"],"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":{"post":{"tags":["user"],"summary":"Create user","description":"This can only be done by the logged in user.","operationId":"createUser","consumes":["application/json"],"produces":["application/json","application/xml"],"parameters":[{"in":"body","name":"body","description":"Created user object","required":true,"schema":{"$ref":"#/definitions/User"}}],"responses":{"default":{"description":"successful operation"}}}}},"securityDefinitions":{"api_key":{"type":"apiKey","name":"api_key","in":"header"},"petstore_auth":{"type":"oauth2","authorizationUrl":"https://petstore.swagger.io/oauth/authorize","flow":"implicit","scopes":{"read:pets":"read your pets","write:pets":"modify pets in your account"}}},"definitions":{"ApiResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"type":{"type":"string"},"message":{"type":"string"}}},"Category":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Category"}},"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":{"wrapped":true},"items":{"type":"string","xml":{"name":"photoUrl"}}},"tags":{"type":"array","xml":{"wrapped":true},"items":{"xml":{"name":"tag"},"$ref":"#/definitions/Tag"}},"status":{"type":"string","description":"pet status in the store","enum":["available","pending","sold"]}},"xml":{"name":"Pet"}},"Tag":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Tag"}},"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"}},"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"}}},"externalDocs":{"description":"Find out more about Swagger","url":"http://swagger.io"}} \ No newline at end of file diff --git a/cypress/fixtures/api_artifacts/swagger_2.0_.json b/cypress/fixtures/api_artifacts/swagger_2.0_.json new file mode 100644 index 00000000..84f65992 --- /dev/null +++ b/cypress/fixtures/api_artifacts/swagger_2.0_.json @@ -0,0 +1 @@ +{"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.5","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":"toy","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":{"/toy/{petId}/uploadImage":{"post":{"tags":["toy"],"summary":"uploads an image","description":"","operationId":"uploadFile","consumes":["multipart/form-data"],"produces":["application/json"],"parameters":[{"name":"petId","in":"path","description":"ID of toy 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"]}]}},"/toy":{"post":{"tags":["toy"],"summary":"Add a new toy to the store","description":"","operationId":"addPet","consumes":["application/json","application/xml"],"produces":["application/json","application/xml"],"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":["toy"],"summary":"Update an existing toy","description":"","operationId":"updatePet","consumes":["application/json","application/xml"],"produces":["application/json","application/xml"],"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"]}]}},"/toy/findByStatus":{"get":{"tags":["toy"],"summary":"Finds Pets by status","description":"Multiple status values can be provided with comma separated strings","operationId":"findPetsByStatus","produces":["application/json","application/xml"],"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"]}]}},"/toy/findByTags":{"get":{"tags":["toy"],"summary":"Finds Pets by tags","description":"Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.","operationId":"findPetsByTags","produces":["application/json","application/xml"],"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}},"/toy/{petId}":{"get":{"tags":["toy"],"summary":"Find toy by ID","description":"Returns a single toy","operationId":"getPetById","produces":["application/json","application/xml"],"parameters":[{"name":"petId","in":"path","description":"ID of toy 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":["toy"],"summary":"Updates a toy in the store with form data","description":"","operationId":"updatePetWithForm","consumes":["application/x-www-form-urlencoded"],"produces":["application/json","application/xml"],"parameters":[{"name":"petId","in":"path","description":"ID of toy that needs to be updated","required":true,"type":"integer","format":"int64"},{"name":"name","in":"formData","description":"Updated name of the toy","required":false,"type":"string"},{"name":"status","in":"formData","description":"Updated status of the toy","required":false,"type":"string"}],"responses":{"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]},"delete":{"tags":["toy"],"summary":"Deletes a toy","description":"","operationId":"deletePet","produces":["application/json","application/xml"],"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"]}]}},"/store/inventory":{"get":{"tags":["store"],"summary":"Returns toy 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 toy","description":"","operationId":"placeOrder","consumes":["application/json"],"produces":["application/json","application/xml"],"parameters":[{"in":"body","name":"body","description":"order placed for purchasing the toy","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/json","application/xml"],"parameters":[{"name":"orderId","in":"path","description":"ID of toy that needs to be fetched","required":true,"type":"integer","maximum":10,"minimum":1,"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/json","application/xml"],"parameters":[{"name":"orderId","in":"path","description":"ID of the order that needs to be deleted","required":true,"type":"integer","minimum":1,"format":"int64"}],"responses":{"400":{"description":"Invalid ID supplied"},"404":{"description":"Order not found"}}}},"/user/createWithList":{"post":{"tags":["user"],"summary":"Creates list of users with given input array","description":"","operationId":"createUsersWithListInput","consumes":["application/json"],"produces":["application/json","application/xml"],"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/{username}":{"get":{"tags":["user"],"summary":"Get user by user name","description":"","operationId":"getUserByName","produces":["application/json","application/xml"],"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","consumes":["application/json"],"produces":["application/json","application/xml"],"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/json","application/xml"],"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"}}}},"/user/login":{"get":{"tags":["user"],"summary":"Logs user into the system","description":"","operationId":"loginUser","produces":["application/json","application/xml"],"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","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"400":{"description":"Invalid username/password supplied"}}}},"/user/logout":{"get":{"tags":["user"],"summary":"Logs out current logged in user session","description":"","operationId":"logoutUser","produces":["application/json","application/xml"],"parameters":[],"responses":{"default":{"description":"successful operation"}}}},"/user/createWithArray":{"post":{"tags":["user"],"summary":"Creates list of users with given input array","description":"","operationId":"createUsersWithArrayInput","consumes":["application/json"],"produces":["application/json","application/xml"],"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":{"post":{"tags":["user"],"summary":"Create user","description":"This can only be done by the logged in user.","operationId":"createUser","consumes":["application/json"],"produces":["application/json","application/xml"],"parameters":[{"in":"body","name":"body","description":"Created user object","required":true,"schema":{"$ref":"#/definitions/User"}}],"responses":{"default":{"description":"successful operation"}}}}},"securityDefinitions":{"api_key":{"type":"apiKey","name":"api_key","in":"header"},"petstore_auth":{"type":"oauth2","authorizationUrl":"https://petstore.swagger.io/oauth/authorize","flow":"implicit","scopes":{"read:pets":"read your pets","write:pets":"modify pets in your account"}}},"definitions":{"ApiResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"type":{"type":"string"},"message":{"type":"string"}}},"Category":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Category"}},"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":{"wrapped":true},"items":{"type":"string","xml":{"name":"photoUrl"}}},"tags":{"type":"array","xml":{"wrapped":true},"items":{"xml":{"name":"tag"},"$ref":"#/definitions/Tag"}},"status":{"type":"string","description":"toy status in the store","enum":["available","pending","sold"]}},"xml":{"name":"Pet"}},"Tag":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Tag"}},"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"}},"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"}}},"externalDocs":{"description":"Find out more about Swagger","url":"http://swagger.io"}} \ No newline at end of file diff --git a/cypress/fixtures/applicationsList.json b/cypress/fixtures/applicationsList.json new file mode 100644 index 00000000..41f335a7 --- /dev/null +++ b/cypress/fixtures/applicationsList.json @@ -0,0 +1,21 @@ +{ + "count": 1, + "list": [{ + "applicationId": "844ec54e-70d3-4f9b-9b48-25853e857fc3", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin" + }], + "pagination": { + "offset": 0, + "limit": 10, + "total": 1, + "next": "", + "previous": "" + } +} diff --git a/cypress/fixtures/defaultApplication.json b/cypress/fixtures/defaultApplication.json new file mode 100644 index 00000000..889618e9 --- /dev/null +++ b/cypress/fixtures/defaultApplication.json @@ -0,0 +1,15 @@ +{ + "applicationId": "844ec54e-70d3-4f9b-9b48-25853e857fc3", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "tokenType": "JWT", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "keys": [], + "attributes": {}, + "subscriptionScopes": [], + "owner": "admin", + "hashEnabled": false +} \ No newline at end of file diff --git a/cypress/fixtures/devportalKeyManagerlisting.json b/cypress/fixtures/devportalKeyManagerlisting.json new file mode 100644 index 00000000..1ea9ddb2 --- /dev/null +++ b/cypress/fixtures/devportalKeyManagerlisting.json @@ -0,0 +1,144 @@ +{ + "count": 2, + "list": [{ + "id": "f65de296-1013-49f9-936b-261695c81362", + "name": "SampleExternalKM", + "type": "Other", + "displayName": "Sample External KM", + "description": "This is a sample external key manager", + "enabled": true, + "availableGrantTypes": ["authorization_code", "implicit", "refresh_token", "password", "client_credentials"], + "tokenEndpoint": "https://localhost/oauth2/default/v1/token", + "revokeEndpoint": "https://localhost/oauth2/default/v1/revoke", + "userInfoEndpoint": null, + "enableTokenGeneration": true, + "enableTokenEncryption": false, + "enableTokenHashing": false, + "enableOAuthAppCreation": true, + "enableMapOAuthConsumerApps": true, + "applicationConfiguration": [{ + "name": "app_type", + "label": "Application Type", + "type": "select", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type of the application to create", + "values": ["regular_web", "native", "spa", "non_interactive"], + "default": "regular_web" + }, { + "name": "token_endpoint_auth_method", + "label": "Token Endpoint Authentication Method", + "type": "select", + "required": true, + "mask": true, + "multiple": false, + "tooltip": "How to Authenticate Token Endpoint", + "values": ["client_secret_basic", "client_secret_post"], + "default": "client_secret_basic" + }, { + "name": "audience_of_api", + "label": "Audience of the API", + "type": "text", + "required": true, + "mask": false, + "multiple": false, + "tooltip": "The audience of the API which intended to use this application", + "values": [], + "default": "" + }], + "alias": "http://default", + "additionalProperties": {}, + "tokenType": "BOTH" + }, { + "id": "f47d1c4c-fbc6-46ac-bda1-c8e3fb7539c2", + "name": "Resident Key Manager", + "type": "default", + "displayName": null, + "description": "This is Resident Key Manager", + "enabled": true, + "availableGrantTypes": ["refresh_token", "urn:ietf:params:oauth:grant-type:saml2-bearer", "password", "client_credentials", "iwa:ntlm", "authorization_code", "urn:ietf:params:oauth:grant-type:token-exchange", "urn:ietf:params:oauth:grant-type:jwt-bearer"], + "tokenEndpoint": "https://localhost:9443/oauth2/token", + "revokeEndpoint": "https://localhost:9443/oauth2/revoke", + "userInfoEndpoint": null, + "enableTokenGeneration": true, + "enableTokenEncryption": false, + "enableTokenHashing": false, + "enableOAuthAppCreation": true, + "enableMapOAuthConsumerApps": false, + "applicationConfiguration": [{ + "name": "application_access_token_expiry_time", + "label": "Application Access Token Expiry Time ", + "type": "input", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type Application Access Token Expiry Time in seconds ", + "values": [], + "default": "N/A" + }, { + "name": "user_access_token_expiry_time", + "label": "User Access Token Expiry Time ", + "type": "input", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type User Access Token Expiry Time in seconds ", + "values": [], + "default": "N/A" + }, { + "name": "refresh_token_expiry_time", + "label": "Refresh Token Expiry Time ", + "type": "input", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type Refresh Token Expiry Time in seconds ", + "values": [], + "default": "N/A" + }, { + "name": "id_token_expiry_time", + "label": "Id Token Expiry Time", + "type": "input", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type ID Token Expiry Time in seconds ", + "values": [], + "default": "N/A" + }, { + "name": "pkceMandatory", + "label": "Enable PKCE", + "type": "checkbox", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Enable PKCE", + "values": [], + "default": "false" + }, { + "name": "pkceSupportPlain", + "label": "Support PKCE Plain text", + "type": "checkbox", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "S256 is recommended, plain text too can be used.", + "values": [], + "default": "false" + }, { + "name": "bypassClientCredentials", + "label": "Public client", + "type": "checkbox", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Allow authentication without the client secret.", + "values": [], + "default": "false" + }], + "alias": null, + "additionalProperties": {}, + "tokenType": "DIRECT" + }] +} diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 00000000..da18d935 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} \ No newline at end of file diff --git a/cypress/fixtures/generatedKeys.json b/cypress/fixtures/generatedKeys.json new file mode 100644 index 00000000..cf3acb26 --- /dev/null +++ b/cypress/fixtures/generatedKeys.json @@ -0,0 +1,26 @@ +{ + "keyMappingId": "2a5da60d-c8d5-4306-ac4c-3bda5d2232b6", + "keyManager": "f47d1c4c-fbc6-46ac-bda1-c8e3fb7539c2", + "consumerKey": "hawB9KXRtMidkyET96fYoyXJ9uIa", + "consumerSecret": "aUb20BaH75JW_MZTiIipp781qNka", + "supportedGrantTypes": ["refresh_token", "urn:ietf:params:oauth:grant-type:saml2-bearer", "password", "client_credentials", "iwa:ntlm", "urn:ietf:params:oauth:grant-type:token-exchange", "urn:ietf:params:oauth:grant-type:jwt-bearer"], + "callbackUrl": "", + "keyState": "APPROVED", + "keyType": "PRODUCTION", + "mode": "CREATED", + "groupId": null, + "token": { + "accessToken": "eyJ4NXQiOiJNell4TW1Ga09HWXdNV0kwWldObU5EY3hOR1NNFpUQTNNV0kyTkRBelpHUXpOR00wWkdSbE5qSmtPREZrWkRSaU9URmtNV0ZoTXpVMlpHVmxOZyIsImtpZCI6Ik16WXhNbUZrT0dZd01XSTBaV05tTkRjeE5HWXdZbU00WlRBM0REF6WkdRek5HTTBaR1JsTmpKa09ERmtaRFJpT1RGa01XRmhNelUyWkdWbE5nX1JTMjU2IiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJhZG1pbiIsImF1dCI6IkFQUExJOIiwiYXVkIjoiaGF3QjlLWFJ0TWlka3lFVDk2ZllveVhKOXVJYSIsIm5iZiI6MTYzOTU5NDUyMiwiYXpwIjoiaGF3QjlLWFJ0TWlka3lFVDk2ZllveVhKOXVJYSIsInNjb3BlIjoiZGVmYXVsdCIsImlzcyI6Imh0dHBzOlwvXC9sb2NhbGhvc3Q6OTQ0M1wvb2F1dGgyXC90b2tlbiIsImV4cCI6MTYzOTU5ODEyMiwiaWF0IjoxNjM5NTk0NTIyLCJqdGkiOiJiMTFkMGZiZC1lYWE1LTRmNTYtYWU3NS1kYmZiYjUwMGE3NGYifQ.qJ1ywm5B3xC4ACStxYL0QRU1EDa4A-VihzQJCaUs1wkmSfRuMUijj3LA4dGcojMwXAz5fTcX76bCA9kjKWGpcj-1_Kf2UZUWWCuaDn1LUtdiHg2q9v2G0U_s4kDGYa4BrQqRRS1nkekxHItDtqiBReMsH2wsl1MTUfXDb6oPAE9Al_bo1JqLBxSmfBM_l87FOqGSBZaG1oninbznDyZfRo9qBM1-v0tIv3x51OxkbTUe54ZxdNpdW3XpFasONUX3Pvr5fQy6NqkSfyldGBGy_CiT86NR7TTjwYUgdb0UQzeh_HqdswgXmezwo9w8RTR82CDGvtE-kc9CWdjqAdxWuQ", + "tokenScopes": ["default"], + "validityTime": 3600 + }, + "additionalProperties": { + "id_token_expiry_time": 3600, + "application_access_token_expiry_time": 3600, + "user_access_token_expiry_time": 3600, + "bypassClientCredentials": false, + "pkceMandatory": false, + "pkceSupportPlain": false, + "refresh_token_expiry_time": 86400 + } +} \ No newline at end of file diff --git a/cypress/fixtures/oauthKeys.json b/cypress/fixtures/oauthKeys.json new file mode 100644 index 00000000..4884d433 --- /dev/null +++ b/cypress/fixtures/oauthKeys.json @@ -0,0 +1 @@ +{"count":0,"list":[]} \ No newline at end of file diff --git a/cypress/fixtures/throttlingPolicy.json b/cypress/fixtures/throttlingPolicy.json new file mode 100644 index 00000000..612fee18 --- /dev/null +++ b/cypress/fixtures/throttlingPolicy.json @@ -0,0 +1,26 @@ +{ + "name": "Unlimited", + "description": "Allows unlimited requests", + "policyLevel": "APPLICATION", + "attributes": {}, + "requestCount": 2147483647, + "dataUnit": null, + "unitTime": 0, + "timeUnit": "ms", + "rateLimitCount": 0, + "rateLimitTimeUnit": null, + "quotaPolicyType": null, + "tierPlan": "FREE", + "stopOnQuotaReach": true, + "monetizationAttributes": { + "billingType": null, + "billingCycle": null, + "fixedPrice": null, + "pricePerRequest": null, + "currencyType": null + }, + "throttlingPolicyPermissions": { + "type": "ALLOW", + "roles": ["Internal/everyone"] + } +} \ No newline at end of file diff --git a/cypress/fixtures/updatedOauthkeys.json b/cypress/fixtures/updatedOauthkeys.json new file mode 100644 index 00000000..df7f5c8f --- /dev/null +++ b/cypress/fixtures/updatedOauthkeys.json @@ -0,0 +1,29 @@ +{ + "count": 1, + "list": [{ + "keyMappingId": "2a5da60d-c8d5-4306-ac4c-3bda5d2232b6", + "keyManager": "Resident Key Manager", + "consumerKey": "hawB9KXRtMidkyET96fYoyXJ9uIa", + "consumerSecret": "aUb20BaH75JW_MZTiIipp781qNka", + "supportedGrantTypes": ["refresh_token", "urn:ietf:params:oauth:grant-type:saml2-bearer", "password", "client_credentials", "iwa:ntlm", "urn:ietf:params:oauth:grant-type:token-exchange", "urn:ietf:params:oauth:grant-type:jwt-bearer"], + "callbackUrl": "", + "keyState": "COMPLETED", + "keyType": "PRODUCTION", + "mode": "CREATED", + "groupId": null, + "token": { + "accessToken": null, + "tokenScopes": [], + "validityTime": 0 + }, + "additionalProperties": { + "id_token_expiry_time": 3600, + "application_access_token_expiry_time": 3600, + "user_access_token_expiry_time": 3600, + "bypassClientCredentials": false, + "pkceMandatory": false, + "pkceSupportPlain": false, + "refresh_token_expiry_time": 86400 + } + }] +} \ No newline at end of file diff --git a/cypress/fixtures/welknownURLData.json b/cypress/fixtures/welknownURLData.json new file mode 100644 index 00000000..d7bbbbe9 --- /dev/null +++ b/cypress/fixtures/welknownURLData.json @@ -0,0 +1,47 @@ +{ + "valid": true, + "value": { + "id": null, + "name": null, + "displayName": null, + "type": "Auth0", + "description": null, + "wellKnownEndpoint": "https://localhost:9090/oauth2/default/.well-known/oauth-authorization-server", + "introspectionEndpoint": "https://localhost:9090/oauth2/default/v1/introspect", + "clientRegistrationEndpoint": "https://localhost:9090/oauth2/v1/clients", + "tokenEndpoint": "https://localhost:9090/oauth2/default/v1/token", + "displayTokenEndpoint": null, + "revokeEndpoint": "https://localhost:9090/oauth2/default/v1/revoke", + "displayRevokeEndpoint": null, + "userInfoEndpoint": null, + "authorizeEndpoint": "https://localhost:9090/oauth2/default/v1/authorize", + "endpoints": [], + "certificates": { + "type": "JWKS", + "value": "https://localhost:9090/oauth2/default/v1/keys" + }, + "issuer": "https://localhost:9090/oauth2/default", + "alias": null, + "scopeManagementEndpoint": null, + "availableGrantTypes": [ + "authorization_code", + "implicit", + "refresh_token", + "password", + "client_credentials" + ], + "enableTokenGeneration": true, + "enableTokenEncryption": false, + "enableTokenHashing": false, + "enableMapOAuthConsumerApps": true, + "enableOAuthAppCreation": true, + "enableSelfValidationJWT": true, + "claimMapping": [], + "consumerKeyClaim": null, + "scopesClaim": null, + "tokenValidation": [], + "enabled": true, + "additionalProperties": null, + "tokenType": "DIRECT" + } +} diff --git a/cypress/integration/0-init/00-init.spec.js b/cypress/integration/0-init/00-init.spec.js new file mode 100644 index 00000000..a55667d0 --- /dev/null +++ b/cypress/integration/0-init/00-init.spec.js @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("init-00 : Prepare test data for execution", () => { + it.only("Util test to add test users", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + const { publisher, developer, password, carbonUsername, carbonPassword, tenantUser, testTenant } = Utils.getUserInfo(); + cy.carbonLogin(carbonUsername, carbonPassword); + cy.addNewUser(publisher, ['Internal/publisher', 'Internal/creator', 'Internal/everyone'], password); + cy.addNewUser(developer, ['Internal/subscriber', 'Internal/everyone'], password); + cy.addNewTenant(testTenant, 'admin'); + cy.carbonLogout(); + cy.carbonLogin(carbonUsername, carbonPassword, testTenant); + cy.addNewUser(publisher, ['Internal/publisher', 'Internal/creator', 'Internal/everyone'], password); + cy.addNewUser(developer, ['Internal/subscriber', 'Internal/everyone'], password); + cy.carbonLogout(); + }); +}); \ No newline at end of file diff --git a/cypress/integration/admin/00-add-edit-delete-microgateway-environments.spec.js b/cypress/integration/admin/00-add-edit-delete-microgateway-environments.spec.js new file mode 100644 index 00000000..af3ed0ac --- /dev/null +++ b/cypress/integration/admin/00-add-edit-delete-microgateway-environments.spec.js @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("admin-00 : Add Edit Delete Microgateway Environments", () => { + + const { carbonUsername, carbonPassword, testTenant, superTenant } = Utils.getUserInfo(); + + const addEditDeleteMicrogatewayEnvironment = (usernameLocal, passwordLocal, tenant) => { + cy.loginToAdmin(usernameLocal, passwordLocal, tenant); + cy.get('[data-testid="Gateways"]').click(); + cy.get('.MuiButton-label').contains('Add Gateway Environment').click(); + cy.get('input[name="name"]').type('MARKETING_STORE'); + cy.get('input[name="displayName"]').type('MARKETING_STORE'); + cy + .get('[data-testid="vhost"]') + .find('input[name="0"]').type('localhost'); + // Wait until the label is saved + cy.intercept('GET', '**/environments').as('environmentsGet'); + cy.get('button > span').contains('Save').click(); + cy.wait('@environmentsGet',{timeout: 3000}).then(() => { + cy.get('table tr td').contains('MARKETING_STORE').should('exist'); + }); + + // editing + cy.get('[data-testid="MuiDataTableBodyCell-5-1"] div > div > button:first-child').click(); + cy.get('textarea[name="description"]').type('marketing store'); + // Wait until the label is saved + cy.intercept('GET', '**/environments').as('environmentsGet'); + cy.get('button > span').contains('Save').click(); + cy.wait('@environmentsGet', {timeout: 3000}).then(() => { + cy.get('table tr td').contains('marketing store').should('exist'); + }); + + // deleting + cy.get('[data-testid="MuiDataTableBodyCell-5-1"] div > div > button:nth-child(2)').click(); + cy.get('button > span').contains('Delete').click(); + cy.get('div[role="status"]').should('have.text','Gateway Environment deleted successfully'); + } + it.only("Add Edit Delete Microgateway Environments - super admin", () => { + addEditDeleteMicrogatewayEnvironment(carbonUsername, carbonPassword, superTenant); + }); + it.only("Add Edit Delete Microgateway Environments - tenant user", () => { + addEditDeleteMicrogatewayEnvironment(carbonUsername, carbonPassword, testTenant) + }); + +}) \ No newline at end of file diff --git a/cypress/integration/admin/01-add-edit-delete-advance-throttle-policies.spec.js b/cypress/integration/admin/01-add-edit-delete-advance-throttle-policies.spec.js new file mode 100644 index 00000000..c6634db7 --- /dev/null +++ b/cypress/integration/admin/01-add-edit-delete-advance-throttle-policies.spec.js @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("admin-01 : Add Edit Delete advance throttle policies", () => { + + const { carbonUsername, carbonPassword, testTenant, superTenant } = Utils.getUserInfo(); + + const addEditDeleteAdvancedThrottlePolicies = (usernameLocal, passwordLocal, tenant) => { + cy.loginToAdmin(usernameLocal, passwordLocal, tenant); + const policyName = '030PerMin'; + cy.get('[data-testid="Advanced Policies-child-link"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('[data-testid="Add New Policy-btn"]').click(); + cy.get('input[name="policyName"]').type(policyName); + cy.get('textarea[name="description"]').type('allow 30 requests per minute'); + cy.get('input[name="requestCount"]').type('30'); + cy.get('input[name="unitTime"]').type('1'); + cy.get('button.MuiButton-containedPrimary > span').contains('Add').click(); + cy.get('table tr td a').contains(policyName).should('exist'); + + // editing + cy.intercept('**/throttling/policies/advanced/*').as('getPolicy'); + cy.get('table tr td a').contains(policyName).click(); + cy.wait('@getPolicy', {timeout: 3000}).then(() => { + cy.get('input[name="requestCount"]').clear().type('31'); + cy.get('button.MuiButton-containedPrimary > span').contains('Update').click(); + cy.get('table tr td').contains('31').should('exist'); + }); + + // delete + cy.get(`[data-testid="${policyName}-actions"] > span svg`).click(); + cy.get('button > span').contains('Delete').click(); + cy.get('table tr td a').contains(policyName).should('not.exist'); + } + it.only("Add Edit Delete advance throttle policies - super admin", () => { + addEditDeleteAdvancedThrottlePolicies(carbonUsername, carbonPassword, superTenant); + }); + it.only("Add Edit Delete advance throttle policies - tenant user", () => { + addEditDeleteAdvancedThrottlePolicies(carbonUsername, carbonPassword, testTenant); + }); +}) \ No newline at end of file diff --git a/cypress/integration/admin/02-add-edit-delete-application-throttle-policies.spec.js b/cypress/integration/admin/02-add-edit-delete-application-throttle-policies.spec.js new file mode 100644 index 00000000..d6729739 --- /dev/null +++ b/cypress/integration/admin/02-add-edit-delete-application-throttle-policies.spec.js @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("admin-02 : Add Edit Delete application throttle policies", () => { + + const { carbonUsername, carbonPassword, testTenant, superTenant } = Utils.getUserInfo(); + + const addEditDeleteApplicationThrottlePolicies = (usernameLocal, passwordLocal, tenant) => { + cy.loginToAdmin(usernameLocal, passwordLocal, tenant); + const policyName = '80PerMin'; + cy.get('[data-testid="Application Policies-child-link"]').click(); + cy.get('.MuiButton-label').contains('Add Policy').click(); + cy.get('input[name="policyName"]').type(policyName); + cy.get('input[name="description"]').type('allow 30 requests per minute'); + cy.get('input[name="requestCount"]').type('80'); + cy.get('input[name="unitTime"]').type('1'); + cy.get('button.MuiButton-containedPrimary > span').contains('Save').click(); + cy.get(`[data-testid="${policyName}-actions"]`).should('exist'); + + // editing + cy.intercept('**/throttling/policies/application/*').as('getPolicy'); + cy.get(`[data-testid="${policyName}-actions"] > span:first-child`).click(); + cy.wait('@getPolicy', {timeout: 3000}).then(() => { + cy.get('input[name="requestCount"]').clear().type('81'); + }); + cy.intercept('GET', '**/throttling/policies/application').as('getPolicies'); + cy.get('button.MuiButton-containedPrimary > span').contains('Save').click(); + cy.wait('@getPolicies', {timeout: 3000}); + + // delete + cy.get(`[data-testid="${policyName}-actions"] > span:nth-child(2)`).click(); + cy.get('button > span').contains('Delete').click(); + cy.get(`[data-testid="${policyName}-actions"]`).should('not.exist'); + } + + it.only("Add Edit Delete application throttle policies - super admin", () => { + addEditDeleteApplicationThrottlePolicies(carbonUsername, carbonPassword, superTenant); + }); + it.only("Add Edit Delete application throttle policies - tenant user", () => { + addEditDeleteApplicationThrottlePolicies(carbonUsername, carbonPassword, testTenant); + }); +}) \ No newline at end of file diff --git a/cypress/integration/admin/03-add-edit-delete-subscription-throttle-policies.spec.js b/cypress/integration/admin/03-add-edit-delete-subscription-throttle-policies.spec.js new file mode 100644 index 00000000..4b64401b --- /dev/null +++ b/cypress/integration/admin/03-add-edit-delete-subscription-throttle-policies.spec.js @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("admin-02 : Add Edit Delete subscription throttle policies", () => { + + const { carbonUsername, carbonPassword, testTenant, superTenant } = Utils.getUserInfo(); + + const addEditDeleteSubscriptionThrottlePolicies = (usernameLocal, passwordLocal, tenant) => { + cy.loginToAdmin(usernameLocal, passwordLocal, tenant); + const policyName = 'Platinum'; + cy.get('[data-testid="Subscription Policies-child-link"]').click(); + cy.get('.MuiButton-label').contains('Add Policy').click(); + cy.get('input[name="policyName"]').type(policyName); + cy.get('textarea[name="description"]').type('Allows 10k requests per minute'); + cy.get('input[name="requestCount"]').type('10000'); + cy.get('input[name="unitTime"]').type('1'); + cy.get('button.MuiButton-containedPrimary > span').contains('Save').click(); + cy.get('[data-testid="pagination-next"]').click(); + cy.get(`[data-testid="${policyName}-actions"]`).should('exist'); + + // editing + cy.intercept('**/throttling/policies/subscription/*').as('getPolicy'); + cy.get(`[data-testid="${policyName}-actions"] > a`).click(); + cy.wait('@getPolicy', {timeout: 3000}).then(() => { + cy.get('input[name="requestCount"]').clear().type('10001'); + }); + cy.intercept('GET', '**/throttling/policies/subscription').as('getPolicies'); + cy.get('button.MuiButton-containedPrimary > span').contains('Save').click(); + cy.wait('@getPolicies', {timeout: 3000}); + + // delete + cy.get('[data-testid="pagination-next"]').click(); + cy.get(`[data-testid="${policyName}-actions"] > span:nth-child(2)`).click(); + cy.get('button > span').contains('Delete').click(); + cy.get('div[role="status"]').should('have.text','Subscription Rate Limiting Policy successfully deleted.'); + } + it.only("Add Edit Delete subscription throttle policies - super admin", () => { + addEditDeleteSubscriptionThrottlePolicies(carbonUsername, carbonPassword, superTenant); + }); + it.only("Add Edit Delete subscription throttle policies - tenant user", () => { + addEditDeleteSubscriptionThrottlePolicies(carbonUsername, carbonPassword, testTenant); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/admin/04-add-edit-delete-api-categories.spec.js b/cypress/integration/admin/04-add-edit-delete-api-categories.spec.js new file mode 100644 index 00000000..33150bab --- /dev/null +++ b/cypress/integration/admin/04-add-edit-delete-api-categories.spec.js @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("admin-04 : Add Edit Delete api categories", () => { + + const { carbonUsername, carbonPassword, testTenant, superTenant } = Utils.getUserInfo(); + + const addEditDeleteApiCategories = (usernameLocal, passwordLocal, tenant) => { + cy.loginToAdmin(usernameLocal, passwordLocal, tenant); + const categoryName = 'Finance'; + cy.get('[data-testid="API Categories"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('.MuiButton-label').contains('Add API Category').click(); + cy.get('input[name="name"]').type(categoryName); + cy.get('textarea[name="description"]').type('finance related apis'); + cy.get('button.MuiButton-containedPrimary > span').contains('Save').click(); + cy.get('[data-testid="MuiDataTableBodyCell-2-0"]').contains('finance related apis').should('exist'); + + // editing + cy.get(`[data-testid="MuiDataTableBodyCell-4-0"] > div > div > span:first-child`).click(); + cy.get('textarea[name="description"]').clear().type('finance apis'); + + cy.intercept('GET', '**/api-categories').as('getCategories'); + cy.get('button.MuiButton-containedPrimary > span').contains('Save').click(); + cy.wait('@getCategories', {timeout: 3000}).then(() => { + cy.get('[data-testid="MuiDataTableBodyCell-2-0"]').contains('finance apis').should('exist'); + }); + + // delete + cy.get(`[data-testid="MuiDataTableBodyCell-4-0"] > div > div > span:nth-child(2)`).click(); + cy.get('button > span').contains('Delete').click(); + cy.get('div[role="status"]').should('have.text','API Category deleted successfully'); + } + it.only("Add Edit Delete api categories - super admin", () => { + addEditDeleteApiCategories(carbonUsername, carbonPassword, superTenant); + }); + it.only("Add Edit Delete api categories - tenant user", () => { + addEditDeleteApiCategories(carbonUsername, carbonPassword, testTenant); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/admin/05-add-custom-throttle-policies.spec.js b/cypress/integration/admin/05-add-custom-throttle-policies.spec.js new file mode 100644 index 00000000..fef72e50 --- /dev/null +++ b/cypress/integration/admin/05-add-custom-throttle-policies.spec.js @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +describe("admin-05 : Add custom throttle policies", () => { + const carbonUsername = 'admin'; + const carbonPassword = 'admin'; + + beforeEach(function () { + cy.loginToAdmin(carbonUsername, carbonPassword); + }) + it.only("Add custom throttle policies",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + const policyName = '5reqPerMin'; + const secondDesc = 'For an Admin users allow 5 requests per minute'; + cy.get('[data-testid="Custom Policies-child-link"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('.MuiButton-label').contains('Define Policy').click(); + cy.get('input[name="policyName"]').type(policyName); + cy.get('input[name="description"]').type('Allow 5 requests per minute for an Admin user'); + cy.get('input[name="keyTemplate"]').type('$userId'); + cy.get('button.MuiButton-containedPrimary > span').contains('Add').click(); + cy.get(`[data-testid="${policyName}-actions"]`).should('exist'); + + // editing + cy.get(`[data-testid="${policyName}-actions"] > a > span:first-child`).click(); + cy.get('input[name="description"]').invoke('val').should('not.be.empty') + cy.get('input[name="description"]').clear().type(secondDesc); + + cy.intercept('GET', '**/throttling/policies/custom').as('getCustomPolicies'); + cy.get('button.MuiButton-containedPrimary > span').contains('Edit').click(); + cy.wait('@getCustomPolicies', {timeout: Cypress.config().largeTimeout}).then(() => { + cy.get('td').contains(secondDesc).should('exist'); + }); + + // delete + cy.get(`[data-testid="${policyName}-actions"] > span:nth-child(2)`).click(); + cy.get('button > span').contains('Delete').click(); + cy.get('div[role="status"]').should('have.text','Custom Policy successfully deleted.'); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/admin/06-add-delete-black-list-policies.spec.js b/cypress/integration/admin/06-add-delete-black-list-policies.spec.js new file mode 100644 index 00000000..0e4f64a2 --- /dev/null +++ b/cypress/integration/admin/06-add-delete-black-list-policies.spec.js @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("admin-06 : Add deny policies", () => { + + const { carbonUsername, carbonPassword, testTenant, superTenant } = Utils.getUserInfo(); + + const addDenyPolicy = (usernameLocal, passwordLocal, tenant) => { + cy.loginToAdmin(usernameLocal, passwordLocal, tenant); + const ipAddress = '127.0.0.1'; + cy.get('[data-testid="Deny Policies-child-link"]').click(); + cy.get('.MuiButton-label').contains('Add Policy').click(); + cy.get('input[value="IP"]').click(); + cy.get('input[name="fixedIp"]').type(ipAddress); + cy.get('button.MuiButton-containedPrimary > span').contains('Deny').click(); + cy.get('[data-testid="MuiDataTableBodyCell-1-0"] div').contains(ipAddress).should('exist'); + + // delete + cy.get(`[data-testid="IP-actions"] svg`).click(); + cy.get('button > span').contains('Delete').click(); + cy.get('div[role="status"]').should('have.text','Deny Policy successfully deleted.'); + } + it.only("Add deny policies - super admin", () => { + addDenyPolicy(carbonUsername, carbonPassword, superTenant); + }); + it.only("Add deny policies - tenant user", () => { + addDenyPolicy(carbonUsername, carbonPassword, testTenant); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/admin/07-add-scope-mapping.spec.js b/cypress/integration/admin/07-add-scope-mapping.spec.js new file mode 100644 index 00000000..978d3a60 --- /dev/null +++ b/cypress/integration/admin/07-add-scope-mapping.spec.js @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("admin-07 : Add scope mapping", () => { + + const { carbonUsername, carbonPassword, testTenant, superTenant } = Utils.getUserInfo(); + + const addScopeMapping = (usernameLocal, passwordLocal, tenant) => { + cy.loginToAdmin(usernameLocal, passwordLocal, tenant); + const roleName = 'creator'; + + cy.get('[data-testid="Scope Assignments-child-link"]').click(); + cy.get('.MuiButton-label').contains('Add scope mappings').click(); + cy.get('#role-input-field-helper-text').type(roleName); + cy.get('button.MuiButton-containedPrimary span').contains('Next').click(); + cy.get('#role-select-dropdown').click(); + cy.get('#role-select-dropdown-popup li').contains('Internal/creator').click(); + cy.get('button.MuiButton-containedPrimary span').contains('Save').click(); + cy.get('div').contains(roleName).should('exist'); + + // delete + cy.get(`[data-testid="${roleName}-delete-btn"]`).click(); + cy.get('[aria-labelledby="delete-confirmation"] button.MuiButton-containedPrimary').click(); + cy.get(`[data-testid="${roleName}"]`).should('not.exist'); + } + it.only("Add scope mapping - super admin", () => { + addScopeMapping(carbonUsername, carbonPassword, superTenant); + }); + it.only("Add scope mapping - tenant user", () => { + addScopeMapping(carbonUsername, carbonPassword, testTenant); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/admin/08-add-api-categories.spec.js b/cypress/integration/admin/08-add-api-categories.spec.js new file mode 100644 index 00000000..7b60f055 --- /dev/null +++ b/cypress/integration/admin/08-add-api-categories.spec.js @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("admin-08 : Add API Categories and assign via publisher portal", () => { + const carbonUsername = 'admin'; + const carbonPassword = 'admin'; + let testApiId; + + beforeEach(function () { + cy.loginToAdmin(carbonUsername, carbonPassword); + }) + it("Add API Categories and assign via publisher portal",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + const category = Utils.generateName(); + const categoryDescription = 'Weather related apis'; + + cy.get('[data-testid="API Categories"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('.MuiButton-label').contains('Add API Category').click(); + cy.get('input[name="name"]').type(category); + cy.get('textarea[name="description"]').type(categoryDescription); + cy.get('button.MuiButton-containedPrimary span').contains('Save').click(); + + // Go to publisher + cy.wait(500); + cy.visit(`/publisher/apis`); + Utils.addAPI({}).then((apiId) => { + testApiId = apiId; + cy.visit(`/publisher/apis/${apiId}/configuration`); + cy.get('#APICategories', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('span').contains(category).click(); + cy.get('#menu-categories').click('topLeft'); + cy.get('#design-config-save-btn').click(); + }) + }); + + afterEach(function () { + if (testApiId) { + Utils.deleteAPI(testApiId).then(() => { + // Delete + cy.visit(`/admin/settings/api-categories`); + cy.get('[data-testid="MuiDataTableBodyCell-4-0"] > div > div > span:nth-child(2)', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('[data-testid="Delete-btn"]').click(); + //cy.get('div[role="status"]', {timeout: Cypress.config().largeTimeout}).should('have.text', 'API Category deleted successfully'); + }); + } + }) + +}) \ No newline at end of file diff --git a/cypress/integration/admin/09-add-km.spec.js b/cypress/integration/admin/09-add-km.spec.js new file mode 100644 index 00000000..8870bd57 --- /dev/null +++ b/cypress/integration/admin/09-add-km.spec.js @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("admin-09 : Add key manager", () => { + + const { carbonUsername, carbonPassword, testTenant, superTenant } = Utils.getUserInfo(); + + const addKeyManager = (usernameLocal, passwordLocal, tenant) => { + cy.loginToAdmin(usernameLocal, passwordLocal, tenant); + const km = 'myAuth0'; + const wellKnowUrl = 'https://my-tenant.us.auth0.com/.well-known/openid-configuration'; + const clientId = 'test'; + const clientSecret = 'test'; + const audience = 'test'; + const introspectionEp = 'https://my-tenant.auth0.com/oauth/token'; + + cy.get('[data-testid="Key Managers"]').click(); + cy.get('.MuiButton-label').contains('Add Key Manager').click(); + cy.get('input[name="name"]').type(km); + cy.get('input[name="displayName"]').type(km); + cy.get('[data-testid="key-manager-type-select"]').click(); + cy.get('li[data-value="Auth0"]').click(); + cy.get('input[name="wellKnownEndpoint"]').type(wellKnowUrl); + // importing config' + cy.intercept('**/key-managers/discover').as('importConfig'); + cy.get('button span.MuiButton-label').contains('Import').click(); + cy.wait('@importConfig', {timeout: 3000}).then(() => { + // filing the tokens + cy.get('input[name="introspectionEndpoint"]').clear().type(introspectionEp); + cy.get('input[name="client_id"]').type(clientId); + cy.get('input[name="client_secret"]').type(clientSecret); + cy.get('input[name="audience"]').type(audience); + cy.get('button.MuiButton-containedPrimary span').contains('Add').click(); + + // validating + cy.get('td > div').contains(km).should('exist'); + }); + + // delete + cy.get(`[data-testid="${km}-actions"] > span:first-child svg`).click(); + cy.get('button > span').contains('Delete').click(); + cy.get('td > div').contains(km).should('not.exist'); + } + it.only("Add key manager - super admin", () => { + addKeyManager(carbonUsername, carbonPassword, superTenant); + }); + it.only("Add key manager - tenant user", () => { + addKeyManager(carbonUsername, carbonPassword, testTenant); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/admin/10-advanced-configurations.spec.js b/cypress/integration/admin/10-advanced-configurations.spec.js new file mode 100644 index 00000000..c3bf1672 --- /dev/null +++ b/cypress/integration/admin/10-advanced-configurations.spec.js @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +import adavanceConfFalseJson from "../../fixtures/api_artifacts/advanceConfigFlase.json" +import adavanceConfTrueJson from "../../fixtures/api_artifacts/advanceConfigTrue.json" + +describe("admin-10 : Advanced Configurations", () => { + + const { carbonUsername, carbonPassword, testTenant, superTenant } = Utils.getUserInfo(); + + const advancedConfiguration = (usernameLocal, passwordLocal, tenant) => { + cy.loginToAdmin(usernameLocal, passwordLocal, tenant); + cy.get('[data-testid="Advanced-child-link"]').click(); + + cy.intercept('GET', 'https://localhost:9443/api/am/admin/v3/tenant-config', { + statusCode: 200, + body: adavanceConfFalseJson + + }) + cy.get('[data-testid="Scope Assignments-child-link"]').click(); + cy.get('[data-testid="Advanced-child-link"]').click(); + cy.wait(3000); + cy.get('[data-testid="monaco-editor-save"]').click(); + + cy.intercept('GET', 'https://localhost:9443/api/am/admin/v3/tenant-config', { + statusCode: 200, + body: adavanceConfTrueJson + }) + cy.get('[data-testid="Scope Assignments-child-link"]').click(); + cy.get('[data-testid="Advanced-child-link"]').click(); + cy.wait(2000); + cy.get('[data-testid="monaco-editor-save"]').click(); + } + it.only("Advanced configurations - super admin", () => { + advancedConfiguration(carbonUsername, carbonPassword, superTenant); + }); + it.only("Advanced configurations - tenant user", () => { + advancedConfiguration(carbonUsername, carbonPassword, testTenant); + }); + + }) \ No newline at end of file diff --git a/cypress/integration/devportal/000-general/01-anonymous-user-view-public-apis.spec.js b/cypress/integration/devportal/000-general/01-anonymous-user-view-public-apis.spec.js new file mode 100644 index 00000000..57845596 --- /dev/null +++ b/cypress/integration/devportal/000-general/01-anonymous-user-view-public-apis.spec.js @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +import Utils from "@support/utils"; + +describe("devportal-000-01 : Anonymous user view public apis", () => { + const { publisher, developer, password, tenantUser, tenant, } = Utils.getUserInfo(); + + const apiVersion = '2.0.0'; + let apiName; + const apiContext = apiName; + let testApiId; + + it.only("Anonymous view apis",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + apiName = Utils.generateName(); + cy.loginToPublisher(publisher, password); + + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion, context: apiContext }).then((apiId) => { + testApiId = apiId; + Utils.publishAPI(apiId).then((serverResponse) => { + console.log(serverResponse); + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password); + cy.visit(`/devportal/apis?tenant=carbon.super`); + + // After publishing the api appears in devportal with a delay. + // We need to keep refresing and look for the api in the listing page + // following waitUntilApiExists function does that recursively. + let remainingAttempts = 15; + let attemptCount = 0; + for (; attemptCount< remainingAttempts; attemptCount++) { + let $apis = Cypress.$(`[title="${apiName}"]`, {timeout: Cypress.config().largeTimeout}); + if ($apis.length) { + // At least one with api name was found. + // Return a jQuery object. + cy.log('apis: ' + $apis.text()); + break; + } + cy.reload(); + } + if (attemptCount==(remainingAttempts-1)){ + throw Error('Table was not found.'); + } + }); + }); + }) + + it.only("Download swagger", () => { + cy.visit(`/devportal/apis?tenant=carbon.super`); + cy.url().should('contain', '/apis?tenant=carbon.super'); + + cy.get(`[title="${apiName}"]`, { timeout: 30000 }); + cy.get(`[title="${apiName}"]`).click(); + cy.get('#left-menu-overview').click(); + + // Downloading swagger + cy.get('#swagger-download-btn').click(); + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + /* + TODO + Need to fix this part + + const downloadsFolder = Cypress.config('downloadsFolder') + const downloadedFilename = `${downloadsFolder}/swagger.json`; + cy.readFile(downloadedFilename); + */ + }) + + it.only("Download client sdks", () => { + cy.loginToDevportal(developer, password); + cy.visit(`/devportal/apis?tenant=carbon.super`); + cy.url().should('contain', '/apis?tenant=carbon.super'); + cy.get(`[title="${apiName}"]`, { timeout: 30000 }); + cy.get(`[title="${apiName}"]`).click(); + cy.get('#left-menu-sdk').click(); + // Download all sdks one by one + /* + TODO + Need to fix this part + cy.get('#download-sdk-btn').each(($btn) => { + const fileName = apiName + '_' + apiVersion + '_' + 'android'; + cy.wrap($btn).click(); + // Downloading SDK + const downloadsFolder = Cypress.config('downloadsFolder') + const downloadedFilename = `${downloadsFolder}/${fileName}.zip`; + + cy.readFile(downloadedFilename, 'binary', { timeout: 15000 }) + .should(buffer => expect(buffer.length).to.be.gt(100)); + + }) + */ + }) + + after(() => { + Utils.deleteAPI(testApiId); + }) +}) \ No newline at end of file diff --git a/cypress/integration/devportal/000-general/02-logout-from-devportal.spec.js b/cypress/integration/devportal/000-general/02-logout-from-devportal.spec.js new file mode 100644 index 00000000..1c7a70f8 --- /dev/null +++ b/cypress/integration/devportal/000-general/02-logout-from-devportal.spec.js @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-000-02 : Login logout from devportal", () => { + const { developer, password, testTenant, superTenant } = Utils.getUserInfo(); + + it.only("Login logout from devportal - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + cy.loginToDevportal(developer, password, superTenant); + cy.logoutFromDevportal(); + }); + + it.only("Login logout from devportal - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + cy.loginToDevportal(developer, password, testTenant); + cy.logoutFromDevportal(); + }); +}) \ No newline at end of file diff --git a/cypress/integration/devportal/001-applications/01-create-jwt-app-generate-keys.spec.js b/cypress/integration/devportal/001-applications/01-create-jwt-app-generate-keys.spec.js new file mode 100644 index 00000000..95afd6d3 --- /dev/null +++ b/cypress/integration/devportal/001-applications/01-create-jwt-app-generate-keys.spec.js @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-001-01 : Application tests", () => { + const { developer, password } = Utils.getUserInfo(); + + let appName; + const appDescription = 'JWT application description'; + + it.only("Add Applications for JWT token Type", () => { + appName = Utils.generateName(); + cy.loginToDevportal(developer, password); + cy.createApp(appName, appDescription); + }) + + after(() => { + cy.deleteApp(appName); + }) + +}) \ No newline at end of file diff --git a/cypress/integration/devportal/001-applications/02-generate-keys.spec.js b/cypress/integration/devportal/001-applications/02-generate-keys.spec.js new file mode 100644 index 00000000..3e9b7da3 --- /dev/null +++ b/cypress/integration/devportal/001-applications/02-generate-keys.spec.js @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-001-02 : Generate keys", () => { + const { developer, password, superTenant, testTenant } = Utils.getUserInfo(); + + let appName; + const appDescription = 'Key gen application description'; + let activeTenant; + + const generateKeys = (tenant) => { + cy.loginToDevportal(developer, password, tenant); + appName = Utils.generateName(); + cy.createApp(appName, appDescription, tenant); + + // Generating keys production + cy.get('#production-keys-oauth').click(); + cy.get('#generate-keys', {timeout: 30000}).click(); + cy.get('#consumer-key', {timeout: 30000}).should('exist'); + + /* + Updating keys we need to skip for now. Cypress is not checking the checkboxes but the actual one is not + */ + // Updating the keys + // Enabling authorization code grant type and updating keys + + // cy.get('#authorization_code').check(); + // cy.get('#callbackURL').click(); + // cy.get('#callbackURL').type('https://localhost'); + + // cy.get('#generate-keys').click(); + // Checking if the code grant is still selected. + // cy.get('#authorization_code').should('be.checked'); + + + // Generating keys sandbox + cy.get('#sandbox-keys-oauth').click(); + cy.get('#generate-keys').click(); + cy.get('#consumer-key', {timeout: 30000}); + cy.get('#consumer-key').should('exist'); + + /* + Updating keys we need to skip for now. Cypress is not checking the checkboxes but the actual one is not + */ + + // Updating the keys + // Enabling authorization code grant type and updating keys + // cy.get('#authorization_code').check(); + // cy.get('#callbackURL').click(); + // cy.get('#callbackURL').type('https://localhost'); + // cy.get('#generate-keys').click(); + // Checking if the code grant is still selected. + // cy.get('#authorization_code').should('be.checked'); + + // Show hide keys + cy.get('#visibility-toggle-btn').click(); + cy.get('#consumer-secret').should('have.attr', 'type', 'text'); + cy.contains('visibility_off').should('be.visible'); + } + it.only("Generate and update application production and sandbox keys, show hide keys - super admin", () => { + activeTenant = superTenant; + generateKeys(superTenant); + }) + it.only("Generate and update application production and sandbox keys, show hide keys - tenant user", () => { + activeTenant = testTenant; + generateKeys(testTenant); + }) + + afterEach(() => { + cy.intercept('DELETE','**/applications/**').as('appDelete'); + cy.deleteApp(appName, activeTenant); + cy.wait('@appDelete',{timeout: 15000}).its('response.statusCode').should('equal', 200) + cy.contains(`Application ${appName} deleted successfully!`) + cy.wait(5000) + }) +}) \ No newline at end of file diff --git a/cypress/integration/devportal/001-applications/03-generate-api-keys.spec.js b/cypress/integration/devportal/001-applications/03-generate-api-keys.spec.js new file mode 100644 index 00000000..4f97e36e --- /dev/null +++ b/cypress/integration/devportal/001-applications/03-generate-api-keys.spec.js @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-001-03 : Generate API Keys", () => { + const { developer, password, superTenant, testTenant } = Utils.getUserInfo(); + let appName; + let activeTenant; + const appDescription = 'Key gen application description'; + const checkIfKeyExists = () => { + // Check if the key exists + cy.get('#access-token', { timeout: 30000 }); + cy.get('#access-token').should('not.be.empty'); + cy.get('#generate-api-keys-close-btn').click(); + } + const generateApiKeys = (tenant) => { + cy.loginToDevportal(developer, password, tenant); + appName = Utils.generateName(); + cy.createApp(appName, appDescription); + + // Generating keys production + cy.get('#production-keys-apikey').click(); + // Generate with none option + cy.get('#generate-key-btn').then(() => { + cy.get('#generate-key-btn').click(); + cy.get('#generate-api-keys-btn').click(); + }) + + checkIfKeyExists(); + + // Generate with ip option + cy.get('#api-key-restriction-ip').click(); + cy.get('#ip-address-txt').type('192.168.1.2'); + cy.get('#ip-address-add-btn').click(); + cy.get('#generate-key-btn').click(); + cy.get('#generate-api-keys-btn').click(); + + checkIfKeyExists(); + + cy.get('#api-key-restriction-referer').click(); + cy.get('#referer-txt').type('www.example.com/path'); + cy.get('#referer-add-btn').click(); + cy.get('#generate-key-btn').click(); + cy.get('#generate-api-keys-btn').click(); + + checkIfKeyExists(); + } + it.only("Generate API Keys - super admin", () => { + activeTenant = superTenant; + generateApiKeys(superTenant) + }) + it.only("Generate API Keys - tenant user", () => { + activeTenant = testTenant; + generateApiKeys(testTenant) + }) + + afterEach(() => { + cy.deleteApp(appName, activeTenant); + }) +}) \ No newline at end of file diff --git a/cypress/integration/devportal/001-applications/04-exchange-key-managers.spec.js b/cypress/integration/devportal/001-applications/04-exchange-key-managers.spec.js new file mode 100644 index 00000000..77c4631c --- /dev/null +++ b/cypress/integration/devportal/001-applications/04-exchange-key-managers.spec.js @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-001-04 : Exchange key mangers", () => { + const { carbonUsername, carbonPassword, superTenant, testTenant } = Utils.getUserInfo(); + + const exchangeKeyManagers = (tenant) => { + cy.loginToDevportal(carbonUsername, carbonPassword, tenant) + + cy.intercept("GET", "/api/am/devportal/v2/applications?sortBy=name&sortOrder=asc&limit=10&offset=0", + {fixture: 'applicationsList.json'}); + cy.visit(`/devportal`); + cy.visit(`/devportal/applications`); + cy.intercept('GET', `/api/am/devportal/v2/applications/844ec54e-70d3-4f9b-9b48-25853e857fc3`, {fixture:'defaultApplication.json'}); + cy.get('table:nth-of-type(1) a[href]').contains('DefaultApplication').click(); + cy.intercept('GET', '/api/am/devportal/v2/throttling-policies/application/Unlimited', {fixtures:'throttlingPolicy.json'}) + cy.visit(`/devportal/applications/844ec54e-70d3-4f9b-9b48-25853e857fc3/productionkeys/oauth`); + cy.intercept("GET", "/api/am/devportal/v2/key-managers", {fixture:'devportalKeyManagerlisting.json'}).as('loadKeyManagers'); + cy.wait('@loadKeyManagers'); + cy.intercept('GET', `/api/am/devportal/v2/applications/844ec54e-70d3-4f9b-9b48-25853e857fc3/oauth-keys`, {fixture:'oauthKeys.json'}); + cy.get('#SampleExternalKM').click(); + cy.wait(3000) + cy.get('#exchange-token').click(); + cy.wait(3000) + cy.get('#responsive-dialog-title h2').should('contain','Resident Key Manager Consumer Key and Secret Not Available'); + cy.visit(`/devportal/applications/844ec54e-70d3-4f9b-9b48-25853e857fc3/productionkeys/oauth`); + cy.get('#ResidentKeyManager').click(); + cy.wait(3000) + cy.intercept('POST',`/api/am/devportal/v2/applications/844ec54e-70d3-4f9b-9b48-25853e857fc3/generate-keys`, {fixture:'generatedKeys.json'}); + cy.intercept('GET', `/api/am/devportal/v2/applications/844ec54e-70d3-4f9b-9b48-25853e857fc3/oauth-keys`, {fixture:'updatedOauthkeys.json'}); + cy.get('#generate-keys').click(); + cy.intercept('GET', `/api/am/devportal/v2/applications/844ec54e-70d3-4f9b-9b48-25853e857fc3/oauth-keys`, {fixture:'updatedOauthkeys.json'}); + cy.get('#SampleExternalKM').click(); + cy.get('#exchange-token').click(); + cy.get('#curl-to-generate-access-token-btn').should('be.disabled'); + cy.get('#external-idp-token').type('eyJ4NXQiOiJNell4TW1Ga09HWXdNV0kwWldObU5EY3hOR1NNFpUQTNNV0kyTkRBelpHU'); + cy.get('#curl-to-generate-access-token-btn').should('not.be.disabled'); + cy.get('#curl-to-generate-access-token-btn').click(); + cy.get('#responsive-dialog-title h2').should('contain', 'Get CURL to Generate Access Token'); + } + it.only("Exchange grant UI Test - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + exchangeKeyManagers(superTenant); + }) + /** + * "Generate kes" not enabled for the tennat user hence script is fail at this point, need to review + */ + // it.only("Exchange grant UI Test - tenant user", { + // retries: { + // runMode: 3, + // openMode: 0, + // }, + // }, () => { + // exchangeKeyManagers(testTenant); + // }) +}) diff --git a/cypress/integration/devportal/001-applications/05-test-application-sharing.spec.skip.js b/cypress/integration/devportal/001-applications/05-test-application-sharing.spec.skip.js new file mode 100644 index 00000000..b3c16254 --- /dev/null +++ b/cypress/integration/devportal/001-applications/05-test-application-sharing.spec.skip.js @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +// This test need to enable application sharing in deployment.toml file +/* +[apim.devportal] +enable_application_sharing = true +application_sharing_type = "default" +*/ +import Utils from "@support/utils"; + +describe("devportal-001-05 : Application Sharing", () => { + const user1 = 'user1'; + const user2 = 'user2'; + const publisher = 'publisher'; + const password = 'test123'; + const carbonUsername = 'admin'; + const carbonPassword = 'admin'; + const appName = 'App_A1'; + const appDescription = 'Testing sharing app '; + const groupId = 'org1'; + const apiName = `anonymous${Math.floor(Math.random() * (100000 - 1 + 1) + 1)}`; + const apiVersion = '2.0.0'; + const apiContext = `anonymous${Math.floor(Math.random() * (100000 - 1 + 1) + 1)}`; + let apiId; + + beforeEach(function () { + cy.loginToPublisher(publisher, password); + + }) + + it("Test Application Sharing", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + + cy.createAndPublishAPIByRestAPIDesign(apiName, apiVersion, apiContext); + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuid = pathSegments[pathSegments.length - 2]; + apiId = uuid; + cy.logoutFromPublisher(); + + //Create Users in Devportal + cy.visit(`/devportal/apis?tenant=carbon.super`); + cy.get('#itest-devportal-sign-in', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#registerLink', {timeout: Cypress.config().largeTimeout}).click(); + + //Creating user 1 + cy.get('#username').type(user1); + cy.get('#registrationSubmit').click(); + + // There is an error and we have to fix it from IS side + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from failing the test + return false + }); + cy.get('input[name="http://wso2.org/claims/givenname"]', {timeout: Cypress.config().largeTimeout}).type(user1); + cy.get('input[name="http://wso2.org/claims/lastname"]').type('test'); + cy.get('#password').type(password); + cy.get('#password2').type(password); + cy.get('input[name="http://wso2.org/claims/emailaddress"]').type('user1@test.com'); + cy.get('input[name="http://wso2.org/claims/organization"]').type('org1'); + cy.get('#termsCheckbox').check().should('be.checked'); + cy.get('#registrationSubmit').click(); + cy.get('button.cancel', {timeout: Cypress.config().largeTimeout}).click() + + //Creating user 2 + cy.get('#registerLink').click(); + cy.get('#username', {timeout: Cypress.config().largeTimeout}).type(user2); + cy.get('#registrationSubmit').click(); + cy.get('input[name="http://wso2.org/claims/givenname"]').type('user2'); + cy.get('input[name="http://wso2.org/claims/lastname"]').type('test'); + cy.get('#password').type(password); + cy.get('#password2').type(password); + cy.get('input[name="http://wso2.org/claims/emailaddress"]').type('user2@test.com'); + cy.get('input[name="http://wso2.org/claims/organization"]').type('org1'); + cy.get('#termsCheckbox').check().should('be.checked'); + cy.get('#registrationSubmit').click(); + cy.get('button.cancel', {timeout: Cypress.config().largeTimeout}).click(); + + + //Log into developer portal as user 1 + cy.loginToDevportal(user1, password); + + //Test with Oath2 Token + cy.visit(`/devportal/applications/create`); + cy.get('#application-name', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#application-name').type(appName); + cy.get('#application-group-id').click(); + cy.get('#application-group-id').type(groupId); + cy.get('#application-description').click(); + cy.get('#application-description').type('{backspace}'); + cy.get('#application-description').type(appDescription); + cy.get('#itest-application-create-save').click(); + cy.wait(2000); + cy.logoutFromDevportal(); + + //Log into developer portal as user 2 + cy.loginToDevportal(user2, password); + cy.visit(`/devportal/applications`); + cy.contains('App_A1', {timeout: Cypress.config().largeTimeout}).click(); + + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuidApp = pathSegments[pathSegments.length - 2]; + + //Subscription of API + cy.get('#left-menu-subscriptions').click(); + cy.contains('Subscribe APIs').click(); + + cy.get(`#policy-subscribe-btn-${uuid}`).click(); + cy.get('[aria-label="close"]').click(); + cy.logoutFromDevportal(); + + //Log into developer portal as user 1 + cy.loginToDevportal(user1, password); + cy.visit(`/devportal/applications/${uuidApp}/subscriptions`); + }); + }); + + }); + + afterEach(function () { + cy.visit(`/devportal/applications`); + cy.get(`#delete-${appName}-btn`, {timeout: Cypress.config().largeTimeout}); + cy.get(`#delete-${appName}-btn`).click(); + cy.get(`#itest-confirm-application-delete`).click(); + cy.logoutFromDevportal(); + + //Delete Users + cy.loginToPublisher(publisher, password); + cy.deleteApi(apiName, apiVersion); + cy.carbonLogin(carbonUsername, carbonPassword); + cy.visit(`/carbon/user/user-mgt.jsp`); + cy.deleteUser(user1); + cy.visit(`/carbon/user/user-mgt.jsp`); + cy.deleteUser(user2); + + }) +}) \ No newline at end of file diff --git a/cypress/integration/devportal/002-subscriptions/00-subscribe-unsubscribe-to-app-from-api-details.spec.js b/cypress/integration/devportal/002-subscriptions/00-subscribe-unsubscribe-to-app-from-api-details.spec.js new file mode 100644 index 00000000..51dad2a6 --- /dev/null +++ b/cypress/integration/devportal/002-subscriptions/00-subscribe-unsubscribe-to-app-from-api-details.spec.js @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-002-00 : Subscribe unsubscribe to application from api details page", () => { + const { publisher, developer, password, superTenant, testTenant } = Utils.getUserInfo(); + + const apiVersion = '2.0.0'; + let apiName; + const apiContext = apiName; + let testApiId; + let appName; + const appDescription = 'app description'; + let activeTenant; + + const subscribeUnsubscribeToAppFromApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion, context: apiContext }).then((apiId) => { + cy.log("API created " + apiName); + testApiId = apiId; + Utils.publishAPI(apiId).then((result) => { + cy.log("API published " + result) + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password, tenant); + appName = Utils.generateName(); + cy.createApp(appName, appDescription, tenant); + cy.visit(`/devportal/apis?tenant=${tenant}`); + cy.url().should('contain', `/apis?tenant=${tenant}`); + cy.visit(`/devportal/apis/${apiId}/overview?tenant=${tenant}`); + cy.get('#left-menu-credentials').click(); + + // Click and select the new application + cy.get('#application-subscribe').click(); + cy.get(`.MuiAutocomplete-popper li`).contains(appName).click(); + cy.get(`#subscribe-to-api-btn`).click(); + cy.get(`#subscription-table td`).contains(appName).should('exist'); + + }); + }); + } + + it.only("Subscribe and unsubscribe to API from api details page - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + activeTenant = superTenant; + subscribeUnsubscribeToAppFromApi(superTenant); + }); + it.only("Subscribe and unsubscribe to API from api details page - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + activeTenant = testTenant; + subscribeUnsubscribeToAppFromApi(testTenant); + }); + + afterEach(() => { + cy.deleteApp(appName, activeTenant); + Utils.deleteAPI(testApiId); + }) +}) \ No newline at end of file diff --git a/cypress/integration/devportal/002-subscriptions/01-subscribe-unsubscribe-to-app-from-app.spec.js b/cypress/integration/devportal/002-subscriptions/01-subscribe-unsubscribe-to-app-from-app.spec.js new file mode 100644 index 00000000..600badb2 --- /dev/null +++ b/cypress/integration/devportal/002-subscriptions/01-subscribe-unsubscribe-to-app-from-app.spec.js @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-002-01 : Subscribe unsubscribe to app from application view ", () => { + const { publisher, developer, password, superTenant, testTenant } = Utils.getUserInfo(); + + const apiVersion = '2.0.0'; + let apiName; + const apiContext = apiName; + let testApiId; + let appName; + const appDescription = 'app description'; + let activeTenant; + + const subscribeUnsubscribeToAppFromApp = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion, context: apiContext }).then((apiId) => { + cy.log("API ID", apiId); + cy.log("API Name", apiName); + testApiId = apiId; + Utils.publishAPI(apiId).then(() => { + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password, tenant); + appName = Utils.generateName(); + cy.createApp(appName, appDescription, tenant); + cy.visit(`/devportal/applications?${tenant}`); + cy.get(`#itest-application-list-table td a`, {timeout: Cypress.config().largeTimeout}).contains(appName).click(); + + // Go to application subscription page + cy.get('#left-menu-subscriptions').click(); + cy.intercept('**/apis**').as('apiGetFirst'); + cy.contains('Subscribe APIs', {timeout: Cypress.config().largeTimeout}).click(); + cy.wait('@apiGetFirst', { timeout: 30000 }).then(() => { + cy.wait(2000) + cy.get('[aria-labelledby="simple-dialog-title"]').find('input[placeholder="Search APIs"]').click().type(apiName+"{enter}"); + cy.contains('1-1 of 1'); + cy.get(`#policy-subscribe-btn-${apiId}`).contains('Subscribe').click(); + cy.get('button[aria-label="close"]').click(); + + // check if the subscription exists + cy.contains(`${apiName} - ${apiVersion}`).should('exist'); + + // Unsubscribe + cy.get(`#delete-api-subscription-${apiId}`).click(); + cy.get('#delete-api-subscription-confirm-btn').click(); + + // Check if unsubscribed successfully + cy.get(`#delete-api-subscription-${apiId}`).should('not.exist'); + + // Editing application + cy.get('#edit-application').click(); + cy.get('#application-name').click(); + cy.get('#application-name').type(2); + + cy.get('#itest-application-create-save').click(); + + // Checking the app name exists in the overview page. + cy.url().should('contain', '/overview'); + cy.get('#itest-info-bar-application-name').contains(appName + '2').should('exist'); + }) + + }); + }) + } + it.only("Subscribe unsubscribe to app from application view - super admin", () => { + activeTenant = superTenant; + subscribeUnsubscribeToAppFromApp(superTenant); + }) + it.only("Subscribe unsubscribe to app from application view - tenant user", () => { + activeTenant = testTenant; + subscribeUnsubscribeToAppFromApp(testTenant); + }) + + after(() => { + cy.deleteApp(appName + '2', activeTenant); + Utils.deleteAPI(testApiId); + }) +}) \ No newline at end of file diff --git a/cypress/integration/devportal/002-subscriptions/02-subscribe-via-wizard.spec.js b/cypress/integration/devportal/002-subscriptions/02-subscribe-via-wizard.spec.js new file mode 100644 index 00000000..f146daf6 --- /dev/null +++ b/cypress/integration/devportal/002-subscriptions/02-subscribe-via-wizard.spec.js @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-002-02 : Subscribe to API via wizard", () => { + const { publisher, developer, password, superTenant, testTenant } = Utils.getUserInfo(); + + const apiVersion = '2.0.0'; + let apiName; + let apiContext; + let testApiId; + let appName; + let activeTenant; + + const subscribeViaWizard = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + apiContext = apiName; + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion, context: apiContext }).then((apiId) => { + testApiId = apiId; + Utils.publishAPI(apiId).then(() => { + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password, tenant); + cy.visit(`/devportal/apis?tenant=${tenant}`); + cy.url().should('contain', `/apis?tenant=${tenant}`); + + + cy.visit(`/devportal/apis/${apiId}/overview?tenant=${tenant}`); + cy.get('#left-menu-credentials').click(); + + // Go through the wizard + appName = Utils.generateName(); + cy.get('#start-key-gen-wizard-btn').click(); + cy.get('#application-name').type(appName); + cy.get('#wizard-next-0-btn').click(); + + cy.get('#wizard-next-1-btn', {timeout: Cypress.config().largeTimeout}) + cy.get('#wizard-next-1-btn').click(); + + cy.get('#wizard-next-2-btn', {timeout: Cypress.config().largeTimeout}); + cy.get('#wizard-next-2-btn').click(); + + cy.intercept('GET','**/oauth-keys').as('oauthKeys'); + cy.wait('@oauthKeys', {timeout: Cypress.config().largeTimeout}).then(() => { + cy.get('#wizard-next-3-btn', {timeout: Cypress.config().largeTimeout}); + cy.get('#wizard-next-3-btn').click(); + }); + + /* + Rest of the test we need to skip for now. Cypress is failing the token gen request but the actual one is not + */ + // cy.intercept('POST','**/generate-token').as('generateToken'); + // cy.wait('@generateToken', {timeout: 4000}).then(() => { + // cy.get('#access-token').should('not.be.empty'); + // cy.get('#wizard-next-4-btn').click(); + + // cy.get('#left-menu-credentials').click(); + // // Click and select the new application + // cy.get(`#subscription-table td`).contains(appName).should('exist'); + // }); + + }) + }) + } + it.only("Subscribe to API - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + activeTenant = superTenant; + subscribeViaWizard(superTenant); + }) + it.only("Subscribe to API - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + activeTenant = testTenant; + subscribeViaWizard(testTenant); + }) + afterEach(() => { + cy.deleteApp(appName, activeTenant); + Utils.deleteAPI(testApiId); + }) +}) \ No newline at end of file diff --git a/cypress/integration/devportal/002-subscriptions/03-change-subscription-tier-on-an-application.spec.js b/cypress/integration/devportal/002-subscriptions/03-change-subscription-tier-on-an-application.spec.js new file mode 100644 index 00000000..28943e10 --- /dev/null +++ b/cypress/integration/devportal/002-subscriptions/03-change-subscription-tier-on-an-application.spec.js @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-002-03 : Change subscription tier of an application", () => { + const { publisher, developer, password, superTenant } = Utils.getUserInfo(); + + const apiVersion = '2.0.0'; + let apiName; + const apiContext = apiName; + let testApiId; + let activeTenant; + let appName; + const changeSubscriptionTierOnApplication = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion, context: apiContext }).then((apiId) => { + testApiId = apiId; + Utils.publishAPI(apiId).then(() => { + + cy.visit(`/publisher/apis/${apiId}/subscriptions`); + cy.get('[data-testid="policy-checkbox-silver"]', {timeout: Cypress.config().largeTimeout}); + cy.get('[data-testid="policy-checkbox-silver"]').click(); + cy.get('#subscriptions-save-btn').click(); + // TODO: Proper error handling here instead of cypress wait + cy.wait(3000); + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password, tenant); + appName = Utils.generateName(); + cy.createApp(appName, 'application description', tenant); + cy.visit(`/devportal/applications?tenant=${tenant}`); + cy.get(`#itest-application-list-table td a`).contains(appName).click(); + + // Go to application subscription page + cy.get('#left-menu-subscriptions').click(); + cy.contains('Subscribe APIs').click(); + + cy.get('[aria-labelledby="simple-dialog-title"]').find('input[placeholder="Search APIs"]').click().type(apiName+"{enter}"); + cy.contains('1-1 of 1'); + + cy.get(`#policy-select`).click(); + cy.get(`#policy-select-Unlimited`).click(); + cy.get(`#policy-subscribe-btn-${apiId}`).contains('Subscribe').click(); + cy.get('button[aria-label="close"]').click(); + + // Check the subscriptions existence + cy.contains(`${apiName} - ${apiVersion}`).should('exist'); + + // Edit the subscription + cy.get(`#edit-api-subscription-${apiId}`).click(); + cy.get('#outlined-select-currency').click(); + cy.get('li[data-value="Silver"]').click(); + cy.get('button span').contains('Update').click(); + + // Checking the update is success. + cy.wait(4000); + cy.contains('Silver').should('exist'); + }) + }) + } + it.only("Change subscription tier - super admin", () => { + activeTenant = superTenant; + changeSubscriptionTierOnApplication(superTenant); + }); + + after(() => { + cy.deleteApp(appName, activeTenant); + Utils.deleteAPI(testApiId); + }) +}); diff --git a/cypress/integration/devportal/002-subscriptions/04-generate-keys-api-details-page.spec.js b/cypress/integration/devportal/002-subscriptions/04-generate-keys-api-details-page.spec.js new file mode 100644 index 00000000..fc1cf3f0 --- /dev/null +++ b/cypress/integration/devportal/002-subscriptions/04-generate-keys-api-details-page.spec.js @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-002-04 : Generate keys from api details page", () => { + const { publisher, developer, password, superTenant, testTenant} = Utils.getUserInfo(); + + const apiVersion = '2.0.0'; + let apiName; + let apiContext; + let testApiId; + let activeTenant; + let appName; + const generateKeysApiDetailsPage = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + apiContext = apiName; + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion, context: apiContext }).then((apiId) => { + testApiId = apiId; + Utils.publishAPI(apiId).then(() => { + // TODO: Proper error handling here instead of cypress wait + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password, tenant); + + // Create an app and subscribe + appName = Utils.generateName(); + cy.createApp(appName, 'application description', tenant); + cy.visit(`/devportal/apis?tenant=${tenant}`); + cy.wait(3000) + cy.url().should('contain', `/apis?tenant=${tenant}`); + cy.get(`[title="${apiName}"]`, { timeout: 30000 }); + cy.get(`[title="${apiName}"]`).click(); + cy.get('#left-menu-credentials').click(); + + // Click and select the new application + cy.get('#application-subscribe').click(); + cy.get(`.MuiAutocomplete-popper li`).contains(appName).click(); + cy.get(`#subscribe-to-api-btn`).click(); + cy.get(`#subscription-table td`).contains(appName).should('exist'); + + // Generate prod keys + cy.get(`#${appName}-PK`).click(); + cy.get('#generate-keys').click(); + cy.get('#consumer-key', { timeout: 30000 }); + cy.get('#consumer-key').should('exist'); + }) + }) + } + it.only("Generate keys from api details page - super admin", () => { + activeTenant = superTenant; + generateKeysApiDetailsPage(superTenant); + }) + // it.only("Generate keys from api details page - tenant user", () => { + // activeTenant = testTenant; + // generateKeysApiDetailsPage(testTenant); + // }) + + after(() => { + cy.deleteApp(appName, activeTenant); + cy.wait(5000) + Utils.deleteAPI(testApiId); + }) +}) \ No newline at end of file diff --git a/cypress/integration/devportal/003-test/00-tryout-api-invocations-from-swagger-console.spec.js b/cypress/integration/devportal/003-test/00-tryout-api-invocations-from-swagger-console.spec.js new file mode 100644 index 00000000..60320fa2 --- /dev/null +++ b/cypress/integration/devportal/003-test/00-tryout-api-invocations-from-swagger-console.spec.js @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-003-00 : Tryout API invocations from swagger console", () => { + const { publisher, developer, password, superTenant, testTenant } = Utils.getUserInfo(); + + const apiVersion = '2.0.0'; + let apiName; + let apiContext; + let testApiId; + let appName; + let activeTenant; + const tryoutApiInvocationFromSwaggerConsole = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + apiContext = apiName; + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion, context: apiContext, endpoint: 'https://petstore.swagger.io/v2/swagger.json' }).then((apiId) => { + testApiId = apiId; + Utils.publishAPI(apiId).then(() => { + cy.visit(`publisher/apis/${apiId}/deployments`); + cy.get('#deploy-btn').should('not.have.class', 'Mui-disabled').click({force:true}); + cy.wait(3000); + cy.contains('Deployments'); + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password, tenant); + + Cypress.on('uncaught:exception', () => false); + + // Create an app and subscribe + appName = Utils.generateName(); + cy.createApp(appName, 'application description', tenant); + cy.visit(`/devportal/apis/${apiId}/credentials?tenant=${tenant}`); + + // Click and select the new application + cy.get('#application-subscribe', {timeout: 30000}); + cy.get('#application-subscribe').click(); + cy.get(`.MuiAutocomplete-popper li`).contains(appName).click(); + cy.get(`#subscribe-to-api-btn`).click(); + cy.get(`#subscription-table td`).contains(appName).should('exist'); + + // Generate prod keys + cy.get(`#${appName}-PK`).click(); + cy.get('#generate-keys').click(); + cy.get('#consumer-key', { timeout: 30000 }); + cy.get('#consumer-key').should('exist'); + + // Go to test console + cy.get('#left-menu-test').click(); + + // cy.intercept('**/oauth-keys').as('oauthKeys'); + // cy.wait('@oauthKeys'); + cy.intercept('**/generate-token').as('genToken'); + cy.get('#gen-test-key').should('not.have.attr', 'disabled', { timeout: 30000 }); + // Generate token and wait for response + cy.wait(2000); + cy.get('#gen-test-key').click({force:true}); + + cy.wait('@genToken', {timeout: Cypress.config().largeTimeout}).then(()=> { + cy.get('#accessTokenInput').invoke('val').should('not.be.empty');; + // Test the console + cy.get('#operations-default-get__').find('.opblock-summary-control').click(); + cy.get('#operations-default-get__').find('.try-out__btn').click(); + cy.get('#operations-default-get__').find('.execute').click(); + cy.get('#operations-default-get__').find('.response-col_status').contains('200').should('exist'); + }); + }) + }); + } + it.only("Tryout API invocations from swagger console - super admin", () => { + activeTenant = superTenant; + tryoutApiInvocationFromSwaggerConsole(superTenant); + }); + it.only("Tryout API invocations from swagger console - tenant user", () => { + activeTenant = testTenant; + tryoutApiInvocationFromSwaggerConsole(testTenant); + }); + + after(() => { + cy.deleteApp(appName, activeTenant); + Utils.deleteAPI(testApiId); + }) +}); \ No newline at end of file diff --git a/cypress/integration/devportal/004-api-product/00-api-product-invoke-with-keys.spec.js b/cypress/integration/devportal/004-api-product/00-api-product-invoke-with-keys.spec.js new file mode 100644 index 00000000..5170158b --- /dev/null +++ b/cypress/integration/devportal/004-api-product/00-api-product-invoke-with-keys.spec.js @@ -0,0 +1,250 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("devportal-004-00 : Invoke API Product with keys", () => { + const { publisher, developer, password, superTenant, testTenant } = Utils.getUserInfo(); + + const apiVersion = '2.0.0'; + const apiName = Utils.generateName(); + const apiContext = apiName; + let testApiId; + let testProductId; + const appName = Utils.generateName(); + const appDescription = 'Testing app '; + const productName = Utils.generateName(); + const apiProductInvokeWithKeys = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + cy.visit(`/publisher/apis`); + // cy.createAndPublishAPIByRestAPIDesign(apiName, apiVersion, apiContext); + cy.visit(`/publisher/apis/create/openapi`); + cy.get('#open-api-file-select-radio').click(); + + // upload the swagger + cy.get('#browse-to-upload-btn').then(function () { + const filepath = `api_artifacts/pizzashack.json` + cy.get('input[type="file"]').attachFile(filepath) + }); + + cy.get('#open-api-create-next-btn').click(); + + cy.get('#itest-id-apiversion-input', { timeout: 30000 }); + cy.document().then((doc) => { + cy.get('#itest-id-apicontext-input').clear(); + cy.get('#itest-id-apicontext-input').type('Pizzashack'); + cy.get('#itest-id-apiversion-input').click(); + const version = doc.querySelector('#itest-id-apiversion-input').value; + + // finish the wizard + cy.get('#open-api-create-btn').click(); + + // validate + cy.get('#itest-api-name-version', { timeout: 30000 }); + cy.get('#itest-api-name-version').contains(version); + + //Get the api id + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuid = pathSegments[pathSegments.length - 2]; + testApiId = uuid; + + + // Go to api product create page + cy.visit(`/publisher/api-products/create`); + + // fill the form + cy.get('#itest-id-apiname-input').type(productName); + cy.get('#context').type(productName); + cy.get('#itest-id-apiname-input').click(); + + + cy.intercept('**/swagger').as('swaggerGet'); + + cy.get('#api-product-next-btn').click(); + cy.wait('@swaggerGet', { timeout: 3000 }).then(() => { + // add all resources + cy.get('#add-all-resources-btn', { timeout: 30000 }).click(); + + + cy.get('#create-api-product-btn').scrollIntoView().click(); + cy.get('#itest-api-name-version', { timeout: 30000 }); + cy.get('#itest-api-name-version').contains(productName); + + //Get the api product id + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuidProduct = pathSegments[pathSegments.length - 2]; + testProductId = uuidProduct; + cy.log(uuid, uuidProduct); + + cy.get('#left-menu-itemdeployments').click(); + + // Deploying + cy.get('#deploy-btn', { timeout: 30000 }).should('not.have.class', 'Mui-disabled').click({ force: true }); + + cy.get('#left-menu-itemlifecycle').click(); + + // Publishing api product + cy.wait(2000); + cy.get('[data-testid="Publish-btn"]').click({force:true}); + cy.get('[data-testid="itest-api-state"]').contains('PUBLISHED'); + cy.visit(`/publisher/api-products/${uuidProduct}/runtime-configuration`); + cy.get('#applicationLevel', {timeout: Cypress.config().largeTimeout}).children('[role="button"]').click({force:true}); + cy.wait(2000); + cy.get('#api-security-api-key-checkbox').check().should('be.checked'); + + cy.get('#runtime-config-save-button').scrollIntoView().click(); + + cy.logoutFromPublisher(); + + //Log into developer portal + cy.loginToDevportal(developer, password, tenant); + + //Test with Oath2 Token + cy.visit(`/devportal/applications/create?tenant=${tenant}`); + cy.createApp(appName, appDescription, tenant); + + cy.get('#production-keys-oauth').click(); + cy.get('#generate-keys', { timeout: 30000 }).click(); + cy.get('#generate-access-token-oauth2', { timeout: 30000 }).click(); + cy.get('#generate-access-token-generate-btn', { timeout: 30000 }).click(); + //cy.get('#copy-to-clipbord-icon').click(); + cy.get('#generate-access-token-close-btn').click(); + + //Subscription of APi Product + cy.get('#left-menu-subscriptions').click(); + cy.contains('Subscribe APIs').click(); + + cy.get('#pagination-rows').click(); + cy.get('[data-value="100"]').click(); + + cy.get(`#policy-subscribe-btn-${uuidProduct}`).click(); + cy.get('[aria-label="close"]').click(); + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuidApp = pathSegments[pathSegments.length - 2]; + + cy.visit(`/devportal/apis/${uuidProduct}/test`); + + //test + cy.get('#gen-test-key').should('not.have.attr', 'disabled', { timeout: 30000 }); + cy.get('#gen-test-key').click(); + cy.intercept('**/generate-token').as('genToken'); + cy.wait('@genToken'); + + // Test console with Oath2 token + cy.get('#operations-default-get__').find('.opblock-summary-control').click(); + cy.get('#operations-default-get__').find('.try-out__btn').click(); + cy.get('#operations-default-get__').find('.execute').click(); + cy.wait(3000); + cy.get('#operations-default-get__').find('.response-col_status').contains('200').should('exist'); + + cy.visit(`/devportal/applications`); + cy.get(`#delete-${appName}-btn`, { timeout: 30000 }); + cy.get(`#delete-${appName}-btn`).click(); + cy.get(`#itest-confirm-application-delete`).click(); + + }); + + //Test with API Key + const appName2 = Utils.generateName(); + cy.createApp(appName2, appDescription, tenant); + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuidApp = pathSegments[pathSegments.length - 2]; + cy.get('#production-keys-apikey').click(); + // Generate with none option + cy.get('#generate-key-btn').click(); + cy.get('#generate-api-keys-btn', { timeout: 30000 }).click({ force: true }); + cy.get('#generate-api-keys-close-btn').should('be.visible').click({ force: true }); + cy.wait(2000); + + //Subscription of APi Product + cy.visit(`/devportal/applications/${uuidApp}/subscriptions`); + cy.get('#left-menu-subscriptions').click(); + cy.contains('Subscribe APIs').click(); + + cy.get(`#policy-subscribe-btn-${uuidProduct}`).click(); + cy.get('[aria-label="close"]').click(); + + cy.visit(`/devportal/apis/${uuidProduct}/test`); + cy.wait(2000); + cy.get('#api-key-select-radio-button').click(); + + //test + cy.get('#gen-test-key').should('not.have.attr', 'disabled', { timeout: 30000 }); + cy.get('#gen-test-key').click(); + + cy.intercept('**/generate-token').as('genToken'); + //cy.wait('@genToken'); + + // Test console with api key + cy.get('#operations-default-get__').find('.opblock-summary-control').click(); + cy.get('#operations-default-get__').find('.try-out__btn').click(); + cy.get('#operations-default-get__').find('.execute').click(); + cy.wait(3000); + cy.get('#operations-default-get__').find('.response-col_status').contains('200').should('exist'); + + cy.visit(`/devportal/applications`); + cy.get(`#delete-${appName2}-btn`, { timeout: 30000 }); + cy.get(`#delete-${appName2}-btn`).click(); + cy.get(`#itest-confirm-application-delete`).click(); + + }); + + cy.logoutFromDevportal(); + + + cy.loginToPublisher(publisher, password, tenant); + + // Deleting the api and api product + cy.visit(`/publisher/api-products/${uuidProduct}/overview`); + cy.get('#itest-id-deleteapi-icon-button').click(); + cy.get('#itest-id-deleteconf').click(); + + cy.visit(`/publisher/apis/${uuid}/overview`); + cy.get('#itest-api-name-version', { timeout: 30000 }); + cy.get(`#itest-id-deleteapi-icon-button`).click(); + cy.get(`#itest-id-deleteconf`).click(); + + }); + }); + }); + }); + } + it("Invoke API Product using Oauth 2 and API Key - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + apiProductInvokeWithKeys(superTenant); + + }); + it("Invoke API Product using Oauth 2 and API Key - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + apiProductInvokeWithKeys(testTenant); + }); + after(() => { + Utils.deleteAPIProduct(testProductId); + Utils.deleteAPI(testApiId); + }) +}) \ No newline at end of file diff --git a/cypress/integration/publisher/000-general/00-deploy-sample-api.spec.js b/cypress/integration/publisher/000-general/00-deploy-sample-api.spec.js new file mode 100644 index 00000000..f42617fd --- /dev/null +++ b/cypress/integration/publisher/000-general/00-deploy-sample-api.spec.js @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-000-00 : Deploy sample api", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + + const deploySampleApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + cy.visit(`/publisher/apis`); + cy.contains('WSO2 API-M v4.1.0'); + cy.wait(5000); + cy.get("body").then($body => { + if ($body.find("#itest-apis-welcome-msg").length > 0) { + cy.log("Init page"); + cy.get('#itest-rest-api-create-menu').click(); + } else { + cy.log("API availble"); + cy.get('#itest-create-api-menu-button').click(); + } + }); + cy.get('#itest-id-deploy-sample').click(); + cy.get('#itest-api-name-version').should('be.visible'); + cy.url().should('contains', '/overview'); + cy.get("#itest-api-name-version").contains('PizzaShackAPI'); + cy.get('#itest-id-deleteapi-icon-button').click(); + cy.get('#itest-id-deleteconf').click(); + } + + it.only("Deploy sample api - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + deploySampleApi(superTenant); + }); + it.only("Deploy sample api - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + deploySampleApi(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/000-general/01-create-new-version-of-api.spec.js b/cypress/integration/publisher/000-general/01-create-new-version-of-api.spec.js new file mode 100644 index 00000000..ec8365ba --- /dev/null +++ b/cypress/integration/publisher/000-general/01-create-new-version-of-api.spec.js @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; +import PublisherComonPage from "../../../support/pages/publisher/PublisherComonPage"; + +describe("publisher-000-01 : Create a new version of API", () => { + Cypress.on('uncaught:exception', (err, runnable) => { + return false; + }); + let apiName; + const apiVersion = '1.0.0'; + const newVersion = '2.0.0'; + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + let testApiId; + + const createNewVersionOfApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPI({name: apiName, version: apiVersion}).then((apiId) => { + cy.wait(5000) + testApiId = apiId; + cy.visit(`/publisher/apis/${apiId}/overview`); + PublisherComonPage.waitUntillLoadingComponentsExit() + cy.get('#create-new-version-btn').click(); + cy.wait(3000) + cy.get('#newVersion').type(newVersion); + cy.intercept('**/apis/**').as('apiGet'); + cy.get('#createBtn').click(); + cy.wait('@apiGet', { timeout: 30000 }).then(() => { + // Validate + cy.get('#itest-api-name-version', { timeout: 30000 }).should('be.visible'); + cy.get('#itest-api-name-version').contains(`${apiName} :${newVersion}`); + }) + }); + } + + it.only("Create a new version of API - super admin", () => { + createNewVersionOfApi(superTenant); + }); + it.only("Create a new version of API - tenant user", () => { + createNewVersionOfApi(testTenant); + }); + + after(function () { + // Test is done. Now delete the api + if (testApiId) { + Utils.deleteAPI(testApiId); + } + }) +}); \ No newline at end of file diff --git a/cypress/integration/publisher/000-general/03-create-and-publish-graphql-api-with-all-information.spec.js b/cypress/integration/publisher/000-general/03-create-and-publish-graphql-api-with-all-information.spec.js new file mode 100644 index 00000000..6ec6a2cd --- /dev/null +++ b/cypress/integration/publisher/000-general/03-create-and-publish-graphql-api-with-all-information.spec.js @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; +let apiId; +let activeTenant; +describe("publisher-000-03 : Create GraphQl API from file", () => { + const { superTenant, carbonUsername, carbonPassword} = Utils.getUserInfo(); + const generatedAPIName = Utils.generateName(); + const filepath = 'api_artifacts/schema_graphql.graphql'; + const modifiedFilepath = 'api_artifacts/modified_schema_graphql.graphql'; + const apiVersion='1.0.0'; + const apiContext=`/${generatedAPIName}`; + const apiName=generatedAPIName; + const applicationName='Graphql Client App'; + const starWarsQueryRequest=`query{ + human(id:1000){\n + id\n + name\n + }\n + droid(id:2000){\n + name\n + friends{\n + name\n + appearsIn\n + {downarrow}{backspace}`; + + const starWarsQueryResponse=`{ + "data": { + "human": { + "id": "1000", + "name": "Luke Skywalker" + }, + "droid": { + "name": "C-3PO", + "friends": [ + { + "name": "Luke Skywalker", + "appearsIn": [ + "NEWHOPE", + "EMPIRE", + "JEDI" + ] + }, + { + "name": "Han Solo", + "appearsIn": [ + "NEWHOPE", + "EMPIRE", + "JEDI" + ] + }, + { + "name": "Leia Organa", + "appearsIn": [ + "NEWHOPE", + "EMPIRE", + "JEDI" + ] + }, + { + "name": "R2-D2", + "appearsIn": [ + "NEWHOPE", + "EMPIRE", + "JEDI" + ] + } + ] + } + } + }`; + + const starWarsSubscriptionRequest=`subscription { + reviewAdded(episode: JEDI) { + stars\n + episode\n + + commentary\n`; + + const starWarsSubscriptionResponse=`{"data":{"createReview":{"stars":3,"episode":"JEDI","commentary":"Excellent"}}}`; + + + const createAndPublisherGraphQLApiWithAllInfo = (tenant) => { + //add role filmsubscriber + cy.carbonLogin(carbonUsername, carbonPassword, tenant); + cy.visit('/carbon/role/add-step1.jsp'); + cy.get('input[name="roleName"]').type('FilmSubscriber'); + cy.get('td.buttonRow').find('input').eq(0).click(); + if (tenant == 'carbon.super') { + cy.get('#ygtvcheck2 > .ygtvspacer').click(); // Applications + cy.get('#ygtvcheck34 > .ygtvspacer').click(); // Governance + cy.get('#ygtvcheck48 > .ygtvspacer').click(); // Login + } else { + cy.get('#ygtvcheck257 > .ygtvspacer').click(); // Applications + cy.get('#ygtvcheck19 > .ygtvspacer').click(); // Governance + cy.get('#ygtvcheck33 > .ygtvspacer').click(); // Login + } + + cy.get('td.buttonRow').find('input').eq(1).click(); + cy.get('.ui-dialog-buttonpane.ui-widget-content.ui-helper-clearfix>.ui-dialog-buttonset>.ui-button.ui-corner-all.ui-widget', { timeout: 4000 }).click(); + + cy.carbonLogout(); + + cy.loginToPublisher(carbonUsername, carbonPassword, tenant); + cy.on('uncaught:exception', (err, runnable) => { + if (err.message.includes('applicationId is not provided') || err.message.includes('validateDescription is not a function')) { + return false + } + }); + //create a graphql API + cy.createGraphqlAPIfromFile(apiName, apiVersion, apiContext, filepath).then(value => { + apiId = value; + cy.log(value) + //verify that show more operations button at overview page redirects to operaion page + cy.get('[data-testid="show-more-navigate-to-operation"]').should('have.attr', 'href') + .then((href) => { + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-operations').click(); + cy.url().should('eq', `${Utils.getAppOrigin().toLowerCase()}${href}`); + }) + + //schema definition + cy.get('#itest-api-details-api-config-acc').click(); + cy.contains('a', 'Schema Definition').click(); + + //modify a graphql schema definition + cy.modifyGraphqlSchemaDefinition(modifiedFilepath); + + //localscopes + cy.get('#left-menu-itemLocalScopes', { timeout: Cypress.config().largeTimeout }).should('have.attr', 'href') + .then((href) => { + cy.visit(`${Utils.getAppOrigin()}${href}/create`); + cy.createLocalScope('adminScope', 'admin scope', "sample description", ['admin']); + cy.get('#left-menu-itemLocalScopes').should('have.attr', 'href') + .then((href) => { + cy.visit(`${Utils.getAppOrigin()}${href}/create`); + cy.createLocalScope('filmSubscriberScope', 'filmSubscriber scope', "sample description", ['FilmSubscriber']); + + + cy.get('#left-menu-operations', { timeout: Cypress.config().largeTimeout }).click(); + + cy.get('table').get('[data-testid="allCharacters-tbl-row"]').find('td').eq(2).click().get('ul').contains('li', 'Unlimited').click(); + cy.get('table').get('[data-testid="allCharacters-tbl-row"]').find('td').eq(3).click().get('ul').contains('li', 'adminScope').click(); + cy.get("#menu-").click(); + cy.get('table').get('[data-testid="allCharacters-tbl-row"]').find('td').eq(4).get('[data-testid="allCharacters-security-btn"]').click(); + + cy.get('table').get('[data-testid="allDroids-tbl-row"]').find('td').eq(2).click().get('ul').contains('li', 'Unlimited').click(); + cy.get('table').get('[data-testid="allDroids-tbl-row"]').find('td').eq(3).click().get('ul').contains('li', 'filmSubscriberScope').click(); + cy.get("#menu-").click(); + cy.get('[data-testid="custom-select-save-button"]').click(); + + //deployments + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuid = pathSegments[pathSegments.length - 2]; + cy.visit(`${Utils.getAppOrigin()}/publisher/apis/${uuid}/deployments`); + + cy.get('#deploy-btn', { timeout: Cypress.config().largeTimeout }).should('not.have.class', 'Mui-disabled').click({ force: true }); + + //publish + cy.get("#left-menu-overview", { timeout: Cypress.config().largeTimeout }).click(); + cy.get('[data-testid="publish-state-button"]', { timeout: Cypress.config().largeTimeout }).should('not.be.disabled').click({ force: true }); + + //visit dev portal and view API + cy.logoutFromPublisher(); + cy.loginToDevportal(carbonUsername, carbonPassword, tenant); + + // create an application + cy.createApplication(applicationName, "50PerMin", "Sample Description"); + + //go to apis + cy.get('[data-testid="itest-link-to-apis"]', { timeout: Cypress.config().largeTimeout }).click(); + + cy.get('table > tbody > tr', { timeout: Cypress.config().largeTimeout }).get(`[area-label="Go to ${apiName}"]`).click(); + + //should contain two urls : HTTP URL and Websocket URL + cy.get('#gateway-envirounment', { timeout: Cypress.config().largeTimeout }).get('[data-testid="http-url"]').should('exist'); + cy.get('#gateway-envirounment').get('[data-testid="websocket-url"]').should('exist'); + + // Go to application subscription page + cy.get("#left-menu-credentials").click(); + cy.get('button[aria-label="Open"]').click(); + cy.get('ul').contains('li', applicationName).click(); + cy.get("#subscribe-to-api-btn").click(); + + cy.get("#left-menu-test", { timeout: Cypress.config().largeTimeout }).click(); + + cy.intercept('**/applications/').then((res) => { + // Check if the application exists + cy.get("#selected-application", { timeout: Cypress.config().largeTimeout }).should('exist'); + }); + + cy.intercept('**/generate-token').as('getToken'); + cy.get('#gen-test-key', { timeout: Cypress.config().largeTimeout }).click(); + cy.wait('@getToken', { timeout: Cypress.config().largeTimeout }).its('response.statusCode').should('eq', 200); + + cy.get('[aria-label="Query Editor"]').type(starWarsQueryRequest); + cy.get('.topBar').get('.execute-button-wrap').get('button.execute-button').click(); + + cy.intercept('POST', '/swapi/1.0.0', (res) => { + expect(res.body).to.include(starWarsQueryResponse); + }).as("queryResponse"); + + cy.reload(); + cy.intercept('**/applications/').then((res) => { + // Check if the application exists + cy.get("#selected-application", { timeout: Cypress.config().largeTimeout }).should('exist'); + }); + + cy.intercept('**/generate-token').as('getToken'); + cy.get('#gen-test-key', { timeout: Cypress.config().largeTimeout }).click(); + cy.wait('@getToken', { timeout: Cypress.config().largeTimeout }).its('response.statusCode').should('eq', 200); + + cy.get('[aria-label="Query Editor"]').type('{backspace}' + starWarsSubscriptionRequest); + cy.get('.topBar').get('.execute-button-wrap').get('button.execute-button').click(); + + cy.intercept('GET', '/swapi/1.0.0/*', (res) => { + expect(res).property('status').to.equal(200); + expect(res).property('type').to.equal('websocket'); + }).as("switchProtocol"); + /* + cy.request({ + method: 'POST', + url: 'http://localhost:8080/graphql', + headers:{ + 'accept': "application/json", + 'Content-type': "application/json" + }, + body: { + "query":`mutation {createReview(episode: JEDI, review: { stars: 3, commentary: \"Excellent\"}) { stars episode commentary }}`, + "variables":null + }, + }).then((resp) => { + expect(JSON.stringify(resp.body)).to.include(starWarsSubscriptionResponse); + }); */ + cy.deleteApplication(applicationName); + cy.logoutFromDevportal(); + }); + + }) + }) + } + + );; + } + + it("Verify GraphQl API Capabilities - super admin", () => { + + activeTenant = superTenant; + createAndPublisherGraphQLApiWithAllInfo(superTenant); + + }); + + + afterEach(function () { + cy.loginToPublisher(carbonUsername, carbonPassword, activeTenant); + cy.log("app id " + apiId); + // Test is done. Now delete the api + if (apiId != null) { + Utils.deleteAPI(apiId); + cy.wait(3000); + } + }) +}) diff --git a/cypress/integration/publisher/000-general/04-api-listing-create-api-menu.spec.js b/cypress/integration/publisher/000-general/04-api-listing-create-api-menu.spec.js new file mode 100644 index 00000000..fb480fa1 --- /dev/null +++ b/cypress/integration/publisher/000-general/04-api-listing-create-api-menu.spec.js @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-000-04 : Landing page API List", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + let testApiId; + + const apiListingCreateApiMenu = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis`); + testApiId = apiId; + cy.get('#itest-create-api-menu-button', { timeout: 30000 }).should('be.visible').click(); + + // Checking links under rest apis + cy.get('a').contains('Start From Scratch') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/rest'); + cy.get('a').contains('Import Open API') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/openapi'); + + // Checking links under SOAP apis + cy.get('a').contains('Import WSDL') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/wsdl'); + + // Checking links under GraphQL apis + cy.get('a').contains('Import GraphQL SDL') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/graphQL'); + + // Checking links under Streaming API apis + cy.get('a').contains('Web Socket API') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/streamingapi/ws'); + cy.get('a').contains('Webhook API') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/streamingapi/websub'); + cy.get('a').contains('SSE API') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/streamingapi/sse'); + + cy.get('a').contains('Import an AsyncAPI') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/asyncapi'); + + // Checking links under Streaming API apis + cy.get('a').contains('Import From Service Catalog') + .invoke('attr', 'href') + .should('eq', '/publisher/service-catalog'); + }); + } + + it.only("Click and check all cards - super admin", () => { + apiListingCreateApiMenu(superTenant); + }); + it.only("Click and check all cards - tenant user", () => { + apiListingCreateApiMenu(testTenant); + }); + + afterEach(function () { + if (testApiId) { + Utils.deleteAPI(testApiId); + } + }) +}); \ No newline at end of file diff --git a/cypress/integration/publisher/000-general/05-verify-api-search-functionality.spec.skip.js b/cypress/integration/publisher/000-general/05-verify-api-search-functionality.spec.skip.js new file mode 100644 index 00000000..d72904a5 --- /dev/null +++ b/cypress/integration/publisher/000-general/05-verify-api-search-functionality.spec.skip.js @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; +import ApisHomePage from "../../../support/pages/publisher/ApisHomePage"; +import PublisherMenu from "../../../support/functions/PublisherMenu"; +import APIBasicInfoPage from "../../../support/pages/publisher/APIBasicInfoPage"; +import DeploymentsPage from "../../../support/pages/publisher/DeploymentsPage"; +import LifecyclePage from "../../../support/pages/publisher/LifecyclePage"; + +describe("publisher-000-05 : Verify API Search creiterias", () => { + const { publisher, password} = Utils.getUserInfo(); + const randomNmber = getRandomeNumber() + const apiName1 = "ABC_API_1_" + randomNmber + const apiVersion1 = "1.0.0" + const apiContext1 ="ABC_API_1_Context" + const apiDescription1 = `ABC_API_1_${randomNmber}_desc` + const api1Tage1 = "ABC_API_1_TAG" + const api1Endpoint = "https://petstore.swagger.io/v2/store/inventory" + const api1Status = "blocked" + + const apiName2 = "XYZ_API_2_" + randomNmber + const apiVersion2 = "2.0.0" + const apiContext2 ="XYZ_API_2_Context" + + const apiName3 = "PQR_API_3_" + randomNmber + const apiVersion3 = "3.3.3" + const apiContext3 ="PQR_API_3_Context" + let apiID_1, apiID_2, apiID_3 + + before("Create Sample APIS",function () { + cy.loginToPublisher(publisher, password); + ApisHomePage.waitUntillLoadingComponentsExit(); + Utils.addAPIWithEndpoints({ name: apiName1, version: apiVersion1, context: apiContext1, endpoint: api1Endpoint}).then((createdApiId1) => { + apiID_1 = createdApiId1; + // update basic info + PublisherMenu.goToBasicInfoByURL(apiID_1) + cy.wait(5000); + APIBasicInfoPage.editDescriptionAndUpdateContent(apiDescription1) + APIBasicInfoPage.getTagsTextBox().type(api1Tage1).type('{enter}') + APIBasicInfoPage.getSaveButton().click(); + + PublisherMenu.goToDeploymentsByURL(apiID_1) + DeploymentsPage.clickDeployAndWaitUntillComplete(); + + PublisherMenu.goTolifecycleByURL(apiID_1); + cy.wait(5000); // try to handle from API waiting + + LifecyclePage.clickPublishAndWaitUntillComplete(); + LifecyclePage.clickBlockAndWaitUntillComplete(); + + Utils.addAPIWithEndpoints({ name: apiName2, version: apiVersion2, context: apiContext2 }).then((createdApiId2) => { + apiID_2= createdApiId2; + Utils.addAPIWithEndpoints({ name: apiName3, version: apiVersion3, context: apiContext3}).then((createdApiId3) => { + apiID_3= createdApiId3; + }) + }) + }); + }) + + it("Verify API Search creiterias of Publisher", () => { + + // default/content search + searchAndVerifyAPIByCreiteria("default",apiName1,apiName1) + //searchAndVerifyAPIByCreiteria("default",apiVersion3,apiName3) + searchAndVerifyAPIByCreiteria("default",apiContext2,apiName2) + searchAndVerifyAPIByCreiteria("default",api1Status,apiName1) + searchAndVerifyAPIByCreiteria("default",apiDescription1,apiName1) + + // TODO: since all APIs created from "publisher" user we cannot verify this exactly for now. + // better to create API from a different user and varify this + ApisHomePage.getSearchTestBox().clear().type("provider:").type("publisher").type("{enter}") + ApisHomePage.waitUntillLoadingComponentsExit(); + ApisHomePage.getAllVisibleAPIs_divList().should('have.length.least', 3) + + searchAndVerifyAPIByCreiteria("name:",apiName2,apiName2) + searchAndVerifyAPIByCreiteria("version:",apiVersion3,apiName3) + searchAndVerifyAPIByCreiteria("context:",apiContext2,apiName2) + + searchAndVerifyAPIByCreiteria("status:",api1Status,apiName1) + searchAndVerifyAPIByCreiteria("description:",apiDescription1,apiName1) + searchAndVerifyAPIByCreiteria("tag:",api1Tage1,apiName1) + //TODO: api-category + //TODO: property-name + }); + + after("Delete Sample APIs",() => { + Utils.deleteAPI(apiID_1); + Utils.deleteAPI(apiID_2); + Utils.deleteAPI(apiID_3); + }) +}) + +function getRandomeNumber(){ + return Math.floor(Date.now() / 1000); +} +function searchAndVerifyAPIByCreiteria(SearchCriteria,searchText, expectedAPIName){ + cy.log(`Searching for, Criteria = ${SearchCriteria} and SearchText = ${searchText}`) + if(SearchCriteria=="default"){ + ApisHomePage.getSearchTestBox().clear().type(searchText).type("{enter}") + ApisHomePage.waitUntillLoadingComponentsExit() + }else { + ApisHomePage.getSearchTestBox().clear().type(SearchCriteria).type(searchText).type("{enter}") + ApisHomePage.waitUntillLoadingComponentsExit(); + } + ApisHomePage.getApiLinkOfAPI(expectedAPIName).should('be.visible') + ApisHomePage.getAllVisibleAPIs_divList().should('have.length', 1) +} \ No newline at end of file diff --git a/cypress/integration/publisher/000-general/06-landing-page.spec.js b/cypress/integration/publisher/000-general/06-landing-page.spec.js new file mode 100644 index 00000000..735fc653 --- /dev/null +++ b/cypress/integration/publisher/000-general/06-landing-page.spec.js @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-000-06 : Landing page", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + + const landingPage = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + cy.visit(`/publisher/apis`); + cy.intercept( + { + method: 'GET', + path: '**/apis?limit=10&offset=0', + }, + { + body: { "count": 0, "list": [], "pagination": { "offset": 0, "limit": 10, "total": 0, "next": "", "previous": "" } }, + }, + ).as('apiGet'); + cy.wait("@apiGet", { timeout: 180000 }).then((interceptions) => { + console.log(interceptions); + cy.get('div').contains('REST API').scrollIntoView().should('be.visible'); + cy.get('div').contains('SOAP API').scrollIntoView().should('be.visible'); + cy.get('div').contains('GraphQL').scrollIntoView().should('be.visible'); + cy.get('div').contains('Streaming API').scrollIntoView().should('be.visible'); + + // Checking links under rest apis + cy.get('div').contains('REST API').scrollIntoView().click(); + cy.get('a').contains('Start From Scratch') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/rest'); + cy.get('a').contains('Import Open API') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/openapi'); + + // Checking links under SOAP apis + cy.get('div').contains('SOAP API').scrollIntoView().click(); + cy.get('a').contains('Import WSDL') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/wsdl'); + + // Checking links under GraphQL apis + cy.get('div').contains('GraphQL').scrollIntoView().click(); + cy.get('a').contains('Import GraphQL SDL') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/graphQL'); + + // Checking links under Streaming API apis + cy.get('div').contains('Streaming API').scrollIntoView().click(); + cy.get('a').contains('Web Socket API') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/streamingapi/ws'); + cy.get('a').contains('Webhook API') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/streamingapi/websub'); + cy.get('a').contains('SSE API') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/streamingapi/sse'); + + cy.get('a').contains('Import an AsyncAPI') + .invoke('attr', 'href') + .should('eq', '/publisher/apis/create/asyncapi'); + + }); + } + it.only("Click and check all cards - super admin", () => { + landingPage(superTenant) + }); + it.only("Click and check all cards - tenant user", () => { + landingPage(testTenant) + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/001-api-create/01-login-logout-from-publisher-as-super-tenant-user.spec.js b/cypress/integration/publisher/001-api-create/01-login-logout-from-publisher-as-super-tenant-user.spec.js new file mode 100644 index 00000000..6ec5ce4f --- /dev/null +++ b/cypress/integration/publisher/001-api-create/01-login-logout-from-publisher-as-super-tenant-user.spec.js @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-001-01 : Login logout from publisher as supper tenant", () => { + const { password, carbonUsername, carbonPassword, tenantUser, testTenant, } = Utils.getUserInfo(); + + it.only("Login and logout from publisher", () => { + cy.loginToPublisher(carbonUsername, carbonPassword); + cy.visit(`/publisher/apis`).then(() => { + cy.get('#profile-menu-btn').click(); + cy.get('#itest-logout').click(); + cy.get('#usernameUserInput').should('exist'); + }) + }) + + it.only("Login and logout from publisher - tenant user", () => { + cy.loginToPublisher(carbonUsername, carbonPassword, testTenant); + cy.visit(`/publisher/apis`).then(() => { + cy.get('#profile-menu-btn').click(); + cy.get('#itest-logout').click(); + cy.get('#usernameUserInput').should('exist'); + }) + }) +}) \ No newline at end of file diff --git a/cypress/integration/publisher/001-api-create/02-create-api-with-swagger-file-super-tenant.spec.js b/cypress/integration/publisher/001-api-create/02-create-api-with-swagger-file-super-tenant.spec.js new file mode 100644 index 00000000..a889f9e9 --- /dev/null +++ b/cypress/integration/publisher/001-api-create/02-create-api-with-swagger-file-super-tenant.spec.js @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-001-02 : Create api with swagger file super tenant", () => { + const { publisher, password, tenantUser, testTenant, } = Utils.getUserInfo(); + + const createApiFromSwagger = (usernameLocal, passwordLocal) => { + cy.loginToPublisher(usernameLocal, passwordLocal); + // select the option from the menu item + cy.visit(`/publisher/apis/create/openapi`); + cy.get('#open-api-file-select-radio').click(); + // upload the swagger + cy.get('#browse-to-upload-btn').then(function () { + const filepath = `api_artifacts/swagger_2.0.json` + cy.get('input[type="file"]').attachFile(filepath) + }); + + // go to the next step + cy.get('#open-api-create-next-btn').click(); + cy.get('#itest-id-apiendpoint-input').click(); + + cy.intercept('**/apis/**').as('apiGet'); + // finish the wizard + cy.get('#open-api-create-btn').click(); + cy.wait('@apiGet', {timeout: 30000}).then((data) => { + // validate + cy.get('#itest-api-name-version', { timeout: 30000 }).contains('1.0.5'); + const apiId = data.response.body.id; + Utils.deleteAPI(apiId); + }) + } + it("Create API from swagger from file - supper admin", () => { + createApiFromSwagger(publisher, password); + }); + + it("Create API from swagger from file - tenant user", () => { + createApiFromSwagger(`${publisher}@${testTenant}`, password); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/publisher/001-api-create/03-create-api-with-swagger-url-super-tenant.spec.js b/cypress/integration/publisher/001-api-create/03-create-api-with-swagger-url-super-tenant.spec.js new file mode 100644 index 00000000..c77861c2 --- /dev/null +++ b/cypress/integration/publisher/001-api-create/03-create-api-with-swagger-url-super-tenant.spec.js @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-001-03 : Create api with swagger file super tenant", () => { + + const { publisher, password, tenantUser, testTenant, } = Utils.getUserInfo(); + let testApiID; + const openApiCreate = (url) => { + // select the option from the menu item + cy.visit(`/publisher/apis/create/openapi`); + + // upload the swagger + cy.get('[data-testid="swagger-url-endpoint"]', {timeout: Cypress.config().largeTimeout}).type(url); + // go to the next step + cy.get('#url-validated', { timeout: 30000 }); + cy.get('#open-api-create-next-btn').click(); + cy.wait(2000); + cy.get('#itest-id-apiversion-input', {timeout: Cypress.config().largeTimeout}); + + cy.get('#itest-id-apicontext-input').type('petstore3'); + cy.get('#itest-id-apiversion-input').click(); + cy.log("API version") + cy.get('#itest-id-apiendpoint-input').clear(); + cy.get('#itest-id-apiendpoint-input').type(url).should('have.value', url); + + // finish the wizard + cy.get('#open-api-create-btn').click({force: true}); + + // validate + cy.get('#itest-api-name-version', {timeout: Cypress.config().largeTimeout}); + cy.get('#itest-api-name-version').contains("SwaggerPetstore"); + cy.url().then(url => { + testApiID = /apis\/(.*?)\/overview/.exec(url)[1]; + + }); + } + afterEach(() => { + Utils.deleteAPI(testApiID); + + }) + it("Create API from swagger from file openapi 2", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + cy.loginToPublisher(publisher, password); + openApiCreate('https://petstore.swagger.io/v2/swagger.json'); + }); + + it("Create API from swagger from file openapi 3", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + cy.loginToPublisher(publisher, password); + openApiCreate('https://petstore3.swagger.io/api/v3/openapi.json'); + }); + + it("Create API from swagger from file openapi 2 - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + cy.loginToPublisher(`${publisher}@${testTenant}`, password); + openApiCreate('https://petstore.swagger.io/v2/swagger.json'); + }); + + it("Create API from swagger from file openapi 3 - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + cy.loginToPublisher(`${publisher}@${testTenant}`, password); + openApiCreate('https://petstore3.swagger.io/api/v3/openapi.json'); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/publisher/001-api-create/04-creating-web-socket-api-as-super-tenant-user.spec.js b/cypress/integration/publisher/001-api-create/04-creating-web-socket-api-as-super-tenant-user.spec.js new file mode 100644 index 00000000..0ec8fff1 --- /dev/null +++ b/cypress/integration/publisher/001-api-create/04-creating-web-socket-api-as-super-tenant-user.spec.js @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-001-04 : Create websocket api - super tenant", () => { + const { publisher, password, tenantUser, testTenant, } = Utils.getUserInfo(); + + const websocketApiCreate = () => { + const random_number = Math.floor(Date.now() / 1000); + const randomName = Utils.generateName(); + cy.visit(`/publisher/apis/create/streamingapi/ws`); + + // Filling the form + cy.get('#itest-id-apiname-input').type(randomName); + cy.get('#itest-id-apicontext-input').click(); + cy.get('#itest-id-apicontext-input').type(`/sample_context_${random_number}`); + cy.get('#itest-id-apiversion-input').click(); + cy.get('#itest-id-apiversion-input').type(`v${random_number}`); + cy.get('#itest-id-apiendpoint-input').click(); + cy.get('#itest-id-apiendpoint-input').type('wss://www.example.com/socketserver'); + // Saving the form + + + cy.intercept('**/apis/**').as('apiGet'); + // finish the wizard + cy.get('[data-testid="itest-create-streaming-api-button"]').click(); + cy.wait('@apiGet', { timeout: 30000 }).then((data) => { + // validate + //Checking the version in the overview + cy.get('#itest-api-name-version', { timeout: 30000 }).should('be.visible'); + cy.get('#itest-api-name-version').contains(`v${random_number}`); + + // Test is done. Now delete the api + const apiId = data.response.body.id; + Utils.deleteAPI(apiId); + }); + + + } + it("Create websocket API from url", () => { + cy.loginToPublisher(publisher, password); + websocketApiCreate(); + }); + + it("Create websocket API from url - tenant user", () => { + cy.loginToPublisher(`${publisher}@${testTenant}`, password); + websocketApiCreate(); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/publisher/001-api-create/05-creating-graphql-api-as-super-tenant-user.spec.js b/cypress/integration/publisher/001-api-create/05-creating-graphql-api-as-super-tenant-user.spec.js new file mode 100644 index 00000000..892c183c --- /dev/null +++ b/cypress/integration/publisher/001-api-create/05-creating-graphql-api-as-super-tenant-user.spec.js @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-001-05 : Create GraphQl API from file", () => { + const {carbonUsername, carbonPassword, testTenant} = Utils.getUserInfo(); + let testApiId; + it("Create GraphQl API from file - supper admin", () => { + cy.loginToPublisher(carbonUsername, carbonPassword); + cy.createGraphqlAPIfromFile("SampleAPI_",'1.0.0','/sampleapi','api_artifacts/schema_graphql.graphql').then((apiId) => { + testApiId = apiId; + }); + }); + it("Create GraphQl API from file - tenant user", () => { + cy.loginToPublisher(carbonUsername, carbonPassword, testTenant); + cy.createGraphqlAPIfromFile("SampleAPI_",'1.0.0','/sampleapi','api_artifacts/schema_graphql.graphql').then((apiId) => { + testApiId = apiId; + }); + }); + afterEach(function () { + if (testApiId) { + Utils.deleteAPI(testApiId); + } + }) +}) \ No newline at end of file diff --git a/cypress/integration/publisher/002-api-resources/00-api-resource-create.spec.js b/cypress/integration/publisher/002-api-resources/00-api-resource-create.spec.js new file mode 100644 index 00000000..0a6b95fb --- /dev/null +++ b/cypress/integration/publisher/002-api-resources/00-api-resource-create.spec.js @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-002-00 : Resource add edit operations", () => { + + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + const target = '/test'; + let testApiId; + + const addApiAndResource = (verb, apiId) => { + // Typing the resource name + cy.visit(`/publisher/apis/${apiId}/resources`); + cy.get('#operation-target').type(target); + cy.get('body').click(); + cy.get('#add-operation-selection-dropdown').click(); + + // Checking all the operations + cy.get(`#add-operation-${verb}`).click(); + + cy.get('body').click(); + cy.get('#add-operation-button').click(); + cy.get('#resources-save-operations').click(); + + // Validating if the resource exists after saving + cy.get('#resources-save-operations', { timeout: 30000 }); + + cy.get(`#${verb}\\${target}`).should('be.visible'); + } + const addNewResource = (tenant) => { + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + testApiId = apiId; + cy.visit(`/publisher/apis/${apiId}/resources`); + + // Typing the resource name + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemresources').click(); + cy.get('#operation-target').type(target); + cy.get('body').click(); + cy.get('#add-operation-selection-dropdown').click(); + + // Checking all the operations + cy.get('#add-operation-get').click(); + cy.get('#add-operation-post').click(); + cy.get('#add-operation-put').click(); + cy.get('#add-operation-patch').click(); + cy.get('#add-operation-delete').click(); + cy.get('#add-operation-head').click(); + + cy.get('body').click(); + cy.get('#add-operation-button').click(); + cy.get('#resources-save-operations').click(); + + // Validating if the resource exists after saving + cy.get('#resources-save-operations', { timeout: 30000 }); + + cy.get(`#get\\${target}`).should('be.visible'); + cy.get(`#post\\${target}`).should('be.visible'); + cy.get(`#put\\${target}`).should('be.visible'); + cy.get(`#patch\\${target}`).should('be.visible'); + cy.get(`#delete\\${target}`).should('be.visible'); + cy.get(`#head\\${target}`).should('be.visible'); + }); + } + const addDeleteQueryPathParamForResources = (tenant) => { + const verb = 'get'; + const paramType = 'query'; + const paramName = 'count'; + const paramDataType = 'string'; + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + testApiId = apiId; + addApiAndResource(verb, apiId); + + cy.get(`#${verb}\\${target}`).click(); + cy.get(`#param-${verb}\\${target}`).click(); + cy.get(`#param-${verb}\\${target}\\/${paramType}`).click(); + + cy.get(`#name-${verb}\\${target}`).click(); + cy.get(`#name-${verb}\\${target}`).type(paramName); + + // Clicking the parameter data type drop down + cy.get(`#data-${verb}\\${target}`).click(); + cy.get(`#data-${verb}\\${target}\\/${paramDataType}`).click(); + cy.get(`#param-${verb}\\${target}-add-btn`).click({ force: true }); + + // Save the resources + cy.get('#resources-save-operations').click(); + + // Validating if the param exists after saving + cy.get('#resources-save-operations', { timeout: 30000 }); + cy.get(`#param-list-${paramType}-${paramName}-${paramDataType}`).should('be.visible'); + }); + } + + const addAdvanceThrottlingPoliciesPerResource = (tenant) => { + const verb = 'get'; + const rateLimitName = '50KPerMin'; + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + testApiId = apiId; + addApiAndResource(verb, apiId); + // Click the operation level radio button on the top + cy.get('#api-rate-limiting-operation-level').click({ force: true }); + + // expand the section + cy.get(`#${verb}\\${target}`).click(); + + cy.get(`#${verb}\\${target}-operation_throttling_policy`).click(); + cy.get(`#${verb}\\${target}-operation_throttling_policy-${rateLimitName}`).click(); + + // Save the resources + cy.get('#resources-save-operations').click(); + + cy.get('#resources-save-operations', { timeout: 30000 }); + cy.get(`#${verb}\\${target}-operation_throttling_policy`) + .contains(rateLimitName) + .should('be.visible'); + }); + } + + const addAndAssignScopesForApiResources = (tenant) => { + const random_number = Math.floor(Date.now() / 1000); + const verb = 'post'; + const scopeName = 'test' + random_number; + const scopeDescription = 'test scope description'; + const role = 'internal/publisher'; + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + testApiId = apiId; + addApiAndResource(verb, apiId); + + // Go to local scope page + cy.visit(`/publisher/apis/${apiId}/scopes/create`); + + cy.wait(2000); + // Create a local scope + cy.get('input#name').click({force:true}); + cy.get('input#name').clear().type(scopeName, {force:true}); + + cy.get('#displayName').click(); + cy.get('#displayName').type(scopeName); + + cy.get('#description').click(); + cy.get('#description').type(scopeDescription); + + cy.get('#roles-input').click(); + cy.get('#roles-input').type(`${role}{enter}`); + + cy.get('#scope-save-btn').click(); + cy + .get('tbody') + .get('tr') + .contains(scopeName).should('be.visible'); + + // Go to resources page + cy.visit(`/publisher/apis/${apiId}/resources`); + + // Open the operation sub section + cy.get(`#${verb}\\${target}`).click(); + cy.get(`#${verb}\\${target}-operation-scope-select`, { timeout: 3000 }); + cy.get(`#${verb}\\${target}-operation-scope-select`).click(); + cy.get(`#${verb}\\${target}-operation-scope-${scopeName}`).click(); + cy.get(`#${verb}\\${target}-operation-scope-${scopeName}`).type('{esc}'); + // // Save the resources + cy.get('#resources-save-operations').click(); + + cy.get('#resources-save-operations', { timeout: 30000 }); + cy.get(`#${verb}\\${target}-operation-scope-select`) + .contains(scopeName) + .should('be.visible'); + + }); + } + + it.only("Add new resource - super admin",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addNewResource(superTenant); + }); + + it.only("Add delete query path parameters for resources - super admin",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addDeleteQueryPathParamForResources(superTenant); + }); + + it.only("Add advance throttling policies per resource - super admin",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addAdvanceThrottlingPoliciesPerResource(superTenant); + }); + + it.only("Add and assign scopes for API resources - super admin",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addAndAssignScopesForApiResources(superTenant); + }); + + it.only("Add new resource - tenant user",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addNewResource(testTenant); + }); + + it.only("Add delete query path parameters for resources - tenant user",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addDeleteQueryPathParamForResources(testTenant); + }); + + it.only("Add advance throttling policies per resource - tenant user",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addAdvanceThrottlingPoliciesPerResource(testTenant); + }); + + it.only("Add and assign scopes for API resources - tenant user",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addAndAssignScopesForApiResources(testTenant); + }); + + afterEach(() => { + Utils.deleteAPI(testApiId); + }) + +}) \ No newline at end of file diff --git a/cypress/integration/publisher/002-api-resources/01-add-advance-throttling-policies-for-api.spec.js b/cypress/integration/publisher/002-api-resources/01-add-advance-throttling-policies-for-api.spec.js new file mode 100644 index 00000000..d1321666 --- /dev/null +++ b/cypress/integration/publisher/002-api-resources/01-add-advance-throttling-policies-for-api.spec.js @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-002-01 : Add advanced throttling policies", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + + let apiName + const apiVersion = '1.0.0'; + + const addAuthorizationHeaderForApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/resources`); + + cy.get('#api-rate-limiting-api-level').click(); + cy.get('#operation_throttling_policy').click(); + cy.get('#api-rate-limiting-api-level-10KPerMin').then(() => { + cy.get('#api-rate-limiting-api-level-10KPerMin').click(); + }) + cy.get('#resources-save-operations').click(); + + cy.get('#operation_throttling_policy').scrollIntoView(); + cy.get('#operation_throttling_policy').contains('10KPerMin').should('be.visible'); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Add Authorization Header for the api - super admin", () => { + addAuthorizationHeaderForApi(superTenant); + }); + it.only("Add Authorization Header for the api - tenant user", () => { + addAuthorizationHeaderForApi(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/003-run-time-configs/00-add-authorization-header.spec.js b/cypress/integration/publisher/003-run-time-configs/00-add-authorization-header.spec.js new file mode 100644 index 00000000..40873388 --- /dev/null +++ b/cypress/integration/publisher/003-run-time-configs/00-add-authorization-header.spec.js @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-003-00 : Runtime configuration-Authorization Header ", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + + let apiName; + const apiVersion = '1.0.0'; + + const addAuthorizationHeaderForTheApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName();; + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + const customAuthHeader = '-custom'; + cy.visit(`/publisher/apis/${apiId}/runtime-configuration`); + cy.get('#applicationLevel').children('[role="button"]').click({force:true}); + cy.wait(1000); + cy.get('#itest-id-headerName-input').click({force:true}).type(customAuthHeader, {force:true}); + cy.get('#save-runtime-configurations').click(); + cy.get('#itest-id-headerName-input').should('have.value', 'Authorization' + customAuthHeader); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Add Authorization Header for the api - super admin", () => { + addAuthorizationHeaderForTheApi(superTenant); + }); + it.only("Add Authorization Header for the api - tenant user", () => { + addAuthorizationHeaderForTheApi(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/003-run-time-configs/01-select-transport-types.spec.js b/cypress/integration/publisher/003-run-time-configs/01-select-transport-types.spec.js new file mode 100644 index 00000000..1a4cdc5b --- /dev/null +++ b/cypress/integration/publisher/003-run-time-configs/01-select-transport-types.spec.js @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-003-01 : Runtime configuration-transport type", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + + let apiName; + const apiVersion = '1.0.0'; + + const selectTransportType = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/runtime-configuration`); + cy.get('#transportLevel div:first', {timeout: Cypress.config().largeTimeout}).click({force:true}); + cy.wait(1000); + cy.get('#http-transport').click({force:true}); + cy.wait(1000); + cy.get('#runtime-config-save-button').click(); + // following is tested but haven't worked + //cy.get('div[role="status"]', {timeout: Cypress.config().largeTimeout}).should('have.text', 'API updated successfully'); + cy.contains('API updated successfully', {timeout: Cypress.config().largeTimeout}); + cy.get('#transportLevel').click({force:true}); + cy.get('#http-transport', {timeout: Cypress.config().largeTimeout}).should('not.be.checked', {timeout: Cypress.config().largeTimeout}); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Select transport type - super admin", () => { + selectTransportType(superTenant); + }); + it.only("Select transport type - tenant user", () => { + selectTransportType(testTenant); + }); + +}); \ No newline at end of file diff --git a/cypress/integration/publisher/003-run-time-configs/02-enable-response-caching.spec.js b/cypress/integration/publisher/003-run-time-configs/02-enable-response-caching.spec.js new file mode 100644 index 00000000..a4d42e1b --- /dev/null +++ b/cypress/integration/publisher/003-run-time-configs/02-enable-response-caching.spec.js @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +import Utils from "@support/utils"; + +describe("publisher-003-02 : Runtime configuration-response caching", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + let apiName; + const apiVersion = '1.0.0'; + + const enableResponseCaching = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemRuntimeConfigurations').click(); + cy.get('#response-caching-switch').click(); + cy.get('#save-runtime-configurations').click(); + cy.get('#response-caching-switch').should('be.checked'); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + it.only("Enable response caching - super admin", () => { + enableResponseCaching(superTenant); + }); + it.only("Enable response caching - tenant user", () => { + enableResponseCaching(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/003-run-time-configs/03-enable-schema-validation.spec.js b/cypress/integration/publisher/003-run-time-configs/03-enable-schema-validation.spec.js new file mode 100644 index 00000000..0c427fb5 --- /dev/null +++ b/cypress/integration/publisher/003-run-time-configs/03-enable-schema-validation.spec.js @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-003-03 : Runtime configuration-schema validation", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + let apiName; + const apiVersion = '1.0.0'; + + const enableSchemaValidation = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemRuntimeConfigurations').click(); + cy.get('#schema-validation-switch').click(); + cy.get('#schema-validation-yes-btn').click(); + cy.get('#save-runtime-configurations').click(); + cy.get('#schema-validation-switch').should('be.checked'); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Enable schema validation - super admin", () => { + enableSchemaValidation(superTenant); + }); + it.only("Enable schema validation - tenant user", () => { + enableSchemaValidation(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/003-run-time-configs/04-enable-mutual-ssl-and-upload-certificate.spec.js b/cypress/integration/publisher/003-run-time-configs/04-enable-mutual-ssl-and-upload-certificate.spec.js new file mode 100644 index 00000000..0be5da8c --- /dev/null +++ b/cypress/integration/publisher/003-run-time-configs/04-enable-mutual-ssl-and-upload-certificate.spec.js @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-003-04 : Runtime configuration-ssl", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + let apiName; + const apiVersion = '1.0.0'; + + const enableMutualSSLandUploadCert = (tenant) => { + const random_number = Math.floor(Date.now() / 1000); + const alias = `alias${random_number}`; + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemRuntimeConfigurations').click(); + cy.get('h4').contains('Transport Level Security').click(); + cy.get('#mutual-ssl-checkbox').click(); + + // uploading the cert + cy.get('#certs-add-btn').click(); + cy.get('#mui-component-select-policies').click(); + cy.get('#Bronze').click(); + cy.get('#certificateAlias').click().type(alias); + + // upload the cert + const filepath = 'api_artifacts/sample.crt.pem'; + cy.get('input[type="file"]').attachFile(filepath); + + // Click away + cy.get('#upload-cert-save-btn').click(); + cy.get('#upload-cert-save-btn').then(() => { + cy.get('#save-runtime-configurations').click(); + }) + cy.get('#save-runtime-configurations').get(() => { + cy.get('h4').contains('Transport Level Security').click(); + cy.get('#mutual-ssl-checkbox').should('be.checked'); + cy.get('#endpoint-cert-list').contains(alias).should('be.visible'); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }) + }); + } + + it.only("Enable mutual ssl and upload cert - super admin", () => { + enableMutualSSLandUploadCert(superTenant); + }); + it.only("Enable mutual ssl and upload cert - tenant user", () => { + enableMutualSSLandUploadCert(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/003-run-time-configs/05-oauth2-and-api-key-security.spec.js b/cypress/integration/publisher/003-run-time-configs/05-oauth2-and-api-key-security.spec.js new file mode 100644 index 00000000..916bf79e --- /dev/null +++ b/cypress/integration/publisher/003-run-time-configs/05-oauth2-and-api-key-security.spec.js @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +import Utils from "@support/utils"; + +describe("publisher-003-05 : Runtime configuration - OAuth2 and api key security", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + let apiName; + const apiVersion = '1.0.0'; + + const oauth2AndApiKeySecuritySpec = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + apiName = Utils.generateName(); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemRuntimeConfigurations').click(); + cy.get('#applicationLevel').click(); + // Checking the two options + cy.get('#api-security-basic-auth-checkbox').click(); + cy.get('#api-security-api-key-checkbox').click(); + + cy.get('#save-runtime-configurations').click(); + cy.get('#save-runtime-configurations').then(() => { + cy.get('#applicationLevel').click(); + cy.get('#api-security-basic-auth-checkbox').should('be.checked'); + cy.get('#api-security-api-key-checkbox').should('be.checked'); + }) + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("OAuth2 and api key security spec - super admin", () => { + oauth2AndApiKeySecuritySpec(superTenant); + }); + it.only("OAuth2 and api key security spec - tenant user", () => { + oauth2AndApiKeySecuritySpec(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/004-endpoints/00-add-rest-endpoints-production-sandbox.spec.js b/cypress/integration/publisher/004-endpoints/00-add-rest-endpoints-production-sandbox.spec.js new file mode 100644 index 00000000..9c3c04ce --- /dev/null +++ b/cypress/integration/publisher/004-endpoints/00-add-rest-endpoints-production-sandbox.spec.js @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-004-00 : Add production and sandbox endpoints for an API", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + const endpoint = 'https://petstore.swagger.io/v2/store/inventory'; + + const addRestEndpointsProductionSandbox = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/restendpoint-add-btn"]').click({force:true}); + + // Add the prod and sandbox endpoints + cy.get('#production-endpoint-checkbox').click(); + cy.get('#sandbox-endpoint-checkbox').click(); + cy.get('#production_endpoints').focus().type(endpoint); + cy.get('#sandbox_endpoints').focus().type(endpoint); + + // Save + cy.get('body').click(); + cy.get('#endpoint-save-btn').scrollIntoView(); + cy.get('#endpoint-save-btn').click(); + + // Check the values + cy.get('#production_endpoints').should('have.value', endpoint); + cy.get('#sandbox_endpoints').should('have.value', endpoint); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + it.only("Add production and sandbox endpoints for an API - super admin", () => { + addRestEndpointsProductionSandbox(superTenant); + }); + it.only("Add production and sandbox endpoints for an API - tenant user", () => { + addRestEndpointsProductionSandbox(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/004-endpoints/01-add-soap-endpoints-production-sandbox.spec.js b/cypress/integration/publisher/004-endpoints/01-add-soap-endpoints-production-sandbox.spec.js new file mode 100644 index 00000000..53d9879c --- /dev/null +++ b/cypress/integration/publisher/004-endpoints/01-add-soap-endpoints-production-sandbox.spec.js @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-004-01 : Add production sandbox endpoints for SOAP", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + const endpoint = 'https://graphical.weather.gov/xml/SOAP_server/ndfdXMLserver.php?wsdl'; + + const addSoapEndpointProductionSandbox = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/soapendpoint-add-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + + // Add the prod and sandbox endpoints + cy.get('#production-endpoint-checkbox').click(); + cy.get('#sandbox-endpoint-checkbox').click(); + cy.get('#production_endpoints').focus().type(endpoint); + cy.get('#sandbox_endpoints').focus().type(endpoint); + cy.get('#production_endpoints').click(); + + // Save + cy.get('body').click(); + cy.get('#endpoint-save-btn').scrollIntoView(); + cy.get('#endpoint-save-btn', {timeout: Cypress.config().largeTimeout}).click(); + + // Check the values + cy.get('#production_endpoints').should('have.value', endpoint); + cy.get('#sandbox_endpoints').should('have.value', endpoint); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + it.only("Add production sandbox endpoints for SOAP - super admin", () => { + addSoapEndpointProductionSandbox(superTenant); + }); + it.only("Add production sandbox endpoints for SOAP - tenant user", () => { + addSoapEndpointProductionSandbox(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/004-endpoints/02-check-endpoint-test-button.spec.js b/cypress/integration/publisher/004-endpoints/02-check-endpoint-test-button.spec.js new file mode 100644 index 00000000..4ba690d0 --- /dev/null +++ b/cypress/integration/publisher/004-endpoints/02-check-endpoint-test-button.spec.js @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-004-02 : Check endpoint test button", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + + const checkEndpointTestButton = (tenant) => { + const endpoint200 = 'https://petstore.swagger.io/v2/store/inventory'; // 200 OK + const endpoint400 = 'https://petstore.swagger.io/v2/store/inventory/7777777'; //404 Not Found + const endpointUnknown = 'http://bull-8772776363-url.foo123'; // Unknown Host + const endpointNoProtocol = 'bullproto://'; // unknown protocol: bullproto + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/restendpoint-add-btn"]').click(); + + // Add the prod and sandbox endpoints + cy.get('#production-endpoint-checkbox').click(); + + // endpoint-test-icon + cy.get('#production_endpoints').focus().type(endpoint200); + cy.get('#production_endpoints-endpoint-test-icon-btn').trigger("click"); + cy.get('#production_endpoints-endpoint-test-status', { timeout: 30000 }).should('have.text', '200 OK'); + + // endpoint-test-icon + cy.get('#production_endpoints').focus().clear().type(endpoint400); + cy.get('#production_endpoints-endpoint-test-icon-btn').trigger("click"); + cy.get('#production_endpoints-endpoint-test-status', { timeout: 30000 }).should('have.text', '404 Not Found'); + + cy.get('#production_endpoints').focus().clear().type(endpointUnknown); + cy.get('#production_endpoints-endpoint-test-icon-btn').trigger("click"); + cy.get('#production_endpoints-endpoint-test-status', { timeout: 30000 }).should('have.text', 'Unknown Host'); + + cy.get('#production_endpoints').focus().clear().type(endpointNoProtocol); + cy.get('#production_endpoints-endpoint-test-icon-btn').trigger("click"); + cy.get('#production_endpoints-endpoint-test-status', { timeout: 30000 }).should('have.text', 'unknown protocol: bullproto'); + + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Check endpoint test button - super admin", () => { + checkEndpointTestButton(superTenant); + }); + it.only("Check endpoint test button - tenant user", () => { + checkEndpointTestButton(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/004-endpoints/03-add-failover.spec.js b/cypress/integration/publisher/004-endpoints/03-add-failover.spec.js new file mode 100644 index 00000000..d46627eb --- /dev/null +++ b/cypress/integration/publisher/004-endpoints/03-add-failover.spec.js @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-004-03 : Endpoint testing - Failover", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + const endpoint = 'https://petstore.swagger.io/v2/store/inventory'; + + const addFailOver = (tenant) => { + // todo need to remove this check after `console.err(err)` -> `console.err(err)` in Endpoints.jsx + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/restendpoint-add-btn"]').click(); + + // Add the prod and sandbox endpoints + cy.get('#production-endpoint-checkbox', {timeout: Cypress.config().largeTimeout}).click({force:true}); + cy.get('#sandbox-endpoint-checkbox').click({force:true}); + cy.get('#production_endpoints').focus().type(endpoint); + cy.get('#sandbox_endpoints').focus().type(endpoint); + + // failover + cy.get('#panel1bh-header').click(); + cy.get('#certificateEndpoint').click(); + cy.get('#config-type-failover').click(); + + // add prod endpoints for failover + cy.get('#production_endpoints-failover').focus().type(endpoint); + cy.get('#production_endpoints-failover-add-btn').click(); + + // add sandbox endpoints for failover + cy.get('#sandbox_endpoints-failover').focus().type(endpoint); + cy.get('#sandbox_endpoints-failover-add-btn').click(); + // Save + cy.get('#endpoint-save-btn').click(); + + // Check the values + cy.get('#production_endpoints').should('have.value', endpoint); + cy.get('#sandbox_endpoints').should('have.value', endpoint); + + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Add REST endpoints for production and sandbox endpoints with failover - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addFailOver(superTenant); + }); + it.only("Add REST endpoints for production and sandbox endpoints with failover - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addFailOver(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/004-endpoints/04-add-loadbalance.spec.js b/cypress/integration/publisher/004-endpoints/04-add-loadbalance.spec.js new file mode 100644 index 00000000..ba9c6bf1 --- /dev/null +++ b/cypress/integration/publisher/004-endpoints/04-add-loadbalance.spec.js @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-004-04 : Endpoint testing - Loadbalance", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + const endpoint = 'https://petstore.swagger.io/v2/store/inventory'; + + const addLoadBalance = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/restendpoint-add-btn"]').click(); + + // Add the prod and sandbox endpoints + cy.get('#production-endpoint-checkbox').click(); + cy.get('#sandbox-endpoint-checkbox').click(); + cy.get('#production_endpoints').focus().type(endpoint); + cy.get('#sandbox_endpoints').focus().type(endpoint); + + // load balance + cy.get('#panel1bh-header').click(); + cy.get('#certificateEndpoint').click(); + cy.get('#config-type-load_balance').click(); + + // add prod endpoints for failover + cy.get('#production_endpoints-load_balance').focus().type(endpoint); + cy.get('#production_endpoints-load_balance-add-btn').click(); + + // add sandbox endpoints for failover + cy.get('#sandbox_endpoints-load_balance').focus().type(endpoint); + cy.get('#sandbox_endpoints-load_balance-add-btn').click(); + // Save + cy.get('#endpoint-save-btn').click(); + + // Check the values + cy.get('#production_endpoints').should('have.value', endpoint); + cy.get('#sandbox_endpoints').should('have.value', endpoint); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Add REST endpoints for production and sandbox endpoints with LOAD balanced - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addLoadBalance(superTenant); + }); + it.only("Add REST endpoints for production and sandbox endpoints with LOAD balanced - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addLoadBalance(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/004-endpoints/05-add-security.spec.js b/cypress/integration/publisher/004-endpoints/05-add-security.spec.js new file mode 100644 index 00000000..418088bf --- /dev/null +++ b/cypress/integration/publisher/004-endpoints/05-add-security.spec.js @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-004-05 : Add security to the endpoint", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + + const addSecurity = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + const endpoint = 'https://petstore.swagger.io/v2/store/inventory'; + const usernameLocal = 'admin'; + const passwordLocal = 'admin'; + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/restendpoint-add-btn"]').click(); + + // Add the prod and sandbox endpoints + cy.get('#production-endpoint-checkbox').click(); + cy.get('#production_endpoints').focus().type(endpoint); + + + cy.get('#production_endpoints-endpoint-security-icon-btn').trigger('click'); + cy.get('#mui-component-select-key').click(); + cy.get('#auth-type-BASIC').click(); + cy.get('#auth-userName').click(); + cy.get('#auth-userName').type(usernameLocal); + cy.get('#auth-password').click(); + cy.get('#auth-password').type(passwordLocal); + + // Save the security form + cy.get('#endpoint-security-submit-btn').click(); + + // Save the endpoint + cy.get('#endpoint-save-btn').click(); + + // Check the values + cy.get('#production_endpoints-endpoint-security-icon-btn').trigger('click'); + cy.get('#auth-userName').should('have.value', usernameLocal); + cy.get('#auth-password').should('have.value', passwordLocal); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Add security to the endpoint - super admin", () => { + addSecurity(superTenant); + }); + it.only("Add security to the endpoint - tenant user", () => { + addSecurity(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/004-endpoints/06-Import-delete-certificates.spec.js b/cypress/integration/publisher/004-endpoints/06-Import-delete-certificates.spec.js new file mode 100644 index 00000000..1fd8f70b --- /dev/null +++ b/cypress/integration/publisher/004-endpoints/06-Import-delete-certificates.spec.js @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-004-06 : Endpoint testing - import delete certificate", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + + const importDeleteCertificate = (tenant) => { + const random_number = Math.floor(Date.now() / 1000); + const testAlias = Utils.generateName(); + const endpoint = `https://petstore.swagger.io/v2/store/inventory/${random_number}`; + + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/restendpoint-add-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + + // Add the prod and sandbox endpoints + cy.get('#production-endpoint-checkbox').click(); + cy.get('#production_endpoints').focus().type(endpoint); + + //Expanding the general config section + cy.get('#http-panel1bh-header').trigger('click'); + cy.get('#certs-add-btn').click(); + + cy.get('#endpoint-certificate').click(); + cy.get(`[data-value="${endpoint}"]`).click(); + + cy.get('#certificateAlias').click(); + cy.get('#certificateAlias').type(testAlias); + + // upload the cert + cy.get('[data-testid="cert-upload-btn"]').click(); + const filepath = 'api_artifacts/sample.crt.pem'; + cy.get('input[type="file"]').attachFile(filepath); + + // Click away + cy.get('#certificateAlias').click(); + + // Save the cert + cy.get('#upload-cert-save-btn').type(filepath); + cy.wait(1000); + + // Save the endpoint + cy.get('#endpoint-save-btn').click(); + cy.get('#endpoint-save-btn').then(function (el) { + cy.contains('API updated successfully'); + // Need to wait until certificate added into the store + cy.reload(); + // Check the values + cy.contains('Certificates: 1'); + cy.get('#http-panel1bh-header').click({force:true}); + cy.get('#endpoint-cert-list').contains(testAlias).scrollIntoView().should('be.visible'); + cy.get('#http-panel1bh-header').click({ force: true }); + cy.get('#delete-cert-btn').click({ force: true }); + cy.get('#delete-cert-confirm-btn').click({ force: true }); + cy.reload(); + cy.contains('Certificates: 0'); + + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + }); + } + + it.only("Add REST endpoints for production and sandbox endpoints with failover - super admin", () => { + importDeleteCertificate(superTenant); + }); + it.only("Add REST endpoints for production and sandbox endpoints with failover - tenant user", () => { + importDeleteCertificate(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/004-endpoints/07-mock-api-and-test.spec.js b/cypress/integration/publisher/004-endpoints/07-mock-api-and-test.spec.js new file mode 100644 index 00000000..7038a7d9 --- /dev/null +++ b/cypress/integration/publisher/004-endpoints/07-mock-api-and-test.spec.js @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ +/* +TODO +The product is broken. we need to fix the product. This test case is ignored from cypress.json +*/ +import Utils from "@support/utils"; + +describe("publisher-004-07 : Mock the api response and test it", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + let testApiID; + + /* + TODO + */ + const mockApiAndTest = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + cy.visit(`/publisher/apis/create/openapi`); + cy.get('#open-api-file-select-radio').click(); + + // upload the swagger + cy.get('#browse-to-upload-btn').then(function () { + const filepath = `api_artifacts/petstore-v3.json` + cy.get('input[type="file"]').attachFile(filepath) + }); + + cy.get('#open-api-create-next-btn').click(); + + cy.get('#itest-id-apiversion-input', { timeout: 30000 }); + cy.document().then((doc) => { + cy.get('#itest-id-apicontext-input').clear(); + cy.get('#itest-id-apicontext-input').type('petstore3'); + cy.get('#itest-id-apiversion-input').click(); + const version = doc.querySelector('#itest-id-apiversion-input').value; + + + // finish the wizard + cy.get('#open-api-create-btn').click(); + cy.url().should('contains', 'overview').then(url => { + testApiID = /apis\/(.*?)\/overview/.exec(url)[1]; + cy.log("API ID", testApiID); + // validate + cy.get('#itest-api-name-version'); + cy.get('#itest-api-name-version').contains(version); + + // Go to endpoints page + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemendpoints').click(); + + // Change the endpoint type to Prototype Implementation + cy.get('#INLINE').click(); + + // Confirm it + cy.get('#change-endpoint-type-btn').click(); + cy.get('#endpoint-save-btn').click(); + cy.get('#endpoint-save-btn').then(() => { + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemsubscriptions').click(); + + cy.get('[data-testid="policy-checkbox-silver"]').children().eq(1).contains('Silver : Allows 2000 requests per minute').click(); + cy.get('#subscriptions-save-btn').click(); + + // Going to deployments page + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemdeployments').click(); + + // Deploying + cy.wait(1000); + cy.get('#deploy-btn').should('not.have.class', 'Mui-disabled').click({force:true}); + cy.get('#undeploy-btn').should('not.have.class', 'Mui-disabled').should('exist'); + + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemTestConsole').click(); + + cy.get('#operations-pet-getPetById').click(); + cy.get('#operations-pet-getPetById .try-out__btn').click(); + cy.get('#operations-pet-getPetById [placeholder="petId"]').type('1'); + cy.get('#operations-pet-getPetById button.execute').click(); + cy.get('#operations-pet-getPetById td.response-col_status').contains('200').should('exist'); + }) + }) + }); + } + it("Mock the api response and test it - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + mockApiAndTest(superTenant); + }); + it("Mock the api response and test it - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + mockApiAndTest(testTenant); + }); + afterEach(() => { + Utils.deleteAPI(testApiID); + + }) +}) \ No newline at end of file diff --git a/cypress/integration/publisher/005-design-config/00-add-thumbnail-image.spec.js b/cypress/integration/publisher/005-design-config/00-add-thumbnail-image.spec.js new file mode 100644 index 00000000..711d8431 --- /dev/null +++ b/cypress/integration/publisher/005-design-config/00-add-thumbnail-image.spec.js @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +/* +TODO +The product is broken. we need to fix the product. This test case is ignored from cypress.json +*/ +import Utils from "@support/utils"; + +describe("publisher-005-00 : Upload thumbnail", () => { + const { publisher, password, superTenant } = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + let testApiID; + + const addThumbnailImage = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + testApiID = apiId; + cy.get('#itest-api-details-portal-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#left-menu-itemDesignConfigurations').click(); + cy.get('#edit-api-thumbnail-btn').children('button').click({force:true}); + cy.get('#edit-api-thumbnail-upload').click(); + + // upload the image + const filepath = 'api_artifacts/api-pic.jpg'; + cy.get('input[type="file"]').attachFile(filepath); + cy.get('#edit-api-thumbnail-upload-btn').click(); + + // Save + cy.get('#design-config-save-btn').click({ force: true }); + + cy.wait(5000); + // Validate + cy.get('[alt="API Thumbnail"]') + .should('be.visible') + .and(($img) => { + // "naturalWidth" and "naturalHeight" are set when the image loads + expect($img[0].naturalWidth).to.be.greaterThan(0) + }) + }); + } + it.only("Upload thumbnail - super admin",{ + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + addThumbnailImage(superTenant); + }); + afterEach(() => { + Utils.deleteAPI(testApiID); + + }) +}); \ No newline at end of file diff --git a/cypress/integration/publisher/005-design-config/01-make-api-the-default-version.spec.js b/cypress/integration/publisher/005-design-config/01-make-api-the-default-version.spec.js new file mode 100644 index 00000000..c0287d90 --- /dev/null +++ b/cypress/integration/publisher/005-design-config/01-make-api-the-default-version.spec.js @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-005-01 : Make api the default version", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + + const makeApiTheDefaultVersion = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemDesignConfigurations').click(); + cy.get('#default-version-yes').scrollIntoView().click(); + cy.get('#design-config-save-btn').click(); + cy.get('#default-version-yes') + .parent() + .find('input') + .should('be.checked'); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + it.only("Add Authorization Header for the api - super admin", () => { + makeApiTheDefaultVersion(superTenant); + }); + it.only("Add Authorization Header for the api - tenant user", () => { + makeApiTheDefaultVersion(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/005-design-config/02-set-publisher-access-control-and-visibility-by-roles.spec.js b/cypress/integration/publisher/005-design-config/02-set-publisher-access-control-and-visibility-by-roles.spec.js new file mode 100644 index 00000000..616f65d7 --- /dev/null +++ b/cypress/integration/publisher/005-design-config/02-set-publisher-access-control-and-visibility-by-roles.spec.js @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-005-02 : Set publisher access control and visibility by roles", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + + const setPublisherAccessControAndVisibilityByRoles = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + const role = 'internal/everyone'; + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemDesignConfigurations').click(); + + // Select the restricted by role option for access control + cy.get('#accessControl-selector').click(); + cy.get('#access-control-restricted-by-roles').click(); + + // fill the chip input and press enter + cy.get('[data-testid="access-control-select-role"]').type(`${role}{enter}`); + + // Select the restricted by role option for devportal visibility + cy.get('#storeVisibility-selector').scrollIntoView().click(); + cy.get('#visibility-restricted-by-roles').scrollIntoView().click(); + + // fill the chip input and press enter + cy.get('[data-testid="visibility-select-role"]').type(`${role}{enter}`); + + cy.get('#design-config-save-btn').scrollIntoView().click(); + cy.get('#design-config-save-btn').then(function () { + cy.get('div[data-testid="access-control-select-role"] span').contains(role).should('exist'); + cy.get('div[data-testid="visibility-select-role"] span').contains(role).should('exist'); + }); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Set role based API Store visibility and access control for the api - super admin", () => { + setPublisherAccessControAndVisibilityByRoles(superTenant); + }); + it.only("Set role based API Store visibility and access control for the api - tenant user", () => { + setPublisherAccessControAndVisibilityByRoles(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/006-subscriptions/00-select-subscription-tiers.spec.js b/cypress/integration/publisher/006-subscriptions/00-select-subscription-tiers.spec.js new file mode 100644 index 00000000..588812aa --- /dev/null +++ b/cypress/integration/publisher/006-subscriptions/00-select-subscription-tiers.spec.js @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + + +describe("publisher-006-00 : Select subscription tiers for the API", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + + const selectSubscriptionTiers = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemsubscriptions').click(); + cy.get('[data-testid="policy-checkbox-silver"]').click(); + cy.get('#subscriptions-save-btn').click(); + + cy.get('#subscriptions-save-btn').then(function () { + cy.get('[data-testid="policy-checkbox-unlimited"] input').should('be.checked'); + cy.get('[data-testid="policy-checkbox-silver"] input').should('be.checked'); + }); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Select subscription tiers for the API - super admin", () => { + selectSubscriptionTiers(superTenant); + }); + it.only("Select subscription tiers for the API - tenant user", () => { + selectSubscriptionTiers(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/006-subscriptions/01-subscribtion-blocking.spec.js b/cypress/integration/publisher/006-subscriptions/01-subscribtion-blocking.spec.js new file mode 100644 index 00000000..5249b31f --- /dev/null +++ b/cypress/integration/publisher/006-subscriptions/01-subscribtion-blocking.spec.js @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-006-01 : Subscription blocking", () => { + + + const { publisher, password, developer, superTenant } = Utils.getUserInfo(); + let apiName; + const apiVersion = '2.0.0'; + let appName; + const appDescription = 'app description'; + const apiContext = apiName; + let testApiId; + + const subscribeBlocking = (tenant) => { + apiName = Utils.generateName(); + appName = Utils.generateName() + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion, context: apiContext }).then((apiId) => { + testApiId = apiId; + Utils.publishAPI(apiId).then((serverResponse) => { + console.log(serverResponse); + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password, tenant); + cy.createApp(appName, appDescription, tenant); + cy.visit(`/devportal/apis?tenant=${tenant}`); + cy.url().should('contain', `/apis?tenant=${tenant}`); + cy.visit(`/devportal/apis/${apiId}/credentials?tenant=${tenant}`); + // Click and select the new application + cy.get('#application-subscribe', { timeout: Cypress.config().largeTimeout }).should('be.visible'); + + cy.get('#application-subscribe').click(); + cy.get(`.MuiAutocomplete-popper li`).contains(appName).click(); + cy.get(`#subscribe-to-api-btn`).click(); + cy.get(`#subscription-table td`).contains(appName).should('exist'); + + // Subscription blocking port in the publisher side. + cy.logoutFromDevportal(); + cy.loginToPublisher(publisher, password, tenant); + cy.visit(`/publisher/apis/${apiId}/overview`); + + + // click the left menu to go to subscriptions page. + cy.get('#itest-api-details-portal-config-acc', { timeout: Cypress.config().largeTimeout }).should('be.visible'); + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemsubscriptions').click(); + cy.get('table tr button span').contains('Block Production Only').click(); + cy.get('table tr td').contains('PROD_ONLY_BLOCKED').should('exist'); + cy.get('table tr button span').contains('Block All').click(); + cy.get('table tr td').contains('BLOCKED').should('exist'); + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password, tenant); + cy.visit(`/devportal/applications?tenant=${tenant}`); + cy.get(`#delete-${appName}-btn`, { timeout: Cypress.config().largeTimeout }); + cy.get(`#delete-${appName}-btn`).click(); + cy.get(`#itest-confirm-application-delete`).click(); + cy.logoutFromDevportal(); + cy.loginToPublisher(publisher, password, tenant); + }) + }); + } + + it.only("Subscription blocking - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + subscribeBlocking(superTenant); + }) + + afterEach(() => { + Utils.deleteAPI(testApiId); + }) +}) \ No newline at end of file diff --git a/cypress/integration/publisher/008-business-info/00-business-info.spec.js b/cypress/integration/publisher/008-business-info/00-business-info.spec.js new file mode 100644 index 00000000..d50e33d3 --- /dev/null +++ b/cypress/integration/publisher/008-business-info/00-business-info.spec.js @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-008-00 : Add business information", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + const businessInfo = (tenant) => { + const ownerName = 'Raccoon Panda'; + const ownerEmail = 'raccoon@wso2.com'; + const techOwnerName = 'Big Cat'; + const techOwnerEmail = 'bigcat@wso2.com'; + + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-portal-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#left-menu-itembusinessinfo').click(); + cy.get('#name').click().type(ownerName); + cy.get('#Email').click().type(ownerEmail); + cy.get('#TOname').click().type(techOwnerName); + cy.get('#TOemail').click().type(techOwnerEmail); + + cy.get('#business-info-save').click(); + + cy.get('#business-info-save').then(function () { + cy.get('#name').should('have.value', ownerName); + cy.get('#Email').should('have.value', ownerEmail); + cy.get('#TOname').should('have.value', techOwnerName); + cy.get('#TOemail').should('have.value', techOwnerEmail); + }); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + it.only("Add business information - super admin", () => { + businessInfo(superTenant); + }); + it.only("Add business information - tenant user", () => { + businessInfo(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/009-api-definition/00-download-api.spec.js b/cypress/integration/publisher/009-api-definition/00-download-api.spec.js new file mode 100644 index 00000000..72397c4d --- /dev/null +++ b/cypress/integration/publisher/009-api-definition/00-download-api.spec.js @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-009-00 : Api Definition - Download API", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + + const downloadApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemAPIdefinition').click(); + cy.get('#download-api-btn').click(); + + // Downloading API + const fileName = `${publisher}-${apiName}-${apiVersion}`; + const downloadsFolder = Cypress.config('downloadsFolder') + const downloadedFilename = `${downloadsFolder}/${fileName}.zip`; + + cy.readFile(downloadedFilename, 'binary', { timeout: 15000 }) + .should(buffer => expect(buffer.length).to.be.gt(100)); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Download api - super admin", () => { + downloadApi(superTenant); + }); + it.only("Download api - tenant user", () => { + downloadApi(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/009-api-definition/01-download-swagger.spec.js b/cypress/integration/publisher/009-api-definition/01-download-swagger.spec.js new file mode 100644 index 00000000..9ebbfd5d --- /dev/null +++ b/cypress/integration/publisher/009-api-definition/01-download-swagger.spec.js @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; +const YAML = require('yamljs') + +describe("publisher-009-01 : Download swagger", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + + const downloadSwagger = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemAPIdefinition').click(); + cy.get('.lines-content.monaco-editor-background div.view-lines div.view-line', {timeout: Cypress.config().largeTimeout}); + cy.wait(2000); + cy.get('#download-definition-btn').click(); + + // Downloading swagger + const downloadsFolder = Cypress.config('downloadsFolder') + /* + TODO + swagger.yaml does not get saved with the correct extension. + */ + const downloadedFilename = `${downloadsFolder}/swagger.yaml`; + cy.readFile(downloadedFilename).then((str) => { + // TODO. The content is there when we test the same from the UI + // But somehow the content coming as null here. Need to validate the content here. + cy.log(str); + cy.log(downloadedFilename); + const english = YAML.parse(str) + cy.log(english); + }) + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Download swagger - super admin", () => { + downloadSwagger(superTenant); + }); + it.only("Download swagger - tenant user", () => { + downloadSwagger(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/009-api-definition/02-upload-api.spec.js b/cypress/integration/publisher/009-api-definition/02-upload-api.spec.js new file mode 100644 index 00000000..3ad728ce --- /dev/null +++ b/cypress/integration/publisher/009-api-definition/02-upload-api.spec.js @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-009-02 : Upload api spec from the api definition page", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + + const uploadApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemAPIdefinition').click(); + cy.get('#import-definition-btn').click(); + cy.get('#open-api-file-select-radio').click(); + + // upload the swagger + cy.get('#browse-to-upload-btn').then(function () { + const filepath = 'api_artifacts/petstore_open_api_3.json' + cy.get('input[type="file"]').attachFile(filepath); + }); + + // provide the swagger url + cy.get('#import-open-api-btn').click(); + + // Wait until the api is saved + cy.intercept('**/apis/**').as('apiGet'); + cy.wait('@apiGet', { timeout: 3000 }).then((res) => { + // Check the resource exists + const uuid = res.response.body.id + + cy.visit(`/publisher/apis/${uuid}/resources`, { timeout: 30000 }); + cy.get('#\\/pets\\/\\{petId\\}', { timeout: 30000 }).scrollIntoView(); + cy.get('#\\/pets\\/\\{petId\\}').should('be.visible'); + }); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + it.only("Upload api spec from the api definition page - super admin", () => { + uploadApi(superTenant); + }); + it.only("Upload api spec from the api definition page - tenant user", () => { + uploadApi(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/010-additional-properties/00-add-additional-properties.spec.js b/cypress/integration/publisher/010-additional-properties/00-add-additional-properties.spec.js new file mode 100644 index 00000000..00ac7425 --- /dev/null +++ b/cypress/integration/publisher/010-additional-properties/00-add-additional-properties.spec.js @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-010-00 : Add additional properties", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + + const addAdditionalProperties = (tenant) => { + const prop = 'prop1'; + const propVal = 'prop1-val'; + + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemproperties').click(); + + // Click the add property button + cy.get('#add-new-property').click(); + + // Fill the form + cy.get('#property-name').click().type(prop); + cy.get('#property-value').click().type(propVal); + // Add them + cy.get('#properties-add-btn').click(); + + // Save the api + cy.get('#save-api-properties').click(); + + // Checking the values exists + cy.get('#save-api-properties').then(function () { + cy.contains(prop).should('exist'); + cy.contains(propVal).should('exist'); + }); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + + it.only("Add additional properties - super admin", () => { + addAdditionalProperties(superTenant); + }); + it.only("Add additional properties - tenant user", () => { + addAdditionalProperties(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/011-lifecycle/00-save-and-publish-api.spec.js b/cypress/integration/publisher/011-lifecycle/00-save-and-publish-api.spec.js new file mode 100644 index 00000000..a0237113 --- /dev/null +++ b/cypress/integration/publisher/011-lifecycle/00-save-and-publish-api.spec.js @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-011-00 : Save and publish API", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + + const saveAndPublishApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemsubscriptions').click(); + cy.get('[data-testid="policy-checkbox-silver"]').click(); + cy.get('#subscriptions-save-btn').click(); + + // Going to deployments page + cy.get('#left-menu-itemdeployments').click(); + + // Deploying + cy.wait(2000); + cy.get('#add-description-btn').click(); + cy.get('#add-description').click(); + cy.get('#add-description').type('test'); + cy.get('#deploy-btn').should('not.have.class', 'Mui-disabled').click(); + cy.get('#undeploy-btn').should('not.have.class', 'Mui-disabled').should('exist'); + + // Going to lifecycle page + cy.get('#left-menu-itemlifecycle').click(); + + + // Publishing + cy.wait(2000); + cy.get('[data-testid="Publish-btn"]').click(); + + // Validate + cy.get('button[data-testid="Demote to Created-btn"]').should('exist'); + + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + it.only("Save and publish API - super admin", () => { + saveAndPublishApi(superTenant); + }); + it.only("Save and publish API - tenant user", () => { + saveAndPublishApi(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/011-lifecycle/01-block-demote-to-created-depricate-api.spec.js b/cypress/integration/publisher/011-lifecycle/01-block-demote-to-created-depricate-api.spec.js new file mode 100644 index 00000000..744fb0c7 --- /dev/null +++ b/cypress/integration/publisher/011-lifecycle/01-block-demote-to-created-depricate-api.spec.js @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-011-01 : Lifecycle changes", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + let testApiId; + + const blockDemoteToCreatedDepricatedApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPIWithEndpoints({ name: apiName, version: apiVersion }).then((apiId) => { + testApiId = apiId; + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-portal-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#left-menu-itemsubscriptions').click(); + cy.get('[data-testid="policy-checkbox-silver"]').click(); + cy.get('#subscriptions-save-btn').click(); + + // // Going to lifecycle page + // cy.get('[data-testid="left-menu-itemlifecycle"]').click(); + // // This wait is ant pattern. But there is no other way unless the React components are rewrite. + // cy.wait(2000); + // + // // Publishing + // cy.get('button[data-testid="Publish"]').click(); + // cy.get('button[data-testid="Redeploy"]').should('exist'); + // // Even though this step is redundant we need to do this. The component is behaving + // // It removes the buttons after some time of initial rendering. + // cy.get('[data-testid="left-menu-itemlifecycle"]').click(); + // cy.wait(2000); + // + // // Redeploy + // cy.get('button[data-testid="Redeploy"]').then(() => { + // cy.get('button[data-testid="Redeploy"]').click(); + // }); + + // Going to deployments page + cy.get('#left-menu-itemdeployments').click(); + + // Deploying + cy.get('#deploy-btn').should('not.have.class', 'Mui-disabled').scrollIntoView().click({force:true}); + cy.contains("Create revisions and deploy in Gateway Environments", {timeout: Cypress.config().largeTimeout}) + // Going to lifecycle page + cy.get('#left-menu-itemlifecycle').click(); + + // Publishing + cy.wait(3000); + cy.get('[data-testid="Publish-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + + cy.wait(2000); + cy.contains("LC has changed from CREATED to PUBLISHED", {timeout: Cypress.config().largeTimeout}) + cy.get('button[data-testid="Demote to Created-btn"]').should('exist'); + cy.contains("CREATED", {timeout: Cypress.config().largeTimeout}) + cy.get('#left-menu-itemlifecycle').click(); + cy.wait(2000); + + // Demote to created + cy.get('button[data-testid="Demote to Created-btn"]').click(); + cy.wait(2000); + cy.get('[data-testid="Publish-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + //cy.get('button[data-testid="Demote to Created-btn"]').should('exist'); + cy.get('#left-menu-itemlifecycle').click(); + cy.wait(2000); + + // Block + cy.get('[data-testid="Block-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.wait(2000); + cy.get('button[data-testid="Re-Publish-btn"]').should('exist'); + cy.get('#left-menu-itemlifecycle').click(); + cy.wait(2000); + + // Re-Publish + + cy.get('button[data-testid="Re-Publish-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('button[data-testid="Deprecate-btn"]', {timeout: Cypress.config().largeTimeout}).should('exist'); + cy.get('#left-menu-itemlifecycle').click(); + cy.wait(2000); + + // Deprecate + + cy.get('button[data-testid="Deprecate-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('button[data-testid="Retire-btn"]').should('exist'); + cy.wait(2000); + + cy.get('button[data-testid="Retire-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + }); + } + it.only("Block demote retire api - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + blockDemoteToCreatedDepricatedApi(superTenant); + }); + it.only("Block demote retire api - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + blockDemoteToCreatedDepricatedApi(testTenant); + }); + afterEach(() => { + // Test is done. Now delete the api + Utils.deleteAPI(testApiId); + }) +}); \ No newline at end of file diff --git a/cypress/integration/publisher/011-lifecycle/02-deploy-as-prototype.spec.skip.js b/cypress/integration/publisher/011-lifecycle/02-deploy-as-prototype.spec.skip.js new file mode 100644 index 00000000..95e2f693 --- /dev/null +++ b/cypress/integration/publisher/011-lifecycle/02-deploy-as-prototype.spec.skip.js @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-011-02 : Deploy as prototype", () => { + const { publisher, password, } = Utils.getUserInfo(); + const apiName = Utils.generateName(); + const apiVersion = '1.0.0'; + + before(function () { + cy.loginToPublisher(publisher, password); + }) + + it.only("Deploy as prototype", () => { + const endpoint = 'https://petstore.swagger.io/v2/store/inventory'; + Utils.addAPI({ name: apiName, version: apiVersion }).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemendpoints').click(); + cy.wait(500); + cy.get('[data-testid="http/restendpoint-add-btn"]').click(); + cy.get('[data-testid="prototype_endpoint-start"]').click(); + + cy.get('[data-testid="primaryEndpoint-endpoint-text-field"]').then(() => { + cy.get('[data-testid="primaryEndpoint-endpoint-text-field"] input').focus().type(endpoint); + }); + + // Save + cy.get('[data-testid="endpoint-save-btn"]').then(() => { + cy.get('[data-testid="endpoint-save-btn"]').click(); + }); + + cy.get('[data-testid="left-menu-itemlifecycle"]').click(); + cy.wait(2000); + cy.get('button[data-testid="Deploy as a Prototype"]').then(() => { + cy.get('button[data-testid="Deploy as a Prototype"]').click(); + }); + cy.get('button[data-testid="Demote to Created"]').should('exist'); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/012-documents/00-add-edit-inline-document.spec.js b/cypress/integration/publisher/012-documents/00-add-edit-inline-document.spec.js new file mode 100644 index 00000000..071f3cd2 --- /dev/null +++ b/cypress/integration/publisher/012-documents/00-add-edit-inline-document.spec.js @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-012-00 : creating document", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + + const addEditInlineDocument = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + const documentName = 'api_document'; + const documentSummary = 'api document summery'; + Utils.addAPI({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemdocuments').click(); + + cy.get('#add-new-document-btn').click(); + cy.get('#doc-name').type(documentName); + cy.get('#doc-summary').click(); + cy.get('#doc-summary').type(documentSummary); + cy.get('#add-document-btn').scrollIntoView(); + cy.get('#add-document-btn').click(); + cy.get('#add-content-back-to-listing-btn').click(); + + // Checking it's existence + cy.get('table a').contains(documentName).should('be.visible'); + + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }); + } + it.only("Creating inline document - super admin", () => { + addEditInlineDocument(superTenant); + }); + it.only("Creating inline document - tenant user", () => { + addEditInlineDocument(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/013-api-product/01-create-product-and-update-underline-api.spec.js b/cypress/integration/publisher/013-api-product/01-create-product-and-update-underline-api.spec.js new file mode 100644 index 00000000..18f50a12 --- /dev/null +++ b/cypress/integration/publisher/013-api-product/01-create-product-and-update-underline-api.spec.js @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-013-01 : Mock the api response and test it", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + const productName = Utils.generateName(); + const apiName = Utils.generateName(); + let testApiID; + + const createProductAndUpdateUnderlineApiSpec = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + cy.visit(`/publisher/apis/create/openapi`, {timeout: Cypress.config().largeTimeout}); + cy.get('#open-api-file-select-radio').click(); + + // upload the swagger + cy.get('#browse-to-upload-btn').then(function () { + const filepath = `api_artifacts/petstore-v3.json` + cy.get('input[type="file"]').attachFile(filepath) + }); + + cy.get('#open-api-create-next-btn').click(); + + cy.get('#itest-id-apiversion-input', {timeout: Cypress.config().largeTimeout}); + cy.document().then((doc) => { + cy.get('#itest-id-apiname-input').clear().type(apiName); + cy.get('#itest-id-apicontext-input').clear(); + cy.get('#itest-id-apicontext-input').type(apiName); + cy.get('#itest-id-apiversion-input').click(); + const version = doc.querySelector('#itest-id-apiversion-input').value; + // finish the wizard + cy.get('#open-api-create-btn').should('not.have.class', 'Mui-disabled').click({force:true}); + + cy.url().should('contains', 'overview').then(url => { + testApiID = /apis\/(.*?)\/overview/.exec(url)[1]; + cy.log("API ID", testApiID); + // validate + cy.get('#itest-api-name-version', {timeout: Cypress.config().largeTimeout}); + cy.get('#itest-api-name-version').contains(version); + + //Get the api id; + + // Go to api product create page + cy.visit(`/publisher/api-products/create`); + + // fill the form + cy.get('#itest-id-apiname-input').type(productName); + cy.get('#context').type(productName); + cy.get('#itest-id-apiname-input').click(); + cy.get('body').click(0,0); + + cy.intercept('**/swagger').as('swaggerGet'); + + cy.get('#api-product-next-btn').should('not.have.class', 'Mui-disabled').click({force:true}); + + cy.wait('@swaggerGet', { timeout: Cypress.config().largeTimeout }).then(() => { + cy.intercept('GET', '**/swagger').as('getSwagger'); + cy.get(`#checkbox-list-label-${testApiID}`).click(); + cy.wait('@getSwagger'); + // Wait until the api is saved + cy.get('#resource-wrapper').children().should('have.length.gte', 1); + + // add all resources + cy.get('#add-all-resources-btn').click({ force: true }); + cy.get('#create-api-product-btn').scrollIntoView().dblclick({ force: true }); + cy.url().should('contains', 'overview').then(urlProduct => { + const productID = /api-products\/(.*?)\/overview/.exec(urlProduct)[1]; + cy.log("API Product ID", productID); + cy.get('#itest-api-name-version', { timeout: Cypress.config().largeTimeout }); + cy.get('#itest-api-name-version').contains(productName); + + // Need to update the underline api and update the api product again. + // ==================================================================== // + cy.log(testApiID, productID); + cy.visit(`/publisher/apis/${testApiID}/resources`); + + // Add a new resource to the underline api + // Typing the resource name + const target = '/test'; + cy.get('#operation-target', { timeout: Cypress.config().largeTimeout }); + cy.get('#operation-target').type(target); + cy.get('#add-operation-selection-dropdown').click(); + + cy.get('#add-operation-get').click(); + cy.get('body').click(); + + cy.get('#add-operation-button').click(); + cy.get('#resources-save-operations').click(); + + // Validating if the resource exists after saving + cy.get(`#get\\${target}`).should('be.visible'); + + // Go to api product + cy.visit(`/publisher/api-products/${productID}/resources/edit`); + + // Add the newly created resource and save + cy.get('#resource-wrapper', { timeout: Cypress.config().largeTimeout }); + cy.get('#resource-wrapper') + .last() + .scrollIntoView() + .click(); + cy.get('#add-selected-resources').click(); + cy.get('#save-product-resources').click(); + + // Deleting the api and api product + cy.visit(`/publisher/api-products/${productID}/overview`); + cy.get('#itest-api-name-version', { timeout: Cypress.config().largeTimeout }); + cy.get(`#itest-id-deleteapi-icon-button`).click(); + cy.get(`#itest-id-deleteconf`).click(); + + }); + }); + }); + }); + } + + it("Mock the api response and test it - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + createProductAndUpdateUnderlineApiSpec(superTenant); + }); + it("Mock the api response and test it - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + createProductAndUpdateUnderlineApiSpec(testTenant); + }); + afterEach(() => { + Utils.deleteAPI(testApiID); + }) +}) \ No newline at end of file diff --git a/cypress/integration/publisher/013-api-product/02-create-a-new-revision-for-the-api-product-and-deploy.spec.js b/cypress/integration/publisher/013-api-product/02-create-a-new-revision-for-the-api-product-and-deploy.spec.js new file mode 100644 index 00000000..b7cedd76 --- /dev/null +++ b/cypress/integration/publisher/013-api-product/02-create-a-new-revision-for-the-api-product-and-deploy.spec.js @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-013-02 : Mock the api response and test it", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + const productName = Utils.generateName(); + const apiName = Utils.generateName(); + let testApiID; + + const createNewRevisionForApiProduct = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + cy.visit(`/publisher/apis/create/openapi`, {timeout: Cypress.config().largeTimeout}); + cy.get('#open-api-file-select-radio').click(); + // upload the swagger + cy.get('#browse-to-upload-btn').then(function () { + const filepath = `api_artifacts/petstore-v3.json` + cy.get('input[type="file"]').attachFile(filepath) + }); + + cy.get('#open-api-create-next-btn').click(); + + cy.get('#itest-id-apiversion-input', {timeout: Cypress.config().largeTimeout}); + cy.document().then((doc) => { + cy.get('#itest-id-apicontext-input').clear(); + cy.get('#itest-id-apicontext-input').type(apiName); + cy.get('#itest-id-apiversion-input').click(); + const version = doc.querySelector('#itest-id-apiversion-input').value; + // finish the wizard + cy.get('#open-api-create-btn').should('not.have.class', 'Mui-disabled').click({force:true}); + + cy.url().should('contains', 'overview').then(url => { + testApiID = /apis\/(.*?)\/overview/.exec(url)[1]; + cy.log("API ID", testApiID); + + // validate + cy.get('#itest-api-name-version', {timeout: Cypress.config().largeTimeout}); + cy.get('#itest-api-name-version').contains(version); + + // Go to api product create page + cy.visit(`/publisher/api-products/create`); + + // fill the form + cy.get('#itest-id-apiname-input').type(productName); + cy.get('#context').type(productName); + cy.get('#itest-id-apiname-input').click(); + + cy.intercept('**/swagger').as('swaggerGet'); + + cy.get('#api-product-next-btn').click(); + cy.wait('@swaggerGet', { timeout: Cypress.config().largeTimeout }).then(() => { + + cy.intercept('GET', '**/swagger').as('getSwagger'); + cy.get(`#checkbox-list-label-${testApiID}`).click(); + cy.wait('@getSwagger'); + + cy.get('#resource-wrapper').children().should('have.length.gte', 1); + // add all resources + cy.get('#add-all-resources-btn', { timeout: Cypress.config().largeTimeout }).click(); + cy.get('span').contains('Define API Product').click(); + cy.get('#create-api-product-btn').scrollIntoView().dblclick({ force: true }); + + cy.get('#itest-api-name-version', { timeout: Cypress.config().largeTimeout }); + cy.get('#itest-api-name-version').contains(productName); + + // Going to deployments page + cy.get('#left-menu-itemdeployments').click(); + + // Deploying + cy.get('#deploy-btn').should('not.have.class', 'Mui-disabled').click({ "force": true }); + cy.get('#undeploy-btn').should('not.have.class', 'Mui-disabled').should('exist'); + + // Going to lifecycle page + cy.get('#left-menu-itemlifecycle').click(); + + // Publishing + cy.wait(2000); + cy.get('[data-testid="Publish-btn"]').click(); + + cy.get('button[data-testid="Demote to Created-btn"]').should('exist'); + + cy.get(`#itest-id-deleteapi-icon-button`).click(); + cy.get(`#itest-id-deleteconf`).click(); + }) + + }); + }); + } + + it("Mock the api response and test it - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + createNewRevisionForApiProduct(superTenant); + }); + it("Mock the api response and test it - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + createNewRevisionForApiProduct(testTenant); + }); + afterEach(() => { + Utils.deleteAPI(testApiID); + }) +}) \ No newline at end of file diff --git a/cypress/integration/publisher/013-api-product/03-undeploy-new-revision-of-api-product.spec.js b/cypress/integration/publisher/013-api-product/03-undeploy-new-revision-of-api-product.spec.js new file mode 100644 index 00000000..1037e0f0 --- /dev/null +++ b/cypress/integration/publisher/013-api-product/03-undeploy-new-revision-of-api-product.spec.js @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-013-03 : Mock the api response and test it", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + const productName = Utils.generateName(); + const apiName = Utils.generateName(); + let testApiID; + + const undeployNewRevisionOfApiProduct = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + cy.visit(`/publisher/apis/create/openapi`, {timeout: Cypress.config().largeTimeout}); + cy.get('#open-api-file-select-radio').click(); + + // upload the swagger + cy.get('#browse-to-upload-btn').then(function () { + const filepath = `api_artifacts/petstore-v3.json` + cy.get('input[type="file"]').attachFile(filepath) + }); + + cy.get('#open-api-create-next-btn').click(); + + cy.get('#itest-id-apiversion-input', {timeout: Cypress.config().largeTimeout}); + cy.document().then((doc) => { + cy.get('#itest-id-apicontext-input').clear(); + cy.get('#itest-id-apicontext-input').type(apiName); + cy.get('#itest-id-apiversion-input').click(); + const version = doc.querySelector('#itest-id-apiversion-input').value; + // finish the wizard + cy.get('#open-api-create-btn').should('not.have.class', 'Mui-disabled').click({force:true}); + cy.url().should('contains', 'overview').then(url => { + testApiID = /apis\/(.*?)\/overview/.exec(url)[1]; + cy.log("API ID", testApiID); + + // validate + cy.get('#itest-api-name-version', {timeout: Cypress.config().largeTimeout}); + cy.get('#itest-api-name-version').contains(version); + + // Go to api product create page + cy.visit(`/publisher/api-products/create`); + + // fill the form + cy.get('#itest-id-apiname-input').type(productName); + cy.get('#context').type(productName); + cy.get('#itest-id-apiname-input').click(); + + cy.intercept('**/swagger').as('swaggerGet'); + + cy.get('#api-product-next-btn').click(); + cy.wait('@swaggerGet', { timeout: Cypress.config().largeTimeout }).then(() => { + cy.intercept('GET', '**/swagger').as('getSwagger'); + cy.get(`#checkbox-list-label-${testApiID}`).click(); + cy.wait('@getSwagger'); + // Wait until the api is saved + cy.get('#resource-wrapper').children().should('have.length.gte', 1); + + // add all resources + cy.get('#add-all-resources-btn').click(); + cy.get('#create-api-product-btn').scrollIntoView().dblclick({ force: true }); + + cy.url().should('contains', 'overview').then(urlProduct => { + const productID = /api-products\/(.*?)\/overview/.exec(urlProduct)[1]; + cy.log("API Product ID", productID); + + cy.get('#itest-api-name-version', { timeout: Cypress.config().largeTimeout }); + cy.get('#itest-api-name-version').contains(productName); + + // Going to deployments page + cy.get('#left-menu-itemdeployments').click(); + + // Deploying + cy.get('#deploy-btn').should('not.have.class', 'Mui-disabled').click({ "force": true }); + cy.get('#undeploy-btn').should('not.have.class', 'Mui-disabled').should('exist'); + cy.get('#undeploy-btn').should('not.have.class', 'Mui-disabled').click(); + cy.get('#revision-selector').should('exist'); + + cy.log(testApiID, productID); + + // Deleting the api and api product + cy.visit(`/publisher/api-products/${productID}/overview`); + cy.get('#itest-api-name-version', { timeout: Cypress.config().largeTimeout }); + cy.get(`#itest-id-deleteapi-icon-button`).click({ force: true }); + cy.get(`#itest-id-deleteconf`).click(); + }) + }); + }); + }); + } + + it("Mock the api response and test it - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + undeployNewRevisionOfApiProduct(superTenant); + }); + it("Mock the api response and test it - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + undeployNewRevisionOfApiProduct(testTenant); + }); + afterEach(() => { + Utils.deleteAPI(testApiID); + }) +}) \ No newline at end of file diff --git a/cypress/integration/publisher/013-api-product/04-lifecycle-support-for-api-products.spec.js b/cypress/integration/publisher/013-api-product/04-lifecycle-support-for-api-products.spec.js new file mode 100644 index 00000000..21231341 --- /dev/null +++ b/cypress/integration/publisher/013-api-product/04-lifecycle-support-for-api-products.spec.js @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-013-04 : Life cycle support for API Products", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + const productName = Utils.generateName(); + const apiName = Utils.generateName(); + + const lifeCycleSupportForApiProduct = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + cy.visit(`/publisher/apis/create/openapi`, {timeout: Cypress.config().largeTimeout}); + cy.get('#open-api-file-select-radio').click(); + + + // upload the swagger + cy.get('#browse-to-upload-btn').then(function () { + const filepath = `api_artifacts/pizzashack.json` + cy.get('input[type="file"]').attachFile(filepath) + }); + cy.get('#open-api-create-next-btn').click(); + cy.get('#itest-id-apiversion-input', {timeout: Cypress.config().largeTimeout}); + + cy.document().then((doc) => { + cy.get('#itest-id-apicontext-input').clear(); + cy.get('#itest-id-apicontext-input').type(apiName); + cy.get('#itest-id-apiversion-input').click(); + const version = doc.querySelector('#itest-id-apiversion-input').value; + + // finish the wizard + cy.get('#open-api-create-btn').should('not.have.class', 'Mui-disabled').click({force:true}); + + // validate + cy.get('#itest-api-name-version', {timeout: Cypress.config().largeTimeout}); + cy.get('#itest-api-name-version').contains(version); + + // Get the api id + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuid = pathSegments[pathSegments.length - 2]; + + // Go to api product create page + cy.visit(`/publisher/api-products/create`); + + // fill the form + cy.get('#itest-id-apiname-input').type(productName); + cy.get('#context').type(productName); + cy.get('#itest-id-apiname-input').click(); + + cy.intercept('**/swagger').as('swaggerGet'); + cy.get('#api-product-next-btn').click(); + cy.wait('@swaggerGet', { timeout: Cypress.config().largeTimeout }).then(() => { + cy.intercept('GET', '**/swagger').as('getSwagger'); + cy.get(`#checkbox-list-label-${uuid}`).click(); + cy.wait('@getSwagger'); + // Wait until the api is saved + cy.get('#resource-wrapper').children().should('have.length.gte', 1); + + // add all resources + cy.get('#add-all-resources-btn').click(); + cy.get('#create-api-product-btn').scrollIntoView().click(); + cy.get('#itest-api-name-version', { timeout: Cypress.config().largeTimeout }); + cy.get('#itest-api-name-version').contains(productName); + + //Get the api product id + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuidProduct = pathSegments[pathSegments.length - 2]; + + cy.log(uuid, uuidProduct); + + cy.get('#left-menu-itemdeployments').click(); + + // Deploying + cy.get('#deploy-btn', { timeout: Cypress.config().largeTimeout }).should('not.have.class', 'Mui-disabled').click({ force: true }); + + cy.get('#left-menu-itemlifecycle').click(); + + // Publishing api product + cy.wait(2000); + cy.get('[data-testid="Publish-btn"]').click(); + // Validate + cy.get('button[data-testid="Demote to Created-btn"]').should('exist'); + + //Demote to create + cy.get('[data-testid="Demote to Created-btn"]').click(); + + //publish as a prototype + cy.get('[data-testid="Deploy as a Prototype-btn"]').click(); + + // Deleting the api and api product + cy.visit(`/publisher/api-products/${uuidProduct}/overview`); + cy.get('#itest-id-deleteapi-icon-button').click(); + cy.get('#itest-id-deleteconf').click(); + + cy.visit(`/publisher/apis/${uuid}/overview`); + cy.get('#itest-api-name-version', { timeout: Cypress.config().largeTimeout }); + cy.get(`#itest-id-deleteapi-icon-button`).click(); + cy.get(`#itest-id-deleteconf`).click(); + + cy.logoutFromPublisher(); + }); + }); + }); + }); + } + + it("Life cycle support for API Products - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + lifeCycleSupportForApiProduct(superTenant); + }); + it("Life cycle support for API Products - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + lifeCycleSupportForApiProduct(testTenant); + }); +}) \ No newline at end of file diff --git a/cypress/integration/publisher/014-comments/00-add-comments-to-api.spec.js b/cypress/integration/publisher/014-comments/00-add-comments-to-api.spec.js new file mode 100644 index 00000000..73d8f67b --- /dev/null +++ b/cypress/integration/publisher/014-comments/00-add-comments-to-api.spec.js @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-014-00 : Adding comment", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + + const addCommentToApi = (tenant) => { + const comment = 'test api'; + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + cy.intercept('**/comments?limit=5&offset=0').as('commentsGet'); + cy.visit(`/publisher/apis/${apiId}/comments`); + cy.wait('@commentsGet', {timeout: 30000}).then(() => { + cy.get('#standard-multiline-flexible').click(); + cy.get('#standard-multiline-flexible').type(comment); + cy.get('#add-comment-btn').click(); + + // Checking it's existence + cy.get('#comment-list').contains(comment).should('be.visible'); + // Test is done. Now delete the api + Utils.deleteAPI(apiId); + }) + }); + } + + it.only("Adding comments per API - super admin", () => { + addCommentToApi(superTenant); + }); + it.only("Adding comments per API - tenant user", () => { + addCommentToApi(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/015-deployments/00-create-new-revision-and-deploy-api.spec.js b/cypress/integration/publisher/015-deployments/00-create-new-revision-and-deploy-api.spec.js new file mode 100644 index 00000000..32442664 --- /dev/null +++ b/cypress/integration/publisher/015-deployments/00-create-new-revision-and-deploy-api.spec.js @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-015-00 : Create new revision and deploy", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + + const createNewRevisionAndDeployApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPIWithEndpoints({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + // Going to deployments page + cy.get('#left-menu-itemdeployments').click(); + + // Deploying + cy.get('#add-description-btn') + .scrollIntoView().click({ "force": true }); + cy.get('#add-description').click({ "force": true }); + cy.get('#add-description').type('test'); + cy.get('#deploy-btn').should('not.have.class', 'Mui-disabled').click(); + cy.get('#undeploy-btn').should('not.have.class', 'Mui-disabled').should('exist'); + + // Going to lifecycle page + cy.get('#left-menu-itemlifecycle').click(); + + // Publishing + cy.wait(2000); + cy.get('[data-testid="Publish-btn"]').click(); + + cy.get('button[data-testid="Demote to Created-btn"]').should('exist'); + Utils.deleteAPI(apiId); + }); + } + + it.only("Create new revision and deploy - super admin", () => { + createNewRevisionAndDeployApi(superTenant); + }); + it.only("Create new revision and deploy - tenant user", () => { + createNewRevisionAndDeployApi(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/015-deployments/01-undeploy-new-revision.spec.js b/cypress/integration/publisher/015-deployments/01-undeploy-new-revision.spec.js new file mode 100644 index 00000000..ecdc367b --- /dev/null +++ b/cypress/integration/publisher/015-deployments/01-undeploy-new-revision.spec.js @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-015-01 : Undeploy new revision", () => { + const { publisher, password, superTenant, testTenant} = Utils.getUserInfo(); + + const undeployNewRevision = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPIWithEndpoints({}).then((apiId) => { + cy.visit(`/publisher/apis/${apiId}/overview`); + // Going to deployments page + cy.get('#left-menu-itemdeployments').click(); + + // Deploying + cy.get('#add-description-btn') + .scrollIntoView() + .click(); + cy.get('#add-description').click(); + cy.get('#add-description').type('test'); + cy.get('#deploy-btn').should('not.have.class', 'Mui-disabled').click(); + cy.get('#undeploy-btn').should('not.have.class', 'Mui-disabled').should('exist'); + cy.get('#undeploy-btn').should('not.have.class', 'Mui-disabled').click(); + cy.get('#revision-selector').should('exist'); + Utils.deleteAPI(apiId); + }); + } + + it.only("Create new revision and undeploy - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + undeployNewRevision(superTenant); + }); + it.only("Create new revision and undeploy - tenant user", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + undeployNewRevision(testTenant); + }); +}); \ No newline at end of file diff --git a/cypress/integration/publisher/016-service-catalog/00-services.create.spec.js b/cypress/integration/publisher/016-service-catalog/00-services.create.spec.js new file mode 100644 index 00000000..6149fcb1 --- /dev/null +++ b/cypress/integration/publisher/016-service-catalog/00-services.create.spec.js @@ -0,0 +1,67 @@ +import { getSampleServiceMeta, getSampleOpenAPI } from '../../../support/mockData/serviceCatalog'; +import Utils from "@support/utils"; + + +describe("publisher-016-00 : Service catalog create flow", () => { + const { publisher, password, superTenant, testTenant } = Utils.getUserInfo(); + + const serviceCreate = (tenant) => { + // login before each test + cy.viewport(1920, 980) + cy.loginToPublisher(publisher, password, tenant) + cy.getCookies() + .then((cookies) => { + let i = Utils.getRandomRange(15, 25); + + while (i > 0) { + const random_number = Utils.getRandomDate(); + const randomName = Utils.getRandomString(); + + const sampleOAS = getSampleOpenAPI(); + const serviceMeta = getSampleServiceMeta(); + + serviceMeta.name = `${randomName}-${random_number}`; + serviceMeta.version += `${random_number}`; + serviceMeta.serviceUrl += `${random_number}`; + sampleOAS.info.description += serviceMeta.name; + delete serviceMeta.serviceKey; + const definitionFile = new File([JSON.stringify(sampleOAS)], + 'definitionFile.json', { type: 'application/json', lastModified: new Date().getTime() }); + const serviceMetadataFile = new File([JSON.stringify(serviceMeta)], + 'serviceMetadata.json', { type: 'application/json', lastModified: new Date().getTime() }); + + const formData = new FormData(); + formData.append('serviceMetadata', serviceMetadataFile); + formData.append('definitionFile', definitionFile); + + const tokenP1 = cookies.find(c => c.name === "WSO2_AM_TOKEN_1_Default"); + fetch(`${Cypress.config().baseUrl}/api/am/service-catalog/v1/services`, { + method: 'POST', + body: formData, + headers: { + 'authorization': 'Bearer ' + tokenP1.value, + } + }) + i -= 1; + debugger; + } + + }) + cy.visit(`/publisher/service-catalog`); + } + // it.skip("Deploy sample service", () => { + // cy.visit(`/publisher/service-catalog`); + // cy.get('#itest-service-catalog-onboarding').should('be.visible') + // cy.get('#itest-services-landing-deploy-sample').click() + + // }); + + it("Create 15~25 services - super admin", () => { + serviceCreate(superTenant); + }); + it("Create 15~25 services - tenant user", () => { + serviceCreate(testTenant); + }); + + +}) diff --git a/cypress/integration/publisher/016-service-catalog/01-services.delete.spec.js b/cypress/integration/publisher/016-service-catalog/01-services.delete.spec.js new file mode 100644 index 00000000..d9752d0d --- /dev/null +++ b/cypress/integration/publisher/016-service-catalog/01-services.delete.spec.js @@ -0,0 +1,31 @@ +import Utils from "@support/utils"; + +describe("publisher-016-01 : Service catalog delete flow", () => { + const username = 'admin' + const password = 'admin' + const { superTenant, testTenant } = Utils.getUserInfo(); + const servicesDelete = (tenant) => { + cy.loginToPublisher(username, password, tenant) + cy.visit(`${Cypress.config().baseUrl}/publisher/service-catalog`); + cy.get('#itest-services-listing-total') + .then( + (countElement) => { + let totalServices = parseInt(countElement.text()); + debugger; + while (totalServices > 0) { + cy.get('#itest-service-card-delete').click(); + cy.get('#itest-service-card-delete-confirm').click(); + totalServices -= 1; + } + cy.get('#itest-service-catalog-onboarding').should('be.visible') + } + ) + } + + it("Delete all APIs - super admin", () => { + servicesDelete(superTenant); + }); + it("Delete all APIs - tenant user", () => { + servicesDelete(testTenant); + }); +}) \ No newline at end of file diff --git a/cypress/integration/publisher/017-api-policies/00-common-policy.spec.js b/cypress/integration/publisher/017-api-policies/00-common-policy.spec.js new file mode 100644 index 00000000..87ba19f1 --- /dev/null +++ b/cypress/integration/publisher/017-api-policies/00-common-policy.spec.js @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-017-00 : Common Policies", () => { + const { publisher, password, superTenant} = Utils.getUserInfo(); + + const commonPolicy = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + cy.visit(`/publisher/policies`); + cy.get('[data-testid="add-new-common-policy"]').click(); + cy.get('#name').type('Add Header sample test'); + cy.get('#version').type('1'); + cy.get('input[name="description"]').type('Sample add header policy description'); + cy.get('#fault-select-check-box').uncheck() + + //upload the policy file + cy.get('#upload-policy-file-for-policy').then(function () { + const filepath = `api_artifacts/sampleAddHeader.j2` + cy.get('input[type="file"]').attachFile(filepath) + }); + + cy.get('#add-policy-attributes-btn').click(); + cy.get('[data-testid="add-policy-attribute-name-btn"]').type('headerName'); + cy.get('[data-testid="add-policy-attribute-display-name-btn"]').type('Header Name'); + cy.get('#attribute-require-btn').click(); + + //save common policy + cy.get('[data-testid="policy-create-save-btn"]').click(); + cy.wait(2000); + + //View Common policy + cy.get('[aria-label="View Add Header sample test"]').click(); + //Download file + cy.get('[data-testid="download-policy-file"]').click(); + const downloadsFolder = Cypress.config('downloadsFolder') + const downloadedFilename = `${downloadsFolder}/swagger.yaml`; + + cy.get('[data-testid="done-view-policy-file"]').click(); + + //Delete Common Policy + cy.get('[aria-label="Delete Add Header sample test"]').click(); + cy.contains('Yes').click(); + + cy.logoutFromPublisher(); + } + + it("Common Policy - super admin", () => { + commonPolicy(superTenant); + }); +}) \ No newline at end of file diff --git a/cypress/integration/publisher/017-api-policies/01-api-specific-policy.spec.js b/cypress/integration/publisher/017-api-policies/01-api-specific-policy.spec.js new file mode 100644 index 00000000..ee0d2099 --- /dev/null +++ b/cypress/integration/publisher/017-api-policies/01-api-specific-policy.spec.js @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-017-01 : Common Policies", () => { + const { publisher, password, superTenant} = Utils.getUserInfo(); + let apiTestId; + + const apiSpecificPolicy = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + Utils.addAPI({}).then((apiId) => { + apiTestId = apiId; + cy.visit(`/publisher/apis/${apiId}/policies`); + //Create API Specific Policy + cy.get('[data-testid="add-new-api-specific-policy"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#name').type('Add Header sample test'); + cy.get('#version').type('1'); + cy.get('input[name="description"]').type('Sample add header policy description'); + cy.get('#fault-select-check-box').uncheck() + + //upload the policy file + cy.get('#upload-policy-file-for-policy').then(function () { + const filepath = `api_artifacts/sampleAddHeader.j2` + cy.get('input[type="file"]').attachFile(filepath) + }); + + cy.get('#add-policy-attributes-btn').click(); + cy.get('[data-testid="add-policy-attribute-name-btn"]').type('headerName'); + cy.get('[data-testid="add-policy-attribute-display-name-btn"]').type('Header Name'); + cy.get('#attribute-require-btn').click(); + //save common policy + cy.get('[data-testid="policy-create-save-btn"]').click(); + cy.wait(2000); + + //View API Specific Policy + cy.contains('Add Header sample test').trigger('mouseover'); + cy.get('[aria-label="view-AddHeadersampletest"]').click({force:true}); + //Download file + cy.get('[data-testid="download-policy-file"]').click(); + cy.wait(2000); + cy.get('[data-testid="done-view-policy-file"]').click(); + + //Drag and Drop Policy + const dataTransfer = new DataTransfer(); + cy.contains('Add Header sample test').trigger('dragstart', { + dataTransfer + }); + + cy.contains('Drag and drop policies here').trigger('drop', { + // cy.('[data-testid="drop-policy-zone-request"]').trigger('drop', { + dataTransfer + }); + cy.get('#headerName').type('Testing'); + cy.get('[data-testid="policy-attached-details-save"]').click(); + cy.get('[data-testid="custom-select-save-button"]').scrollIntoView().click(); + cy.visit(`/publisher/apis/${apiId}/scopes`); + cy.visit(`/publisher/apis/${apiId}/policies`); + cy.wait(2000); + + }); + } + + + it("Api Specific Policy - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + apiSpecificPolicy(superTenant); + }); + +}) \ No newline at end of file diff --git a/cypress/integration/publisher/018-third-party-api/00-publish-third-party-api.spec.js b/cypress/integration/publisher/018-third-party-api/00-publish-third-party-api.spec.js new file mode 100644 index 00000000..e9292184 --- /dev/null +++ b/cypress/integration/publisher/018-third-party-api/00-publish-third-party-api.spec.js @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; +import PublisherComonPage from "../../../support/pages/publisher/PublisherComonPage"; +import DevportalComonPage from "../../../support/pages/devportal/DevportalComonPage"; +const publisherComonPage = new PublisherComonPage(); +const devportalComonPage = new PublisherComonPage(); + +let apiId ; + +describe("publisher-018-00 : Publish thirdparty api", () => { + const { publisher, developer, password, superTenant, testTenant} = Utils.getUserInfo(); + let apiName; + const publishThirdPartyApi = (tenant) => { + cy.loginToPublisher(publisher, password, tenant); + publisherComonPage.waitUntillPublisherLoadingSpinnerExit(); + // cy.visit(`${Utils.getAppOrigin()}/publisher/apis/create/asyncapi`); + // publisherComonPage.waitUntillPublisherLoadingSpinnerExit(); + // cy.get('#outlined-full-width', {timeout: Cypress.config().largeTimeout}).invoke('val', 'https://raw.githubusercontent.com/asyncapi/spec/v2.0.0/examples/2.0.0/streetlights.ym'); + // cy.get('#outlined-full-width').type('l'); + // cy.get('#outlined-full-width').click(0,0); + // cy.get('#outlined-full-width').should('have.value','https://raw.githubusercontent.com/asyncapi/spec/v2.0.0/examples/2.0.0/streetlights.yml'); + // cy.get('button span').contains('Next').should('not.be.disabled'); + // cy.get('button span').contains('Next').click(); + // cy.get('#mui-component-select-protocol').click(); + // cy.get('#other').should('exist'); + cy.visit(`${Utils.getAppOrigin()}/publisher/apis/create/rest`); + publisherComonPage.waitUntillPublisherLoadingSpinnerExit(); + apiName = Utils.generateName().replace('-', '_'); + cy.get('#itest-id-apiname-input', {timeout: Cypress.config().largeTimeout}).type(apiName); + cy.get('#itest-id-apicontext-input').type('/' + apiName); + cy.get('#itest-id-apiversion-input').type('1.0.0'); + cy.get('#itest-id-apiendpoint-input').type(`${Utils.getAppOrigin()}/am/sample/${apiName}/v1/api`); + cy.get('#itest-id-apiversion-input').click() + cy.get('body').click(0,0); + cy.get('#itest-create-default-api-button').click(); + //Mark as third party api + cy.get('#itest-api-details-portal-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.url().then(url => { + apiId = /apis\/(.*?)\/overview/.exec(url)[1]; + cy.get('#left-menu-itemDesignConfigurations').click(); + cy.wait(5000); + cy.get('[name="advertised"]:first').click(); + cy.get('[name="apiExternalProductionEndpoint"]').type(`${Utils.getAppOrigin()}/am/sample/${apiName}/v1/externalapi`, {force:true, timeout:30000}); + cy.get('[name="apiExternalSandboxEndpoint"]').type(`${Utils.getAppOrigin()}/am/sample/${apiName}/v1/externalapi`, {force:true}); + cy.get('[name="originalDevPortalUrl"]').type('http://www.mocky.io/v2/5ec501532f00009700dc2dc1', {force:true}); + cy.get('#design-config-save-btn').click({force:true}); + cy.get('#itest-api-details-portal-config-acc').click(); + + //publish + cy.get('#left-menu-itemlifecycle').click(); + cy.wait(1000); + cy.get('[data-testid="Publish-btn"]', {timeout: Cypress.config().largeTimeout}).should('exist'); + cy.get('[data-testid="Deploy as a Prototype-btn"]').should('exist'); + cy.wait(1000); + cy.get('[data-testid="Publish-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + + //check if the api is third-party and published + cy.get('[data-testid="itest-api-state"]').contains('PUBLISHED').should('exist'); + cy.get('[data-testid="itest-third-party-api-label"]').contains('Third Party').should('exist'); + + //Check if the subscriptions,runtime config, resources, scopes, monetization, test console sections are present + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemsubscriptions').should('exist'); + cy.get('#left-menu-itemsubscriptions').click(); + cy.get('[name="Unlimited"]').click(); + cy.get('#subscriptions-save-btn').click(); + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemRuntimeConfigurations').should('exist'); + cy.get('#left-menu-itemresources').should('exist'); + cy.get('#left-menu-itemLocalScopes').should('exist'); + cy.get('#left-menu-monetization-prod').should('exist'); + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemTestConsole').should('exist'); + + //Check if the api is not deployable + cy.get('#left-menu-itemdeployments').click(); + cy.get('[data-testid="third-party-api-deployment-dialog"]').contains('This API is marked as a third party API. The requests are not proxied through the gateway. Hence, deployments are not required.').should('exist'); + cy.get('#deploy-btn').should('be.disabled'); + + //Check if prompts when switching to a regular api + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemDesignConfigurations').click(); + cy.get('[name="advertised"]:last').click(); + cy.get('[data-testid="itest-update-api-confirmation"]', {timeout: Cypress.config().largeTimeout}).should('exist'); + + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + cy.visit(`${Utils.getAppOrigin()}/publisher/apis`); + cy.wait(10000) + publisherComonPage.waitUntillPublisherLoadingSpinnerExit(); + cy.get("#searchQuery").type(apiName).type('{enter}') + cy.wait(10000) + cy.get(`div[data-testid="card-action-${apiName}1.0.0"]`, {timeout: Cypress.config().largeTimeout}).click(); + cy.wait(3000) + cy.get(`div[data-testid="card-action-${apiName}1.0.0"]>div>span`, {timeout: Cypress.config().largeTimeout}).contains('PUBLISHED').should('exist'); + + + cy.get(`a[aria-label="${apiName} Thumbnail"]`, {timeout: Cypress.config().largeTimeout}) + .should('exist', {timeout: Cypress.config().largeTimeout}); + + cy.logoutFromPublisher(); + cy.loginToDevportal(developer, password, tenant); + devportalComonPage.waitUntillPublisherLoadingSpinnerExit(); + cy.viewThirdPartyApi(apiName); + cy.logoutFromDevportal(); + cy.log("deleting api ", apiId); + cy.loginToPublisher(publisher, password, tenant); + publisherComonPage.waitUntillPublisherLoadingSpinnerExit(); + }); + } + it.only("Publish thirdparty api - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + publishThirdPartyApi(superTenant); + }); +}); diff --git a/cypress/integration/publisher/019-read-only-user/00-verify-that-read-only-user-cannot-create-update-api.spec.js b/cypress/integration/publisher/019-read-only-user/00-verify-that-read-only-user-cannot-create-update-api.spec.js new file mode 100644 index 00000000..981f798a --- /dev/null +++ b/cypress/integration/publisher/019-read-only-user/00-verify-that-read-only-user-cannot-create-update-api.spec.js @@ -0,0 +1,295 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-019-00 : Publisher Read-Only Mode", () => { + const { superTenant, testTenant} = Utils.getUserInfo(); + const apiName = 'checkreadonlyapi' + Math.floor(Date.now() / 1000); + const apiVersion = '1.0.0'; + const apiContext = '/readonlycheck' + Math.floor(Date.now() / 1000);; + const readOnlyUser = 'internalDeveloper'; + const readOnlyUserPassword = 'test123'; + const creatorPublisher='creatorPublisher'; + const creatorpublisherPassword = 'test123'; + const carbonUsername = 'admin'; + const carbonPassword = 'admin'; + + const createReadOnlyUser = (tenat) => { + //create developer user + cy.carbonLogin(carbonUsername, carbonPassword, tenat); + cy.addNewUser(readOnlyUser, ['Internal/observer'], readOnlyUserPassword); + cy.addNewUser(creatorPublisher, ['Internal/publisher', 'Internal/creator', 'Internal/everyone'], creatorpublisherPassword); + + //create an API from publisher portal + cy.loginToPublisher(creatorPublisher, creatorpublisherPassword, tenat); + cy.createAndPublishAPIByRestAPIDesign(apiName,apiVersion,apiContext); + + cy.get('#itest-api-details-portal-config-acc').click(); + + //add business info + cy.get('#left-menu-itembusinessinfo').click(); + cy.addBusinessInfo("John Yen","john@abc.com","Ann Ross","ann@abc.com"); + + //add document + cy.get('#left-menu-itemdocuments').click(); + cy.addDocument("SampleDoc","API Documentation","Sample and SDK","Markdown"); + + //add comment + cy.get('#left-menu-itemcomments').click(); + cy.addComment("sample comment"); + + //colapse api config menu + cy.get('#itest-api-details-portal-config-acc').click(); + + cy.get('#itest-api-details-api-config-acc').click(); + //set local scope + cy.get('#left-menu-itemLocalScopes').click(); + cy.get('#create-scope-btn').click(); + cy.createLocalScope('creatorscope','creator scope',"sample description",['Internal/creator']); + + //set resources + cy.get('#left-menu-itemresources').click(); + cy.createResource('api','20KPerMin',"POST",'testuri','sampledesc','sample summary',false,'creatorscope','tname','Query','Number',true); + + //set policy + cy.location('pathname').then((pathName) => { + const pathSegments = pathName.split('/'); + const uuid = pathSegments[pathSegments.length - 2]; + cy.visit(`${Utils.getAppOrigin()}/publisher/apis/${uuid}/policies`); + + const dataTransfer = new DataTransfer(); + cy.contains('Add Header', {timeout: Cypress.config().largeTimeout}).trigger('dragstart',{ + dataTransfer + }); + cy.contains('Drag and drop policies here').trigger('drop', { + dataTransfer + }); + cy.get('#headerName').type('Testing'); + cy.get('#headerValue').type('abc'); + cy.get('[data-testid="policy-attached-details-save"]').click(); + cy.get('[data-testid="custom-select-save-button"]').scrollIntoView().click(); + + //add property + cy.visit(`${Utils.getAppOrigin()}/publisher/apis/${uuid}/properties`); + cy.addProperty("property1","value1",true); + }); + cy.logoutFromPublisher(); + + //login to dev portal as Developer + cy.loginToPublisher(readOnlyUser, readOnlyUserPassword, tenat); + } + + const verifyReadOnlyUserCannotCreateUpdateApi = (tenant) => { + createReadOnlyUser(tenant); + //1. should not be able to create APIS + cy.get('#itest-create-api-menu-button', {timeout: Cypress.config().largeTimeout}).should('not.exist'); + + //2. click on API tile and select design config (basic info) + cy.wait(2000); + cy.get('a').get(`[aria-label="${apiName} Thumbnail"]`, {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#itest-api-details-portal-config-acc').click(); + cy.get('#left-menu-itemDesignConfigurations').click(); + + //2 -a. should not be able to update thumbnail + cy.get('#edit-api-thumbnail-btn').click(); + cy.get('#itest-api-name-version', {timeout: Cypress.config().largeTimeout}).should('be.visible'); + cy.get('#itest-api-name-version').contains(apiVersion); + + //2 -b. rest of the form field should not be editable + cy.get('#left-menu-itemDesignConfigurations').click(); + cy.get('#accessControl-selector').get('[aria-disabled="true"]').should('exist'); + cy.get('#storeVisibility-selector').get('[aria-disabled="true"]').should('exist'); + cy.get('#tags').should('be.disabled'); + cy.get('#APICategories').get('[aria-disabled="true"]').should('exist'); + cy.get('#github').should('not.be.visible'); + cy.get('#slack').should('not.be.visible'); + cy.get('input').get('[name="advertised"]').get('[value="true"').should('be.disabled'); + cy.get('input').get('[name="advertised"]').get('[value="false"]').should('be.disabled'); + cy.get('input').get('[name="defaultVersion"]').get('[value="true"').should('be.disabled'); + cy.get('input').get('[name="defaultVersion"]').get('[value="false"]').should('be.disabled'); + cy.get('#design-config-save-btn').should('be.disabled'); + + //3. should not be able to update business information + cy.get('#left-menu-itembusinessinfo').click(); + cy.get('#name').should('be.disabled'); + cy.get('#Email').should('be.disabled'); + cy.get('#TOname').should('be.disabled'); + cy.get('#TOemail').should('be.disabled'); + cy.get('#business-info-save').should('be.disabled'); + + //4. should not be able to update subscriptions (if no any subscriptions yet) + cy.get('#left-menu-itemsubscriptions').click(); + cy.get('input').get('[name="Bronze"]').should('be.disabled'); + cy.get('input').get('[name="Gold"]').should('be.disabled'); + cy.get('input').get('[name="Silver"]').should('be.disabled'); + cy.get('input').get('[name="Unlimited"]').should('be.disabled'); + cy.get('#subscriptions-save-btn').should('be.disabled'); + + //5. should not be able to add documents + cy.get('#left-menu-itemdocuments').click(); + cy.get('[data-testid="add-document-btn"]',{timeout: Cypress.config().largeTimeout}).get('[aria-disabled="true"]').should('exist'); + + //6. should not be able to comments + cy.get('#left-menu-itemcomments').click(); + cy.get('#standard-multiline-flexible',{timeout: Cypress.config().largeTimeout}).should('be.disabled'); + cy.contains('button','Reply').click(); + cy.get('#standard-multiline-flexible',{timeout: Cypress.config().largeTimeout}).should('be.disabled'); + + //7. Runtime Configurations + cy.get('#itest-api-details-api-config-acc').click(); + cy.get('#left-menu-itemRuntimeConfigurations').click(); + + //7-a. transport level + cy.get('#transportLevel').click(); + cy.get('#http-transport').should('be.disabled'); + cy.get('[value="https"]').should('be.disabled'); + cy.get('#mutual-ssl-checkbox').should('be.disabled'); + + //7-b. application level + cy.get('#applicationLevel').children('[role="button"]').click(); + cy.get('[value="oauth2"]').should('be.disabled'); + cy.get('#api-security-basic-auth-checkbox').should('be.disabled'); + cy.get('#api-security-api-key-checkbox').should('be.disabled'); + cy.get('[name="oauth_basic_auth_api_key_mandatory"]').should('be.disabled'); + cy.get('[name="oauth_basic_auth_api_key_mandatory"]').should('be.disabled'); + + //7-c. key manager configuration + cy.get('[value="all"]').should('be.disabled'); + cy.get('[value="selected"]').should('be.disabled'); + cy.get('#itest-id-headerName-input').should('be.disabled'); + + //7-d. cors configuration + cy.get('#corsConfiguration').get('[aria-label="CORS Configuration"]').should('be.disabled'); + cy.get('#corsConfiguration').get('[aria-label="switch Schema Validation"]').should('be.disabled'); + + //7-e. Response caching + cy.get('#response-caching-switch').should('be.disabled'); + + //7-f. Backend configurations + cy.get('[value="unlimited"]').should('be.disabled'); + cy.get('[value="specify"]').should('be.disabled'); + + //8. Resources + cy.get('#left-menu-itemresources').click(); + cy.get('#api-rate-limiting-api-level').get('[aria-disabled="true"]').should('exist'); + cy.get('#api-rate-limiting-operation-level').get('[aria-disabled="true"]').should('exist'); + cy.get('#operation_throttling_policy').get('[aria-disabled="true"]').should('exist'); + cy.get(`[id="post/testuri"]`, { timeout: 30000 }).click(); + cy.get(`[data-testid="description-post/testuri"]`).get('[aria-disabled="true"]').should('exist'); + cy.get(`[data-testid="summary-post/testuri"]`).get('[aria-disabled="true"]').should('exist'); + cy.get(`[data-testid="security-post/testuri"]`).get('[aria-disabled="true"]').should('exist'); + cy.get(`[id="post/testuri-operation_throttling_policy-label"]`).get('[aria-disabled="true"]').should('exist'); + cy.contains('button','Save').should('be.disabled'); + + //9. API definition + cy.get('#left-menu-itemAPIdefinition').click(); + cy.contains('button', 'Edit').should('be.disabled'); + cy.contains('button', 'Import Definition').should('be.disabled'); + + //10. Endpoints + cy.get('#left-menu-itemendpoints').click(); + cy.contains('label', 'HTTP/REST Endpoint').get('[aria-disabled="true"]').should('exist'); + cy.contains('label', 'Service Endpoint').get('[aria-disabled="true"]').should('exist'); + cy.contains('label', 'HTTP/SOAP Endpoint').get('[aria-disabled="true"]').should('exist'); + cy.contains('label', 'Dynamic Endpoints').get('[aria-disabled="true"]').should('exist'); + cy.contains('label', 'Mock Implementation').get('[aria-disabled="true"]').should('exist'); + cy.contains('label', 'AWS Lambda').get('[aria-disabled="true"]').should('exist'); + + cy.contains('label', 'Production Endpoint').get('[aria-disabled="true"]').should('exist'); + cy.get('#production_endpoints').should('be.disabled'); + cy.get('#production_endpoints-endpoint-test-icon-btn').should('be.disabled'); + cy.get('button').get('[aria-label="Settings"]').should('be.disabled'); + cy.get('#production_endpoints-endpoint-security-icon-btn').should('be.disabled'); + + cy.contains('label', 'Sandbox Endpoint').get('[aria-disabled="true"]').should('exist'); + cy.get('#sandbox_endpoints').should('be.disabled'); + cy.get('#sandbox_endpoints-endpoint-test-icon-btn').should('be.disabled'); + cy.get('button').get('[aria-label="Settings"]').should('be.disabled'); + cy.get('#sandbox_endpoints-endpoint-security-icon-btn').should('be.disabled'); + + cy.get('#http-panel1bh-header').click(); + cy.get('#certs-add-btn').get('[aria-disabled="true"]').should('exist'); + cy.get('#panel1bh-header').click(); + cy.get('#certificateEndpoint').get('[aria-disabled="true"]').should('exist'); + cy.get('button').get('[aria-label="Delete"]').should('be.disabled'); + + cy.contains('button', 'Save').should('be.disabled'); + + //11. Localscopes + cy.get('#left-menu-itemLocalScopes').click(); + cy.contains('a','Add New Local Scope').get('[aria-disabled="true"]').should('exist'); + cy.get('table').get('tbody').get('[data-testid="MUIDataTableBodyRow-0"]').get('[data-testid="MuiDataTableBodyCell-4-0"]').get('[aria-label="Edit creatorscope"]').get('[aria-disabled="true"]').should('exist'); + cy.get('table').get('tbody').get('[data-testid="MUIDataTableBodyRow-0"]').get('[data-testid="MuiDataTableBodyCell-4-0"]').contains('button','Delete').should('be.disabled'); + + //12. Policies should be checked. (UI issue fixed by PR #11297 in carbon-apimgt) + cy.get("#left-menu-policies").click(); + cy.get('[data-testid="add-new-api-specific-policy"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('[data-testid="create-policy-form"]').get('[data-testid="displayname"]').type("test name"); + cy.get('[data-testid="create-policy-form"]').get('[data-testid="gateway-details-panel"]').get('[data-testid="file-drop-zone"]').then(function () { + cy.get('input[type="file"]').attachFile('api_artifacts/sampleAddHeader.j2'); + }); + cy.get('[data-testid="create-policy-form"]').get('[data-testid="policy-add-btn-panel"]').get('[data-testid="policy-create-save-btn"]').should('be.disabled'); + cy.get('[data-testid="create-policy-form"]').get('[aria-label="Close"]').click(); + + //13. monetization ,lifecycle menus are not visible to observer + cy.get('[data-testid="left-menu-itemlifecycle"]').should('not.exist'); + cy.get('[data-testid="left-menu-monetization"]').should('not.exist'); + + //14. Properties + cy.get('#left-menu-itemproperties').click(); + cy.get('#add-new-property', {timeout: Cypress.config().largeTimeout}).should('be.disabled'); + cy.get('table').get('tbody').get('tr').contains('td','property1').should('be.visible'); + cy.get('table').get('tbody').get('tr').get('[aria-label="Edit property1"]').should('be.disabled'); + cy.get('table').get('tbody').get('tr').get('[aria-label="Remove property1"]').should('be.disabled'); + cy.get('[data-testid="save-api-properties-btn"]').should('be.disabled'); + + //15. Deployments + cy.get('#react-root').scrollTo('bottom'); + cy.get('#left-menu-itemdeployments').click(); + cy.contains('button','Deploy New Revision').should('be.disabled'); + cy.contains('button','Restore').should('be.disabled'); + cy.contains('button','Delete').should('be.disabled'); + cy.get('#undeploy-btn').should('be.disabled'); + cy.get('table').get('tbody').get('tr').find('td').eq(2).get('[aria-disabled="true"]').should('exist'); + + //16. Header buttons should also be disabled + cy.get('#itest-id-deleteapi-icon-button').should('not.exist'); + cy.get('#create-new-version-btn').should('not.exist'); + cy.logoutFromPublisher(); + + // Test is done. Now delete the api + cy.loginToPublisher(carbonUsername, carbonPassword, tenant); + } + //should only be able to view APIs + it("Verify Configurations are in Read only mode - super admin", () => { + verifyReadOnlyUserCannotCreateUpdateApi(superTenant); + }); + it("Verify Configurations are in Read only mode - tenant user", () => { + verifyReadOnlyUserCannotCreateUpdateApi(testTenant); + }); + + after(function () { + cy.deleteApi(apiName, apiVersion); + + // delete observer user. + cy.visit(`${Utils.getAppOrigin()}/carbon/user/user-mgt.jsp`); + cy.deleteUser(readOnlyUser); + }) + +}); \ No newline at end of file diff --git a/cypress/integration/publisher/020-prototyped-apis/00-try-out-resources-without-key-when-security-disabled.spec.js b/cypress/integration/publisher/020-prototyped-apis/00-try-out-resources-without-key-when-security-disabled.spec.js new file mode 100644 index 00000000..4d9a9f63 --- /dev/null +++ b/cypress/integration/publisher/020-prototyped-apis/00-try-out-resources-without-key-when-security-disabled.spec.js @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +import Utils from "@support/utils"; +import PublisherComonPage from "../../../support/pages/publisher/PublisherComonPage"; +const publisherComonPage = new PublisherComonPage(); + +describe("publisher-020-00 : prototype apis with security disabled", () => { + const { superTenant} = Utils.getUserInfo(); + const userName = 'admin'; + const password = 'admin'; + const apiName= Utils.generateName(); + const apiVersion='1.0.0'; + let testApiId; + + const tryoutResourcesWithoutKeySecurityDisable = (tenant) => { + const endpoint = 'https://petstore.swagger.io/v2/store/inventory'; + cy.loginToPublisher(userName, password, tenant); + Utils.addAPI({name: apiName, version: apiVersion}).then((apiId) => { + testApiId = apiId; + cy.visit(`/publisher/apis/${apiId}/overview`); + publisherComonPage.waitUntillPublisherLoadingSpinnerExit(); + cy.get('#itest-api-details-api-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/restendpoint-add-btn"]').click({force:true}); + + // Add the prod and sandbox endpoints + cy.get('#production-endpoint-checkbox', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#production_endpoints', {timeout: Cypress.config().largeTimeout}).focus().type(endpoint); + cy.get('#sandbox-endpoint-checkbox').click(); + cy.get('#sandbox_endpoints').focus().type(endpoint); + + // Save + cy.get('body').click(); + cy.get('#endpoint-save-btn').scrollIntoView(); + cy.get('#endpoint-save-btn').click(); + + // Check the values + cy.get('#production_endpoints').should('have.value', endpoint); + cy.get('#sandbox_endpoints').should('have.value', endpoint); + + //disable security + cy.get("#left-menu-itemresources").click(); + cy.wait(5000) + cy.get('button[aria-label="disable security for all"]').click(); + cy.get('button[aria-label="select merge strategy"]').click(); + + cy.intercept('PUT', '**/swagger').as('swagger'); + + cy.get("#split-button-menu").contains('li','Save and deploy').click(); + cy.wait('@swagger',{timeout: 15000}).its('response.statusCode').should('equal', 200) + + cy.wait(5000) + + + //cy.get('[data-testid="Defaultgateway-select-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + // NOTE: Seems when running on server configuration, we donlt get Defaultgateway dialog box option, instead getting + // production and sandbox option + cy.get('span[data-testid*="-select-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + cy.intercept('GET', '**/revisions?query=deployed**').as('revisionDeployed'); + cy.get('[data-testid="btn-deploy"]').click(); + cy.wait('@revisionDeployed',{timeout: 15000}).its('response.statusCode').should('equal', 200) + + cy.intercept('GET', '**/revisions?query=deployed**').as('revisionDeployed2'); + cy.get("#left-menu-itemlifecycle").click(); + cy.wait('@revisionDeployed2',{timeout: 15000}).its('response.statusCode').should('equal', 200) + cy.get('[data-testid="Deploy as a Prototype-btn"]',{timeout: Cypress.config().largeTimeout}).click(); + + + cy.logoutFromPublisher(); + + //login to dev portal as Developer + cy.loginToDevportal(userName, password, tenant); + cy.get('table > tbody > tr',{timeout: Cypress.config().largeTimeout}).get(`[area-label="Go to ${apiName}"]`).contains('.api-thumb-chip-main','PRE-RELEASED').should('exist'); + cy.get('table > tbody > tr',{timeout: Cypress.config().largeTimeout}).get(`[area-label="Go to ${apiName}"]`).click(); + cy.contains('a',"Try out",{timeout: Cypress.config().largeTimeout}).click(); + cy.get('.opblock-summary-get > .opblock-summary-control', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('.try-out__btn').click(); + cy.get('.execute').click(); + // cy.contains('.live-responses-table .response > td.response-col_status','200').should('exist'); + cy.get('.live-responses-table .response > td.response-col_status').should("contain.text",'200') + cy.logoutFromDevportal(); + // Test is done. Now delete the api + //cy.logoutFromDevportal(); + cy.loginToPublisher(userName, password, tenant); + publisherComonPage.waitUntillPublisherLoadingSpinnerExit(); + }); + } + it.only("try out resources disabling the security without credentials - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + tryoutResourcesWithoutKeySecurityDisable(superTenant); + }); + + afterEach(function () { + Utils.deleteAPI(testApiId); + }) +}); diff --git a/cypress/integration/publisher/020-prototyped-apis/01-cannot-try-out-resources-without-key-when-security-enabled.spec.skip.js b/cypress/integration/publisher/020-prototyped-apis/01-cannot-try-out-resources-without-key-when-security-enabled.spec.skip.js new file mode 100644 index 00000000..d8c1c55a --- /dev/null +++ b/cypress/integration/publisher/020-prototyped-apis/01-cannot-try-out-resources-without-key-when-security-enabled.spec.skip.js @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-020-01 : prototype apis with security enabled", () => { + const userName = 'admin'; + const password = 'admin'; + const apiName = Utils.generateName(); + const apiVersion='1.0.0'; + let testApiId; + const { superTenant} = Utils.getUserInfo(); + + const tryoutResourceWithoutKeySecurityEnabled = (tenant) => { + const endpoint = 'https://petstore.swagger.io/v2/store/inventory'; + cy.loginToPublisher(userName, password, tenant); + Utils.addAPI({name: apiName, version: apiVersion}).then((apiId) => { + testApiId = apiId; + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/restendpoint-add-btn"]').click({force:true}); + + // Add the prod and sandbox endpoints + cy.get('#production-endpoint-checkbox', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#production_endpoints', {timeout: Cypress.config().largeTimeout}).focus().type(endpoint); + cy.get('#sandbox-endpoint-checkbox').click(); + cy.get('#sandbox_endpoints', {timeout: Cypress.config().largeTimeout}).focus().type(endpoint); + + // Save + cy.get('body').click(); + cy.get('#endpoint-save-btn').scrollIntoView(); + cy.get('#endpoint-save-btn').click(); + + // Check the values + cy.get('#production_endpoints').should('have.value', endpoint); + cy.get('#sandbox_endpoints').should('have.value', endpoint); + + //by default security enabled for resources + cy.get("#left-menu-itemresources").click(); + cy.get('button[aria-label="disable security for all"]').should('exist'); + + //deploy API + cy.get("#left-menu-itemdeployments").click(); + cy.wait(5000); + cy.get("#deploy-btn",{timeout: Cypress.config().largeTimeout}).should('not.have.class', 'Mui-disabled').click({force:true}); + + cy.get("#left-menu-itemlifecycle").click(); + cy.wait(5000); + cy.get('[data-testid="Deploy as a Prototype-btn"]', {timeout: Cypress.config().largeTimeout}).click(); + + cy.logoutFromPublisher(); + + //login to dev portal as Developer + cy.loginToDevportal(userName, password, tenant); + cy.get('table > tbody > tr',{timeout: Cypress.config().largeTimeout}).get(`[area-label="Go to ${apiName}"]`).contains('.api-thumb-chip-main','PRE-RELEASED').should('exist'); + cy.get('table > tbody > tr',{timeout: Cypress.config().largeTimeout}).get(`[area-label="Go to ${apiName}"]`).click(); + cy.contains('a',"Try out",{timeout: Cypress.config().largeTimeout}).click(); + cy.get('.opblock-summary-get > .opblock-summary-control', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('.try-out__btn').click(); + cy.intercept('GET',`**/${apiName.replace("-", '_')}/1.0.0`).as("getExecute"); + cy.get('.execute').click({force:true}); + //cy.contains('.live-responses-table .response > .response-col_status','401', {timeout: Cypress.config().largeTimeout}).should('exist'); + cy.wait(5000) + cy.wait('@getExecute').then(() => { + cy.get('.live-responses-table .response > td.response-col_status').then(element => { + cy.log(element.text()); + }) + //cy.contains('.live-responses-table .response > .response-col_status','401', {timeout: Cypress.config().largeTimeout}).should('exist'); + cy.get('.live-responses-table .response > td.response-col_status',{timeout: Cypress.config().largeTimeout}).should("contain.text",'401') + cy.logoutFromDevportal(); + cy.loginToPublisher(userName, password, tenant); + }); + }); + } + it.only("try out resources enabling the security without credentials - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + tryoutResourceWithoutKeySecurityEnabled(superTenant); + }); + + afterEach(function () { + // Test is done. Now delete the api + cy.log("API id ", testApiId); + Utils.deleteAPI(testApiId); + }) +}); \ No newline at end of file diff --git a/cypress/integration/publisher/020-prototyped-apis/02-can-try-out-resources-with-key-when-security-enabled.spec.js b/cypress/integration/publisher/020-prototyped-apis/02-can-try-out-resources-with-key-when-security-enabled.spec.js new file mode 100644 index 00000000..ed94abdf --- /dev/null +++ b/cypress/integration/publisher/020-prototyped-apis/02-can-try-out-resources-with-key-when-security-enabled.spec.js @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; + +describe("publisher-020-02 : prototype apis with security enabled", () => { + const userName = 'admin'; + const password = 'admin'; + const apiName = Utils.generateName().replace('-', '_'); + let applicationName; + const apiVersion='1.0.0'; + const endpoint = 'https://petstore.swagger.io/v2/store/inventory'; + let testApiId; + let retryCount = 5; + const { superTenant} = Utils.getUserInfo(); + + const testAPISecurityEnabled = (tenant) => { + cy.loginToPublisher(userName, password, tenant); + Utils.addAPI({name: apiName, version: apiVersion}).then((apiId) => { + if (apiId !== undefined) { + testApiId = apiId; + cy.visit(`/publisher/apis/${apiId}/overview`); + cy.get('#itest-api-details-api-config-acc', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#left-menu-itemendpoints').click(); + cy.get('[data-testid="http/restendpoint-add-btn"]').click({force:true}); + + // Add the prod and sandbox endpoints + cy.get('#itest-api-details-endpoints-head', {timeout: Cypress.config().largeTimeout}).contains('Endpoints'); + cy.get('#production-endpoint-checkbox', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#production_endpoints').focus().type(endpoint); + cy.get('#sandbox-endpoint-checkbox').click(); + cy.get('#sandbox_endpoints').focus().type(endpoint); + + // Save + cy.get('body').click(); + cy.get('#endpoint-save-btn').scrollIntoView(); + cy.get('#endpoint-save-btn').click(); + + // Check the values + cy.get('#production_endpoints').should('have.value', endpoint); + cy.get('#sandbox_endpoints').should('have.value', endpoint); + + //by default security enabled for resources + cy.get("#left-menu-itemresources").click(); + cy.get('button[aria-label="disable security for all"]',{timeout: Cypress.config().largeTimeout}).should('exist'); + + //deploy API + cy.get("#left-menu-itemdeployments").click(); + cy.wait(2000); + cy.get("#deploy-btn",{timeout: Cypress.config().largeTimeout}).should('not.have.class', 'Mui-disabled').click({force:true}); + + cy.get("#left-menu-itemlifecycle").click(); + cy.wait(2000); + cy.get('[data-testid="Deploy as a Prototype-btn"]',{timeout: Cypress.config().largeTimeout}).click(); + + cy.logoutFromPublisher(); + + //login to dev portal as Developer + cy.loginToDevportal(userName, password, tenant); + + applicationName="Prototype client app" + Math.floor(Date.now() / 1000); + cy.createApplication(applicationName,"50PerMin","Sample Description"); + cy.get('[data-testid="itest-link-to-apis"]',{timeout: Cypress.config().largeTimeout}).click(); + cy.get("#searchQuery").type(apiName).type('{enter}') + cy.get('table > tbody > tr',{timeout: Cypress.config().largeTimeout}).get(`[area-label="Go to ${apiName}"]`).contains('.api-thumb-chip-main','PRE-RELEASED').should('exist'); + cy.get('table > tbody > tr',{timeout: Cypress.config().largeTimeout}).get(`[area-label="Go to ${apiName}"]`).click(); + + // Go to application subscription page + cy.get("#left-menu-credentials").click(); + cy.get('button[aria-label="Open"]').click(); + cy.get('ul').contains('li',applicationName).click(); + cy.get("#subscribe-to-api-btn").click(); + + cy.get("#left-menu-test",{timeout: Cypress.config().largeTimeout}).click(); + + cy.intercept('**/applications/').then((res) => { + // Check if the application exists + cy.get("#selected-application", {timeout: Cypress.config().largeTimeout}).should('exist'); + }); + + //it takes some time to generate the key + cy.intercept('**/generate-token').as('getToken'); + + cy.get('#gen-test-key',{timeout: Cypress.config().largeTimeout}).click(); + + cy.wait('@getToken', {timeout: Cypress.config().largeTimeout}).its('response.statusCode').should('eq', 200); + + cy.get('.opblock-summary-get > .opblock-summary-control',{timeout: Cypress.config().largeTimeout}).click(); + cy.get('.try-out__btn').click(); + cy.get('.execute').click(); + cy.contains('.live-responses-table .response > .response-col_status','200', {timeout: Cypress.config().largeTimeout}).should('exist'); + // Test is done. delete the application + cy.deleteApplication(applicationName); + cy.logoutFromDevportal(); + + // delete the api + cy.loginToPublisher(userName, password, tenant); + } else if (retryCount>0) { + retryCount--; + testAPISecurityEnabled(tenant); + } + + }); + } + it.only("try out resources enabling the security without credentials - super admin", { + retries: { + runMode: 3, + openMode: 0, + }, + }, () => { + testAPISecurityEnabled(superTenant); + }); + + afterEach(function () { + Utils.deleteAPI(testApiId); + }) +}); \ No newline at end of file diff --git a/cypress/plugins/index.js b/cypress/plugins/index.js new file mode 100644 index 00000000..35ee819b --- /dev/null +++ b/cypress/plugins/index.js @@ -0,0 +1,16 @@ +const browserify = require('@cypress/browserify-preprocessor') +const path = require('path'); + +/** + * @type {Cypress.PluginConfig} + */ +module.exports = (on, config) => { + // `on` is used to hook into various events Cypress emits + // `config` is the resolved Cypress config + // send in the options from your webpack.config.js, so it works the same + // as your app's code + const options = browserify.defaultOptions; + options.browserifyOptions.transform[1][1].babelrc = true; + + on('file:preprocessor', browserify(options)); +} diff --git a/cypress/support/commands.js b/cypress/support/commands.js new file mode 100644 index 00000000..c19dc4d0 --- /dev/null +++ b/cypress/support/commands.js @@ -0,0 +1,654 @@ +/* + * Copyright (c) 2022, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ + +import Utils from "@support/utils"; +import 'cypress-file-upload'; + +Cypress.Commands.add('carbonLogin', (username, password, tenant = 'carbon.super') => { + if (username != 'carbon.super') { + username = `${username}@${tenant}` + } + Cypress.log({ + name: 'carbonLogin', + message: `${username} | ${password}`, + }) + + cy.visit(`/carbon/admin/login.jsp`); + cy.get('#txtUserName').type(username); + cy.get('#txtPassword').type(password); + cy.get('form').submit(); +}) + +Cypress.Commands.add('carbonLogout', () => { + cy.visit('/carbon/admin/logout_action.jsp'); +}) + +Cypress.Commands.add('portalLogin', (username, password, tenant, portal) => { + if (tenant != 'carbon.super') { + username = `${username}@${tenant}`; + } + Cypress.log({ + name: 'portalLogin', + message: `${username} | ${password}`, + }) + + cy.visit(`/${portal}`); + if (portal === 'devportal') { + cy.visit(`/devportal/apis?tenant=${tenant}`); + cy.get('#itest-devportal-sign-in', {timeout: Cypress.config().largeTimeout}).click(); + } + cy.url().should('contains', `/authenticationendpoint/login.do`); + cy.get('[data-testid=login-page-username-input]').click(); + cy.get('[data-testid=login-page-username-input]').type(username); + cy.get('[data-testid=login-page-password-input]').type(password); + cy.get('#loginForm').submit(); + cy.url().should('contains', `/${portal}`); +}) + +Cypress.Commands.add('loginToPublisher', (username, password, tenant = 'carbon.super') => { + cy.portalLogin(username, password, tenant, 'publisher'); +}) + +Cypress.Commands.add('loginToDevportal', (username, password, tenant = 'carbon.super') => { + cy.portalLogin(username, password, tenant, 'devportal'); +}) + +Cypress.Commands.add('loginToAdmin', (username, password, tenant = 'carbon.super') => { + cy.portalLogin(username, password, tenant, 'admin'); +}) + +Cypress.Commands.add('addNewTenant', (tenant = 'wso2.com', username = 'admin', password = 'admin') => { + cy.visit(`/carbon/tenant-mgt/add_tenant.jsp?region=region1&item=govern_add_tenants_menu`); + cy.get('#buttonRow .button', {timeout: Cypress.config().largeTimeout}); + cy.get('#domain').click(); + cy.get('#domain').type(tenant); + cy.get('#admin-firstname').click(); + cy.get('#admin-firstname').type(username); + cy.get('#admin-lastname').click(); + cy.get('#admin-lastname').type(username); + cy.get('#admin').click(); + cy.get('#admin').type(username); + + // There is a UI error in the carbon console. We need to skip this so that the test will not fail. + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + cy.get('#admin-password').click(); + cy.get('#admin-password').type(password); + cy.get('#admin-password-repeat').click(); + cy.get('#admin-password-repeat').type(password); + cy.get('#admin-email').click(); + cy.get('#admin-email').type(`admin@${tenant}`); + cy.get('#buttonRow .button').click(); +}) + +Cypress.Commands.add('addNewUser', (name = 'newuser', roles = [], password = 'test123') => { + // Visit the add user page + cy.visit(`/carbon/user/add-step1.jsp`); + cy.get('input[name="username"]', {timeout: Cypress.config().largeTimeout}).type(name); + cy.get('#password').type(password); + cy.get('#password-repeat').type(password); + cy.get('.buttonRow input:first-child').click(); + + // Go to step 2 where add roles + cy.url().should('contains', `/carbon/user/add-step2.jsp`); + roles.forEach(role => { + cy.get(`input[value="${role}"][type="checkbox"]`).check(); + }); + // Finish wizard + cy.get('.buttonRow input:first-child').click(); + // cy.get('#messagebox-info p').contains(`User PRIMARY/${name} is added successfully.`).should('exist'); +}) + + +Cypress.Commands.add('deleteUser', (name) => { + cy.get(`[onClick="deleteUser(\\'${name}\\')"]`).click(); + cy.get('.ui-dialog .ui-dialog-buttonpane button:first-child').click(); + cy.get('#messagebox-info p').contains(`User ${name} is deleted successfully.`).should('exist'); + cy.get('.ui-dialog-buttonpane button').click(); +}); + +Cypress.Commands.add('deleteApi', (name, version) => { + var cardName='card-'+name+version; + var actionCardName='card-action-'+name+version; + cy.visit(`/publisher/apis`); + cy.intercept('**/apis*').as('getApis'); + cy.wait('@getApis', {timeout: Cypress.config().largeTimeout}).then(() => { + cy.get(`[data-testid="${cardName}"]`).get(`[data-testid="${actionCardName}"]`).within(($panel) => { + cy.get("#itest-id-deleteapi-icon-button", { timeout: 30000 }).click(); + }) + cy.get("#itest-id-deleteconf",{timeout:30000}).click(); + }); +}); + +// Don't use this +// Fails intermittently +// Instead delete each api after the test is finish. +Cypress.Commands.add('deleteAllApis', () => { + cy.visit(`/publisher/apis`); + cy.intercept('**/apis*').as('getApis'); + cy.wait('@getApis').then((interception) => { + if (interception.response && interception.response.body && interception.response.body.count > 0) { + cy.get('[data-testid="itest-id-deleteapi-icon-button"]', { timeout: 30000 }); + cy.get('[data-testid="itest-id-deleteapi-icon-button"]').each(($btn) => { + cy.wrap($btn).click(); + cy.get('[data-testid="itest-id-deleteconf"]').click(); + }) + } + }) +}); + +Cypress.Commands.add('createAnAPI', (name, type = 'REST') => { + const random_number = Math.floor(Date.now() / 1000); + const randomName = `0sample_api_${random_number}`; + cy.visit(`/publisher/apis`) + cy.get('#itest-rest-api-create-menu', {timeout: Cypress.config().largeTimeout}); + cy.get('#itest-rest-api-create-menu').click(); + cy.get('#itest-id-landing-rest-create-default').click() + cy.get('#itest-id-apiname-input').type(name || randomName); + cy.get('#itest-id-apicontext-input').click(); + cy.get('#itest-id-apicontext-input').type(`/sample_context_${random_number}`); + cy.get('#itest-id-apiversion-input').click(); + cy.get('#itest-id-apiversion-input').type(`v${random_number}`); + cy.get('#itest-id-apiendpoint-input').click(); + cy.get('#itest-id-apiendpoint-input').type(`https://apis.wso2.com/sample${random_number}`); + cy.get('#itest-create-default-api-button').click(); + cy.get("#itest-api-name-version").contains(`sample_api_${random_number}`); + cy.intercept('**/apis/**').as('apiGet'); + cy.wait('@apiGet', { timeout: 30000 }).then((res) => { + const apiUUID = res.response.body.id; + return { uuid: apiUUID, name: randomName }; + }); + +}) + +Cypress.Commands.add('createAPIByRestAPIDesign', (name = null, version = null, context = null) => { + const random_number = Math.floor(Date.now() / 1000); + + const apiName = name ? name : `0sample_api_${random_number}`; + const apiVersion = version ? version : `v${random_number}`; + const apiContext = context ? context : `/sample_context_${random_number}`; + cy.visit(`/publisher/apis`); + cy.get('#itest-rest-api-create-menu', {timeout: Cypress.config().largeTimeout}); + cy.get('#itest-rest-api-create-menu').click(); + cy.get('#itest-id-landing-rest-create-default').click(); + cy.get('#itest-id-apiname-input').type(apiName); + cy.get('#itest-id-apicontext-input').click(); + cy.get('#itest-id-apicontext-input').type(apiContext); + cy.get('#itest-id-apiversion-input').click(); + cy.get('#itest-id-apiversion-input').type(apiVersion); + cy.get('#itest-id-apiendpoint-input').click(); + cy.get('#itest-id-apiendpoint-input').type(`https://apis.wso2.com/sample${random_number}`); + cy.get('#itest-create-default-api-button').click(); + // There is a UI error in the console. We need to skip this so that the test will not fail. + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + cy.wait(500); + cy.visit(`/publisher/apis/`); + cy.get(`#${apiName}`, {timeout: Cypress.config().largeTimeout}).click(); + + cy.get('#itest-api-name-version', { timeout: 30000 }).should('be.visible'); + cy.get('#itest-api-name-version').contains(apiVersion); +}) + +Cypress.Commands.add('createAndPublishAPIByRestAPIDesign', (name = null, version = null, context = null) => { + const random_number = Math.floor(Date.now() / 1000); + + const apiName = name ? name : `0sample_api_${random_number}`; + const apiVersion = version ? version : `v${random_number}`; + const apiContext = context ? context : `/sample_context_${random_number}`; + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + cy.visit(`/publisher/apis/create/rest`); + cy.get('#itest-id-apiname-input', {timeout: Cypress.config().largeTimeout}).type(apiName); + cy.get('#itest-id-apicontext-input').click(); + cy.get('#itest-id-apicontext-input').type(apiContext); + cy.get('#itest-id-apiversion-input').click(); + cy.get('#itest-id-apiversion-input').type(apiVersion); + cy.get('#itest-id-apiendpoint-input').click(); + cy.get('#itest-id-apiendpoint-input').type(`https://apis.wso2.com/sample${random_number}`); + cy.get('#itest-id-apiversion-input').click(); + cy.get('body').click(0,0); + cy.get('#itest-id-apicreatedefault-createnpublish').click({force:true}); + + // Wait for the api to load + cy.get('#itest-api-name-version', {timeout: Cypress.config().largeTimeout}).should('be.visible'); + cy.get('#itest-api-name-version').contains(apiVersion); +}) + + +Cypress.Commands.add('addDocument', (name,summary,type,source) => { + + cy.get('[data-testid="add-document-btn"]').click({force:true}); + cy.wait(5000); + cy.get('#doc-name',{timeout: 30000}).focus().type(name, {force:true}).should('have.value',name); + cy.wait(2000); + cy.get('#doc-summary').focus().type(summary); + cy.contains('label',type).click(); + cy.contains('label',source).click(); + cy.get('#add-document-btn').scrollIntoView(); + cy.get('#add-document-btn').click(); + cy.get('#add-content-back-to-listing-btn').click(); + + cy.get('table a').contains(name).should('be.visible'); +}) + +Cypress.Commands.add('addComment', (comment) => { + + cy.get('[data-testid="new-comment-field"]',{timeout: 30000 }).type(comment); + cy.get('#add-comment-btn').click(); + + cy.contains('p',comment).should('exist'); +}) + +Cypress.Commands.add('addBusinessInfo', (businessOwnerName,businessOwnerEmail,techOwnerName,techOwnerEmail) => { + + cy.get('#name').focus({timeout: 30000 }).type(businessOwnerName); + cy.get('#Email').focus({timeout: 30000 }).type(businessOwnerEmail); + cy.get('#TOname').focus({timeout: 30000 }).type(techOwnerName); + cy.get('#TOemail').focus({timeout: 30000 }).type(techOwnerEmail); + + + cy.get('#business-info-save').then(function () { + cy.get('#name').should('have.value', businessOwnerName); + cy.get('#Email').should('have.value', businessOwnerEmail); + cy.get('#TOname').should('have.value', techOwnerName); + cy.get('#TOemail').should('have.value', techOwnerEmail); + cy.get('#business-info-save').click(); + }); + +}) + +/** + * Creates a resource for a given http verb + * Stuff with more arguments. + * @method createResource creates a resource for a given (one) httpverb + * @param {string} ratelimitlevel any of the following 2 : api | operation + * @param {string} limitinglevel 10KPerMin | 20KOPerMin | 50KPerMin | Unlimited + * @param {string} httpverb GET | POST | PUT | DELETE | PATCH | HEAD | OPTIONS + * @param {string} uripattern + * @param {string} description about the API + * @param {string} summary about API + * @param {boolean} security true | false + * @param {string} scope name of the scope | null + * @param {string} parametername + * @param {string} parametertype Query | Header | Cookie | Body | null + * @param {string} datatype Integer | Number | String | Boolean | null + * @param {boolean} required true | false + */ + +Cypress.Commands.add('createResource', (ratelimitlevel, limitinglevel,httpverb,uripattern,description=null,summary=null,security=true,scope,parametername=null,parametertype=null,datatype=null,required=false) => { + const uriId=httpverb.toLowerCase()+'\/'+uripattern; + + if(ratelimitlevel=="api"){ + cy.get('#api-rate-limiting-api-level').click(); + cy.get('#operation_throttling_policy').click(); + cy.contains('li',limitinglevel).click(); + }else{ + cy.get('#api-rate-limiting-operation-level').click(); + } + cy.get('#add-operation-selection-dropdown').click(); + cy.contains('li',httpverb).click(); + + //colapse dropdown + cy.get('#menu-verbs').click(); + + cy.get('#operation-target').type(uripattern); + cy.get('#add-operation-button').click(); + + cy.get(`[id="${uriId}"]`, { timeout: 30000 }).click(); + + + if(description!= null){ + cy.get(`[data-testid="description-${uriId}"]`, { timeout: 30000 }).click(); + cy.get(`[data-testid="description-${uriId}"]`).type(description); + + } + if(summary!=null){ + cy.get(`[data-testid="summary-${uriId}"]`, { timeout: 30000 }).click(); + cy.get(`[data-testid="summary-${uriId}"]`).type(summary); + } + if(security==false){ + cy.get(`[data-testid="security-${uriId}"]`).click(); + }else{ + cy.get(`[id="${uriId}-operation-scope-select"]`, { timeout: 30000 }).click(); + cy.contains('li',scope).click(); + cy.get('#menu-').click(); + } + + if(ratelimitlevel=="operation"){ + cy.get(`[id="${uriId}-operation_throttling_policy-label"]`).click(); + cy.contains('li',limitinglevel).click(); + } + + + //parameters + if(parametertype!=null){ + cy.get(`[id="param-${uriId}"]`).click(); + cy.contains('li',parametertype).click(); + cy.get(`[id="name-${uriId}"]`).type(parametername); + cy.get(`[id="data-${uriId}"]`).click(); + cy.get(`[id="data-${uriId}/${datatype.toLowerCase()}"]`).click(); + if(required){ + cy.get(`[data-testid="required-${uriId}"]`).click(); + } + cy.get(`[id="param-${uriId}-add-btn"]`).click(); + cy.contains('td',parametername).should('exist'); + } + cy.get('#resources-save-operations', { timeout: 30000 }).click(); + +}) + + +Cypress.Commands.add('addProperty',(name,value,ifSendToDevPortal)=>{ + cy.wait(4000); + cy.get('#add-new-property',{ timeout: 60000 }).click({force:true}); + cy.get('#property-name', {timeout: Cypress.config().largeTimeout}).focus().type(name); + cy.get('#property-value').focus().type(value); + + if(ifSendToDevPortal) + cy.contains('label','Show in devportal').click(); + cy.get('#properties-add-btn').should('exist'); + cy.get('#properties-add-btn').click(); + + //verifying that the property added + cy.get('tr').contains('td',name); + + //save the property + cy.get('[data-testid="custom-select-save-button"]').click(); + cy.timeout(3000); +}) + + +Cypress.Commands.add('createGraphqlAPIfromFile', (name,version,context,filepath)=>{ + + cy.visit(`/publisher/apis/create/graphQL`); + + // upload the graphql file + cy.get('[data-testid="browse-to-upload-btn"]', {timeout: Cypress.config().largeTimeout}).then(function () { + cy.get('input[type="file"]').attachFile(filepath); + // Wait to upload and go to next page + cy.get('[data-testid="uploaded-list-graphql"]', {timeout: Cypress.config().largeTimeout}).should('be.visible'); + cy.get('[data-testid="create-graphql-next-btn"]').click(); + + // Filling the form + cy.get('#itest-id-apiname-input').click(); + cy.get('#itest-id-apiname-input').type(name); + cy.get('#itest-id-apicontext-input').click(); + cy.get('#itest-id-apicontext-input').type(context); + cy.get('#itest-id-apiversion-input').click(); + cy.get('#itest-id-apiversion-input').type(version); + cy.get('#itest-id-apiendpoint-input').click(); + cy.get('#itest-id-apiendpoint-input').type('http://localhost:8080/graphql'); + cy.get('#itest-id-apiversion-input').click(); + cy.get('body').click(0,0); + + // Saving the form + cy.get('[data-testid="itest-create-graphql-api-button"]',).click({force:true, timeout: Cypress.config().largeTimeout}); + + //Checking the version in the overview + cy.get('#itest-api-name-version', {timeout: Cypress.config().largeTimeout}).should('be.visible'); + cy.get('#itest-api-name-version').contains(version); + cy.url().then(url => { + let apiId = /apis\/(.*?)\/overview/.exec(url)[1]; + return cy.wrap(apiId); + }); + }); +}) + + + +Cypress.Commands.add('modifyGraphqlSchemaDefinition', (filepath)=>{ + + var filename = filepath.replace(/^.*[\\\/]/, ''); + var uploadedDefinitionPanel=null; + + cy.contains('button', 'Import Definition').click(); + // upload the graphql file + cy.get('[data-testid="browse-to-upload-btn"]') + cy.get('input[type="file"]').attachFile(filepath); + cy.contains('h2','Import GraphQL Schema Definition').should('exist'); + uploadedDefinitionPanel=cy.get('[data-testid="uploaded-list-graphql"]').get('li').get('[data-testid="uploaded-list-content-graphql"]') + //uploadedDefinitionPanel.contains(`[data-testid="file-input-${filename}"]`,filename).should('be.visible'); + uploadedDefinitionPanel.get('[data-testid="btn-delete-imported-file"]').should('be.visible'); + cy.get('#import-open-api-btn').click(); + cy.get('#import-open-api-btn').should('not.exist') + const searchCmd = Cypress.platform === 'darwin' ? '{cmd}f' : '{ctrl}f' + cy.get('.react-monaco-editor-container',{timeout:30000}).get('.monaco-editor textarea:first') + .type(searchCmd,{force:true}); + cy.get('.find-part .input').type('modified schema file'); + cy.contains('.find-actions','1 of').should('be.visible'); + + +}) + + +Cypress.Commands.add('createLocalScope', (name, displayname='sample display name',description='sample description',roles=[]) => { + + cy.get('h3', {timeout: Cypress.config().largeTimeout}).contains("Create New Scope", { timeout: 30000 }); + cy.wait(1000); + cy.get('#name',{timeout:30000}).type(name, {force:true}); + cy.get('#displayName',{timeout: 30000 }).click().type(displayname, {force:true}); + cy.get('#description',{timeout: 30000 }).click().type(description, {force:true}); + cy.get('#name',{timeout:30000}).clear().click().type(name, {force:true}); + + roles.forEach(role => { + cy.get('#roles-input',{timeout: 30000 }).type(role+'\n'); + }); + cy.get('#scope-save-btn').click({force: true}); + + //it randomly causes an error in verification step when removed the wait + cy.wait(3000); + + //check the table and verify whether entered scope names exist + cy.get('table').get('tbody').find("tr").contains(name); + +}) + + +Cypress.Commands.add('createAPIWithoutEndpoint', (name=null,version=null,type = 'REST') => { + const random_number = Math.floor(Date.now() / 1000); + var apiVersion=`v${random_number}`; + var apiName = `0sample_api_${random_number}`; + if(name){ + apiName=name; + } + if(version){ + apiVersion=version; + } + cy.visit(`/publisher/apis`); + cy.get('#itest-create-api-menu-button', {timeout: Cypress.config().largeTimeout}); + cy.get('#itest-create-api-menu-button').click(); + cy.get('#itest-id-landing-rest-create-default').click(); + cy.get('#itest-id-apiname-input').type(apiName); + cy.get('#itest-id-apicontext-input').click(); + cy.get('#itest-id-apicontext-input').type(`/sample_context_${apiVersion}`); + cy.get('#itest-id-apiversion-input').click(); + cy.get('#itest-id-apiversion-input').type(apiVersion); + cy.get('#itest-id-apiendpoint-input').click(); + cy.get('#itest-create-default-api-button').click(); + cy.wait(500); + + cy.visit(`/publisher/apis/`); + cy.get(`#${apiName}`,{timeout: Cypress.config().largeTimeout}).click(); + + + cy.get('#itest-api-name-version', { timeout: 30000 }).should('be.visible'); + cy.get('#itest-api-name-version').contains(`${apiVersion}`); +}) + +Cypress.Commands.add('createApp', (appName, appDescription, tenant = 'carbon.super') => { + cy.visit(`/devportal/applications/create?tenant=${tenant}`); + cy.intercept('**/application-attributes').as('attrGet'); + cy.wait('@attrGet', { timeout: 300000 }).then(() => { + // Filling the form + cy.get('#application-name').click(); + cy.get('#application-name').type(appName); + cy.get('#application-description').click(); + cy.get('#application-description').type('{backspace}'); + cy.get('#application-description').type(appDescription); + cy.get('#itest-application-create-save').click({force:true}); + + // Checking the app name exists in the overview page. + cy.url().should('contain', '/overview'); + cy.get('#itest-info-bar-application-name').contains(appName).should('exist'); + }) +}); + +Cypress.Commands.add('deleteApp', (appName, tenant = 'carbon.super') => { + cy.intercept('**/applications**').as('appGet'); + cy.visit(`/devportal/applications?tenant=${tenant}`); + cy.wait('@appGet', { timeout: 300000 }).then(() => { + cy.get(`#delete-${appName}-btn`, { timeout: 30000 }); + cy.get(`#delete-${appName}-btn`).click({force:true}); + cy.get(`#itest-confirm-application-delete`).click(); + }) +}); + +Cypress.Commands.add('createAndPublishApi', (apiName = null) => { + cy.visit(`/publisher/apis`); + // select the option from the menu item + cy.get('#itest-rest-api-create-menu', {timeout: Cypress.config().largeTimeout}).click(); + cy.get('#itest-id-landing-upload-oas').click(); + cy.get('#open-api-file-select-radio').click(); + + // upload the swagger + cy.get('#browse-to-upload-btn').then(function () { + const filepath = 'api_artifacts/swagger_2.0.json' + cy.get('input[type="file"]').attachFile(filepath) + }); + + // go to the next step + cy.get('#open-api-create-next-btn').click(); + + // Fill the second step form + if (apiName) { + const random_number = Math.floor(Date.now() / 1000); + + cy.get('#itest-id-apiname-input').clear().type(apiName); + cy.get('#itest-id-apicontext-input').click(); + cy.get('#itest-id-apicontext-input').clear().type(`/api_${random_number}`); + cy.get('#itest-id-apiendpoint-input').click().type('https://petstore.swagger.io'); + } + + cy.get('#open-api-create-btn').click(); + + //select subscription tiers + cy.get('#itest-api-details-portal-config-acc', { timeout: 30000 }).click(); + cy.get('#left-menu-itemsubscriptions').click(); + cy.get('[data-testid="policy-checkbox-silver"]').click(); + cy.get('[data-testid="policy-checkbox-unlimited"]').click(); + cy.get('#subscriptions-save-btn').click(); + + // deploy + cy.get('#left-menu-itemdeployments').click(); + cy.get('#left-menu-itemdeployments').then(() => { + cy.wait(1000); + cy.get('#deploy-btn').should('not.have.class', 'Mui-disabled').click(); + cy.get('#undeploy-btn').should('not.have.class', 'Mui-disabled').should('exist'); + }) + + // publish + cy.get('#left-menu-itemlifecycle').click(); + cy.wait(2000); + cy.get('[data-testid="Publish-btn"]').click(); + cy.get('button[data-testid="Demote to Created-btn"]').should('exist'); + +}) + +Cypress.Commands.add('logoutFromDevportal', (referer = '/devportal/apis') => { + + cy.get('#userToggleButton').click(); + cy.get("#userPopup").get("#menu-list-grow").get('ul').contains('li','Logout').click(); + cy.url().should('contain', '/devportal/logout'); + cy.url().should('contain', referer); +}) + +Cypress.Commands.add('logoutFromPublisher', () => { + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + cy.visit(`/publisher/services/logout`); +}) + +Cypress.Commands.add('viewThirdPartyApi', (apiName = null) => { + cy.get("#searchQuery").type(apiName).type('{enter}') + cy.get(`[area-label="Go to ${apiName}"]`, {timeout: Cypress.config().largeTimeout}).click(); + + //Check if the subscriptions, tryout, comments and SDKs sections are present + cy.get('#left-menu-credentials').should('exist'); + cy.get('#left-menu-test').should('exist'); + cy.get('#left-menu-comments').should('exist'); + cy.get('#left-menu-sdk').should('exist'); + + //Visit Original Developer Portal + cy.get('#left-menu-credentials').click(); + cy.get('[data-testid="itest-original-devportal-link"]').should('exist'); + cy.get('[data-testid="itest-no-tier-dialog"]').contains('No tiers are available for the API.').should('exist'); + + //Check if authorization header and value can be customized + cy.get('#left-menu-test').click(); + cy.get('#advAuthHeader', {timeout: Cypress.config().largeTimeout}).should('exist'); + cy.get('#advAuthHeaderValue').should('exist'); + +}) + +/** + * create application in DevPortal + * @method createApplication create application in DevPortal + * @param {string} applicationName name of the application + * @param {string} perTokenQuota 10PerMin | 20OPerMin | 50PerMin | Unlimited + * @param {string} appDescription description about application + */ +Cypress.Commands.add('createApplication', (applicationName,perTokenQuota,applicationDescription=null) => { + cy.get("#itest-link-to-applications").click(); + cy.get("#itest-application-create-link",{timeout:30000}).click(); + cy.get('#application-name').type(applicationName); + cy.get('#per-token-quota').click(); + cy.get('ul').contains('li',perTokenQuota).click(); + + if(applicationDescription){ + cy.get('#application-description').type(applicationDescription); + } + cy.get("#itest-application-create-save").click(); + + cy.get("#itest-info-bar-application-name", {timeout: Cypress.config().largeTimeout}).contains(applicationName).should('exist'); + cy.get("#production-keys").click(); + cy.get("#generate-keys").click(); + + cy.get("#sandbox-keys").click(); + cy.get("#generate-keys",{timeout:30000}).click(); + +}); + +Cypress.Commands.add('deleteApplication', (applicationName) => { + cy.get("#itest-link-to-applications", {timeout: Cypress.config().largeTimeout}).click(); + cy.get('table', {timeout: Cypress.config().largeTimeout}).get('tbody').get(`[data-testid="row-${applicationName}"]`) + .find('td').eq(5).get(`[id="delete-${applicationName}-btn"]`).click(); + cy.get("#itest-confirm-application-delete").click(); +}); diff --git a/cypress/support/functions/PublisherMenu.js b/cypress/support/functions/PublisherMenu.js new file mode 100644 index 00000000..c4aa6c8f --- /dev/null +++ b/cypress/support/functions/PublisherMenu.js @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +import PublisherComonPage from "../pages/publisher/PublisherComonPage"; + +class PublisherMenu { + + // navigate by URL need to provide api id + + static goToBasicInfoByURL(apiID){ + cy.intercept('GET', `**/apis/${apiID}/documents?limit=1000`).as('documents'); + cy.visit(`/publisher/apis/${apiID}/configuration`); + cy.wait('@documents',{timeout: Cypress.config().largeTimeout}).its('response.statusCode').should('equal', 200) + PublisherComonPage.waitUntillLoadingComponentsExit(); + } + static goToDeploymentsByURL(apiID){ + cy.intercept('GET', `**/apis/${apiID}/deployments`).as('deployments'); + cy.visit(`/publisher/apis/${apiID}/deployments`); + cy.wait('@deployments',{timeout: Cypress.config().largeTimeout}).its('response.statusCode').should('equal', 200) + PublisherComonPage.waitUntillLoadingComponentsExit(); + } + static goTolifecycleByURL(apiID){ + cy.intercept('GET', `**/apis/${apiID}/revisions?query=deployed**`).as('revisions'); + cy.visit(`/publisher/apis/${apiID}/lifecycle`); + cy.wait('@revisions',{timeout: Cypress.config().largeTimeout}).its('response.statusCode').should('equal', 200) + PublisherComonPage.waitUntillLoadingComponentsExit(); + } +} + +export default PublisherMenu; \ No newline at end of file diff --git a/cypress/support/index.js b/cypress/support/index.js new file mode 100644 index 00000000..d68db96d --- /dev/null +++ b/cypress/support/index.js @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/index.js is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') diff --git a/cypress/support/mockData/names-const.js b/cypress/support/mockData/names-const.js new file mode 100644 index 00000000..301f3d89 --- /dev/null +++ b/cypress/support/mockData/names-const.js @@ -0,0 +1,2853 @@ +export const ADJECTIVES = [ + "abandoned", + "able", + "absolute", + "adorable", + "adventurous", + "academic", + "acceptable", + "acclaimed", + "accomplished", + "accurate", + "aching", + "acidic", + "acrobatic", + "active", + "actual", + "adept", + "admirable", + "admired", + "adolescent", + "adorable", + "adored", + "advanced", + "afraid", + "affectionate", + "aged", + "aggravating", + "aggressive", + "agile", + "agitated", + "agonizing", + "agreeable", + "ajar", + "alarmed", + "alarming", + "alert", + "alienated", + "alive", + "all", + "altruistic", + "amazing", + "ambitious", + "ample", + "amused", + "amusing", + "anchored", + "ancient", + "angelic", + "angry", + "anguished", + "animated", + "annual", + "another", + "antique", + "anxious", + "any", + "apprehensive", + "appropriate", + "apt", + "arctic", + "arid", + "aromatic", + "artistic", + "ashamed", + "assured", + "astonishing", + "athletic", + "attached", + "attentive", + "attractive", + "austere", + "authentic", + "authorized", + "automatic", + "avaricious", + "average", + "aware", + "awesome", + "awful", + "awkward", + "babyish", + "bad", + "back", + "baggy", + "bare", + "barren", + "basic", + "beautiful", + "belated", + "beloved", + "beneficial", + "better", + "best", + "bewitched", + "big", + "big-hearted", + "biodegradable", + "bite-sized", + "bitter", + "black", + "black-and-white", + "bland", + "blank", + "blaring", + "bleak", + "blind", + "blissful", + "blond", + "blue", + "blushing", + "bogus", + "boiling", + "bold", + "bony", + "boring", + "bossy", + "both", + "bouncy", + "bountiful", + "bowed", + "brave", + "breakable", + "brief", + "bright", + "brilliant", + "brisk", + "broken", + "bronze", + "brown", + "bruised", + "bubbly", + "bulky", + "bumpy", + "buoyant", + "burdensome", + "burly", + "bustling", + "busy", + "buttery", + "buzzing", + "calculating", + "calm", + "candid", + "canine", + "capital", + "carefree", + "careful", + "careless", + "caring", + "cautious", + "cavernous", + "celebrated", + "charming", + "cheap", + "cheerful", + "cheery", + "chief", + "chilly", + "chubby", + "circular", + "classic", + "clean", + "clear", + "clear-cut", + "clever", + "close", + "closed", + "cloudy", + "clueless", + "clumsy", + "cluttered", + "coarse", + "cold", + "colorful", + "colorless", + "colossal", + "comfortable", + "common", + "compassionate", + "competent", + "complete", + "complex", + "complicated", + "composed", + "concerned", + "concrete", + "confused", + "conscious", + "considerate", + "constant", + "content", + "conventional", + "cooked", + "cool", + "cooperative", + "coordinated", + "corny", + "corrupt", + "costly", + "courageous", + "courteous", + "crafty", + "crazy", + "creamy", + "creative", + "creepy", + "criminal", + "crisp", + "critical", + "crooked", + "crowded", + "cruel", + "crushing", + "cuddly", + "cultivated", + "cultured", + "cumbersome", + "curly", + "curvy", + "cute", + "cylindrical", + "damaged", + "damp", + "dangerous", + "dapper", + "daring", + "darling", + "dark", + "dazzling", + "dead", + "deadly", + "deafening", + "dear", + "dearest", + "decent", + "decimal", + "decisive", + "deep", + "defenseless", + "defensive", + "defiant", + "deficient", + "definite", + "definitive", + "delayed", + "delectable", + "delicious", + "delightful", + "delirious", + "demanding", + "dense", + "dental", + "dependable", + "dependent", + "descriptive", + "deserted", + "detailed", + "determined", + "devoted", + "different", + "difficult", + "digital", + "diligent", + "dim", + "dimpled", + "dimwitted", + "direct", + "disastrous", + "discrete", + "disfigured", + "disgusting", + "disloyal", + "dismal", + "distant", + "downright", + "dreary", + "dirty", + "disguised", + "dishonest", + "dismal", + "distant", + "distinct", + "distorted", + "dizzy", + "dopey", + "doting", + "double", + "downright", + "drab", + "drafty", + "dramatic", + "dreary", + "droopy", + "dry", + "dual", + "dull", + "dutiful", + "each", + "eager", + "earnest", + "early", + "easy", + "easy-going", + "ecstatic", + "edible", + "educated", + "elaborate", + "elastic", + "elated", + "elderly", + "electric", + "elegant", + "elementary", + "elliptical", + "embarrassed", + "embellished", + "eminent", + "emotional", + "empty", + "enchanted", + "enchanting", + "energetic", + "enlightened", + "enormous", + "enraged", + "entire", + "envious", + "equal", + "equatorial", + "essential", + "esteemed", + "ethical", + "euphoric", + "even", + "evergreen", + "everlasting", + "every", + "evil", + "exalted", + "excellent", + "exemplary", + "exhausted", + "excitable", + "excited", + "exciting", + "exotic", + "expensive", + "experienced", + "expert", + "extraneous", + "extroverted", + "extra-large", + "extra-small", + "fabulous", + "failing", + "faint", + "fair", + "faithful", + "fake", + "false", + "familiar", + "famous", + "fancy", + "fantastic", + "far", + "faraway", + "far-flung", + "far-off", + "fast", + "fat", + "fatal", + "fatherly", + "favorable", + "favorite", + "fearful", + "fearless", + "feisty", + "feline", + "female", + "feminine", + "few", + "fickle", + "filthy", + "fine", + "finished", + "firm", + "first", + "firsthand", + "fitting", + "fixed", + "flaky", + "flamboyant", + "flashy", + "flat", + "flawed", + "flawless", + "flickering", + "flimsy", + "flippant", + "flowery", + "fluffy", + "fluid", + "flustered", + "focused", + "fond", + "foolhardy", + "foolish", + "forceful", + "forked", + "formal", + "forsaken", + "forthright", + "fortunate", + "fragrant", + "frail", + "frank", + "frayed", + "free", + "French", + "fresh", + "frequent", + "friendly", + "frightened", + "frightening", + "frigid", + "frilly", + "frizzy", + "frivolous", + "front", + "frosty", + "frozen", + "frugal", + "fruitful", + "full", + "fumbling", + "functional", + "funny", + "fussy", + "fuzzy", + "gargantuan", + "gaseous", + "general", + "generous", + "gentle", + "genuine", + "giant", + "giddy", + "gigantic", + "gifted", + "giving", + "glamorous", + "glaring", + "glass", + "gleaming", + "gleeful", + "glistening", + "glittering", + "gloomy", + "glorious", + "glossy", + "glum", + "golden", + "good", + "good-natured", + "gorgeous", + "graceful", + "gracious", + "grand", + "grandiose", + "granular", + "grateful", + "grave", + "gray", + "great", + "greedy", + "green", + "gregarious", + "grim", + "grimy", + "gripping", + "grizzled", + "gross", + "grotesque", + "grouchy", + "grounded", + "growing", + "growling", + "grown", + "grubby", + "gruesome", + "grumpy", + "guilty", + "gullible", + "gummy", + "hairy", + "half", + "handmade", + "handsome", + "handy", + "happy", + "happy-go-lucky", + "hard", + "hard-to-find", + "harmful", + "harmless", + "harmonious", + "harsh", + "hasty", + "hateful", + "haunting", + "healthy", + "heartfelt", + "hearty", + "heavenly", + "heavy", + "hefty", + "helpful", + "helpless", + "hidden", + "hideous", + "high", + "high-level", + "hilarious", + "hoarse", + "hollow", + "homely", + "honest", + "honorable", + "honored", + "hopeful", + "horrible", + "hospitable", + "hot", + "huge", + "humble", + "humiliating", + "humming", + "humongous", + "hungry", + "hurtful", + "husky", + "icky", + "icy", + "ideal", + "idealistic", + "identical", + "idle", + "idiotic", + "idolized", + "ignorant", + "ill", + "illegal", + "ill-fated", + "ill-informed", + "illiterate", + "illustrious", + "imaginary", + "imaginative", + "immaculate", + "immaterial", + "immediate", + "immense", + "impassioned", + "impeccable", + "impartial", + "imperfect", + "imperturbable", + "impish", + "impolite", + "important", + "impossible", + "impractical", + "impressionable", + "impressive", + "improbable", + "impure", + "inborn", + "incomparable", + "incompatible", + "incomplete", + "inconsequential", + "incredible", + "indelible", + "inexperienced", + "indolent", + "infamous", + "infantile", + "infatuated", + "inferior", + "infinite", + "informal", + "innocent", + "insecure", + "insidious", + "insignificant", + "insistent", + "instructive", + "insubstantial", + "intelligent", + "intent", + "intentional", + "interesting", + "internal", + "international", + "intrepid", + "ironclad", + "irresponsible", + "irritating", + "itchy", + "jaded", + "jagged", + "jam-packed", + "jaunty", + "jealous", + "jittery", + "joint", + "jolly", + "jovial", + "joyful", + "joyous", + "jubilant", + "judicious", + "juicy", + "jumbo", + "junior", + "jumpy", + "juvenile", + "kaleidoscopic", + "keen", + "key", + "kind", + "kindhearted", + "kindly", + "klutzy", + "knobby", + "knotty", + "knowledgeable", + "knowing", + "known", + "kooky", + "kosher", + "lame", + "lanky", + "large", + "last", + "lasting", + "late", + "lavish", + "lawful", + "lazy", + "leading", + "lean", + "leafy", + "left", + "legal", + "legitimate", + "light", + "lighthearted", + "likable", + "likely", + "limited", + "limp", + "limping", + "linear", + "lined", + "liquid", + "little", + "live", + "lively", + "livid", + "loathsome", + "lone", + "lonely", + "long", + "long-term", + "loose", + "lopsided", + "lost", + "loud", + "lovable", + "lovely", + "loving", + "low", + "loyal", + "lucky", + "lumbering", + "luminous", + "lumpy", + "lustrous", + "luxurious", + "mad", + "made-up", + "magnificent", + "majestic", + "major", + "male", + "mammoth", + "married", + "marvelous", + "masculine", + "massive", + "mature", + "meager", + "mealy", + "mean", + "measly", + "meaty", + "medical", + "mediocre", + "medium", + "meek", + "mellow", + "melodic", + "memorable", + "menacing", + "merry", + "messy", + "metallic", + "mild", + "milky", + "mindless", + "miniature", + "minor", + "minty", + "miserable", + "miserly", + "misguided", + "misty", + "mixed", + "modern", + "modest", + "moist", + "monstrous", + "monthly", + "monumental", + "moral", + "mortified", + "motherly", + "motionless", + "mountainous", + "muddy", + "muffled", + "multicolored", + "mundane", + "murky", + "mushy", + "musty", + "muted", + "mysterious", + "naive", + "narrow", + "nasty", + "natural", + "naughty", + "nautical", + "near", + "neat", + "necessary", + "needy", + "negative", + "neglected", + "negligible", + "neighboring", + "nervous", + "new", + "next", + "nice", + "nifty", + "nimble", + "nippy", + "nocturnal", + "noisy", + "nonstop", + "normal", + "notable", + "noted", + "noteworthy", + "novel", + "noxious", + "numb", + "nutritious", + "nutty", + "obedient", + "obese", + "oblong", + "oily", + "oblong", + "obvious", + "occasional", + "odd", + "oddball", + "offbeat", + "offensive", + "official", + "old", + "old-fashioned", + "only", + "open", + "optimal", + "optimistic", + "opulent", + "orange", + "orderly", + "organic", + "ornate", + "ornery", + "ordinary", + "original", + "other", + "our", + "outlying", + "outgoing", + "outlandish", + "outrageous", + "outstanding", + "oval", + "overcooked", + "overdue", + "overjoyed", + "overlooked", + "palatable", + "pale", + "paltry", + "parallel", + "parched", + "partial", + "passionate", + "past", + "pastel", + "peaceful", + "peppery", + "perfect", + "perfumed", + "periodic", + "perky", + "personal", + "pertinent", + "pesky", + "pessimistic", + "petty", + "phony", + "physical", + "piercing", + "pink", + "pitiful", + "plain", + "plaintive", + "plastic", + "playful", + "pleasant", + "pleased", + "pleasing", + "plump", + "plush", + "polished", + "polite", + "political", + "pointed", + "pointless", + "poised", + "poor", + "popular", + "portly", + "posh", + "positive", + "possible", + "potable", + "powerful", + "powerless", + "practical", + "precious", + "present", + "prestigious", + "pretty", + "precious", + "previous", + "pricey", + "prickly", + "primary", + "prime", + "pristine", + "private", + "prize", + "probable", + "productive", + "profitable", + "profuse", + "proper", + "proud", + "prudent", + "punctual", + "pungent", + "puny", + "pure", + "purple", + "pushy", + "putrid", + "puzzled", + "puzzling", + "quaint", + "qualified", + "quarrelsome", + "quarterly", + "queasy", + "querulous", + "questionable", + "quick", + "quick-witted", + "quiet", + "quintessential", + "quirky", + "quixotic", + "quizzical", + "radiant", + "ragged", + "rapid", + "rare", + "rash", + "raw", + "recent", + "reckless", + "rectangular", + "ready", + "real", + "realistic", + "reasonable", + "red", + "reflecting", + "regal", + "regular", + "reliable", + "relieved", + "remarkable", + "remorseful", + "remote", + "repentant", + "required", + "respectful", + "responsible", + "repulsive", + "revolving", + "rewarding", + "rich", + "rigid", + "right", + "ringed", + "ripe", + "roasted", + "robust", + "rosy", + "rotating", + "rotten", + "rough", + "round", + "rowdy", + "royal", + "rubbery", + "rundown", + "ruddy", + "rude", + "runny", + "rural", + "rusty", + "sad", + "safe", + "salty", + "same", + "sandy", + "sane", + "sarcastic", + "sardonic", + "satisfied", + "scaly", + "scarce", + "scared", + "scary", + "scented", + "scholarly", + "scientific", + "scornful", + "scratchy", + "scrawny", + "second", + "secondary", + "second-hand", + "secret", + "self-assured", + "self-reliant", + "selfish", + "sentimental", + "separate", + "serene", + "serious", + "serpentine", + "several", + "severe", + "shabby", + "shadowy", + "shady", + "shallow", + "shameful", + "shameless", + "sharp", + "shimmering", + "shiny", + "shocked", + "shocking", + "shoddy", + "short", + "short-term", + "showy", + "shrill", + "shy", + "sick", + "silent", + "silky", + "silly", + "silver", + "similar", + "simple", + "simplistic", + "sinful", + "single", + "sizzling", + "skeletal", + "skinny", + "sleepy", + "slight", + "slim", + "slimy", + "slippery", + "slow", + "slushy", + "small", + "smart", + "smoggy", + "smooth", + "smug", + "snappy", + "snarling", + "sneaky", + "sniveling", + "snoopy", + "sociable", + "soft", + "soggy", + "solid", + "somber", + "some", + "spherical", + "sophisticated", + "sore", + "sorrowful", + "soulful", + "soupy", + "sour", + "Spanish", + "sparkling", + "sparse", + "specific", + "spectacular", + "speedy", + "spicy", + "spiffy", + "spirited", + "spiteful", + "splendid", + "spotless", + "spotted", + "spry", + "square", + "squeaky", + "squiggly", + "stable", + "staid", + "stained", + "stale", + "standard", + "starchy", + "stark", + "starry", + "steep", + "sticky", + "stiff", + "stimulating", + "stingy", + "stormy", + "straight", + "strange", + "steel", + "strict", + "strident", + "striking", + "striped", + "strong", + "studious", + "stunning", + "stupendous", + "stupid", + "sturdy", + "stylish", + "subdued", + "submissive", + "substantial", + "subtle", + "suburban", + "sudden", + "sugary", + "sunny", + "super", + "superb", + "superficial", + "superior", + "supportive", + "sure-footed", + "surprised", + "suspicious", + "svelte", + "sweaty", + "sweet", + "sweltering", + "swift", + "sympathetic", + "tall", + "talkative", + "tame", + "tan", + "tangible", + "tart", + "tasty", + "tattered", + "taut", + "tedious", + "teeming", + "tempting", + "tender", + "tense", + "tepid", + "terrible", + "terrific", + "testy", + "thankful", + "that", + "these", + "thick", + "thin", + "third", + "thirsty", + "this", + "thorough", + "thorny", + "those", + "thoughtful", + "threadbare", + "thrifty", + "thunderous", + "tidy", + "tight", + "timely", + "tinted", + "tiny", + "tired", + "torn", + "total", + "tough", + "traumatic", + "treasured", + "tremendous", + "tragic", + "trained", + "tremendous", + "triangular", + "tricky", + "trifling", + "trim", + "trivial", + "troubled", + "true", + "trusting", + "trustworthy", + "trusty", + "truthful", + "tubby", + "turbulent", + "twin", + "ugly", + "ultimate", + "unacceptable", + "unaware", + "uncomfortable", + "uncommon", + "unconscious", + "understated", + "unequaled", + "uneven", + "unfinished", + "unfit", + "unfolded", + "unfortunate", + "unhappy", + "unhealthy", + "uniform", + "unimportant", + "unique", + "united", + "unkempt", + "unknown", + "unlawful", + "unlined", + "unlucky", + "unnatural", + "unpleasant", + "unrealistic", + "unripe", + "unruly", + "unselfish", + "unsightly", + "unsteady", + "unsung", + "untidy", + "untimely", + "untried", + "untrue", + "unused", + "unusual", + "unwelcome", + "unwieldy", + "unwilling", + "unwitting", + "unwritten", + "upbeat", + "upright", + "upset", + "urban", + "usable", + "used", + "useful", + "useless", + "utilized", + "utter", + "vacant", + "vague", + "vain", + "valid", + "valuable", + "vapid", + "variable", + "vast", + "velvety", + "venerated", + "vengeful", + "verifiable", + "vibrant", + "vicious", + "victorious", + "vigilant", + "vigorous", + "villainous", + "violet", + "violent", + "virtual", + "virtuous", + "visible", + "vital", + "vivacious", + "vivid", + "voluminous", + "wan", + "warlike", + "warm", + "warmhearted", + "warped", + "wary", + "wasteful", + "watchful", + "waterlogged", + "watery", + "wavy", + "wealthy", + "weak", + "weary", + "webbed", + "wee", + "weekly", + "weepy", + "weighty", + "weird", + "welcome", + "well-documented", + "well-groomed", + "well-informed", + "well-lit", + "well-made", + "well-off", + "well-to-do", + "well-worn", + "wet", + "which", + "whimsical", + "whirlwind", + "whispered", + "white", + "whole", + "whopping", + "wicked", + "wide", + "wide-eyed", + "wiggly", + "wild", + "willing", + "wilted", + "winding", + "windy", + "winged", + "wiry", + "wise", + "witty", + "wobbly", + "woeful", + "wonderful", + "wooden", + "woozy", + "wordy", + "worldly", + "worn", + "worried", + "worrisome", + "worse", + "worst", + "worthless", + "worthwhile", + "worthy", + "wrathful", + "wretched", + "writhing", + "wrong", + "wry", + "yawning", + "yearly", + "yellow", + "yellowish", + "young", + "youthful", + "yummy", + "zany", + "zealous", + "zesty", + "zigzag", + "rocky", + ] + export const NOUNS = [ + "people", + "history", + "way", + "art", + "world", + "information", + "map", + "family", + "government", + "health", + "system", + "computer", + "meat", + "year", + "thanks", + "music", + "person", + "reading", + "method", + "data", + "food", + "understanding", + "theory", + "law", + "bird", + "literature", + "problem", + "software", + "control", + "knowledge", + "power", + "ability", + "economics", + "love", + "internet", + "television", + "science", + "library", + "nature", + "fact", + "product", + "idea", + "temperature", + "investment", + "area", + "society", + "activity", + "story", + "industry", + "media", + "thing", + "oven", + "community", + "definition", + "safety", + "quality", + "development", + "language", + "management", + "player", + "variety", + "video", + "week", + "security", + "country", + "exam", + "movie", + "organization", + "equipment", + "physics", + "analysis", + "policy", + "series", + "thought", + "basis", + "boyfriend", + "direction", + "strategy", + "technology", + "army", + "camera", + "freedom", + "paper", + "environment", + "child", + "instance", + "month", + "truth", + "marketing", + "university", + "writing", + "article", + "department", + "difference", + "goal", + "news", + "audience", + "fishing", + "growth", + "income", + "marriage", + "user", + "combination", + "failure", + "meaning", + "medicine", + "philosophy", + "teacher", + "communication", + "night", + "chemistry", + "disease", + "disk", + "energy", + "nation", + "road", + "role", + "soup", + "advertising", + "location", + "success", + "addition", + "apartment", + "education", + "math", + "moment", + "painting", + "politics", + "attention", + "decision", + "event", + "property", + "shopping", + "student", + "wood", + "competition", + "distribution", + "entertainment", + "office", + "population", + "president", + "unit", + "category", + "cigarette", + "context", + "introduction", + "opportunity", + "performance", + "driver", + "flight", + "length", + "magazine", + "newspaper", + "relationship", + "teaching", + "cell", + "dealer", + "debate", + "finding", + "lake", + "member", + "message", + "phone", + "scene", + "appearance", + "association", + "concept", + "customer", + "death", + "discussion", + "housing", + "inflation", + "insurance", + "mood", + "woman", + "advice", + "blood", + "effort", + "expression", + "importance", + "opinion", + "payment", + "reality", + "responsibility", + "situation", + "skill", + "statement", + "wealth", + "application", + "city", + "county", + "depth", + "estate", + "foundation", + "grandmother", + "heart", + "perspective", + "photo", + "recipe", + "studio", + "topic", + "collection", + "depression", + "imagination", + "passion", + "percentage", + "resource", + "setting", + "ad", + "agency", + "college", + "connection", + "criticism", + "debt", + "description", + "memory", + "patience", + "secretary", + "solution", + "administration", + "aspect", + "attitude", + "director", + "personality", + "psychology", + "recommendation", + "response", + "selection", + "storage", + "version", + "alcohol", + "argument", + "complaint", + "contract", + "emphasis", + "highway", + "loss", + "membership", + "possession", + "preparation", + "steak", + "union", + "agreement", + "cancer", + "currency", + "employment", + "engineering", + "entry", + "interaction", + "limit", + "mixture", + "preference", + "region", + "republic", + "seat", + "tradition", + "virus", + "actor", + "classroom", + "delivery", + "device", + "difficulty", + "drama", + "election", + "engine", + "football", + "guidance", + "hotel", + "match", + "owner", + "priority", + "protection", + "suggestion", + "tension", + "variation", + "anxiety", + "atmosphere", + "awareness", + "bread", + "climate", + "comparison", + "confusion", + "construction", + "elevator", + "emotion", + "employee", + "employer", + "guest", + "height", + "leadership", + "mall", + "manager", + "operation", + "recording", + "respect", + "sample", + "transportation", + "boring", + "charity", + "cousin", + "disaster", + "editor", + "efficiency", + "excitement", + "extent", + "feedback", + "guitar", + "homework", + "leader", + "mom", + "outcome", + "permission", + "presentation", + "promotion", + "reflection", + "refrigerator", + "resolution", + "revenue", + "session", + "singer", + "tennis", + "basket", + "bonus", + "cabinet", + "childhood", + "church", + "clothes", + "coffee", + "dinner", + "drawing", + "hair", + "hearing", + "initiative", + "judgment", + "lab", + "measurement", + "mode", + "mud", + "orange", + "poetry", + "police", + "possibility", + "procedure", + "queen", + "ratio", + "relation", + "restaurant", + "satisfaction", + "sector", + "signature", + "significance", + "song", + "tooth", + "town", + "vehicle", + "volume", + "wife", + "accident", + "airport", + "appointment", + "arrival", + "assumption", + "baseball", + "chapter", + "committee", + "conversation", + "database", + "enthusiasm", + "error", + "explanation", + "farmer", + "gate", + "girl", + "hall", + "historian", + "hospital", + "injury", + "instruction", + "maintenance", + "manufacturer", + "meal", + "perception", + "pie", + "poem", + "presence", + "proposal", + "reception", + "replacement", + "revolution", + "river", + "son", + "speech", + "tea", + "village", + "warning", + "winner", + "worker", + "writer", + "assistance", + "breath", + "buyer", + "chest", + "chocolate", + "conclusion", + "contribution", + "cookie", + "courage", + "desk", + "drawer", + "establishment", + "examination", + "garbage", + "grocery", + "honey", + "impression", + "improvement", + "independence", + "insect", + "inspection", + "inspector", + "king", + "ladder", + "menu", + "penalty", + "piano", + "potato", + "profession", + "professor", + "quantity", + "reaction", + "requirement", + "salad", + "sister", + "supermarket", + "tongue", + "weakness", + "wedding", + "affair", + "ambition", + "analyst", + "apple", + "assignment", + "assistant", + "bathroom", + "bedroom", + "beer", + "birthday", + "celebration", + "championship", + "cheek", + "client", + "consequence", + "departure", + "diamond", + "dirt", + "ear", + "fortune", + "friendship", + "funeral", + "gene", + "girlfriend", + "hat", + "indication", + "intention", + "lady", + "midnight", + "negotiation", + "obligation", + "passenger", + "pizza", + "platform", + "poet", + "pollution", + "recognition", + "reputation", + "shirt", + "speaker", + "stranger", + "surgery", + "sympathy", + "tale", + "throat", + "trainer", + "uncle", + "youth", + "time", + "work", + "film", + "water", + "money", + "example", + "while", + "business", + "study", + "game", + "life", + "form", + "air", + "day", + "place", + "number", + "part", + "field", + "fish", + "back", + "process", + "heat", + "hand", + "experience", + "job", + "book", + "end", + "point", + "type", + "home", + "economy", + "value", + "body", + "market", + "guide", + "interest", + "state", + "radio", + "course", + "company", + "price", + "size", + "card", + "list", + "mind", + "trade", + "line", + "care", + "group", + "risk", + "word", + "fat", + "force", + "key", + "light", + "training", + "name", + "school", + "top", + "amount", + "level", + "order", + "practice", + "research", + "sense", + "service", + "piece", + "web", + "boss", + "sport", + "fun", + "house", + "page", + "term", + "test", + "answer", + "sound", + "focus", + "matter", + "kind", + "soil", + "board", + "oil", + "picture", + "access", + "garden", + "range", + "rate", + "reason", + "future", + "site", + "demand", + "exercise", + "image", + "case", + "cause", + "coast", + "action", + "age", + "bad", + "boat", + "record", + "result", + "section", + "building", + "mouse", + "cash", + "class", + "period", + "plan", + "store", + "tax", + "side", + "subject", + "space", + "rule", + "stock", + "weather", + "chance", + "figure", + "man", + "model", + "source", + "beginning", + "earth", + "program", + "chicken", + "design", + "feature", + "head", + "material", + "purpose", + "question", + "rock", + "salt", + "act", + "birth", + "car", + "dog", + "object", + "scale", + "sun", + "note", + "profit", + "rent", + "speed", + "style", + "war", + "bank", + "craft", + "half", + "inside", + "outside", + "standard", + "bus", + "exchange", + "eye", + "fire", + "position", + "pressure", + "stress", + "advantage", + "benefit", + "box", + "frame", + "issue", + "step", + "cycle", + "face", + "item", + "metal", + "paint", + "review", + "room", + "screen", + "structure", + "view", + "account", + "ball", + "discipline", + "medium", + "share", + "balance", + "bit", + "black", + "bottom", + "choice", + "gift", + "impact", + "machine", + "shape", + "tool", + "wind", + "address", + "average", + "career", + "culture", + "morning", + "pot", + "sign", + "table", + "task", + "condition", + "contact", + "credit", + "egg", + "hope", + "ice", + "network", + "north", + "square", + "attempt", + "date", + "effect", + "link", + "post", + "star", + "voice", + "capital", + "challenge", + "friend", + "self", + "shot", + "brush", + "couple", + "exit", + "front", + "function", + "lack", + "living", + "plant", + "plastic", + "spot", + "summer", + "taste", + "theme", + "track", + "wing", + "brain", + "button", + "click", + "desire", + "foot", + "gas", + "influence", + "notice", + "rain", + "wall", + "base", + "damage", + "distance", + "feeling", + "pair", + "savings", + "staff", + "sugar", + "target", + "text", + "animal", + "author", + "budget", + "discount", + "file", + "ground", + "lesson", + "minute", + "officer", + "phase", + "reference", + "register", + "sky", + "stage", + "stick", + "title", + "trouble", + "bowl", + "bridge", + "campaign", + "character", + "club", + "edge", + "evidence", + "fan", + "letter", + "lock", + "maximum", + "novel", + "option", + "pack", + "park", + "quarter", + "skin", + "sort", + "weight", + "baby", + "background", + "carry", + "dish", + "factor", + "fruit", + "glass", + "joint", + "master", + "muscle", + "red", + "strength", + "traffic", + "trip", + "vegetable", + "appeal", + "chart", + "gear", + "ideal", + "kitchen", + "land", + "log", + "mother", + "net", + "party", + "principle", + "relative", + "sale", + "season", + "signal", + "spirit", + "street", + "tree", + "wave", + "belt", + "bench", + "commission", + "copy", + "drop", + "minimum", + "path", + "progress", + "project", + "sea", + "south", + "status", + "stuff", + "ticket", + "tour", + "angle", + "blue", + "breakfast", + "confidence", + "daughter", + "degree", + "doctor", + "dot", + "dream", + "duty", + "essay", + "father", + "fee", + "finance", + "hour", + "juice", + "luck", + "milk", + "mouth", + "peace", + "pipe", + "stable", + "storm", + "substance", + "team", + "trick", + "afternoon", + "bat", + "beach", + "blank", + "catch", + "chain", + "consideration", + "cream", + "crew", + "detail", + "gold", + "interview", + "kid", + "mark", + "mission", + "pain", + "pleasure", + "score", + "screw", + "sex", + "shop", + "shower", + "suit", + "tone", + "window", + "agent", + "band", + "bath", + "block", + "bone", + "calendar", + "candidate", + "cap", + "coat", + "contest", + "corner", + "court", + "cup", + "district", + "door", + "east", + "finger", + "garage", + "guarantee", + "hole", + "hook", + "implement", + "layer", + "lecture", + "lie", + "manner", + "meeting", + "nose", + "parking", + "partner", + "profile", + "rice", + "routine", + "schedule", + "swimming", + "telephone", + "tip", + "winter", + "airline", + "bag", + "battle", + "bed", + "bill", + "bother", + "cake", + "code", + "curve", + "designer", + "dimension", + "dress", + "ease", + "emergency", + "evening", + "extension", + "farm", + "fight", + "gap", + "grade", + "holiday", + "horror", + "horse", + "host", + "husband", + "loan", + "mistake", + "mountain", + "nail", + "noise", + "occasion", + "package", + "patient", + "pause", + "phrase", + "proof", + "race", + "relief", + "sand", + "sentence", + "shoulder", + "smoke", + "stomach", + "string", + "tourist", + "towel", + "vacation", + "west", + "wheel", + "wine", + "arm", + "aside", + "associate", + "bet", + "blow", + "border", + "branch", + "breast", + "brother", + "buddy", + "bunch", + "chip", + "coach", + "cross", + "document", + "draft", + "dust", + "expert", + "floor", + "god", + "golf", + "habit", + "iron", + "judge", + "knife", + "landscape", + "league", + "mail", + "mess", + "native", + "opening", + "parent", + "pattern", + "pin", + "pool", + "pound", + "request", + "salary", + "shame", + "shelter", + "shoe", + "silver", + "tackle", + "tank", + "trust", + "assist", + "bake", + "bar", + "bell", + "bike", + "blame", + "boy", + "brick", + "chair", + "closet", + "clue", + "collar", + "comment", + "conference", + "devil", + "diet", + "fear", + "fuel", + "glove", + "jacket", + "lunch", + "monitor", + "mortgage", + "nurse", + "pace", + "panic", + "peak", + "plane", + "reward", + "row", + "sandwich", + "shock", + "spite", + "spray", + "surprise", + "till", + "transition", + "weekend", + "welcome", + "yard", + "alarm", + "bend", + "bicycle", + "bite", + "blind", + "bottle", + "cable", + "candle", + "clerk", + "cloud", + "concert", + "counter", + "flower", + "grandfather", + "harm", + "knee", + "lawyer", + "leather", + "load", + "mirror", + "neck", + "pension", + "plate", + "purple", + "ruin", + "ship", + "skirt", + "slice", + "snow", + "specialist", + "stroke", + "switch", + "trash", + "tune", + "zone", + "anger", + "award", + "bid", + "bitter", + "boot", + "bug", + "camp", + "candy", + "carpet", + "cat", + "champion", + "channel", + "clock", + "comfort", + "cow", + "crack", + "engineer", + "entrance", + "fault", + "grass", + "guy", + "hell", + "highlight", + "incident", + "island", + "joke", + "jury", + "leg", + "lip", + "mate", + "motor", + "nerve", + "passage", + "pen", + "pride", + "priest", + "prize", + "promise", + "resident", + "resort", + "ring", + "roof", + "rope", + "sail", + "scheme", + "script", + "sock", + "station", + "toe", + "tower", + "truck", + "witness", + "can", + "will", + "other", + "use", + "make", + "good", + "look", + "help", + "go", + "great", + "being", + "still", + "public", + "read", + "keep", + "start", + "give", + "human", + "local", + "general", + "specific", + "long", + "play", + "feel", + "high", + "put", + "common", + "set", + "change", + "simple", + "past", + "big", + "possible", + "particular", + "major", + "personal", + "current", + "national", + "cut", + "natural", + "physical", + "show", + "try", + "check", + "second", + "call", + "move", + "pay", + "let", + "increase", + "single", + "individual", + "turn", + "ask", + "buy", + "guard", + "hold", + "main", + "offer", + "potential", + "professional", + "international", + "travel", + "cook", + "alternative", + "special", + "working", + "whole", + "dance", + "excuse", + "cold", + "commercial", + "low", + "purchase", + "deal", + "primary", + "worth", + "fall", + "necessary", + "positive", + "produce", + "search", + "present", + "spend", + "talk", + "creative", + "tell", + "cost", + "drive", + "green", + "support", + "glad", + "remove", + "return", + "run", + "complex", + "due", + "effective", + "middle", + "regular", + "reserve", + "independent", + "leave", + "original", + "reach", + "rest", + "serve", + "watch", + "beautiful", + "charge", + "active", + "break", + "negative", + "safe", + "stay", + "visit", + "visual", + "affect", + "cover", + "report", + "rise", + "walk", + "white", + "junior", + "pick", + "unique", + "classic", + "final", + "lift", + "mix", + "private", + "stop", + "teach", + "western", + "concern", + "familiar", + "fly", + "official", + "broad", + "comfortable", + "gain", + "rich", + "save", + "stand", + "young", + "heavy", + "lead", + "listen", + "valuable", + "worry", + "handle", + "leading", + "meet", + "release", + "sell", + "finish", + "normal", + "press", + "ride", + "secret", + "spread", + "spring", + "tough", + "wait", + "brown", + "deep", + "display", + "flow", + "hit", + "objective", + "shoot", + "touch", + "cancel", + "chemical", + "cry", + "dump", + "extreme", + "push", + "conflict", + "eat", + "fill", + "formal", + "jump", + "kick", + "opposite", + "pass", + "pitch", + "remote", + "total", + "treat", + "vast", + "abuse", + "beat", + "burn", + "deposit", + "print", + "raise", + "sleep", + "somewhere", + "advance", + "consist", + "dark", + "double", + "draw", + "equal", + "fix", + "hire", + "internal", + "join", + "kill", + "sensitive", + "tap", + "win", + "attack", + "claim", + "constant", + "drag", + "drink", + "guess", + "minor", + "pull", + "raw", + "soft", + "solid", + "wear", + "weird", + "wonder", + "annual", + "count", + "dead", + "doubt", + "feed", + "forever", + "impress", + "repeat", + "round", + "sing", + "slide", + "strip", + "wish", + "combine", + "command", + "dig", + "divide", + "equivalent", + "hang", + "hunt", + "initial", + "march", + "mention", + "spiritual", + "survey", + "tie", + "adult", + "brief", + "crazy", + "escape", + "gather", + "hate", + "prior", + "repair", + "rough", + "sad", + "scratch", + "sick", + "strike", + "employ", + "external", + "hurt", + "illegal", + "laugh", + "lay", + "mobile", + "nasty", + "ordinary", + "respond", + "royal", + "senior", + "split", + "strain", + "struggle", + "swim", + "train", + "upper", + "wash", + "yellow", + "convert", + "crash", + "dependent", + "fold", + "funny", + "grab", + "hide", + "miss", + "permit", + "quote", + "recover", + "resolve", + "roll", + "sink", + "slip", + "spare", + "suspect", + "sweet", + "swing", + "twist", + "upstairs", + "usual", + "abroad", + "brave", + "calm", + "concentrate", + "estimate", + "grand", + "male", + "mine", + "prompt", + "quiet", + "refuse", + "regret", + "reveal", + "rush", + "shake", + "shift", + "shine", + "steal", + "suck", + "surround", + "bear", + "brilliant", + "dare", + "dear", + "delay", + "drunk", + "female", + "hurry", + "inevitable", + "invite", + "kiss", + "neat", + "pop", + "punch", + "quit", + "reply", + "representative", + "resist", + "rip", + "rub", + "silly", + "smile", + "spell", + "stretch", + "stupid", + "tear", + "temporary", + "tomorrow", + "wake", + "wrap", + "yesterday", + "Thomas", + "Tom", + "Lieuwe", + ] \ No newline at end of file diff --git a/cypress/support/mockData/serviceCatalog.js b/cypress/support/mockData/serviceCatalog.js new file mode 100644 index 00000000..98125bd7 --- /dev/null +++ b/cypress/support/mockData/serviceCatalog.js @@ -0,0 +1,451 @@ +/** + * ***NOTE: These sample data are share between API Sample and Service catalog sample deployments, Please test both ends + * if you are changing anything here! + */ + + const getSampleOpenAPI = () => ({ + openapi: '3.0.0', + info: { + description: 'This is a RESTFul API for Pizza Shack online pizza delivery store.\n', + version: '1.0.0', + title: 'PizzaShackAPI', + contact: { + name: 'John Doe', + url: 'http://www.pizzashack.com', + email: 'architecture@pizzashack.com', + }, + license: { + name: 'Apache 2.0', + url: 'http://www.apache.org/licenses/LICENSE-2.0.html', + }, + }, + security: [{ default: [] }], + paths: { + '/order': { + post: { + description: 'Create a new Order', + requestBody: { + $ref: '#/components/requestBodies/Order', + }, + responses: { + 201: { + description: 'Created. Successful response with the newly created object as entity inthe body.' + + 'Location header contains URL of newly created entity.', + headers: { + Location: { + description: 'The URL of the newly created resource.', + schema: { + type: 'string', + }, + }, + 'Content-Type': { + description: 'The content type of the body.', + schema: { + type: 'string', + }, + }, + }, + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/Order', + }, + }, + }, + }, + 400: { + description: 'Bad Request. Invalid request or validation error.', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/Error', + }, + }, + }, + }, + 415: { + description: + 'Unsupported Media Type. The entity of the request was in a not supported format.', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/Error', + }, + }, + }, + }, + }, + security: [{ default: [] }], + 'x-auth-type': 'Application & Application User', + 'x-throttling-tier': 'Unlimited', + 'x-wso2-application-security': { + 'security-types': ['oauth2'], + optional: false, + }, + }, + }, + '/menu': { + get: { + description: 'Return a list of available menu items', + responses: { + 200: { + description: 'OK. List of APIs is returned.', + headers: {}, + content: { + 'application/json': { + schema: { + type: 'array', + items: { $ref: '#/components/schemas/MenuItem' }, + }, + }, + }, + }, + 406: { + description: + 'Not Acceptable. The requested media type is not supported', + content: { + 'application/json': { + schema: { $ref: '#/components/schemas/Error' }, + }, + }, + }, + }, + security: [{ default: [] }], + 'x-auth-type': 'Application & Application User', + 'x-throttling-tier': 'Unlimited', + 'x-wso2-application-security': { + 'security-types': ['oauth2'], + optional: false, + }, + }, + }, + '/order/{orderId}': { + get: { + description: 'Get details of an Order', + parameters: [ + { + name: 'orderId', + in: 'path', + description: 'Order Id', + required: true, + schema: { type: 'string', format: 'string' }, + }, + ], + responses: { + 200: { + description: 'OK Requested Order will be returned', + headers: {}, + content: { + 'application/json': { + schema: { $ref: '#/components/schemas/Order' }, + }, + }, + }, + 404: { + description: 'Not Found. Requested API does not exist.', + content: { + 'application/json': { + schema: { $ref: '#/components/schemas/Error' }, + }, + }, + }, + 406: { + description: + 'Not Acceptable. The requested media type is not supported', + content: { + 'application/json': { + schema: { $ref: '#/components/schemas/Error' }, + }, + }, + }, + }, + security: [{ default: [] }], + 'x-auth-type': 'Application & Application User', + 'x-throttling-tier': 'Unlimited', + 'x-wso2-application-security': { + 'security-types': ['oauth2'], + optional: false, + }, + }, + put: { + description: 'Update an existing Order', + parameters: [ + { + name: 'orderId', + in: 'path', + description: 'Order Id', + required: true, + schema: { type: 'string', format: 'string' }, + }, + ], + requestBody: { $ref: '#/components/requestBodies/Order' }, + responses: { + 200: { + description: 'OK. Successful response with updated Order', + headers: { + Location: { + description: 'The URL of the newly created resource.', + schema: { type: 'string' }, + }, + 'Content-Type': { + description: 'The content type of the body.', + schema: { type: 'string' }, + }, + }, + content: { + 'application/json': { + schema: { $ref: '#/components/schemas/Order' }, + }, + }, + }, + 400: { + description: 'Bad Request. Invalid request or validation error', + content: { + 'application/json': { + schema: { $ref: '#/components/schemas/Error' }, + }, + }, + }, + 404: { + description: + 'Not Found. The resource to be updated does not exist.', + content: { + 'application/json': { + schema: { $ref: '#/components/schemas/Error' }, + }, + }, + }, + }, + security: [{ default: [] }], + 'x-auth-type': 'Application & Application User', + 'x-throttling-tier': 'Unlimited', + 'x-wso2-application-security': { + 'security-types': ['oauth2'], + optional: false, + }, + }, + delete: { + description: 'Delete an existing Order', + parameters: [ + { + name: 'orderId', + in: 'path', + description: 'Order Id', + required: true, + schema: { type: 'string', format: 'string' }, + }, + ], + responses: { + 200: { description: 'OK. Resource successfully deleted.' }, + 404: { + description: 'Not Found. Resource to be deleted does not exist.', + content: { + 'application/json': { + schema: { $ref: '#/components/schemas/Error' }, + }, + }, + }, + }, + security: [{ default: [] }], + 'x-auth-type': 'Application & Application User', + 'x-throttling-tier': 'Unlimited', + 'x-wso2-application-security': { + 'security-types': ['oauth2'], + optional: false, + }, + }, + }, + }, + 'x-wso2-auth-header': 'Authorization', + 'x-wso2-cors': { + corsConfigurationEnabled: false, + accessControlAllowOrigins: ['*'], + accessControlAllowCredentials: false, + accessControlAllowHeaders: [ + 'authorization', + 'Access-Control-Allow-Origin', + 'Content-Type', + 'SOAPAction', + 'apikey', + 'testKey', + ], + accessControlAllowMethods: [ + 'GET', + 'PUT', + 'POST', + 'DELETE', + 'PATCH', + 'OPTIONS', + ], + }, + 'x-wso2-production-endpoints': { + urls: ['https://sample.wso2.com/am/sample/pizzashack/v1/api/'], + type: 'http', + }, + 'x-wso2-sandbox-endpoints': { + urls: ['https://sample.wso2.com/am/sample/pizzashack/v1/api/'], + type: 'http', + }, + 'x-wso2-basePath': '/pizzashack/1.0.0', + 'x-wso2-transports': ['http', 'https'], + 'x-wso2-application-security': { + 'security-types': ['oauth2'], + optional: false, + }, + 'x-wso2-response-cache': { enabled: false, cacheTimeoutInSeconds: 300 }, + components: { + requestBodies: { + Order: { + content: { + 'application/json': { + schema: { $ref: '#/components/schemas/Order' }, + }, + }, + description: 'Order object that needs to be added', + required: true, + }, + }, + securitySchemes: { + default: { + type: 'oauth2', + flows: { + implicit: { authorizationUrl: 'https://test.com', scopes: {} }, + }, + }, + }, + schemas: { + ErrorListItem: { + required: ['code', 'message'], + properties: { + message: { + type: 'string', + description: 'Description about individual errors occurred', + }, + code: { type: 'integer', format: 'int64' }, + }, + title: + 'Description of individual errors that may have occurred during a request.', + }, + MenuItem: { + required: ['name'], + properties: { + price: { type: 'string' }, + description: { type: 'string' }, + name: { type: 'string' }, + image: { type: 'string' }, + }, + title: 'Pizza menu Item', + }, + Order: { + required: ['orderId'], + properties: { + customerName: { type: 'string' }, + delivered: { type: 'boolean' }, + address: { type: 'string' }, + pizzaType: { type: 'string' }, + creditCardNumber: { type: 'string' }, + quantity: { type: 'number' }, + orderId: { type: 'string' }, + }, + title: 'Pizza Order', + }, + Error: { + required: ['code', 'message'], + properties: { + message: { type: 'string', description: 'Error message.' }, + error: { + type: 'array', + description: + 'If there are more than one error list them out. Ex. list out validation errors by each' + + ' field.', + items: { $ref: '#/components/schemas/ErrorListItem' }, + }, + description: { + type: 'string', + description: 'A detail description about the error message.', + }, + code: { type: 'integer', format: 'int64' }, + moreInfo: { + type: 'string', + description: 'Preferably an url with more details about the error.', + }, + }, + title: 'Error object returned with 4XX HTTP status', + }, + }, + }, +}); + +const getSampleAPIData = () => { + return { + name: 'PizzaShackAPI', + description: 'This is a simple API for Pizza Shack online pizza delivery store.', + context: '/pizzashack', + version: '1.0.0', + transport: ['http', 'https'], + tags: ['pizza'], + policies: ['Unlimited'], + securityScheme: ['oauth2'], + visibility: 'PUBLIC', + gatewayEnvironments: ['Production and Sandbox'], + businessInformation: { + businessOwner: 'Jane Roe', + businessOwnerEmail: 'marketing@pizzashack.com', + technicalOwner: 'John Doe', + technicalOwnerEmail: 'architecture@pizzashack.com', + }, + endpointConfig: { + endpoint_type: 'http', + sandbox_endpoints: { + url: 'https://sample.wso2.com/am/sample/pizzashack/v1/api/', + }, + production_endpoints: { + url: 'https://sample.wso2.com/am/sample/pizzashack/v1/api/', + }, + }, + operations: [ + { + target: '/order/{orderId}', + verb: 'GET', + throttlingPolicy: 'Unlimited', + authType: 'Application & Application User', + }, + { + target: '/order/{orderId}', + verb: 'DELETE', + throttlingPolicy: 'Unlimited', + authType: 'Application & Application User', + }, + { + target: '/order/{orderId}', + verb: 'PUT', + throttlingPolicy: 'Unlimited', + authType: 'Application & Application User', + }, + { + target: '/menu', + verb: 'GET', + throttlingPolicy: 'Unlimited', + authType: 'Application & Application User', + }, + { + target: '/order', + verb: 'POST', + throttlingPolicy: 'Unlimited', + authType: 'Application & Application User', + }, + ], + }; +}; +// To test against internal Pizzashak endpoint +// change https://sample.wso2.com to https://localhost:9443 +const getSampleServiceMeta = () => ({ + name: 'Pizzashack-Endpoint', + description: 'A Catalog Entry that exposes a REST endpoint', + version: 'v1', + serviceKey: 'Pizzashack-Endpoint-1.0.0', + serviceUrl: 'https://sample.wso2.com/am/sample/pizzashack/v1/api/', + definitionType: 'OAS3', +}); + +export { getSampleOpenAPI, getSampleAPIData, getSampleServiceMeta }; diff --git a/cypress/support/pages/adminPortal/ScopeAssignmentsPage.js b/cypress/support/pages/adminPortal/ScopeAssignmentsPage.js new file mode 100644 index 00000000..9263aef5 --- /dev/null +++ b/cypress/support/pages/adminPortal/ScopeAssignmentsPage.js @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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 userRoles = require('../../../support/screenData/userRoles.json') +class ScopeAssignmentsPage{ + static getUrl(){ + return "/admin/settings/scope-mapping"; + } + static getAddScopeMappingButton(){ + return cy.get(".MuiButton-containedPrimary > .MuiButton-label") + } + static getAddNewScopeRoleNameTextBox(){ + return cy.get("#role-input-field-helper-text") + } + + static getAddNewScopeNextButton(){ + return cy.get(".MuiDialogActions-root > div > div > .MuiButton-containedPrimary") + } + + static selectRoleAlias(mappingRole){ + cy.get('.MuiAutocomplete-endAdornment > button[aria-label="Open"]').click(); + //cy.get("#role-select-dropdown-option-1").click(); + + switch(mappingRole){ + case userRoles.admin : + cy.get("#role-select-dropdown-option-0").click(); + break; + case userRoles.Internal_creator : + cy.get("#role-select-dropdown-option-1").click(); + break; + case userRoles.Internal_publisher : + cy.get("#role-select-dropdown-option-2").click(); + break; + case userRoles.Internal_integration_dev : + cy.get("#role-select-dropdown-option-3").click(); + break; + case userRoles.Internal_subscriber : + cy.get("#role-select-dropdown-option-4").click(); + break; + case userRoles.Internal_devops: + cy.get("#role-select-dropdown-option-5").click(); + break; + case userRoles.Internal_analytics : + cy.get("#role-select-dropdown-option-6").click(); + break; + case userRoles.Internal_observer : + cy.get("#role-select-dropdown-option-7").click(); + break; + } + } + + static getAddNewScopeSavetButton(){ + return cy.get(".MuiDialogActions-root > div > div > .MuiButton-containedPrimary") + } + + static getSearchTextBox(){ + return cy.get('input[placeholder="Search by Role Name"]'); + } + + // row index start from 0 + static getRolesRecordOfTableRow(rowIndex){ + return cy.get(`#enhanced-table-checkbox-${rowIndex}`).eq(0); + } + + static getDeleteButtonOfTableRow(rowIndex){ + return cy.get(`#enhanced-table-checkbox-${rowIndex}`).get("span > div > button"); + } + + static getDeleteButtonOfScopeAssignmentDialogOfRole(roleName){ + return cy.get(`#${roleName}`) + } + // tbody.MuiTableBody-root > tr.MuiTableRow-root >th.MuiTableCell-alignRight > span > div > button +} + +export default ScopeAssignmentsPage; \ No newline at end of file diff --git a/cypress/support/pages/carbon/AddNewRoleEnterDetailsPage.js b/cypress/support/pages/carbon/AddNewRoleEnterDetailsPage.js new file mode 100644 index 00000000..623f0e09 --- /dev/null +++ b/cypress/support/pages/carbon/AddNewRoleEnterDetailsPage.js @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class AddNewRoleEnterDetailsPage { + static getUrl(){ + return "/carbon/role/add-step1.jsp"; + } + static getDomainDropdown(){ + return cy.get("#domain") + } + static getRoleNameTextBox(){ + return cy.get("input[name='roleName']"); + } + static getDomainDropdown(){ + return cy.get('#domain'); + } + static getNextButton(){ + return cy.get('input[value="Next >"]'); + } + static getFinishButton(){ + return cy.get(""); + } + static getCancelButton(){ + return cy.get(""); + } +} + +export default AddNewRoleEnterDetailsPage; \ No newline at end of file diff --git a/cypress/support/pages/carbon/AddNewRoleSelectPermissionPage.js b/cypress/support/pages/carbon/AddNewRoleSelectPermissionPage.js new file mode 100644 index 00000000..ba9dc5fc --- /dev/null +++ b/cypress/support/pages/carbon/AddNewRoleSelectPermissionPage.js @@ -0,0 +1,42 @@ + +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class AddNewRoleSelectPermissionPage { + static getUrl(){ + return "/carbon/role/add-step2.jsp"; + } + static getpermissionCheckboxOf(permission){ + return cy.get(permission); + + } + static getFinishButton(){ + return cy.get('input[value="Finish"]') + } + + static getMessageBoxInfo(){ + return cy.get('#messagebox-info') + } + + static getMessageBoxOkButton(){ + return cy.get('.ui-dialog-buttonset > .ui-button') + } + + +} + +export default AddNewRoleSelectPermissionPage; \ No newline at end of file diff --git a/cypress/support/pages/carbon/RolesManagementPage.js b/cypress/support/pages/carbon/RolesManagementPage.js new file mode 100644 index 00000000..09c5f3d1 --- /dev/null +++ b/cypress/support/pages/carbon/RolesManagementPage.js @@ -0,0 +1,50 @@ + +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class RolesManagementPage { + static getUrl(){ + return "/carbon/role/role-mgt.jsp"; + } + static getRoleNameTextBox(){ + return cy.get('input[name="org.wso2.carbon.role.filter"]'); + + } + static getSearchRolesButton(){ + return cy.get('input[value="Search Roles"]') + } + + static getDeleteButtonOfRole(roleName){ + return cy.get(`[onClick="deleteUserGroup(\\'${roleName}\\')"]`) + } + + static getDialogYesButton(){ + return cy.get('div.ui-dialog-buttonset > button.ui-button').first() + } + // there can be multiple dialog boxes if we search and delete + static getDialogOkButton(index){ + return cy.get('.ui-dialog-buttonpane button').eq(index) + } + static getNoMatchingRolesFoundDialogBox_MessageInfoDivSelectorOnly(){ + return '#messagebox-info' + } + + + +} + +export default RolesManagementPage; \ No newline at end of file diff --git a/cypress/support/pages/carbon/UsersManagementPage.js b/cypress/support/pages/carbon/UsersManagementPage.js new file mode 100644 index 00000000..17e65a51 --- /dev/null +++ b/cypress/support/pages/carbon/UsersManagementPage.js @@ -0,0 +1,55 @@ + +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class UsersManagementPage { + static getUrl(){ + return "/carbon/user/user-mgt.jsp"; + } + static getEnterUsernameTextBox(){ + return cy.get('input[name="org.wso2.carbon.user.filter"]'); + + } + static getSearchUsershButton(){ + return cy.get('input[value="Search Users"]') + } + + static getNoMatchingUsersFoundDialogBox_OKButton(){ + return cy.get("div.ui-dialog-buttonset > button.ui-button") + } + + static getNoMatchingUsersFoundDialogBox_MessageInfoDiv(){ + return cy.get('#messagebox-info') + } + static getNoMatchingUsersFoundDialogBox_MessageInfoDivSelectorOnly(){ + return '#messagebox-info' + } + static getDeleteButtonOfUser(userName){ + return cy.get(`[onClick="deleteUser(\\'${userName}\\')"]`) + } + static getDeleteDialogYesButton(){ + return cy.get('.ui-dialog .ui-dialog-buttonpane button:first-child').first() + } + // there can be multiple dialog boxes if we search and delete + static getDialogOkButton(index){ + return cy.get('.ui-dialog-buttonpane button').eq(index) + } + + +} + +export default UsersManagementPage; \ No newline at end of file diff --git a/cypress/support/pages/devportal/DevPortalApisPage.js b/cypress/support/pages/devportal/DevPortalApisPage.js new file mode 100644 index 00000000..a9fdcaa5 --- /dev/null +++ b/cypress/support/pages/devportal/DevPortalApisPage.js @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +import Utils from "@support/utils"; +import DevportalComonPage from './DevportalComonPage'; +class DevPortalApisPage extends DevportalComonPage{ + static getUrl(){ + return "/devportal/apis"; + } + static visitAPIsPage(){ + cy.visit(`${Utils.getAppOrigin()}` + this.getUrl()) + } + static getApiLinkOfAPI(apiName){ + return cy.get(`a[area-label="Go to ${apiName}"]`) + } +} + +export default DevPortalApisPage; \ No newline at end of file diff --git a/cypress/support/pages/devportal/DevportalComonPage.js b/cypress/support/pages/devportal/DevportalComonPage.js new file mode 100644 index 00000000..c920e893 --- /dev/null +++ b/cypress/support/pages/devportal/DevportalComonPage.js @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class DevportalComonPage { + getUrl(apiID){ + return `devportal`; + } + getToolTip(){ + return cy.get('div[role="status"][aria-live="polite"]') + } + static waitUntillLoadingComponentsExit(){ + cy.get('.apim-dual-ring',{timeout:25000}).should('not.exist');; + } +} +export default DevportalComonPage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/APIBasicInfoPage.js b/cypress/support/pages/publisher/APIBasicInfoPage.js new file mode 100644 index 00000000..a8ce5d94 --- /dev/null +++ b/cypress/support/pages/publisher/APIBasicInfoPage.js @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class APIBasicInfoPage { + static getUrl(apiID){ + return `publisher/apis/${apiID}/configuration`; + } + static getTagsTextBox(){ + return cy.get('#tags') + } + static getDefaultVersionYesRadio(){ + return cy.get('input[name="defaultVersion"][value="true"]') + } + static getDefaultVersionNoRadio(){ + return cy.get('input[name="defaultVersion"][value="false"]') + } + static getThirdPartyYesRadio(){ + return cy.get('input[name="advertised"][value="true"]') + } + static getThirdPartyNoRadio(){ + return cy.get('input[name="advertised"][value="false"]') + } + static getSaveButton(){ + return cy.get('#design-config-save-btn') + } + static getUpdateToolTip(){ + return cy.get('div[role="status"][aria-live="polite"]') + } + static getEditDescriptionButton(){ + return cy.get('#edit-api-thumbnail-btn + div > button') + } + static getEditThumbnailButton(){ + return cy.get('#edit-api-thumbnail-btn > button') + } + static getThumbnailUploadButton(){ + return cy.get('#edit-api-thumbnail-upload-btn') + } + static getDescriptionTextArea(){ + return cy.get('#itest-description-textfield') + } + static getUpdateContectButton(){ + return cy.get('div[role="dialog"] > header > div > div > div:nth-child(2) > button') + } + static getThumbnailFileUpload(){ + return cy.get('input[type="file"]') + } + + // Actions + static editDescriptionAndUpdateContent(description){ + this.getEditDescriptionButton().should('be.visible').should("have.text","Edit description").click({force: true}) + this.getDescriptionTextArea().type(description) + this.getUpdateContectButton().click() + } +} +export default APIBasicInfoPage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/APIMenuPage.js b/cypress/support/pages/publisher/APIMenuPage.js new file mode 100644 index 00000000..09c855fd --- /dev/null +++ b/cypress/support/pages/publisher/APIMenuPage.js @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +import PublisherComonPage from './PublisherComonPage'; +class APIMenuPage extends PublisherComonPage{ + static getUrl(apiID){ + return `publisher/apis/${apiID}/overview`; + } + static getPortalConfigurationsMenu(){ + return cy.get('#itest-api-details-portal-config-acc > div > div > p') + } + static getPortalConfigurations_BasicInforMenu(){ + return cy.get('#left-menu-itemDesignConfigurations') + } + static getApiConfigurationsMenu(){ + cy.get('#itest-api-details-api-config-acc') + } + static getAPIConfigurationsMenu(){ + return cy.get('#itest-api-details-api-config-acc') + } + static getAPIConfigurationsMenu_ResourcesMenu(){ + return cy.get('#left-menu-itemresources') + } + static getAPIConfigurationsMenu_LocalScopesMenu(){ + return cy.get('#left-menu-itemLocalScopes') + } + static getAPIConfigurationsMenu_DocumentsMenu(){ + return cy.get('#left-menu-itemdocuments') + } + static getDeploy_DeployementsMenu(){ + return cy.get('#left-menu-itemdeployments') + } + static getPublish_LifecycleMenu(){ + return cy.get('#left-menu-itemlifecycle') + } +} +export default APIMenuPage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/ApisHomePage.js b/cypress/support/pages/publisher/ApisHomePage.js new file mode 100644 index 00000000..758484ba --- /dev/null +++ b/cypress/support/pages/publisher/ApisHomePage.js @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +import Utils from "@support/utils"; +import PublisherComonPage from './PublisherComonPage'; +class ApisHomePage extends PublisherComonPage { + static getUrl(){ + return "/publisher/apis"; + } + static visitAPIsPage(){ + cy.visit(`${Utils.getAppOrigin()}` + this.getUrl()) + } + static getCreateAPIButton(){ + return cy.get('#itest-create-api-menu-button') + } + static getCreateAPIDialog_StartFromScratchLink(){ + return cy.get('#itest-id-landing-rest-create-default') + } + static getApiNameVersionH1(){ + return cy.get("#itest-api-name-version") + } + static getApiStateDiv(){ + return cy.get('div[data-testid="itest-api-state"]') + } + static getDeleteButtonOfAPI(apiName){ // e.g PizzaShack1.0.0 + return cy.get(`div[data-testid="card-action-${apiName}"] > div:nth-child(2) > div > button[id="itest-id-deleteapi-icon-button"]`) + } + static getDeleteAPIDialog_DeletButton(){ + return cy.get('#itest-id-deleteconf') + } + static getApiLinkOfAPI(apiName){ + return cy.get(`a[aria-label="${apiName} Thumbnail"]`) + } + static getSearchTestBox(){ + return cy.get("#searchQuery") + } + static getAllVisibleAPIs_divList(){ + return cy.get('div[class^="MuiPaper-root"][data-testid^="card-"]') + } +} + +export default ApisHomePage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/CreateRestAPIPage.js b/cypress/support/pages/publisher/CreateRestAPIPage.js new file mode 100644 index 00000000..bd5ea4c7 --- /dev/null +++ b/cypress/support/pages/publisher/CreateRestAPIPage.js @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +import Utils from "@support/utils"; +class CreateRestAPIPage { + static getUrl(){ + return "/publisher/apis/create/rest"; + } + static visitAPIsPage(){ + cy.visit(`${Utils.getAppOrigin()}` + this.getUrl()) + } + static getAPINameTextBox(){ + return cy.get('#itest-id-apiname-input') + } + static getAPIContextTextBox(){ + return cy.get('#itest-id-apicontext-input') + } + static getAPIVesionTextBox(){ + return cy.get('#itest-id-apiversion-input') + } + static getAPIEndpointTextBox(){ + return cy.get('#itest-id-apiendpoint-input') + } + static getAPICreateButton(){ + return cy.get('#itest-create-default-api-button') + } + static getAPICreateAndPublishButton(){ + return cy.get('#itest-id-apicreatedefault-createnpublish') + } + + +} + +export default CreateRestAPIPage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/DeploymentsPage.js b/cypress/support/pages/publisher/DeploymentsPage.js new file mode 100644 index 00000000..2122718d --- /dev/null +++ b/cypress/support/pages/publisher/DeploymentsPage.js @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class DeploymentsPage { + static getUrl(apiID){ + return cy.get(`publisher/apis/${apiID}/deployments`); + } + // getLocalScopesHeader(){ + // return cy.get('#itest-api-details-scopes-onboarding-head') + // } + static getDeployButton(){ + return cy.get('#deploy-btn') + } + static clickDeployAndWaitUntillComplete(){ + cy.intercept('GET', `**/revisions?query=deployed**`).as('revisions'); + this.getDeployButton().click(); + cy.wait('@revisions',{timeout: Cypress.config().largeTimeout}).its('response.statusCode').should('equal', 200) + // further you can handle UI tooltip + } + +} +export default DeploymentsPage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/DocumentsPage.js b/cypress/support/pages/publisher/DocumentsPage.js new file mode 100644 index 00000000..0059cfad --- /dev/null +++ b/cypress/support/pages/publisher/DocumentsPage.js @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class DocumentsPage { + static getUrl(apiID){ + return cy.get(`publisher/apis/${apiID}/documents`); + } + static getDocumentsHeader(){ + return cy.get('#itest-api-details-documents-head') + } + static getAddNewDocumentButton(){ + return cy.get('#add-new-document-btn') + } + static getNameTextBox(){ + return cy.get('#doc-name') + } + static getSummaryTextBox(){ + return cy.get('#doc-summary') + } + static getType_HowToCheckBox(){ + return cy.get('input[value="HOWTO"]') + } + static getSource_InLineCheckBox(){ + return cy.get('input[value="INLINE"]') + } + static getAddDocumentButton(){ + return cy.get('#add-document-btn') + } + static getBackToListiningButton(){ + return cy.get('#add-content-back-to-listing-btn') + } + static getDocumentNameOfTableRow(tableRowIndex){ // start form 0 + return cy.get(`td[data-testid="MuiDataTableBodyCell-1-${tableRowIndex}"]`) + } +} +export default DocumentsPage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/LifecyclePage.js b/cypress/support/pages/publisher/LifecyclePage.js new file mode 100644 index 00000000..d9b59fca --- /dev/null +++ b/cypress/support/pages/publisher/LifecyclePage.js @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class LifecyclePage { + static getUrl(apiID){ + return cy.get(`publisher/apis/${apiID}/lifecycle`); + } + static getLifecycleHeader(){ + return cy.get('#itest-api-details-lifecycle-head') + } + static getPublishButton(){ + return cy.get('button[data-testid="Publish-btn"]') + } + static getBlockButton(){ + return cy.get('button[data-testid="Block-btn') + } + + + // composite functions + static clickPublishAndWaitUntillComplete(){ + cy.intercept('GET', `**/revisions?query=deployed**`).as('revisions'); + this.getPublishButton().click(); + cy.wait('@revisions',{timeout: Cypress.config().largeTimeout}).its('response.statusCode').should('equal', 200) + } + static clickBlockAndWaitUntillComplete(){ + cy.intercept('GET', `**/revisions?query=deployed**`).as('revisions'); + this.getBlockButton().click(); + cy.wait('@revisions',{timeout: Cypress.config().largeTimeout}).its('response.statusCode').should('equal', 200) + } + + +} +export default LifecyclePage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/LocalScopesPage.js b/cypress/support/pages/publisher/LocalScopesPage.js new file mode 100644 index 00000000..c9ccfee5 --- /dev/null +++ b/cypress/support/pages/publisher/LocalScopesPage.js @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class LocalScopesPage { + static getUrl(apiID){ + return cy.get(`publisher/apis/${apiID}/scopes`); + } + static getLocalScopesHeader(){ + return cy.get('#itest-api-details-scopes-onboarding-head') + } + static getCreateScopesButton(){ + return cy.get('#create-scope-btn') + } + static getScopeNameTextBox(){ + return cy.get('#name') + } + static getScopeDisplayNameTextBox(){ + return cy.get('#displayName') + } + static getScopeDescriptionTextBox(){ + return cy.get('#description') + } + static getRolesTextBox(){ + return cy.get('#roles-input') + } + static getSaveButton(){ + return cy.get('#scope-save-btn') + } + +} +export default LocalScopesPage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/PublisherComonPage.js b/cypress/support/pages/publisher/PublisherComonPage.js new file mode 100644 index 00000000..e903c99f --- /dev/null +++ b/cypress/support/pages/publisher/PublisherComonPage.js @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class PublisherComonPage { + static getUrl(apiID){ + return `publisher`; + } + getToolTip(){ + return cy.get('div[role="status"][aria-live="polite"]') + } + // Todo : refactor and remove + waitUntillPublisherLoadingSpinnerExit(){ + cy.get('#apim-loader > span',{timeout:25000}).should('not.exist'); + } + static waitUntillLoadingComponentsExit(){ + cy.get('#apim-loader > span',{timeout:25000}).should('not.exist'); + } + +} +export default PublisherComonPage; \ No newline at end of file diff --git a/cypress/support/pages/publisher/ResourcesPage.js b/cypress/support/pages/publisher/ResourcesPage.js new file mode 100644 index 00000000..4b1603ee --- /dev/null +++ b/cypress/support/pages/publisher/ResourcesPage.js @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2022, WSO2 LLC. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you 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. + */ +class ResourcesPage { + static getUrl(apiID){ + return `publisher/apis/${apiID}/resources`; + } + static getResourcePageHeader(){ + return cy.get('#itest-api-details-resources-head') + } + static getSaveRerouceButton(){ + return cy.get('#resources-save-operations') + } + static selectAndAddNewOperation(httpVerb,uriPattern){ + cy.get('#operation-target').type(uriPattern, { + parseSpecialCharSequences: false, + }) + cy.get('#add-operation-selection-dropdown').click() + + switch(httpVerb) { + case "GET": + cy.get('#add-operation-get').click() + break; + case "POST": + cy.get('#add-operation-post').click() + break; + case "PUT": + cy.get('#add-operation-put').click() + break; + // TODO : add rest of the httpVerbs + } + cy.get('#menu-verbs').trigger('click') // to remove this covered element + cy.get('#add-operation-button').click() + } + + static getRowOfResource(uriPattern){ // e.g. "/order" + return cy.get(`div[aria-labelledby="${uriPattern}"] > div > div > div > div`) + } + static getDescriptionTextAreaOfResource(resourceAlis){ // e.g. "post/order" + return cy.get(`div[data-testid="description-${resourceAlis}"] > div > textarea`) + } + static getSummaryTextAreaOfResource(resourceAlis){ // e.g. "post/order" + return cy.get(`div[data-testid="summary-${resourceAlis}"] > div > textarea`) + } + static selectOperationScopeOfResource(resourceAlis,scopeName){ // e.g. ("post/order","order_pizza") + cy.get(`div[id="${resourceAlis}-operation-scope-select"]`).click() + cy.get(`li[id="${resourceAlis}-operation-scope-${scopeName}"]`).click() + cy.get('#menu-').trigger('click') // to get back the focus , pages is coverd from this element + } + static getSaveButton(){ + return cy.get('button[data-testid="custom-select-save-button"]') + } +} +export default ResourcesPage; \ No newline at end of file diff --git a/cypress/support/utils.js b/cypress/support/utils.js new file mode 100644 index 00000000..5f0dc3b1 --- /dev/null +++ b/cypress/support/utils.js @@ -0,0 +1,196 @@ +import { ADJECTIVES, NOUNS } from "./mockData/names-const" + +export default class Utils { + static getRandomRange(min = 0, max = 20) { + return Math.round(Math.random() * (max - min) + min); + } + static getRandomDate(res = 1000) { + return Math.floor(Date.now() / res); + + } + static getRandomString(length = 8) { + return Math.random().toString(36).substring(4).substring(0, length); + } + + static getAppOrigin() { + return Cypress.config().baseUrl; + } + + static capFirst(string) { + return string.charAt(0).toUpperCase() + string.slice(1); + } + + static generateName() { + return ( + ADJECTIVES[Utils.getRandomRange(0, ADJECTIVES.length + 1)] + + "-" + + NOUNS[Utils.getRandomRange(0, NOUNS.length + 1)] + ) + } + static getApiToken() { + return new Cypress.Promise((resolve, reject) => { + try { + cy.getCookie('WSO2_AM_TOKEN_1_Default') + .then((cookieP1) => { + cy.getCookie('AM_ACC_TOKEN_DEFAULT_P2') + .then((cookieP2) => { + resolve(`${cookieP1.value}${cookieP2.value}`); + }) + }); + } catch (e) { + reject('Error while extracting token'); + } + }) + } + + static addAPIfromSwagger(data) { + let { type, name, version, context, payload } = data; + type = type || 'rest'; + name = name || Utils.generateName(); + context = context || name.replace(/[^A-Z0-9]/ig, "_"); + version = version || '1.0.0'; + + const newPayload = payload || `{"name":"${name}","version":"${version}","context":"${context}","policies":["Unlimited"]}`; + return new Cypress.Promise((resolve, reject) => { + try { + Utils.getApiToken() + .then((token) => { + const curl = `curl -k -X POST \ + -H "Content-Type: application/json" \ + -d '${newPayload}' \ + -H "Authorization: Bearer ${token}" "${Cypress.config().baseUrl}/api/am/publisher/v2/apis/import-openapi"`; + cy.exec(curl).then(result => { + const apiId = JSON.parse(result.stdout); + resolve(apiId.id); + }) + }) + } catch (e) { + reject('Error while creating api'); + } + }) + }; + + static addAPI(data) { + let { type, name, version, context, payload } = data; + type = type || 'rest'; + name = name || Utils.generateName(); + context = context || name.replace(/[^A-Z0-9]/ig, "_"); + version = version || '1.0.0'; + + const newPayload = payload || `{"name":"${name}","version":"${version}","context":"${context}","policies":["Unlimited"]}`; + return new Cypress.Promise((resolve, reject) => { + try { + Utils.getApiToken() + .then((token) => { + const curl = `curl -k -X POST \ + -H "Content-Type: application/json" \ + -d '${newPayload}' \ + -H "Authorization: Bearer ${token}" "${Cypress.config().baseUrl}/api/am/publisher/v3/apis"`; + cy.exec(curl).then(result => { + cy.log(result.code); + cy.log(result.stdout); + cy.log(result.stderr); + const apiId = JSON.parse(result.stdout); + resolve(apiId.id); + }) + }) + } catch (e) { + reject('Error while creating api'); + } + }) + }; + + static addAPIWithEndpoints(data) { + let { type, name, version, context, endpoint } = data; + type = type || 'rest'; + name = name || Utils.generateName(); + context = context || name.replace(/[^A-Z0-9]/ig, "_"); + version = version || '1.0.0'; + endpoint = endpoint || 'https://lh'; + const newPayload = `{"name":"${name}","version":"${version}","context":"${context}","policies":["Unlimited"], "endpointConfig":{"endpoint_type":"http","sandbox_endpoints":{"url":"${endpoint}"},"production_endpoints":{"url":"${endpoint}"}}}`; + return Utils.addAPI({...data, payload: newPayload}); + } + + static publishAPI(apiId) { + return new Cypress.Promise((resolve, reject) => { + try { + Utils.getApiToken() + .then((token) => { + const curl = `curl -k -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer ${token}" "${Cypress.config().baseUrl}/api/am/publisher/v3/apis/change-lifecycle?action=Publish&apiId=${apiId}"`; + cy.exec(curl).then(result => { + resolve(result.stdout); + }) + }) + } catch (e) { + reject('Error while publishing api'); + } + }) + } + + static deleteAPI(apiId) { + // todo need to remove this check after `console.err(err)` -> `console.err(err)` in Endpoints.jsx + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + return new Cypress.Promise((resolve, reject) => { + try { + Utils.getApiToken() + .then((token) => { + const curl = `curl -k -X DELETE \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer ${token}" "${Cypress.config().baseUrl}/api/am/publisher/v3/apis/${apiId}"`; + cy.exec(curl).then(result => { + resolve(result.stdout); + }) + }) + } catch (e) { + reject('Error while deleting api'); + } + }) + } + + static deleteAPIProduct(productId) { + // todo need to remove this check after `console.err(err)` -> `console.err(err)` in Endpoints.jsx + Cypress.on('uncaught:exception', (err, runnable) => { + // returning false here prevents Cypress from + // failing the test + return false + }); + return new Cypress.Promise((resolve, reject) => { + try { + Utils.getApiToken() + .then((token) => { + const curl = `curl -k -X DELETE \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer ${token}" "${Cypress.config().baseUrl}/api/am/publisher/v3/api-products/${productId}"`; + cy.exec(curl).then(result => { + resolve(result.stdout); + }) + }) + } catch (e) { + reject('Error while deleting api product'); + } + }) + } + + static getUserInfo() { + return { + publisher: 'publisher', + developer: 'developer', + password: 'test123', + carbonUsername: 'admin', + carbonPassword: 'admin', + tenantUser: 'tenantUser', + testTenant: 'wso2.com', + superTenant: 'carbon.super' + } + } + + static getTenentUser(username, tenant) { + return `${username}@${tenant}`; + } +} diff --git a/init.sh b/init.sh deleted file mode 100644 index 5dc88d0d..00000000 --- a/init.sh +++ /dev/null @@ -1,85 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -#TODO: compete the script when TestGrid implements support for this - -set -e - -keyName=qaKey -sgName=msf4j-security-group -amiID=ami-cd226cb2 -user=ubuntu - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) -userData=$scriptPath/user-data.txt - -echo "working directory : "$scriptPath - -# Launch an EC2 instance for deploying MSF4J services - -# Create a security group -echo "Creating secuity group..." -sgId=$(aws ec2 create-security-group --group-name $sgName --description "security group for msf4j instance" --query 'GroupId' | cut -d '"' -f2) - -# Define inbound traffic rules -echo "Set inbound traffic rules..." -aws ec2 authorize-security-group-ingress --group-name $sgName --protocol tcp --port 22 --cidr 0.0.0.0/0 --output text -aws ec2 authorize-security-group-ingress --group-name $sgName --protocol tcp --port 8080 --cidr 0.0.0.0/0 --output text -aws ec2 authorize-security-group-ingress --group-name $sgName --protocol tcp --port 8081 --cidr 0.0.0.0/0 --output text - -# Create new key pair -echo "Generating key-pair..." -output=$(aws ec2 create-key-pair --key-name $keyName --query 'KeyMaterial' --output text > key.pem) - -# Change permission of key -chmod 400 key.pem - -# Run EC2 instance using custom ami -echo "Launching EC2 instance..." -instanceId=$(aws ec2 run-instances --image-id $amiID --security-group-ids $sgId --count 1 --instance-type t2.micro --key-name $keyName --user-data file://$userData --query 'Instances[0].InstanceId' | cut -d '"' -f2) - -# Copy instance and sg ids to cleanup.sh -sed -i "s|^\(instanceId\s*=\s*\).*\$|\1${instanceId}|" $scriptPath/cleanup.sh -sed -i "s|^\(sgId\s*=\s*\).*\$|\1${sgId}|" $scriptPath/cleanup.sh - -# Wait till instance state is running -instanceState=$(aws ec2 describe-instance-status --instance-id $instanceId --query 'InstanceStatuses[0].InstanceState.Name' | cut -d '"' -f2) -counter=1 -while [ $instanceState != "running" -a $counter -le 10 ]; do - sleep 15 - instanceState=$(aws ec2 describe-instance-status --instance-id $instanceId --query 'InstanceStatuses[0].InstanceState.Name' | cut -d '"' -f2) - counter=$((counter+1)) -done - -# Get instance IP -ip=$(aws ec2 describe-instances --instance-ids $instanceId --query 'Reservations[0].Instances[0].PublicIpAddress' | cut -d '"' -f2) - -# Wait till instance is ready to serve - -counter=1 -l_TELNET='echo "quit" | '$ip' 22 | grep "Escape character is"' -while [ "$?" -ne 0 -a $counter -le 20 ]; do - sleep 6 - l_TELNET='echo "quit" | '$ip' 22 | grep "Escape character is"' - counter=$((counter+1)) -done - -# Copy instance and sg ids to cleanup.sh -sed -i "s|^\(MSF4JHost\s*=\s*\).*\$|\1${ip}|" $scriptPath/scenario*/resources/user.properties -sed -i "s|^\(msf4jServiceHost\s*=\s*\).*\$|\1${ip}|" $scriptPath/scenario*/resources/user.properties - -sleep 120 diff --git a/integrationtests/external-endpoint/const.py b/integrationtests/external-endpoint/const.py deleted file mode 100644 index e5fe6741..00000000 --- a/integrationtests/external-endpoint/const.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -INFRA_PROPERTY_FILE_NAME = "infrastructure.properties" -LOG_FILE_NAME = "integration.log" -LOG_STORAGE = "logs" -LOG_FILE_PATHS = {"product-apim": [ - "modules/integration/tests-integration/tests-backend/target/surefire-reports/emailable-report.html", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/index.html", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/TEST-TestSuite.xml", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/testng.css", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/testng-results.xml", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/TestSuite.txt", - "modules/integration/tests-integration/tests-backend/target/logs/automation.log"], - "product-is": [], - "product-ei": []} - diff --git a/integrationtests/external-endpoint/requirements.txt b/integrationtests/external-endpoint/requirements.txt deleted file mode 100644 index 8c9b85d9..00000000 --- a/integrationtests/external-endpoint/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -wget==3.2 -pylint==1.9.2 -pymysql==0.9.0 -sqlparse==0.2.4 -requests==2.19.1 -lxml==4.2.4 diff --git a/integrationtests/external-endpoint/run-intg-test.py b/integrationtests/external-endpoint/run-intg-test.py deleted file mode 100644 index 057a3e4f..00000000 --- a/integrationtests/external-endpoint/run-intg-test.py +++ /dev/null @@ -1,326 +0,0 @@ -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -# importing required modules -import sys -from xml.etree import ElementTree as ET -import subprocess -import wget -import logging -import inspect -import os -import shutil -import pymysql -import sqlparse -import stat -import re -import lxml.etree as XSET -from pathlib import Path -import urllib.request as urllib2 -from xml.dom import minidom -from subprocess import Popen, PIPE -from const import INFRA_PROPERTY_FILE_NAME, LOG_FILE_NAME, LOG_STORAGE, LOG_FILE_PATHS - -git_repo_url = None -git_branch = None -workspace = None -dist_name = None -dist_zip_name = None -product_id = None -log_file_name = None -constant_host = None -target_path = None -tag_name = None -product_version = None -database_config = {} -lb_host = None -lb_port = None -lb_http_port = None -test_mode = None -offset = None - -def read_proprty_files(): - global git_repo_url - global git_branch - global workspace - global product_id - global database_config - global lb_host - global lb_port - global lb_http_port - global test_mode - global offset - - workspace = os.getcwd() - property_file_paths = [] - infra_prop_path = Path(workspace + "/" + INFRA_PROPERTY_FILE_NAME) - - if Path.exists(infra_prop_path): - property_file_paths.append(infra_prop_path) - - for path in property_file_paths: - with open(path, 'r') as filehandle: - for line in filehandle: - if line.startswith("#"): - continue - prop = line.split("=") - key = prop[0] - val = prop[1] - if key == "ProductGITURL": - git_repo_url = val.strip().replace('\\', '') - product_id = git_repo_url.split("/")[-1].split('.')[0] - elif key == "ProductGITBranch": - git_branch = val.strip() - elif key == "TestMode": - test_mode = val.strip() - elif key == "LBHost": - lb_host = val.strip() - elif key == "LBPort": - lb_port = val.strip() - elif key == "LBHTTPPort": - lb_http_port = val.strip() - elif key == "Offset": - offset = int(val.strip()) - - else: - raise Exception("Infra Property file is not in the workspace: " + workspace) - - -def validate_property_readings(): - global lb_port - global lb_http_port - missing_values = "" - if git_repo_url is None: - missing_values += " -PRODUCT_GIT_URL- " - if product_id is None: - missing_values += " -product-id- " - if git_branch is None: - missing_values += " -PRODUCT_GIT_BRANCH- " - if lb_host is None: - missing_values += " -LB_HOST- " - if lb_port is None: - lb_port = "443" - if lb_http_port is None: - lb_http_port = "80" - - if missing_values != "": - logger.error('Invalid property file is found. Missing values: %s ', missing_values) - return False - else: - return True - - -def function_logger(file_level, console_level=None): - global log_file_name - log_file_name = LOG_FILE_NAME - function_name = inspect.stack()[1][3] - logger = logging.getLogger(function_name) - # By default, logs all messages - logger.setLevel(logging.DEBUG) - - if console_level != None: - # StreamHandler logs to console - ch = logging.StreamHandler() - ch.setLevel(console_level) - ch_format = logging.Formatter('%(asctime)s - %(message)s') - ch.setFormatter(ch_format) - logger.addHandler(ch) - - # log in to a file - fh = logging.FileHandler("{0}.log".format(function_name)) - fh.setLevel(file_level) - fh_format = logging.Formatter('%(asctime)s - %(lineno)d - %(levelname)-8s - %(message)s') - fh.setFormatter(fh_format) - logger.addHandler(fh) - - return logger - -def copy_file(source, target): - """Copy the source file to the target. - """ - shutil.copy(source, target) - - -def build_module(module_path): - """Build a given module. - """ - logger.info('Start building a module. Module: ' + str(module_path)) - if sys.platform.startswith('win'): - subprocess.call(['mvn', 'clean', 'install', '-B', - '-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn'], - shell=True, cwd=module_path) - else: - subprocess.call(['mvn', 'clean', 'install', '-B', - '-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn'], - cwd=module_path) - logger.info('Module build is completed. Module: ' + str(module_path)) - - -def save_log_files(): - log_storage = Path(workspace + "/" + LOG_STORAGE) - if not Path.exists(log_storage): - Path(log_storage).mkdir(parents=True, exist_ok=True) - log_file_paths = LOG_FILE_PATHS[product_id] - if log_file_paths: - for file in log_file_paths: - absolute_file_path = Path(workspace + "/" + product_id + "/" + file) - if Path.exists(absolute_file_path): - copy_file(absolute_file_path, log_storage) - else: - logger.error("File doesn't contain in the given location: " + str(absolute_file_path)) - - -def clone_repo(): - """Clone the product repo - """ - try: - subprocess.call(['git', 'clone', '--branch', git_branch, git_repo_url], cwd=workspace) - logger.info('product repository cloning is done.') - except Exception as e: - logger.error("Error occurred while cloning the product repo: ", exc_info=True) - -def create_output_property_fle(): - """Create output property file which is used when generating email - """ - output_property_file = open("output.properties", "w+") - git_url = git_repo_url + "/tree/" + git_branch - output_property_file.write("GIT_LOCATION=%s\r\n" % git_url) - output_property_file.write("GIT_REVISION=%s\r\n" % tag_name) - output_property_file.close() - - -def replace_file(source, destination): - """Replace source file to the destination - """ - logger.info('replacing files from:' + str(source) + "to: " + str(destination)) - shutil.move(source, destination) - -def port_with_offset(port,offset): - return port + offset - -def setPlatformTestHostConfig(file) : - if Path.exists(file): - datafile=str(file) - xmlparse = XSET.parse(datafile) - xslt = XSET.parse(datafile) - transform = XSET.XSLT(xslt) - newdom = transform(xmlparse) - root = newdom.getroot() - - PLATFORM_TEST_HOST_CONFIG = { "xs:coverage/text()" : "true" , - "xs:instance[@name='store']/xs:hosts/xs:host/text()" : lb_host, - "xs:instance[@name='publisher']/xs:hosts/xs:host/text()" : lb_host, - "xs:instance[@name='keyManager']/xs:hosts/xs:host/text()" : lb_host, - "xs:instance[@name='gateway-mgt']/xs:hosts/xs:host/text()" : lb_host, - "xs:instance[@name='gateway-wrk']/xs:hosts/xs:host/text()" : lb_host, - "xs:instance[@name='backend-server']/xs:hosts/xs:host/text()" : lb_host, - "xs:instance[@name='backend-server']/xs:hosts/xs:host/text()" : "localhost", - "xs:instance/xs:ports/xs:port[@type='http']/text()" : lb_http_port, - "xs:instance/xs:ports/xs:port[@type='https']/text()" : lb_port, - "xs:instance/xs:ports/xs:port[@type='nhttp']/text()" : str(port_with_offset(8280,offset)), - "xs:instance/xs:ports/xs:port[@type='nhttps']/text()" : str(port_with_offset(8243,offset)), - "xs:instance[@name='backend-server']/xs:ports/xs:port[@type='http']/text()" : str(port_with_offset(9763,offset)), - "xs:instance[@name='backend-server']/xs:ports/xs:port[@type='https']/text()" : str(port_with_offset(9443,offset)) - } - - keysArray = PLATFORM_TEST_HOST_CONFIG.keys() - print(keysArray) - for key in keysArray: - for conf in root.findall('{http://www.w3.org/1999/XSL/Transform}template'): - if conf.attrib['match']==key: - conf.text = PLATFORM_TEST_HOST_CONFIG.get(key) - newdom.write(str(file)) - logger.info('Platform test host configurations successfully completed for: ' + str(file)) - - else: - logger.error("File does not exists in path " + str(file) , exc_info=True) - -def build_module_param(module_path, mvn_param): - """Build a given module for platform tests. - """ - logger.info('Start building a module. Module: ' + str(module_path)) - subprocess.call(['mvn', 'clean', 'install', '-B', - '-Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn', mvn_param], - cwd=module_path) - logger.info('Platform module build is completed. Module: ' + str(module_path)) - -def cert_generation(lb_host, lb_port, cert_path): - """Importing the cert to the test client. - """ - logger.info('Importing the product cert to the test client') - cmd1 = "echo | openssl s_client -servername " + lb_host + " -connect "+lb_host+":"+lb_port+ " 2>/dev/null | openssl x509 -text > "+str(cert_path)+"/opensslcert.txt" - cmd2 = "keytool -import -trustcacerts -alias testprod3 -file "+str(cert_path)+"/opensslcert.txt -keystore "+str(cert_path)+"/wso2carbon.jks -storepass wso2carbon -noprompt" - cmd3 = "rm -rf "+str(cert_path)+"/opensslcert.txt" - os.system(cmd1) - os.system(cmd2) - os.system(cmd3) - -def host_mapping(lb_host): - if lb_host not in open('/etc/hosts').read(): - logger.info('Configuring the host mapping ') - lb_ip = os.popen("ping -c 1"+ lb_host +"| grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'").read() - cmd = "sudo echo "+lb_ip+" "+lb_host+" >> /etc/hosts" - os.system(cmd) - else: - logger.info('Hostname already defined') - -def main(): - try: - global logger - global dist_name - logger = function_logger(logging.DEBUG, logging.DEBUG) - if sys.version_info < (3, 6): - raise Exception( - "To run run-intg-test.py script you must have Python 3.6 or latest. Current version info: " + sys.version_info) - read_proprty_files() - if not validate_property_readings(): - raise Exception( - "Property file doesn't have mandatory key-value pair. Please verify the content of the property file " - "and the format") - # clone the repository - clone_repo() - - if test_mode == "DEBUG": - testng_source = Path(workspace + "/" + "testng.xml") - testng_destination = Path(workspace + "/" + product_id + "/" + - 'modules/integration/tests-integration/tests-backend/src/test/resources/testng.xml') - testng_server_mgt_source = Path(workspace + "/" + "testng-server-mgt.xml") - testng_server_mgt_destination = Path(workspace + "/" + product_id + "/" + - 'modules/integration/tests-integration/tests-backend/src/test/resources/testng-server-mgt.xml') - # replace testng source - replace_file(testng_source, testng_destination) - # replace testng server mgt source - replace_file(testng_server_mgt_source, testng_server_mgt_destination) - - cert_path = Path(workspace + "/" + product_id + "/" + - 'modules/integration/tests-integration/tests-backend/src/test/resources/keystores/products') - cert_generation(lb_host,lb_port,cert_path) - if product_id == "product-apim": - platform_template = Path(workspace + "/" + product_id + "/" + - 'modules/integration/tests-integration/tests-backend/src/test/resources/platform-test-host-config.xsl') - setPlatformTestHostConfig(platform_template) - module_path = Path(workspace + "/" + product_id + "/" + 'modules/api-import-export') - build_module(module_path) - intg_module_path = Path(workspace + "/" + product_id) - build_module_param(intg_module_path, "-DplatformTests") - save_log_files() - create_output_property_fle() - except Exception as e: - logger.error("Error occurred while running the run-intg.py script", exc_info=True) - except BaseException as e: - logger.error("Error occurred while doing the configuration", exc_info=True) - - -if __name__ == "__main__": - main() diff --git a/integrationtests/external-endpoint/run-scenario.sh b/integrationtests/external-endpoint/run-scenario.sh deleted file mode 100644 index 16b42673..00000000 --- a/integrationtests/external-endpoint/run-scenario.sh +++ /dev/null @@ -1,52 +0,0 @@ -#! /bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -set -o xtrace - - -DIR=$2 -INFRA_FILE=${DIR}/infrastructure.properties - -# Configuring locale support for python -export LC_ALL=C - -# prerequisite: Before run this script pip and virtualenv packages have to be installed on the running environment -# virtuel env location -INIT_ENV=env - -# Set python interpreter you want for your environment -PYTHON=$(which python3.7) - -# get the working directory -WD=$(pwd) -cd ${WD} - -# create the virtual env -virtualenv $WD/$INIT_ENV -p $PYTHON - -# activate the environment -source $WD/env/bin/activate - -# install packages to the virtual environment -env/bin/pip3.7 install -r requirements.txt - -cp ${INFRA_FILE} infrastructure.properties - -# run the run-intg-test.py script -python3.7 run-intg-test.py - -cp -r product-apim/modules/integration/tests-integration/tests-backend/target/surefire-reports ${DIR} -cp product-apim/modules/integration/tests-integration/tests-backend/target/logs/automation.log ${DIR} diff --git a/integrationtests/external-endpoint/testng-server-mgt.xml b/integrationtests/external-endpoint/testng-server-mgt.xml deleted file mode 100644 index 1dbfbdf6..00000000 --- a/integrationtests/external-endpoint/testng-server-mgt.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/integrationtests/external-endpoint/testng.xml b/integrationtests/external-endpoint/testng.xml deleted file mode 100755 index 14c82957..00000000 --- a/integrationtests/external-endpoint/testng.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/integrationtests/intg-test-runner.bat b/integrationtests/intg-test-runner.bat deleted file mode 100644 index 56034fb6..00000000 --- a/integrationtests/intg-test-runner.bat +++ /dev/null @@ -1,34 +0,0 @@ -@echo off - -REM --------------------------------------------------------------------------- -REM Copyright 2018 WSO2, Inc. http://www.wso2.org -REM -REM Licensed under the Apache License, Version 2.0 (the "License"); -REM you may not use this file except in compliance with the License. -REM You may obtain a copy of the License at -REM -REM http://www.apache.org/licenses/LICENSE-2.0 -REM -REM Unless required by applicable law or agreed to in writing, software -REM distributed under the License is distributed on an "AS IS" BASIS, -REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -REM See the License for the specific language governing permissions and -REM limitations under the License. - -rem prerequisite: Before run this script pip and virtualenv packages have to be installed on the running environment - -rem get the working directory -set WD=%1 -cd %WD% - -rem create the virtual env -virtualenv env - -rem activate the environment -call env\Scripts\activate.bat - -rem install packages to the virtual environment -env\Scripts\pip.exe install -r requirements.txt - -rem run the run-intg-test.py script -python run-intg-test.py diff --git a/integrationtests/intg-test-runner.sh b/integrationtests/intg-test-runner.sh deleted file mode 100644 index ebb3c4d0..00000000 --- a/integrationtests/intg-test-runner.sh +++ /dev/null @@ -1,40 +0,0 @@ -#! /bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -set -o xtrace - -# prerequisite: Before run this script pip and virtualenv packages have to be installed on the running environment -# virtuel env location -INIT_ENV=env - -# Set python interpreter you want for your environment -PYTHON=$(which python3) - -# get the working directory -WD=$2 -cd ${WD} - -# create the virtual env -virtualenv $WD/$INIT_ENV -p $PYTHON - -# activate the environment -source $WD/env/bin/activate - -# install packages to the virtual environment -env/bin/pip install -r requirements.txt - -# run the run-intg-test.py script -python run-intg-test.py diff --git a/integrationtests/prod_test_constant.py b/integrationtests/prod_test_constant.py deleted file mode 100644 index 10613821..00000000 --- a/integrationtests/prod_test_constant.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -DATASOURCE_PATHS = {"repository/conf/datasources/master-datasources.xml", - "repository/conf/datasources/metrics-datasources.xml"} -M2_PATH = "am/wso2am" -DIST_POM_PATH = "modules/distribution/product/pom.xml" -LIB_PATH = "repository/components/lib" -DISTRIBUTION_PATH = "modules/distribution/product/target" -INTEGRATION_PATH = "modules/integration/tests-integration/tests-backend" -POM_FILE_PATHS = {} -TESTNG_DIST_XML_PATH = "modules/integration/tests-integration/tests-backend/src/test/resources/testng.xml" -TESTNG_SERVER_MGT_DIST = "modules/integration/tests-integration/tests-backend/src/test/resources/testng-server-mgt.xml" -ARTIFACT_REPORTS_PATHS = { - "modules/integration/tests-integration/tests-backend/target/surefire-reports/emailable-report.html", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/index.html", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/TEST-TestSuite.xml", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/testng.css", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/testng-results.xml", - "modules/integration/tests-integration/tests-backend/target/surefire-reports/TestSuite.txt", - "modules/integration/tests-integration/tests-backend/target/logs/automation.log"} -DB_META_DATA = { - "MYSQL": {"prefix": "jdbc:mysql://", "driverClassName": "com.mysql.jdbc.Driver", "jarName": "mysql.jar", - "DB_SETUP": {"WSO2_CARBON_DB": ['dbscripts/mysql5.7.sql'], - "WSO2AM_DB": ['dbscripts/apimgt/mysql5.7.sql'], - "WSO2AM_STATS_DB": [], - "WSO2_MB_STORE_DB": ['dbscripts/mb-store/mysql-mb.sql'], - "WSO2_METRICS_DB": ['dbscripts/metrics/mysql.sql']} - }, - "SQLSERVER-SE": {"prefix": "jdbc:sqlserver://", - "driverClassName": "com.microsoft.sqlserver.jdbc.SQLServerDriver", "jarName": "sqlserver-ex.jar", - "DB_SETUP": {"WSO2_CARBON_DB": ['dbscripts/mssql.sql'], - "WSO2AM_DB": ['dbscripts/apimgt/mssql.sql'], - "WSO2AM_STATS_DB": [], - "WSO2_MB_STORE_DB": ['dbscripts/mb-store/mssql-mb.sql'], - "WSO2_METRICS_DB": ['dbscripts/metrics/mssql.sql'] - } - }, - "ORACLE-SE2": {"prefix": "jdbc:oracle:thin:@", "driverClassName": "oracle.jdbc.OracleDriver", - "jarName": "oracle-se.jar", - "DB_SETUP": {"WSO2_CARBON_DB": ['dbscripts/oracle.sql'], - "WSO2AM_DB": ['dbscripts/apimgt/oracle.sql'], - "WSO2AM_STATS_DB": [], - "WSO2_MB_STORE_DB": ['dbscripts/mb-store/oracle-mb.sql'], - "WSO2_METRICS_DB": ['dbscripts/metrics/oracle.sql'] - } - }, - "POSTGRESQL": {"prefix": "jdbc:postgresql://", "driverClassName": "org.postgresql.Driver", - "jarName": "postgres.jar", - "DB_SETUP": {"WSO2_CARBON_DB": ['dbscripts/postgresql.sql'], - "WSO2AM_DB": ['dbscripts/apimgt/postgresql.sql'], - "WSO2AM_STATS_DB": [], - "WSO2_MB_STORE_DB": ['dbscripts/mb-store/postgresql.sql'], - "WSO2_METRICS_DB": ['dbscripts/metrics/postgresql.sql'] - } - } -} diff --git a/integrationtests/requirements.txt b/integrationtests/requirements.txt deleted file mode 100644 index 33648ca9..00000000 --- a/integrationtests/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -wget==3.2 -pylint==1.9.2 -pymysql==0.9.0 -sqlparse==0.2.4 -requests==2.19.1 \ No newline at end of file diff --git a/integrationtests/run-intg-test.py b/integrationtests/run-intg-test.py deleted file mode 100644 index a7f06453..00000000 --- a/integrationtests/run-intg-test.py +++ /dev/null @@ -1,245 +0,0 @@ -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -# importing required modules -import sys -from xml.etree import ElementTree as ET -import subprocess -import wget -import logging -import inspect -import os -import shutil -import pymysql -import sqlparse -import glob -import stat -import re -from pathlib import Path -import urllib.request as urllib2 -from xml.dom import minidom -from subprocess import Popen, PIPE -import intg_test_manager as cm - -from prod_test_constant import DB_META_DATA, ARTIFACT_REPORTS_PATHS, DIST_POM_PATH, LIB_PATH, M2_PATH, \ - DISTRIBUTION_PATH, DATASOURCE_PATHS, POM_FILE_PATHS, INTEGRATION_PATH, TESTNG_DIST_XML_PATH, \ - TESTNG_SERVER_MGT_DIST - -from intg_test_constant import NS, ZIP_FILE_EXTENSION, CARBON_NAME, VALUE_TAG, SURFACE_PLUGIN_ARTIFACT_ID, \ - DEPLOYMENT_PROPERTY_FILE_NAME, LOG_FILE_NAME, PRODUCT_STORAGE_DIR_NAME, \ - DEFAULT_DB_USERNAME, LOG_STORAGE, TEST_OUTPUT_DIR_NAME, DEFAULT_ORACLE_SID, MYSQL_DB_ENGINE, \ - ORACLE_DB_ENGINE, PRODUCT_STORAGE_DIR_NAME, MSSQL_DB_ENGINE, WSO2SERVER - - -database_names = [] -db_engine = None -sql_driver_location = None - - -def get_db_meta_data(argument): - switcher = DB_META_DATA - return switcher.get(argument, False) - - -def modify_datasources(): - """Modify datasources files which are defined in the const.py. DB ulr, uname, pwd, driver class values are modifying. - """ - for data_source in datasource_paths: - file_path = Path(storage_dist_abs_path / data_source) - if sys.platform.startswith('win'): - file_path = cm.winapi_path(file_path) - logger.info("Modifying datasource: " + str(file_path)) - artifact_tree = ET.parse(file_path) - artifarc_root = artifact_tree.getroot() - data_sources = artifarc_root.find('datasources') - for item in data_sources.findall('datasource'): - database_name = None - for child in item: - if child.tag == 'name': - database_name = child.text - # special checking for namespace object content:media - if child.tag == 'definition' and database_name: - configuration = child.find('configuration') - url = configuration.find('url') - user = configuration.find('username') - password = configuration.find('password') - validation_query = configuration.find('validationQuery') - drive_class_name = configuration.find('driverClassName') - if MYSQL_DB_ENGINE == cm.database_config['db_engine'].upper(): - url.text = url.text.replace(url.text, cm.database_config[ - 'url'] + "/" + database_name + "?autoReconnect=true&useSSL=false&requireSSL=false&" - "verifyServerCertificate=false") - user.text = user.text.replace(user.text, cm.database_config['user']) - elif ORACLE_DB_ENGINE == cm.database_config['db_engine'].upper(): - url.text = url.text.replace(url.text, cm.database_config['url'] + "/" + DEFAULT_ORACLE_SID) - user.text = user.text.replace(user.text, database_name) - validation_query.text = validation_query.text.replace(validation_query.text, - "SELECT 1 FROM DUAL") - elif MSSQL_DB_ENGINE == cm.database_config['db_engine'].upper(): - url.text = url.text.replace(url.text, - cm.database_config['url'] + ";" + "databaseName=" + database_name) - user.text = user.text.replace(user.text, cm.database_config['user']) - else: - url.text = url.text.replace(url.text, cm.database_config['url'] + "/" + database_name) - user.text = user.text.replace(user.text, cm.database_config['user']) - password.text = password.text.replace(password.text, cm.database_config['password']) - drive_class_name.text = drive_class_name.text.replace(drive_class_name.text, - cm.database_config['driver_class_name']) - database_names.append(database_name) - artifact_tree.write(file_path) - - -def configure_product(): - try: - global datasource_paths - global target_dir_abs_path - global storage_dist_abs_path - global storage_dir_abs_path - - datasource_paths = DATASOURCE_PATHS - zip_name = dist_name + ZIP_FILE_EXTENSION - - storage_dir_abs_path = Path(cm.workspace + "/" + PRODUCT_STORAGE_DIR_NAME) - target_dir_abs_path = Path(cm.workspace + "/" + cm.product_id + "/" + DISTRIBUTION_PATH) - storage_zip_abs_path = Path(storage_dir_abs_path / zip_name) - storage_dist_abs_path = Path(storage_dir_abs_path / dist_name) - configured_dist_storing_loc = Path(target_dir_abs_path / dist_name) - script_name = Path(WSO2SERVER) - - script_path = Path(storage_dist_abs_path / script_name) - - cm.extract_product(storage_dir_abs_path, storage_zip_abs_path) - cm.attach_jolokia_agent(script_path) - cm.copy_jar_file(Path(cm.database_config['sql_driver_location']), Path(storage_dist_abs_path / LIB_PATH)) - - if datasource_paths is not None: - modify_datasources() - else: - logger.info("datasource paths are not defined in the config file") - os.remove(str(storage_zip_abs_path)) - cm.compress_distribution(configured_dist_storing_loc, storage_dir_abs_path) - cm.add_distribution_to_m2(storage_dir_abs_path, M2_PATH) - shutil.rmtree(configured_dist_storing_loc, onerror=cm.on_rm_error) - return database_names - except FileNotFoundError as e: - logger.error("Error occurred while finding files", exc_info=True) - except IOError as e: - logger.error("Error occurred while accessing files", exc_info=True) - except Exception as e: - logger.error("Error occurred while configuring the product", exc_info=True) - - -# Since we have added a method to clone a given git branch and checkout to the latest released tag it is not required to -# modify pom files. Hence in the current implementation this method is not using. -# However, in order to execute this method you can define pom file paths in const_.py as a constant -# and import it to run-intg-test.py. Thereafter assign it to global variable called pom_file_paths in the -# configure_product method and call the modify_pom_files method. -def modify_pom_files(): - for pom in POM_FILE_PATHS: - file_path = Path(cm.workspace + "/" + cm.product_id + "/" + pom) - if sys.platform.startswith('win'): - file_path = cm.winapi_path(file_path) - logger.info("Modifying pom file: " + str(file_path)) - ET.register_namespace('', NS['d']) - artifact_tree = ET.parse(file_path) - artifarct_root = artifact_tree.getroot() - data_sources = artifarct_root.find('d:build', NS) - plugins = data_sources.find('d:plugins', NS) - for plugin in plugins.findall('d:plugin', NS): - artifact_id = plugin.find('d:artifactId', NS) - if artifact_id is not None and artifact_id.text == SURFACE_PLUGIN_ARTIFACT_ID: - configuration = plugin.find('d:configuration', NS) - system_properties = configuration.find('d:systemProperties', NS) - for neighbor in system_properties.iter('{' + NS['d'] + '}' + CARBON_NAME): - neighbor.text = cm.modify_distribution_name(neighbor) - for prop in system_properties: - name = prop.find('d:name', NS) - if name is not None and name.text == CARBON_NAME: - for data in prop: - if data.tag == VALUE_TAG: - data.text = cm.modify_distribution_name(data) - break - artifact_tree.write(file_path) - - -def main(): - try: - global logger - global dist_name - logger = cm.function_logger(logging.DEBUG, logging.DEBUG) - if sys.version_info < (3, 6): - raise Exception( - "To run run-intg-test.py script you must have Python 3.6 or latest. Current version info: " + sys.version_info) - cm.read_property_files() - if not cm.validate_property_readings(): - raise Exception( - "Property file doesn't have mandatory key-value pair. Please verify the content of the property file " - "and the format") - - # get properties assigned to local variables - pom_path = DIST_POM_PATH - engine = cm.db_engine.upper() - db_meta_data = get_db_meta_data(engine) - distribution_path = DISTRIBUTION_PATH - artifact_report_paths = ARTIFACT_REPORTS_PATHS - testng_dest = TESTNG_DIST_XML_PATH - testng_svr_mgt_dest = TESTNG_SERVER_MGT_DIST - - # construct database configuration - cm.construct_db_config(db_meta_data) - # clone the repository - cm.clone_repo() - # set the custom testng.xml or the product testng.xml - cm.set_custom_testng(testng_dest, testng_svr_mgt_dest) - - if cm.test_mode == "WUM": - dist_name = cm.get_dist_name_wum() - elif cm.test_mode == "RELEASE": - cm.checkout_to_tag() - dist_name = cm.get_dist_name(pom_path) - cm.get_latest_released_dist() - elif cm.test_mode == "SNAPSHOT": - dist_name = cm.get_dist_name(pom_path) - # build the distribution for snapshot test mode - cm.build_snapshot_dist(distribution_path) - - db_names = configure_product() - if db_names is None or not db_names: - raise Exception("Failed the product configuring") - - cm.setup_databases(db_names, db_meta_data) - if cm.product_id == "product-apim": - #module_path = Path(cm.workspace + "/" + cm.product_id + "/" + 'modules/api-import-export') - module_path = os.path.join(cm.workspace,cm.product_id,'modules/api-import-export') - cm.build_module(module_path) - if cm.test_mode == "WUM": - support_nexus_build_file_path = os.path.join(cm.workspace,'uat-nexus-settings.xml') - intg_module_path = Path(cm.workspace + "/" + cm.product_id + "/modules/integration") - shutil.copy(support_nexus_build_file_path,intg_module_path) - # indetity_repo_path = Path(cm.workspace + "/identity-inbound-auth-oauth") - # cm.build_module_support(intg_module_path,indetity_repo_path) - cm.build_module_support(intg_module_path) - else: - intg_module_path = os.path.join(cm.workspace,cm.product_id,INTEGRATION_PATH) - cm.build_module(intg_module_path) - cm.save_test_output(artifact_report_paths) - cm.create_output_property_fle() - except Exception as e: - logger.error("Error occurred while running the run-intg.py script", exc_info=True) - except BaseException as e: - logger.error("Error occurred while doing the configuration", exc_info=True) - - -if __name__ == "__main__": - main() diff --git a/integrationtests/run-scenario.sh b/integrationtests/run-scenario.sh deleted file mode 100755 index 24aa75f1..00000000 --- a/integrationtests/run-scenario.sh +++ /dev/null @@ -1,320 +0,0 @@ -#! /bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -set -e -set -o xtrace - -echo "=== Read values from deployment.properties for WUM ===" -INPUTS_DIR=$2 -input_file=${INPUTS_DIR}/deployment.properties - -set +o xtrace - -while IFS='=' read -r key value - do - key=$(echo $key | tr '.' '_') - eval ${key}=\${value} - done < "$input_file" - -set -o xtrace - -PRODUCT_NAME=${PRODUCT_CODE} -TEST_TYPE=${TEST_MODE} -CHANNEL=${WUM_CHANNEL} -PRODUCT_VERSION=${WUM_PRODUCT_VERSION} - -#Download the common scripts to working directory -get_cmn_scripts_dwld(){ -git clone https://github.com/wso2-incubator/test-integration-tests-runner.git -cp test-integration-tests-runner/intg_test_manager.py test-integration-tests-runner/intg_test_constant.py . -cp test-integration-tests-runner/clone_product_repo_wum.sh test-integration-tests-runner/intg_test_constant.py . - -echo "=== Copied common scripts. ===" -} - -#retry connecting to wum -connect_to_wum_server(){ - x=1; - while [[ $x -eq 2 ]]; - do - # wait for 15 seconds before check again - sleep 15 - wum add -y ${PRODUCT_NAME}-${PRODUCT_VERSION} - if [ "$?" -eq "0" ]; then - echo "Downloading WUM Pack.." - else - x=$((x+1)) - fi - done -} - -set_product_pack(){ - -#Defining Test Modes -TEST_MODE_1="WUM" - -#WUM product pack directory to check if its already exist -PRODUCT_FILE_DIR="/home/ubuntu/.wum3/products/${PRODUCT_NAME}" - -if [ ${TEST_TYPE} == "$TEST_MODE_1" ]; then - wget -nv -nc https://product-dist.wso2.com/downloads/wum/3.0.2/wum-3.0.2-linux-x64.tar.gz - echo 1qaz2wsx@E | sudo -S tar -C /usr/local -xzf wum-3.0.2-linux-x64.tar.gz - - if [ "$?" -ne "0" ]; then - echo "Error while untar the product pack or low disk space. Hence skipping the execution!" - exit 1 - else - export PATH=$PATH:/usr/local/wum/bin - fi - set +o xtrace - wum init -u ${USER_NAME} -p ${PASSWORD} - - #pointing to WUM UAT environment - wum config repositories.wso2.url ${WUM_UAT_URL} - wum config repositories.wso2.appkey ${WUM_UAT_APPKEY} - - #needs to initialize wum again to update the username in the config.yaml file - - wum init -u ${USER_NAME} -p ${PASSWORD} - set -o xtrace - if [ -d "$PRODUCT_FILE_DIR" ]; then - echo 'Updating the WUM Product....' - set +e - wum update ${PRODUCT_NAME}-${PRODUCT_VERSION} - wum describe ${PRODUCT_NAME}-${PRODUCT_VERSION} ${CHANNEL} - echo 'Product Path' - wum_path=$(wum describe ${PRODUCT_NAME}-${PRODUCT_VERSION} ${CHANNEL} | grep Product | grep Path | grep "[a-zA-Z0-9+.,/,-]*$" -o) - echo $wum_path - else - set +e - echo 'Adding WUM Product...' - wum add -y ${PRODUCT_NAME}-${PRODUCT_VERSION} - if [ "$?" -eq "0" ]; then - echo 'Updating the WUM Product...' - wum update ${PRODUCT_NAME}-${PRODUCT_VERSION} - wum describe ${PRODUCT_NAME}-${PRODUCT_VERSION} ${CHANNEL} - echo 'Product Path...' - wum_path=$(wum describe ${PRODUCT_NAME}-${PRODUCT_VERSION} ${CHANNEL} | grep Product | grep Path | grep "[a-zA-Z0-9+.,/,-]*$" -o) - echo $wum_path - else - connect_to_wum_server - echo 'Failed to connecting to WUM server, Hence skipping the execution!' - fi - fi -else - echo "Error while setting up WUM" -fi - -} - -get_cmn_scripts_dwld -set_product_pack - -INPUTS_DIR=$2 -OUTPUTS_DIR=$4 -FILE1=${INPUTS_DIR}/deployment.properties -FILE2=run-intg-test.py -FILE3=intg_test_manager.py -FILE4=intg_test_constant.py -FILE5=requirements.txt -FILE6=intg-test-runner.sh -FILE7=intg-test-runner.bat -FILE8=testng.xml -FILE9=testng-server-mgt.xml -FILE10=$wum_path -FILE11=prod_test_constant.py -FILE12=clone_product_repo_wum.sh -FILE13=uat-nexus-settings.xml - -PROP_KEY=keyFileLocation #pem file -PROP_OS=OS #OS name e.g. centos -PROP_HOST=WSO2PublicIP #host IP -PROP_INSTANCE_ID=WSO2InstanceId #Physical ID (Resource ID) of WSO2 EC2 Instance - -#---------------------------------------------------------------------- -# getting data from databuckets -#---------------------------------------------------------------------- -key_pem=`grep -w "$PROP_KEY" ${FILE1} | cut -d'=' -f2` -os=`grep -w "$PROP_OS" ${FILE1} | cut -d'=' -f2` -#user=`cat ${FILE2} | grep -w "$PROP_USER" ${FILE1} ${FILE2} | cut -d'=' -f2` -instance_id=`grep -w "$PROP_INSTANCE_ID" ${FILE1} | cut -d'=' -f2` -user='' -password='' -host=`grep -w "$PROP_HOST" ${FILE1} | cut -d'=' -f2` -CONNECT_RETRY_COUNT=40 - -#=== FUNCTION ================================================================== -# NAME: request_ec2_password -# DESCRIPTION: Request password of Windows instance from AWS using the key file. -# PARAMETER 1: Physical-ID of the EC2 instance -#=============================================================================== -request_ec2_password() { - instance_id=$1 - echo "Retrieving password for Windows instance from AWS for instance id ${instance_id}" - x=1; - retry_count=$CONNECT_RETRY_COUNT; - - while [ "$password" == "" ] ; do - #Request password from AWS - responseJson=$(aws ec2 get-password-data --instance-id "${instance_id}" --priv-launch-key ${key_pem}) - - #Validate JSON - if [ $(echo $responseJson | python -c "import sys,json;json.loads(sys.stdin.read());print 'Valid'") == "Valid" ]; then - password=$(python3 -c "import sys, json;print(($responseJson)['PasswordData'])") - echo "Password received!" - else - echo "Invalid JSON response: $responseJson" - fi - - if [ "$x" = "$retry_count" ]; then - echo "Password never received for instance with id ${instance_id}. Hence skipping test execution!" - exit - fi - - sleep 10 # wait for 10 second before check again - x=$((x+1)) - done -} - -#=== FUNCTION ================================================================== -# NAME: wait_for_port -# DESCRIPTION: Check if the port is opened till the time-out occurs -# PARAMETER 1: Host name -# PARAMETER 2: Port number -#=============================================================================== -wait_for_port() { - host=$1 - port=$2 - x=1; - retry_count=$CONNECT_RETRY_COUNT; - echo "Wait port: ${1}:${2}" - while ! nc -z $host $port; do - sleep 2 # wait for 2 second before check again - echo -n "." - if [ $x = $retry_count ]; then - echo "port never opened." - exit 1 - fi - x=$((x+1)) - done -} - -#---------------------------------------------------------------------- -# select default username and remote directory based on the OS -#---------------------------------------------------------------------- -case "${os}" in - "CentOS") - user=centos - PROP_REMOTE_DIR=REMOTE_WORKSPACE_DIR_UNIX ;; - "RHEL") - user=ec2-user - PROP_REMOTE_DIR=REMOTE_WORKSPACE_DIR_UNIX ;; - "Windows") - user=Administrator - PROP_REMOTE_DIR=REMOTE_WORKSPACE_DIR_WINDOWS ;; - "UBUNTU") - user=ubuntu - PROP_REMOTE_DIR=REMOTE_WORKSPACE_DIR_UNIX ;; -esac - -REM_DIR=`grep -w "$PROP_REMOTE_DIR" ${FILE1} | cut -d'=' -f2` - -#---------------------------------------------------------------------- -# wait till port 22 is opened for SSH -#---------------------------------------------------------------------- -wait_for_port ${host} 22 - -#---------------------------------------------------------------------- -# execute commands based on the OS of the instance -# Steps followed; -# 1. SSH and make the directory. -# 2. Copy necessary files to the instance. -# 3. Execute scripts at the instance. -# 4. Retrieve reports from the instance. -#---------------------------------------------------------------------- -if [ "${os}" = "Windows" ]; then - echo "Waiting 4 minutes till Windows instance is configured. " - sleep 4m #wait 4 minutes till Windows instance is configured and able to receive password using key file. - set +o xtrace #avoid printing sensitive data in the next commands - request_ec2_password $instance_id - REM_DIR=$(echo "$REM_DIR" | sed 's/\\//g') - echo "Copying files to ${REM_DIR}.." - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE1} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE2} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE3} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE4} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE5} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE7} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE8} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE9} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE11} ${user}@${host}:${REM_DIR} - - if [ ${TEST_TYPE} = "WUM" ]; then - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE12} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${FILE13} ${user}@${host}:${REM_DIR} - sshpass -p "${password}" ssh -q -o StrictHostKeyChecking=no ${user}@${host} mkdir -p "${REM_DIR}/storage" - #rename the WUM .zip file and scp - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no -r ${FILE10} ${user}@${host}:${REM_DIR}/storage/"${PRODUCT_NAME}-${PRODUCT_VERSION}.zip" - fi - - echo "=== Files copied successfully ===" - echo "Execution begins.. " - - set +e #avoid exiting before files are copied from remote server - - sshpass -p "${password}" ssh -o StrictHostKeyChecking=no ${user}@${host} "${REM_DIR}/${FILE7}" ${REM_DIR} - echo "=== End of execution ===" - echo "Retrieving reports from instance.. " - mkdir -p ${OUTPUTS_DIR}/scenarios/integration-tests - sshpass -p "${password}" scp -r -q -o StrictHostKeyChecking=no ${user}@${host}:${REM_DIR}/product-apim/modules/integration/tests-integration/tests-backend/target/surefire-reports ${OUTPUTS_DIR}/scenarios/integration-tests/ - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${user}@${host}:${REM_DIR}/product-apim/modules/integration/tests-integration/tests-backend/target/logs/automation.log ${OUTPUTS_DIR}/scenarios/integration-tests/ - sshpass -p "${password}" scp -q -o StrictHostKeyChecking=no ${user}@${host}:${REM_DIR}/output.properties ${OUTPUTS_DIR}/scenarios/integration-tests/ - echo "=== Reports retrieved successfully ===" - set -o xtrace -else - #for all UNIX instances - ssh -o StrictHostKeyChecking=no -i ${key_pem} ${user}@${host} mkdir -p ${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE1} ${user}@${host}:${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE2} ${user}@${host}:${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE3} ${user}@${host}:${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE4} ${user}@${host}:${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE5} ${user}@${host}:${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE6} ${user}@${host}:${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE8} ${user}@${host}:${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE9} ${user}@${host}:${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE11} ${user}@${host}:${REM_DIR} - - if [ ${TEST_TYPE} = "WUM" ]; then - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE12} ${user}@${host}:${REM_DIR} - scp -o StrictHostKeyChecking=no -i ${key_pem} ${FILE13} ${user}@${host}:${REM_DIR} - ssh -o StrictHostKeyChecking=no -i ${key_pem} ${user}@${host} mkdir -p "${REM_DIR}/storage" - scp -o StrictHostKeyChecking=no -r -i ${key_pem} ${FILE10} ${user}@${host}:${REM_DIR}/storage/"${PRODUCT_NAME}-${PRODUCT_VERSION}.zip" - fi - - echo "=== Files copied successfully ===" - - set +e #avoid exiting before files are copied from remote server - - ssh -o StrictHostKeyChecking=no -i ${key_pem} ${user}@${host} bash ${REM_DIR}/intg-test-runner.sh --wd ${REM_DIR} - - #Get the reports from integration test - mkdir -p ${OUTPUTS_DIR}/scenarios/integration-tests - scp -o StrictHostKeyChecking=no -r -i ${key_pem} ${user}@${host}:${REM_DIR}/product-apim/modules/integration/tests-integration/tests-backend/target/surefire-reports ${OUTPUTS_DIR}/scenarios/integration-tests/ - scp -o StrictHostKeyChecking=no -r -i ${key_pem} ${user}@${host}:${REM_DIR}/product-apim/modules/integration/tests-integration/tests-backend/target/logs/automation.log ${OUTPUTS_DIR}/scenarios/integration-tests/ - scp -o StrictHostKeyChecking=no -r -i ${key_pem} ${user}@${host}:${REM_DIR}/output.properties ${OUTPUTS_DIR}/scenarios/integration-tests - echo "=== Reports are copied success ===" -fi -##script ends diff --git a/integrationtests/testng-server-mgt.xml b/integrationtests/testng-server-mgt.xml deleted file mode 100644 index 1dbfbdf6..00000000 --- a/integrationtests/testng-server-mgt.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/integrationtests/testng.xml b/integrationtests/testng.xml deleted file mode 100755 index 5cb0633a..00000000 --- a/integrationtests/testng.xml +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/issue_template.md b/issue_template.md deleted file mode 100644 index 757e13ef..00000000 --- a/issue_template.md +++ /dev/null @@ -1,18 +0,0 @@ -**Description:** - - -**Suggested Labels:** - - -**Suggested Assignees:** - - -**Affected Product Version:** - -**OS, DB, other environment details and versions:** - -**Steps to reproduce:** - - -**Related Issues:** - \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..eef7cb29 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,19090 @@ +{ + "name": "apim4_integration_tests", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "apim4_integration_tests", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "aws-sdk": "^2.942.0", + "cypress-file-upload": "^5.0.8", + "html-pdf": "^3.0.1", + "require-text": "0.0.1", + "styliner": "^1.1.0", + "wdio": "^4.0.0", + "wdio-junit-to-html": "^3.1.2", + "yamljs": "^0.3.0" + }, + "devDependencies": { + "@cypress/browserify-preprocessor": "^3.0.1", + "babel-plugin-module-resolver": "^4.1.0", + "cypress": "^9.1.1", + "cypress-mochawesome-reporter": "^2.2.0", + "cypress-multi-reporters": "^1.5.0", + "eslint-plugin-cypress": "^2.11.2", + "junit-report-merger": "^2.2.3", + "mocha": "^9.0.2", + "mocha-junit-reporter": "^2.0.0", + "mochawesome": "^6.2.2", + "mochawesome-merge": "^4.2.0", + "mochawesome-report-generator": "^5.2.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", + "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", + "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", + "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz", + "integrity": "sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", + "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.9", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cypress/browserify-preprocessor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@cypress/browserify-preprocessor/-/browserify-preprocessor-3.0.2.tgz", + "integrity": "sha512-y6mlFR+IR2cqcm3HabSp7AEcX9QfF1EUL4eOaw/7xexdhmdQU8ez6piyRopZQob4BK8oKTsc9PkupsU2rzjqMA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.0", + "@babel/preset-env": "^7.16.0", + "@babel/preset-react": "^7.16.0", + "@babel/runtime": "^7.16.0", + "babel-plugin-add-module-exports": "^1.0.4", + "babelify": "^10.0.0", + "bluebird": "^3.7.2", + "browserify": "^16.2.3", + "coffeeify": "^3.0.1", + "coffeescript": "^1.12.7", + "debug": "^4.3.2", + "fs-extra": "^9.0.0", + "lodash.clonedeep": "^4.5.0", + "through2": "^2.0.0", + "watchify": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true, + "peer": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oozcitak/dom": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.8.tgz", + "integrity": "sha512-MoOnLBNsF+ok0HjpAvxYxR4piUhRDCEWK0ot3upwOOHYudJd30j6M+LNcE8RKpwfnclAX9T66nXXzkytd29XSw==", + "dev": true, + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "dev": true, + "dependencies": { + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "dev": true, + "dependencies": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "dev": true, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "node_modules/@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "14.18.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz", + "integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw==" + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==" + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" + }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/addressparser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz", + "integrity": "sha512-fDlslCJpojuY1cnb7tY7COAriA7cdSzDiWyrWNdFn7Cjd+jrEgZavqkOgD/wg+eH765YPnQjqlS88OL/Q0Qtkg==" + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/archiver": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", + "integrity": "sha512-01psM0DMD3YItvhnAXZODfsViaeDidrJwfne3lsoVrbyYa/xFQwTbVjY+2WlEBm7qH1fCsyxAA1SgNr/XenTlQ==", + "dependencies": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha512-h+hTREBXcW5e1L9RihGXdH4PHHdGipG/jE2sMZrqIH6BmZAxeGU5IWjVsKhokdCSWX7km6Kkh406zZNEElHFPQ==", + "dependencies": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/archiver-utils/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/archiver/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/archiver/node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/archiver/node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sdk": { + "version": "2.1180.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1180.0.tgz", + "integrity": "sha512-QyQ+Zxb+AowFHb9N6qrmpA+LVZxUlBCfqEsRUAss+0y+QbEwfh4o+AxP6V0xz+m+UlBNxBkqJLx8UPoVk387LQ==", + "dependencies": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.4.19" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/babel-plugin-add-module-exports": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", + "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", + "dev": true + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-module-resolver": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz", + "integrity": "sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==", + "dev": true, + "dependencies": { + "find-babel-config": "^1.2.0", + "glob": "^7.1.6", + "pkg-up": "^3.1.0", + "reselect": "^4.0.0", + "resolve": "^1.13.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/babelify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", + "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "dependencies": { + "resolve": "^1.17.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify": { + "version": "16.5.2", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz", + "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==", + "dev": true, + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/browserify-cipher": { + "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, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "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, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserify/node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/browserify/node_modules/events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/browserify/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/browserify/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/browserify/node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/browserify/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/browserslist": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz", + "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001366", + "electron-to-chromium": "^1.4.188", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/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==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "devOptional": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "node_modules/bufferjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bufferjs/-/bufferjs-1.1.0.tgz", + "integrity": "sha512-qrqxRWjsRktz5dKEVwhV+IgCEFFojMHRbtyg/TGql0Z28RAZVgXSA1nZOsZnR9HQOsh8ukipVNOLpbH0KCCegQ==", + "optional": true, + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", + "dev": true + }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001368", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001368.tgz", + "integrity": "sha512-wgfRYa9DenEomLG/SdWgQxpIyvdtH3NW8Vq+tB6AwR9e56iOIcu1im5F/wNdDf04XlKHXqIx4N8Jo0PemeBenQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==" + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cheerio": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.10.8.tgz", + "integrity": "sha512-/rDdcRIPVkXblUMxhRe9r/sANqG5T7App+V3LJby4GkN+0PrWmFwpE1k4FfbFpiJAOAy7vxUzi4sNX5in0nL2w==", + "dependencies": { + "cheerio-select": "*", + "entities": "0.x", + "htmlparser2": "2.x", + "underscore": "~1.4" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/coffeeify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/coffeeify/-/coffeeify-3.0.1.tgz", + "integrity": "sha512-Qjnr7UX6ldK1PHV7wCnv7AuCd4q19KTUtwJnu/6JRJB4rfm12zvcXtKdacUoePOKr1I4ka/ydKiwWpNAdsQb0g==", + "dev": true, + "dependencies": { + "convert-source-map": "^1.3.0", + "through2": "^2.0.0" + }, + "peerDependencies": { + "coffeescript": ">1.9.2 <3" + } + }, + "node_modules/coffeescript": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", + "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", + "dev": true, + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "dev": true, + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/combine-source-map/node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/compress-brotli": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "dependencies": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha512-SLTU8iWWmcORfUN+4351Z2aZXKJe1tr0jSilPMCZlLPzpdTXnkBW1LevW/MfuANBKJek8Xu9ggqrtVmQrChLtg==", + "dependencies": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/compress-commons/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "devOptional": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/convert-source-map/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/core-js-compat": { + "version": "3.23.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.5.tgz", + "integrity": "sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.2", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dependencies": { + "buffer": "^5.1.0" + } + }, + "node_modules/crc/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha512-UjZSqFCbn+jZUHJIh6Y3vMF7EJLcJWNm4tKDf2peJRwlZKHvkkvOMTvAei6zjU9gO1xONVr3rRFw0gixm2eUng==", + "dependencies": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "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, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "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, + "dependencies": { + "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" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==" + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/CSSselect": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/CSSselect/-/CSSselect-0.3.11.tgz", + "integrity": "sha512-ORZwQ8O6Bp3DV25zkPSQKLQ60cqygnlVvSBhr23ET7n8Og+sgTuVq+3QfvBhQON4zwk9LBZ7FLrMD6hSvRMAbw==", + "deprecated": "the module is now available as 'css-select'", + "dependencies": { + "CSSwhat": "0.4", + "domutils": "1.2" + } + }, + "node_modules/CSSselect/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/CSSselect/node_modules/domutils": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.2.2.tgz", + "integrity": "sha512-/qlLe5dzDgHdCl1t0OZYSoke4c+2JzSFENEvpemP8Ey2yaY4A1cVXRlcTy8/TtgPsmuOSFznnLawMOwfim6NYQ==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/CSSwhat": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/CSSwhat/-/CSSwhat-0.4.7.tgz", + "integrity": "sha512-bU5cYG02crjQGDN6wm8USThp/sr/MUulMTrVA1CENSBhv3B+mlJfYDP1em/wJlMT0aYcWso0cuT9NXW74yPfog==", + "deprecated": "the module is now available as 'css-what'", + "engines": { + "node": "*" + } + }, + "node_modules/cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/cypress": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.7.0.tgz", + "integrity": "sha512-+1EE1nuuuwIt/N1KXRR2iWHU+OiIt7H28jJDyyI4tiUftId/DrXYEwoDa5+kH2pki1zxnA0r6HrUGHV5eLbF5Q==", + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cypress-file-upload": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", + "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", + "engines": { + "node": ">=8.2.1" + }, + "peerDependencies": { + "cypress": ">3.0.0" + } + }, + "node_modules/cypress-mochawesome-reporter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-2.4.0.tgz", + "integrity": "sha512-hp1shdb4ld897WwYTgJviSjJFVpllMNesflL9FXOa0kOz4GM7UaLESrX8pnkUHBvYyO05iDMsgWhJ0x6BABukA==", + "dev": true, + "dependencies": { + "fs-extra": "^9.0.0", + "mochawesome": "^6.1.0", + "mochawesome-merge": "^4.0.3", + "mochawesome-report-generator": "^5.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "cypress": ">=6.2.0" + } + }, + "node_modules/cypress-multi-reporters": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/cypress-multi-reporters/-/cypress-multi-reporters-1.6.1.tgz", + "integrity": "sha512-FPeC0xWF1N6Myrwc2m7KC0xxlrtG8+x4hlsPFBDRWP8u/veR2x90pGaH3BuJfweV7xoQ4Zo85Qjhu3fgZGrBQQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "lodash": "^4.17.15" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "mocha": ">=3.1.2" + } + }, + "node_modules/cypress/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cypress/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/cypress/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cypress/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cypress/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cypress/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/dayjs": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", + "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", + "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "dependencies": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ejs": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", + "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.198", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.198.tgz", + "integrity": "sha512-jwqQPdKGeAslcq8L+1SZZgL6uDiIDmTe9Gq4brsdWAH27y7MJ2g9Ue6MyST3ogmSM49EAQP7bype1V5hsuNrmQ==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emailjs": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/emailjs/-/emailjs-1.0.12.tgz", + "integrity": "sha512-b4+30DT2pEkqG86DzoJl1Pe9rNc8x0kvqzyvA1FzepixWa6+4bDk3Ia5ZOX3JhuHEUSJwY7UtiIHnuBIZDnfFg==", + "dependencies": { + "addressparser": "^0.3.2", + "mimelib": "0.2.14", + "moment": "2.15.2", + "starttls": "1.0.1" + }, + "optionalDependencies": { + "bufferjs": "1.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-0.5.0.tgz", + "integrity": "sha512-T5XQtlzuW+PfeSsGp3uryfYQof820zYbnUnUDEkwUVIAfgYeixIN16c4jh8gs0SqJUTGLU0XD6QsvjEPbmdwzQ==" + }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.61", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", + "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es5-ext/node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "optional": true + }, + "node_modules/es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha512-7S8YXIcUfPMOr3rqJBVMePAbRsD1nWeSMQ86K/lDI76S3WKXz+KWILvTIPbTroubOkZTGh+b+7/xIIphZXNYbA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha512-exfuQY8UGtn/N+gL1iKkH8fpNd5sJ760nJq6mmZAHldfxMD5kX07lbQuYlspoXsuknXNv9Fb7y2GsPOnQIbxHg==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", + "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-cypress": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", + "integrity": "sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==", + "dev": true, + "dependencies": { + "globals": "^11.12.0" + }, + "peerDependencies": { + "eslint": ">= 3.2.1" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "peer": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.6.tgz", + "integrity": "sha512-OHqo4wbHX5VbvlbB6o6eDwhYmiTjrpWACjF8Pmof/GTD6rdBNdZFNck3xlhqOiQFGCOoq3uzHvA0cQpFHIGVAQ==" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dependencies": { + "type": "^2.5.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dependencies": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz", + "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fibers": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-4.0.3.tgz", + "integrity": "sha512-MW5VrDtTOLpKK7lzw4qD7Z9tXaAhdOmOED5RHzg3+HjUk+ibkjVW0Py2ERtdqgTXaerLkVkBy2AEmJiT6RMyzg==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "dev": true, + "dependencies": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-babel-config/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "peer": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true, + "peer": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/fsu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz", + "integrity": "sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "peer": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/globule/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globule/node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha512-jZ38TU/EBiGKrmyTNNZgnvCZHNowiRI4+w/I9noMlekHTZH3KyGgvJLmhSgykeAQ9j2SYPDosM0Bg3wHfzibAQ==", + "optional": true, + "dependencies": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasha/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-pdf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-pdf/-/html-pdf-3.0.1.tgz", + "integrity": "sha512-CKNSacmQn+CKJ2GNfT4UYKaPy/T3Ndj82yJ2aju/UPmnvWNjIpyumqRqkFU0mwT6BTHBFhFGTnXN8dBn4Bdj0Q==", + "bin": { + "html-pdf": "bin/index.js" + }, + "engines": { + "node": ">=4.0.0" + }, + "optionalDependencies": { + "phantomjs-prebuilt": "^2.1.16" + } + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/htmlparser2": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-2.6.0.tgz", + "integrity": "sha512-oR9aps3hDZdU0whPlDjz4HdafpcZclpjrUOwPqDldr+WDubEnVerBNP8I0Wy0VIZO5Mxq/4yALDOYZTWf5Jtog==", + "dependencies": { + "domelementtype": "1", + "domhandler": "2.0", + "domutils": "1.0" + } + }, + "node_modules/htmlparser2/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/htmlparser2/node_modules/domhandler": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.0.3.tgz", + "integrity": "sha512-D8+qeCUo6LpYvBZsmXWunDJ9zOD8mVg6EwZIdgxmnT+xGWRsReF/TwsZ5EzlIJDipxlE6qJh1dXt9oeplGN3Bg==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.0.1.tgz", + "integrity": "sha512-EtnpDnVNvVaRBHmc5PV2lGHlgic4IjrYgS1f3U/M7CjihJIKfsJFvwj6JfAjr7f7wNDcloq3rOb08xAiL622gA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "dev": true, + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dependencies": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "node_modules/inquirer/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dev": true, + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is2": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.7.tgz", + "integrity": "sha512-4vBQoURAXC6hnLFxD4VW7uc04XiwTTl/8ydYJxKvPwkWQrSjInkuM5VZVg6BGr1/natq69zDuvO9lGpLClJqvA==", + "dependencies": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + }, + "engines": { + "node": ">=v0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==", + "dev": true, + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/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, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/junit-report-merger": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/junit-report-merger/-/junit-report-merger-2.2.3.tgz", + "integrity": "sha512-bddxE3rxoNGAt1LB5eIBbkQKluDMa2WWExsFjjtwaG0s0wQHxvDcD6OYH8t4i/8J/gv5h309NyQK23AiGFSSUA==", + "dev": true, + "dependencies": { + "fast-glob": "3.2.6", + "xmlbuilder2": "2.4.1" + }, + "bin": { + "jrm": "cli.js", + "junit-report-merger": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==", + "optional": true + }, + "node_modules/keyv": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.3.tgz", + "integrity": "sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==", + "dependencies": { + "compress-brotli": "^1.3.8", + "json-buffer": "3.0.1" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "optional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "engines": { + "node": "> 0.8" + } + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", + "dev": true + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==" + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-update/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5.js": { + "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, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimelib": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.2.14.tgz", + "integrity": "sha512-U/sN1ByAmzV373tmXwv3y5XTH04Ic/2qlKuxhsSqF6osbPlKs94CqR4D6FswnrM5t7flSYXrcAUO2AEjJ5/jqw==", + "deprecated": "This project is unmaintained", + "dependencies": { + "addressparser": "~0.2.0", + "encoding": "~0.1" + } + }, + "node_modules/mimelib/node_modules/addressparser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.2.1.tgz", + "integrity": "sha512-znTNuVLOEDXQs5h48BeF0ZJwhGOOq0KEhlmFSLtYkPa4EEd48OoMxGo12ClI39rgU2Qx+/KwB7cINhC5/NGEdA==" + }, + "node_modules/mimeparse": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", + "integrity": "sha512-jiuAsJJY4c0oF97oHKic9nva2y1QF2yhYJG3LXLys//f8SNQ89eFuGZ29z62Z29CAY4endJS6zFiKUtURFErog==", + "engines": { + "node": "*" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimalistic-assert": { + "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 + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha-junit-reporter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", + "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^6.0.1", + "xml": "^1.0.0" + }, + "peerDependencies": { + "mocha": ">=2.2.5" + } + }, + "node_modules/mocha-junit-reporter/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/mocha-junit-reporter/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mochawesome": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/mochawesome/-/mochawesome-6.3.1.tgz", + "integrity": "sha512-G2J7Le8ap+0222otJQEUVFs7RYzphiIk21NzaBZE2dbyHJ2+9aai+V2cV7lreEKigDpwQ+SXeiiBH9KQlrkaAQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "diff": "^5.0.0", + "json-stringify-safe": "^5.0.1", + "lodash.isempty": "^4.4.0", + "lodash.isfunction": "^3.0.9", + "lodash.isobject": "^3.0.2", + "lodash.isstring": "^4.0.1", + "mochawesome-report-generator": "^5.2.0", + "strip-ansi": "^6.0.0", + "uuid": "^8.3.2" + }, + "peerDependencies": { + "mocha": ">=7" + } + }, + "node_modules/mochawesome-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mochawesome-merge/-/mochawesome-merge-4.2.1.tgz", + "integrity": "sha512-G7+LqIKgixShKG4FyWDn1PIrzpKEwCofrJip/VzdqghNGqZl4S5MNoXx5YDfk9KLe+pr4qGa1TOzCc/oVw/8Kw==", + "dev": true, + "dependencies": { + "fs-extra": "^7.0.1", + "glob": "^7.1.6", + "yargs": "^15.3.1" + }, + "bin": { + "mochawesome-merge": "bin/mochawesome-merge.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mochawesome-merge/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/mochawesome-merge/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-merge/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/mochawesome-merge/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/mochawesome-merge/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/mochawesome-merge/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mochawesome-merge/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mochawesome-merge/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/mochawesome-merge/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/mochawesome-merge/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mochawesome-merge/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mochawesome-merge/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mochawesome-merge/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mochawesome-merge/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mochawesome-merge/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mochawesome-merge/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/mochawesome-merge/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mochawesome-merge/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mochawesome-report-generator/-/mochawesome-report-generator-5.2.0.tgz", + "integrity": "sha512-DDY/3jSkM/VrWy0vJtdYOf6qBLdaPaLcI7rQmBVbnclIX7AKniE1Rhz3T/cMT/7u54W5EHNo1z84z7efotq/Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "dateformat": "^3.0.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.0", + "fsu": "^1.0.2", + "lodash.isfunction": "^3.0.8", + "opener": "^1.5.2", + "prop-types": "^15.7.2", + "tcomb": "^3.2.17", + "tcomb-validation": "^3.3.0", + "validator": "^10.11.0", + "yargs": "^13.2.2" + }, + "bin": { + "marge": "bin/cli.js" + } + }, + "node_modules/mochawesome-report-generator/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/mochawesome-report-generator/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mochawesome-report-generator/node_modules/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 + }, + "node_modules/mochawesome-report-generator/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/mochawesome-report-generator/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mochawesome-report-generator/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/mochawesome-report-generator/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mochawesome-report-generator/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mochawesome-report-generator/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mochawesome-report-generator/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/mochawesome-report-generator/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/mochawesome-report-generator/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/mochawesome/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/mochawesome/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/mochawesome/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/mochawesome/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/mochawesome/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mochawesome/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mochawesome/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dev": true, + "dependencies": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/moment": { + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.2.tgz", + "integrity": "sha512-dv9NAmbJRSckFY2Dt3EcgoUGg85U4AaUvtJQ56k0QFumwqpOK3Huf0pYutSVgCFfN+DekvF4pW45PP9rf6ts7g==", + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "peer": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-install-package": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", + "integrity": "sha512-F37OfFN2Fk6ixI3bn8CNllSGMjpRxTqPcnN5j2zFlqNiaf/LGG6fCq3DeBGKRinyVMR5ROS34nWKQmn7tABuJg==" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==" + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "peer": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==" + }, + "node_modules/outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha512-BnNY/RwnDrkmQdUa9U+OfN/Y7AWmKuUPCCd+hbRclZnnANvYpO72zp/a6Q4n829hPbdqEac31XCcsvlEvb+rtA==", + "dev": true, + "dependencies": { + "shell-quote": "^1.4.2" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "dev": true, + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parserlib": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-1.1.1.tgz", + "integrity": "sha512-e1HbF3+7ASJ/uOZirg5/8ZfPljTh100auNterbHB8TUs5egciuWQ2eX/2al8ko0RdV9Xh/5jDei3jqJAmbTDcg==" + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ==", + "deprecated": "this package is now deprecated", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + }, + "bin": { + "phantomjs": "bin/phantomjs" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "optional": true, + "dependencies": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optional": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "optional": true + }, + "node_modules/phantomjs-prebuilt/node_modules/request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha512-dxdraeZVUNEn9AvLrxkgB2k6buTlym71dJk1fk4v8j3Ou3RKNm07BcgbHdj2lLgYGfqX71F+awb1MR+tWPFJzA==", + "optional": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "optional": true, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "extraneous": true + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/q-io": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.13.6.tgz", + "integrity": "sha512-xgxlfN3iOQ4LMuyhb8+aibtv57HnqZqycCLaE3o/qkeqvBuEfbq4tU4oHjIHgY/LVN3vJs+Gy9hKh8kzlnug7g==", + "dependencies": { + "es6-set": "^0.1.1", + "mime": "^1.2.11", + "mimeparse": "^0.1.4", + "q": "^1.0.1", + "qs": "^1.2.1", + "url2": "^0.0.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/q-io/node_modules/qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha512-xEqT+49YIt+BdwQthXKTOkp7atENe6JqrGGerxBPiER6BArOIiVJtpZZYpWOpq2IOkTPVnDM8CgYvppFoJNwyQ==" + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/qx/-/qx-1.0.0.tgz", + "integrity": "sha512-xKgARiJEB3XyaEI/qckwleS3vsjcG7Ltfke1idOY3carneKqTKi8CRsvqFfkwVRWjhy1lV6bOw+6I/1/zXOmbQ==", + "dependencies": { + "q": "^1.1.2" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/request/node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/request/node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/require-text": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/require-text/-/require-text-0.0.1.tgz", + "integrity": "sha512-F0YWfF47G/IWK3RjLo2VIgASklXbKv5R+ZovK+v/MXsG1Gpu57i4XlCQ8x6gs2NgBo2dULGWvEySn8H2Ki2Gaw==" + }, + "node_modules/reselect": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.6.tgz", + "integrity": "sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/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, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "node_modules/rgb2hex": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.10.tgz", + "integrity": "sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==" + }, + "node_modules/rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==", + "dependencies": { + "rx-lite": "*" + } + }, + "node_modules/rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + }, + "node_modules/selenium-standalone": { + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.24.0.tgz", + "integrity": "sha512-Dun2XgNAgCfJNrrSzuv7Z7Wj7QTvBKpqx0VXFz7bW9T9FUe5ytzgzoCEEshwDVMh0Dv6sCgdZg7VDhM/q2yPPQ==", + "dependencies": { + "commander": "^2.20.3", + "cross-spawn": "^7.0.3", + "debug": "^4.3.1", + "got": "^11.8.2", + "lodash.mapvalues": "^4.6.0", + "lodash.merge": "^4.6.2", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "progress": "2.0.3", + "tar-stream": "2.2.0", + "which": "^2.0.2", + "yauzl": "^2.10.0" + }, + "bin": { + "selenium-standalone": "bin/selenium-standalone", + "start-selenium": "bin/start-selenium" + } + }, + "node_modules/selenium-standalone/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/selenium-standalone/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/selenium-standalone/node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==", + "dev": true, + "dependencies": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/starttls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/starttls/-/starttls-1.0.1.tgz", + "integrity": "sha512-mfOPDJsq1GSvCyl6qQK5Slj486+6c2E/DJ3vo0TXs4kB+6xFBBuua2ngiudFyjpRYr9BIibsW9wn/5gl4EPaoA==" + }, + "node_modules/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, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styliner": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/styliner/-/styliner-1.1.0.tgz", + "integrity": "sha512-BeK6hCfltTMKZSPMAK8J/ea5CtTfR16QpVTF3hzPlRm+ThvIw6q77GTRa1e7GgERhtdT3dwOliAFBXCDF3a7lg==", + "dependencies": { + "cheerio": "~0.10.1", + "CSSselect": "~0.3.0", + "lodash": "^4.17.5", + "parserlib": ">0.2.0", + "q": "^1.4.1", + "q-io": "^1.13.2", + "qx": "^1.0.0", + "winston": "^2.4.2" + } + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tcomb": { + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz", + "integrity": "sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==", + "dev": true + }, + "node_modules/tcomb-validation": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tcomb-validation/-/tcomb-validation-3.4.1.tgz", + "integrity": "sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==", + "dev": true, + "dependencies": { + "tcomb": "^3.0.0" + } + }, + "node_modules/tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "dependencies": { + "debug": "4.3.1", + "is2": "^2.0.6" + } + }, + "node_modules/tcp-port-used/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true + }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dev": true, + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "devOptional": true + }, + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true, + "bin": { + "umd": "bin/cli.js" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" + } + }, + "node_modules/underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha512-ZqGrAgaqqZM7LGRzNjLnw5elevWb5M8LEoDMadxIW3OWbcv72wMMgKdwOKpd5Fqxe8choLD8HN3iSj3TUh/giQ==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "node_modules/url2": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", + "integrity": "sha512-gb/XT1m2mnWOIbQwa5V9Dq2O07fkZbtu1K0WAAKuaNSX0c8psp2jovJTbbvPKCpimutdoK9jXOejDCtvQOoKOA==" + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true, + "peer": true + }, + "node_modules/validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/watchify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-4.0.0.tgz", + "integrity": "sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==", + "dev": true, + "dependencies": { + "anymatch": "^3.1.0", + "browserify": "^17.0.0", + "chokidar": "^3.4.0", + "defined": "^1.0.0", + "outpipe": "^1.1.0", + "through2": "^4.0.2", + "xtend": "^4.0.2" + }, + "bin": { + "watchify": "bin/cmd.js" + }, + "engines": { + "node": ">= 8.10.0" + } + }, + "node_modules/watchify/node_modules/browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dev": true, + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchify/node_modules/browserify/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/watchify/node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/watchify/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/watchify/node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/watchify/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/watchify/node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, + "node_modules/watchify/node_modules/stream-browserify/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/watchify/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/watchify/node_modules/through2/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/watchify/node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/wdio": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wdio/-/wdio-4.0.0.tgz", + "integrity": "sha512-qCDAEPZBbfSXZDIlHyiYdYvsH34e9/9GdOz9PkrnnbyuvREVsZYYVaOOdsFgcmpeS1/nJfBr2HAD4YyBI1vrqg==", + "deprecated": "This package got deprecated. Please use the 'create-wdio' starter toolkit via: 'npm init wdio ./path/to/project' or 'yarn create wdio ./path/to/project'.", + "dependencies": { + "fibers": "^4.0.2", + "selenium-standalone": "^6.15.4", + "tcp-port-used": "^1.0.1", + "webdriverio": "^4.12.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/wdio-dot-reporter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz", + "integrity": "sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg==" + }, + "node_modules/wdio-junit-to-html": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/wdio-junit-to-html/-/wdio-junit-to-html-3.1.2.tgz", + "integrity": "sha512-jg8/PUYSPYmJsiMNOmXzqNX9GebyGclOhJAQBt3rM3MYkiz2rocG6toblhAE7J5NZOzRuusn+FCIDNnhrfRsvg==", + "dependencies": { + "commander": "^2.9.0", + "dateformat": "^2.0.0", + "emailjs": "^1.0.8", + "xml2js": "^0.4.17" + }, + "bin": { + "wdio-junit-to-html": "index.js" + } + }, + "node_modules/wdio-junit-to-html/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/wdio-junit-to-html/node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "engines": { + "node": "*" + } + }, + "node_modules/webdriverio": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.14.4.tgz", + "integrity": "sha512-Knp2vzuzP5c5ybgLu+zTwy/l1Gh0bRP4zAr8NWcrStbuomm9Krn9oRF0rZucT6AyORpXinETzmeowFwIoo7mNA==", + "deprecated": "outdated version, please use @next", + "dependencies": { + "archiver": "~2.1.0", + "babel-runtime": "^6.26.0", + "css-parse": "^2.0.0", + "css-value": "~0.0.1", + "deepmerge": "~2.0.1", + "ejs": "~2.5.6", + "gaze": "~1.1.2", + "glob": "~7.1.1", + "grapheme-splitter": "^1.0.2", + "inquirer": "~3.3.0", + "json-stringify-safe": "~5.0.1", + "mkdirp": "~0.5.1", + "npm-install-package": "~2.1.0", + "optimist": "~0.6.1", + "q": "~1.5.0", + "request": "^2.83.0", + "rgb2hex": "^0.1.9", + "safe-buffer": "~5.1.1", + "supports-color": "~5.0.0", + "url": "~0.11.0", + "wdio-dot-reporter": "~0.0.8", + "wgxpath": "~1.0.0" + }, + "bin": { + "wdio": "bin/wdio" + }, + "engines": { + "node": ">= 4.8.5" + } + }, + "node_modules/webdriverio/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webdriverio/node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriverio/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "node_modules/webdriverio/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/webdriverio/node_modules/supports-color": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", + "integrity": "sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA==", + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/webdriverio/node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/wgxpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-1.0.0.tgz", + "integrity": "sha512-2Hp4+h29WkaYf3eudZwYttm7efBuMdvWgCkD7xMveAxDqzIeB2WasyEWHHxxh7iHXehDH5NFEZ2X4q1uaZOxnQ==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/winston": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.6.tgz", + "integrity": "sha512-J5Zu4p0tojLde8mIOyDSsmLmcP8I3Z6wtwpTDHx1+hGcdhxcJaAmG4CFtagkb+NiN1M9Ek4b42pzMWqfc9jm8w==", + "dependencies": { + "async": "^3.2.3", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder2": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-2.4.1.tgz", + "integrity": "sha512-vliUplZsk5vJnhxXN/mRcij/AE24NObTUm/Zo4vkLusgayO6s3Et5zLEA14XZnY1c3hX5o1ToR0m0BJOPy0UvQ==", + "dev": true, + "dependencies": { + "@oozcitak/dom": "1.15.8", + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8", + "@types/node": "*", + "js-yaml": "3.14.0" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/xmlbuilder2/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/xmlbuilder2/node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "dependencies": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + }, + "bin": { + "json2yaml": "bin/json2yaml", + "yaml2json": "bin/yaml2json" + } + }, + "node_modules/yamljs/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha512-2olrDUuPM4NvRIgGPhvrp84f7/HmWR6RiQrgwFF2VctmnssFiogtYL3DcA8Vl2bsSmju79sVXe38TsII7JleUg==", + "dependencies": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 0.10.0" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", + "dev": true + }, + "@babel/core": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", + "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz", + "integrity": "sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", + "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.1.0" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", + "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", + "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-replace-supers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", + "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-simple-access": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", + "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.9.tgz", + "integrity": "sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/helpers": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "dev": true, + "requires": { + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", + "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-proposal-optional-chaining": "^7.18.9" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", + "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", + "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", + "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", + "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.18.8" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", + "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", + "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", + "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", + "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", + "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-remap-async-to-generator": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", + "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", + "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-replace-supers": "^7.18.9", + "@babel/helper-split-export-declaration": "^7.18.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", + "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz", + "integrity": "sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", + "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", + "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", + "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-identifier": "^7.18.6", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", + "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", + "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", + "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", + "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", + "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "dev": true, + "requires": { + "@babel/plugin-transform-react-jsx": "^7.18.6" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", + "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", + "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.9.tgz", + "integrity": "sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.9", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "semver": "^6.3.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", + "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.9" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", + "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/preset-env": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.9.tgz", + "integrity": "sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.18.8", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.18.6", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.18.9", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.18.9", + "@babel/plugin-transform-classes": "^7.18.9", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.18.9", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.18.6", + "@babel/plugin-transform-modules-commonjs": "^7.18.6", + "@babel/plugin-transform-modules-systemjs": "^7.18.9", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.18.8", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.18.9", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.6", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.18.9", + "babel-plugin-polyfill-corejs2": "^0.3.1", + "babel-plugin-polyfill-corejs3": "^0.5.2", + "babel-plugin-polyfill-regenerator": "^0.3.1", + "core-js-compat": "^3.22.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", + "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-react-display-name": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + } + }, + "@babel/runtime": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", + "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "@babel/traverse": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true + }, + "@cypress/browserify-preprocessor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@cypress/browserify-preprocessor/-/browserify-preprocessor-3.0.2.tgz", + "integrity": "sha512-y6mlFR+IR2cqcm3HabSp7AEcX9QfF1EUL4eOaw/7xexdhmdQU8ez6piyRopZQob4BK8oKTsc9PkupsU2rzjqMA==", + "dev": true, + "requires": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.0", + "@babel/preset-env": "^7.16.0", + "@babel/preset-react": "^7.16.0", + "@babel/runtime": "^7.16.0", + "babel-plugin-add-module-exports": "^1.0.4", + "babelify": "^10.0.0", + "bluebird": "^3.7.2", + "browserify": "^16.2.3", + "coffeeify": "^3.0.1", + "coffeescript": "^1.12.7", + "debug": "^4.3.2", + "fs-extra": "^9.0.0", + "lodash.clonedeep": "^4.5.0", + "through2": "^2.0.0", + "watchify": "^4.0.0" + } + }, + "@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "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", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@eslint/eslintrc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", + "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "dev": true, + "peer": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.3.2", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "peer": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", + "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "dev": true, + "peer": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true, + "peer": true + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@oozcitak/dom": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@oozcitak/dom/-/dom-1.15.8.tgz", + "integrity": "sha512-MoOnLBNsF+ok0HjpAvxYxR4piUhRDCEWK0ot3upwOOHYudJd30j6M+LNcE8RKpwfnclAX9T66nXXzkytd29XSw==", + "dev": true, + "requires": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/url": "1.0.4", + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/infra": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@oozcitak/infra/-/infra-1.0.8.tgz", + "integrity": "sha512-JRAUc9VR6IGHOL7OGF+yrvs0LO8SlqGnPAMqyzOuFZPSZSXI7Xf2O9+awQPSMXgIWGtgUf/dA6Hs6X6ySEaWTg==", + "dev": true, + "requires": { + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/url": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@oozcitak/url/-/url-1.0.4.tgz", + "integrity": "sha512-kDcD8y+y3FCSOvnBI6HJgl00viO/nGbQoCINmQ0h98OhnGITrWR3bOGfwYCthgcrV8AnTJz8MzslTQbC3SOAmw==", + "dev": true, + "requires": { + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8" + } + }, + "@oozcitak/util": { + "version": "8.3.8", + "resolved": "https://registry.npmjs.org/@oozcitak/util/-/util-8.3.8.tgz", + "integrity": "sha512-T8TbSnGsxo6TDBJx/Sgv/BlVJL3tshxZP7Aq5R1mSnM5OcHY2dQaxLMu2+E8u3gN0MLOzdjurqN4ZRVuzQycOQ==", + "dev": true + }, + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "@types/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==" + }, + "@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "14.18.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.22.tgz", + "integrity": "sha512-qzaYbXVzin6EPjghf/hTdIbnVW1ErMx8rPzwRNJhlbyJhu2SyqlvjGOY/tbUt6VFyzg56lROcOeSQRInpt63Yw==" + }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "requires": { + "@types/node": "*" + } + }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==" + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" + }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "peer": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "addressparser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz", + "integrity": "sha512-fDlslCJpojuY1cnb7tY7COAriA7cdSzDiWyrWNdFn7Cjd+jrEgZavqkOgD/wg+eH765YPnQjqlS88OL/Q0Qtkg==" + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + }, + "archiver": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", + "integrity": "sha512-01psM0DMD3YItvhnAXZODfsViaeDidrJwfne3lsoVrbyYa/xFQwTbVjY+2WlEBm7qH1fCsyxAA1SgNr/XenTlQ==", + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.2.0" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha512-h+hTREBXcW5e1L9RihGXdH4PHHdGipG/jE2sMZrqIH6BmZAxeGU5IWjVsKhokdCSWX7km6Kkh406zZNEElHFPQ==", + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "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": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" + }, + "aws-sdk": { + "version": "2.1180.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1180.0.tgz", + "integrity": "sha512-QyQ+Zxb+AowFHb9N6qrmpA+LVZxUlBCfqEsRUAss+0y+QbEwfh4o+AxP6V0xz+m+UlBNxBkqJLx8UPoVk387LQ==", + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.16.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "util": "^0.12.4", + "uuid": "8.0.0", + "xml2js": "0.4.19" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "babel-plugin-add-module-exports": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", + "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", + "dev": true + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-module-resolver": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz", + "integrity": "sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==", + "dev": true, + "requires": { + "find-babel-config": "^1.2.0", + "glob": "^7.1.6", + "pkg-up": "^3.1.0", + "reselect": "^4.0.0", + "resolve": "^1.13.1" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babelify": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", + "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", + "dev": true, + "requires": {} + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "requires": { + "resolve": "^1.17.0" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify": { + "version": "16.5.2", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz", + "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==", + "dev": true, + "requires": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "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" + } + } + } + }, + "browserify-aes": { + "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.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.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.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "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.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz", + "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001366", + "electron-to-chromium": "^1.4.188", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.4" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "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==", + "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==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "devOptional": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "bufferjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bufferjs/-/bufferjs-1.1.0.tgz", + "integrity": "sha512-qrqxRWjsRktz5dKEVwhV+IgCEFFojMHRbtyg/TGql0Z28RAZVgXSA1nZOsZnR9HQOsh8ukipVNOLpbH0KCCegQ==", + "optional": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, + "cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", + "dev": true + }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "peer": true + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001368", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001368.tgz", + "integrity": "sha512-wgfRYa9DenEomLG/SdWgQxpIyvdtH3NW8Vq+tB6AwR9e56iOIcu1im5F/wNdDf04XlKHXqIx4N8Jo0PemeBenQ==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "chalk": { + "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": "^5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==" + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true + }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==" + }, + "cheerio": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.10.8.tgz", + "integrity": "sha512-/rDdcRIPVkXblUMxhRe9r/sANqG5T7App+V3LJby4GkN+0PrWmFwpE1k4FfbFpiJAOAy7vxUzi4sNX5in0nL2w==", + "requires": { + "cheerio-select": "*", + "entities": "0.x", + "htmlparser2": "2.x", + "underscore": "~1.4" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-table3": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.2.tgz", + "integrity": "sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==", + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "coffeeify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/coffeeify/-/coffeeify-3.0.1.tgz", + "integrity": "sha512-Qjnr7UX6ldK1PHV7wCnv7AuCd4q19KTUtwJnu/6JRJB4rfm12zvcXtKdacUoePOKr1I4ka/ydKiwWpNAdsQb0g==", + "dev": true, + "requires": { + "convert-source-map": "^1.3.0", + "through2": "^2.0.0" + } + }, + "coffeescript": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", + "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==" + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "dev": true, + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + }, + "dependencies": { + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", + "dev": true + } + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" + }, + "compress-brotli": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", + "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==", + "requires": { + "@types/json-buffer": "~3.0.0", + "json-buffer": "~3.0.1" + } + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha512-SLTU8iWWmcORfUN+4351Z2aZXKJe1tr0jSilPMCZlLPzpdTXnkBW1LevW/MfuANBKJek8Xu9ggqrtVmQrChLtg==", + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "devOptional": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.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 + } + } + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "core-js-compat": { + "version": "3.23.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.5.tgz", + "integrity": "sha512-fHYozIFIxd+91IIbXJgWd/igXIc8Mf9is0fusswjnGIWVG96y2cwyUdlCkGOw6rMLHKAxg7xtCIVaHsyOUnJIg==", + "dev": true, + "requires": { + "browserslist": "^4.21.2", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "requires": { + "buffer": "^5.1.0" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha512-UjZSqFCbn+jZUHJIh6Y3vMF7EJLcJWNm4tKDf2peJRwlZKHvkkvOMTvAei6zjU9gO1xONVr3rRFw0gixm2eUng==", + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "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.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "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.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "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": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.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==" + } + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==" + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "CSSselect": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/CSSselect/-/CSSselect-0.3.11.tgz", + "integrity": "sha512-ORZwQ8O6Bp3DV25zkPSQKLQ60cqygnlVvSBhr23ET7n8Og+sgTuVq+3QfvBhQON4zwk9LBZ7FLrMD6hSvRMAbw==", + "requires": { + "CSSwhat": "0.4", + "domutils": "1.2" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domutils": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.2.2.tgz", + "integrity": "sha512-/qlLe5dzDgHdCl1t0OZYSoke4c+2JzSFENEvpemP8Ey2yaY4A1cVXRlcTy8/TtgPsmuOSFznnLawMOwfim6NYQ==", + "requires": { + "domelementtype": "1" + } + } + } + }, + "CSSwhat": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/CSSwhat/-/CSSwhat-0.4.7.tgz", + "integrity": "sha512-bU5cYG02crjQGDN6wm8USThp/sr/MUulMTrVA1CENSBhv3B+mlJfYDP1em/wJlMT0aYcWso0cuT9NXW74yPfog==" + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==" + }, + "cypress": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.7.0.tgz", + "integrity": "sha512-+1EE1nuuuwIt/N1KXRR2iWHU+OiIt7H28jJDyyI4tiUftId/DrXYEwoDa5+kH2pki1zxnA0r6HrUGHV5eLbF5Q==", + "requires": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cypress-file-upload": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", + "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", + "requires": {} + }, + "cypress-mochawesome-reporter": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cypress-mochawesome-reporter/-/cypress-mochawesome-reporter-2.4.0.tgz", + "integrity": "sha512-hp1shdb4ld897WwYTgJviSjJFVpllMNesflL9FXOa0kOz4GM7UaLESrX8pnkUHBvYyO05iDMsgWhJ0x6BABukA==", + "dev": true, + "requires": { + "fs-extra": "^9.0.0", + "mochawesome": "^6.1.0", + "mochawesome-merge": "^4.0.3", + "mochawesome-report-generator": "^5.1.0" + } + }, + "cypress-multi-reporters": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/cypress-multi-reporters/-/cypress-multi-reporters-1.6.1.tgz", + "integrity": "sha512-FPeC0xWF1N6Myrwc2m7KC0xxlrtG8+x4hlsPFBDRWP8u/veR2x90pGaH3BuJfweV7xoQ4Zo85Qjhu3fgZGrBQQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "lodash": "^4.17.15" + } + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "dayjs": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", + "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepmerge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", + "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==" + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + }, + "detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dev": true, + "requires": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "diffie-hellman": { + "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.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "peer": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "dependencies": { + "entities": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", + "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==" + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ejs": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", + "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==" + }, + "electron-to-chromium": { + "version": "1.4.198", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.198.tgz", + "integrity": "sha512-jwqQPdKGeAslcq8L+1SZZgL6uDiIDmTe9Gq4brsdWAH27y7MJ2g9Ue6MyST3ogmSM49EAQP7bype1V5hsuNrmQ==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emailjs": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/emailjs/-/emailjs-1.0.12.tgz", + "integrity": "sha512-b4+30DT2pEkqG86DzoJl1Pe9rNc8x0kvqzyvA1FzepixWa6+4bDk3Ia5ZOX3JhuHEUSJwY7UtiIHnuBIZDnfFg==", + "requires": { + "addressparser": "^0.3.2", + "bufferjs": "1.1.0", + "mimelib": "0.2.14", + "moment": "2.15.2", + "starttls": "1.0.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "entities": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-0.5.0.tgz", + "integrity": "sha512-T5XQtlzuW+PfeSsGp3uryfYQof820zYbnUnUDEkwUVIAfgYeixIN16c4jh8gs0SqJUTGLU0XD6QsvjEPbmdwzQ==" + }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.61", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", + "integrity": "sha512-yFhIqQAzu2Ca2I4SE2Au3rxVfmohU9Y7wqGR+s7+H7krk26NXhIRAZDgqd6xqjCEFUomDEA3/Bo/7fKmIkW1kA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + } + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "optional": true + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha512-7S8YXIcUfPMOr3rqJBVMePAbRsD1nWeSMQ86K/lDI76S3WKXz+KWILvTIPbTroubOkZTGh+b+7/xIIphZXNYbA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha512-exfuQY8UGtn/N+gL1iKkH8fpNd5sJ760nJq6mmZAHldfxMD5kX07lbQuYlspoXsuknXNv9Fb7y2GsPOnQIbxHg==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "eslint": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", + "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", + "dev": true, + "peer": true, + "requires": { + "@eslint/eslintrc": "^1.3.0", + "@humanwhocodes/config-array": "^0.9.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.2", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "peer": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "peer": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "peer": true + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "peer": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "peer": true + } + } + }, + "eslint-plugin-cypress": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", + "integrity": "sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==", + "dev": true, + "requires": { + "globals": "^11.12.0" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "peer": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "peer": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "peer": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "peer": true + }, + "espree": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", + "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "dev": true, + "peer": true, + "requires": { + "acorn": "^8.7.1", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.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 + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "peer": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter2": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.6.tgz", + "integrity": "sha512-OHqo4wbHX5VbvlbB6o6eDwhYmiTjrpWACjF8Pmof/GTD6rdBNdZFNck3xlhqOiQFGCOoq3uzHvA0cQpFHIGVAQ==" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "requires": { + "pify": "^2.2.0" + } + }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.6.0.tgz", + "integrity": "sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.6.tgz", + "integrity": "sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "peer": true + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "requires": { + "pend": "~1.2.0" + } + }, + "fibers": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fibers/-/fibers-4.0.3.tgz", + "integrity": "sha512-MW5VrDtTOLpKK7lzw4qD7Z9tXaAhdOmOED5RHzg3+HjUk+ibkjVW0Py2ERtdqgTXaerLkVkBy2AEmJiT6RMyzg==", + "requires": { + "detect-libc": "^1.0.3" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "peer": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "dev": true, + "requires": { + "json5": "^0.5.1", + "path-exists": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "dependencies": { + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "peer": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", + "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "dev": true, + "peer": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "fsu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz", + "integrity": "sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "peer": true + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "requires": { + "globule": "^1.0.0" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "requires": { + "async": "^3.2.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "peer": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "requires": { + "ini": "2.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "requires": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "hash.js": { + "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.1" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha512-jZ38TU/EBiGKrmyTNNZgnvCZHNowiRI4+w/I9noMlekHTZH3KyGgvJLmhSgykeAQ9j2SYPDosM0Bg3wHfzibAQ==", + "optional": true, + "requires": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "optional": true + } + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "html-pdf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-pdf/-/html-pdf-3.0.1.tgz", + "integrity": "sha512-CKNSacmQn+CKJ2GNfT4UYKaPy/T3Ndj82yJ2aju/UPmnvWNjIpyumqRqkFU0mwT6BTHBFhFGTnXN8dBn4Bdj0Q==", + "requires": { + "phantomjs-prebuilt": "^2.1.16" + } + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "dev": true + }, + "htmlparser2": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-2.6.0.tgz", + "integrity": "sha512-oR9aps3hDZdU0whPlDjz4HdafpcZclpjrUOwPqDldr+WDubEnVerBNP8I0Wy0VIZO5Mxq/4yALDOYZTWf5Jtog==", + "requires": { + "domelementtype": "1", + "domhandler": "2.0", + "domutils": "1.0" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.0.3.tgz", + "integrity": "sha512-D8+qeCUo6LpYvBZsmXWunDJ9zOD8mVg6EwZIdgxmnT+xGWRsReF/TwsZ5EzlIJDipxlE6qJh1dXt9oeplGN3Bg==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.0.1.tgz", + "integrity": "sha512-EtnpDnVNvVaRBHmc5PV2lGHlgic4IjrYgS1f3U/M7CjihJIKfsJFvwj6JfAjr7f7wNDcloq3rOb08xAiL622gA==", + "requires": { + "domelementtype": "1" + } + } + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + } + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "peer": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "peer": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "peer": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "dev": true, + "requires": { + "source-map": "~0.5.3" + } + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" + }, + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + }, + "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==" + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "dev": true, + "requires": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==" + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "requires": { + "ci-info": "^3.2.0" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", + "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is2": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.7.tgz", + "integrity": "sha512-4vBQoURAXC6hnLFxD4VW7uc04XiwTTl/8ydYJxKvPwkWQrSjInkuM5VZVg6BGr1/natq69zDuvO9lGpLClJqvA==", + "requires": { + "deep-is": "^0.1.3", + "ip-regex": "^4.1.0", + "is-url": "^1.2.4" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "peer": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "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" + } + }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "junit-report-merger": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/junit-report-merger/-/junit-report-merger-2.2.3.tgz", + "integrity": "sha512-bddxE3rxoNGAt1LB5eIBbkQKluDMa2WWExsFjjtwaG0s0wQHxvDcD6OYH8t4i/8J/gv5h309NyQK23AiGFSSUA==", + "dev": true, + "requires": { + "fast-glob": "3.2.6", + "xmlbuilder2": "2.4.1" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==", + "optional": true + }, + "keyv": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.3.tgz", + "integrity": "sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==", + "requires": { + "compress-brotli": "^1.3.8", + "json-buffer": "3.0.1" + } + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==" + }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "peer": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", + "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 + }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "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.0 || ^4.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "md5.js": { + "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.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimelib": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/mimelib/-/mimelib-0.2.14.tgz", + "integrity": "sha512-U/sN1ByAmzV373tmXwv3y5XTH04Ic/2qlKuxhsSqF6osbPlKs94CqR4D6FswnrM5t7flSYXrcAUO2AEjJ5/jqw==", + "requires": { + "addressparser": "~0.2.0", + "encoding": "~0.1" + }, + "dependencies": { + "addressparser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.2.1.tgz", + "integrity": "sha512-znTNuVLOEDXQs5h48BeF0ZJwhGOOq0KEhlmFSLtYkPa4EEd48OoMxGo12ClI39rgU2Qx+/KwB7cINhC5/NGEdA==" + } + } + }, + "mimeparse": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/mimeparse/-/mimeparse-0.1.4.tgz", + "integrity": "sha512-jiuAsJJY4c0oF97oHKic9nva2y1QF2yhYJG3LXLys//f8SNQ89eFuGZ29z62Z29CAY4endJS6zFiKUtURFErog==" + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "minimalistic-assert": { + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "mocha-junit-reporter": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.0.2.tgz", + "integrity": "sha512-vYwWq5hh3v1lG0gdQCBxwNipBfvDiAM1PHroQRNp96+2l72e9wEUTw+mzoK+O0SudgfQ7WvTQZ9Nh3qkAYAjfg==", + "dev": true, + "requires": { + "debug": "^2.2.0", + "md5": "^2.1.0", + "mkdirp": "~0.5.1", + "strip-ansi": "^6.0.1", + "xml": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "mochawesome": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/mochawesome/-/mochawesome-6.3.1.tgz", + "integrity": "sha512-G2J7Le8ap+0222otJQEUVFs7RYzphiIk21NzaBZE2dbyHJ2+9aai+V2cV7lreEKigDpwQ+SXeiiBH9KQlrkaAQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "diff": "^5.0.0", + "json-stringify-safe": "^5.0.1", + "lodash.isempty": "^4.4.0", + "lodash.isfunction": "^3.0.9", + "lodash.isobject": "^3.0.2", + "lodash.isstring": "^4.0.1", + "mochawesome-report-generator": "^5.2.0", + "strip-ansi": "^6.0.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "mochawesome-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mochawesome-merge/-/mochawesome-merge-4.2.1.tgz", + "integrity": "sha512-G7+LqIKgixShKG4FyWDn1PIrzpKEwCofrJip/VzdqghNGqZl4S5MNoXx5YDfk9KLe+pr4qGa1TOzCc/oVw/8Kw==", + "dev": true, + "requires": { + "fs-extra": "^7.0.1", + "glob": "^7.1.6", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs-extra": { + "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" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "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 + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "mochawesome-report-generator": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mochawesome-report-generator/-/mochawesome-report-generator-5.2.0.tgz", + "integrity": "sha512-DDY/3jSkM/VrWy0vJtdYOf6qBLdaPaLcI7rQmBVbnclIX7AKniE1Rhz3T/cMT/7u54W5EHNo1z84z7efotq/Eg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "dateformat": "^3.0.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.0", + "fsu": "^1.0.2", + "lodash.isfunction": "^3.0.8", + "opener": "^1.5.2", + "prop-types": "^15.7.2", + "tcomb": "^3.2.17", + "tcomb-validation": "^3.3.0", + "validator": "^10.11.0", + "yargs": "^13.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "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 + }, + "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" + } + }, + "fs-extra": { + "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" + } + }, + "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": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "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 + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "dev": true, + "requires": { + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "moment": { + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.15.2.tgz", + "integrity": "sha512-dv9NAmbJRSckFY2Dt3EcgoUGg85U4AaUvtJQ56k0QFumwqpOK3Huf0pYutSVgCFfN+DekvF4pW45PP9rf6ts7g==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==" + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "peer": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "npm-install-package": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", + "integrity": "sha512-F37OfFN2Fk6ixI3bn8CNllSGMjpRxTqPcnN5j2zFlqNiaf/LGG6fCq3DeBGKRinyVMR5ROS34nWKQmn7tABuJg==" + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.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": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "requires": { + "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": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==" + } + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "peer": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==" + }, + "outpipe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", + "integrity": "sha512-BnNY/RwnDrkmQdUa9U+OfN/Y7AWmKuUPCCd+hbRclZnnANvYpO72zp/a6Q4n829hPbdqEac31XCcsvlEvb+rtA==", + "dev": true, + "requires": { + "shell-quote": "^1.4.2" + } + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "peer": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "dev": true, + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parserlib": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-1.1.1.tgz", + "integrity": "sha512-e1HbF3+7ASJ/uOZirg5/8ZfPljTh100auNterbHB8TUs5egciuWQ2eX/2al8ko0RdV9Xh/5jDei3jqJAmbTDcg==" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ==", + "optional": true, + "requires": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + }, + "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" + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "optional": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "optional": true + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha512-dxdraeZVUNEn9AvLrxkgB2k6buTlym71dJk1fk4v8j3Ou3RKNm07BcgbHdj2lLgYGfqX71F+awb1MR+tWPFJzA==", + "optional": true, + "requires": { + "throttleit": "^1.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "optional": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "optional": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.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.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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" + } + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "peer": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", + "optional": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==" + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "public-encrypt": { + "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.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" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "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==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "extraneous": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "q-io": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/q-io/-/q-io-1.13.6.tgz", + "integrity": "sha512-xgxlfN3iOQ4LMuyhb8+aibtv57HnqZqycCLaE3o/qkeqvBuEfbq4tU4oHjIHgY/LVN3vJs+Gy9hKh8kzlnug7g==", + "requires": { + "es6-set": "^0.1.1", + "mime": "^1.2.11", + "mimeparse": "^0.1.4", + "q": "^1.0.1", + "qs": "^1.2.1", + "url2": "^0.0.0" + }, + "dependencies": { + "qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha512-xEqT+49YIt+BdwQthXKTOkp7atENe6JqrGGerxBPiER6BArOIiVJtpZZYpWOpq2IOkTPVnDM8CgYvppFoJNwyQ==" + } + } + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==" + }, + "qx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/qx/-/qx-1.0.0.tgz", + "integrity": "sha512-xKgARiJEB3XyaEI/qckwleS3vsjcG7Ltfke1idOY3carneKqTKi8CRsvqFfkwVRWjhy1lV6bOw+6I/1/zXOmbQ==", + "requires": { + "q": "^1.1.2" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "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==" + }, + "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" + } + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "peer": true + }, + "regexpu-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", + "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "requires": { + "throttleit": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "require-text": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/require-text/-/require-text-0.0.1.tgz", + "integrity": "sha512-F0YWfF47G/IWK3RjLo2VIgASklXbKv5R+ZovK+v/MXsG1Gpu57i4XlCQ8x6gs2NgBo2dULGWvEySn8H2Ki2Gaw==" + }, + "reselect": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.6.tgz", + "integrity": "sha512-ZovIuXqto7elwnxyXbBtCPo9YFEr3uJqj2rRbcOOog1bmu2Ag85M4hixSwFWyaBMKXNgvPaJ9OSu9SkBPIeJHQ==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "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, + "peer": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "rgb2hex": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.10.tgz", + "integrity": "sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==", + "requires": { + "rx-lite": "*" + } + }, + "rxjs": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", + "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==" + }, + "selenium-standalone": { + "version": "6.24.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.24.0.tgz", + "integrity": "sha512-Dun2XgNAgCfJNrrSzuv7Z7Wj7QTvBKpqx0VXFz7bW9T9FUe5ytzgzoCEEshwDVMh0Dv6sCgdZg7VDhM/q2yPPQ==", + "requires": { + "commander": "^2.20.3", + "cross-spawn": "^7.0.3", + "debug": "^4.3.1", + "got": "^11.8.2", + "lodash.mapvalues": "^4.6.0", + "lodash.merge": "^4.6.2", + "minimist": "^1.2.5", + "mkdirp": "^1.0.4", + "progress": "2.0.3", + "tar-stream": "2.2.0", + "which": "^2.0.2", + "yauzl": "^2.10.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + } + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "sha.js": { + "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.1", + "safe-buffer": "^5.0.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==", + "dev": true, + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dev": true, + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" + }, + "starttls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/starttls/-/starttls-1.0.1.tgz", + "integrity": "sha512-mfOPDJsq1GSvCyl6qQK5Slj486+6c2E/DJ3vo0TXs4kB+6xFBBuua2ngiudFyjpRYr9BIibsW9wn/5gl4EPaoA==" + }, + "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" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", + "dev": true, + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "styliner": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/styliner/-/styliner-1.1.0.tgz", + "integrity": "sha512-BeK6hCfltTMKZSPMAK8J/ea5CtTfR16QpVTF3hzPlRm+ThvIw6q77GTRa1e7GgERhtdT3dwOliAFBXCDF3a7lg==", + "requires": { + "cheerio": "~0.10.1", + "CSSselect": "~0.3.0", + "lodash": "^4.17.5", + "parserlib": ">0.2.0", + "q": "^1.4.1", + "q-io": "^1.13.2", + "qx": "^1.0.0", + "winston": "^2.4.2" + } + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", + "dev": true, + "requires": { + "minimist": "^1.1.0" + } + }, + "supports-color": { + "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" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dev": true, + "requires": { + "acorn-node": "^1.2.0" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "tcomb": { + "version": "3.2.29", + "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.29.tgz", + "integrity": "sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ==", + "dev": true + }, + "tcomb-validation": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tcomb-validation/-/tcomb-validation-3.4.1.tgz", + "integrity": "sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==", + "dev": true, + "requires": { + "tcomb": "^3.0.0" + } + }, + "tcp-port-used": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", + "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", + "requires": { + "debug": "4.3.1", + "is2": "^2.0.6" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "peer": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", + "dev": true, + "requires": { + "process": "~0.11.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "peer": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "devOptional": true + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha512-ZqGrAgaqqZM7LGRzNjLnw5elevWb5M8LEoDMadxIW3OWbcv72wMMgKdwOKpd5Fqxe8choLD8HN3iSj3TUh/giQ==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" + }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + } + } + }, + "url2": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/url2/-/url2-0.0.0.tgz", + "integrity": "sha512-gb/XT1m2mnWOIbQwa5V9Dq2O07fkZbtu1K0WAAKuaNSX0c8psp2jovJTbbvPKCpimutdoK9jXOejDCtvQOoKOA==" + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true, + "peer": true + }, + "validator": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", + "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "watchify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/watchify/-/watchify-4.0.0.tgz", + "integrity": "sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==", + "dev": true, + "requires": { + "anymatch": "^3.1.0", + "browserify": "^17.0.0", + "chokidar": "^3.4.0", + "defined": "^1.0.0", + "outpipe": "^1.1.0", + "through2": "^4.0.2", + "xtend": "^4.0.2" + }, + "dependencies": { + "browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dev": true, + "requires": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "requires": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + } + } + }, + "wdio": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wdio/-/wdio-4.0.0.tgz", + "integrity": "sha512-qCDAEPZBbfSXZDIlHyiYdYvsH34e9/9GdOz9PkrnnbyuvREVsZYYVaOOdsFgcmpeS1/nJfBr2HAD4YyBI1vrqg==", + "requires": { + "fibers": "^4.0.2", + "selenium-standalone": "^6.15.4", + "tcp-port-used": "^1.0.1", + "webdriverio": "^4.12.0" + } + }, + "wdio-dot-reporter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz", + "integrity": "sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg==" + }, + "wdio-junit-to-html": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/wdio-junit-to-html/-/wdio-junit-to-html-3.1.2.tgz", + "integrity": "sha512-jg8/PUYSPYmJsiMNOmXzqNX9GebyGclOhJAQBt3rM3MYkiz2rocG6toblhAE7J5NZOzRuusn+FCIDNnhrfRsvg==", + "requires": { + "commander": "^2.9.0", + "dateformat": "^2.0.0", + "emailjs": "^1.0.8", + "xml2js": "^0.4.17" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==" + } + } + }, + "webdriverio": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.14.4.tgz", + "integrity": "sha512-Knp2vzuzP5c5ybgLu+zTwy/l1Gh0bRP4zAr8NWcrStbuomm9Krn9oRF0rZucT6AyORpXinETzmeowFwIoo7mNA==", + "requires": { + "archiver": "~2.1.0", + "babel-runtime": "^6.26.0", + "css-parse": "^2.0.0", + "css-value": "~0.0.1", + "deepmerge": "~2.0.1", + "ejs": "~2.5.6", + "gaze": "~1.1.2", + "glob": "~7.1.1", + "grapheme-splitter": "^1.0.2", + "inquirer": "~3.3.0", + "json-stringify-safe": "~5.0.1", + "mkdirp": "~0.5.1", + "npm-install-package": "~2.1.0", + "optimist": "~0.6.1", + "q": "~1.5.0", + "request": "^2.83.0", + "rgb2hex": "^0.1.9", + "safe-buffer": "~5.1.1", + "supports-color": "~5.0.0", + "url": "~0.11.0", + "wdio-dot-reporter": "~0.0.8", + "wgxpath": "~1.0.0" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "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" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng==" + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==" + }, + "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": "5.0.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", + "integrity": "sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA==", + "requires": { + "has-flag": "^2.0.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + } + } + }, + "wgxpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-1.0.0.tgz", + "integrity": "sha512-2Hp4+h29WkaYf3eudZwYttm7efBuMdvWgCkD7xMveAxDqzIeB2WasyEWHHxxh7iHXehDH5NFEZ2X4q1uaZOxnQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "which-typed-array": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", + "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-abstract": "^1.20.0", + "for-each": "^0.3.3", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.9" + } + }, + "winston": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.6.tgz", + "integrity": "sha512-J5Zu4p0tojLde8mIOyDSsmLmcP8I3Z6wtwpTDHx1+hGcdhxcJaAmG4CFtagkb+NiN1M9Ek4b42pzMWqfc9jm8w==", + "requires": { + "async": "^3.2.3", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "peer": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==" + }, + "workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha512-7YXTQc3P2l9+0rjaUbLwMKRhtmwg1M1eDf6nag7urC7pIPYLD9W/jmzQ4ptRSUbodw5S0jfoGTflLemQibSpeQ==" + }, + "xmlbuilder2": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/xmlbuilder2/-/xmlbuilder2-2.4.1.tgz", + "integrity": "sha512-vliUplZsk5vJnhxXN/mRcij/AE24NObTUm/Zo4vkLusgayO6s3Et5zLEA14XZnY1c3hX5o1ToR0m0BJOPy0UvQ==", + "dev": true, + "requires": { + "@oozcitak/dom": "1.15.8", + "@oozcitak/infra": "1.0.8", + "@oozcitak/util": "8.3.8", + "@types/node": "*", + "js-yaml": "3.14.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "requires": { + "argparse": "^1.0.7", + "glob": "^7.0.5" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + } + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha512-2olrDUuPM4NvRIgGPhvrp84f7/HmWR6RiQrgwFF2VctmnssFiogtYL3DcA8Vl2bsSmju79sVXe38TsII7JleUg==", + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..d354dbc0 --- /dev/null +++ b/package.json @@ -0,0 +1,50 @@ +{ + "name": "apim4_integration_tests", + "version": "1.0.0", + "description": "Integration tests written in cypress.io for WSO2 API Manager 4.x versions", + "main": "index.js", + "scripts": { + "test": "cypress run --spec **/*.spec.js", + "test:local": "./test.local.sh", + "test:gui": "cypress run --headed", + "test:dev": "cypress open", + "delete:reportFolderHTML": "rm -rf cypress/reports/html/.jsons/*", + "delete:reportFolderJUnit": "rm -rf cypress/reports/junit/*", + "delete:reportFolderReport": "rm -rf cypress/reports/mochawesome-bundle.json", + "delete:reportSummary": "rm -rf cypress/reports/summary.txt", + "pre-test": "npm run delete:reportFolderHTML && npm run delete:reportFolderJUnit && npm run delete:reportFolderReport && npm run delete:reportSummary", + "report:merge": "mochawesome-merge ./cypress/reports/html/.jsons/*.json > ./cypress/reports/mochawesome-bundle.json", + "report:generate": "marge --inline --saveHtml --charts ./cypress/reports/mochawesome-bundle.json -o ./cypress/reports/html", + "merge-junit-reports": "jrm ./cypress/reports/junit/combined.xml \"./cypress/reports/junit/*.xml\"", + "test:admin": "cypress run --spec cypress/integration/admin/*.spec.js" + }, + "keywords": [ + "cypress.io" + ], + "author": "wso2", + "license": "Apache-2.0", + "devDependencies": { + "@cypress/browserify-preprocessor": "^3.0.1", + "babel-plugin-module-resolver": "^4.1.0", + "cypress": "^9.1.1", + "cypress-mochawesome-reporter": "^2.2.0", + "cypress-multi-reporters": "^1.5.0", + "eslint-plugin-cypress": "^2.11.2", + "junit-report-merger": "^2.2.3", + "mocha": "^9.0.2", + "mocha-junit-reporter": "^2.0.0", + "mochawesome": "^6.2.2", + "mochawesome-merge": "^4.2.0", + "mochawesome-report-generator": "^5.2.0" + }, + "dependencies": { + "aws-sdk": "^2.942.0", + "cypress-file-upload": "^5.0.8", + "html-pdf": "^3.0.1", + "require-text": "0.0.1", + "styliner": "^1.1.0", + "wdio": "^4.0.0", + "wdio-junit-to-html": "^3.1.2", + "yamljs": "^0.3.0" + } +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..40ca4c9b --- /dev/null +++ b/pom.xml @@ -0,0 +1,14 @@ + + 4.0.0 + org.wso2.carbon.apim + sample.project + 4.1.0 + + + org.testng + testng + 6.8.8 + test + + + \ No newline at end of file diff --git a/pull_request_template.md b/pull_request_template.md deleted file mode 100644 index 9b32185a..00000000 --- a/pull_request_template.md +++ /dev/null @@ -1,52 +0,0 @@ -## Purpose -> Describe the problems, issues, or needs driving this feature/fix and include links to related issues in the following format: Resolves issue1, issue2, etc. - -## Goals -> Describe the solutions that this feature/fix will introduce to resolve the problems described above - -## Approach -> Describe how you are implementing the solutions. Include an animated GIF or screenshot if the change affects the UI (email documentation@wso2.com to review all UI text). Include a link to a Markdown file or Google doc if the feature write-up is too long to paste here. - -## User stories -> Summary of user stories addressed by this change> - -## Release note -> Brief description of the new feature or bug fix as it will appear in the release notes - -## Documentation -> Link(s) to product documentation that addresses the changes of this PR. If no doc impact, enter “N/A” plus brief explanation of why there’s no doc impact - -## Training -> Link to the PR for changes to the training content in https://github.com/wso2/WSO2-Training, if applicable - -## Certification -> Type “Sent” when you have provided new/updated certification questions, plus four answers for each question (correct answer highlighted in bold), based on this change. Certification questions/answers should be sent to certification@wso2.com and NOT pasted in this PR. If there is no impact on certification exams, type “N/A” and explain why. - -## Marketing -> Link to drafts of marketing content that will describe and promote this feature, including product page changes, technical articles, blog posts, videos, etc., if applicable - -## Automation tests - - Unit tests - > Code coverage information - - Integration tests - > Details about the test cases and coverage - -## Security checks - - Followed secure coding standards in http://wso2.com/technical-reports/wso2-secure-engineering-guidelines? yes/no - - Ran FindSecurityBugs plugin and verified report? yes/no - - Confirmed that this PR doesn't commit any keys, passwords, tokens, usernames, or other secrets? yes/no - -## Samples -> Provide high-level details about the samples related to this feature - -## Related PRs -> List any other related PRs - -## Migrations (if applicable) -> Describe migration steps and platforms on which migration has been tested - -## Test environment -> List all JDK versions, operating systems, databases, and browser/versions on which this feature/fix was tested - -## Learning -> Describe the research phase and any blog posts, patterns, libraries, or add-ons you used to solve the problem. \ No newline at end of file diff --git a/run-scenarios.sh b/run-scenarios.sh deleted file mode 100644 index 377e74fa..00000000 --- a/run-scenarios.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -#TODO: compete the script when TestGrid implements support for this -prgdir=$(dirname "$0") -rootDir=$(cd "$prgdir"; pwd) - -#. ./init.sh -#echo "JMETER_HOME = " $JMETER_HOME - -#source $rootDir/Scenario04/run-scenario.sh - - diff --git a/scenario01/README.md b/scenario01/README.md deleted file mode 100644 index 4c3ebb4d..00000000 --- a/scenario01/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# Scenario 1 - API Development - -### High level scenario description -In the API Development space following three main aspects exists. -* Managing Public, Partner vs Private APIs -* Ownership, permission and collaborative API development -* Developer Optimized APIs Development - -### Current folder structure -``` -Scenario1 -|-jmeter - |-01-Solution1-PublicPartnerPrivateAPI.jmx - |-02-Solution1-OwnershipAndColDevelopment.jmx - |-03-Solution1-DeveloperOptimizedAPIDevelopment.jmx -|-resources - |-user.properties - |-SubscriptionValueSet.csv - |-UserAgentValueSet.csv - |-UserAndRoleCreation.csv - |-UserDetails.csv - |-ViewAPI_CreatedByAdmin.csv -``` -### Pre-requists to execute tests -All the jmeter scripts requires a change in tenant-conf.json and this registry entry has been updated using registry rest apis. WSO2 APIM does not bundle the registry apis by default hence the registry.war which exists in WSO2 Greg distribution can be used for this purpose. Please copy this registry.war to APIM_HOME/repository/deployment/server/webapps and start the server -Please see [2635](https://github.com/wso2/product-apim/issues/2635) - -### Running the scripts -Following three commands can be used to run the scripts respectively -```sh ->path/to/jmeter/bin/jmeter -n -t xx.xxxx.jmx -p path/to/user.properties -l xxxx.jtl -``` -As an example -```sh ->path/to/jmeter/bin/jmeter -n -t 01-Solution1-PublicPartnerPrivateAPI.jmx -p ../user.properties -l test1.jtl -``` diff --git a/scenario01/jmeter/01-Solution1-PublicPartnerPrivateAPI.jmx b/scenario01/jmeter/01-Solution1-PublicPartnerPrivateAPI.jmx deleted file mode 100644 index 2781827e..00000000 --- a/scenario01/jmeter/01-Solution1-PublicPartnerPrivateAPI.jmx +++ /dev/null @@ -1,4194 +0,0 @@ - - - - - - false - true - - - - host - ${__property(serverHost)} - = - - - port - ${__property(serverPort)} - = - - - servletPort - ${__property(servletPort)} - = - - - hybridRole - hybridRole - = - - - publisherRole - publisherRole - = - - - subscriberRole - subscriberRole - = - - - tomcathost - ${__property(tomcatHost)} - = - - - tomcatport - ${__property(tomcatPort)} - = - - - - - - - - true - false - - - - - false - - - - continue - - false - 1 - - 3 - 1 - 1515131057000 - 1515131057000 - false - - - - - - - - tenantPassword - jane123 - = - - - email - test@gmail.com - = - - - adminUsername - ${__property(adminusername)} - = - - - adminPassword - ${__property(adminpassword)} - = - - - - - - - tenantDomain - tenantAdmin - tenantAdminFirstName - tenantAdminLastName - - - - finance.abc.com - jane - Jane - Edwards - - - core.abc.com - jane - Jane - Edwards - - - operations.abc.com - jane - Jane - Edwards - - - false - - - - 2 - 5 - 1 - tenantID - - false - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.mgt.tenant.carbon.wso2.org" xmlns:xsd="http://beans.common.stratos.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <ser:addTenant> - <!--Optional:--> - <ser:tenantInfoBean> - <!--Optional:--> - <xsd:active>true</xsd:active> - <!--Optional:--> - <xsd:admin>${tenantAdmin}</xsd:admin> - <!--Optional:--> - <xsd:adminPassword>${tenantPassword}</xsd:adminPassword> - <!--Optional:--> - <xsd:createdDate></xsd:createdDate> - <!--Optional:--> - <xsd:email>${email}</xsd:email> - <!--Optional:--> - <xsd:firstname>${tenantAdminFirstName}</xsd:firstname> - <!--Optional:--> - <xsd:lastname>${tenantAdminLastName}</xsd:lastname> - <!--Optional:--> - <xsd:originatedService></xsd:originatedService> - <!--Optional:--> - <xsd:successKey></xsd:successKey> - <!--Optional:--> - <xsd:tenantDomain>${tenantDomain}</xsd:tenantDomain> - <!--Optional:--> - <xsd:tenantId>${tenantID}</xsd:tenantId> - <!--Optional:--> - <xsd:usagePlan></xsd:usagePlan> - </ser:tenantInfoBean> - </ser:addTenant> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/TenantMgtAdminService.TenantMgtAdminServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:addTenant - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - adminUsername,adminPassword - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("adminUsername") + ":" + vars.get("adminPassword"); -log.info("Username: " + vars.get("adminUsername")); -log.info("Password: " + vars.get("adminPassword")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 4 - 1 - 1515577053000 - 1515577053000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - jane@finance.abc.com - jane123 - - - jane@core.abc.com - jane123 - - - jane@operations.abc.com - jane123 - - - false - - - - true - - - - false - { - "EnableMonetization" : false, - "IsUnlimitedTierPaid" : false, - "ExtensionHandlerPosition": "bottom", - "RESTAPIScopes": { - "Scope": [ - { - "Name": "apim:api_publish", - "Roles": "admin,Internal/publisher,hybridRole,publisherRole" - }, - { - "Name": "apim:api_create", - "Roles": "admin,Internal/creator,hybridRole" - }, - { - "Name": "apim:api_view", - "Roles": "admin,Internal/publisher,Internal/creator,hybridRole,publisherRole" - }, - { - "Name": "apim:subscribe", - "Roles": "admin,Internal/subscriber,subscriberRole,hybridRole" - }, - { - "Name": "apim:tier_view", - "Roles": "admin,Internal/publisher,Internal/creator" - }, - { - "Name": "apim:tier_manage", - "Roles": "admin" - }, - { - "Name": "apim:bl_view", - "Roles": "admin" - }, - { - "Name": "apim:bl_manage", - "Roles": "admin" - }, - { - "Name": "apim:subscription_view", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:subscription_block", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:mediation_policy_view", - "Roles": "admin" - }, - { - "Name": "apim:mediation_policy_create", - "Roles": "admin" - }, - { - "Name": "apim:api_workflow", - "Roles": "admin" - }, - { - "Name": "apim:app_owner_change", - "Roles": "admin" - } - ] - }, - "NotificationsEnabled":"false", - "Notifications":[{ - "Type":"new_api_version", - "Notifiers" :[{ - "Class":"org.wso2.carbon.apimgt.impl.notification.NewAPIVersionEmailNotifier", - "ClaimsRetrieverImplClass":"org.wso2.carbon.apimgt.impl.token.DefaultClaimsRetriever", - "Title": "Version $2 of $1 Released", - "Template": " <html> <body> <h3 style=\"color:Black;\">We’re happy to announce the arrival of the next major version $2 of $1 API which is now available in Our API Store.</h3><a href=\"https://localhost:9443/store\">Click here to Visit WSO2 API Store</a></body></html>" - }] - } - ], - "DefaultRoles" : { - "PublisherRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/publisher" - }, - "CreatorRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/creator" - }, - "SubscriberRole" : { - "CreateOnTenantLoad" : true - } - } -} - = - - - - ${host} - ${port} - https - - /resource/1.0.0/artifact/_system/config/apimgt/applicationdata/tenant-conf.json - PUT - true - false - true - false - - - - - - - - - Content-Type - application/json - - - Authorization - Basic ${encoded_ClientCredentials} - - - Media-Type - application/json - - - - - - - 204 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 4 - 1 - 1515141491000 - 1515141491000 - false - - - - - - - username - password - username_to_create - password_to_create - - - - jane@finance.abc.com - jane123 - hybridUser - hybird123 - - - jane@core.abc.com - jane123 - hybridUser - hybird123 - - - jane@operations.abc.com - jane123 - hybridUser - hybird123 - - - ${__property(adminusername)} - ${__property(adminpassword)} - hybridUser - hybird123 - - - false - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org" xmlns:xsd="http://common.mgt.user.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <ser:addUser> - <!--Optional:--> - <ser:userName>${username_to_create}</ser:userName> - <!--Optional:--> - <ser:credential>${password_to_create}</ser:credential> - <!--Zero or more repetitions:--> - <ser:roleList></ser:roleList> - <ser:profileName>default</ser:profileName> - <!--Optional:--> - <ser:requirePasswordChange>false</ser:requirePasswordChange> - </ser:addUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:addUser - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org" xmlns:xsd="http://dao.service.ws.um.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <ser:addRole> - <!--Optional:--> - <ser:roleName>${hybridRole}</ser:roleName> - <!--Zero or more repetitions:--> - <ser:userList>${username_to_create}</ser:userList> - <!--Zero or more repetitions:--> - <ser:permissions> - <!--Optional:--> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/login</xsd:resourceId> - </ser:permissions> - <ser:permissions> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/manage/api</xsd:resourceId> - </ser:permissions> - <ser:permissions> - <!--Optional:--> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/configure/governance</xsd:resourceId> - </ser:permissions> - <ser:permissions> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/manage/resources/govern</xsd:resourceId> - </ser:permissions> - </ser:addRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:addRole - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 4 - 1 - 1515141491000 - 1515141491000 - false - - - - - - - username - password - username_to_create - password_to_create - - - - jane@finance.abc.com - jane123 - publisher - pub123 - - - jane@core.abc.com - jane123 - publisher - pub123 - - - jane@operations.abc.com - jane123 - publisher - pub123 - - - ${__property(adminusername)} - ${__property(adminpassword)} - publisher - pub123 - - - false - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org" xmlns:xsd="http://common.mgt.user.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <ser:addUser> - <!--Optional:--> - <ser:userName>${username_to_create}</ser:userName> - <!--Optional:--> - <ser:credential>${password_to_create}</ser:credential> - <!--Zero or more repetitions:--> - <ser:roleList></ser:roleList> - <ser:profileName>default</ser:profileName> - <!--Optional:--> - <ser:requirePasswordChange>false</ser:requirePasswordChange> - </ser:addUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:addUser - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org" xmlns:xsd="http://dao.service.ws.um.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <ser:addRole> - <!--Optional:--> - <ser:roleName>${publisherRole}</ser:roleName> - <!--Zero or more repetitions:--> - <ser:userList>${username_to_create}</ser:userList> - <!--Zero or more repetitions:--> - <ser:permissions> - <!--Optional:--> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/login</xsd:resourceId> - </ser:permissions> - <ser:permissions> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/manage/api/publish</xsd:resourceId> - </ser:permissions> - </ser:addRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:addRole - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 4 - 1 - 1515141491000 - 1515141491000 - false - - - - - - - username - password - username_to_create - password_to_create - - - - jane@finance.abc.com - jane123 - subscriber - sub123 - - - jane@core.abc.com - jane123 - subscriber - sub123 - - - jane@operations.abc.com - jane123 - subscriber - sub123 - - - ${__property(adminusername)} - ${__property(adminpassword)} - subscriber - sub123 - - - false - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org" xmlns:xsd="http://common.mgt.user.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <ser:addUser> - <!--Optional:--> - <ser:userName>${username_to_create}</ser:userName> - <!--Optional:--> - <ser:credential>${password_to_create}</ser:credential> - <!--Zero or more repetitions:--> - <ser:roleList></ser:roleList> - <ser:profileName>default</ser:profileName> - <!--Optional:--> - <ser:requirePasswordChange>false</ser:requirePasswordChange> - </ser:addUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:addUser - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org" xmlns:xsd="http://dao.service.ws.um.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <ser:addRole> - <!--Optional:--> - <ser:roleName>${subscriberRole}</ser:roleName> - <!--Zero or more repetitions:--> - <ser:userList>${username_to_create}</ser:userList> - <!--Zero or more repetitions:--> - <ser:permissions> - <!--Optional:--> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/login</xsd:resourceId> - </ser:permissions> - <ser:permissions> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/manage/api/subscribe</xsd:resourceId> - </ser:permissions> - </ser:addRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:addRole - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 6 - 120 - 1515150848000 - 1515150848000 - false - - - - - - - username - password - apiname - context - visibility - subscription - subscriptionAvailableTenants - resource - backend - - - - jane@finance.abc.com - jane123 - SalaryDetails - salary - PRIVATE - current_tenant - null - /salary/{id} - /sample-data-backend/rservice/salaryservice/ - - - jane@core.abc.com - jane123 - MobileStock - stock - PRIVATE - current_tenant - null - /stock/{id} - /sample-data-backend/rservice/stockservice/ - - - jane@operations.abc.com - jane123 - MaintainceTasks - tasks - PRIVATE - current_tenant - null - /task/{id} - /sample-data-backend/rservice/taskservice/ - - - ${__property(adminusername)} - ${__property(adminpassword)} - EmployeeInfo - info - PUBLIC - specific_tenants - ["finance.abc.com", "core.abc.com"] - /employee/{id} - /sample-data-backend/rservice/employeeservice/ - - - ${__property(adminusername)} - ${__property(adminpassword)} - PhonePrice - price - PUBLIC - all_tenants - null - /mobile/{id} - /sample-data-backend/rservice/mobilepriceservice/ - - - ${__property(adminusername)} - ${__property(adminpassword)} - MobilePouch - pouch - PUBLIC - specific_tenants - [] - /pouch/{id} - /sample-data-backend/rservice/mobilepriceservice/ - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_publisher", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("username: " + vars.get("username")); -log.info("password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_create - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - false - - - - true - - - - false - { - "name": "${apiname}", - "description": "This document describe a RESTFul API for TestAPIfromREST API.\r\n", - "context": "${context}", - "version": "1.0.0", - "provider":"${username}", - "apiDefinition":"{\"swagger\":\"2.0\",\"paths\":{\"${resource}\":{\"get\":{\"responses\":{\"200\":{\"description\":\"this is test\"}},\"parameters\":[{\"name\":\"id\",\"in\":\"path\",\"allowMultiple\":false,\"required\":true,\"type\":\"string\"}],\"x-auth-type\":\"Application & Application User\",\"x-throttling-tier\":\"Unlimited\"}}},\"info\":{\"title\":\"${apiname}\",\"version\":\"1.0.0\"}}", - "isDefaultVersion": false, - "type": "HTTP", - "transport": [ - "http", - "https" - ], - "tiers": ["Unlimited"], - "visibility": "${visibility}", - "endpointConfig": "{\"production_endpoints\":{\"url\":\"http://${tomcathost}:${tomcatport}/${backend}\",\"config\":null},\"sandbox_endpoints\":{\"url\":\"${backend}\",\"config\":null},\"endpoint_type\":\"http\"}", - "subscriptionAvailability": "${subscription}", - "subscriptionAvailableTenants": ${subscriptionAvailableTenants} -} - = - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - apid;apiname - $.id;$.name - 1;1 - NOTFOUND;NOTFOUND - - - - groovy - apiname, apid - - - def salary_api_id; -def task_api_id; -def stock_api_id; -def emp_api_id; -def mobile_api_id; -def pouch_api_id; -def api_name = vars.get("apiname"); -def aid = vars.get("apid"); - - -if (api_name.equals("SalaryDetails")){ - salary_api_id = aid; - log.info(salary_api_id); - props.put("salaryapiid", salary_api_id); - log.info("Salary Prop:" + props.get("salaryapiid")); -} -else if (api_name.equals("MobileStock")){ - stock_api_id = aid; - props.put("stockapiid", stock_api_id); - log.info("Stock Prop:" + props.get("stockapiid")); -} -else if (api_name.equals("MaintainceTasks")){ - task_api_id = aid; - props.put("taskapiid", task_api_id); - log.info("Task Prop:" + props.get("taskapiid")); -} -else if (api_name.equals("EmployeeInfo")){ - emp_api_id = aid; - props.put("empapiid", emp_api_id); - log.info("Employee Prop:" + props.get("empapiid")); -} -else if (api_name.equals("PhonePrice")){ - mobile_api_id = aid; - props.put("mobileapiid", mobile_api_id); - log.info("Mobile Price Prop:" + props.get("mobileapiid")); -} -else if (api_name.equals("MobilePouch")){ - pouch_api_id = aid; - props.put("pouchapiid", pouch_api_id); - log.info("Mobile Pouch Prop:" + props.get("pouchapiid")); -} - - - - - - - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_publish - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_publish - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - 3000 - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis/change-lifecycle?apiId=${apid}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_publish} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - continue - - false - 1 - - 1 - 1 - 1515468057000 - 1515468057000 - false - - - - - - - - appName - TestApplication - = - - - maxIterations - 4 - = - - - - - - - false - - - - true - ${maxIterations} - - - - , - - ../resources/SubscriptionValueSet.csv - false - false - false - shareMode.all - true - username,password,auth,expectedRe_Salary,expectedRe_Stock,expectedRe_Tasks,expectedRe_Emp,expectedRe_Price,expectedRe_Pouch - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_store", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:subscribe - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_sub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "throttlingTier": "Unlimited", - "description": "sample app description", - "name": "${appName}" -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/applications - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - NOT_FOUND - - - - groovy - application_id - - - props.put("application_id_no", vars.get("application_id")); -log.info("ApplicationId:" + props.get("application_id_no")); - - - - - - 201 - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${__P(salaryapiid)}", - "applicationId": "${__P(application_id_no)}" -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - NOT_FOUND - - - - - ${expectedRe_Salary} - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${__P(stockapiid)}", - "applicationId": "${__P(application_id_no)}" -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - NOT_FOUND - - - - - ${expectedRe_Stock} - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${__P(taskapiid)}", - "applicationId": "${__P(application_id_no)}" -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - NOT_FOUND - - - - - ${expectedRe_Tasks} - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${__P(empapiid)}", - "applicationId": "${__P(application_id_no)}" -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - NOT_FOUND - - - - - ${expectedRe_Emp} - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${__P(mobileapiid)}", - "applicationId": "${__P(application_id_no)}" -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - NOT_FOUND - - - - - ${expectedRe_Pouch} - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${__P(pouchapiid)}", - "applicationId": "${__P(application_id_no)}" -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - NOT_FOUND - - - - - ${expectedRe_Pouch} - - Assertion.response_code - false - 16 - - - - - - - continue - - false - 1 - - 4 - 1 - 1515587607000 - 1515587607000 - false - - - - - - - username - password - - - - jane@finance.abc.com - jane123 - - - jane@core.abc.com - jane123 - - - jane@operations.abc.com - jane123 - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_store", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("username: " + vars.get("username")); -log.info("username: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:subscribe - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_sub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_publisher", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_create - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_pub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/apis - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - api_id - $..id - -1 - NOTFOUND - - - - - ${__javaScript(${api_id_matchNr} > 0,)} - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions?apiId=${api_id_1} - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - subs_id - $..subscriptionId - -1 - NOTFOUND - - - - - ${__javaScript(${subs_id_matchNr} > 0,)} - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions/${subs_id_1} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions?apiId=${api_id_1} - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - subs_id - $..subscriptionId - -1 - NOTFOUND - - - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis/${api_id_1} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_pub} - - - - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/apis - GET - true - false - true - false - - - - - - - api_id - $..id - -1 - NOTFOUND - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - - - false - true - false - - - - - continue - - false - 1 - - 4 - 1 - 1515648031000 - 1515648031000 - false - - - - - - - username - password - - - - jane@finance.abc.com - jane123 - - - jane@core.abc.com - jane123 - - - jane@operations.abc.com - jane123 - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_store", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("username: " + vars.get("username")); -log.info("username: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:subscribe - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_sub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/applications - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - app_name;app_id - $.list[?(@.name != 'DefaultApplication')].name;$.list[?(@.name != 'DefaultApplication')].applicationId - -1;-1 - NOTFOUND;NOTFOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - ${__javaScript(${app_id_matchNr} > 0,)} - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/applications/${app_id_1} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/applications - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - app_name;app_id - $.list[?(@.name != 'DefaultApplication')].name;$.list[?(@.name != 'DefaultApplication')].applicationId - -1;-1 - NOTFOUND;NOTFOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - false - true - false - - - - - continue - - false - 1 - - 4 - 1 - 1515677608000 - 1515677608000 - false - - - - - - - userToDelete - username - password - - - - hybridUser - ${__property(adminusername)} - ${__property(adminpassword)} - - - hybridUser - jane@finance.abc.com - jane123 - - - hybridUser - jane@core.abc.com - jane123 - - - hybridUser - jane@operations.abc.com - jane123 - - - false - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deleteUser> - <!--Optional:--> - <ser:userName>${userToDelete}</ser:userName> - </ser:deleteUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deleteUser - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deleteRole> - <!--Optional:--> - <ser:roleName>${hybridRole}</ser:roleName> - </ser:deleteRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deleteRole - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - continue - - false - 1 - - 4 - 1 - 1515677608000 - 1515677608000 - false - - - - - - - userToDelete - username - password - - - - publisher - ${__property(adminusername)} - ${__property(adminpassword)} - - - publisher - jane@finance.abc.com - jane123 - - - publisher - jane@core.abc.com - jane123 - - - publisher - jane@operations.abc.com - jane123 - - - false - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deleteUser> - <!--Optional:--> - <ser:userName>${userToDelete}</ser:userName> - </ser:deleteUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deleteUser - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deleteRole> - <!--Optional:--> - <ser:roleName>${publisherRole}</ser:roleName> - </ser:deleteRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deleteRole - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - continue - - false - 1 - - 4 - 1 - 1515677608000 - 1515677608000 - false - - - - - - - userToDelete - username - password - - - - subscriber - ${__property(adminusername)} - ${__property(adminpassword)} - - - subscriber - jane@finance.abc.com - jane123 - - - subscriber - jane@core.abc.com - jane123 - - - subscriber - jane@operations.abc.com - jane123 - - - false - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deleteUser> - <!--Optional:--> - <ser:userName>${userToDelete}</ser:userName> - </ser:deleteUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deleteUser - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deleteRole> - <!--Optional:--> - <ser:roleName>${subscriberRole}</ser:roleName> - </ser:deleteRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deleteRole - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - continue - - false - 1 - - 3 - 1 - 1515677608000 - 1515677608000 - false - - - - - - - tenantDomain - username - password - - - - finance.abc.com - ${__property(adminusername)} - ${__property(adminpassword)} - - - core.abc.com - ${__property(adminusername)} - ${__property(adminpassword)} - - - operations.abc.com - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.mgt.tenant.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deactivateTenant> - <!--Optional:--> - <ser:tenantDomain>${tenantDomain}</ser:tenantDomain> - </ser:deactivateTenant> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/TenantMgtAdminService.TenantMgtAdminServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deactivateTenant - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.mgt.tenant.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deleteTenant> - <!--Optional:--> - <ser:tenantDomain>${tenantDomain}</ser:tenantDomain> - </ser:deleteTenant> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/TenantMgtAdminService.TenantMgtAdminServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deleteTenant - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 1 - 1 - 1515577053000 - 1515577053000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "EnableMonetization" : false, - "IsUnlimitedTierPaid" : false, - "ExtensionHandlerPosition": "bottom", - "RESTAPIScopes": { - "Scope": [ - { - "Name": "apim:api_publish", - "Roles": "admin,Internal/publisher" - }, - { - "Name": "apim:api_create", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:api_view", - "Roles": "admin,Internal/publisher,Internal/creator" - }, - { - "Name": "apim:subscribe", - "Roles": "admin,Internal/subscriber" - }, - { - "Name": "apim:tier_view", - "Roles": "admin,Internal/publisher,Internal/creator" - }, - { - "Name": "apim:tier_manage", - "Roles": "admin" - }, - { - "Name": "apim:bl_view", - "Roles": "admin" - }, - { - "Name": "apim:bl_manage", - "Roles": "admin" - }, - { - "Name": "apim:subscription_view", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:subscription_block", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:mediation_policy_view", - "Roles": "admin" - }, - { - "Name": "apim:mediation_policy_create", - "Roles": "admin" - }, - { - "Name": "apim:api_workflow", - "Roles": "admin" - }, - { - "Name": "apim:app_owner_change", - "Roles": "admin" - } - ] - }, - "NotificationsEnabled":"false", - "Notifications":[{ - "Type":"new_api_version", - "Notifiers" :[{ - "Class":"org.wso2.carbon.apimgt.impl.notification.NewAPIVersionEmailNotifier", - "ClaimsRetrieverImplClass":"org.wso2.carbon.apimgt.impl.token.DefaultClaimsRetriever", - "Title": "Version $2 of $1 Released", - "Template": " <html> <body> <h3 style=\"color:Black;\">We’re happy to announce the arrival of the next major version $2 of $1 API which is now available in Our API Store.</h3><a href=\"https://localhost:9443/store\">Click here to Visit WSO2 API Store</a></body></html>" - }] - } - ], - "DefaultRoles" : { - "PublisherRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/publisher" - }, - "CreatorRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/creator" - }, - "SubscriberRole" : { - "CreateOnTenantLoad" : true - } - } -} - = - - - - ${host} - ${port} - https - - /resource/1.0.0/artifact/_system/config/apimgt/applicationdata/tenant-conf.json - PUT - true - false - true - false - - - - - - - - - Content-Type - application/json - - - Authorization - Basic ${encoded_ClientCredentials} - - - Media-Type - application/json - - - - - - - 204 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - false - - saveConfig - - - false - false - true - - true - true - true - true - false - true - false - true - true - true - true - true - true - false - true - 0 - true - true - true - true - true - true - - - scenario-01-results.jtl - - - - - true - - - - diff --git a/scenario01/jmeter/01-post-scenario-steps.sh b/scenario01/jmeter/01-post-scenario-steps.sh deleted file mode 100644 index 1085ad55..00000000 --- a/scenario01/jmeter/01-post-scenario-steps.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -echo "working directory : "$scriptPath - -source $scriptPath/../teardown.sh diff --git a/scenario01/jmeter/01-pre-scenario-steps.sh b/scenario01/jmeter/01-pre-scenario-steps.sh deleted file mode 100644 index 5be4c60c..00000000 --- a/scenario01/jmeter/01-pre-scenario-steps.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -serverHost=$serverHost -serverPort=$serverPort -msf4jServiceHost=ms4fjServerHostTBD -msf4jServicePort=8080 - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -echo "working directory : "$scriptPath - -#updating jmeter properties - user.properties -sed -i "s|^\(serverHost\s*=\s*\).*\$|\1${serverHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(serverPort\s*=\s*\).*\$|\1${serverPort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(msf4jServiceHost\s*=\s*\).*\$|\1${msf4jServiceHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(msf4jServicePort\s*=\s*\).*\$|\1${msf4jServicePort}|" $scriptPath/../resources/user.properties -#run base-setup.sh -source $scriptPath/../base-setup.sh > $scriptPath/basesetup.log diff --git a/scenario01/jmeter/02-Solution1-OwnershipAndColDevelopment.jmx b/scenario01/jmeter/02-Solution1-OwnershipAndColDevelopment.jmx deleted file mode 100644 index 36ffcdf8..00000000 --- a/scenario01/jmeter/02-Solution1-OwnershipAndColDevelopment.jmx +++ /dev/null @@ -1,2214 +0,0 @@ - - - - - - false - true - - - - host - ${__property(serverHost)} - = - - - port - ${__property(serverPort)} - = - - - servletPort - ${__property(servletPort)} - = - - - tomcathost - ${__property(tomcatHost)} - = - - - tomcatport - ${__property(tomcatPort)} - = - - - - - - - - true - false - - - - - false - - - - continue - - false - 1 - - 1 - 1 - 1515577053000 - 1515577053000 - false - - 900000 - - - - 1 - 0 - 900000 - This will delay - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "EnableMonetization" : false, - "IsUnlimitedTierPaid" : false, - "ExtensionHandlerPosition": "bottom", - "RESTAPIScopes": { - "Scope": [ - { - "Name": "apim:api_publish", - "Roles": "admin,Internal/publisher,testRole1,testRole2,testRole3,testRole4" - }, - { - "Name": "apim:api_create", - "Roles": "admin,Internal/creator,testRole1,testRole2,testRole3,testRole4" - }, - { - "Name": "apim:api_view", - "Roles": "admin,Internal/publisher,Internal/creator,testRole1,testRole2,testRole3,testRole4" - }, - { - "Name": "apim:subscribe", - "Roles": "admin,Internal/subscriber,subscriberRole,hybridRole" - }, - { - "Name": "apim:tier_view", - "Roles": "admin,Internal/publisher,Internal/creator,testRole1,testRole2,testRole3,testRole4" - }, - { - "Name": "apim:tier_manage", - "Roles": "admin" - }, - { - "Name": "apim:bl_view", - "Roles": "admin" - }, - { - "Name": "apim:bl_manage", - "Roles": "admin" - }, - { - "Name": "apim:subscription_view", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:subscription_block", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:mediation_policy_view", - "Roles": "admin" - }, - { - "Name": "apim:mediation_policy_create", - "Roles": "admin" - }, - { - "Name": "apim:api_workflow", - "Roles": "admin" - }, - { - "Name": "apim:app_owner_change", - "Roles": "admin" - } - ] - }, - "NotificationsEnabled":"false", - "Notifications":[{ - "Type":"new_api_version", - "Notifiers" :[{ - "Class":"org.wso2.carbon.apimgt.impl.notification.NewAPIVersionEmailNotifier", - "ClaimsRetrieverImplClass":"org.wso2.carbon.apimgt.impl.token.DefaultClaimsRetriever", - "Title": "Version $2 of $1 Released", - "Template": " <html> <body> <h3 style=\"color:Black;\">We’re happy to announce the arrival of the next major version $2 of $1 API which is now available in Our API Store.</h3><a href=\"https://localhost:9443/store\">Click here to Visit WSO2 API Store</a></body></html>" - }] - } - ], - "DefaultRoles" : { - "PublisherRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/publisher" - }, - "CreatorRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/creator" - }, - "SubscriberRole" : { - "CreateOnTenantLoad" : true - } - } -} - = - - - - ${host} - ${port} - https - - /resource/1.0.0/artifact/_system/config/apimgt/applicationdata/tenant-conf.json - PUT - true - false - true - false - - - - - - - - - Content-Type - application/json - - - Authorization - Basic ${encoded_ClientCredentials} - - - Media-Type - application/json - - - - - - - 204 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 1 - 1 - 1515141491000 - 1515141491000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - ${username_to_create} - - - - , - - ../resources/UserDetails.csv - false - false - false - shareMode.group - true - username_to_create,password_to_create - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org" xmlns:xsd="http://common.mgt.user.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <ser:addUser> - <!--Optional:--> - <ser:userName>${username_to_create}</ser:userName> - <!--Optional:--> - <ser:credential>${password_to_create}</ser:credential> - <!--Zero or more repetitions:--> - <ser:roleList></ser:roleList> - <ser:profileName>default</ser:profileName> - <!--Optional:--> - <ser:requirePasswordChange>false</ser:requirePasswordChange> - </ser:addUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:addUser - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - - continue - - false - 1 - - 1 - 1 - 1515141491000 - 1515141491000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - ${role_to_create} - - - - , - - ../resources/UserAndRoleCreation.csv - false - false - false - shareMode.group - true - role_to_create,username_to_create_1,username_to_create_2,username_to_create_3,username_to_create_4 - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org" xmlns:xsd="http://dao.service.ws.um.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <ser:addRole> - <!--Optional:--> - <ser:roleName>${role_to_create}</ser:roleName> - <!--Zero or more repetitions:--> - <ser:userList>${username_to_create_1}</ser:userList> - <ser:userList>${username_to_create_2}</ser:userList> - <ser:userList>${username_to_create_3}</ser:userList> - <ser:userList>${username_to_create_4}</ser:userList> - <ser:permissions> - <!--Optional:--> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/login</xsd:resourceId> - </ser:permissions> - <ser:permissions> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/manage/api</xsd:resourceId> - </ser:permissions> - <ser:permissions> - <!--Optional:--> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/configure/governance</xsd:resourceId> - </ser:permissions> - <ser:permissions> - <xsd:action>ui.execute</xsd:action> - <!--Optional:--> - <xsd:resourceId>/permission/admin/manage/resources/govern</xsd:resourceId> - </ser:permissions> - </ser:addRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:addRole - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - - continue - - false - 1 - - 4 - 60 - 1515150848000 - 1515150848000 - false - - - - - - - username - password - apiname - context - visibility - subscription - subscriptionAvailableTenants - resource - backend - accessControlRoles - accessControl - - - - ${__property(adminusername)} - ${__property(adminpassword)} - SalaryDetails - salary - PUBLIC - all_tenants - null - /salary/{id} - /sample-data-backend/rservice/salaryservice/ - ["testRole1"] - RESTRICTED - - - ${__property(adminusername)} - ${__property(adminpassword)} - MobileStock - stock - PUBLIC - all_tenants - null - /stock/{id} - /sample-data-backend/rservice/stockservice/ - ["testRole2","testRole3"] - RESTRICTED - - - ${__property(adminusername)} - ${__property(adminpassword)} - MaintainceTasks - tasks - PUBLIC - all_tenants - null - /task/{id} - /sample-data-backend/rservice/taskservice/ - ["testRole1","testRole2","testRole3"] - RESTRICTED - - - testCreator1 - testCreator123 - MobileTestPouch - pouchtest - PUBLIC - all_tenants - null - /test/{id} - /sample-data-backend/rservice/taskservice/ - ["testRole1","testRole2"] - RESTRICTED - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_publisher", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_credentials} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_crendentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_credentials", new String(encoded_crendentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_create - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - false - - - - true - - - - false - { - "name": "${apiname}", - "description": "This document describe a RESTFul API for TestAPIfromREST API.\r\n", - "context": "${context}", - "version": "1.0.0", - "provider":"${username}", - "apiDefinition":"{\"swagger\":\"2.0\",\"paths\":{\"${resource}\":{\"get\":{\"responses\":{\"200\":{\"description\":\"this is test\"}},\"parameters\":[{\"name\":\"id\",\"in\":\"path\",\"allowMultiple\":false,\"required\":true,\"type\":\"string\"}],\"x-auth-type\":\"Application & Application User\",\"x-throttling-tier\":\"Unlimited\"}}},\"info\":{\"title\":\"${apiname}\",\"version\":\"1.0.0\"}}", - "isDefaultVersion": false, - "type": "HTTP", - "transport": [ - "http", - "https" - ], - "tiers": ["Unlimited"], - "visibility": "${visibility}", - "accessControl": "${accessControl}", - "accessControlRoles": ${accessControlRoles}, - "endpointConfig": "{\"production_endpoints\":{\"url\":\"http://${tomcathost}:${tomcatport}/${backend}\",\"config\":null},\"sandbox_endpoints\":{\"url\":\"${backend}\",\"config\":null},\"endpoint_type\":\"http\"}", - "subscriptionAvailability": "${subscription}", - "subscriptionAvailableTenants": ${subscriptionAvailableTenants} - -} - = - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - apid;apiname - $.id;$.name - 1;1 - NOTFOUND;NOTFOUND - - - - groovy - apiname, apid - - - def salary_api_id; -def task_api_id; -def stock_api_id; -def api_name = vars.get("apiname"); -def aid = vars.get("apid"); - - -if (api_name.equals("SalaryDetails")){ - salary_api_id = aid; - log.info(salary_api_id); - props.put("salaryapiid", salary_api_id); - log.info("Salary Prop:" + props.get("salaryapiid")); -} -else if (api_name.equals("MobileStock")){ - stock_api_id = aid; - props.put("stockapiid", stock_api_id); - log.info("Stock Prop:" + props.get("stockapiid")); -} -else if (api_name.equals("MaintainceTasks")){ - task_api_id = aid; - props.put("taskapiid", task_api_id); - log.info("Task Prop:" + props.get("taskapiid")); -} - - - - - - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_publish - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_publish - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - 300 - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis/change-lifecycle?apiId=${apid}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_publish} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - 300 - - - - continue - - false - 1 - - 1 - 1 - 1516102457000 - 1516102457000 - false - - - - - - ${username} - - - - ../resources/ViewAPI_CreatedByAdmin.csv - - username,password,expected_no_of_apis,expected_api_1,expected_api_2,expected_api_3,expected_api_4 - false - , - false - false - true - shareMode.all - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_publisher", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_credentials} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_crendentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_credentials", new String(encoded_crendentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_view - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - false - true - false - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - - - - api_list - $.list[*].name - 1 - NOT_FOUND - - - - - "count":${expected_no_of_apis} - - Assertion.response_data - false - 16 - api_count - - - - - ${expected_api_1} - ${expected_api_2} - ${expected_api_3} - ${expected_api_4} - - Assertion.response_data - false - 34 - api_count - - - - - 200 - - Assertion.response_code - false - 1 - - - - - - - continue - - false - 1 - - 1 - 1 - 1516360323000 - 1516360323000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_publisher", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_Auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_auth = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_Auth", new String(encoded_auth)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_create - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_pub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_view - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_pub_view - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_pub_view} - - - - - - api_id_to_delete;api_count_to_delete - $.list[0].id;$.count - 1;1 - NOT_FOUND;NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - false - true - false - - - - ${__javaScript(${api_count_to_delete} > 0,)} - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_pub_view} - - - - - - api_id_to_delete;api_count_to_delete - $.list[0].id;$.count - 1;1 - NOT_FOUND;NOT_FOUND - all - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis/${api_id_to_delete} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_pub} - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - false - true - false - - - - - - continue - - false - 1 - - 1 - 1 - 1515677608000 - 1515677608000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - ${userToDelete} - - - - , - - ../resources/UserDetails.csv - false - false - false - shareMode.group - true - userToDelete - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deleteUser> - <!--Optional:--> - <ser:userName>${userToDelete}</ser:userName> - </ser:deleteUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deleteUser - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - false - true - false - - - - - continue - - false - 1 - - 1 - 1 - 1515677608000 - 1515677608000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - ${roleToDelete} - - - - , - - ../resources/UserAndRoleCreation.csv - false - false - false - shareMode.group - true - roleToDelete - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:deleteRole> - <!--Optional:--> - <ser:roleName>${roleToDelete}</ser:roleName> - </ser:deleteRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/RemoteUserStoreManagerService.RemoteUserStoreManagerServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - Content-Type - text/xml;charset=UTF-8 - - - SOAPAction - urn:deleteRole - - - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - - continue - - false - 1 - - 1 - 1 - 1515577053000 - 1515577053000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "EnableMonetization" : false, - "IsUnlimitedTierPaid" : false, - "ExtensionHandlerPosition": "bottom", - "RESTAPIScopes": { - "Scope": [ - { - "Name": "apim:api_publish", - "Roles": "admin,Internal/publisher" - }, - { - "Name": "apim:api_create", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:api_view", - "Roles": "admin,Internal/publisher,Internal/creator" - }, - { - "Name": "apim:subscribe", - "Roles": "admin,Internal/subscriber" - }, - { - "Name": "apim:tier_view", - "Roles": "admin,Internal/publisher,Internal/creator" - }, - { - "Name": "apim:tier_manage", - "Roles": "admin" - }, - { - "Name": "apim:bl_view", - "Roles": "admin" - }, - { - "Name": "apim:bl_manage", - "Roles": "admin" - }, - { - "Name": "apim:subscription_view", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:subscription_block", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:mediation_policy_view", - "Roles": "admin" - }, - { - "Name": "apim:mediation_policy_create", - "Roles": "admin" - }, - { - "Name": "apim:api_workflow", - "Roles": "admin" - }, - { - "Name": "apim:app_owner_change", - "Roles": "admin" - } - ] - }, - "NotificationsEnabled":"false", - "Notifications":[{ - "Type":"new_api_version", - "Notifiers" :[{ - "Class":"org.wso2.carbon.apimgt.impl.notification.NewAPIVersionEmailNotifier", - "ClaimsRetrieverImplClass":"org.wso2.carbon.apimgt.impl.token.DefaultClaimsRetriever", - "Title": "Version $2 of $1 Released", - "Template": " <html> <body> <h3 style=\"color:Black;\">We’re happy to announce the arrival of the next major version $2 of $1 API which is now available in Our API Store.</h3><a href=\"https://localhost:9443/store\">Click here to Visit WSO2 API Store</a></body></html>" - }] - } - ], - "DefaultRoles" : { - "PublisherRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/publisher" - }, - "CreatorRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/creator" - }, - "SubscriberRole" : { - "CreateOnTenantLoad" : true - } - } -} - = - - - - ${host} - ${port} - https - - /resource/1.0.0/artifact/_system/config/apimgt/applicationdata/tenant-conf.json - PUT - true - false - true - false - - - - - - - - - Content-Type - application/json - - - Authorization - Basic ${encoded_ClientCredentials} - - - Media-Type - application/json - - - - - - - 204 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - false - - saveConfig - - - false - false - true - - true - true - true - true - false - true - false - true - true - true - true - true - true - false - true - 0 - true - true - true - true - true - true - - - scenario-01-results.jtl - - - - - true - - - - diff --git a/scenario01/jmeter/03-Solution1-DeveloperOptimizedAPIDevelopment.jmx b/scenario01/jmeter/03-Solution1-DeveloperOptimizedAPIDevelopment.jmx deleted file mode 100644 index 3087893a..00000000 --- a/scenario01/jmeter/03-Solution1-DeveloperOptimizedAPIDevelopment.jmx +++ /dev/null @@ -1,3053 +0,0 @@ - - - - - - false - true - - - - host - ${__property(serverHost)} - = - - - port - ${__property(serverPort)} - = - - - tomcathost - ${__property(tomcatHost)} - = - - - tomcatport - ${__property(tomcatPort)} - = - - - servletPort - ${__property(servletPort)} - = - - - - - - - - continue - - false - 1 - - 1 - 1 - 1515577053000 - 1515577053000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - 1 - 0 - 900000 - - - - true - - - - false - <sequence xmlns="http://ws.apache.org/ns/synapse" name="custom-in"> - <description> Description</description> - <property name="ClientAccessDevice" expression="$trp:User-Agent" /> -</sequence> - = - - - - ${host} - ${port} - https - - /resource/1.0.0/artifact/_system/governance/apimgt/customsequences/in/custom-in.xml - PUT - true - false - true - false - - - - - - - - - Content-Type - application/xml - - - Authorization - Basic ${encoded_ClientCredentials} - - - Media-Type - application/xml - - - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 1 - 1 - 1515577053000 - 1515577053000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - <sequence xmlns="http://ws.apache.org/ns/synapse" name="custom-out"> - <description>Custom out sequence to remove Address element</description> - <filter source="get-property('ClientAccessDevice')" regex="iphone"> - <then> - <log level="custom"> - <property name="ClientAccessDevice" value="then" /> - </log> - <payloadFactory media-type="json"> - <format> - {"id":1,"name":"Fill the printer cartridges","duration":"Ten minutes","type":"moc"} - </format> - </payloadFactory> - </then> - <else> - </else> - </filter> - <property name="Client user device" expression="$trp:User-Agent" /> -</sequence> - = - - - - ${host} - ${port} - https - - /resource/1.0.0/artifact/_system/governance/apimgt/customsequences/out/custom-out.xml - PUT - true - false - true - false - - - - - - - - - Content-Type - application/xml - - - Authorization - Basic ${encoded_ClientCredentials} - - - Media-Type - application/xml - - - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 1 - 1 - 1515150848000 - 1515150848000 - false - - - - - - - username - password - apiname - context - visibility - subscription - subscriptionAvailableTenants - resource - backend - sequences - - - - ${__property(adminusername)} - ${__property(adminpassword)} - TaskDetail - tasksdet - PUBLIC - current_tenant - null - /task/{id} - /sample-data-backend/rservice/taskservice/ - [{"name":"custom-in","type": "in","id": "/_system/governance/apimgt/customsequences/in/custom-in.xml"},{"name":"custom-out","type": "out","id": "/_system/governance/apimgt/customsequences/out/custom-out.xml"}] - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_publisher", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_create - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - false - - - - true - - - - false - { - "name": "${apiname}", - "description": "This document describe a RESTFul API for TestAPIfromREST API.\r\n", - "context": "${context}", - "version": "1.0.0", - "provider":"${username}", - "apiDefinition":"{\"swagger\":\"2.0\",\"paths\":{\"${resource}\":{\"get\":{\"responses\":{\"200\":{\"description\":\"this is test\"}},\"parameters\":[{\"name\":\"id\",\"in\":\"path\",\"allowMultiple\":false,\"required\":true,\"type\":\"string\"}],\"x-auth-type\":\"Application & Application User\",\"x-throttling-tier\":\"Unlimited\"}}},\"info\":{\"title\":\"${apiname}\",\"version\":\"1.0.0\"}}", - "isDefaultVersion": false, - "type": "HTTP", - "transport": [ - "http", - "https" - ], - "tiers": ["Unlimited"], - "visibility": "${visibility}", - "endpointConfig": "{\"production_endpoints\":{\"url\":\"http://${tomcathost}:${tomcatport}/${backend}\",\"config\":null},\"sandbox_endpoints\":{\"url\":\"${backend}\",\"config\":null},\"endpoint_type\":\"http\"}", - "sequences":${sequences}, - "subscriptionAvailability": "${subscription}", - "subscriptionAvailableTenants": ${subscriptionAvailableTenants} -} - = - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - apid;apiname - $.id;$.name - 1;1 - NOTFOUND;NOTFOUND - - - - groovy - apiname, apid - - - def task_api_id; -def api_name = vars.get("apiname"); -def aid = vars.get("apid"); - - -if (api_name.equals("TaskDetail")){ - task_api_id = aid; - log.info(task_api_id); - props.put("taskapiid", task_api_id); - log.info("Task Prop:" + props.get("taskapiid")); -} - - - - - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_publish - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_publish - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - 3000 - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis/change-lifecycle?apiId=${apid}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_publish} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - false - true - false - - - - - continue - - false - 1 - - 1 - 1 - 1515468057000 - 1515468057000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - - - appName - TestApplication - = - - - - - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_store", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:subscribe - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_sub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "throttlingTier": "Unlimited", - "description": "sample app description", - "name": "${appName}" -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/applications - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - NOT_FOUND - - - - groovy - application_id - - - props.put("application_id_no", vars.get("application_id")); -log.info("ApplicationId:" + props.get("application_id_no")); - - - - - - 201 - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${__P(taskapiid)}", - "applicationId": "${__P(application_id_no)}" -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - NOT_FOUND - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - continue - - false - 1 - - 1 - 1 - 1516707325000 - 1516707325000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_store", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:subscribe - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_sub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "validityTime": "3600", - "keyType": "PRODUCTION", - "accessAllowDomains": ["ALL" - ] -} - = - - - - ${host} - ${port} - https - - /api/am/store/v0.11/applications/generate-keys?applicationId=${__P(application_id_no)} - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - genAccessToken - $.token.accessToken - 1 - NOT_FOUND - - - - - ${useragent} - - - - ../resources/UserAgentValueSet.csv - UTF-8 - useragent,expectedResult - false - , - true - false - true - shareMode.all - - - - - - - ${host} - ${servletPort} - https - - /tasksdet/1.0.0/task/1 - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${genAccessToken} - - - User-Agent - ${useragent} - - - - - - - ${expectedResult} - - Assertion.response_data - false - 16 - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - true - false - false - false - true - 0 - true - true - true - true - true - - - - - - - - - - continue - - false - 1 - - 1 - 1 - 1515587607000 - 1515587607000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_publisher", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("username: " + vars.get("username")); -log.info("password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_view - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_sub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_create - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_pub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis/${__P(taskapiid)}/policies/mediation - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - seq_id - $.list.id - -1 - NOTFOUND - - - - - ${__javaScript(${seq_id_matchNr} > 0,)} - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis/${__P(taskapiid)}/policies/mediation - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - seq_id - $.list.id - -1 - NOTFOUND - - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis//${__P(taskapiid)}/policies/mediation/${seq_id_1} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_pub} - - - - - - - - false - true - false - - - - - continue - - false - 1 - - 1 - 1 - 1515587607000 - 1515587607000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_store", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("username: " + vars.get("username")); -log.info("password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:subscribe - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_sub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_publisher", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("username: " + vars.get("username")); -log.info("password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_create - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_pub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:api_view - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_pub_view - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_pub_view} - - - - - - api_id - $..id - -1 - NOTFOUND - - - - - ${__javaScript(${api_id_matchNr} > 0,)} - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions?apiId=${api_id_1} - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - subs_id - $..subscriptionId - -1 - NOTFOUND - - - - - ${__javaScript(${subs_id_matchNr} > 0,)} - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions/${subs_id_1} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/subscriptions?apiId=${api_id_1} - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - subs_id - $..subscriptionId - -1 - NOTFOUND - - - - - - - - - ${host} - ${port} - https - - /api/am/publisher/v0.11/apis/${__P(taskapiid)} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_pub} - - - - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/apis - GET - true - false - true - false - - - - - - - api_id - $..id - -1 - NOTFOUND - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - - - false - true - false - - - - - continue - - false - 1 - - 1 - 1 - 1515648031000 - 1515648031000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - { - "callbackUrl": "www.google.lk", - "clientName": "rest_api_store", - "tokenScope": "Production", - "owner": "${username}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${port} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${auth} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - - username, password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("username: " + vars.get("username")); -log.info("password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("auth", new String(encoded_ClientCredentials)); - groovy - - - - - - - - false - password - = - true - grant_type - - - false - ${username} - = - true - username - - - false - ${password} - = - true - password - - - false - apim:subscribe - = - true - scope - - - - ${host} - ${servletPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encoded_ClientCredentials} - - - - - - - - clientID, clientSecret - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("clientID") + ":" + vars.get("clientSecret"); -log.info("clientID: " + vars.get("clientID")); -log.info("clientSec: " + vars.get("clientSecret")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - access_token_sub - $.access_token - 1 - all - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/applications - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - app_name;app_id - $.list[?(@.name != 'DefaultApplication')].name;$.list[?(@.name != 'DefaultApplication')].applicationId - -1;-1 - NOTFOUND;NOTFOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - ${__javaScript(${app_id_matchNr} > 0,)} - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/applications/${app_id_1} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${port} - https - - /api/am/store/v0.11/applications - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - - - - app_name;app_id - $.list[?(@.name != 'DefaultApplication')].name;$.list[?(@.name != 'DefaultApplication')].applicationId - -1;-1 - NOTFOUND;NOTFOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - false - true - false - - - - - continue - - false - 1 - - 1 - 1 - 1515577053000 - 1515577053000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - - = - - - - ${host} - ${port} - https - - /resource/1.0.0/artifact/_system/governance/apimgt/customsequences/in/custom-in.xml - DELETE - true - false - true - false - - - - - - - - - Content-Type - application/xml - - - Authorization - Basic ${encoded_ClientCredentials} - - - Media-Type - application/xml - - - - - - - 204 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - continue - - false - 1 - - 1 - 1 - 1515577053000 - 1515577053000 - false - - - - - - - username - password - - - - ${__property(adminusername)} - ${__property(adminpassword)} - - - false - - - - true - - - - false - - = - - - - ${host} - ${port} - https - - /resource/1.0.0/artifact/_system/governance/apimgt/customsequences/out/custom-out.xml - DELETE - true - false - true - false - - - - - - - - - Content-Type - application/xml - - - Authorization - Basic ${encoded_ClientCredentials} - - - Media-Type - application/xml - - - - - - - 204 - - Assertion.response_code - false - 16 - - - - - - username,password - import org.apache.commons.codec.binary.Base64; - -String forEncoding = vars.get("username") + ":" + vars.get("password"); -log.info("Username: " + vars.get("username")); -log.info("Password: " + vars.get("password")); -byte[] encoded_ClientCredentials = Base64.encodeBase64(forEncoding.getBytes()); -vars.put("encoded_ClientCredentials", new String(encoded_ClientCredentials)); - groovy - - - - - - false - - saveConfig - - - false - false - true - - true - true - true - true - false - true - false - true - false - true - true - true - true - false - true - 0 - true - true - true - true - - - scenario-01-results.jtl - - - - - true - - - - diff --git a/scenario01/resources/SubscriptionValueSet.csv b/scenario01/resources/SubscriptionValueSet.csv deleted file mode 100644 index ebb3d0b0..00000000 --- a/scenario01/resources/SubscriptionValueSet.csv +++ /dev/null @@ -1,5 +0,0 @@ -admin,admin,YWRtaW46YWRtaW4=,404,404,404,201,201,201 -jane@finance.abc.com,jane123,amFuZUBmaW5hbmNlLmFiYy5jb206amFuZTEyMw==,201,404,404,201,201,201 -jane@core.abc.com,jane123,amFuZUBjb3JlLmFiYy5jb206amFuZTEyMw==,404,201,404,201,201,201 -jane@operations.abc.com,jane123,amFuZUBvcGVyYXRpb25zLmFiYy5jb206amFuZTEyMw==,404,404,201,404,201,201 - diff --git a/scenario01/resources/UserAgentValueSet.csv b/scenario01/resources/UserAgentValueSet.csv deleted file mode 100644 index 7871039e..00000000 --- a/scenario01/resources/UserAgentValueSet.csv +++ /dev/null @@ -1,2 +0,0 @@ -chrome,"{""id"":1,""name"":""Fill the printer cartridges"",""duration"":""Ten minutes""}" -iphone,"{""id"":1,""name"":""Fill the printer cartridges"",""duration"":""Ten minutes"",""type"":""moc""}" diff --git a/scenario01/resources/UserAndRoleCreation.csv b/scenario01/resources/UserAndRoleCreation.csv deleted file mode 100644 index a0c48e59..00000000 --- a/scenario01/resources/UserAndRoleCreation.csv +++ /dev/null @@ -1,5 +0,0 @@ -testRole1,testCreator1,testCreator4,testCreator5,testCreator7 -testRole2,testCreator2,testCreator4,testCreator6,testCreator7 -testRole3,testCreator3,testCreator5,testCreator6,testCreator7 -testRole4,testCreator8,testCreator9,testCreator10,testCreator11 - diff --git a/scenario01/resources/UserDetails.csv b/scenario01/resources/UserDetails.csv deleted file mode 100644 index 009facc7..00000000 --- a/scenario01/resources/UserDetails.csv +++ /dev/null @@ -1,11 +0,0 @@ -testCreator1,testCreator123 -testCreator2,testCreator123 -testCreator3,testCreator123 -testCreator4,testCreator123 -testCreator5,testCreator123 -testCreator6,testCreator123 -testCreator7,testCreator123 -testCreator8,testCreator123 -testCreator9,testCreator123 -testCreator10,testCreator123 -testCreator11,testCreator123 diff --git a/scenario01/resources/ViewAPI_CreatedByAdmin.csv b/scenario01/resources/ViewAPI_CreatedByAdmin.csv deleted file mode 100644 index 635403fd..00000000 --- a/scenario01/resources/ViewAPI_CreatedByAdmin.csv +++ /dev/null @@ -1,6 +0,0 @@ -testCreator1,testCreator123,3,SalaryDetails,MaintainceTasks,MobilePouch,NOT_FOUND -testCreator2,testCreator123,3,MobileStock,MaintainceTasks,MobilePouch,NOT_FOUND -testCreator3,testCreator123,2,MobileStock,MaintainceTasks,NOT_FOUND,NOT_FOUND -testCreator4,testCreator123,4,SalaryDetails,MobileStock,MaintainceTasks,MobilePouch -testCreator7,testCreator123,4,SalaryDetails,MobileStock,MaintainceTasks,MobilePouch -testCreator8,testCreator123,0,,, diff --git a/scenario01/resources/user.properties b/scenario01/resources/user.properties deleted file mode 100644 index ab4ef804..00000000 --- a/scenario01/resources/user.properties +++ /dev/null @@ -1,41 +0,0 @@ -# -# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -# -# WSO2 Inc. licenses this file to you 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. -# -serverHost=localhost -serverPort=9443 -servletPort=8243 - -# User Management - -adminusername=admin -adminpassword=admin - -## Tomcat - -tomcatHost=localhost -tomcatPort=8080 - -#Server Hosts and Ports -pubHost=localhost -pubPort=localhost -storeHost=localhost -storePort=localhost -gwMgrHost=localhost -gwMgrPort=localhost -gwWrkHost=localhost -gwWrkPort=localhost -nioPort=8243 diff --git a/scenario01/run-scenario.sh b/scenario01/run-scenario.sh deleted file mode 100755 index cb282d34..00000000 --- a/scenario01/run-scenario.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -$JMETER_HOME/bin/jmeter.sh -n -t jmeter/01-Solution1-PublicPartnerPrivateAPI.jmx -p resources/user.properties -$JMETER_HOME/bin/jmeter.sh -n -t jmeter/02-Solution1-OwnershipAndColDevelopment.jmx -p resources/user.properties -$JMETER_HOME/bin/jmeter.sh -n -t jmeter/03-Solution1-DeveloperOptimizedAPIDevelopment.jmx -p resources/user.properties diff --git a/scenario03/README.md b/scenario03/README.md deleted file mode 100644 index dc2bc1c8..00000000 --- a/scenario03/README.md +++ /dev/null @@ -1,36 +0,0 @@ -## Scenario 03 - App Development with APIs - -### High level scenario description -In the APP Development with API WSO2 APIM provides SDKs to many popular development languages. Basically an API subscriber can quick start his app using the SDK provided. - -This solution covers the below areas -* Create, Publish and subscribe to and API -* Create a MSF4J service to consume the above api using the Java SDK ( Prebuilt ) -* Verify that the SDK is able to invoke the API and return the response - -### Current folder structure -``` -Scenario1 -|-jmeter - |-01-Scenario03-App-Development-with-APIs.jmx - -|-resources - |-user.properties - -``` -### Pre-requists to execute tests -1. Build the **AppDevelopmentAPI_v1.0.0_java** which can be found in the **apim-test-integration/apps/** folder. Build it using **mvn clean install** - -2. Now build the Phone-Service ( MSF4J service ) which can be found in the same location as above **apim-test-integration/apps/**. Build it using **mvn clean install** -3. Ones you build the MSF4J service in step 2 navigate to the target folder of it and start the MSF4J service by issuing the below command -```sh -java -jar Phone-Service-0.1-SNAPSHOT.jar -``` - -### Running the script -Configure the user.properties and run the below command to execute the script. - -```sh ->path/to/jmeter/bin/jmeter -n -t path/to/01-Scenario03-App-Development-with-APIs.jmx -p path/to/user.properties -l xxxx.jtl -``` - diff --git a/scenario03/base-setup.sh b/scenario03/base-setup.sh deleted file mode 100644 index 89448e86..00000000 --- a/scenario03/base-setup.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - diff --git a/scenario03/jmeter/01-Scenario03-App-Development-with-APIs.jmx b/scenario03/jmeter/01-Scenario03-App-Development-with-APIs.jmx deleted file mode 100644 index 77cf2b3d..00000000 --- a/scenario03/jmeter/01-Scenario03-App-Development-with-APIs.jmx +++ /dev/null @@ -1,1266 +0,0 @@ - - - - - - false - true - - - - - - - - - - host - ${__property(serverHost)} - = - localhost - - - port - ${__property(serverPort)} - = - 9443 - - - httpPort - ${__property(httpPort)} - = - 8280 - - - username - ${__property(username)} - = - admin - - - password - ${__property(password)} - = - admin - - - authorization - ${__property(authorization)} - = - YWRtaW46YWRtaW4= - - - owner - ${__property(owner)} - = - admin - - - clientName - ${__property(clientName)} - = - rest_api_store - - - apiName - ${__property(apiName)} - = - AppDevelopmentAPI - - - applicationName - ${__property(applicationName)} - = - JavaSDKTestApplication - - - MSF4JHost - ${__property(MSF4JHost)} - = - localhost - - - MSF4JPort - ${__property(MSF4JPort)} - = - 8080 - - - - - - - - pubHost - ${__property(pubHost)} - = - - - pubPort - ${__property(pubPort)} - = - - - storeHost - ${__property(storeHost)} - = - - - storePort - ${__property(storePort)} - = - - - gwMgrHost - ${__property(gwMgrHost)} - = - - - gwMgrPort - ${__property(gwMgrPort)} - = - - - gwWrkHost - ${__property(gwWrkHost)} - = - - - gwWrkPort - ${__property(gwWrkPort)} - = - - - nioPort - ${__property(nioPort)} - = - - - - - - continue - - false - 1 - - 1 - 1 - 1512994028000 - 1512994028000 - false - - - - - - - - true - - - - false - { - "callbackUrl": "localhost", - "clientName": "${clientName}", - "tokenScope": "Production", - "owner": "${owner}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${pubHost} - ${pubPort} - https - - /client-registration/v0.12/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${authorization} - - - Content-Type - application/json - - - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - clientId;clientSecret - $.clientId;$.clientSecret - 1;1 - NOT_FOUND;NOT_FOUND - - - - - true - - - - false - grant_type=password&username=${username}&password=${password}&scope=apim:subscribe - = - - - - ${gwMgrHost} - ${nioPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientId"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - access_token_subscribe - $.access_token - 1 - NOT_FOUND - all - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - access_token - - Assertion.response_data - false - 2 - - - - ${__setProperty(access_token_subscribe, ${access_token_subscribe})}; - - - - false - - - - - - - - true - - - - false - { - "callbackUrl": "localhost", - "clientName": "${clientName}", - "tokenScope": "Production", - "owner": "${owner}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${pubHost} - ${pubPort} - https - - /client-registration/v0.12/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${authorization} - - - Content-Type - application/json - - - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - clientId;clientSecret - $.clientId;$.clientSecret - 1;1 - NOT_FOUND;NOT_FOUND - - - - - true - - - - false - grant_type=password&username=${username}&password=${password}&scope=apim:api_create - = - - - - ${gwMgrHost} - ${nioPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientId"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - access_token_api_create - $.access_token - 1 - NOT_FOUND - all - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - access_token - - Assertion.response_data - false - 2 - - - - - true - - - - false - { - "name":"${apiName}", - "description":null, - "context":"/getmock", - "version":"v1.0.0", - "provider":"admin", - "apiDefinition":"{\"swagger\":\"2.0\",\"paths\":{\"/getMock\":{\"get\":{\"responses\":{\"200\":{\"description\":\"\"}},\"x-auth-type\":\"Application & Application User\",\"x-throttling-tier\":\"Unlimited\"}}},\"info\":{\"title\":\"AppDevelopmentAPI\",\"version\":\"v1.0.0\"}}", - "wsdlUri":null, - "status":"PUBLISHED", - "responseCaching":"Disabled", - "cacheTimeout":300, - "destinationStatsEnabled":null, - "isDefaultVersion":false, - "type":"HTTP", - "transport": - [ - "http", - "https" - ], - "tags": - [ - ], - "tiers": - [ - "Unlimited" - ], - "maxTps":null, - "thumbnailUri":null, - "visibility":"PUBLIC", - "visibleRoles": - [ - ], - "accessControl":"NONE", - "accessControlRoles": - [ - ], - "visibleTenants": - [ - ], - "endpointConfig":"{\"production_endpoints\":{\"url\":\"http://${MSF4JHost}:${MSF4JPort}/phones\",\"config\":null,\"template_not_supported\":false},\"sandbox_endpoints\":{\"url\":\"http://${MSF4JHost}:${MSF4JPort}/service\",\"config\":null,\"template_not_supported\":false},\"endpoint_type\":\"http\"}", - "endpointSecurity":null, - "gatewayEnvironments":"Production and Sandbox", - "sequences": - [ - ], - "subscriptionAvailability":null, - "subscriptionAvailableTenants": - [ - ], - "businessInformation": - { - "technicalOwnerEmail":null, - "businessOwnerEmail":null, - "businessOwner":null, - "technicalOwner":null - }, - "corsConfiguration": - { - "accessControlAllowOrigins": - [ - "*" - ], - "accessControlAllowCredentials":false, - "corsConfigurationEnabled":false, - "accessControlAllowHeaders": - [ - "authorization", - "Access-Control-Allow-Origin", - "Content-Type", - "SOAPAction" - ], - "accessControlAllowMethods": - [ - "GET", - "PUT", - "POST", - "DELETE", - "PATCH", - "OPTIONS" - ] - }, - "additionalProperties": - { - } -} - - - = - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis - POST - true - false - true - false - - - - http://localhost:8080/phones/availablePhones | http://www.mocky.io/v2/5a6800722d0000a037bed041 |http://www.mocky.io/v2/5a6ea28f30000014066fe27c - - - - - - Authorization - Bearer ${access_token_api_create} - - - Content-Type - application/json - - - - - - apid;apiname - $.id;$.name - 1;1 - NOTFOUND;NOTFOUND - - - - ${__setProperty(apid, ${apid})}; -${__setProperty(access_token_api_create, ${access_token_api_create})}; - - - - false - - - - - 201 - - Assertion.response_code - false - 16 - - - - - AppDevelopmentAPI - - Assertion.response_data - false - 2 - - - - - - - - true - - - - false - { - "callbackUrl": "localhost", - "clientName": "${clientName}", - "tokenScope": "Production", - "owner": "${owner}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${pubHost} - ${pubPort} - https - - /client-registration/v0.12/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${authorization} - - - Content-Type - application/json - - - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - clientId;clientSecret - $.clientId;$.clientSecret - 1;1 - NOT_FOUND;NOT_FOUND - - - - - true - - - - false - grant_type=password&username=${username}&password=${password}&scope=apim:api_publish - = - - - - ${gwMgrHost} - ${nioPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientId"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - access_token_publish - $.access_token - 1 - NOT_FOUND - all - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - access_token - - Assertion.response_data - false - 2 - - - - - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_publish} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - ${__setProperty(ApplicationID, ${ApplicationID})}; -${__setProperty(access_token_publish, ${access_token_publish})}; - - - false - - - - - - - - true - - - - false - { - "throttlingTier": "Unlimited", - "description": "sample app description", - "name": "${applicationName}", - "callbackUrl": "http://my.server.com/callback" -} - = - - - - ${storeHost} - ${storePort} - https - utf-8 - api/am/store/v0.12/applications - POST - true - false - true - false - - - - /api/am/store/v0.11/apis - - - - - - Authorization - Bearer ${access_token_subscribe} - - - Content-Type - application/json - - - - - - ApplicationID - $.applicationId - 1 - NOTFOUND - - - - ${__setProperty(ApplicationID, ${ApplicationID})}; - - - - false - - - - - Created - - Assertion.response_message - false - 16 - - - - - JavaSDKTestApplication - - Assertion.response_data - false - 2 - - - - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${apid}", - "applicationId": "${ApplicationID}" -} - = - - - - ${storeHost} - ${storePort} - https - utf-8 - /api/am/store/v0.12/subscriptions - POST - true - false - true - false - - - - /api/am/store/v0.11/apis - - - - - - Authorization - Bearer ${access_token_subscribe} - - - Content-Type - application/json - - - User-Agent - JMeter - - - f6a92d85-5d5d-3984-9dfd-f3a10a1f8a52 Bearer ${access_token} - - - - - Created - - Assertion.response_message - false - 16 - - - - - AppDevelopmentAPI - - Assertion.response_data - false - 2 - - - - - - - - true - - - - false - { - "validityTime": "3600", - "keyType": "PRODUCTION", - "accessAllowDomains": ["ALL" - ] -} - = - - - - ${storeHost} - ${storePort} - https - utf-8 - /api/am/store/v0.12/applications/generate-keys?applicationId=${ApplicationID} - POST - true - false - true - false - - - - https://localhost:9443/api/am/store/v0.11/applications/4bab054f-be43-4cc8-88c9-f6aeff66c842 - - - - - - Authorization - Bearer ${access_token_subscribe} - - - Content-Type - application/json - - - - - - application_accessToken - $..accessToken - 1 - NOTFOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - - - - ${MSF4JHost} - ${MSF4JPort} - http - - /phones/getPhone?serverHost=${storeHost}&accessToken=${application_accessToken}&serverPort=${httpPort} - GET - false - false - false - false - - - - - - - - The phone you searched is in stockorg.wso2.client.api.ApiResponse - - Assertion.response_data - false - 2 - - - - - - - continue - - false - 1 - - 1 - 1 - 1516210210000 - 1516210210000 - false - - - - - - - - true - - - - false - - = - - - - ${storeHost} - ${storePort} - https - utf-8 - /api/am/store/v0.12/applications/${__property(ApplicationID)} - DELETE - true - false - true - false - - - - /api/am/store/v0.11/apis - - - - - - Authorization - Bearer ${__property(access_token_subscribe)} - - - Content-Type - application/json - - - ${__property(access_token_publish)} - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - - = - - - - ${pubHost} - ${pubPort} - https - - api/am/publisher/v0.12/apis/${__property(apid)} - DELETE - true - false - true - false - - - - /api/am/store/v0.11/apis - - - - - - Authorization - Bearer ${__property(access_token_api_create)} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - false - - saveConfig - - - false - false - true - - true - true - true - true - false - true - false - true - true - true - true - true - true - false - true - 0 - true - true - true - true - true - true - true - - - 148f9080-678c-4714-b56b-936db0c7a648 - scenario-03-results.jtl - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - true - true - false - true - true - true - true - true - true - false - true - 0 - true - true - true - true - true - true - true - true - true - - - scenarioResults.jtl - - - - - true - - - - diff --git a/scenario03/jmeter/03-pre-scenario-steps.sh b/scenario03/jmeter/03-pre-scenario-steps.sh deleted file mode 100644 index 4492289d..00000000 --- a/scenario03/jmeter/03-pre-scenario-steps.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -set -e - -serverHost=$serverHost -serverPort=$serverPort -pubHost=$pubHost -pubPort=$pubPort -storeHost=$storeHost -storePort=$storePort -gwMgrHost=$gwMgrHost -gwMgrPort=$gwMgrPort -gwWrkHost=$gwWrkHost -gwWrkPort=$gwWrkPort - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -echo "working directory : "$scriptPath - -#updating jmeter properties - user.properties -sed -i "s|^\(serverHost\s*=\s*\).*\$|\1${serverHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(serverPort\s*=\s*\).*\$|\1${serverPort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(pubHost\s*=\s*\).*\$|\1${pubHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(pubPort\s*=\s*\).*\$|\1${pubPort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(storeHost\s*=\s*\).*\$|\1${storeHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(storePort\s*=\s*\).*\$|\1${storePort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(gwMgrHost\s*=\s*\).*\$|\1${gwMgrHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(gwMgrPort\s*=\s*\).*\$|\1${gwMgrPort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(gwWrkHost\s*=\s*\).*\$|\1${gwWrkHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(gwWrkPort\s*=\s*\).*\$|\1${gwWrkPort}|" $scriptPath/../resources/user.properties -#run base-setup.sh -source $scriptPath/../base-setup.sh > $scriptPath/basesetup.log - diff --git a/scenario03/resources/user.properties b/scenario03/resources/user.properties deleted file mode 100644 index dc102b71..00000000 --- a/scenario03/resources/user.properties +++ /dev/null @@ -1,41 +0,0 @@ -# -# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -# -# WSO2 Inc. licenses this file to you 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. -# - -serverHost=localhost -serverPort=9443 -httpPort=8280 -username=admin -password=admin -authorization=YWRtaW46YWRtaW4= -owner=admin -clientName=rest_api_store -apiName=AppDevelopmentAPI -applicationName=JavaSDKTestApplication -MSF4JHost=localhost -MSF4JPort=8081 - -#Server Hosts and Ports -pubHost=localhost -pubPort=9443 -storeHost=localhost -storePort=9443 -gwMgrHost=localhost -gwMgrPort=9443 -gwWrkHost=localhost -gwWrkPort=9443 -nioPort=8243 diff --git a/scenario03/run-scenario.sh b/scenario03/run-scenario.sh deleted file mode 100755 index e13cee08..00000000 --- a/scenario03/run-scenario.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -$JMETER_HOME/bin/jmeter.sh -n -t jmeter/01-Scenario03-App-Development-with-APIs.jmx -p resources/user.properties diff --git a/scenario04/README.md b/scenario04/README.md deleted file mode 100644 index a41786a1..00000000 --- a/scenario04/README.md +++ /dev/null @@ -1,23 +0,0 @@ -##Scenario07 - LifeCycle Management - -### Description -- Ability to run full lifecycle API Management from the inception stage of an API until retirement -- Notification mechanisms for informing developers on API changes -- App lifecycle management mechanisms in sync with API lifecycle management -- Introduce and execute organization specific lifecycle states - -### Prerequisites -1. The event-service MSF4J service should be started: this service will collect the events published from APIM when user perform lifecycle change. - - build apps/event-service using mvn - - deploy the service in a different instance in the deployement - -### Steps -1. Run 04-pre-scenario-steps.sh -2. Run 01-Scenario04-ManageLifeCycle.jmx -3. Run 04-post-scenario-steps.sh - -### Flow of Tests -1. Create API -2. Change the API status to all the available life-cycle status. -3. Verify notification while changing the life-cycle : events will be published to a msf4j service while chaning the life-cycle - and verify published events sending requests to the same service. \ No newline at end of file diff --git a/scenario04/base-setup.sh b/scenario04/base-setup.sh deleted file mode 100644 index 89448e86..00000000 --- a/scenario04/base-setup.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - diff --git a/scenario04/jmeter/01-Scenario04-ManageLifeCycle.jmx b/scenario04/jmeter/01-Scenario04-ManageLifeCycle.jmx deleted file mode 100644 index 6c46ed09..00000000 --- a/scenario04/jmeter/01-Scenario04-ManageLifeCycle.jmx +++ /dev/null @@ -1,2013 +0,0 @@ - - - - - - false - true - - - - - - - - false - false - - - - - false - - - - - - owner - ${__property(owner)} - = - - - authorization - ${__property(authorization)} - = - - - clientName - ${__property(clientName)} - = - - - username - ${__property(username)} - = - - - password - ${__property(password)} - = - - - host - ${__property(serverHost)} - = - - - port - ${__property(serverPort)} - = - - - APIName - ${__property(apiName1)} - = - - - APIContext - ${__property(apiContext1)} - = - - - APIVersion - ${__property(apiVersion1)} - = - - - msf4jServiceHost - ${__property(msf4jServiceHost)} - = - - - msf4jServicePort - ${__property(msf4jServicePort)} - = - - - APIName2 - ${__property(apiName2)} - = - - - APIVersion2 - ${__property(apiVersion2)} - = - - - APIContext2 - ${__property(apiContext2)} - = - - - UUID - ${__property(UUID)} - = - - - - - - - - pubHost - ${__property(pubHost)} - = - - - pubPort - ${__property(pubPort)} - = - - - storeHost - ${__property(storeHost)} - = - - - storePort - ${__property(storePort)} - = - - - gwMgrHost - ${__property(gwMgrHost)} - = - - - gwMgrPort - ${__property(gwMgrPort)} - = - - - gwWrkHost - ${__property(gwWrkHost)} - = - - - gwWrkPort - ${__property(gwWrkPort)} - = - - - nioPort - ${__property(nioPort)} - = - - - - - - continue - - false - 1 - - 1 - 1 - 1517892556000 - 1517892556000 - false - - - - - - - - true - - - - false - { - "callbackUrl": "localhost", - "clientName": "${clientName}", - "tokenScope": "Production", - "owner": "${owner}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${pubHost} - ${pubPort} - https - - /client-registration/v0.12/register - POST - true - false - true - false - - HttpClient4 - - - - - - - - Authorization - Basic ${authorization} - - - Content-Type - application/json - - - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - clientId;clientSecret - $.clientId;$.clientSecret - 1;1 - NOT_FOUND;NOT_FOUND - - - - groovy - - - - ${__setProperty(clientId, ${clientId})}; -${__setProperty(clientSecret, ${clientSecret})}; - - - - - true - - - - false - grant_type=password&username=${username}&password=${password}&scope=apim:api_create - = - - - - ${gwMgrHost} - ${nioPort} - https - - /token - POST - true - false - true - false - - HttpClient4 - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientId"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - access_token - $.access_token - 1 - NOT_FOUND - all - - - - - - 200 - - Assertion.response_code - false - 16 - - - - groovy - - - - ${__setProperty(access_token, ${access_token})}; - - - - - - - continue - - false - 1 - - 1 - 1 - 1512994028000 - 1512994028000 - false - - - - - - - - - - - - true - - - - false - { - "name": "${APIName}", - "description": "This document describe a RESTFul API for TestAPIfromREST API.\r\n", - "context": "${APIContext}", - "version": "1.0.0", - "isDefaultVersion": false, - "type": "HTTP", - "transport": [ - "http", - "https" - ], - "tiers": ["Unlimited"], - "visibility": "PUBLIC", - "endpointConfig": "{\"production_endpoints\":{\"url\":\"https://localhost:9443/am/sample/pizzashack/v1/api/\",\"config\":null},\"sandbox_endpoints\":{\"url\":\"https://localhost:9443/am/sample/pizzashack/v1/api/\",\"config\":null},\"endpoint_type\":\"http\"}", - "apiDefinition":"{ \"swagger\": \"2.0\", \"info\": { \"version\": \"1.0.0\", \"title\": \"2PizzaShackAPI2\" }, \"paths\": { \"/persons\": { \"get\": { \"description\": \"Gets `Person` objects.\\nOptional query param of **size** determines\\nsize of returned array\\n\", \"parameters\": [ { \"name\": \"size\", \"in\": \"query\", \"description\": \"Size of array\", \"required\": true, \"type\": \"number\", \"format\": \"double\" } ], \"responses\": { \"200\": { \"description\": \"Successful response\", \"schema\": { \"title\": \"ArrayOfPersons\", \"type\": \"array\", \"items\": { \"title\": \"Person\", \"type\": \"object\", \"properties\": { \"name\": { \"type\": \"string\" }, \"single\": { \"type\": \"boolean\" } } } } } } } } }}", - "responseCaching": "Disabled" -} - = - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis - POST - true - false - true - false - - HttpClient4 - - - - - - - - Authorization - Bearer ${__P(access_token)} - - - Content-Type - application/json - - - - - - apid1 - $.id - 1 - NOTFOUND - - - - - 201 - - Assertion.response_code - false - 16 - - - - groovy - - - - ${__setProperty(apid1, ${apid1})}; - - - - - true - - - - false - { - "name": "${APIName2}", - "description": "This document describe a RESTFul API for TestAPIfromREST API.\r\n", - "context": "${APIContext2}", - "version": "${APIVersion2}", - "isDefaultVersion": false, - "type": "HTTP", - "transport": [ - "http", - "https" - ], - "tiers": ["Unlimited"], - "visibility": "PUBLIC", - "endpointConfig": "{\"production_endpoints\":{\"url\":\"https://localhost:9443/am/sample/pizzashack/v1/api/\",\"config\":null},\"sandbox_endpoints\":{\"url\":\"https://localhost:9443/am/sample/pizzashack/v1/api/\",\"config\":null},\"endpoint_type\":\"http\"}", - "apiDefinition": "{\"swagger\": \"2.0\", \"paths\": {\"/ test2\": {\"get\": {\"responses\": {\"200\": {\"description\":\"Test API with Notification Subscriptions\"}}, \"x-auth-type\": \"Application & Application User\",\"x-throttling-tier\": \"Unlimited\"}}}, \"info\": {\"title\": \"${APIName2}\",\"version\": \"${APIVersion2}\"}}", - "responseCaching": "Disabled" -} - = - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis - POST - true - false - true - false - - HttpClient4 - - - - - - - - Authorization - Bearer ${__P(access_token)} - - - Content-Type - application/json - - - - - - apid2 - $.id - 1 - NOTFOUND2 - - - - - 201 - - Assertion.response_code - false - 16 - - - - groovy - - - - ${__setProperty(apid2, ${apid2})}; - - - - - - - - true - - - - false - grant_type=password&username=${username}&password=${password}&scope=apim:api_publish - = - - - - ${gwMgrHost} - ${nioPort} - https - - /token - POST - true - false - true - false - - HttpClient4 - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - clientId - clientSecret - - - - ${__P(clientId)} - ${__P(clientSecret)} - - - false - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientId"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - access_token - $.access_token - 1 - NOT_FOUND - all - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Publish - POST - true - false - true - false - - HttpClient4 - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Demote to Created - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Demote to Prototyped - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Deploy as a Prototype - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Block - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Deprecate - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Retire - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Re-Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Demote to Created - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Block - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Deploy as a Prototype - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Retire - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Re-Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Demote to Created - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Deprecate - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Retire - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Deploy as a Prototype - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid1}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 400 - - Assertion.response_code - true - 8 - - - - - - Change Lifecycle on APIs with Notifications - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.info.registry.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:subscribeREST> - <!--Optional:--> - <ser:path>/_system/governance/apimgt/applicationdata/provider/admin/${APIName2}/${APIVersion2}/api</ser:path> - <!--Optional:--> - <ser:endpoint>http://${msf4jServiceHost}:${msf4jServicePort}/eventservice</ser:endpoint> - <!--Optional:--> - <ser:eventName>LifeCycleStateChanged</ser:eventName> - <!--Optional:--> - <ser:sessionId>${UUID}</ser:sessionId> - </ser:subscribeREST> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${pubHost} - ${pubPort} - https - - /services/InfoAdminService.InfoAdminServiceHttpsSoap11Endpoint - POST - true - false - true - false - - - - - - - - - Authorization - Basic YWRtaW46YWRtaW4= - - - Content-Type - text/xml - - - SOAPAction - urn:subscribeREST - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - grant_type=password&username=${username}&password=${password}&scope=apim:api_publish - = - - - - ${gwMgrHost} - ${nioPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientId"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - access_token - $.access_token - 1 - NOT_FOUND - all - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid2}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${msf4jServiceHost} - ${msf4jServicePort} - http - utf-8 - /eventservice - GET - true - false - true - false - - - - - - - - - - - apiName;apiVersion;fromState;toState - $.apiName;$.apiVersion;$.fromState;$.toState - 0 - NameNotFound; VersionNotFound; fromStateNotFound; toStateNotFound - - - - - - - String apiNameJm = vars.get("APIName2"); -String apiNameMsf4j = vars.get("apiName"); -String apiVersionJm = vars.get("APIVersion2"); -String apiVersionMsf4j = vars.get("apiVersion"); -String fromSt = vars.get("fromState"); -String toSt = vars.get("toState"); - -Failure1 = !apiNameJm.equals(apiNameMsf4j); -Failure2 = !apiVersionJm.equals(apiVersionMsf4j); -Failure3 = !fromSt.equals("Created"); -Failure4 = !toSt.equals("Published"); - -if (Failure1) { - String failureMessage = "Variables are not equal. Expected \"" + apiNameJm + "\" , actual:\"" + apiNameMsf4j + "\""; - AssertionResult.setFailureMessage(failureMessage); - AssertionResult.setFailure(true); -}else if (Failure2) { - String failureMessage = "Variables are not equal. Expected \"" + apiVersionJm + "\" , actual:\"" + apiVersionMsf4j + "\""; - AssertionResult.setFailureMessage(failureMessage); - AssertionResult.setFailure(true); -}else if (Failure3) { - String failureMessage = "Variables are not equal. Expected \"" + "Created" + "\" , actual:\"" + fromSt + "\""; - AssertionResult.setFailureMessage(failureMessage); - AssertionResult.setFailure(true); -}else if(Failure4) { - String failureMessage = "Variables are not equal. Expected \"" + "Published" + "\" , actual:\"" + toSt + "\""; - AssertionResult.setFailureMessage(failureMessage); - AssertionResult.setFailure(true); -} - java - - - - 3000 - - - - - - false - true - false - - - - - continue - - false - 1 - - 1 - 1 - 1517892560000 - 1517892560000 - false - - - - - - - - true - - - - false - grant_type=password&username=${username}&password=${password}&scope=apim:api_create - = - - - - ${gwMgrHost} - ${nioPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - clientId - clientSecret - - - - ${__P(clientId)} - ${__P(clientSecret)} - - - false - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientId"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - access_token - $.access_token - 1 - NOT_FOUND - all - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/${__P(apid1)} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${pubHost} - ${pubPort} - https - utf-8 - /api/am/publisher/v0.12/apis/${__P(apid2)} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - false - - saveConfig - - - false - false - true - - true - true - true - true - false - true - false - true - true - true - true - true - true - false - true - 0 - true - true - true - true - true - true - - - scenario-04-results.jtl - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - true - true - true - true - true - true - true - true - true - false - true - 0 - true - true - true - true - true - true - true - true - true - - - scenario-results.jtl - - - - - true - - - - diff --git a/scenario04/jmeter/04-post-scenario-steps.sh b/scenario04/jmeter/04-post-scenario-steps.sh deleted file mode 100644 index 1085ad55..00000000 --- a/scenario04/jmeter/04-post-scenario-steps.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -echo "working directory : "$scriptPath - -source $scriptPath/../teardown.sh diff --git a/scenario04/jmeter/04-pre-scenario-steps.sh b/scenario04/jmeter/04-pre-scenario-steps.sh deleted file mode 100644 index 4492289d..00000000 --- a/scenario04/jmeter/04-pre-scenario-steps.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -set -e - -serverHost=$serverHost -serverPort=$serverPort -pubHost=$pubHost -pubPort=$pubPort -storeHost=$storeHost -storePort=$storePort -gwMgrHost=$gwMgrHost -gwMgrPort=$gwMgrPort -gwWrkHost=$gwWrkHost -gwWrkPort=$gwWrkPort - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -echo "working directory : "$scriptPath - -#updating jmeter properties - user.properties -sed -i "s|^\(serverHost\s*=\s*\).*\$|\1${serverHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(serverPort\s*=\s*\).*\$|\1${serverPort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(pubHost\s*=\s*\).*\$|\1${pubHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(pubPort\s*=\s*\).*\$|\1${pubPort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(storeHost\s*=\s*\).*\$|\1${storeHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(storePort\s*=\s*\).*\$|\1${storePort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(gwMgrHost\s*=\s*\).*\$|\1${gwMgrHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(gwMgrPort\s*=\s*\).*\$|\1${gwMgrPort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(gwWrkHost\s*=\s*\).*\$|\1${gwWrkHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(gwWrkPort\s*=\s*\).*\$|\1${gwWrkPort}|" $scriptPath/../resources/user.properties -#run base-setup.sh -source $scriptPath/../base-setup.sh > $scriptPath/basesetup.log - diff --git a/scenario04/resources/user.properties b/scenario04/resources/user.properties deleted file mode 100644 index ecee83cf..00000000 --- a/scenario04/resources/user.properties +++ /dev/null @@ -1,44 +0,0 @@ -# -# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -# -# WSO2 Inc. licenses this file to you 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. - -owner=admin -authorization=YWRtaW46YWRtaW4= -clientName=rest_api_publisher -username=admin -password=admin -serverHost=localhost -serverPort=9443 -apiName1=TestAPIJmeter1 -apiVersion1=1.0 -apiContext1=testapijm1 -msf4jServiceHost=localhost -msf4jServicePort=8080 -apiName2=TetstAPIJmeter2 -apiVersion2=1.0.0 -apiContext2=testapijm2 -UUID=8c22edc-f6cc-11e7-8c3f-9a214cf093ae - -#Server Hosts and Ports -pubHost=localhost -pubPort=9443 -storeHost=localhost -storePort=9443 -gwMgrHost=localhost -gwMgrPort=9443 -gwWrkHost=localhost -gwWrkPort=9443 -nioPort=8243 diff --git a/scenario04/run-scenario.sh b/scenario04/run-scenario.sh deleted file mode 100644 index f8056804..00000000 --- a/scenario04/run-scenario.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2018, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -#run pre-scenario-steps -source $rootDir/jmeter/04-pre-scenario-steps.sh -#TODO: Verify output of above step. -#run jmeter file/s. -$JMETER_HOME/bin/jmeter.sh -n -t jmeter/01-Scenario04-ManageLifeCycle.jmx -p resources/user.properties -#run post-scenario-steps -source jmeter/04-post-scenario-steps.sh diff --git a/scenario05/README.md b/scenario05/README.md deleted file mode 100644 index c8d6f7cd..00000000 --- a/scenario05/README.md +++ /dev/null @@ -1,69 +0,0 @@ -#Scenario 05 API Versioning - - -####Problem: - -APi versioning is a key functionality that needs to be addressed once the users used to expose a specific API for a long time and when they need to add, remove or change the API’ in future. When doing this there may be uses who are using the old API. Hence while introducing the new API Old API should also be supported for a specific time period. That time period is offered basically because to guide the uses and give a period for them to switch to the new API. - - -####Scenario: - -Ability to retire old APIs and introduce new versions of APIs to enhance its functionality -Ensure that API updates don’t break when upgraded/versioned or moved between environments, geographies, data centers and the cloud -A/B testing with old vs new APIs -Ability to notify consumers of the old version about the availability of the new API version -Enforcing a grace period to upgrade to the new version of the API -Transferring contracts with app developers to newer versions. - - - -###Covered Automations: - -####Positive - -**Management Console** - -Create Suscriber, Creator, Publisher users and roles from the APIM Management console and assign them with the relavent permissions -Set the subscribers email address from the subscriber profile -Update the registory resource file in the location /resource/_system/config/apimgt/applicationdata/tenant-conf.json to enable notification sending and to set the email template - -API Publisher - -Register and generate and token -Create API with Version 1.0.0 -API Migration API Export -Change API state from Create to Publish for API Version 1.0.0 -API Versioning - -API Subscriber - -Obtain client Id and Secret -Generate access token -Create application -Create subscription - -API Publisher - -Change versioned API state from create to publish - -Terminate Tests -Unsubscribe Application -Delete Application -Remove users and roles -Delete old API -Delete new API - -###Configurations - -Need to download Governance registry 5.4.0 and copy resource.war from G-Reg/repository/deployment/server/webapps to APIM-Home/repository/deployment/server/webapps. Then restart APIM server.This is required to support Registry REST APIs by APIM. But from APIM 2.1.0 update 7 onwards due to a spring framework update done resource.war is not supported. Therefore as a workaround untill a proper fix is given after deploying resource.war web app copy the springframework 3.0.7 .jars (7 jars) from /APIM/APIM220/wso2am-2.1.0-update6/lib/runtimes/cxf to /wso2am-2.1.0-update8/repository/deployment/server/webapps/resource/WEB-INF/lib folder - -Need to configure API-M_HOME/repository/conf/output-event-adapters.xml file under the adapterConfig type="email" section as below -```xml - property key="mail.smtp.from">dewmi123455@gmail.com - property key="mail.smtp.user">dewmi123455 - property key="mail.smtp.password">password - property key="mail.smtp.host">smtp.gmail.com - property key="mail.smtp.port">587 -``` - -If you are using a Google mail account, note that Google has restricted third-party apps and less secure apps from sending emails by default. Therefore, you need to configure your account to disable this restriction. diff --git a/scenario05/base-setup.sh b/scenario05/base-setup.sh deleted file mode 100755 index a90541e5..00000000 --- a/scenario05/base-setup.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -#properties -#TODO:read below property from infra.json file -serverHost=$serverHost -serverPort=$serverPort - diff --git a/scenario05/jmeter/01-Solution-05-APIVersioning.jmx b/scenario05/jmeter/01-Solution-05-APIVersioning.jmx deleted file mode 100644 index 12f36de9..00000000 --- a/scenario05/jmeter/01-Solution-05-APIVersioning.jmx +++ /dev/null @@ -1,1739 +0,0 @@ - - - - - - false - false - - - - - - - - - false - - - - - - host - ${__property(serverHost)} - = - - - port - ${__property(serverPort)} - = - - - adminUsername - ${__property(adminUsername)} - = - - - adminPassword - ${__property(adminPassword)} - = - - - authorization - ${__property(authorization)} - = - - - owner - ${__property(owner)} - = - - - clientName - ${__property(clientName)} - = - - - APIName - ${__property(APIName)} - = - - - APIContext - ${__property(APIContext)} - = - - - appName - ${__property(appName)} - = - - - subscriberUsername - ${__property(subscriberUsername)} - = - - - subscriberPassword - ${__property(subscriberPassword)} - = - - - servPort - ${__property(servPort)} - = - - - pubHost - ${__property(pubHost)} - = - - - pubPort - ${__property(pubPort)} - = - - - storeHost - ${__property(storeHost)} - = - - - storePort - ${__property(storePort)} - = - - - gwMgrHost - ${__property(gwMgrHost)} - = - - - gwMgrPort - ${__property(gwMgrPort)} - = - - - gwWrkHost - ${__property(gwWrkHost)} - = - - - gwWrkPort - ${__property(gwWrkPort)} - = - - - nioPort - ${__property(nioPort)} - = - - - - - - continue - - false - 1 - - 1 - 1 - 1515686351000 - 1515686351000 - false - - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:aut="http://authentication.services.core.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <aut:login> - <!--Optional:--> - <aut:username>${adminUsername}</aut:username> - <!--Optional:--> - <aut:password>${adminPassword}</aut:password> - <!--Optional:--> - <aut:remoteAddress>${host}</aut:remoteAddress> - </aut:login> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/AuthenticationAdmin.AuthenticationAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:login - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:addRole> - <!--Optional:--> - <xsd:roleName>CreatorAndPublisher</xsd:roleName> - <!--Zero or more repetitions:--> - <xsd:userList>admin</xsd:userList> - <xsd:permissions>/permission/admin/login</xsd:permissions> - <xsd:permissions>/permission/admin/manage/api/create</xsd:permissions> - <xsd:permissions>/permission/admin/manage/api/publish</xsd:permissions> - <!--Optional:--> - <xsd:isSharedRole>false</xsd:isSharedRole> - </xsd:addRole> - </soapenv:Body> -</soapenv:Envelope> - - - = - - - - ${host} - ${port} - https - - https://${host}:${port}/services/UserAdmin.UserAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:addRole - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:addRole> - <!--Optional:--> - <xsd:roleName>Subscriber</xsd:roleName> - <!--Zero or more repetitions:--> - <xsd:userList>admin</xsd:userList> - <xsd:permissions>/permission/admin/login</xsd:permissions> - <xsd:permissions>/permission/admin/manage/api/subscribe</xsd:permissions> - <!--Optional:--> - <xsd:isSharedRole>false</xsd:isSharedRole> - </xsd:addRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - https://${host}:${port}/services/UserAdmin.UserAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:addRole - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd" xmlns:xsd1="http://common.mgt.user.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:addUser> - <xsd:userName>user1</xsd:userName> - <xsd:password>user1</xsd:password> - <!--Zero or more repetitions:--> - <xsd:roles>CreatorAndPublisher</xsd:roles> - <!--Zero or more repetitions:--> - <xsd:profileName>Default</xsd:profileName> - </xsd:addUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/UserAdmin.UserAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:addUser - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd" xmlns:xsd1="http://common.mgt.user.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:addUser> - <xsd:userName>user2</xsd:userName> - <xsd:password>user2</xsd:password> - <!--Zero or more repetitions:--> - <xsd:roles>Subscriber</xsd:roles> - <!--Zero or more repetitions:--> - - <xsd:claims> - <!--Optional:--> - <xsd1:claimURI>http://wso2.org/claims/emailaddress</xsd1:claimURI> - <!--Optional:--> - <xsd1:value>shanikanishadhi1992@gmail.com</xsd1:value> - </xsd:claims> - - <xsd:profileName>Default</xsd:profileName> - </xsd:addUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/UserAdmin.UserAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:addUser - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - { - "EnableMonetization" : false, - "IsUnlimitedTierPaid" : false, - "ExtensionHandlerPosition": "bottom", - "RESTAPIScopes": { - "Scope": [ - { - "Name": "apim:api_publish", - "Roles": "admin,Internal/publisher,CreatorAndPublisher" - }, - { - "Name": "apim:api_create", - "Roles": "admin,Internal/creator,CreatorAndPublisher" - }, - { - "Name": "apim:api_view", - "Roles": "admin,Internal/publisher,Internal/creator,CreatorAndPublisher" - }, - { - "Name": "apim:subscribe", - "Roles": "admin,Internal/subscriber,Subscriber" - }, - { - "Name": "apim:tier_view", - "Roles": "admin,Internal/publisher,Internal/creator" - }, - { - "Name": "apim:tier_manage", - "Roles": "admin" - }, - { - "Name": "apim:bl_view", - "Roles": "admin" - }, - { - "Name": "apim:bl_manage", - "Roles": "admin" - }, - { - "Name": "apim:subscription_view", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:subscription_block", - "Roles": "admin,Internal/creator" - }, - { - "Name": "apim:mediation_policy_view", - "Roles": "admin" - }, - { - "Name": "apim:mediation_policy_create", - "Roles": "admin" - }, - { - "Name": "apim:api_workflow", - "Roles": "admin" - } - ] - }, - "NotificationsEnabled":"true", - "Notifications":[{ - "Type":"new_api_version", - "Notifiers" :[{ - "Class":"org.wso2.carbon.apimgt.impl.notification.NewAPIVersionEmailNotifier", - "ClaimsRetrieverImplClass":"org.wso2.carbon.apimgt.impl.token.DefaultClaimsRetriever", - "Title": "Version newtestAPI2.0 api of old api 1.0 Released", - "Template": " <html> <body> <h3 style=\"color:Black;\">We’re happy to announce the arrival of the next major version $2 of $1 API which is now available in Our API Store.</h3><a href=\"https://localhost:9443/store\">Click here to Visit WSO2 API Store</a></body></html>" - }] - } - ], - "DefaultRoles" : { - "PublisherRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/publisher" - }, - "CreatorRole" : { - "CreateOnTenantLoad" : true, - "RoleName" : "Internal/creator" - }, - "SubscriberRole" : { - "CreateOnTenantLoad" : true - } - } -} - = - - - - ${host} - ${port} - https - - /resource/1.0.0/artifact/_system/config/apimgt/applicationdata/tenant-conf.json - PUT - true - false - true - false - - - - - - - - - media-type - application/json - - - Content-Type - application/json - - - Authorization - Basic YWRtaW46YWRtaW4= - - - - - - - 204 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - { - "callbackUrl": "localhost", - "clientName": "${clientName}", - "tokenScope": "Production", - "owner": "${owner}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${pubHost} - ${pubPort} - https - - /client-registration/v0.12/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${authorization} - - - Content-Type - application/json - - - - - - clientId;clientSecret - $.clientId;$.clientSecret - 1;1 - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - true - - - - false - grant_type=password&username=${adminUsername}&password=${adminPassword}&scope=apim:api_create apim:api_publish - = - - - - ${gwMgrHost} - ${nioPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientId"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - access_token - $.access_token - 1 - all - - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - { - "name": "${APIName}", - "description": "This document describe a RESTFul API for TestAPIfromREST API.\r\n", - "context": "${APIContext}", - "version": "1.0.0", - "isDefaultVersion": false, - "type": "HTTP", - "transport": [ - "http", - "https" - ], - "tiers": ["Unlimited"], - "visibility": "PUBLIC", - "endpointConfig": "{\"production_endpoints\":{\"url\":\"https://localhost:9443/am/sample/pizzashack/v1/api/\",\"config\":null},\"sandbox_endpoints\":{\"url\":\"https://localhost:9443/am/sample/pizzashack/v1/api/\",\"config\":null},\"endpoint_type\":\"http\"}", - "apiDefinition":"{\"paths\":{\"/order\":{\"post\":{\"x-auth-type\":\"Application & Application User\",\"x-throttling-tier\":\"Unlimited\",\"description\":\"Create a new Order\",\"parameters\":[{\"schema\":{\"$ref\":\"#/definitions/Order\"},\"description\":\"Order object that needs to be added\",\"name\":\"body\",\"required\":true,\"in\":\"body\"}],\"responses\":{\"201\":{\"headers\":{\"Location\":{\"description\":\"The URL of the newly created resource.\",\"type\":\"string\"}},\"schema\":{\"$ref\":\"#/definitions/Order\"},\"description\":\"Created.\"}}}},\"/menu\":{\"get\":{\"x-auth-type\":\"Application & Application User\",\"x-throttling-tier\":\"Unlimited\",\"description\":\"Return a list of available menu items\",\"parameters\":[],\"responses\":{\"200\":{\"headers\":{},\"schema\":{\"title\":\"Menu\",\"properties\":{\"list\":{\"items\":{\"$ref\":\"#/definitions/MenuItem\"},\"type\":\"array\"}},\"type\":\"object\"},\"description\":\"OK.\"}}}}},\"schemes\":[\"https\"],\"produces\":[\"application/json\"],\"swagger\":\"2.0\",\"definitions\":{\"MenuItem\":{\"title\":\"Pizza menu Item\",\"properties\":{\"price\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"image\":{\"type\":\"string\"}},\"required\":[\"name\"]},\"Order\":{\"title\":\"Pizza Order\",\"properties\":{\"customerName\":{\"type\":\"string\"},\"delivered\":{\"type\":\"boolean\"},\"address\":{\"type\":\"string\"},\"pizzaType\":{\"type\":\"string\"},\"creditCardNumber\":{\"type\":\"string\"},\"quantity\":{\"type\":\"number\"},\"orderId\":{\"type\":\"integer\"}},\"required\":[\"orderId\"]}},\"consumes\":[\"application/json\"],\"info\":{\"title\":\"PizzaShackAPI\",\"description\":\"This document describe a RESTFul API for Pizza Shack online pizza delivery store.\\n\",\"license\":{\"name\":\"Apache 2.0\",\"url\":\"http://www.apache.org/licenses/LICENSE-2.0.html\"},\"contact\":{\"email\":\"architecture@pizzashack.com\",\"name\":\"John Doe\",\"url\":\"http://www.pizzashack.com\"},\"version\":\"1.0.0\"}}" -} - = - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - apid - $.id - 1 - NOTFOUND - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - - = - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${apid}&action=Publish - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - - = - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis/copy-api?apiId=${apid}&newVersion=2.0.0 &isDefaultVersion=true - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - newversionapid - $.id - 1 - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - - - - - - ${host} - ${port} - https - - /api-import-export-2.1.0-v3/export-api?name=${APIName}&version=2.0.0&provider=admin - GET - true - false - true - false - - - - - - - - - Authorization - Basic YWRtaW46YWRtaW4= - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - { - "callbackUrl": "localhost", - "clientName": "rest_api_store", - "tokenScope": "Production", - "owner": "${owner}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${pubHost} - ${pubPort} - https - utf-8 - /client-registration/v0.12/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${authorization} - - - Content-Type - application/json - - - - - - clientID;clientSecret - $.clientId;$.clientSecret - 1;1 - all - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - true - - - - false - grant_type=password&username=${subscriberUsername}&password=${subscriberPassword}&scope=apim:subscribe - = - - - - ${gwMgrHost} - ${gwMgrPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientID"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - access_token_sub - $.access_token - 1 - all - - NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "throttlingTier": "Unlimited", - "description": "sample app description", - "name": "${appName}" -} - = - - - - ${storeHost} - ${storePort} - https - - /api/am/store/v0.12/applications - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - application_id - $.applicationId - 1 - all - - - - groovy - application_id - - - props.put("application_id_no", vars.get("application_id")); -log.info("ApplicationId:" + props.get("application_id_no")); - - - - - - 201 - - Assertion.response_code - false - 16 - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${apid}", - "applicationId": "${application_id}" -} - = - - - - ${storeHost} - ${storePort} - https - - /api/am/store/v0.12/subscriptions - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - subscriptionId - $.subscriptionId - 1 - all - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - - - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis/change-lifecycle?apiId=${newversionapid}&action=Publish&lifecycleChecklist=requireResubscription:true - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - - - - - - ${storeHost} - ${storePort} - https - - /api/am/store/v0.12/subscriptions/${subscriptionId} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - - - - ${storeHost} - ${storePort} - https - - /api/am/store/v0.12/applications/${application_id} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token_sub} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:deleteUser> - <!--Optional:--> - <xsd:userName>user1</xsd:userName> - </xsd:deleteUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/UserAdmin.UserAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:deleteUser - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:deleteUser> - <!--Optional:--> - <xsd:userName>user2</xsd:userName> - </xsd:deleteUser> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - /services/UserAdmin.UserAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:deleteUser - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:deleteRole> - <!--Optional:--> - <xsd:roleName>CreatorAndPublisher</xsd:roleName> - </xsd:deleteRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - https://${host}:${port}/services/UserAdmin.UserAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:deleteRole - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:deleteRole> - <!--Optional:--> - <xsd:roleName>Subscriber</xsd:roleName> - </xsd:deleteRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${host} - ${port} - https - - https://${host}:${port}/services/UserAdmin.UserAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:deleteRole - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis/${apid} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - - - - ${pubHost} - ${pubPort} - https - - /api/am/publisher/v0.12/apis/${newversionapid} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${access_token} - - - Content-Type - application/json - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - false - - saveConfig - - - false - false - true - - true - true - true - true - false - true - false - true - true - true - true - true - true - false - true - 0 - true - true - true - true - - - scenario-05-results.jtl - - - - - - true - - - - diff --git a/scenario05/jmeter/05-post-scenario-steps.sh b/scenario05/jmeter/05-post-scenario-steps.sh deleted file mode 100755 index b6520df0..00000000 --- a/scenario05/jmeter/05-post-scenario-steps.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -echo "working directory : "$scriptPath -#run base-setup.sh to deploy artifacts -source $scriptPath/../teardown.sh - - -echo "post-steps are done..." - - diff --git a/scenario05/jmeter/05-pre-scenario-steps.sh b/scenario05/jmeter/05-pre-scenario-steps.sh deleted file mode 100755 index cf6960ce..00000000 --- a/scenario05/jmeter/05-pre-scenario-steps.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -serverHost=$serverHost -serverPort=$serverPort - - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -#run base-setup.sh to deploy artifacts -source $scriptPath/../base-setup.sh > $scriptPath/basesetup.log - -echo "working directory : "$scriptPath -#updating jmeter properties - user.properties -sed -i "s|^\(serverHost\s*=\s*\).*\$|\1${serverHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(serverPort\s*=\s*\).*\$|\1${serverPort}|" $scriptPath/../resources/user.properties - - -echo "pre-steps are done..." diff --git a/scenario05/resources/user.properties b/scenario05/resources/user.properties deleted file mode 100644 index 27b33962..00000000 --- a/scenario05/resources/user.properties +++ /dev/null @@ -1,45 +0,0 @@ -# -# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -# -# WSO2 Inc. licenses this file to you 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. -# -#serverHost=localhost - - -solutionName=APIVersioning -serverHost=localhost -serverPort=9443 -adminUsername=admin -adminPassword=admin -authorization=YWRtaW46YWRtaW4= -owner=admin -clientName=rest_api_publisher -APIName=TestAPI3 -APIContext={version}/testapi3 -appName=SampleApp2 -subscriberUsername=user2 -subscriberPassword=user2 -servPort=8243 - -#Server Hosts and Ports -pubHost=localhost -pubPort=9443 -storeHost=localhost -storePort=9443 -gwMgrHost=localhost -gwMgrPort=localhost -gwWrkHost=localhost -gwWrkPort=localhost -nioPort=8243 diff --git a/scenario05/run-scenario.sh b/scenario05/run-scenario.sh deleted file mode 100755 index c7976460..00000000 --- a/scenario05/run-scenario.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -$JMETER_HOME/bin/jmeter.sh -n -t jmeter/01-Solution-05-APIVersioning.jmx -p resources/user.properties diff --git a/scenario05/teardown.sh b/scenario05/teardown.sh deleted file mode 100644 index cacdbbe5..00000000 --- a/scenario05/teardown.sh +++ /dev/null @@ -1,18 +0,0 @@ -#! /bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -#these params need to be taken out - diff --git a/scenario06/README.md b/scenario06/README.md deleted file mode 100644 index dd9bb278..00000000 --- a/scenario06/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Solution 06 - API Governance - -**This repository contains jmeter scripts created for APIM solution 06 described here[1]** - -Basically following scripts covering the API governance solution with using sample implemented in apim scenario-samples and throttling policy features. -By using the scripts we will be able to test : -- Subscriber application -- Throttling requests - API level/ Resource level/ Application level/ Subscription tiers -- Analytics - Relevant Publisher/ Store analytics -- Some load to verify more on analytics - -Scrips available : - -*01-Solution-06-ApplicationLevelThrottling.jmx* -*02-Solution-06-ResourceLevelThrottling.jmx* -*03-Solution-06-RemoveAPIsApps.jmx* - - -**How To Run** - -Pre condition : -- "run.sh" file from /samples MUST be ran -- sample #9 should be provided -- sample should be deployed to APIM server successfully - -Execute script : Testgrid will start execution from 06-pre-scenario-steps.sh and continue the jmeter scripts and will be endedup with 06-post-scenario-steps.sh - -Post condition : N/A - - [1] diff --git a/scenario06/base-setup.sh b/scenario06/base-setup.sh deleted file mode 100755 index 4434842c..00000000 --- a/scenario06/base-setup.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -#properties -#TODO:read below property from infra.json file - -#tomcatHost=$tomcatHost -#tomcatPort=8080 -#tomcatUsername=scriptUser -#tomcatPassword=scriptUser -#tomcatVersion=7 - -owner=tom -clientName=rest_api_store -subscriberUsername=tom -subscriberPassword=123123 -appName=tomsApp -serverHost=$serverHost -serverPort=443 -solutionPath=/ - - -#create temporary directory -mkdir $scriptPath/../temp - -#TODO: run the sample from apim product pack - - diff --git a/scenario06/infra.sh b/scenario06/infra.sh deleted file mode 100644 index a704b214..00000000 --- a/scenario06/infra.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -#TODO: configuration for infra if any \ No newline at end of file diff --git a/scenario06/jmeter/01-Solution-06-ApplicationLevelThrottling.jmx b/scenario06/jmeter/01-Solution-06-ApplicationLevelThrottling.jmx deleted file mode 100644 index e922b18c..00000000 --- a/scenario06/jmeter/01-Solution-06-ApplicationLevelThrottling.jmx +++ /dev/null @@ -1,1094 +0,0 @@ - - - - - Using Per quota-token - false - true - - - - - - - - - - host - localhost - = - - - amPort - 9443 - = - - - apiPort - 8243 - = - - - - - - - - clientName - rest_api_store - = - - - subscriberUsername - tom - = - - - subscriberPassword - 123123 - = - - - appName - tomsAppdef - = - - - owner - tom - = - - - - - - continue - - false - 1 - - 1 - 1 - 1512994028000 - 1512994028000 - false - - - - - - - - - false - - - - true - - - - false - { - "callbackUrl": "localhost", - "clientName": "${clientName}", - "tokenScope": "Production", - "owner": "${owner}", - "grantType": "password refresh_token", - "saasApp": true -} - = - - - - ${host} - ${amPort} - https - - /client-registration/v0.11/register - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${encryptedUserCredentials} - - - Content-Type - application/json - - - - - - - - - import org.apache.commons.codec.binary.Base64; - -String username = vars.get("subscriberUsername"); -String password = vars.get("subscriberPassword"); -String concatValue = username + ":" + password; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("encryptedUserCredentials",new String(b64encrypted)); - groovy - - - - clientId;clientSecret - $.clientId;$.clientSecret - 1;1 - NOT_FOUND;NOT_FOUND - - - - - clientSecret - - Assertion.response_data - false - 16 - - - - - true - - - - false - grant_type=password&username=${subscriberUsername}&password=${subscriberPassword}&scope=apim:api_view apim:subscribe - = - - - - ${host} - ${apiPort} - https - - /token - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${b64encryptedValue} - - - - - - - - - import org.apache.commons.codec.binary.Base64; - -String clientId = vars.get("clientId"); -String clientSecret = vars.get("clientSecret"); -String concatValue = clientId + ":" + clientSecret; - -byte[] b64encrypted = Base64.encodeBase64(concatValue.getBytes()); - vars.put("b64encryptedValue",new String(b64encrypted)); - groovy - - - - RestAccessToken - $.access_token - 1 - NOT_FOUND - all - - - - - - 200 - - Assertion.response_code - false - 16 - - - - ${__setProperty(RestAccessToken, ${RestAccessToken})}; - - - false - - - - - - true - 4 - - - - 1 - 4 - 1 - counterValue - 000 - false - - - - false - counterValue - - import java.lang.String; -//import org.apache.jmeter.testelement.property.JMeterProperty; - -String str = vars.get("counterValue"); -String tier = ""; -if (str.contains("001")){ - tier = "10PerMin"; -} -else if (str.contains("002")){ - tier = "20PerMin"; - } -else if (str.contains("003")){ - tier = "50PerMin"; - } -else { - tier = "Unlimited"; - } - -vars.put("throttlingTier", tier); - - - - - - - false - - - - true - - - - false - { - "throttlingTier": "${throttlingTier}", - "description": "test app description", - "name": "${__V(${appName}${counterValue})}", - "callbackUrl": "http://mycallback" -} - = - - - - ${host} - ${amPort} - https - - /api/am/store/v0.11/applications - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${RestAccessToken} - - - Content-Type - application/json - - - - - - applicationId - $..applicationId - 1 - NOTFOUND - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - - - - false - - - - - - - ${host} - ${amPort} - https - - /api/am/store/v0.11/apis - GET - true - false - true - false - - - - If you know the api ID directly got to step2 - - - - - - Authorization - Bearer ${RestAccessToken} - - - - - - apiId - $.list[?(@.name == 'Mobile_stock_API')].id - - NOTFOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${amPort} - https - - /api/am/store/v0.11/apis/${apiId} - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${RestAccessToken} - - - - - - name; version; provider - $.name; $.version; $.provider - 1 - No_Default; No_Default; No_Default - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - { - "tier": "Unlimited", - "apiIdentifier": "${apiIdentifier}", - "applicationId": "${applicationId}" -} - = - - - - ${host} - ${amPort} - https - - /api/am/store/v0.11/subscriptions - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${RestAccessToken} - - - Content-Type - application/json - - - - - - - - false - import java.lang.String; - -String provider = vars.get("provider"); -String name = vars.get("name"); -String version = vars.get("version"); -String concateValue = provider + "-" + name + "-" + version; - -vars.put("apiIdentifier", concateValue); - - - - subscriptionId - $.subscriptionId - 1 - NOTFOUND - - - - - 201 - - Assertion.response_code - false - 16 - - - - - - true - 1 - - - - true - - - - false - { - "validityTime": "3600", - "keyType": "PRODUCTION", - "accessAllowDomains": ["ALL" - ] -} - = - - - - ${host} - ${amPort} - https - - /api/am/store/v0.11/applications/generate-keys?applicationId=${applicationId} - POST - true - false - true - false - - - - - - - - - Authorization - Bearer ${RestAccessToken} - - - Content-Type - application/json - - - - - - consumerKey;consumerSecret;ConsumerAccessToken - $.consumerKey;$.consumerSecret; $..accessToken - 1;1;1 - NOT_FOUND;NOT_FOUND;NOT_FOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - import java.lang.String; - -String str = vars.get("counterValue"); -String ConsumerAccessToken = vars.get("ConsumerAccessToken"); -String accessToken1 = ""; -String accessToken2 = ""; -String accessToken3 = ""; -String accessToken4 = ""; - -if (str.contains("001")){ - vars.put("accessToken1", ConsumerAccessToken); - } -else if (str.contains("002")){ - vars.put("accessToken2", ConsumerAccessToken); - } -else if (str.contains("003")){ - vars.put("accessToken3", ConsumerAccessToken); - } -else if (str.contains("004")){ - vars.put("accessToken4", ConsumerAccessToken); - } -else{ - log.info("APP CREATION EXCEEDS : "+ ConsumerAccessToken); - } -${__setProperty(firstAccessToken, ${accessToken1})}; -${__setProperty(secAaccessToken, ${accessToken2})}; -${__setProperty(thirdAccessToken, ${accessToken3})}; -${__setProperty(forthAccessToken, ${accessToken4})}; - - - false - - - - - false - true - false - - - - - - - Invoke from App1 - continue - - false - 1 - - 10 - 10 - 1515043120000 - 1515043120000 - false - - - - - - Invoke from Apps by order - TomsApp1 - - - - - - - ${host} - ${apiPort} - https - - /stocks/1.0.0/stock/1 - GET - true - false - true - false - - - - Make Requests using TomsApp subcription (10ReqPerTokenQuota) - - - - - - accept - application/json - - - Authorization - Bearer ${__property(firstAccessToken)} - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - Invoke from App1 - continue - - false - 1 - - 20 - 10 - 1515043120000 - 1515043120000 - false - - - - - - Invoke from Apps by order - TomsApp2 - - - - - - - ${host} - ${apiPort} - https - - /stocks/1.0.0/stock/1 - GET - true - false - true - false - - - - Make Requests using TomsApp subcription (20ReqPerTokenQuota) - - - - - - accept - application/json - - - Authorization - Bearer ${__property(secAaccessToken)} - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - Invoke from App1 - continue - - false - 1 - - 50 - 10 - 1515043120000 - 1515043120000 - false - - - - - - Invoke from Apps by order - TomsApp3 - - - - - - - ${host} - ${apiPort} - https - - /stocks/1.0.0/stock/1 - GET - true - false - true - false - - - - Make Requests using TomsApp subcription (50ReqPerTokenQuota) - - - - - - accept - application/json - - - Authorization - Bearer ${__property(thirdAccessToken)} - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - Invoke from App1 - continue - - false - 1 - - 100 - 50 - 1515043120000 - 1515043120000 - false - - - - - - Invoke from Apps by order - TomsApp4 - - - - - - - ${host} - ${apiPort} - https - - /stocks/1.0.0/stock/1 - GET - true - false - true - false - - - - Make Requests using TomsApp subcription (50ReqPerTokenQuota) - - - - - - accept - application/json - - - Authorization - Bearer ${__property(forthAccessToken)} - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - continue - - false - 1 - - 1 - 1 - 1515654841000 - 1515654841000 - false - - - - - - true - 4 - - - - 1 - 4 - 1 - counterValue - 000 - false - - - - - false - - - - - - - ${host} - ${amPort} - https - - /api/am/store/v0.11/applications - GET - true - false - true - false - - - - - - - - - Authorization - Bearer ${__property(RestAccessToken)} - - - Accept - application/json - - - - - - applicationId - $.list[?(@.name == '${appName}${counterValue}')].applicationId - - NOTFOUND - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - - ${host} - ${amPort} - https - - /api/am/store/v0.11/applications/${applicationId} - DELETE - true - false - true - false - - - - - - - - - Authorization - Bearer ${__property(RestAccessToken)} - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - - - false - - saveConfig - - - false - false - true - - true - true - true - true - false - true - false - true - true - true - true - true - true - false - true - 0 - true - true - true - true - - - scenario-06-results.jtl - - - - false - - saveConfig - - - true - true - true - - true - true - true - true - false - true - true - false - false - false - true - false - false - false - true - 0 - true - true - true - true - true - - - - - - - - true - - - - diff --git a/scenario06/jmeter/06-post-scenario-steps.sh b/scenario06/jmeter/06-post-scenario-steps.sh deleted file mode 100755 index a5851e3b..00000000 --- a/scenario06/jmeter/06-post-scenario-steps.sh +++ /dev/null @@ -1,28 +0,0 @@ -#! /bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -echo "working directory : "$scriptPath - -#run teardown.sh to un-deploy the artifacts -source $scriptPath/../teardown.sh - - -echo "post-steps are done..." - - diff --git a/scenario06/jmeter/06-pre-scenario-steps.sh b/scenario06/jmeter/06-pre-scenario-steps.sh deleted file mode 100755 index 5d682dd5..00000000 --- a/scenario06/jmeter/06-pre-scenario-steps.sh +++ /dev/null @@ -1,35 +0,0 @@ -#! /bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -serverHost=$serverHost -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) -echo $scriptPath - -# ********** BEFORE RUN THIS FILE, PLEASE MAKE SURE : run.sh FROM /samples MUST BE RAN AND sample#09 SHOULD BE DEPLOYED (give #09) *************************** - -#run base-setup.sh to deploy artifacts -source $scriptPath/../base-setup.sh > $scriptPath/basesetup.log - -echo "working directory : "$scriptPath -#updating jmeter properties - user.properties -sed -i "s|^\(serverHost\s*=\s*\).*\$|\1${serverHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(serverPort\s*=\s*\).*\$|\1${serverPort}|" $scriptPath/../resources/user.properties -#sed -i "s|^\(tomcatHost\s*=\s*\).*\$|\1${tomcatHost}|" $scriptPath/../resources/user.properties -#sed -i "s|^\(tomcatPort\s*=\s*\).*\$|\1${tomcatPort}|" $scriptPath/../resources/user.properties - -echo "pre-steps are done..." - diff --git a/scenario06/resources/01-config.sh b/scenario06/resources/01-config.sh deleted file mode 100644 index c330a711..00000000 --- a/scenario06/resources/01-config.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -#TODO: configure apim product level configs if any \ No newline at end of file diff --git a/scenario06/resources/user.properties b/scenario06/resources/user.properties deleted file mode 100644 index a35667f8..00000000 --- a/scenario06/resources/user.properties +++ /dev/null @@ -1,33 +0,0 @@ -# -# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -# -# WSO2 Inc. licenses this file to you 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. -# -#Server Variables -serverHost=is.dev.wso2.org -serverPort=443 -apiPort=8243 -adminUsername=admin -adminPassword=admin -adminCredentials=YWRtaW46YWRtaW4= - -#Test Variables - -#User Variables -owner=tom -clientName=rest_api_store -subscriberUsername=tom -subscriberPassword=123123 -appName=tomsApp \ No newline at end of file diff --git a/scenario06/run-scenario.sh b/scenario06/run-scenario.sh deleted file mode 100755 index 65ca6445..00000000 --- a/scenario06/run-scenario.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -$JMETER_HOME/bin/jmeter.sh -n -t jmeter/01-Solution-06-ApplicationLevelThrottling.jmx -p resources/user.properties diff --git a/scenario06/teardown.sh b/scenario06/teardown.sh deleted file mode 100644 index 3d1292c5..00000000 --- a/scenario06/teardown.sh +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -#tomcat properties -#tomcatHost=$tomcatHost -#tomcatPort=8080 -#tomcatUsername=admin -#tomcatPassword=admin - - -#clear temp direcotry -rm -rf $scriptPath/../temp/ diff --git a/scenario09/README.md b/scenario09/README.md deleted file mode 100644 index d8121b97..00000000 --- a/scenario09/README.md +++ /dev/null @@ -1,135 +0,0 @@ -# Scenario 09 Developer Enablement and Community Building - - -# Scenario: - -Providing Single Sign On for API STORE using Twitter IDP and Google IDP - -This is a scenario that incorporates with WSO2 Identity Server and WSO2 API Manager - - -# Covered Automations: - -Providing Single Sign On for API STORE using Twitter IDP and Google IDP - - -# Positive - -- Change Role Permissions -- Create and Update Twitter IDP -- Create and Update Google IDP -- Register API Store as a Service Provider -- Update SP with Google IDP and Twitter IDP -- API Store Login with Google IDP -- API Store Login with Twitter IDP -- Terminate Tests - -# Configurations - -1. Go to IS_Home/repository/conf/carbon.xml and set the offset to 1 - -2. Enable Email as a Username in IS 5.4.0 pack by doing following configs -Open the IS_HOME/repository/conf/carbon.xml file. -Look for the commented out configuration EnableEmailUserName. Uncomment the configuration to enable email authentication. -Open the IS_HOME/repository/conf/identity/identity-mgt.properties file and set the property UserInfoRecovery.UseHashedUserNames=true -Open the IS_HOME/repository/conf/user-mgt.xml and set - -```sh -AdminUser -UserName>admin@wso2.com - -``` - -Provide the suitable regex to match the userstore to enable email as a username - -```sh - -If the user store is LDAP use the following configs -Property name="UsernameJavaRegEx">^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ -Property name="UsernameJavaScriptRegEx">^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ -Property name="UsernameWithEmailJavaScriptRegEx">[a-zA-Z0-9@._-|//]{3,30}$ - -``` - -If user store is secondary external JDBC/MYSQL use - -```sh - -Property name="IsEmailUserName">true -Property name="UsernameWithEmailJavaScriptRegEx">[a-zA-Z0-9@._-|//]{3,30}$ - -``` - -3. Enable email as a username in APIM 2.1.0 update 7 following the same above steps. Only difference is in user-mgt.xml file use the below username. -```sh -AdminUser -UserName admin@wso2.com@carbon.super - -``` - -4. Configure common userstores for user management and registry sharing between APIM and IS -Create a jdbc/mysql external user store for user-mgt -Create a jdbc/mysql external user store for registry -Add the datasource for both newly created user stores in master-datasource.xml files in APIM and IS -Go to APIM and IS user-mgt.xml and comment out the available userstore details and add the details for newly created user-mgt (step1) user store details. -In both IS and APIM user-mgt.xml change the datasource name to match with the jndi name given in the master-datasource.xml -Go to APIM and IS registry.xml and without commenting out the available user store details add the datasource jndi name for the user store (step2) the to match with the master-datasource.xml - -```xml - - - jdbc/WSO2REG_DB - - -``` - -Add the details related to sharing the registry and mounting in both IS and APIM - -```xml - - - gov - govregistry - false - true - / - - - - gov - /_system/governance - - - - gov - /_system/config - -``` - -5. Add the following configs under API-M_HOME/repository/deployment/server/jaggeryapps/store/site/conf/site.json file - -```sh - "ssoConfiguration" : { - "ssoConfiguration" : { - "enabled" : "true", - "issuer" : "API_STORE", - "identityProviderURL" : "https://localhost:9444/samlsso", - "keyStorePassword" : "wso2carbon", - "identityAlias" : "wso2carbon", - "responseSigningEnabled":"true", - "assertionSigningEnabled":"true", - "verifyAssertionValidityPeriod":"true", - "timestampSkewInSeconds":"300", - "audienceRestrictionsEnabled":"true", - "keyStoreName" :"/home/shanika/WSO2/APIM2xx/mm3/wso2is-5.4.0/repository/resources/security/wso2carbon.jks", - //"passive" : "true", - "signRequests" : "true", - "assertionEncryptionEnabled" : "false", - "idpInit" : "true", - "idpInitSSOURL" : "https://localhost:9444/samlsso?spEntityID=API_STORE", - //"identityProviderLogoutURL" : "https:/localhost:9443/samlsso", - "externalLogoutPage" : "https://localhost:9444/samlsso?slo=true" - //"acsURL" : "https://localhost:9443/store/jagg/jaggery_acs.jag", //In passive or request signing mode, use only if default Assertion Consumer Service URL needs to be overidden - //"nameIdPolicy" : "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified" //If not specified, 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified' will be used - }, -``` diff --git a/scenario09/base-setup.sh b/scenario09/base-setup.sh deleted file mode 100755 index 3c0ebfc6..00000000 --- a/scenario09/base-setup.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -#properties -#TODO:read below property from infra.json file -serverHost=$serverHost -serverPort=$serverPort -apimHost=$apimHost -apimPort=$apimPort - diff --git a/scenario09/jmeter/01-Solution-09-DeveloperEnablementnCommunityBuidingSSOForAPIStoreWithSocialMedia.jmx b/scenario09/jmeter/01-Solution-09-DeveloperEnablementnCommunityBuidingSSOForAPIStoreWithSocialMedia.jmx deleted file mode 100644 index a95a1439..00000000 --- a/scenario09/jmeter/01-Solution-09-DeveloperEnablementnCommunityBuidingSSOForAPIStoreWithSocialMedia.jmx +++ /dev/null @@ -1,1561 +0,0 @@ - - - - - - false - false - - - - - - - - - false - - - - - - isHost - ${__property(serverHost)} - = - - - isPort - ${__property(serverPort)} - = - - - adminCredentials - ${__property(adminCredentials)} - = - - - adminusername - ${__property(adminusername)} - = - - - adminpassword - ${__property(adminpassword)} - = - - - sp1Name - ${__property(sp1Name)} - = - - - sp1Description - ${__property(sp1Description)} - = - - - carbonServer - ${__property(carbonServer)} - = - - - GoogleClientId - ${__property(GoogleClientId)} - = - - - GoogleClientSecret - ${__property(GoogleClientSecret)} - = - - - idp4Name - ${__property(idp4Name)} - = - - - idp4Description - ${__property(idp4Description)} - = - - - googleUserName - ${__property(googleUserName)} - = - - - googlePassword - ${__property(googlePassword)} - = - - - apimHost - ${__property(apimHost)} - = - - - apimPort - ${__property(apimPort)} - = - - - idp3Name - ${__property(idp3Name)} - = - - - twitterClientId - ${__property(twitterClientId)} - = - - - twitterClientSecret - ${__property(twitterClientSecret)} - = - - - idp3Description - ${__property(idp3Description)} - = - - - twitterUserName - ${__property(twitterUserName)} - = - - - twitterPassword - ${__property(twitterPassword)} - = - - - - - - continue - - false - 1 - - 1 - 1 - 1516685616000 - 1516685616000 - false - - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:aut="http://authentication.services.core.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <aut:login> - <!--Optional:--> - <aut:username>${adminusername}</aut:username> - <!--Optional:--> - <aut:password>${adminpassword}</aut:password> - <!--Optional:--> - <aut:remoteAddress>${isHost}</aut:remoteAddress> - </aut:login> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/AuthenticationAdmin.AuthenticationAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - SOAPAction - urn:login - - - Content-Type - text/xml - - - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.ws.um.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <ser:authorizeRole> - <!--Optional:--> - <ser:roleName>Internal/everyone</ser:roleName> - <ser:resourceId>/permission/admin/login</ser:resourceId> - <ser:action>ui.execute</ser:action> - </ser:authorizeRole> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/RemoteAuthorizationManagerService.RemoteAuthorizationManagerServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - - Authorization - Basic ${adminCredentials} - - - Content-Type - text/xml - - - SOAPAction - urn:authorizeRole - - - User-Agent - Apache-HttpClient/4.1.1 - - - charset - UTF-8 - - - Cookie - JSESSIONID=DC4D246F5A4F3B1CCB01402043DAF0EA - - - Cookie2 - $Version=1 - - - Accept-Encoding - gzip,deflate - - - - - - - 202 - - Assertion.response_code - false - 16 - - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:aut="http://authentication.services.core.carbon.wso2.org"> - <soapenv:Header/> - <soapenv:Body> - <aut:login> - <aut:username>${adminusername}</aut:username> - <aut:password>${adminpassword}</aut:password> - </aut:login> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/AuthenticationAdmin.AuthenticationAdminHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - SOAPAction - urn:login - - - Content-Type - text/xml - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mgt="http://mgt.idp.carbon.wso2.org" xmlns:xsd="http://model.common.application.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <mgt:addIdP> - <mgt:identityProvider> - <xsd:displayName>${idp3Name}</xsd:displayName> - <xsd:enable>true</xsd:enable> - <xsd:federationHub>false</xsd:federationHub> - <xsd:identityProviderDescription>${idp3Description}</xsd:identityProviderDescription> - <xsd:identityProviderName>${idp3Name}</xsd:identityProviderName> - <xsd:alias>https://${isHost}:${isPort}/oauth2/token/</xsd:alias> - <xsd:primary>true</xsd:primary> - - /** Configure Claims */ - - - - <xsd:defaultAuthenticatorConfig> - <xsd:displayName>${idp3Name}</xsd:displayName> - <xsd:name>TwitterAuthenticator</xsd:name> - </xsd:defaultAuthenticatorConfig> - - <xsd:federatedAuthenticatorConfigs> - <xsd:displayName>${idp3Name}</xsd:displayName> - <xsd:enabled>true</xsd:enabled> - <xsd:name>TwitterAuthenticator</xsd:name> - <xsd:properties> - <xsd:name>APIKey</xsd:name> - <xsd:value>${twitterClientId}</xsd:value> - </xsd:properties> - <xsd:properties> - <xsd:name>APISecret</xsd:name> - <xsd:value>${twitterClientSecret}</xsd:value> - </xsd:properties> - <xsd:properties> - <xsd:name>callbackUrl</xsd:name> - <xsd:value>https://${isHost}:${isPort}/commonauth</xsd:value> - </xsd:properties> - </xsd:federatedAuthenticatorConfigs> - - <xsd:justInTimeProvisioningConfig> -<xsd:provisioningEnabled>true</xsd:provisioningEnabled> -<xsd:provisioningUserStore>wso2.org</xsd:provisioningUserStore> -</xsd:justInTimeProvisioningConfig> - </mgt:identityProvider> - </mgt:addIdP> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - services/IdentityProviderMgtService.IdentityProviderMgtServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - Adding Twitter as a Federated Authenticator - - - - - - - SOAPAction - urn:addIdP - - - Content-Type - text/xml - - - Authorization - Basic ${adminCredentials} - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mgt="http://mgt.idp.carbon.wso2.org" xmlns:xsd="http://model.common.application.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <mgt:addIdP> - <!--Optional:--> - <mgt:identityProvider> - <xsd:identityProviderName>${idp4Name}</xsd:identityProviderName> - <xsd:displayName>${idp4Name}</xsd:displayName> - <xsd:enable>true</xsd:enable> - <xsd:identityProviderDescription>${idp4Description}</xsd:identityProviderDescription> - <xsd:alias>https://${isHost}:${isPort}/oauth2/token/</xsd:alias> - <xsd:primary>true</xsd:primary> - <xsd:provisioningRole>-</xsd:provisioningRole> - </mgt:identityProvider> - </mgt:addIdP> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentityProviderMgtService.IdentityProviderMgtServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:addIdP - - - Content-Type - text/xml - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mgt="http://mgt.idp.carbon.wso2.org" xmlns:xsd="http://model.common.application.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <mgt:updateIdP> - <mgt:oldIdPName>${idp4Name}</mgt:oldIdPName> - <mgt:identityProvider> - <xsd:identityProviderName>${idp4Name}</xsd:identityProviderName> - <xsd:displayName>${idp4Name}</xsd:displayName> - <xsd:enable>true</xsd:enable> - <xsd:identityProviderDescription>${idp4Description}</xsd:identityProviderDescription> - <xsd:alias>https://${isHost}:${isPort}/oauth2/token/</xsd:alias> - <xsd:primary>true</xsd:primary> - <xsd:provisioningRole>-</xsd:provisioningRole> - - - - <xsd:defaultAuthenticatorConfig> - <xsd:displayName>${idp4Name}</xsd:displayName> - <xsd:name>GoogleOIDCAuthenticator</xsd:name> - </xsd:defaultAuthenticatorConfig> - - <xsd:federatedAuthenticatorConfigs> - <xsd:displayName>${idp4Name}</xsd:displayName> - <xsd:enabled>true</xsd:enabled> - <xsd:name>GoogleOIDCAuthenticator</xsd:name> - - <xsd:properties> - <xsd:name>ClientId</xsd:name> - <xsd:value>${GoogleClientId}</xsd:value> - </xsd:properties> - - <xsd:properties> - <xsd:name>ClientSecret</xsd:name> - <xsd:value>${GoogleClientSecret}</xsd:value> - </xsd:properties> - - <xsd:properties> - <xsd:name>callbackUrl</xsd:name> - <xsd:value>https://${isHost}:${isPort}/commonauth</xsd:value> - </xsd:properties> - - /*<xsd:properties> - <xsd:name>scope</xsd:name> - <xsd:value>scope=email</xsd:value> - </xsd:properties>*/ - </xsd:federatedAuthenticatorConfigs> - - </mgt:identityProvider> - </mgt:updateIdP> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - services/IdentityProviderMgtService.IdentityProviderMgtServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - SOAPAction - urn:updateIdP - - - Content-Type - text/xml - - - Authorization - Basic ${adminCredentials} - - - - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd" xmlns:xsd1="http://model.common.application.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:createApplication> - <xsd:serviceProvider> - <xsd1:applicationName>${sp1Name}</xsd1:applicationName> - <xsd1:description>${sp1Description}</xsd1:description> - </xsd:serviceProvider> - </xsd:createApplication> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentityApplicationManagementService.IdentityApplicationManagementServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:createApplication - - - Content-Type - text/xml - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd" xmlns:xsd1="http://dto.saml.sso.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:addRPServiceProvider> - <xsd:spDto> - - <xsd1:issuer>${sp1Name}</xsd1:issuer> - <xsd1:assertionConsumerUrl>https://${apimHost}:${apimPort}/store/jagg/jaggery_acs.jag</xsd1:assertionConsumerUrl> - <xsd1:assertionConsumerUrls>https://${apimHost}:${apimPort}/store/jagg/jaggery_acs.jag</xsd1:assertionConsumerUrls> - <xsd1:defaultAssertionConsumerUrl>https://${apimHost}:${apimPort}/store/jagg/jaggery_acs.jag</xsd1:defaultAssertionConsumerUrl> - - <xsd1:signingAlgorithmURI>http://www.w3.org/2000/09/xmldsig#rsa-sha1</xsd1:signingAlgorithmURI> - <xsd1:digestAlgorithmURI>http://www.w3.org/2000/09/xmldsig#sha1</xsd1:digestAlgorithmURI> - <xsd1:doSignAssertions>true</xsd1:doSignAssertions> - <xsd1:doSignResponse>true</xsd1:doSignResponse> - <xsd1:doSingleLogout>true</xsd1:doSingleLogout> - <xsd1:doValidateSignatureInRequests>true</xsd1:doValidateSignatureInRequests> - <xsd1:enableAttributeProfile>true</xsd1:enableAttributeProfile> - <xsd1:enableAttributesByDefault>true</xsd1:enableAttributesByDefault> - <xsd1:idPInitSSOEnabled>true</xsd1:idPInitSSOEnabled> - - </xsd:spDto> - </xsd:addRPServiceProvider> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentitySAMLSSOConfigService.IdentitySAMLSSOConfigServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:addRPServiceProvider - - - Content-Type - text/xml - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:getServiceProviders/> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentitySAMLSSOConfigService.IdentitySAMLSSOConfigServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - false - serviceIndex - attributeConsumingServiceIndex>(.*?)</ - $1$ - NP_ServiceIndex - 1 - all - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:getServiceProviders - - - Content-Type - text/xml - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:getApplication> - <xsd:applicationName>${sp1Name}</xsd:applicationName> - </xsd:getApplication> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentityApplicationManagementService.IdentityApplicationManagementServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - false - appID - applicationID>(.*?)</ - $1$ - NP_AppID - 1 - all - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:getApplication - - - Content-Type - text/xml - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd" xmlns:xsd1="http://model.common.application.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:updateApplication> - <!--Optional:--> - <xsd:serviceProvider> - <!--Optional:--> - <xsd1:applicationID>${appID}</xsd1:applicationID> - <xsd1:applicationName>${sp1Name}</xsd1:applicationName> - - - <xsd1:description>${sp1Description}</xsd1:description> - <xsd1:inboundAuthenticationConfig> - <xsd1:inboundAuthenticationRequestConfigs> - <xsd1:inboundAuthKey>${carbonServer}</xsd1:inboundAuthKey> - <xsd1:inboundAuthType>samlsso</xsd1:inboundAuthType> - <xsd1:inboundConfigType>standardAPP</xsd1:inboundConfigType> - <xsd1:properties> - <xsd1:confidential>false</xsd1:confidential> - <xsd1:defaultValue xsd:nil="true"/> - <xsd1:description xsd:nil="true"/> - <xsd1:displayName xsd:nil="true"/> - <xsd1:displayOrder>0</xsd1:displayOrder> - <xsd1:name>attrConsumServiceIndex</xsd1:name> - <xsd1:required>false</xsd1:required> - <xsd1:type xsd:nil="true"/> - <xsd1:value>${serviceIndex}</xsd1:value> - </xsd1:properties> - </xsd1:inboundAuthenticationRequestConfigs> - - <xsd1:inboundAuthenticationRequestConfigs> - <xsd1:friendlyName xsd:nil="true"/> - <xsd1:inboundAuthKey>${carbonServer}</xsd1:inboundAuthKey> - <xsd1:inboundAuthType>openid</xsd1:inboundAuthType> - <xsd1:inboundConfigType>standardAPP</xsd1:inboundConfigType> - </xsd1:inboundAuthenticationRequestConfigs> - <xsd1:inboundAuthenticationRequestConfigs> - <xsd1:friendlyName xsd:nil="true"/> - <xsd1:inboundAuthKey>${carbonServer}</xsd1:inboundAuthKey> - <xsd1:inboundAuthType>passivests</xsd1:inboundAuthType> - <xsd1:inboundConfigType>standardAPP</xsd1:inboundConfigType> - </xsd1:inboundAuthenticationRequestConfigs> - - - - </xsd1:inboundAuthenticationConfig> - <xsd1:inboundProvisioningConfig> - <xsd1:provisioningEnabled>false</xsd1:provisioningEnabled> - <xsd1:provisioningUserStore/> - </xsd1:inboundProvisioningConfig> - <xsd1:localAndOutBoundAuthenticationConfig> <xsd1:alwaysSendBackAuthenticatedListOfIdPs>false</xsd1:alwaysSendBackAuthenticatedListOfIdPs> - - - <xsd1:authenticationType>federated</xsd1:authenticationType> - <xsd1:authenticationSteps> - <!--Zero or more repetitions:--> - <xsd1:federatedIdentityProviders> - <!--Optional:--> - <xsd1:identityProviderName>${idp4Name}</xsd1:identityProviderName> - </xsd1:federatedIdentityProviders> - </xsd1:authenticationSteps> - - </xsd1:localAndOutBoundAuthenticationConfig> - <xsd1:outboundProvisioningConfig> - <xsd1:provisionByRoleList xsd:nil="true"/> - </xsd1:outboundProvisioningConfig> - <xsd1:permissionAndRoleConfig> - <xsd1:idpRoles>myapp1</xsd1:idpRoles> - </xsd1:permissionAndRoleConfig> - <xsd1:requestPathAuthenticatorConfigs> - <xsd1:displayName>?</xsd1:displayName> - <xsd1:enabled>true</xsd1:enabled> - <xsd1:name>BasicAuthRequestPathAuthenticator</xsd1:name> - <xsd1:valid>true</xsd1:valid> - </xsd1:requestPathAuthenticatorConfigs> - <xsd1:saasApp>false</xsd1:saasApp> - </xsd:serviceProvider> - </xsd:updateApplication> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentityApplicationManagementService - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:updateApplication - - - Content-Type - text/xml - - - - - - - - - - import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.htmlunit.HtmlUnitDriver; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.support.ui.*; -import java.lang.String; -import java.util.concurrent.*; -import com.gargoylesoftware.htmlunit.*; -import com.gargoylesoftware.htmlunit.BrowserVersion; -import org.openqa.selenium.support.ui.WebDriverWait; - -try { - public HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.CHROME, true); - - String protocol = "https://"; - String apimHost = vars.get("apimHost"); - String seperator = ":"; - String apimPort = vars.get("apimPort"); - String url = "/store"; - - String AppURL = protocol + apimHost + seperator + apimPort + url; - - driver.get(AppURL); - - WebElement button = driver.findElement(By.id("btn-login")); - button.click(); - - - /*WebElement link = driver.findElement(By.linkText("Sign In")); - link.click();*/ - - /*driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - WebElement email_phone = driver.findElement(By.xpath("//input[@id='identifierId']")); - email_phone.clear(); - email_phone.sendKeys(new String[] { vars.get("googleUserName") }); - driver.findElement(By.id("identifierNext")).click();*/ - - - /*WebElement password = driver.findElement(By.xpath("//input[@name='password']")); - WebDriverWait wait = new WebDriverWait(driver, 20); - wait.until(ExpectedConditions.elementToBeClickable(password)); - password.sendKeys(new String[] {vars.get("googlePassword")}); - driver.findElement(By.id("passwordNext")).click();*/ - - - - //Returns the whole page - return driver.getPageSource(); - -} catch (Exception ex) { - ex.printStackTrace(); - log.error(ex.getMessage()); - SampleResult.setSuccessful(false); - SampleResult.setResponseCode("500"); - SampleResult.setResponseMessage(ex.getMessage()); -} - java - - - - - 200 - - Assertion.response_code - false - 16 - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd" xmlns:xsd1="http://model.common.application.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:updateApplication> - <!--Optional:--> - <xsd:serviceProvider> - <!--Optional:--> - <xsd1:applicationID>${appID}</xsd1:applicationID> - <xsd1:applicationName>${sp1Name}</xsd1:applicationName> - - <xsd1:claimConfig> - <xsd1:alwaysSendMappedLocalSubjectId>false</xsd1:alwaysSendMappedLocalSubjectId> - <xsd1:localClaimDialect>true</xsd1:localClaimDialect> - <xsd:claimMappings> - <xsd:localClaim> - <!--Optional:--> - <xsd:claimId>1</xsd:claimId> - <!--Optional:--> - <xsd:claimUri>http://wso2.org/claims/emailaddress</xsd:claimUri> - </xsd:localClaim> - <!--Optional:--> - <xsd:mandatory>false</xsd:mandatory> - <!--Optional:--> - <xsd:remoteClaim> - <!--Optional:--> - <xsd:claimId>1</xsd:claimId> - <!--Optional:--> - <xsd:claimUri>emailAddress</xsd:claimUri> - </xsd:remoteClaim> - </xsd:claimMappings> - </xsd1:claimConfig> - - <xsd1:description>${sp1Description}</xsd1:description> - <xsd1:inboundAuthenticationConfig> - <xsd1:inboundAuthenticationRequestConfigs> - <xsd1:inboundAuthKey>${carbonServer}</xsd1:inboundAuthKey> - <xsd1:inboundAuthType>samlsso</xsd1:inboundAuthType> - <xsd1:inboundConfigType>standardAPP</xsd1:inboundConfigType> - <xsd1:properties> - <xsd1:confidential>false</xsd1:confidential> - <xsd1:defaultValue xsd:nil="true"/> - <xsd1:description xsd:nil="true"/> - <xsd1:displayName xsd:nil="true"/> - <xsd1:displayOrder>0</xsd1:displayOrder> - <xsd1:name>attrConsumServiceIndex</xsd1:name> - <xsd1:required>false</xsd1:required> - <xsd1:type xsd:nil="true"/> - <xsd1:value>${serviceIndex}</xsd1:value> - </xsd1:properties> - </xsd1:inboundAuthenticationRequestConfigs> - - <xsd1:inboundAuthenticationRequestConfigs> - <xsd1:friendlyName xsd:nil="true"/> - <xsd1:inboundAuthKey>${carbonServer}</xsd1:inboundAuthKey> - <xsd1:inboundAuthType>openid</xsd1:inboundAuthType> - <xsd1:inboundConfigType>standardAPP</xsd1:inboundConfigType> - </xsd1:inboundAuthenticationRequestConfigs> - <xsd1:inboundAuthenticationRequestConfigs> - <xsd1:friendlyName xsd:nil="true"/> - <xsd1:inboundAuthKey>${carbonServer}</xsd1:inboundAuthKey> - <xsd1:inboundAuthType>passivests</xsd1:inboundAuthType> - <xsd1:inboundConfigType>standardAPP</xsd1:inboundConfigType> - </xsd1:inboundAuthenticationRequestConfigs> - - - - </xsd1:inboundAuthenticationConfig> - <xsd1:inboundProvisioningConfig> - <xsd1:provisioningEnabled>false</xsd1:provisioningEnabled> - <xsd1:provisioningUserStore/> - </xsd1:inboundProvisioningConfig> - <xsd1:localAndOutBoundAuthenticationConfig> <xsd1:alwaysSendBackAuthenticatedListOfIdPs>false</xsd1:alwaysSendBackAuthenticatedListOfIdPs> - - - <xsd1:authenticationType>federated</xsd1:authenticationType> - <xsd1:authenticationSteps> - <!--Zero or more repetitions:--> - <xsd1:federatedIdentityProviders> - <!--Optional:--> - <xsd1:identityProviderName>${idp3Name}</xsd1:identityProviderName> - </xsd1:federatedIdentityProviders> - </xsd1:authenticationSteps> - - </xsd1:localAndOutBoundAuthenticationConfig> - <xsd1:outboundProvisioningConfig> - <xsd1:provisionByRoleList xsd:nil="true"/> - </xsd1:outboundProvisioningConfig> - <xsd1:permissionAndRoleConfig> - <xsd1:idpRoles>myapp1</xsd1:idpRoles> - </xsd1:permissionAndRoleConfig> - <xsd1:requestPathAuthenticatorConfigs> - <xsd1:displayName>?</xsd1:displayName> - <xsd1:enabled>true</xsd1:enabled> - <xsd1:name>BasicAuthRequestPathAuthenticator</xsd1:name> - <xsd1:valid>true</xsd1:valid> - </xsd1:requestPathAuthenticatorConfigs> - <xsd1:saasApp>false</xsd1:saasApp> - </xsd:serviceProvider> - </xsd:updateApplication> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentityApplicationManagementService - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:updateApplication - - - Content-Type - text/xml - - - - - - - - - - import org.openqa.selenium.By; -import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; -import org.openqa.selenium.htmlunit.HtmlUnitDriver; -import org.openqa.selenium.JavascriptExecutor; -import org.openqa.selenium.support.ui.*; -import java.lang.String; -import java.util.concurrent.*; -import com.gargoylesoftware.htmlunit.*; -import com.gargoylesoftware.htmlunit.BrowserVersion; - -try { - public HtmlUnitDriver driver = new HtmlUnitDriver(BrowserVersion.CHROME, true); - - String protocole = "https://"; - String apimHost = vars.get("apimHost"); - String seperator = ":"; - String apimPort = vars.get("apimPort"); - String url = "/store"; - - String AppURL = protocole + apimHost + seperator + apimPort + url; - - driver.get(AppURL); - - WebElement button = driver.findElement(By.id("btn-login")); - button.click(); - - WebElement username = driver.findElement(By.id("username_or_email")); - username.clear(); - username.sendKeys(new String[] { vars.get("twitterUserName") }); - - WebElement password = driver.findElement(By.id("password")); - password.clear(); - password.sendKeys(new String[] {vars.get("twitterPassword")}); - - WebElement button = driver.findElement(By.id("allow")); - button.click(); - - //Returns the whole page - return driver.getPageSource(); - -} catch (Exception ex) { - ex.printStackTrace(); - log.error(ex.getMessage()); - SampleResult.setSuccessful(false); - SampleResult.setResponseCode("500"); - SampleResult.setResponseMessage(ex.getMessage()); -} - java - - - - - Sign Out - - Assertion.response_data - false - 16 - - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://org.apache.axis2/xsd" xmlns:xsd1="http://model.common.application.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <xsd:deleteApplication> - <!--Optional:--> - <xsd:applicationName>${sp1Name}</xsd:applicationName> - </xsd:deleteApplication> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentityApplicationManagementService.IdentityApplicationManagementServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:deleteApplication - - - Content-Type - text/xml - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mgt="http://mgt.idp.carbon.wso2.org" xmlns:xsd="http://model.common.application.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <mgt:deleteIdP> - <mgt:idPName>${idp3Name}</mgt:idPName> - </mgt:deleteIdP> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentityProviderMgtService.IdentityProviderMgtServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:deleteApplication - - - Content-Type - text/xml - - - - - - - true - - - - false - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mgt="http://mgt.idp.carbon.wso2.org" xmlns:xsd="http://model.common.application.identity.carbon.wso2.org/xsd"> - <soapenv:Header/> - <soapenv:Body> - <mgt:deleteIdP> - <mgt:idPName>${idp4Name}</mgt:idPName> - </mgt:deleteIdP> - </soapenv:Body> -</soapenv:Envelope> - = - - - - ${isHost} - ${isPort} - https - - /services/IdentityProviderMgtService.IdentityProviderMgtServiceHttpsSoap11Endpoint/ - POST - true - false - true - false - - - - - - - - HTTP/1.1 200 OK - - Assertion.response_headers - false - 2 - - - - - - Authorization - Basic ${adminCredentials} - - - SOAPAction - urn:deleteApplication - - - Content-Type - text/xml - - - - - - - - - false - - saveConfig - - - false - false - true - - true - true - true - true - false - true - false - true - true - true - true - true - true - false - true - 0 - true - true - true - true - - - scenario-09-results.jtl - - - - - true - - - - diff --git a/scenario09/jmeter/05-post-scenario-steps.sh b/scenario09/jmeter/05-post-scenario-steps.sh deleted file mode 100755 index b6520df0..00000000 --- a/scenario09/jmeter/05-post-scenario-steps.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -echo "working directory : "$scriptPath -#run base-setup.sh to deploy artifacts -source $scriptPath/../teardown.sh - - -echo "post-steps are done..." - - diff --git a/scenario09/jmeter/05-pre-scenario-steps.sh b/scenario09/jmeter/05-pre-scenario-steps.sh deleted file mode 100755 index 968f6741..00000000 --- a/scenario09/jmeter/05-pre-scenario-steps.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -serverHost=$serverHost -serverPort=443 - - -prgdir=$(dirname "$0") -scriptPath=$(cd "$prgdir"; pwd) - -#run base-setup.sh to deploy artifacts -source $scriptPath/../base-setup.sh > $scriptPath/basesetup.log - -echo "working directory : "$scriptPath -#updating jmeter properties - user.properties -sed -i "s|^\(serverHost\s*=\s*\).*\$|\1${serverHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(serverPort\s*=\s*\).*\$|\1${serverPort}|" $scriptPath/../resources/user.properties -sed -i "s|^\(apimHost\s*=\s*\).*\$|\1${apimHost}|" $scriptPath/../resources/user.properties -sed -i "s|^\(apimPort\s*=\s*\).*\$|\1${apimPort}|" $scriptPath/../resources/user.properties - - -echo "pre-steps are done..." diff --git a/scenario09/resources/user.properties b/scenario09/resources/user.properties deleted file mode 100644 index 4f1c2869..00000000 --- a/scenario09/resources/user.properties +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. -# -# WSO2 Inc. licenses this file to you 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. -# -#serverHost=localhost - -solutionName=DeveloperEnablementandCommunityBuilding -serverHost=localhost -serverPort=9444 -adminCredentials= -adminusername= -adminpassword= -sp1Name=API_STORE -sp1Description=serviceProvider -carbonServer=API_STORE -GoogleClientId= -GoogleClientSecret= -idp4Name=GoogleIDPGoogleConnector -idp4Description=GoogleConnectorIDP -googleUserName= -googlePassword= -apimHost=localhost -apimPort=9443 -idp3Name=twitterIDP -twitterClientId= -twitterClientSecret= -idp3Description=TwitterIDP -twitterUserName= -twitterPassword= - -#Server Hosts and Ports -pubHost=localhost -pubPort=localhost -storeHost=localhost -storePort=localhost -gwMgrHost=localhost -gwMgrPort=localhost -gwWrkHost=localhost -gwWrkPort=localhost -nioPort=8243 - - - diff --git a/scenario09/run-scenario.sh b/scenario09/run-scenario.sh deleted file mode 100755 index 171697d0..00000000 --- a/scenario09/run-scenario.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -$JMETER_HOME/bin/jmeter.sh -n -t jmeter/01-Solution-09-DeveloperEnablementnCommunityBuidingSSOForAPIStoreWithSocialMedia.jmx -p resources/user.properties diff --git a/scenario09/teardown.sh b/scenario09/teardown.sh deleted file mode 100644 index cacdbbe5..00000000 --- a/scenario09/teardown.sh +++ /dev/null @@ -1,18 +0,0 @@ -#! /bin/bash - -# Copyright (c) 2017, WSO2 Inc. (http://wso2.com) All Rights Reserved. -# -# 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. - -#these params need to be taken out - diff --git a/test.local.sh b/test.local.sh new file mode 100755 index 00000000..26f4e461 --- /dev/null +++ b/test.local.sh @@ -0,0 +1 @@ +./node_modules/.bin/cypress run --headed --spec cypress/integration/admin/08-add-api-categories.spec.js \ No newline at end of file diff --git a/test.sh b/test.sh new file mode 100755 index 00000000..b3ed9bdc --- /dev/null +++ b/test.sh @@ -0,0 +1,159 @@ +#!/bin/bash +echo "tesh.sh executing started..." + +set -o xtrace + +HOME=`pwd` +TEST_SCRIPT=test.sh +MVNSTATE=1 + +function usage() +{ + echo " + Usage bash test.sh --input-dir /workspace/data-bucket..... + Following are the expected input parameters. all of these are optional + --input-dir | -i : input directory for test.sh + --output-dir | -o : output directory for test.sh + " +} + +optspec=":hiom-:" +while getopts "$optspec" optchar; do + case "${optchar}" in + -) + case "${OPTARG}" in + input-dir) + val="${!OPTIND}"; OPTIND=$(( $OPTIND + 1 )) + INPUT_DIR=$val + ;; + output-dir) + val="${!OPTIND}"; OPTIND=$(( $OPTIND + 1 )) + OUTPUT_DIR=$val + ;; + mvn-opts) + val="${!OPTIND}"; OPTIND=$(( $OPTIND + 1 )) + MAVEN_OPTS=$val + ;; + *) + usage + if [ "$OPTERR" = 1 ] && [ "${optspec:0:1}" != ":" ]; then + echo "Unknown option --${OPTARG}" >&2 + fi + ;; + esac;; + h) + usage + exit 2 + ;; + o) + OUTPUT_DIR=$val + ;; + m) + MVN_OPTS= $val + ;; + i) + INPUT_DIR=$val + ;; + *) + usage + if [ "$OPTERR" != 1 ] || [ "${optspec:0:1}" = ":" ]; then + echo "Non-option argument: '-${OPTARG}'" >&2 + fi + ;; + esac +done + +echo "working Directory : ${HOME}" +echo "input directory : ${INPUT_DIR}" +echo "output directory : ${OUTPUT_DIR}" +export DATA_BUCKET_LOCATION=${INPUT_DIR} + +# Retrieve specific property from deployment.properties file +function get_prop { + local prop=$(grep -w "${1}" "${INPUT_DIR}/deployment.properties" | cut -d'=' -f2) + echo $prop +} + +cat ${INPUT_DIR}/deployment.properties + +PRODUCT_VERSION=$(get_prop 'ProductVersion') + +if [[ -z "$PRODUCT_VERSION" ]] +then + echo "\$ProductVersion not found in property list." +# After merging changes to wso2/testgrid-job-configs this need to be enabled +# exit 1 +else + PRODUCT_VERSION="-$PRODUCT_VERSION" +fi +BASE_URL=$(get_prop 'GatewayHttpsUrl') +echo $BASE_URL + +export CYPRESS_BASE_URL=${BASE_URL} +echo $CYPRESS_BASE_URL; + +###### +export DEBIAN_FRONTEND=noninteractive +sudo apt-get update -y +sleep 300 +sudo killall apt apt-get dpkg +sudo dpkg --configure -a +curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - +chmod 644 /usr/share/keyrings/nodesource.gpg +curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - +npm -v +if [[ $? -ne 0 ]] +then + echo "NPM exists and removing existing version." + sudo apt-get purge nodejs -y + sudo apt-get purge npm -y +else + echo "NPM Deos NOT exists and installing existing version." +fi + +wget https://nodejs.org/dist/v12.22.3/node-v12.22.3-linux-x64.tar.xz +tar -xvf node-v12.22.3-linux-x64.tar.xz +sudo ln -s $HOME/node-v12.22.3-linux-x64/bin/node /usr/bin/node +sudo ln -s $HOME/node-v12.22.3-linux-x64/bin/npm /usr/bin/npm +sudo ln -s $HOME/node-v12.22.3-linux-x64/bin/npx /usr/bin/npx +sudo apt-get install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb -y +export LC_CTYPE="en_US.UTF-8" +cd $HOME +npm install cypress +npm install --save-dev cypress-file-upload +npm install --save nodemailer +npm install --save require-text +npm install styliner +npm i --save-dev cypress-mochawesome-reporter +npm i --save-dev mocha-junit-reporter +npm i --save-dev cypress-multi-reporters +npm i babel-plugin-module-resolver + + +export S3_SECRET_KEY=$(get_prop 's3secretKey') +export S3_ACCESS_KEY=$(get_prop 's3accessKey') +export TESTGRID_EMAIL_PASSWORD=$(get_prop 'testgridEmailPassword') + +npm install --save-dev cypress-multi-reporters mocha-junit-reporter +npm install --save-dev mochawesome mochawesome-merge mochawesome-report-generator +npm install --save-dev mocha +npm install --save-dev @cypress/browserify-preprocessor +npm install archiver +npm install yamljs +npm install junit-report-merger --save-dev +npm i --save aws-sdk +npm run delete:reportFolderHTML +npm run delete:reportFolderJUnit +npm run delete:reportFolderReport +npm run pre-test +nohup Xvfb :99 > /dev/null 2>&1 & +export DISPLAY=:99 +npm run test +MVNSTATE=$? +pkill Xvfb +npm run report:merge +npm run report:generate +node ./upload_email +###### + +exit $MVNSTATE \ No newline at end of file diff --git a/testgrid.yaml b/testgrid.yaml deleted file mode 100644 index 5143b064..00000000 --- a/testgrid.yaml +++ /dev/null @@ -1,58 +0,0 @@ -################################################################################ -# Copyright (c) 2018, WSO2 Inc. (http://www.wso2.org) All Rights Reserved -# -# 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. -############################################################################### - -scenarioConfig: - scenarios: -# - -# name: scenario01 -# description: 'API Development' -# dir: scenario01 - - - name: scenario03 - description: 'App Development with APIs' - dir: scenario03 - - - name: scenario04 - description: 'API Lifecycle Management' - dir: scenario04 - - - name: scenario05 - description: 'API Versioning' - dir: scenario05 -# - -# name: scenario06 -# description: 'API Governance' -# dir: scenario06 - scripts: - - - file: "init.sh" - phase: CREATE - - - file: "cleanup.sh" - phase: DESTROY - -#config value sets need to be mentioned -config-change-sets: - - name: config01 - description: 'Config changes required for custom-lifecyles.' - applies-to: - - scenario04 - - name: config02 - description: 'Config changes required for deploying registry api.' - applies-to: - - scenario01 - - scenario05 - diff --git a/upload_email.js b/upload_email.js new file mode 100644 index 00000000..3ca7dd0a --- /dev/null +++ b/upload_email.js @@ -0,0 +1,94 @@ +const fs = require('fs'); +const AWS = require('aws-sdk'); +const archiver = require('archiver'); +var nodemailer = require('nodemailer'); + +// Enter copied or downloaded access ID and secret key here +const ID = ''; +const SECRET = ''; + +// The name of the bucket that you have created +const BUCKET_NAME = 'apim-ui-testing'; +var secretAccessKey = process.env.S3_SECRET_KEY; +var accessKeyId = process.env.S3_ACCESS_KEY; +var testGridEmailPWD = process.env.TESTGRID_EMAIL_PASSWORD; + + +const s3 = new AWS.S3({ + accessKeyId: accessKeyId, + secretAccessKey: secretAccessKey +}); + +var timestamp = new Date() / 1000; + +const uploadFile = (fileName, destination, contentType) => { + // Read content from the file + const fileContent = fs.readFileSync(fileName); + // Setting up S3 upload parameters + const params = { + Bucket: BUCKET_NAME, + Key: destination, // File name you want to save as in S3 + Body: fileContent, + ACL: 'public-read', + ContentType : contentType + }; + // Uploading files to the bucket + s3.upload(params, function(err, data) { + if (err) { + // throw err; + console.log(`File uploaded Error to AWS s3 bucket.`); + } + console.log(`File uploaded successfully. ${data.Location}`); + }); +}; + +const sendMail = () => { + var mochawesomeUploadLocation = `https://s3.us-east-2.amazonaws.com/${BUCKET_NAME}/410-result/mochawesome-bundle-${timestamp}.html ` + var screenshotUploadLocation = `https://s3.us-east-2.amazonaws.com/${BUCKET_NAME}/410-result/screenshots-${timestamp}.zip ` + var content = `Click on ${mochawesomeUploadLocation} to view the complete test report. Screenshots available in ${screenshotUploadLocation}`; + var transporter = nodemailer.createTransport({ + host: 'tygra.wso2.com', + port: '2587', + auth: { + user: 'testgrid', + pass: testGridEmailPWD + } + }); + + var mailOptions = { + from: "TestGrid Team ", + to: "prasanna@wso2.com,vimukthi@wso2.com,rosens@wso2.com,nandika@wso2.com,dhanushka@wso2.com,bathiya@wso2.com", + subject: `WSO2 APIM 4.1.0 UI TESTS`, + html: content + } + transporter.sendMail(mailOptions, function (error, info) { + if (error) { + console.log(error); + } else { + console.log('Email sent: ' + info.response); + } + }); +} + +function zipDirectory(sourceDir, outPath) { + const archive = archiver('zip', { zlib: { level: 9 }}); + const stream = fs.createWriteStream(outPath); + + return new Promise((resolve, reject) => { + archive + .directory(sourceDir, false) + .on('error', err => reject(err)) + .pipe(stream) + ; + + stream.on('close', () => resolve()); + archive.finalize(); + }); +} + +uploadFile('./cypress/reports/html/mochawesome-bundle.html', `410-result/mochawesome-bundle-${timestamp}.html`, "text/html"); +var zipFileOutputLocation = `./cypress/screenshots-${timestamp}.zip`; +zipDirectory('./cypress/screenshots', zipFileOutputLocation).then(()=>{ + uploadFile(zipFileOutputLocation, `410-result/screenshots-${timestamp}.zip`, "application/zip") +}); +sendMail(); diff --git a/user-data.txt b/user-data.txt deleted file mode 100644 index 6012ed61..00000000 --- a/user-data.txt +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -nohup java -jar /home/ubuntu/Phone-Service.jar > phone-service.out & -nohup java -jar /home/ubuntu/event-service.jar > event-service.out & \ No newline at end of file