Fixing cypress tests (#586)

* upgrade cypress

* fixed delete now has dialog

* also check "unAssign"

* client type no longer required

* providers and group changes

* grp creation working

* moved create realm button ouside the dropdown

* sped up test and added cleanup

* Revert "moved create realm button ouside the dropdown"

This reverts commit e2076a5305808417de910ba8fada8e528e5c356a.

* make test re-runnable

* removed un needed navigation

* Fix misformed Cypress config for GitHub Action

* cleanup after test

* fixed cleanup

* temporary removed this test

* also remove user "new"

* try adding a wait for CI

* get different modal id

* add {force: true} to modal functions

* mv grp search last and ignore 401

* try using cy.get and disable video for testing

* add back video artifacts

Co-authored-by: mfrances <mfrances@redhat.com>
Co-authored-by: Jon Koops <jonkoops@gmail.com>
Co-authored-by: jenny-s51 <jshandel@redhat.com>
This commit is contained in:
Erik Jan de Wit 2021-05-06 07:31:40 +02:00 committed by GitHub
parent 9d25c48e63
commit 8d72f8a705
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 214 additions and 191 deletions

View file

@ -31,8 +31,9 @@ jobs:
run: ./start.js & sleep 40
- name: Run Admin Console
run: mkdir ./build/adminv2 && mv ./build/js ./build/adminv2/
run: npx http-server ./build -P http://localhost:8180/ & sleep 30
run: |
mkdir ./build/adminv2 && mv ./build/js ./build/adminv2/
npx http-server ./build -P http://localhost:8180/ & sleep 30
- name: Admin Console client
run: ./import.js

View file

@ -5,6 +5,7 @@ import SidebarPage from "../support/pages/admin_console/SidebarPage";
import CreateClientScopePage from "../support/pages/admin_console/manage/client_scopes/CreateClientScopePage";
import { keycloakBefore } from "../support/util/keycloak_before";
import RoleMappingTab from "../support/pages/admin_console/manage/RoleMappingTab";
import ModalUtils from "../support/util/ModalUtils";
let itemId = "client_scope_crud";
const loginPage = new LoginPage();
@ -12,6 +13,7 @@ const masthead = new Masthead();
const sidebarPage = new SidebarPage();
const listingPage = new ListingPage();
const createClientScopePage = new CreateClientScopePage();
const modalUtils = new ModalUtils();
describe("Client Scopes test", function () {
describe("Client Scope creation", function () {
@ -50,7 +52,10 @@ describe("Client Scopes test", function () {
sidebarPage.goToClientScopes();
// Delete
listingPage.itemExist(itemId).deleteItem(itemId); // There should be a confirmation pop-up
listingPage.itemExist(itemId).deleteItem(itemId);
modalUtils
.checkModalMessage("Are you sure you want to delete this client scope")
.confirmModal();
masthead.checkNotificationMessage("The client scope has been deleted");
@ -69,12 +74,15 @@ describe("Client Scopes test", function () {
sidebarPage.goToClientScopes();
});
it("assignRole", () => {
it("Assign role", () => {
const role = "offline_access";
listingPage.searchItem(scopeName, false).goToItemDetails(scopeName);
scopeTab.goToScopeTab().clickAssignRole().selectRow(role).clickAssign();
masthead.checkNotificationMessage("Role mapping updated");
scopeTab.checkRoles([role]);
scopeTab.hideInheritedRoles().selectRow(role).clickUnAssign();
modalUtils.checkModalTitle("Remove mapping?").confirmModal();
scopeTab.checkRoles([]);
});
});
});

View file

@ -30,22 +30,12 @@ describe("Clients test", function () {
it("should fail creating client", function () {
listingPage.goToCreateItem();
createClientPage
.continue()
.checkClientTypeRequiredMessage()
.checkClientIdRequiredMessage();
createClientPage
.fillClientData(itemId)
.continue()
.checkClientTypeRequiredMessage()
.checkClientIdRequiredMessage(false);
createClientPage.continue().checkClientIdRequiredMessage();
createClientPage
.fillClientData("")
.selectClientType("openid-connect")
.continue()
.checkClientTypeRequiredMessage(false)
.checkClientIdRequiredMessage();
createClientPage.fillClientData("account").continue().continue();

View file

@ -64,18 +64,10 @@ describe("Group test", () => {
listingPage.deleteItem(newName);
});
it("Group search", () => {
viewHeaderPage.clickAction("searchGroup");
searchGroupPage.searchGroup("group").clickSearchButton();
searchGroupPage.checkTerm("group");
});
it("Should move group", () => {
const targetGroupName = "target";
groupModal
.open("empty-primary-action")
.fillGroupForm(groupName)
.clickCreate();
groupModal.open("empty-primary-action");
groupModal.fillGroupForm(groupName).clickCreate();
groupModal.open().fillGroupForm(targetGroupName).clickCreate();
@ -86,28 +78,35 @@ describe("Group test", () => {
moveGroupModal.clickMove();
masthead.checkNotificationMessage("Group moved");
listingPage
.itemExist(groupName, false)
.goToItemDetails(targetGroupName)
.itemExist(targetGroupName);
listingPage.itemExist(groupName, false).goToItemDetails(targetGroupName);
cy.wait(2000);
listingPage.itemExist(groupName);
cy.wait(1000);
sidebarPage.goToGroups();
listingPage.deleteItem(targetGroupName);
});
it("Should move group to root", async () => {
const groups = ["group1", "group2"];
await new AdminClient().createSubGroups(groups);
sidebarPage.goToGroups();
listingPage.goToItemDetails(groups[0]);
cy.wait(2000);
listingPage.clickRowDetails(groups[1]).clickDetailMenu("Move to");
groupModal
.open("empty-primary-action")
.fillGroupForm(groups[0])
.clickCreate();
groupModal.open().fillGroupForm(groups[1]).clickCreate();
listingPage.clickRowDetails(groups[0]).clickDetailMenu("Move to");
moveGroupModal.clickRoot().clickMove();
sidebarPage.goToGroups();
new GroupDetailPage().checkListSubGroup(groups);
listingPage.deleteItem(groups[0]);
listingPage.deleteItem(groups[1]);
});
it("Group search", () => {
viewHeaderPage.clickAction("searchGroup");
searchGroupPage.searchGroup("group").clickSearchButton();
searchGroupPage.checkTerm("group");
});
});
@ -126,13 +125,19 @@ describe("Group test", () => {
});
beforeEach(() => {
cy.visit("");
keycloakBefore();
loginPage.logIn();
sidebarPage.goToGroups();
});
after(() => {
new AdminClient().deleteGroups();
after(async () => {
const adminClient = new AdminClient();
await adminClient.deleteGroups();
for (let i = 0; i < 5; i++) {
const username = "user" + i;
await adminClient.deleteUser(username);
}
await adminClient.deleteUser("new");
});
it("Should display all the subgroups", () => {

View file

@ -61,7 +61,6 @@ describe("Identity provider test", () => {
.clickCard("facebook")
.fill("facebook", "123")
.clickAdd();
sidebarPage.goToIdentityProviders();
listingPage.itemExist("facebook");
createProviderPage
@ -69,13 +68,11 @@ describe("Identity provider test", () => {
.clickItem(identityProviderName)
.fill(identityProviderName, "123")
.clickAdd();
sidebarPage.goToIdentityProviders();
createProviderPage
.clickCreateDropdown()
.clickItem("bitbucket")
.fill("bitbucket", "123")
.clickAdd();
sidebarPage.goToIdentityProviders();
orderDialog.openDialog().checkOrder(providers);
orderDialog.moveRowTo("facebook", identityProviderName);
@ -87,5 +84,21 @@ describe("Identity provider test", () => {
"Successfully changed display order of identity providers"
);
});
it("clean up providers", () => {
const modalUtils = new ModalUtils();
listingPage.deleteItem("bitbucket");
modalUtils.checkModalTitle("Delete provider?").confirmModal();
masthead.checkNotificationMessage("Provider successfully deleted");
listingPage.deleteItem("facebook");
modalUtils.checkModalTitle("Delete provider?").confirmModal();
masthead.checkNotificationMessage("Provider successfully deleted");
cy.wait(100);
listingPage.deleteItem("github");
modalUtils.checkModalTitle("Delete provider?").confirmModal();
masthead.checkNotificationMessage("Provider successfully deleted");
});
});
});

View file

@ -2,16 +2,28 @@ import SidebarPage from "../support/pages/admin_console/SidebarPage";
import LoginPage from "../support/pages/LoginPage";
import RealmSettingsPage from "../support/pages/admin_console/manage/realm_settings/RealmSettingsPage";
import { keycloakBefore } from "../support/util/keycloak_before";
import AdminClient from "../support/util/AdminClient";
describe("Realm settings test", () => {
const loginPage = new LoginPage();
const sidebarPage = new SidebarPage();
const realmSettingsPage = new RealmSettingsPage();
describe("Realm settings", function () {
beforeEach(function () {
describe("Realm settings", () => {
const realmName = "Realm_" + (Math.random() + 1).toString(36).substring(7);
beforeEach(() => {
keycloakBefore();
loginPage.logIn();
sidebarPage.goToRealm(realmName);
});
before(async () => {
await new AdminClient().createRealm(realmName);
});
after(async () => {
await new AdminClient().deleteRealm(realmName);
});
it("Go to general tab", function () {

View file

@ -4,13 +4,11 @@ import CreateRealmPage from "../support/pages/admin_console/CreateRealmPage";
import Masthead from "../support/pages/admin_console/Masthead";
import AdminClient from "../support/util/AdminClient";
import { keycloakBefore } from "../support/util/keycloak_before";
import RealmSelector from "../support/pages/admin_console/RealmSelector";
const masthead = new Masthead();
const loginPage = new LoginPage();
const sidebarPage = new SidebarPage();
const createRealmPage = new CreateRealmPage();
const realmSelector = new RealmSelector();
describe("Realms test", () => {
const testRealmName = "Test realm";
@ -50,29 +48,4 @@ describe("Realms test", () => {
.should("eq", testRealmName);
});
});
describe("More then 5 realms", () => {
const realmNames = ["One", "Two", "Three", "Four", "Five"];
beforeEach(() => {
keycloakBefore();
loginPage.logIn();
for (const realmName of realmNames) {
sidebarPage.goToCreateRealm();
createRealmPage.fillRealmName(realmName).createRealm();
sidebarPage.goToClients();
}
});
afterEach(async () => {
const client = new AdminClient();
for (const realmName of realmNames) {
await client.deleteRealm(realmName);
}
});
it("switch to searchable realm selector", () => {
realmSelector.openRealmContextSelector().shouldContainAll(realmNames);
});
});
});

View file

@ -8,6 +8,7 @@ import ModalUtils from "../support/util/ModalUtils";
import { keycloakBefore } from "../support/util/keycloak_before";
import GroupModal from "../support/pages/admin_console/manage/groups/GroupModal";
import UserGroupsPage from "../support/pages/admin_console/manage/users/UserGroupsPage";
import AdminClient from "../support/util/AdminClient";
let groupName = "group";
let groupsList: string[] = [];
@ -18,7 +19,7 @@ describe("Group creation", () => {
const sidebarPage = new SidebarPage();
const groupModal = new GroupModal();
beforeEach(function () {
beforeEach(() => {
keycloakBefore();
loginPage.logIn();
sidebarPage.goToGroups();
@ -64,9 +65,11 @@ describe("Users test", () => {
sidebarPage.goToUsers();
});
it("Go to create User page", () => {
cy.wait(100);
after(async () => {
await new AdminClient().deleteGroups();
});
it("Go to create User page", () => {
createUserPage.goToCreateUser();
cy.url().should("include", "users/add-user");
@ -75,12 +78,10 @@ describe("Users test", () => {
cy.url().should("not.include", "/add-user");
});
it("Create user test", function () {
it("Create user test", () => {
itemId += "_" + (Math.random() + 1).toString(36).substring(7);
// Create
cy.wait(100);
createUserPage.goToCreateUser();
createUserPage.createUser(itemId);
@ -104,34 +105,27 @@ describe("Users test", () => {
sidebarPage.goToUsers();
});
it("User details test", function () {
cy.wait(1000);
it("User details test", () => {
listingPage.searchItem(itemId).itemExist(itemId);
cy.wait(1000);
listingPage.goToItemDetails(itemId);
userDetailsPage.fillUserData().save();
masthead.checkNotificationMessage("The user has been saved");
cy.wait(1000);
sidebarPage.goToUsers();
listingPage.searchItem(itemId).itemExist(itemId);
});
it("Add user to groups test", function () {
it("Add user to groups test", () => {
// Go to user groups
listingPage.searchItem(itemId).itemExist(itemId);
listingPage.goToItemDetails(itemId);
userGroupsPage.goToGroupsTab();
userGroupsPage.toggleAddGroupModal();
cy.wait(1000);
const groupsListCopy = groupsList.slice(1, 2);
groupsListCopy.forEach((element) => {
@ -139,35 +133,28 @@ describe("Users test", () => {
});
userGroupsPage.joinGroups();
cy.wait(1000);
});
it("Leave group test", function () {
it("Leave group test", () => {
listingPage.searchItem(itemId).itemExist(itemId);
listingPage.goToItemDetails(itemId);
// Go to user groups
userGroupsPage.goToGroupsTab();
cy.wait(1000);
cy.contains("Leave").click();
cy.getId("modalConfirm").click();
});
it("Go to user consents test", function () {
cy.wait(1000);
it("Go to user consents test", () => {
listingPage.searchItem(itemId).itemExist(itemId);
cy.wait(1000);
listingPage.goToItemDetails(itemId);
cy.getId("user-consents-tab").click();
cy.getId("empty-state").contains("No consents");
});
it("Delete user test", function () {
it("Delete user test", () => {
// Delete
cy.wait(1000);
listingPage.deleteItem(itemId);
modalUtils.checkModalTitle("Delete user?").confirmModal();

View file

@ -17,7 +17,7 @@ export default class ListingPage {
this.searchBtn =
".pf-c-page__main .pf-c-toolbar__content-section button.pf-m-control:visible";
this.createBtn =
".pf-c-page__main .pf-c-toolbar__content-section button.pf-m-primary";
".pf-c-page__main .pf-c-toolbar__content-section button.pf-m-primary:visible";
this.importBtn =
".pf-c-page__main .pf-c-toolbar__content-section button.pf-m-link";
}

View file

@ -28,7 +28,8 @@ export default class SidebarPage {
}
goToCreateRealm() {
cy.getId(this.realmsDrpDwn).scrollIntoView().click();
cy.getId(this.realmsDrpDwn).scrollIntoView();
cy.getId(this.realmsDrpDwn).click();
cy.getId(this.createRealmBtn).click();
return this;

View file

@ -3,7 +3,9 @@ export default class RoleMappingTab {
private tab = "#pf-tab-serviceAccount-serviceAccount";
private scopeTab = "scopeTab";
private assignRole = "assignRole";
private unAssign = "unAssignRole";
private assign = "assign";
private hide = "#hideInheritedRoles";
private assignedRolesTable = "assigned-roles";
private namesColumn = 'td[data-label="Name"]:visible';
@ -27,6 +29,16 @@ export default class RoleMappingTab {
return this;
}
clickUnAssign() {
cy.getId(this.unAssign).click();
return this;
}
hideInheritedRoles() {
cy.get(this.hide).check();
return this;
}
selectRow(name: string) {
cy.get(this.namesColumn)
.contains(name)
@ -38,6 +50,7 @@ export default class RoleMappingTab {
}
checkRoles(roleNames: string[]) {
if (roleNames && roleNames.length) {
cy.getId(this.assignedRolesTable)
.get(this.namesColumn)
.should((roles) => {
@ -46,6 +59,9 @@ export default class RoleMappingTab {
expect(roles).to.contain(roleName);
}
});
} else {
cy.getId(this.assignedRolesTable).should("not.exist");
}
return this;
}
}

View file

@ -71,12 +71,6 @@ export default class CreateClientPage {
return this;
}
checkClientTypeRequiredMessage(exist = true) {
cy.get(this.clientTypeError).should((!exist ? "not." : "") + "exist");
return this;
}
checkClientIdRequiredMessage(exist = true) {
cy.get(this.clientIdError).should((!exist ? "not." : "") + "exist");

View file

@ -10,8 +10,8 @@ export default class GroupModal {
}
fillGroupForm(name = "") {
cy.getId(this.nameInput).clear();
cy.getId(this.nameInput).type(name);
cy.get('[data-testid=groupNameInput]').clear();
cy.get('[data-testid=groupNameInput]').type(name);
return this;
}

View file

@ -1,5 +1,5 @@
export default class MoveGroupModal {
private moveButton = "moveGroup";
private moveButton = "joinGroup";
private title = ".pf-c-modal-box__title";
clickRow(groupName: string) {

View file

@ -20,6 +20,11 @@ export default class AdminClient {
});
}
async createRealm(realm: string) {
await this.login();
await this.client.realms.create({ realm });
}
async deleteRealm(realm: string) {
await this.login();
await this.client.realms.del({ realm });
@ -29,6 +34,7 @@ export default class AdminClient {
await this.login();
await this.client.clients.create(client);
}
async deleteClient(clientName: string) {
await this.login();
const client = (
@ -73,4 +79,10 @@ export default class AdminClient {
const user = await this.createUser({ username, enabled: true });
await this.client.users.addToGroup({ id: user.id!, groupId });
}
async deleteUser(username: string) {
await this.login();
const user = await this.client.users.find({ username });
await this.client.users.del({ id: user[0].id! });
}
}

View file

@ -69,7 +69,7 @@
"@typescript-eslint/eslint-plugin": "^3.8.0",
"@typescript-eslint/parser": "^3.8.0",
"babel-loader": "^8.1.0",
"cypress": "^6.5.0",
"cypress": "7.2.0",
"decompress": "^4.2.1",
"decompress-targz": "^4.1.1",
"enzyme": "^3.11.0",

163
yarn.lock
View file

@ -5132,12 +5132,7 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.1.tgz#5d93e0a099cd0acd5ef3d5bde3c086e1f49ff68c"
integrity sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA==
"@types/node@12.12.50":
version "12.12.50"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.50.tgz#e9b2e85fafc15f2a8aa8fdd41091b983da5fd6ee"
integrity sha512-5ImO01Fb8YsEOYpV+aeyGYztcYcjGsBvN4D7G5r1ef2cuQOpymjWNQi5V0rKHE6PC2ru3HkoUr/Br2/8GUA84w==
"@types/node@^14.0.10":
"@types/node@^14.0.10", "@types/node@^14.14.31":
version "14.14.43"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.43.tgz#26bcbb0595b305400e8ceaf9a127a7f905ae49c8"
integrity sha512-3pwDJjp1PWacPTpH0LcfhgjvurQvrZFBrC6xxjaUEZ7ifUtT32jtjPxEMMblpqd2Mvx+k8haqQJLQxolyGN/cQ==
@ -5294,7 +5289,7 @@
dependencies:
"@types/node" "*"
"@types/sinonjs__fake-timers@^6.0.1":
"@types/sinonjs__fake-timers@^6.0.2":
version "6.0.2"
resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.2.tgz#3a84cf5ec3249439015e14049bd3161419bf9eae"
integrity sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==
@ -6139,7 +6134,7 @@ aproba@^1.0.3, aproba@^1.1.1:
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
arch@^2.1.2:
arch@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
@ -7135,7 +7130,7 @@ bl@^1.0.0:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
blob-util@2.0.2:
blob-util@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb"
integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==
@ -7903,6 +7898,11 @@ ci-info@^2.0.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
ci-info@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz#9a32fcefdf7bcdb6f0a7e1c0f8098ec57897b80a"
integrity sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ==
cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
@ -8852,19 +8852,19 @@ cyclist@^1.0.1:
resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
cypress@^6.5.0:
version "6.5.0"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-6.5.0.tgz#d853d7a8f915f894249a8788294bfba077278c17"
integrity sha512-ol/yTAqHrQQpYBjxLlRSvZf4DOb9AhaQNVlwdOZgJcBHZOOa52/p/6/p3PPcvzjWGOMG6Yq0z4G+jrbWyk/9Dg==
cypress@7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/cypress/-/cypress-7.2.0.tgz#6a3364e18972f898fff1fb12c1ff747939e45ddc"
integrity sha512-lHHGay+YsffDn4M0bkkwezylBVHUpwwhtqte4LNPrFRCHy77X38+1PUe3neFb3glVTM+rbILtTN6FhO2djcOuQ==
dependencies:
"@cypress/listr-verbose-renderer" "^0.4.1"
"@cypress/request" "^2.88.5"
"@cypress/xvfb" "^1.2.4"
"@types/node" "12.12.50"
"@types/sinonjs__fake-timers" "^6.0.1"
"@types/node" "^14.14.31"
"@types/sinonjs__fake-timers" "^6.0.2"
"@types/sizzle" "^2.3.2"
arch "^2.1.2"
blob-util "2.0.2"
arch "^2.2.0"
blob-util "^2.0.2"
bluebird "^3.7.2"
cachedir "^2.3.0"
chalk "^4.1.0"
@ -8872,27 +8872,26 @@ cypress@^6.5.0:
cli-table3 "~0.6.0"
commander "^5.1.0"
common-tags "^1.8.0"
dayjs "^1.9.3"
dayjs "^1.10.4"
debug "4.3.2"
eventemitter2 "^6.4.2"
execa "^4.0.2"
eventemitter2 "^6.4.3"
execa "4.1.0"
executable "^4.1.1"
extract-zip "^1.7.0"
fs-extra "^9.0.1"
fs-extra "^9.1.0"
getos "^3.2.1"
is-ci "^2.0.0"
is-installed-globally "^0.3.2"
is-ci "^3.0.0"
is-installed-globally "~0.4.0"
lazy-ass "^1.6.0"
listr "^0.14.3"
lodash "^4.17.19"
lodash "^4.17.21"
log-symbols "^4.0.0"
minimist "^1.2.5"
moment "^2.29.1"
ospath "^1.2.2"
pretty-bytes "^5.4.1"
ramda "~0.26.1"
pretty-bytes "^5.6.0"
ramda "~0.27.1"
request-progress "^3.0.0"
supports-color "^7.2.0"
supports-color "^8.1.1"
tmp "~0.2.1"
untildify "^4.0.0"
url "^0.11.0"
@ -8946,7 +8945,7 @@ dateformat@~3.0.3:
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
dayjs@^1.9.3:
dayjs@^1.10.4:
version "1.10.4"
resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2"
integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==
@ -10222,10 +10221,10 @@ etag@^1.8.1, etag@~1.8.1:
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
eventemitter2@^6.4.2:
version "6.4.3"
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.3.tgz#35c563619b13f3681e7eb05cbdaf50f56ba58820"
integrity sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==
eventemitter2@^6.4.3:
version "6.4.4"
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.4.tgz#aa96e8275c4dbeb017a5d0e03780c65612a1202b"
integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==
eventemitter2@~0.4.13:
version "0.4.14"
@ -10267,20 +10266,7 @@ exec-sh@^0.3.2:
resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5"
integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==
execa@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
dependencies:
cross-spawn "^6.0.0"
get-stream "^4.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
signal-exit "^3.0.0"
strip-eof "^1.0.0"
execa@^4.0.0, execa@^4.0.2:
execa@4.1.0, execa@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
@ -10295,6 +10281,19 @@ execa@^4.0.0, execa@^4.0.2:
signal-exit "^3.0.2"
strip-final-newline "^2.0.0"
execa@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
dependencies:
cross-spawn "^6.0.0"
get-stream "^4.0.0"
is-stream "^1.1.0"
npm-run-path "^2.0.0"
p-finally "^1.0.0"
signal-exit "^3.0.0"
strip-eof "^1.0.0"
execa@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.3.tgz#0a34dabbad6d66100bd6f2c576c8669403f317f2"
@ -11061,7 +11060,7 @@ fs-extra@^9.0.0:
jsonfile "^6.0.1"
universalify "^1.0.0"
fs-extra@^9.0.1:
fs-extra@^9.0.1, fs-extra@^9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
@ -11321,12 +11320,12 @@ glob@~5.0.0:
once "^1.3.0"
path-is-absolute "^1.0.0"
global-dirs@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d"
integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==
global-dirs@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686"
integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==
dependencies:
ini "1.3.7"
ini "2.0.0"
global-modules@2.0.0:
version "2.0.0"
@ -12240,7 +12239,12 @@ inherits@2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
ini@1.3.7, ini@^1.3.4, ini@^1.3.5:
ini@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==
ini@^1.3.4, ini@^1.3.5:
version "1.3.7"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
@ -12455,6 +12459,13 @@ is-ci@^2.0.0:
dependencies:
ci-info "^2.0.0"
is-ci@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.0.tgz#c7e7be3c9d8eef7d0fa144390bd1e4b88dc4c994"
integrity sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==
dependencies:
ci-info "^3.1.1"
is-color-stop@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
@ -12609,13 +12620,13 @@ is-hexadecimal@^1.0.0:
resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
is-installed-globally@^0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==
is-installed-globally@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520"
integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==
dependencies:
global-dirs "^2.0.1"
is-path-inside "^3.0.1"
global-dirs "^3.0.0"
is-path-inside "^3.0.2"
is-map@^2.0.1:
version "2.0.1"
@ -12690,10 +12701,10 @@ is-path-inside@^2.1.0:
dependencies:
path-is-inside "^1.0.2"
is-path-inside@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
is-path-inside@^3.0.2:
version "3.0.3"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
is-plain-obj@^1.0.0:
version "1.1.0"
@ -17145,10 +17156,10 @@ pretty-bytes@^5.1.0:
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==
pretty-bytes@^5.4.1:
version "5.5.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.5.0.tgz#0cecda50a74a941589498011cf23275aa82b339e"
integrity sha512-p+T744ZyjjiaFlMUZZv6YPC5JrkNj8maRmPaQCWFJFplUAzpIUTRaTcS+7wmZtUoFXHtESJb23ISliaWyz3SHA==
pretty-bytes@^5.6.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==
pretty-error@^2.1.1:
version "2.1.1"
@ -17481,10 +17492,10 @@ ramda@^0.21.0:
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.21.0.tgz#a001abedb3ff61077d4ff1d577d44de77e8d0a35"
integrity sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=
ramda@~0.26.1:
version "0.26.1"
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06"
integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==
ramda@~0.27.1:
version "0.27.1"
resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9"
integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==
randexp@0.4.6:
version "0.4.6"
@ -19866,10 +19877,10 @@ supports-color@^7.0.0, supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
supports-color@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
supports-color@^8.1.1:
version "8.1.1"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
dependencies:
has-flag "^4.0.0"